From 3ad859fb879473ef4cb567148370323b5b6f1410 Mon Sep 17 00:00:00 2001 From: Jeffrey Kirchner Date: Wed, 6 Sep 2023 16:58:51 -0700 Subject: [PATCH 1/3] data dev --- .../staff/session_consumer_mixins/timer.py | 28 ++++++++++++++++--- main/forms/session_form_admin.py | 2 +- main/models/session.py | 15 +++++++--- main/models/session_period.py | 18 ++++++++---- .../staff/staff_session/data/data_card.js | 2 +- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/main/consumers/staff/session_consumer_mixins/timer.py b/main/consumers/staff/session_consumer_mixins/timer.py index 7882421e..04431e4d 100644 --- a/main/consumers/staff/session_consumer_mixins/timer.py +++ b/main/consumers/staff/session_consumer_mixins/timer.py @@ -200,10 +200,20 @@ def sync_continue_timer(event, session_id): #check session over if session.world_state["current_period"] >= parameter_set["period_count"] and \ session.world_state["time_remaining"] <= 1: + + world_state = session.world_state + summary_data = session.summary_data - session.world_state["current_period"] = parameter_set["period_count"] - session.world_state["time_remaining"] = 0 - session.world_state["timer_running"] = False + world_state["current_period"] = parameter_set["period_count"] + world_state["time_remaining"] = 0 + world_state["timer_running"] = False + + current_period_id = session.get_current_session_period().id + + #store data + for i in world_state["avatars"]: + + summary_data[str(current_period_id)][i]["end_health"] = world_state["avatars"][i]["health"] session.save() @@ -264,12 +274,22 @@ def sync_continue_timer(event, session_id): session = session.get_current_session_period().do_production() session = session.get_current_session_period().do_grove_growth() - for i in session.world_state["avatars"]: + summary_data = session.summary_data + world_state = session.world_state + current_period_id = session.get_current_session_period().id + + for i in world_state["avatars"]: # session.world_state["session_players"][i]["earnings"] += session.world_state["session_players"][i]["inventory"][current_period_id] earnings[i] = {} earnings[i]["total_earnings"] = 0 earnings[i]["period_earnings"] = 0 + + summary_data[str(last_period_id)][i]["end_health"] = world_state["avatars"][i]["health"] + summary_data[str(current_period_id)][i]["start_health"] = world_state["avatars"][i]["health"] + + session.save() + else: session = session.get_current_session_period().do_timer_actions(time_remaining) diff --git a/main/forms/session_form_admin.py b/main/forms/session_form_admin.py index 42707fc4..24329ac9 100644 --- a/main/forms/session_form_admin.py +++ b/main/forms/session_form_admin.py @@ -44,5 +44,5 @@ class SessionFormAdmin(forms.ModelForm): class Meta: model=Session fields = ('parameter_set', 'creator', 'collaborators', 'current_experiment_phase', 'title', - 'world_state', 'world_state_avatars', 'summary_data', 'started', 'shared', 'locked', + 'world_state', 'world_state_avatars', 'started', 'shared', 'locked', 'soft_delete', 'controlling_channel') \ No newline at end of file diff --git a/main/models/session.py b/main/models/session.py index 87e81544..8eb367b8 100644 --- a/main/models/session.py +++ b/main/models/session.py @@ -126,6 +126,7 @@ def start_experiment(self): self.setup_world_state() self.setup_summary_data() + def setup_summary_data(self): ''' @@ -137,6 +138,8 @@ def setup_summary_data(self): parameter_set_players = self.parameter_set.parameter_set_players.values('id').all() for i in self.session_periods.all(): + period_number = i.period_number + self.summary_data[str(i.id)] = {} for j in parameter_set_players: @@ -144,7 +147,7 @@ def setup_summary_data(self): v = self.summary_data[str(i.id)][str(j["id"])] v["period_earnings"] = 0 - v["start_health"] = None + v["start_health"] = 100 if period_number==1 else None v["end_health"] = None v["sleep_seconds"] = 0 @@ -364,9 +367,11 @@ def get_download_summary_csv(self): writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC) - writer.writerow(["Session ID", "Period", "Client #", "Label", "Earnings ¢"]) + writer.writerow(["Session ID", "Period", "Client #", "Label", "Earnings ¢", "Start Health", "End Health"]) world_state = self.world_state + summary_data = self.summary_data + parameter_set_players = {} for i in self.session_players.all().values('id','parameter_set_player__id_label'): parameter_set_players[str(i['id'])] = i @@ -374,12 +379,14 @@ def get_download_summary_csv(self): # logger.info(parameter_set_players) for period_number, period in enumerate(world_state["session_periods"]): - for player_number, player in enumerate(world_state["session_players"]): + for player_number, player in enumerate(world_state["avatars"]): writer.writerow([self.id, period_number+1, player_number+1, parameter_set_players[str(player)]["parameter_set_player__id_label"], - world_state["session_players"][player]["inventory"][period]]) + summary_data[period][player]["period_earnings"], + summary_data[period][player]["start_health"], + summary_data[period][player]["end_health"]]) v = output.getvalue() output.close() diff --git a/main/models/session_period.py b/main/models/session_period.py index 44aae19b..c26bb0ac 100644 --- a/main/models/session_period.py +++ b/main/models/session_period.py @@ -63,13 +63,11 @@ def do_timer_actions(self, time_remaining): ''' parameter_set = self.session.parameter_set.json() world_state = self.session.world_state + summary_data = self.session.summary_data cents_per_second = parameter_set["cents_per_second"] - #earnings - for i in world_state["avatars"]: - avatar = world_state["avatars"][i] - avatar["earnings"] = str(Decimal(avatar["earnings"]) + Decimal(avatar["health"]) * Decimal(cents_per_second)) + id = str(self.id) #metabolism health_loss_count = 0 @@ -86,8 +84,18 @@ def do_timer_actions(self, time_remaining): if health_loss_count > 0: for i in world_state["avatars"]: - + + #earnings avatar = world_state["avatars"][i] + + earnings_per_second = Decimal(avatar["health"]) * Decimal(cents_per_second) + earnings_per_second *= health_loss_count + + avatar["earnings"] = str(Decimal(avatar["earnings"]) + earnings_per_second) + + #summary data + summary_data[id][i]["period_earnings"] = str(Decimal(summary_data[id][i]["period_earnings"]) + earnings_per_second) + current_health = Decimal(avatar["health"]) if avatar["sleeping"] and world_state["time_remaining"] <= parameter_set["night_length"]: diff --git a/main/templates/staff/staff_session/data/data_card.js b/main/templates/staff/staff_session/data/data_card.js index 6730002b..b3c7e3ae 100644 --- a/main/templates/staff/staff_session/data/data_card.js +++ b/main/templates/staff/staff_session/data/data_card.js @@ -15,7 +15,7 @@ take_download_summary_data(message_data){ let blob = new Blob(["\ufeff", message_data.result]); let url = URL.createObjectURL(blob); download_link.href = url; - download_link.download = "Template_Data_Session_" + app.session.id +".csv"; + download_link.download = "Trade_Gifts_Summary_Data_Session_" + app.session.id +".csv"; document.body.appendChild(download_link); download_link.click(); From 6a20c5451ce9a6ccf29ab15e489c4038a2d6ceb1 Mon Sep 17 00:00:00 2001 From: Jeffrey Kirchner Date: Thu, 7 Sep 2023 11:39:16 -0700 Subject: [PATCH 2/3] summary data dev --- .../subject_updates.py | 47 +++++++- .../staff/session_consumer_mixins/timer.py | 20 ++-- main/forms/parameter_set_form.py | 2 +- main/models/session.py | 110 +++++++++++++----- main/models/session_period.py | 19 ++- 5 files changed, 151 insertions(+), 47 deletions(-) diff --git a/main/consumers/staff/session_consumer_mixins/subject_updates.py b/main/consumers/staff/session_consumer_mixins/subject_updates.py index 2eff5f8d..31e24c38 100644 --- a/main/consumers/staff/session_consumer_mixins/subject_updates.py +++ b/main/consumers/staff/session_consumer_mixins/subject_updates.py @@ -1110,10 +1110,14 @@ def sync_attack_avatar(session_id, player_id, target_house_id): with transaction.atomic(): session = Session.objects.select_for_update().get(id=session_id) + session_period_id = str(session.get_current_session_period().id) parameter_set = session.parameter_set.json() - source_player = session.world_state['avatars'][str(player_id)] - target_player = session.world_state['avatars'][str(target_house_id)] + player_id_s = str(player_id) + target_house_id_s = str(target_house_id) + + source_player = session.world_state['avatars'][player_id_s] + target_player = session.world_state['avatars'][target_house_id_s] if Decimal(source_player["health"]) < Decimal(parameter_set["attack_cost"]): status = "fail" @@ -1124,13 +1128,32 @@ def sync_attack_avatar(session_id, player_id, target_house_id): error_message.append({"id":"attack_avatar_button", "message": "Target player already has zero health."}) if status == "success": - source_player["health"] = Decimal(source_player["health"]) - Decimal(parameter_set["attack_cost"]) - target_player["health"] = Decimal(target_player["health"]) - Decimal(parameter_set["attack_damage"]) + #data for summary + summary_data = session.summary_data[session_period_id] + summary_data_source = summary_data[player_id_s] + summary_data_target = summary_data[target_house_id_s] + + attack_cost = Decimal(parameter_set["attack_cost"]) + attack_damage = Decimal(parameter_set["attack_damage"]) + + source_player["health"] = Decimal(source_player["health"]) - attack_cost + target_player["health"] = Decimal(target_player["health"]) - attack_damage + + #data for summary + summary_data_source["attacks_cost_at_" + target_house_id_s] = str(Decimal(summary_data_source["attacks_cost_at_" + target_house_id_s]) + attack_cost) + summary_data_target["attacks_damage_from_" + player_id_s] = str(Decimal(summary_data_target["attacks_damage_from_" + player_id_s]) + attack_damage) + + summary_data_source["attacks_at_" + target_house_id_s] += 1 + summary_data_target["attacks_from_" + player_id_s] += 1 if Decimal(source_player["health"]) < 0: + #handle underage + summary_data_source["attacks_cost_at_" + target_house_id_s] = str(Decimal(summary_data_source["attacks_cost_at_" + target_house_id_s]) + Decimal(source_player["health"])) source_player["health"] = 0 if Decimal(target_player["health"]) < 0: + #handle underage + summary_data_target["attacks_damage_from_" + player_id_s] = str(Decimal(summary_data_target["attacks_damage_from_" + player_id_s]) + Decimal(target_player["health"])) target_player["health"] = 0 source_player["health"] = str(source_player["health"]) @@ -1187,9 +1210,14 @@ def sync_grove_harvest(session_id, player_id, grove_id): with transaction.atomic(): session = Session.objects.select_for_update().get(id=session_id) + session_period_id = str(session.get_current_session_period().id) parameter_set = session.parameter_set.json() - player = session.world_state['avatars'][str(player_id)] - grove = session.world_state['groves'][str(grove_id)] + + player_id_s = str(player_id) + grove_id_s = str(grove_id) + + player = session.world_state['avatars'][player_id_s] + grove = session.world_state['groves'][grove_id_s] status = "fail" @@ -1212,8 +1240,15 @@ def sync_grove_harvest(session_id, player_id, grove_id): error_message.append({"id":"grove_harvest", "message": "No harvests remaining this period."}) if status == "success": + summary_data = session.summary_data[session_period_id][player_id_s] + player[grove["good"]] += harvest_amount player["period_grove_harvests"] += 1 + + summary_data["grove_harvests_count_" + grove_id_s] += 1 + summary_data["grove_harvests_total_" + grove_id_s] += harvest_amount + summary_data["harvest_total_" + grove["good"]] += harvest_amount + session.save() world_state = session.world_state diff --git a/main/consumers/staff/session_consumer_mixins/timer.py b/main/consumers/staff/session_consumer_mixins/timer.py index 04431e4d..1d9b84b8 100644 --- a/main/consumers/staff/session_consumer_mixins/timer.py +++ b/main/consumers/staff/session_consumer_mixins/timer.py @@ -268,25 +268,29 @@ def sync_continue_timer(event, session_id): #check if period over if period_is_over: - + summary_data = session.summary_data + world_state = session.world_state + current_period_id = session.get_current_session_period().id + + #store ending health + for i in world_state["avatars"]: + summary_data[str(last_period_id)][i]["end_health"] = world_state["avatars"][i]["health"] + summary_data[str(current_period_id)][i]["start_health"] = world_state["avatars"][i]["health"] + session = session.session_periods.get(id=last_period_id).do_consumption() session = session.get_current_session_period().do_timer_actions(time_remaining) session = session.get_current_session_period().do_production() session = session.get_current_session_period().do_grove_growth() - summary_data = session.summary_data - world_state = session.world_state - current_period_id = session.get_current_session_period().id - for i in world_state["avatars"]: # session.world_state["session_players"][i]["earnings"] += session.world_state["session_players"][i]["inventory"][current_period_id] earnings[i] = {} earnings[i]["total_earnings"] = 0 earnings[i]["period_earnings"] = 0 - - summary_data[str(last_period_id)][i]["end_health"] = world_state["avatars"][i]["health"] - summary_data[str(current_period_id)][i]["start_health"] = world_state["avatars"][i]["health"] + + #store starting health + session.save() diff --git a/main/forms/parameter_set_form.py b/main/forms/parameter_set_form.py index cbe7df61..116d5d48 100644 --- a/main/forms/parameter_set_form.py +++ b/main/forms/parameter_set_form.py @@ -226,7 +226,7 @@ class ParameterSetForm(forms.ModelForm): "step":"1", "min":"1"})) - max_grove_harvests = forms.IntegerField(label='Max Grove Harvests', + max_grove_harvests = forms.IntegerField(label='Max Grove Harvests per Period', min_value=1, widget=forms.NumberInput(attrs={"v-model":"parameter_set.max_grove_harvests", "step":"1", diff --git a/main/models/session.py b/main/models/session.py index 8eb367b8..8ee7ac9a 100644 --- a/main/models/session.py +++ b/main/models/session.py @@ -6,6 +6,7 @@ from tinymce.models import HTMLField from channels.layers import get_channel_layer from asgiref.sync import async_to_sync +from decimal import Decimal import logging import uuid @@ -135,41 +136,45 @@ def setup_summary_data(self): self.summary_data = {} parameter_set_groves = self.parameter_set.parameter_set_groves_a.values('id').all() - parameter_set_players = self.parameter_set.parameter_set_players.values('id').all() + session_players = self.session_players.values('id').all() for i in self.session_periods.all(): period_number = i.period_number - self.summary_data[str(i.id)] = {} + id = str(i.id) - for j in parameter_set_players: - self.summary_data[str(i.id)][str(j["id"])] = {} - v = self.summary_data[str(i.id)][str(j["id"])] + self.summary_data[id] = {} + + for j in session_players: + j_s = str(j["id"]) + self.summary_data[id][j_s] = {} + v = self.summary_data[id][j_s] v["period_earnings"] = 0 v["start_health"] = 100 if period_number==1 else None v["end_health"] = None - v["sleep_seconds"] = 0 + v["health_from_sleep"] = 0 + v["health_from_house"] = 0 #total harvested / consumption for k in main.globals.Goods.choices: v["harvest_total_" + k[0]] = 0 - v["avatar_to_house_" + k[0]] = 0 - v["house_to_avatar_" + k[0]] = 0 + v["house_" + k[0]] = 0 + v["avatar_" + k[0]] = 0 #groves for k in parameter_set_groves: - id = str(k["id"]) - v["grove_harvests_count_" + id] = 0 - v["grove_harvests_total_" + id] = 0 + k_s = str(k["id"]) + v["grove_harvests_count_" + k_s] = 0 + v["grove_harvests_total_" + k_s] = 0 #interactions with others - for k in parameter_set_players: - id = str(k["id"]) - v["attacks_at_" + id] = 0 - v["attacks_from_" + id] = 0 - v["attacks_cost_at_" + id] = 0 - v["attacks_damage_from_" + id] = 0 + for k in session_players: + k_s = str(k["id"]) + v["attacks_at_" + k_s] = 0 + v["attacks_from_" + k_s] = 0 + v["attacks_cost_at_" + k_s] = 0 + v["attacks_damage_from_" + k_s] = 0 for l in main.globals.Goods.choices: v["send_avatar_to_avatar_" + l[0]] = 0 @@ -362,13 +367,8 @@ def get_download_summary_csv(self): ''' logger = logging.getLogger(__name__) - with io.StringIO() as output: - writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC) - - writer.writerow(["Session ID", "Period", "Client #", "Label", "Earnings ¢", "Start Health", "End Health"]) - world_state = self.world_state summary_data = self.summary_data @@ -376,17 +376,75 @@ def get_download_summary_csv(self): for i in self.session_players.all().values('id','parameter_set_player__id_label'): parameter_set_players[str(i['id'])] = i + writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC) + + temp_header = ["Session ID", "Period", "Client #", "Label", "Earnings ¢", "Start Health", "End Health", "Health From Sleep"] + + #good totals + for k in main.globals.Goods.choices: + temp_header.append("Harvest Total " + k[0]) + + for k in main.globals.Goods.choices: + temp_header.append("House Final " + k[0]) + + for k in main.globals.Goods.choices: + temp_header.append("Avatar Final " + k[0]) + + #avatar interactions + for player_number, player in enumerate(world_state["avatars"]): + temp_header.append("Attacks At " + str(player_number+1)) + temp_header.append("Attacks From " + str(player_number+1)) + temp_header.append("Cost of Attacks At " + str(player_number+1)) + temp_header.append("Damage of Attacks From " + str(player_number+1)) + + #grove harvests + for grove_number, grove in enumerate(world_state["groves"]): + temp_header.append("Grove Harvests Count " + str(grove_number+1)) + temp_header.append("Grove Harvests Total " + str(grove_number+1)) + + writer.writerow(temp_header) + # logger.info(parameter_set_players) for period_number, period in enumerate(world_state["session_periods"]): for player_number, player in enumerate(world_state["avatars"]): - writer.writerow([self.id, + temp_p = summary_data[period][player] + + temp_row = [self.id, period_number+1, player_number+1, parameter_set_players[str(player)]["parameter_set_player__id_label"], - summary_data[period][player]["period_earnings"], - summary_data[period][player]["start_health"], - summary_data[period][player]["end_health"]]) + temp_p["period_earnings"], + temp_p["start_health"], + temp_p["end_health"], + temp_p["health_from_sleep"], + ] + + #good totals + for k in main.globals.Goods.choices: + temp_row.append(temp_p["harvest_total_" + k[0]]) + + for k in main.globals.Goods.choices: + temp_row.append(temp_p["house_" + k[0]]) + + for k in main.globals.Goods.choices: + temp_row.append(temp_p["avatar_" + k[0]]) + + #avatar interactions + for k in world_state["avatars"]: + temp_row.append(temp_p["attacks_at_" + k]) + temp_row.append(temp_p["attacks_from_" + k]) + temp_row.append(temp_p["attacks_cost_at_" + k]) + temp_row.append(temp_p["attacks_damage_from_" + k]) + + #grove harvests + for grove_number, grove in enumerate(world_state["groves"]): + temp_row.append(temp_p["grove_harvests_count_" + grove]) + temp_row.append(temp_p["grove_harvests_total_" + grove]) + + # temp_row.append(Decimal(temp_p["start_health"]) - Decimal(temp_p["end_health"])) + + writer.writerow(temp_row) v = output.getvalue() output.close() diff --git a/main/models/session_period.py b/main/models/session_period.py index c26bb0ac..4db6ef6c 100644 --- a/main/models/session_period.py +++ b/main/models/session_period.py @@ -85,7 +85,10 @@ def do_timer_actions(self, time_remaining): if health_loss_count > 0: for i in world_state["avatars"]: - #earnings + #data + temp_s = summary_data[id][i] + + #earnings avatar = world_state["avatars"][i] earnings_per_second = Decimal(avatar["health"]) * Decimal(cents_per_second) @@ -94,16 +97,22 @@ def do_timer_actions(self, time_remaining): avatar["earnings"] = str(Decimal(avatar["earnings"]) + earnings_per_second) #summary data - summary_data[id][i]["period_earnings"] = str(Decimal(summary_data[id][i]["period_earnings"]) + earnings_per_second) + temp_s["period_earnings"] = str(Decimal(temp_s["period_earnings"]) + earnings_per_second) current_health = Decimal(avatar["health"]) - if avatar["sleeping"] and world_state["time_remaining"] <= parameter_set["night_length"]: - avatar["health"] = str(current_health + (sleep_benefit * health_loss_count)) + if avatar["sleeping"] and world_state["time_remaining"] <= parameter_set["night_length"]: + total_sleep_benefit = (sleep_benefit * health_loss_count) + + avatar["health"] = str(current_health + total_sleep_benefit) + temp_s["health_from_sleep"] = str(Decimal(temp_s["health_from_sleep"]) + total_sleep_benefit) if Decimal(avatar["health"]) > 100: + sleep_health_overage = Decimal(avatar["health"]) - 100 avatar["health"] = "100" + temp_s["health_from_sleep"] = str(Decimal(temp_s["health_from_sleep"]) - sleep_health_overage) + else: avatar["health"] = str(current_health - (health_loss_count * health_loss_per_second)) @@ -279,8 +288,6 @@ def do_grove_growth(self): self.session.save() return self.session - - def json(self): ''' json object of model From 82d87ac73fe86b97d3ac3f91ed25392690282f64 Mon Sep 17 00:00:00 2001 From: Jeffrey Kirchner Date: Thu, 7 Sep 2023 16:19:21 -0700 Subject: [PATCH 3/3] summary data dev --- .../subject_updates.py | 17 +++++++++++++- .../staff/session_consumer_mixins/timer.py | 22 +++++++++++++++---- main/models/session.py | 21 +++++++++++++++--- main/models/session_period.py | 16 +++++++++++--- 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/main/consumers/staff/session_consumer_mixins/subject_updates.py b/main/consumers/staff/session_consumer_mixins/subject_updates.py index 31e24c38..cab97e59 100644 --- a/main/consumers/staff/session_consumer_mixins/subject_updates.py +++ b/main/consumers/staff/session_consumer_mixins/subject_updates.py @@ -976,10 +976,13 @@ def sync_move_fruit_to_avatar(session_id, player_id, target_player_id, good_one_ with transaction.atomic(): session = Session.objects.select_for_update().get(id=session_id) - + current_period_id = str(session.get_current_session_period().id) + parameter_set = session.parameter_set.json() parameter_set_player_id = str(session.world_state['avatars'][str(player_id)]['parameter_set_player_id']) + summary_data = session.summary_data[current_period_id][str(player_id)] + good_one = parameter_set['parameter_set_players'][parameter_set_player_id]['good_one'] good_two = parameter_set['parameter_set_players'][parameter_set_player_id]['good_two'] good_three = parameter_set['parameter_set_players'][parameter_set_player_id]['good_three'] @@ -1005,6 +1008,11 @@ def sync_move_fruit_to_avatar(session_id, player_id, target_player_id, good_one_ session.world_state['avatars'][str(target_player_id)][good_two] += good_two_move session.world_state['avatars'][str(target_player_id)][good_three] += good_three_move + #data + summary_data["send_avatar_to_avatar_" + target_player_id + "_good_" + good_one] += good_one_move + summary_data["send_avatar_to_avatar_" + target_player_id + "_good_" + good_two] += good_two_move + summary_data["send_avatar_to_avatar_" + target_player_id + "_good_" + good_three] += good_three_move + session.save() world_state = session.world_state @@ -1021,7 +1029,9 @@ def sync_move_fruit_to_house(session_id, player_id, target_house_id, good_one_mo with transaction.atomic(): session = Session.objects.select_for_update().get(id=session_id) + current_period_id = str(session.get_current_session_period().id) world_state = session.world_state + summary_data = session.summary_data[current_period_id][str(player_id)] parameter_set = session.parameter_set.json() parameter_set_player_id = str(world_state['avatars'][str(player_id)]['parameter_set_player_id']) @@ -1082,6 +1092,11 @@ def sync_move_fruit_to_house(session_id, player_id, target_house_id, good_one_mo house[good_one] += good_one_move house[good_two] += good_two_move house[good_three] += good_three_move + + #data + summary_data["send_avatar_to_house_" + target_house_id + "_good_" + good_one] += good_one_move + summary_data["send_avatar_to_house_" + target_house_id + "_good_" + good_two] += good_two_move + summary_data["send_avatar_to_house_" + target_house_id + "_good_" + good_three] += good_three_move else: avatar[good_one] += good_one_move avatar[good_two] += good_two_move diff --git a/main/consumers/staff/session_consumer_mixins/timer.py b/main/consumers/staff/session_consumer_mixins/timer.py index 1d9b84b8..ee04b26d 100644 --- a/main/consumers/staff/session_consumer_mixins/timer.py +++ b/main/consumers/staff/session_consumer_mixins/timer.py @@ -212,8 +212,13 @@ def sync_continue_timer(event, session_id): #store data for i in world_state["avatars"]: + sd_player = summary_data[str(current_period_id)][i] + sd_player["end_health"] = world_state["avatars"][i]["health"] - summary_data[str(current_period_id)][i]["end_health"] = world_state["avatars"][i]["health"] + #inventory + for k in main.globals.Goods.choices: + sd_player["house_" + k[0]] = world_state["houses"][i][k[0]] + sd_player["avatar_" + k[0]] = world_state["avatars"][i][k[0]] session.save() @@ -272,10 +277,19 @@ def sync_continue_timer(event, session_id): world_state = session.world_state current_period_id = session.get_current_session_period().id - #store ending health + #store data for i in world_state["avatars"]: - summary_data[str(last_period_id)][i]["end_health"] = world_state["avatars"][i]["health"] - summary_data[str(current_period_id)][i]["start_health"] = world_state["avatars"][i]["health"] + sd_player = summary_data[str(last_period_id)][i] + + #health + sd_player["end_health"] = world_state["avatars"][i]["health"] + sd_player["start_health"] = world_state["avatars"][i]["health"] + + #inventory + for k in main.globals.Goods.choices: + sd_player["house_" + k[0]] = world_state["houses"][i][k[0]] + sd_player["avatar_" + k[0]] = world_state["avatars"][i][k[0]] + session = session.session_periods.get(id=last_period_id).do_consumption() session = session.get_current_session_period().do_timer_actions(time_remaining) diff --git a/main/models/session.py b/main/models/session.py index 8ee7ac9a..d6ee8e1f 100644 --- a/main/models/session.py +++ b/main/models/session.py @@ -177,8 +177,8 @@ def setup_summary_data(self): v["attacks_damage_from_" + k_s] = 0 for l in main.globals.Goods.choices: - v["send_avatar_to_avatar_" + l[0]] = 0 - v["send_avatar_to_house_" + l[0]] = 0 + v["send_avatar_to_avatar_" + k_s + "_good_" + l[0]] = 0 + v["send_avatar_to_house_" + k_s + "_good_" + l[0]] = 0 self.save() @@ -378,7 +378,7 @@ def get_download_summary_csv(self): writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC) - temp_header = ["Session ID", "Period", "Client #", "Label", "Earnings ¢", "Start Health", "End Health", "Health From Sleep"] + temp_header = ["Session ID", "Period", "Client #", "Label", "Earnings ¢", "Start Health", "End Health", "Health From Sleep", "Health From House"] #good totals for k in main.globals.Goods.choices: @@ -397,6 +397,13 @@ def get_download_summary_csv(self): temp_header.append("Cost of Attacks At " + str(player_number+1)) temp_header.append("Damage of Attacks From " + str(player_number+1)) + for k in main.globals.Goods.choices: + temp_header.append("Send " + k[0] + " to Avatar " + str(player_number+1)) + + for k in main.globals.Goods.choices: + temp_header.append("Send " + k[0] + " to House " + str(player_number+1)) + + #grove harvests for grove_number, grove in enumerate(world_state["groves"]): temp_header.append("Grove Harvests Count " + str(grove_number+1)) @@ -418,6 +425,7 @@ def get_download_summary_csv(self): temp_p["start_health"], temp_p["end_health"], temp_p["health_from_sleep"], + temp_p["health_from_house"], ] #good totals @@ -437,6 +445,13 @@ def get_download_summary_csv(self): temp_row.append(temp_p["attacks_cost_at_" + k]) temp_row.append(temp_p["attacks_damage_from_" + k]) + for l in main.globals.Goods.choices: + temp_row.append(temp_p["send_avatar_to_avatar_" + k + "_good_" + l[0]]) + + for l in main.globals.Goods.choices: + temp_row.append(temp_p["send_avatar_to_house_" + k + "_good_" + l[0]]) + + #grove harvests for grove_number, grove in enumerate(world_state["groves"]): temp_row.append(temp_p["grove_harvests_count_" + grove]) diff --git a/main/models/session_period.py b/main/models/session_period.py index 4db6ef6c..8ebf8bc7 100644 --- a/main/models/session_period.py +++ b/main/models/session_period.py @@ -131,6 +131,9 @@ def do_consumption(self): session = self.do_timer_actions(0) + current_period_id = self.id + summary_data = session.summary_data[str(current_period_id)] + #clear avatar inventory for i in self.session.world_state["avatars"]: avatar = self.session.world_state["avatars"][i] @@ -142,11 +145,18 @@ def do_consumption(self): #convert goods in homes to cash for i in self.session.world_state["houses"]: house = self.session.world_state["houses"][i] - avatar = self.session.world_state["avatars"][str(house["session_player"])] + avatar = self.session.world_state["avatars"][i] - avatar["health"] = Decimal(avatar["health"]) + Decimal(house["health_value"]) - avatar["health"] = str(min(Decimal(avatar["health"]), 100)) + avatar["health"] = str(Decimal(avatar["health"]) + Decimal(house["health_value"])) + summary_data[i]["health_from_house"] = house["health_value"] + + if Decimal(avatar["health"]) > 100: + health_overage = Decimal(avatar["health"]) - 100 + summary_data[i]["health_from_house"] = str(Decimal(summary_data[i]["health_from_house"]) - health_overage) + + avatar["health"] = "100" + avatar["sleeping"] = False house["health_consumed"] = house["health_value"]