from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'Unraveling' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 10 K = 3 P_LF = 0.2 class Subsession(BaseSubsession): firms_long = models.BooleanField() def creating_session(subsession: Subsession): session = subsession.session import random P_LW = 1-C.P_LF subsession.firms_long = random.choices([True,False], weights = [C.P_LF,P_LW], k = 1)[0] class Group(BaseGroup): players_per_group = models.IntegerField(initial=C.PLAYERS_PER_GROUP) def setpayoffs(group: Group): session = group.session subsession = group.subsession f1 = group.get_player_by_id(1) f2 = group.get_player_by_id(2) f3 = group.get_player_by_id(3) f0 = subsession.firms_long if f1.Early_Contract == True: f1.payoff = C.K elif f0 == True & f2.Early_Contract == True & f3.Early_Contract == True: f1.payoff = 0 else: f1.payoff = C.K +1 if f2.Early_Contract == True: f2.payoff = C.K elif f0 == True & f3.Early_Contract == True: f2.payoff = 0 else: f2.payoff = C.K + 1 if f3.Early_Contract == True: f3.payoff = C.K elif f0 == True: f3.payoff = 0 else: f3.payoff = C.K + 1 class Player(BasePlayer): Early_Contract = models.BooleanField(label='Would you like to form an early contract?') class Contract(Page): form_model = 'player' form_fields = ['Early_Contract'] @staticmethod def vars_for_template(player: Player): return dict( high_payoff = C.K + 1) class MyWaitPage(WaitPage): after_all_players_arrive = setpayoffs class Payoffs(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): group = player.group return dict( f1 = group.get_player_by_id(1), f2 = group.get_player_by_id(2), f3 = group.get_player_by_id(3) ) page_sequence = [Contract, MyWaitPage, Payoffs]