from otree.api import ( Page, WaitPage, models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) class Constants(BaseConstants): name_in_url = 'my_public_goods_attempt_2' players_per_group = 3 num_rounds = 3 endowment = c(100) MPCR1 = 1.5 # 1>multiplier>n players MPCR2 = 2 class Subsession(BaseSubsession): pass class Group(BaseGroup): total_contribution = models.FloatField() individual_share = models.FloatField() MPCR = models.FloatField() class Player(BasePlayer): contribution = models.IntegerField( min=0, max=Constants.endowment, label="How much will you contribute?" ) # FUNCTIONS def creating_session(subsession): #Varying MPCR for g in subsession.get_groups(): print('round', subsession.round_number) print('num_rounds/2', int(Constants.num_rounds/2)) if subsession.round_number <= int(Constants.num_rounds/2): # in first half g.MPCR = Constants.MPCR1 else: # second half g.MPCR = Constants.MPCR2 for p in subsession.get_players(): if subsession.round_number == 1: p.participant.vars['totalEarnings'] = 0 def set_payoffs(group: Group): players = group.get_players() contributions = [p.contribution for p in players] # [] make a list group.total_contribution = sum(contributions) group.individual_share = ( group.total_contribution * Constants.multiplier / Constants.players_per_group ) for p in players: p.payoff = Constants.endowment - p.contribution + group.individual_share # PAGES class Intro(Page): pass class Contribute(Page): form_model = 'player' form_fields = ['contribution'] class ResultsWaitPage(WaitPage): after_all_players_arrive = 'set_payoffs' body_text = "Please wait for everyone to contribute." class Results(Page): ending = "Thank you for participating." page_sequence = [Contribute, ResultsWaitPage]