from otree.api import * c = cu doc = '\nThis is a 2 staged "Ultimatum Game". One of two players is aked to split 100. The second player can accept or not. If not he gets asked to split 80. If player 1 does not accept nobody gets anything.' class C(BaseConstants): NAME_IN_URL = 'Ultimatum_2' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 ENDOWMENT = cu(100) ENDOWMENT_2 = cu(80) class Subsession(BaseSubsession): pass class Group(BaseGroup): kept_1 = models.CurrencyField(initial=0, label='Ich möchte behalten', max=C.ENDOWMENT, min=0) kept_2 = models.CurrencyField(initial=0, label='Ich möchte behalten', max=C.ENDOWMENT_2, min=0) accept_1 = models.BooleanField(choices=[[True, 'Ja'], [False, 'Nein']], label='Akzeptieren Sie das Angebot von Teilnehmer 1?') accept_2 = models.BooleanField(choices=[[True, 'Ja'], [False, 'Nein']], label='Akzeptieren Sie das Angebot von Teilnehmer 2?') def set_payoffs1(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.accept_1 == True: p1.payoff = group.kept_1 p2.payoff = (C.ENDOWMENT - group.kept_1) else: p1.payoff = p1.payoff p2.payoff = p2.payoff def set_payoffs2(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.accept_2 == True: p1.payoff = (C.ENDOWMENT_2 - group.kept_2) p2.payoff = group.kept_2 else: p1.payoff = p1.payoff p2.payoff = p2.payoff class Player(BasePlayer): pass class Fragen(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Intro(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return False class Angebot(Page): form_model = 'group' form_fields = ['kept_1'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 class Warten1(WaitPage): @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 return True class Entscheidung(Page): form_model = 'group' form_fields = ['accept_1'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 @staticmethod def vars_for_template(player: Player): group = player.group return dict(offer = C.ENDOWMENT - group.kept_1) class Warteseite_1(WaitPage): after_all_players_arrive = set_payoffs1 class Ergebnisse(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return group.accept_1 == True @staticmethod def vars_for_template(player: Player): group = player.group return dict(offer=C.ENDOWMENT - group.kept_1) class Introduction_Round2(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return group.accept_1 == False class Angebot_2(Page): form_model = 'group' form_fields = ['kept_2'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 2 and group.accept_1 == False class Warten2(WaitPage): @staticmethod def is_displayed(player: Player): group = player.group return group.accept_1 == False class Accept2(Page): form_model = 'group' form_fields = ['accept_2'] @staticmethod def is_displayed(player: Player): group = player.group return player.id_in_group == 1 and group.accept_1 == False @staticmethod def vars_for_template(player: Player): group = player.group return dict(offer2 = C.ENDOWMENT_2 - group.kept_2) class ResultsWaitPage2(WaitPage): after_all_players_arrive = set_payoffs2 @staticmethod def is_displayed(player: Player): group = player.group return group.accept_1 == False class Ergebnisse2(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return group.accept_1 == False and group.accept_2 == True @staticmethod def vars_for_template(player: Player): group = player.group return dict(offer2=C.ENDOWMENT_2 - group.kept_2) class Results3(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group return group.accept_1 == False and group.accept_2 == False class Ende(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS return True page_sequence = [Fragen, Intro, Angebot, Warten1, Entscheidung, Warteseite_1, Ergebnisse, Introduction_Round2, Angebot_2, Warten2, Accept2, ResultsWaitPage2, Ergebnisse2, Results3, Ende]