from otree.api import * import random # dog for emotional support doc = """ |\_/| | @ @ Woof! | <> _ | _/\------____ ((| |)) | `--' | ____|_ ___| |___.' /_/_____/____/_______| """ class C(BaseConstants): NAME_IN_URL = 'ultimatumgame_effort' # experiment needs two person groups PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 # make a budget so can change it later if we have to BUDGET = 10 class Subsession(BaseSubsession): pass class Group(BaseGroup): # variable tracking how much the first player wants to give give = models.IntegerField(label="How much do you want to distribute to the other participant (Responder)?", min=0, max=C.BUDGET) # variable to track if the second player accepts or not accept = models.BooleanField(label="Would you like to accept the allocation?") # both are group variables because they effect the whole group and not just relevant for the individual players # for the whole group there is only one "give" and "accept", not every player has both! belief = models.IntegerField(label="In your opinion, how many points will the proposer give to you?", min = 0, max = C.BUDGET) class Player(BasePlayer): endowment1 = models.IntegerField() sum = models.IntegerField() endowment_other = models.IntegerField() role1 = models.StringField() role_random = models.FloatField() # PAGES class Welcome(Page): form_model = 'group' @staticmethod def before_next_page(player: Player, timeout_happened): player.role_random = random.random() player.endowment1 = player.participant.endowment class Instruction_Proposer(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if p1.field_maybe_none('role_random') >= p2.field_maybe_none('role_random'): p1.role1 = 'proposer' p2.role1 = 'responder' else: p1.role1 = 'responder' p2.role1 = 'proposer' return player.field_maybe_none('role1') == 'proposer' @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if player.id_in_group == 1: player.endowment_other = p2.participant.endowment elif player.id_in_group == 2: player.endowment_other = p1.participant.endowment player.sum = player.endowment1 + player.endowment_other class Instruction_Responder(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if p1.field_maybe_none('role_random') >= p2.field_maybe_none('role_random'): p1.role1 = 'proposer' p2.role1 = 'responder' else: p1.role1 = 'responder' p2.role1 = 'proposer' return player.field_maybe_none('role1') == 'responder' @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if player.id_in_group == 1: player.endowment_other = p2.participant.endowment elif player.id_in_group == 2: player.endowment_other = p1.participant.endowment player.sum = player.endowment1 + player.endowment_other class Decision(Page): form_model = "group" form_fields = ['give'] # only show this to the first participant in the group @staticmethod def is_displayed(player: Player): return player.field_maybe_none('role1') == 'proposer' class DecisionWaitPage(WaitPage): pass class Response(Page): form_model = "group" form_fields = ['accept'] # only show this to the second participant in the group @staticmethod def is_displayed(player: Player): return player.field_maybe_none('role1') == 'responder' class ResultsWaitPage(WaitPage): pass @staticmethod def after_all_players_arrive(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.accept: if p1.field_maybe_none('role1') == 'proposer' and p2.field_maybe_none('role1') == 'responder': group.get_player_by_id(1).payoff = C.BUDGET - group.give group.get_player_by_id(1).participant.payoff_UG = group.get_player_by_id(1).payoff group.get_player_by_id(2).payoff = group.give group.get_player_by_id(2).participant.payoff_UG = group.get_player_by_id(2).payoff elif p1.field_maybe_none('role1') == 'responder' and p2.field_maybe_none('role1') == 'proposer': group.get_player_by_id(2).payoff = C.BUDGET -group.give group.get_player_by_id(2).participant.payoff_UG = group.get_player_by_id(2).payoff group.get_player_by_id(1).payoff = group.give group.get_player_by_id(1).participant.payoff_UG = group.get_player_by_id(1).payoff else: for p in group.get_players(): p.payoff = 0 p.participant.payoff_UG = p.payoff class Belief(Page): form_model = "group" form_fields = ['belief'] @staticmethod def is_displayed(player: Player): return player.field_maybe_none('role1') == 'responder' class Results(Page): pass page_sequence = [Welcome, DecisionWaitPage, Instruction_Proposer, Instruction_Responder, Decision, DecisionWaitPage, Belief, Response, ResultsWaitPage, Results]