from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Maggie Lehr' doc = """ network trust game w/ proportionality discretion from distributor """ class Constants(BaseConstants): name_in_url = 'multilateral_trust_pni2' players_per_group = 3 num_rounds = 12 endowment = c(100) multiplier = 3 correct_guess = c(20) instructions_template = 'multi_trust_simple/Instructions.html' class Subsession(BaseSubsession): dice = models.IntegerField() def creating_session(self): print('creating session') if self.round_number == 1: self.group_randomly(fixed_id_in_group=True) self.session.vars['matrix1'] = self.get_group_matrix() print('first group is', self.session.vars['matrix1']) if 1 < self.round_number: self.group_like_round(1) def is_playing(self): if self.session.vars['end_game'] == True: return False else: return True class Group(BaseGroup): total_sender_allocation = models.CurrencyField() kept_amount = models.CurrencyField(min=(-1 * Constants.endowment)) returned1_points = models.CurrencyField(min=0) returned2_points = models.CurrencyField(min=0) allocated_amount1 = models.CurrencyField() allocated_amount2 = models.CurrencyField() expected_1 = models.BooleanField() expected_2 = models.BooleanField() def set_payoffs(self): print('setting payoffs') sender1 = self.get_player_by_role('sender 1') sender2 = self.get_player_by_role('sender 2') distributor = self.get_player_by_role('distributor') allocated_amount1 = sender1.sender_allocation allocated_amount2 = sender2.sender_allocationn expectation_1 = sender1.sender_expectation expectation_2 = sender2.sender_expectation for player in [distributor, sender1, sender2]: if self.subsession.round_number == self.session.vars['paying_round2']: distributor.payoff = Constants.endowment + self.kept_amount remainder1 = Constants.endowment - allocated_amount1 remainder2 = Constants.endowment - allocated_amount2 sender1.payoff = remainder1 + self.returned1_points sender2.payoff = remainder2 + self.returned2_points if (allocated_amount1 - 10) < expectation_1 < ( allocated_amount1 + 10): sender1.payoff += Constants.correct_guess else: pass if (allocated_amount2 - 10) < expectation_2 < ( allocated_amount2 + 10): sender2.payoff += Constants.correct_guess else: pass class Player(BasePlayer): sender_allocation = models.CurrencyField(min=0, max=Constants.endowment) sender_expectation = models.IntegerField(min=0, max=900) def role(self): if self.id_in_group == 1: return 'distributor' if self.id_in_group == 2: return 'sender 1' if self.id_in_group == 3: return 'sender 2'