from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'Game' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 1 STAGE2_DAMAGE = cu(50) class Subsession(BaseSubsession): pass class Group(BaseGroup): Distribution = models.CurrencyField(max=100, min=0) Attack = models.BooleanField(initial=False) Retaliation = models.CurrencyField(choices=[[0, '攻撃しない'], [25, '25'], [50, '50'], [75, '75']], max=100, min=0) AttackerPEG1 = models.IntegerField(initial=-1) DamagePEG1 = models.IntegerField(initial=50) AttackID = models.CurrencyField(initial=-1) RetaliationValue = models.CurrencyField(initial=-1) Player1ReadDG = models.BooleanField(initial=False) Player2Read_DG = models.BooleanField(initial=False) Player1Read_PEG1 = models.BooleanField(initial=False) Player2Read_PEG1 = models.BooleanField(initial=False) Player1Read_RepeatPEG1 = models.BooleanField(initial=False) Player2Read_RepeatPEG1 = models.BooleanField(initial=False) def live_get_state(group: Group, data): return dict(Attack=group.Attack, AttackerPEG1 = group.AttackerPEG1) class Player(BasePlayer): am_i_attacker = models.BooleanField(initial=False) def live_PEG1(player: Player, data): group = player.group my_id = player.id_in_group t = data['type'] if t == 'player1': group.Player1Read_DG = True response = dict(ready_player1 = group.Player1Read_DG , ready_player2 = group.Player2Read_DG) return {0: response} if t == 'player2': group.Player2Read_DG = True response = dict(ready_player1 = group.Player1Read_DG , ready_player2 = group.Player2Read_DG) return {0: response} if t == 'isattack': group.Attack = True group.AttackID = my_id response = dict(id_in_group=my_id, attack = 1, nowend = 1) return {0: response} def live_PEG2(player: Player, data): group = player.group my_id = player.id_in_group t = data['type'] if t == 'isattack': group.Attack = True group.AttackID = my_id response = dict(id_in_group=my_id, attack = 1, nowend = 1) return {0: response} if t == 'retaliationYes': group.Retaliation = True return {0: dict(revenge = 1,answered = 1)} if t == 'retaliationNo': return {0: dict(nowend = 1, revenge = group.Retaliation, damage = group.RetaliationValue,answered = 1)} if t == 'retaliationvalue': group.RetaliationValue = data['rvalue'] return {0: dict(nowend = 1, revenge = group.Retaliation, damage = group.RetaliationValue)} if t == 'player2Retaliation': return {0: dict(start = 1)} if t == 'player1': group.Player1Read_RepeatPEG1 = True response = dict(ready_player1 = group.Player1Read_RepeatPEG1 , ready_player2 = group.Player2Read_RepeatPEG1) return {0: response} if t == 'player2': group.Player2Read_RepeatPEG1 = True response = dict(ready_player1 = group.Player1Read_RepeatPEG1 , ready_player2 = group.Player2Read_RepeatPEG1) return {0: response} def live_DG(player: Player, data): group = player.group t = data['type'] if t == 'player1': group.Player1Read_PEG1 = True response = dict(ready_player1 = group.Player1Read_PEG1 , ready_player2 = group.Player2Read_PEG1) return {0: response} if t == 'player2': group.Player2Read_PEG1 = True response = dict(ready_player1 = group.Player1Read_PEG1 , ready_player2 = group.Player2Read_PEG1) return {0: response} if t == 'DGallocation': value = data['DGvalue'] if value <= 100: if value >= 0: group.Distribution = value return {0: dict(nowend = 1, DGvalue = value)} if value <0: return {0: dict(error = 1)} if value > 100: return {0: dict(error = 1)} class Introduction(Page): form_model = 'player' class DG(Page): form_model = 'player' live_method = 'live_DG' class WaitPage1(WaitPage): wait_for_all_groups = True class PEG1(Page): form_model = 'group' timeout_seconds = 15 live_method = 'live_PEG1' @staticmethod def js_vars(player: Player): group = player.group return dict(my_id=player.id_in_group) class WaitPage2(WaitPage): wait_for_all_groups = True class PEG2(Page): form_model = 'group' timeout_seconds = 60 live_method = 'live_PEG2' @staticmethod def js_vars(player: Player): group = player.group return dict(my_id=player.id_in_group) page_sequence = [Introduction, DG, WaitPage1, PEG1, WaitPage2, PEG2]