from otree.api import * import random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'games3' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 MAIN_TEMPLATE = __name__ + '/Decide.html' MAIN_TEMPLATE2 = __name__ + '/Decide2.html' MAIN_TEMPLATE3 = __name__ + '/Decide3.html' MAIN_TEMPLATE4 = __name__ + '/Decide4.html' MAIN_TEMPLATE5 = __name__ + '/Decide5.html' MAIN_TEMPLATE6 = __name__ + '/Decide6.html' CHAT_TEMPLATE = __name__ + '/chat.html' CHAT2_TEMPLATE = __name__ + '/chat2.html' CHAT3_TEMPLATE = __name__ + '/chat3.html' CHAT4_TEMPLATE = __name__ + '/chat4.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): prop1 = models.IntegerField( label="How much would you like to assign for yourself?", max=40, min=0 ) rec1 = models.BooleanField( label="Do you wish to accept the offer?", choices=[ [True, "Accept"], [False, "Reject"] ] ) prop2 = models.IntegerField( label="How much would you like to assign for yourself?", max=40, min=0 ) rec2 = models.BooleanField( label="Do you wish to accept the offer?", choices=[ [True, "Accept"], [False, "Reject"] ] ) prop3 = models.IntegerField( label="How much would you like to assign for yourself?", max=40, min=0 ) rec3 = models.BooleanField( label="Do you wish to accept the offer?", choices=[ [True, "Accept"], [False, "Reject"] ] ) prop4 = models.IntegerField( label="How much would you like to assign for yourself?", max=40, min=0 ) rec4 = models.BooleanField( label="Do you wish to accept the offer?", choices=[ [True, "Accept"], [False, "Reject"] ] ) prop5 = models.IntegerField( label="How much would you like to assign for yourself?", max=40, min=0 ) rec5 = models.BooleanField( label="Do you wish to accept the offer?", choices=[ [True, "Accept"], [False, "Reject"] ] ) prop6 = models.IntegerField( label="How much would you like to assign for yourself?", max=40, min=0 ) rec6 = models.BooleanField( label="Do you wish to accept the offer?", choices=[ [True, "Accept"], [False, "Reject"] ] ) class Player(BasePlayer): profit1 = models.FloatField() profit2 = models.FloatField() profit3 = models.FloatField() profit4 = models.FloatField() profit5 = models.FloatField() profit6 = models.FloatField() prop_1p = models.IntegerField() prop_2p = models.IntegerField() prop_3p = models.IntegerField() prop_4p = models.IntegerField() prop_5p = models.IntegerField() prop_6p = models.IntegerField() rec_1 = models.IntegerField() rec_2 = models.IntegerField() rec_3 = models.IntegerField() rec_4 = models.IntegerField() rec_5 = models.IntegerField() rec_6 = models.IntegerField() # fake1 = models.FloatField() # fake2 = models.IntegerField(label="test here") class Message(ExtraModel): group = models.Link(Group) sender = models.Link(Player) text = models.StringField() def to_dict(msg: Message): return dict(sender=msg.sender.id_in_group, text=msg.text) # PAGES class Inst1(Page): pass class ShuffleWaitPage1(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): matrix = [[2, 5], [4, 9], [6, 7], [8, 10], [1, 3]] subsession.set_group_matrix(matrix) class P1(Page): form_model = 'group' form_fields = ['prop1'] template_name = C.MAIN_TEMPLATE @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class PWaitPage1(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.prop_1p = group.prop1 player_2.prop_1p = 40 - group.prop1 class R1(Page): form_model = 'group' form_fields = ['rec1'] template_name = C.MAIN_TEMPLATE @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitPage1(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.rec_1 = group.rec1 player_2.rec_1 = group.rec1 if group.rec1: player_1.profit1 = group.prop1 player_2.profit1 = 40 - group.prop1 else: player_1.profit1 = 0 player_2.profit1 = 0 class ShuffleWaitPage2(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): matrix = [[9, 2], [10, 6], [7, 8], [5, 1], [3, 4]] subsession.set_group_matrix(matrix) class P2(Page): form_model = 'group' form_fields = ['prop2'] template_name = C.MAIN_TEMPLATE2 @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class PWaitPage2(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.prop_2p = group.prop2 player_2.prop_2p = 40 - group.prop2 class R2(Page): form_model = 'group' form_fields = ['rec2'] template_name = C.MAIN_TEMPLATE2 @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitPage2(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.rec_2 = group.rec2 player_2.rec_2 = group.rec2 if group.rec2: player_1.profit2 = group.prop2 player_2.profit2 = 40 - group.prop2 else: player_1.profit2 = 0 player_2.profit2 = 0 class ShuffleWaitPage3(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): matrix = [[9, 1], [8, 5], [3, 7], [4, 6], [10, 2]] subsession.set_group_matrix(matrix) # (Group1, Group2) # Proposer(Player1) = sentence (player in Group1) # Rec(Player2) = binary class PreChat3(Page): timeout_seconds = 75 @staticmethod def live_method(player: Player, data): my_id = player.id_in_group group = player.group if 'text' in data: text = data['text'] msg = Message.create(group=group, sender=player, text=text) return {0: [to_dict(msg)]} return {my_id: [to_dict(msg) for msg in Message.filter(group=group)]} def vars_for_template(player: Player): sender = player.id_in_group return dict( sender=(sender == 1), receiver=(sender == 2) ) class P3(Page): form_model = 'group' form_fields = ['prop3'] template_name = C.MAIN_TEMPLATE3 @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class PWaitPage3(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.prop_3p = group.prop3 player_2.prop_3p = 40 - group.prop3 class R3(Page): form_model = 'group' form_fields = ['rec3'] template_name = C.MAIN_TEMPLATE3 @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitPage3(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.rec_3 = group.rec3 player_2.rec_3 = group.rec3 x = int(random.uniform(0, 4)) # print(x) y = 0 if x == 0: y = 0.5 if group.rec3: player_1.profit3 = group.prop3 + y player_2.profit3 = 40 - group.prop3 else: player_1.profit3 = 0 + y player_2.profit3 = 0 class ShuffleWaitPage4(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): matrix = [[9, 6], [8, 7], [3, 2], [4, 5], [10, 1]] subsession.set_group_matrix(matrix) # (Group1, Group2) # Proposer(Player1) = binary (player in Group1) # Rec(Player2) = sentence class PreChat4(Page): timeout_seconds = 75 @staticmethod def live_method(player: Player, data): my_id = player.id_in_group group = player.group if 'text' in data: text = data['text'] msg = Message.create(group=group, sender=player, text=text) return {0: [to_dict(msg)]} return {my_id: [to_dict(msg) for msg in Message.filter(group=group)]} def vars_for_template(player: Player): sender = player.id_in_group return dict( sender=(sender == 2), receiver=(sender == 1) ) class P4(Page): form_model = 'group' form_fields = ['prop4'] template_name = C.MAIN_TEMPLATE4 @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class PWaitPage4(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.prop_4p = group.prop4 player_2.prop_4p = 40 - group.prop4 class R4(Page): form_model = 'group' form_fields = ['rec4'] template_name = C.MAIN_TEMPLATE4 @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitPage4(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.rec_4 = group.rec4 player_2.rec_4 = group.rec4 x = int(random.uniform(0, 4)) # print(x) y = 0 if x == 0: y = 0.5 if group.rec4: player_1.profit4 = group.prop4 player_2.profit4 = 40 - group.prop4 + y else: player_1.profit4 = 0 player_2.profit4 = 0 + y class ShuffleWaitPage5(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): matrix = [[2, 9], [1, 8], [6, 3], [7, 4], [5, 10]] subsession.set_group_matrix(matrix) # (Group2, Group1) # Proposer(Player1) = sentence # Rec(Player2) = binary (player in Group1) class PreChat5(Page): timeout_seconds = 75 @staticmethod def live_method(player: Player, data): my_id = player.id_in_group group = player.group if 'text' in data: text = data['text'] msg = Message.create(group=group, sender=player, text=text) return {0: [to_dict(msg)]} return {my_id: [to_dict(msg) for msg in Message.filter(group=group)]} def vars_for_template(player: Player): sender = player.id_in_group return dict( sender=(sender == 1), receiver=(sender == 2) ) class P5(Page): form_model = 'group' form_fields = ['prop5'] template_name = C.MAIN_TEMPLATE5 @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class PWaitPage5(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.prop_5p = group.prop5 player_2.prop_5p = 40 - group.prop5 class R5(Page): form_model = 'group' form_fields = ['rec5'] template_name = C.MAIN_TEMPLATE5 @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitPage5(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.rec_5 = group.rec5 player_2.rec_5 = group.rec5 x = int(random.uniform(0, 4)) # print(x) y = 0 if x == 0: y = 0.5 if group.rec5: player_1.profit5 = group.prop5 + y player_2.profit5 = 40 - group.prop5 else: player_1.profit5 = 0 + y player_2.profit5 = 0 class ShuffleWaitPage6(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): matrix = [[5, 9], [6, 8], [1, 3], [2, 4], [7, 10]] subsession.set_group_matrix(matrix) # (Group2, Group1) # Proposer(Player1) = binary # Rec(Player2) = sentence (player in Group1) class PreChat6(Page): timeout_seconds = 75 @staticmethod def live_method(player: Player, data): my_id = player.id_in_group group = player.group if 'text' in data: text = data['text'] msg = Message.create(group=group, sender=player, text=text) return {0: [to_dict(msg)]} return {my_id: [to_dict(msg) for msg in Message.filter(group=group)]} def vars_for_template(player: Player): sender = player.id_in_group return dict( sender=(sender == 2), receiver=(sender == 1) ) class P6(Page): form_model = 'group' form_fields = ['prop6'] template_name = C.MAIN_TEMPLATE6 @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class PWaitPage6(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.prop_6p = group.prop6 player_2.prop_6p = 40 - group.prop6 class R6(Page): form_model = 'group' form_fields = ['rec6'] template_name = C.MAIN_TEMPLATE6 @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WaitPage6(WaitPage): @staticmethod def after_all_players_arrive(group: Group): player_lists = group.get_players() player_1 = player_lists[0] player_2 = player_lists[1] player_1.rec_6 = group.rec6 player_2.rec_6 = group.rec6 x = int(random.uniform(0, 4)) # print(x) y = 0 if x == 0: y = 0.5 if group.rec6: player_1.profit6 = group.prop6 player_2.profit6 = 40 - group.prop6 + y else: player_1.profit6 = 0 player_2.profit6 = 0 + y class Results(Page): form_model = 'player' @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant # real x = int(random.uniform(1, 7)) # print(x) participant.gn3 = x + 12 # print(participant.gn3) if x == 1: participant.pt3 = player.profit1 participant.prop1 = player.prop_1p participant.rec1 = player.rec_1 elif x == 2: participant.pt3 = player.profit2 participant.prop1 = player.prop_2p participant.rec1 = player.rec_2 elif x == 3: participant.pt3 = player.profit3 participant.prop1 = player.prop_3p participant.rec1 = player.rec_3 elif x == 4: participant.pt3 = player.profit4 participant.prop1 = player.prop_4p participant.rec1 = player.rec_4 elif x == 5: participant.pt3 = player.profit5 participant.prop1 = player.prop_5p participant.rec1 = player.rec_5 elif x == 6: participant.pt3 = player.profit6 participant.prop1 = player.prop_6p participant.rec1 = player.rec_6 elif x == 7: participant.pt3 = player.profit6 participant.prop1 = player.prop_6p participant.rec1 = player.rec_6 page_sequence = [Inst1, ShuffleWaitPage1, P1, PWaitPage1, R1, WaitPage1, ShuffleWaitPage2, P2, PWaitPage2, R2, WaitPage2, ShuffleWaitPage3, PreChat3, P3, PWaitPage3, R3, WaitPage3, ShuffleWaitPage4, PreChat4, P4, PWaitPage4, R4, WaitPage4, ShuffleWaitPage5, PreChat5, P5, PWaitPage5, R5, WaitPage5, ShuffleWaitPage6, PreChat6, P6, PWaitPage6, R6, WaitPage6, Results] # page_sequence = [Inst1, P1, PWaitPage1, R1, WaitPage1, # P2, PWaitPage2, R2, WaitPage2, # PreChat3, P3, PWaitPage3, R3, WaitPage3, # PreChat4, P4, PWaitPage4, R4, WaitPage4, # PreChat5, P5, PWaitPage5, R5, WaitPage5, # PreChat6, P6, PWaitPage6, R6, WaitPage6, # Results] # page_sequence = [ShuffleWaitPage1, P1, PWaitPage1, R1, WaitPage1, # ShuffleWaitPage2, P2, PWaitPage2, R2, WaitPage2] # page_sequence = [P1, PWaitPage1, R1, WaitPage1, # P2, PWaitPage2, R2, WaitPage2, # Results]