from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'Experimental' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 PEG2SCALAR = 0.4 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): Distribution = models.CurrencyField(max=100, min=0) Attack = models.BooleanField(initial=False) RetaliationValue = models.CurrencyField(max=100, min=0) Retaliation = models.BooleanField(initial=False) def live_DG(player: Player, data): group = player.group t = data['type'] if t == 'player': response = dict(ready_player = 1) return {player.id_in_group: response} if t == 'DGallocation': value = data['DGvalue'] if value <= 100: if value >= 0: player.Distribution = value player.payoff = value return {player.id_in_group: dict(nowend = 1, DGvalue = value, payoff = player.payoff)} if value <0: return {player.id_in_group: dict(error = 1)} if value > 100: return {player.id_in_group: dict(error = 1)} def live_PEG1(player: Player, data): group = player.group t = data['type'] if t == 'player': response = dict(ready_player = 1) return {player.id_in_group: response} if t == 'isattack': player.Attack = True player.payoff = player.payoff + 90 response = dict(attack = 1, nowend = 1, payoff = player.payoff) return {player.id_in_group: response} if t == 'noattack': player.Attack = False player.payoff = player.payoff + 90 response = dict(attack = 0, nowend = 1, payoff = player.payoff) return {player.id_in_group: response} def live_PEG2(player: Player, data): group = player.group t = data['type'] if t == 'retaliationYes': player.Retaliation = True return {player.id_in_group: dict(revenge = 1,answered = 1)} if t == 'retaliationNo': player.Retaliation = False player.payoff = player.payoff + 100 return {player.id_in_group: dict(nowend = 1, revenge = player.Retaliation, answered = 1, payoff = player.payoff)} if t == 'retaliationvalue': player.RetaliationValue = data['rvalue'] player.payoff = player.payoff + 100 - player.RetaliationValue * C.PEG2SCALAR return {player.id_in_group: dict(nowend = 1, revenge = player.Retaliation, damage = player.RetaliationValue, payoff = player.payoff)} if t == 'playerRetaliation': return {player.id_in_group: dict(start = 1)} class Introduction(Page): form_model = 'player' class DG(Page): form_model = 'player' live_method = 'live_DG' class PEG1Instruction(Page): form_model = 'player' live_method = 'live_PEG1' class PEG1(Page): form_model = 'player' timeout_seconds = 15 live_method = 'live_PEG1' @staticmethod def js_vars(player: Player): return dict(payoff = player.payoff) class PEG1Payoff(Page): form_model = 'player' @staticmethod def js_vars(player: Player): return dict(payoff = player.payoff, attack = player.Attack) class PEG2(Page): form_model = 'player' live_method = 'live_PEG2' @staticmethod def js_vars(player: Player): return dict(my_distribution = player.Distribution,payoffsclar = C.PEG2SCALAR) class Result(Page): form_model = 'player' @staticmethod def vars_for_template(player: Player): return dict(playoffPEG2 = player.payoff - 90 - player.Distribution, payoffDG = player.Distribution, payoffPEG1 = 90, reward = player.payoff + 700 ) page_sequence = [Introduction, DG, PEG1Instruction, PEG1, PEG1Payoff, PEG2, Result]