from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) author = 'Suyama Masaki' doc = """ This was created to conduct an experiment on downstream reciprocity """ class Constants(BaseConstants): name_in_url = 'downstream_sample1' players_per_group = 8 num_rounds = 9 endowment = c(10) multiplication_factor = 2 class Subsession(BaseSubsession): def creating_session(self): # self.group_randomly() # matrix = self.get_group_matrix() if self.round_number == 1: new_structure = [[1,2,3,4,5,6,7,8]] self.set_group_matrix(new_structure) elif self.round_number == 2: new_structure = [[2,3,4,5,6,7,8,1]] self.set_group_matrix(new_structure) elif self.round_number == 3: new_structure = [[3,4,5,6,7,8,1,2]] self.set_group_matrix(new_structure) elif self.round_number == 4: new_structure = [[4,5,6,7,8,1,2,3]] self.set_group_matrix(new_structure) elif self.round_number == 5: new_structure = [[5,6,7,8,1,2,3,4]] self.set_group_matrix(new_structure) elif self.round_number == 6: new_structure = [[6,7,8,1,2,3,4,5]] self.set_group_matrix(new_structure) elif self.round_number == 7: new_structure = [[7,8,1,2,3,4,5,6]] self.set_group_matrix(new_structure) elif self.round_number == 8: new_structure = [[8,1,2,3,4,5,6,7]] self.set_group_matrix(new_structure) elif self.round_number == 9: new_structure = [[1,2,3,4,5,6,7,8]] self.set_group_matrix(new_structure) # for row in matrix: # row.reverse() # self.set_group_matrix(matrix) class Group(BaseGroup): sent_amount = models.CurrencyField(min=0, max=C.ENDOWMENT) def set_payoffs_p1(self): p1 = self.get_player_by_role('Sender') p1.payoff = C.ENDOWMENT - self.sent_amount return p1.payoff def set_payoffs_p2(self): p2 = self.get_player_by_role('Receiver') p2.payoff = self.sent_amount * C.MULTIPLICATION_FACTOR return p2.payoff # def set_payoffs(self): # players = self.get_players() # contributions = [p.contribution for p in players] # self.sent_amount = contributions * multiplication_factor # for p in players: # p.payoff = C.ENDOWMENT - p.contribution # p1 = self.get_player_by_id(1) # p2 = self.get_player_by_id(2) # p3 = self.get_player_by_id(3) # p4 = self.get_player_by_id(4) # p1.payoff = C.ENDOWMENT # p2.payoff = C.ENDOWMENT # p3.payoff = C.ENDOWMENT # p4.payoff = C.ENDOWMENT class Player(BasePlayer): def role(self): if self.id_in_group==1: return 'Receiver' elif self.id_in_group==2: return 'Sender' elif self.id_in_group==3: return 'Informer' else: return 'pass' contribution = models.CurrencyField(min=0, max=C.ENDOWMENT)