from otree.api import * import random doc = """ Part 1b """ class C(BaseConstants): NAME_IN_URL = 'Part1b' PLAYERS_PER_GROUP = None NUM_ROUNDS = 2 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): threshold = models.IntegerField() threshold_check = models.BooleanField() threshold_previous = models.BooleanField() skip_remaining_rounds = models.BooleanField(initial=False) blength = models.IntegerField() noise = models.BooleanField() noise_mood = models.IntegerField(inital=0) noise_previous = models.IntegerField(initial=0) warning = models.IntegerField() warning_active = models.BooleanField() warning_message = models.BooleanField() number1 = models.IntegerField() number1_previous = models.IntegerField(initial=0) sum_claims = models.IntegerField() sum_previous = models.IntegerField() potential_payoff1 = models.IntegerField() payoff_value1= models.IntegerField() def box_range(player): if player.round_number == 1: player.blength = player.in_round(1).participant.vars.get('range', None) player.noise = player.in_round(1).participant.vars.get('noise', None) else: player.blength = player.in_previous_rounds()[0].blength player.noise = player.in_previous_rounds()[0].noise def production_sum(player): if player.round_number == 1: if player.threshold_check == False: player.sum_claims = player.number1 player.sum_previous = 0 player.potential_payoff1 = player.number1 player.payoff_value1= player.number1 else: player.sum_claims = 0 player.sum_previous = 0 player.potential_payoff1 = 0 player.payoff_value1= 0 else: if player.threshold_check == False: player.sum_claims = player.in_previous_rounds()[-1].sum_claims + player.number1 player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff1 = player.in_previous_rounds()[-1].sum_claims + player.number1 player.payoff_value1= player.in_previous_rounds()[-1].payoff_value1 + player.number1 else: player.sum_claims = player.in_previous_rounds()[-1].sum_claims player.sum_previous = player.in_previous_rounds()[-1].sum_claims player.potential_payoff1 = player.in_previous_rounds()[-1].sum_claims player.payoff_value1= player.in_previous_rounds()[-1].payoff_value1 return { 'sum_claim': player.sum_claims, 'sum_prev': player.sum_previous, 'payoff1': player.potential_payoff1, 'value1': player.payoff_value1 } def threshold_computation(player): if player.round_number == 1: player.threshold = random.randint(0,100) else: player.threshold = player.in_previous_rounds()[0].threshold return { 'threshold_value': player.threshold } def warning_computation(player): if player.number1 + player.blength <= 100: player.warning = player.number1 + player.blength else: player.warning = 100 return { 'ews_active': player.warning } def threshold_exceeded(player): if player.number1 > player.threshold: player.threshold_check = True player.skip_remaining_rounds = True else: player.threshold_check = False player.skip_remaining_rounds = False return { 'threshold_checker': player.threshold_check } def warning_issued(player): if player.noise == False: player.noise_mood=0 if player.number1+player.blength > player.threshold: player.warning_active = True else: player.warning_active = False else: player.noise_mood = random.randint(1,10) if player.noise_mood <= 8: if player.number1 + player.blength > player.threshold: player.warning_active = True else: player.warning_active = False else: if player.number1 + player.blength > player.threshold: player.warning_active = False else: player.warning_active = True return { 'active_warning': player.warning_active, 'noise_mood': player.noise_mood } def warning_messages(player): if player.round_number == 1: player.warning_message = False player.threshold_previous = False player.number1_previous= 0 player.noise_previous= 0 else: player.warning_message = player.in_previous_rounds()[-1].warning_active player.threshold_previous = player.in_previous_rounds()[-1].threshold_check player.number1_previous = player.in_previous_rounds()[-1].number1 player.noise_previous = player.in_previous_rounds()[-1].noise_mood return { 'message_warning': player.warning_message, 'previous_threshold': player.threshold_previous, 'previous_number': player.number1_previous, 'previous_noise': player.noise_previous } # PAGES class Start(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Decision(Page): form_model = "player" form_fields = ["number1"] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['chosen_number'] = player.number1 player.participant.vars['ews_active']= warning_computation(player) player.participant.vars['threshold_checker'] = threshold_exceeded(player) @staticmethod def vars_for_template(player): player.participant.vars['message_warning','previous_threshold','previous_number','previous_noise'] = warning_messages(player) player.participant.vars['blength','noise'] = box_range(player) player.participant.vars['threshold_value'] = threshold_computation(player) class Result(Page): @staticmethod def is_displayed(player): return player.threshold_check == False @staticmethod def vars_for_template(player): player.participant.vars['active_warning','noise_mood'] = warning_issued(player) player.participant.vars['sum_claim','sum_prev','payoff1','value1'] = production_sum(player) @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff1'] = player.potential_payoff1 player.participant.vars['payoff_value1'] = player.payoff_value1 player.participant.vars['number1.2'] = player.number1 player.participant.vars['number1.1'] = player.number1_previous class Result2(Page): @staticmethod def is_displayed(player): return player.threshold_check == True @staticmethod def vars_for_template(player): player.participant.vars['active_warning','noise_mood'] = warning_issued(player) player.participant.vars['sum_claim', 'sum_prev','payoff1','value1'] = production_sum(player) @staticmethod def app_after_this_page(player, upcoming_apps): return upcoming_apps[0] @staticmethod def before_next_page(player, timeout_happened): player.participant.vars['mypayoff1'] = player.potential_payoff1 player.participant.vars['payoff_value1'] = player.payoff_value1 player.participant.vars['number1.2'] = 0 player.participant.vars['number1.1'] = player.number1_previous page_sequence = [Start, Decision, Result, Result2]