from otree.api import * from shared_out import * """ Sim for Voluntary Contribution Game. """ class Constants(BaseConstants): name_in_url = 'voluntary' players_per_group = None num_rounds = 10 instructions_template = 'voluntary/instructions.html' endowment = 50 class Subsession(BaseSubsession): pass class Group(BaseGroup): group_tokens = models.IntegerField(initial=0) class Player(BasePlayer): gp = models.IntegerField(min=0, max=Constants.endowment, label='Group Project') # FUNCTIONS def creating_session(subsession: Subsession): set_players_per_group(subsession) def set_payoff(player: Player): ip = 50 - player.gp player.payoff = ip + (0.5 * player.group.group_tokens) # PAGES class Introduction(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Main(Page): form_model = 'player' form_fields = ['gp'] class ResultsWaitPage(WaitPage): @staticmethod def after_all_players_arrive(group: Group): group.group_tokens = sum([p.gp for p in group.get_players()]) for p in group.get_players(): set_payoff(p) class Results(Page): @staticmethod def vars_for_template(player: Player): return {'player_payoff': float(player.payoff), 'ip': 50 - player.gp} class Final(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 10 @staticmethod def vars_for_template(player: Player): return {'my_payoff': float(player.participant.payoff)} page_sequence = [Introduction, Main, ResultsWaitPage, Results, Final]