from otree.api import * c = cu doc = '' class C(BaseConstants): PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 5 NAME_IN_URL = 't2' PARTICIPATION_COMPENSATION = 10 BUYER_ROLE = 'Buyer' SELLER_ROLE = 'Seller' class Subsession(BaseSubsession): pass class Group(BaseGroup): ACCEPT_REJECT_1 = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], label='Would you like to accept this offer?', widget=widgets.RadioSelect) ACCEPT_REJECT = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], label='Would you like to accept this offer?', widget=widgets.RadioSelect) random_number_1 = models.IntegerField() random_number_2 = models.IntegerField() random_number_3 = models.IntegerField() random_number_4 = models.IntegerField() random_number_5 = models.IntegerField() OFFER = models.IntegerField(label='Please make an offer between 0 EXD and 100 EXD ', max=100, min=0) ran_num = models.IntegerField() def random_numbers(group: Group): import random group.random_number_1 = random.randint(1,5) group.random_number_1 group.random_number_2 = random.randint(2,5) group.random_number_2 group.random_number_3 = random.randint(3,5) group.random_number_3 group.random_number_4 = random.randint(4,5) group.random_number_4 group.random_number_5 = random.randint(5,5) group.random_number_5 def filler_function(group: Group): print("I am great at coding!") def ran_function(group: Group): import random group.ran_num=random.randint(0,1) class Player(BasePlayer): is_man = models.BooleanField() is_woman = models.BooleanField() is_buyer = models.BooleanField() is_seller = models.BooleanField() offer = models.IntegerField(label='Please make an offer between 0 EXD and 100 EXD', max=100, min=0) first_mover = models.BooleanField() does_reveal = models.BooleanField() doesnt_reveal = models.BooleanField() avatar_reveal = models.StringField(choices=[['Hide', 'One'], ['Reveal', 'Two']], label='Please select:', widget=widgets.RadioSelect) quiz_payoff = models.IntegerField() buyer_payoff = models.IntegerField() seller_payoff = models.IntegerField() def get_form_fields(player: Player): group = player.group participant = player.participant if player.participant.vars['gender']=="Man": player.is_man=True else: player.is_man=False if player.participant.vars['gender']=="Woman": player.is_woman=True else: player.is_woman=False if player.role==C.BUYER_ROLE: player.is_buyer=True else: player.is_buyer=False if player.role==C.SELLER_ROLE: player.is_seller=True else: player.is_seller=False if group.ran_num==0: if player.role=="Buyer": player.first_mover=True if group.ran_num==1: if player.role=="Seller": player.first_mover=True if group.ran_num==1: if player.role=="Buyer": player.first_mover=False if group.ran_num==0: if player.role=="Seller": player.first_mover=False player.participant.vars['is_seller'] = player.is_buyer player.participant.vars['is_buyer'] = player.is_seller def participant_payoff(player: Player): group = player.group participant = player.participant player.quiz_payoff=participant.quiz_payoff if player.is_buyer: player.payoff=(100-group.OFFER)*(0.1)+(player.quiz_payoff)*(0.5)+10 if player.is_seller==True: player.payoff=(group.OFFER)*(0.1)+(player.quiz_payoff)*(0.5)+10 participant.payment=player.payoff class RAN_NUM(WaitPage): after_all_players_arrive = ran_function class INTRO(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): get_form_fields(player) class AVATAR_REVEAL(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class MAN_AVATAR(Page): form_model = 'player' form_fields = ['avatar_reveal'] @staticmethod def is_displayed(player: Player): participant = player.participant if player.round_number==1: if player.participant.vars['gender']=="Man": return True else: return False class WOMAN_AVATAR(Page): form_model = 'player' form_fields = ['avatar_reveal'] @staticmethod def is_displayed(player: Player): participant = player.participant if player.round_number==1: if player.participant.vars['gender']=="Woman": return True else: return False class ROUND_START(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number != 1 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant get_form_fields(player) player.does_reveal=player.participant.vars['does_reveal'] player.doesnt_reveal=player.participant.vars['doesnt_reveal'] get_form_fields(player) player.quiz_payoff=participant.quiz_payoff class ROUND_START_1(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant if player.avatar_reveal=="Reveal": player.does_reveal=True else: player.does_reveal=False if player.avatar_reveal=="Hide": player.doesnt_reveal=True else: player.doesnt_reveal=False player.participant.vars['does_reveal'] = player.does_reveal player.participant.vars['doesnt_reveal'] = player.doesnt_reveal get_form_fields(player) player.quiz_payoff=participant.quiz_payoff class ROLE_REMINDER_1(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): get_form_fields(player) class DISPLAY_WAIT(WaitPage): after_all_players_arrive = filler_function class AVATAR_DISPLAY(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class FIRST_OFFER(Page): form_model = 'player' form_fields = ['offer'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group participant = player.participant if player.first_mover==1: group.OFFER=player.offer participant.first_mover=player.first_mover class OFFER(Page): form_model = 'group' form_fields = ['OFFER'] @staticmethod def is_displayed(player: Player): group = player.group participant = player.participant if participant.first_mover==False: if group.round_number==2: return True elif group.round_number==4: return True if participant.first_mover==True: if group.round_number==3: return True elif group.round_number==5: return True else: return False class OFFER_WAIT(WaitPage): after_all_players_arrive = random_numbers body_text = 'Please wait for your counterpart to make an offer.' class FIRST_ACCEPT_REJECT(Page): form_model = 'group' form_fields = ['ACCEPT_REJECT_1'] @staticmethod def is_displayed(player: Player): participant = player.participant return participant.first_mover== 0 and player.round_number == 1 @staticmethod def vars_for_template(player: Player): group = player.group offer=group.OFFER return dict(buyer_payoff=100-offer, seller_payoff=offer) class ACCEPT_REJECT_1(Page): form_model = 'group' form_fields = ['ACCEPT_REJECT'] @staticmethod def is_displayed(player: Player): group = player.group participant = player.participant if participant.first_mover==1: if group.round_number==2: return True elif group.round_number==4: return True if participant.first_mover==0: if group.round_number==3: return True elif group.round_number==5: return True else: return False @staticmethod def vars_for_template(player: Player): group = player.group offer=group.OFFER return dict(buyer_payoff=100-offer, seller_payoff=offer) class A_R_WAIT(WaitPage): after_all_players_arrive = filler_function body_text = 'Please wait while your counterpart makes a decision.' class ROUND_END(Page): form_model = 'player' class FIRST_AGREEMENT(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group A_R = group.field_maybe_none("ACCEPT_REJECT_1") if A_R == 1: if group.round_number==1: return True else: return False @staticmethod def vars_for_template(player: Player): group = player.group offer=group.OFFER quiz_payoff=player.quiz_payoff*0.5 return dict(buyer_payoff=100-offer, seller_payoff=offer, quiz_payoff=quiz_payoff) @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group participant = player.participant player.buyer_payoff=100-group.OFFER player.seller_payoff=group.OFFER participant.buyer_payoff = player.buyer_payoff participant.seller_payoff = player.seller_payoff participant_payoff(player) @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group A_R = group.field_maybe_none("ACCEPT_REJECT_1") if A_R==1: return upcoming_apps[0] class AGREEMENT(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group A_R = group.field_maybe_none("ACCEPT_REJECT") if A_R == 1: if group.round_number!=1: return True else: return False @staticmethod def vars_for_template(player: Player): group = player.group offer=group.OFFER quiz_payoff=player.quiz_payoff*0.5 return dict(buyer_payoff=100-offer, seller_payoff=offer, quiz_payoff=quiz_payoff) @staticmethod def before_next_page(player: Player, timeout_happened): group = player.group participant = player.participant player.buyer_payoff=100-group.OFFER player.seller_payoff=group.OFFER participant.buyer_payoff = player.buyer_payoff participant.seller_payoff = player.seller_payoff participant_payoff(player) @staticmethod def app_after_this_page(player: Player, upcoming_apps): group = player.group A_R = group.field_maybe_none("ACCEPT_REJECT") if A_R==1: return upcoming_apps[0] class FIRST_GAME_OVER(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group if group.round_number == 1: if group.random_number_1 == 5: return True else: return False @staticmethod def vars_for_template(player: Player): quiz_payoff=player.quiz_payoff*0.5 return dict(quiz_payoff=quiz_payoff) @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant player.buyer_payoff=100 player.seller_payoff=100 participant.buyer_payoff = player.buyer_payoff participant.seller_payoff = player.seller_payoff participant_payoff(player) @staticmethod def app_after_this_page(player: Player, upcoming_apps): return upcoming_apps[-1] class GAME_OVER(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): group = player.group if group.round_number == 2: if group.random_number_2 == 5: return True elif group.round_number == 3: if group.random_number_3 == 5: return True elif group.round_number == 4: if group.random_number_4 == 5: return True elif group.round_number == 5: if group.random_number_5 == 5: return True @staticmethod def vars_for_template(player: Player): quiz_payoff=player.quiz_payoff*0.5 return dict(quiz_payoff=quiz_payoff) @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant player.buyer_payoff=100 player.seller_payoff=100 participant.buyer_payoff = player.buyer_payoff participant.seller_payoff = player.seller_payoff participant_payoff(player) @staticmethod def app_after_this_page(player: Player, upcoming_apps): return upcoming_apps[-1] page_sequence = [RAN_NUM, INTRO, AVATAR_REVEAL, MAN_AVATAR, WOMAN_AVATAR, ROUND_START, ROUND_START_1, ROLE_REMINDER_1, DISPLAY_WAIT, AVATAR_DISPLAY, FIRST_OFFER, OFFER, OFFER_WAIT, FIRST_ACCEPT_REJECT, ACCEPT_REJECT_1, A_R_WAIT, ROUND_END, FIRST_AGREEMENT, AGREEMENT, FIRST_GAME_OVER, GAME_OVER]