import math import random import time from .models import Group, Constants, Player from ._builtin import Page, WaitPage class Pair(WaitPage): group_by_arrival_time = True class InvestRound1(Page): form_model = "player" form_fields = ["invest_amount_r1"] def vars_for_template(self): self.player.start_invest = time.time() return {} class Round1Wait(WaitPage): def after_all_players_arrive(group: Group): if random.random() <= 1 / 3: group.asset_up_r1 = 1 else: group.asset_up_r1 = 0 for p in group.get_players(): if group.asset_up_r1 == 1: p.invest_profit_r1 = p.invest_amount_r1 * 3.5 else: p.invest_profit_r1 = 0 p.total_score += p.invest_profit_r1 + (100 - p.invest_amount_r1) players = group.get_players() scores = sorted([p.total_score for p in players], reverse=True) for player in players: player.rank_r1 = scores.index(player.total_score) + 1 class InvestRound1Results(Page): def vars_for_template(self): player = self.player group = self.group ranks = [p.rank_r1 for p in group.get_players()] asset_stat = "הנכס הניב רווחים" if group.asset_up_r1 else "הכסף שהושקע הופסד" coins_from_saving = 100 - player.invest_amount_r1 if ranks.count(player.rank_r1) > 1: tie = "תיקו עבור מקום" else: tie = "" return dict(asset_stat=asset_stat, coins_from_saving=coins_from_saving, tie=tie) class InvestRound2(Page): form_model = "player" form_fields = ["invest_amount_r2"] class Round2Wait(WaitPage): def after_all_players_arrive(group: Group): if random.random() <= 1 / 3: group.asset_up_r2 = 1 else: group.asset_up_r2 = 0 for p in group.get_players(): if group.asset_up_r2 == 1: p.invest_profit_r2 = p.invest_amount_r2 * 3.5 else: p.invest_profit_r2 = 0 p.total_score += p.invest_profit_r2 + (100 - p.invest_amount_r2) players = group.get_players() scores = sorted([p.total_score for p in players], reverse=True) for player in players: player.rank_r2 = scores.index(player.total_score) + 1 class InvestRound2Results(Page): def vars_for_template(self): player = self.player group = self.group ranks = [p.rank_r2 for p in group.get_players()] asset_stat = "הנכס הניב רווחים" if group.asset_up_r2 else "הכסף שהושקע הופסד" coins_from_saving = 100 - player.invest_amount_r2 if ranks.count(player.rank_r2) > 1: tie = "תיקו עבור מקום" else: tie = "" return dict(asset_stat=asset_stat, coins_from_saving=coins_from_saving, tie=tie) class InvestRound3(Page): form_model = "player" form_fields = ["invest_amount_r3"] class Round3Wait(WaitPage): def after_all_players_arrive(group: Group): if random.random() <= 1 / 3: group.asset_up_r3 = 1 else: group.asset_up_r3 = 0 for p in group.get_players(): if group.asset_up_r3 == 1: p.invest_profit_r3 = p.invest_amount_r3 * 3.5 else: p.invest_profit_r3 = 0 p.total_score += p.invest_profit_r3 + (100 - p.invest_amount_r3) players = group.get_players() scores = sorted([p.total_score for p in players], reverse=True) for player in players: player.rank_r3 = scores.index(player.total_score) + 1 class InvestRound3Results(Page): def vars_for_template(self): player = self.player group = self.group ranks = [p.rank_r3 for p in group.get_players()] asset_stat = "הנכס הניב רווחים" if group.asset_up_r3 else "הכסף שהושקע הופסד" coins_from_saving = 100 - player.invest_amount_r3 if ranks.count(player.rank_r3) > 1: tie = "תיקו עבור מקום" else: tie = "" return dict(asset_stat=asset_stat, coins_from_saving=coins_from_saving, tie=tie) class InvestRound4(Page): form_model = "player" form_fields = ["invest_amount_r4"] class Round4Wait(WaitPage): def after_all_players_arrive(group: Group): if random.random() <= 1 / 3: group.asset_up_r4 = 1 else: group.asset_up_r4 = 0 for p in group.get_players(): if group.asset_up_r4 == 1: p.invest_profit_r4 = p.invest_amount_r4 * 3.5 else: p.invest_profit_r4 = 0 p.total_score += p.invest_profit_r4 + (100 - p.invest_amount_r4) players = group.get_players() scores = sorted([p.total_score for p in players], reverse=True) for player in players: player.rank_r4 = scores.index(player.total_score) + 1 ranks = sorted([p.rank_r4 for p in group.get_players()], reverse=True) ranks_uniq = sorted(list(set([p.rank_r4 for p in group.get_players()])), reverse=True) payoffs = [Constants.first_pay, Constants.sec_pay, Constants.other_pay, Constants.other_pay] for rank in ranks_uniq: N = ranks.count(rank) payout = math.ceil(sum(payoffs[rank-1:rank-1 + N])/N) for p in players: if p.rank_r4 == rank: p.participant.vars['total_payout'] = payout p.payout = payout class InvestRound4Results(Page): def vars_for_template(self): player = self.player group = self.group ranks = [p.rank_r4 for p in group.get_players()] asset_stat = "הנכס הניב רווחים" if group.asset_up_r4 else "הכסף שהושקע הופסד" coins_from_saving = 100 - player.invest_amount_r4 if ranks.count(player.rank_r4) > 1: tie = " תיקו עבור מקום" else: tie = "" return dict(asset_stat=asset_stat, coins_from_saving=coins_from_saving, tie=tie) class Results(Page): def vars_for_template(self): player = self.player group = self.group ranks = [p.rank_r4 for p in group.get_players()] if ranks.count(player.rank_r4) > 1: tie = " תיקו עבור מקום" else: tie = "" return dict(tie=tie) page_sequence = [Pair, InvestRound1, Round1Wait, InvestRound1Results, InvestRound2, Round2Wait, InvestRound2Results, InvestRound3, Round3Wait, InvestRound3Results, InvestRound4, Round4Wait, InvestRound4Results, Results]