from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Filip Gonschorek , Mingxian Jin' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'cutcake_last_challenger_3' players_per_group = 3 num_rounds = 7 class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: self.group_randomly() else: self.group_like_round(1) class Group(BaseGroup): resulting_cut = models.IntegerField(initial=0) resulting_cut_left = models.IntegerField(initial=0) resulting_cut_middle = models.IntegerField(initial=0) round_value = models.IntegerField(initial=1) def set_round_value(self): self.round_value += 1 def set_resulting_cut(self): if self.round_value == 1: cuts = sorted([p.cut_value1 for p in self.get_players() if p.cut_value1 is not None]) self.resulting_cut = cuts[0] else: cuts = sorted([p.cut_value2 for p in self.get_players() if p.cut_value2 is not None]) if len(cuts) == 0: self.resulting_cut = self.resulting_cut_left else: self.resulting_cut = cuts[0] def set_resulting_cut_left(self): self.resulting_cut_left = self.resulting_cut def set_resulting_cut_middle(self): self.resulting_cut_middle = self.resulting_cut def set_dropout(self): if self.round_value == 1: dropout_candidates = [p for p in self.get_players() if p.is_challenger or p.is_challenger is None] dropout = dropout_candidates[-1] dropout.is_dropout = True else: dropout_candidates = [p for p in self.get_players() if not p.is_dropout and (p.is_challenger2 or p.is_challenger2 is None)] dropout = dropout_candidates[-1] dropout.is_dropout2 = True cutter_candidates = [p for p in self.get_players() if not p.is_dropout] cutter = cutter_candidates[0] cutter.is_cutter = True class Player(BasePlayer): payoff_help = models.CurrencyField(initial=0) cut_value = models.IntegerField() cut_value1 = models.IntegerField() cut_value2 = models.IntegerField() left_piece = models.IntegerField(initial=0) right_piece = models.IntegerField(initial=0) middle_piece = models.IntegerField(initial=0) is_cutter = models.BooleanField(initial=False) is_challenger_this = models.BooleanField() is_challenger = models.BooleanField() is_challenger2 = models.BooleanField() is_dropout = models.BooleanField(initial=False) is_dropout2 = models.BooleanField(initial=False) envy = models.BooleanField() planned_leftpiece_1 = models.IntegerField() truth_telling_1st_stage = models.BooleanField() planned_leftpiece_2 = models.IntegerField() truth_telling_2nd_stage = models.BooleanField() def set_cut_value(self): if self.group.round_value == 1: self.cut_value1 = self.cut_value else: self.cut_value2 = self.cut_value def set_is_challenger(self): if self.group.round_value == 1: self.is_challenger = self.is_challenger_this else: self.is_challenger2 = self.is_challenger_this def set_left_piece(self): if self.id_in_group == 1: if self.group.resulting_cut_left <= 90: self.left_piece = 0 elif self.group.resulting_cut_left <= 110: self.left_piece = self.group.resulting_cut_left - 90 elif self.group.resulting_cut_left <= 220: self.left_piece = 20 elif self.group.resulting_cut_left <= 260: self.left_piece = self.group.resulting_cut_left - 200 elif self.group.resulting_cut_left <= 280: self.left_piece = 60 elif self.group.resulting_cut_left <= 300: self.left_piece = self.group.resulting_cut_left - 220 elif self.group.resulting_cut_left <= 340: self.left_piece = 80 elif self.group.resulting_cut_left <= 370: self.left_piece = self.group.resulting_cut_left - 260 elif self.group.resulting_cut_left <= 400: self.left_piece = 110 elif self.group.resulting_cut_left <= 410: self.left_piece = self.group.resulting_cut_left - 290 else: self.left_piece = 120 if self.id_in_group == 2: if self.group.resulting_cut_left <= 70: self.left_piece = 0 elif self.group.resulting_cut_left <= 110: self.left_piece = self.group.resulting_cut_left - 70 elif self.group.resulting_cut_left <= 120: self.left_piece = 40 elif self.group.resulting_cut_left <= 190: self.left_piece = self.group.resulting_cut_left - 80 elif self.group.resulting_cut_left <= 220: self.left_piece = 110 elif self.group.resulting_cut_left <= 230: self.left_piece = self.group.resulting_cut_left - 110 else: self.left_piece = 120 if self.id_in_group == 3: if self.group.resulting_cut_left <= 280: self.left_piece = 0 elif self.group.resulting_cut_left <= 320: self.left_piece = self.group.resulting_cut_left - 280 elif self.group.resulting_cut_left <= 350: self.left_piece = 40 elif self.group.resulting_cut_left <= 410: self.left_piece = self.group.resulting_cut_left - 310 elif self.group.resulting_cut_left <= 430: self.left_piece = 100 elif self.group.resulting_cut_left <= 440: self.left_piece = self.group.resulting_cut_left - 330 elif self.group.resulting_cut_left <= 450: self.left_piece = 110 elif self.group.resulting_cut_left <= 460: self.left_piece = self.group.resulting_cut_left - 340 else: self.left_piece = 120 def set_middle_piece(self): if self.id_in_group == 1: if self.group.resulting_cut_middle <= 90: self.middle_piece = 0 elif self.group.resulting_cut_middle <= 110: self.middle_piece = self.group.resulting_cut_middle - 90 elif self.group.resulting_cut_middle <= 220: self.middle_piece = 20 elif self.group.resulting_cut_middle <= 260: self.middle_piece = self.group.resulting_cut_middle - 200 elif self.group.resulting_cut_middle <= 280: self.middle_piece = 60 elif self.group.resulting_cut_middle <= 300: self.middle_piece = self.group.resulting_cut_middle - 220 elif self.group.resulting_cut_middle <= 340: self.middle_piece = 80 elif self.group.resulting_cut_middle <= 370: self.middle_piece = self.group.resulting_cut_middle - 260 elif self.group.resulting_cut_middle <= 400: self.middle_piece = 110 elif self.group.resulting_cut_middle <= 410: self.middle_piece = self.group.resulting_cut_middle - 290 else: self.middle_piece = 120 if self.id_in_group == 2: if self.group.resulting_cut_middle <= 70: self.middle_piece = 0 elif self.group.resulting_cut_middle <= 110: self.middle_piece = self.group.resulting_cut_middle - 70 elif self.group.resulting_cut_middle <= 120: self.middle_piece = 40 elif self.group.resulting_cut_middle <= 190: self.middle_piece = self.group.resulting_cut_middle - 80 elif self.group.resulting_cut_middle <= 220: self.middle_piece = 110 elif self.group.resulting_cut_middle <= 230: self.middle_piece = self.group.resulting_cut_middle - 110 else: self.middle_piece = 120 if self.id_in_group == 3: if self.group.resulting_cut_middle <= 280: self.middle_piece = 0 elif self.group.resulting_cut_middle <= 320: self.middle_piece = self.group.resulting_cut_middle - 280 elif self.group.resulting_cut_middle <= 350: self.middle_piece = 40 elif self.group.resulting_cut_middle <= 410: self.middle_piece = self.group.resulting_cut_middle - 310 elif self.group.resulting_cut_middle <= 430: self.middle_piece = 100 elif self.group.resulting_cut_middle <= 440: self.middle_piece = self.group.resulting_cut_middle - 330 elif self.group.resulting_cut_middle <= 450: self.middle_piece = 110 elif self.group.resulting_cut_middle <= 460: self.middle_piece = self.group.resulting_cut_middle - 340 else: self.middle_piece = 120 self.right_piece = 120 - self.middle_piece self.middle_piece = self.middle_piece - self.left_piece def set_payoff(self): if self.is_dropout: self.payoff = c(self.left_piece) elif self.is_dropout2: self.payoff = c(self.middle_piece) else: self.payoff = c(self.right_piece) def set_envy(self): if self.is_dropout: if self.left_piece >= self.middle_piece and self.left_piece >= self.right_piece: self.envy = False else: self.envy = True elif self.is_dropout2: if self.middle_piece >= self.left_piece and self.middle_piece >= self.right_piece: self.envy = False else: self.envy = True else: if self.right_piece >= self.left_piece and self.right_piece >= self.middle_piece: self.envy = False else: self.envy = True def set_payoff_help(self): self.payoff_help = self.in_round(1).payoff + self.in_round(2).payoff + self.in_round(3).payoff + \ self.in_round(4).payoff + self.in_round(5).payoff + self.in_round(6).payoff + \ self.in_round(7).payoff def set_planned_leftpiece_1(self): if self.id_in_group == 1: if self.cut_value <= 90: self.planned_leftpiece_1 = 0 elif self.cut_value <= 110: self.planned_leftpiece_1 = self.cut_value - 90 elif self.cut_value <= 220: self.planned_leftpiece_1 = 20 elif self.cut_value <= 260: self.planned_leftpiece_1 = self.cut_value - 220 + 20 elif self.cut_value <= 280: self.planned_leftpiece_1 = 60 elif self.cut_value <= 300: self.planned_leftpiece_1 = self.cut_value - 280 + 60 elif self.cut_value <= 340: self.planned_leftpiece_1 = 80 elif self.cut_value <= 370: self.planned_leftpiece_1 = self.cut_value - 340 + 80 elif self.cut_value <= 400: self.planned_leftpiece_1 = 110 elif self.cut_value <= 410: self.planned_leftpiece_1 = self.cut_value - 400 + 110 else: self.planned_leftpiece_1 = 120 elif self.id_in_group == 2: if self.is_challenger == False: if self.group.resulting_cut <= 70: self.planned_leftpiece_1 = 0 elif self.group.resulting_cut <= 110: self.planned_leftpiece_1 = self.group.resulting_cut - 70 elif self.group.resulting_cut <= 120: self.planned_leftpiece_1 = 40 elif self.group.resulting_cut <= 190: self.planned_leftpiece_1 = self.group.resulting_cut - 80 elif self.group.resulting_cut <= 220: self.planned_leftpiece_1 = 110 elif self.group.resulting_cut <= 230: self.planned_leftpiece_1 = self.group.resulting_cut - 110 else: self.planned_leftpiece_1 = 120 elif self.is_challenger == True: if self.cut_value <= 70: self.planned_leftpiece_1 = 0 elif self.cut_value <= 110: self.planned_leftpiece_1 = self.cut_value - 70 elif self.cut_value <= 120: self.planned_leftpiece_1 = 40 elif self.cut_value <= 190: self.planned_leftpiece_1 = self.cut_value - 80 elif self.cut_value <= 220: self.planned_leftpiece_1 = 110 elif self.cut_value <= 230: self.planned_leftpiece_1 = self.cut_value - 110 else: self.planned_leftpiece_1 = 120 elif self.id_in_group == 3: if self.group.resulting_cut <= 280: self.planned_leftpiece_1 = 0 elif self.group.resulting_cut <= 320: self.planned_leftpiece_1 = self.group.resulting_cut - 280 elif self.group.resulting_cut <= 350: self.planned_leftpiece_1 = 40 elif self.group.resulting_cut <= 410: self.planned_leftpiece_1 = self.group.resulting_cut - 350 + 40 elif self.group.resulting_cut <= 430: self.planned_leftpiece_1 = 100 elif self.group.resulting_cut <= 440: self.planned_leftpiece_1 = self.group.resulting_cut - 430 + 100 elif self.group.resulting_cut <= 450: self.planned_leftpiece_1 = 110 elif self.group.resulting_cut <= 460: self.planned_leftpiece_1 = self.group.resulting_cut - 450 + 110 else: self.planned_leftpiece_1 = 120 def set_truthtelling_1(self): if self.id_in_group == 1: if self.planned_leftpiece_1 >= 35 and self.planned_leftpiece_1 <= 45: self.truth_telling_1st_stage = True else: self.truth_telling_1st_stage = False elif self.id_in_group == 2: if self.is_challenger == False: if self.planned_leftpiece_1 < 40 : self.truth_telling_1st_stage = True else: self.truth_telling_1st_stage = False else: if self.planned_leftpiece_1 >= 35 and self.planned_leftpiece_1 <= 45: self.truth_telling_1st_stage = True else: self.truth_telling_1st_stage = False elif self.id_in_group == 3: if self.is_challenger == False: if self.planned_leftpiece_1 < 40 : self.truth_telling_1st_stage = True else: self.truth_telling_1st_stage = False else: if self.planned_leftpiece_1 < 40 : self.truth_telling_1st_stage = False else: self.truth_telling_1st_stage = True def set_planned_leftpiece_2(self): if self.id_in_group == 1 and self.is_dropout == False: if self.cut_value <= 90 : self.planned_leftpiece_2 = 0 - self.left_piece elif self.cut_value <= 110: self.planned_leftpiece_2 = self.cut_value - 90 - self.left_piece elif self.cut_value <= 220: self.planned_leftpiece_2 = 20 - self.left_piece elif self.cut_value <= 260: self.planned_leftpiece_2 = self.cut_value - 220 + 20 - self.left_piece elif self.cut_value <= 280: self.planned_leftpiece_2 = 60 - self.left_piece elif self.cut_value <= 300: self.planned_leftpiece_2 = self.cut_value - 280 + 60 - self.left_piece elif self.cut_value <= 340: self.planned_leftpiece_2 = 80 - self.left_piece elif self.cut_value <= 370: self.planned_leftpiece_2 = self.cut_value - 340 + 80 - self.left_piece elif self.cut_value <= 400: self.planned_leftpiece_2 = 110 - self.left_piece elif self.cut_value <= 410: self.planned_leftpiece_2 = self.cut_value - 400 + 110 - self.left_piece else: self.planned_leftpiece_2 = 120 - self.left_piece elif self.id_in_group == 2 and self.is_cutter == True: if self.cut_value <= 70 : self.planned_leftpiece_2 = 0 - self.left_piece elif self.cut_value <= 110: self.planned_leftpiece_2 = self.cut_value - 70 - self.left_piece elif self.cut_value <= 120: self.planned_leftpiece_2 = 40 - self.left_piece elif self.cut_value <= 190: self.planned_leftpiece_2 = self.cut_value - 120 + 40 - self.left_piece elif self.cut_value <= 220: self.planned_leftpiece_2 = 110 - self.left_piece elif self.cut_value <= 230: self.planned_leftpiece_2 = self.cut_value - 220 + 110 - self.left_piece else: self.planned_leftpiece_2 = 120 - self.left_piece elif self.id_in_group == 2 and self.is_dropout == False and self.is_cutter == False: if self.group.resulting_cut <= 70 : self.planned_leftpiece_2 = 0 - self.left_piece elif self.group.resulting_cut <= 110 : self.planned_leftpiece_2 = self.group.resulting_cut - 70 - self.left_piece elif self.group.resulting_cut <= 120 : self.planned_leftpiece_2 = 40 - self.left_piece elif self.group.resulting_cut <= 190 : self.planned_leftpiece_2 = self.group.resulting_cut - 80 - self.left_piece elif self.group.resulting_cut <= 220: self.planned_leftpiece_2 = 110 - self.left_piece elif self.group.resulting_cut <= 230 : self.planned_leftpiece_2 = self.group.resulting_cut - 110 - self.left_piece else: self.planned_leftpiece_2 = 120 - self.left_piece elif self.id_in_group == 3 and self.is_dropout == False: if self.group.resulting_cut <= 280 : self.planned_leftpiece_2 = 0 - self.left_piece elif self.group.resulting_cut <= 320 : self.planned_leftpiece_2 = self.group.resulting_cut - 280 - self.left_piece elif self.group.resulting_cut <= 350 : self.planned_leftpiece_2 = 40 - self.left_piece elif self.group.resulting_cut <= 410 : self.planned_leftpiece_2 = self.group.resulting_cut - 310 - self.left_piece elif self.group.resulting_cut <= 430 : self.planned_leftpiece_2 = 100 - self.left_piece elif self.group.resulting_cut <= 440 : self.planned_leftpiece_2 = self.group.resulting_cut - 330 - self.left_piece elif self.group.resulting_cut <= 450 : self.planned_leftpiece_2 = 110 - self.left_piece elif self.group.resulting_cut <= 460 : self.planned_leftpiece_2 = self.group.resulting_cut - 340 - self.left_piece else: self.planned_leftpiece_2 = 120 - self.left_piece def set_truthtelling_2(self): if self.id_in_group == 1 and self.is_dropout == False: if self.planned_leftpiece_2 >= int((120 - self.left_piece)/2) - 5 and self.planned_leftpiece_2 <= int((120 - self.left_piece)/2) + 5: self.truth_telling_2nd_stage = True else: self.truth_telling_2nd_stage = False elif self.id_in_group == 2 and self.is_cutter == True: if self.planned_leftpiece_2 >= int((120 - self.left_piece)/2) - 5 and self.planned_leftpiece_2 <= int((120 - self.left_piece)/2) + 5: self.truth_telling_2nd_stage = True else: self.truth_telling_2nd_stage = False elif self.id_in_group == 2 and self.is_dropout == False and self.is_cutter == False and self.is_challenger2 == False: if self.planned_leftpiece_2 >= int((120 - self.left_piece)/2): self.truth_telling_2nd_stage = False else: self.truth_telling_2nd_stage = True elif self.id_in_group == 2 and self.is_dropout == False and self.is_cutter == False and self.is_challenger2 == True: if self.planned_leftpiece_2 >= int((120 - self.left_piece)/2): self.truth_telling_2nd_stage = True else: self.truth_telling_2nd_stage = False elif self.id_in_group == 3 and self.is_dropout == False and self.is_challenger2 == False: if self.planned_leftpiece_2 >= int((120 - self.left_piece)/2): self.truth_telling_2nd_stage = False else: self.truth_telling_2nd_stage = True elif self.id_in_group == 3 and self.is_dropout == False and self.is_challenger2 == True: if self.planned_leftpiece_2 >= int((120 - self.left_piece)/2): self.truth_telling_2nd_stage = True else: self.truth_telling_2nd_stage = False