from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants from decimal import Decimal import random import json class Instruction(Page): def is_displayed(self): return self.subsession.round_number == 1 and self.subsession.gamemode == 2 live_method = "live_instruct" def vars_for_template(self): players = self.subsession.get_players() num_pairs = self.subsession.num_S tabledraw=random.random() return {'read' : self.player.read, 'num_rounds': Constants.num_rounds, 'num_prac_rounds': Constants.num_prac_rounds, 'num_off_rounds': Constants.num_rounds-Constants.num_prac_rounds, 'num_S': self.subsession.num_S, 'gamemode': self.subsession.gamemode, 'num_pairs': num_pairs, 'expertise': self.subsession.expertise, 'correct_shell_red': round(self.subsession.expertise*10), 'wrong_shell_red': round((1-self.subsession.expertise)*10), 'correct_shell_blue': round(self.subsession.expertise*20), 'wrong_shell_blue': round((1-self.subsession.expertise)*20), 'correct_prob': round(self.subsession.expertise*100), 'participation_fee' : int(self.session.participation_fee), 'tabledraw' : tabledraw } class InstructionSingle(Page): form_model = 'player' form_fields = ['q1a','q1b','q1c', 'q2a','q2b','q2c', 'q5', 'q6', 'q7', 'q8'] def is_displayed(self): return self.subsession.round_number == 1 and self.subsession.gamemode != 2 def error_message(self, value): return self.player.set_error_message(value) live_method = "live_instruct" def vars_for_template(self): players = self.subsession.get_players() num_pairs = self.subsession.num_S payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.subsession.gamemode == 2: correct_answers = {"q1a": 2, "q1b": 2, "q1c": 1, "q2a": 2, "q2b": 1, "q2c": 2, "q3": 1, "q4": 2, "q5": 1, "q6": 2, "q7": 2, "q8": 2 } else: correct_answers = {"q1a": 2, "q1b": 2, "q1c": 1, "q2a": 2, "q2b": 1, "q2c": 2, "q5": 1, "q6": 2, "q7": 2, "q8": 2 } return {'read' : self.player.read, 'solutions': correct_answers, 'num_rounds':Constants.num_rounds, 'num_prac_rounds':Constants.num_prac_rounds, 'num_off_rounds': Constants.num_rounds - Constants.num_prac_rounds, 'num_S': self.subsession.num_S, 'gamemode': self.subsession.gamemode, 'num_pairs': num_pairs, 'expertise': self.subsession.expertise, 'correct_shell_red': round(self.subsession.expertise*10), 'wrong_shell_red': round((1-self.subsession.expertise)*10), 'correct_shell_blue': round(self.subsession.expertise*20), 'wrong_shell_blue': round((1-self.subsession.expertise)*20), 'correct_prob': round(self.subsession.expertise*100), 'payoffs' : payoffs, 'participation_fee' : int(self.session.participation_fee) } class PracticeWaitPage(WaitPage): def is_displayed(self): return self.subsession.round_number == 1 class RoundUsher(Page): def vars_for_template(self): players = self.subsession.get_players() if self.subsession.round_number self.player.recom_0: self.player.message_sent = 0 else: self.player.message_sent = 1 else: self.player.message_sent = 1 self.player.finalDeg0 = self.player.recom_0 * 360 / 100 self.player.finalDeg1 = self.player.recom_1 * 360 / 100 spindeg = spindraw*360/100 if self.subsession.framework == 1: self.player.check_slider_one = None self.player.recom_0 = 0 spindraw = random.randint(1, 100) if self.player.shell == 1: if spindraw > self.player.recom_1: self.player.message_sent = 0 else: self.player.message_sent = 1 else: self.player.message_sent = 0 self.player.finalDeg0 = self.player.recom_1 * 360 / 100 self.player.finalDeg1 = 360 spindeg = spindraw * 360 / 100 if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.shell == 0: shell="BLUE" elif self.player.shell == 1: shell="RED" return dict( roundnum=self.subsession.round_number - Constants.num_prac_rounds, type=self.player.type, shell=shell, payoffs=payoffs, title_text=title, spindraw=spindraw, spindeg=spindeg, recom_0=self.player.recom_0, recomm_0=100-self.player.recom_0, recom_1=self.player.recom_1, recomm_1=100-self.player.recom_1, finalDeg0=self.player.finalDeg0, finalDeg1=self.player.finalDeg1, message_sent=self.player.message_sent ) class WaitS1(WaitPage): template_name = 'lying_deception_psychological_game/WaitS1.html' def is_displayed(self): if self.subsession.robotR == 0: return self.player.roles=='R' or self.player.roles=='R_vs_bot' else: return False def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} return dict(body_text="Please wait for the message from S.", title_text=title, roundnum = self.subsession.round_number -Constants.num_prac_rounds, payoffs=payoffs ) import random class ReceiverPage1(Page): form_model = 'player' form_fields = ['conjecture','check_slider_three'] def is_displayed(self): if self.subsession.robotR == 0: return self.player.roles == 'R' or self.player.roles == 'R_vs_bot' else: return False def error_message(self, value): if value["check_slider_three"] == None: return 'Please use the slider to make a decision.' def vars_for_template(self): players = self.subsession.get_players() if self.player.roles =='R': for player in players: if player.id_in_group != self.player.id_in_group and player.pseudo_group == self.player.pseudo_group: self.player.message_received = player.message_sent self.player.message_sent = player.message_sent self.player.finalDeg0 = player.finalDeg0 self.player.finalDeg1 = player.finalDeg1 self.player.recom_0 = player.recom_0 self.player.recom_1 = player.recom_1 player.message_received = player.message_sent if self.player.roles =='R_vs_bot': if self.subsession.framework == 0: self.player.message_received = self.player.shell self.player.message_sent = self.player.shell self.player.finalDeg0 = 0 self.player.finalDeg1 = 0 self.player.recom_0 = 0 self.player.recom_1 = 0 if self.subsession.framework == 1: self.player.message_received = 1 self.player.message_sent = 1 self.player.finalDeg0 = 360 self.player.finalDeg1 = 0 self.player.recom_0 = 100 self.player.recom_1 = 100 if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.message_received == 0: message = "The color of the core of chosen ball is BLUE." if self.player.message_received == 1: message = "The color of the core of chosen ball is RED." return dict( message=message, body_text="Please wait for the message from Sender.", title_text=title, roundnum=self.subsession.round_number - Constants.num_prac_rounds, payoffs=payoffs, shell=self.player.shell, finalDeg0=self.player.finalDeg0, finalDeg1=self.player.finalDeg1, recom_0=self.player.recom_0, recomm_0=100-self.player.recom_0, recom_1=self.player.recom_1, recomm_1=100 - self.player.recom_1 ) def before_next_page(self): if self.subsession.framework == 0: self.player.payoff1 = (1-(self.player.type-self.player.conjecture/100)**2) players = self.subsession.get_players() if self.player.roles =='R': for player in players: if player.id_in_group != self.player.id_in_group and player.pseudo_group == self.player.pseudo_group: player.conjecture = self.player.conjecture player.payoff1 = (1-(1-self.player.conjecture/100)**2) return elif self.subsession.framework == 1: self.player.payoff1 = (1-(self.player.type-self.player.conjecture/100)**2) players = self.subsession.get_players() if self.player.roles =='R': for player in players: if player.id_in_group != self.player.id_in_group and player.pseudo_group == self.player.pseudo_group: player.conjecture = self.player.conjecture player.payoff1 = (1-(self.player.type-self.player.conjecture/100)**2) return class WaitR1(WaitPage): template_name = 'lying_deception_psychological_game/WaitR1.html' def is_displayed(self): if self.subsession.robotR == 0: return self.player.roles=='S' else: return False def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs=dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.message_sent == 0: message = "Color of the shell is BLUE." if self.player.message_sent == 1: message = "Color of the shell is RED." return dict( message =message, body_text="Please wait for the message from Sender.", title_text=title, roundnum = self.subsession.round_number -Constants.num_prac_rounds, payoffs=payoffs ) class ResultsWaitPage1(WaitPage): pass class Results1(Page): def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.message_received == 0: message = "Color of the shell is BLUE." if self.player.message_received == 1: message = "Color of the shell is RED." if self.player.type == 1: type="RED" elif self.player.type == 0: type="BLUE" return dict( message=message, conjecture=self.player.conjecture, type=type, title_text=title, roundnum=self.subsession.round_number - Constants.num_prac_rounds, payoffs=payoffs, payoff1=self.player.payoff1 ) class Receiver_Belief(Page): form_model = 'player' form_fields = ['type_conjecture','check_slider_four'] def is_displayed(self): if self.subsession.robotR == 0: return self.player.roles == 'R' or self.player.roles == 'R_vs_bot' else: return False def error_message(self, value): if value["check_slider_four"] == None: return 'Please use the slider to make a decision.' def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.message_received == 0: message = "The color of the core of chosen ball is BLUE." if self.player.message_received == 1: message = "The color of the core of chosen ball is RED." return dict( message=message, body_text="Please wait for the message from Sender.", title_text=title, roundnum=self.subsession.round_number - Constants.num_prac_rounds, payoffs=payoffs, shell=self.player.shell, finalDeg0=self.player.finalDeg0, finalDeg1=self.player.finalDeg1, recom_0=self.player.recom_0, recomm_0=100-self.player.recom_0, recom_1=self.player.recom_1, recomm_1=100 - self.player.recom_1 ) def before_next_page(self): if self.subsession.framework == 0: players = self.subsession.get_players() if self.player.roles =='R': self.player.payoff2 = (1 - (1 - self.player.type_conjecture / 100) ** 2) for player in players: if player.id_in_group != self.player.id_in_group and player.pseudo_group == self.player.pseudo_group: player.type_conjecture = self.player.type_conjecture player.payoff2 = 1 - self.player.type_conjecture/100 self.player.second_conjecture1 = player.second_conjecture1 self.player.second_conjecture0 = player.second_conjecture0 if self.player.type == 0: if player.message_sent == 1: player.payoff4 = (1 - (player.second_conjecture1 / 100 - player.type_conjecture / 100) ** 2) self.player.payoff4 = player.payoff4 elif player.message_sent == 0: player.payoff4 = (1 - (player.second_conjecture0 / 100 - player.type_conjecture / 100) ** 2) self.player.payoff4 = player.payoff4 else: player.payoff4 = 0 self.player.payoff4 = player.payoff4 elif self.player.roles =='R_vs_bot': self.player.payoff2 = (1 - (0 - self.player.type_conjecture / 100) ** 2) return elif self.subsession.framework == 1: players = self.subsession.get_players() if self.player.roles =='R': self.player.payoff2 = (1 - (1 - self.player.type_conjecture / 100) ** 2) for player in players: if player.id_in_group != self.player.id_in_group and player.pseudo_group == self.player.pseudo_group: player.type_conjecture = self.player.type_conjecture player.payoff2 = self.player.type_conjecture/100 self.player.second_conjecture1 = player.second_conjecture1 self.player.second_conjecture0 = player.second_conjecture0 if self.player.type == 1: if player.message_sent == 1: player.payoff4 = (1 - (player.second_conjecture1 / 100 - player.type_conjecture / 100) ** 2) self.player.payoff4 = player.payoff4 elif player.message_sent == 0: player.payoff4 = (1 - (player.second_conjecture0 / 100 - player.type_conjecture / 100) ** 2) self.player.payoff4 = player.payoff4 else: player.payoff4 = 0 self.player.payoff4 = player.payoff4 elif self.player.roles =='R_vs_bot': self.player.payoff2 = (1 - (0 - self.player.type_conjecture / 100) ** 2) return class Sender_Belief(Page): form_model = 'player' form_fields = ['second_conjecture','check_slider_four'] def is_displayed(self): if self.subsession.robotR == 0: return self.player.roles == 'S' else: return False def error_message(self, value): if value["check_slider_four"] == None: return 'Please use the slider to make a decision.' def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs = dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.message_received == 0: message = "The color of the core of chosen ball is BLUE." if self.player.message_received == 1: message = "The color of the core of chosen ball is RED." return dict( message=message, body_text="Please wait for the message from Sender.", title_text=title, roundnum=self.subsession.round_number - Constants.num_prac_rounds, payoffs=payoffs, shell=self.player.shell, finalDeg0=self.player.finalDeg0, finalDeg1=self.player.finalDeg1 ) class WaitR2(WaitPage): template_name = 'lying_deception_psychological_game/WaitR2.html' def is_displayed(self): if self.subsession.robotR == 0: return self.player.roles=='S' else: return False def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) payoffs=dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} if self.player.message_sent == 0: message = "Color of the shell is BLUE." if self.player.message_sent == 1: message = "Color of the shell is RED." return dict( message =message, body_text="Please wait for the message from Sender.", title_text=title, roundnum = self.subsession.round_number -Constants.num_prac_rounds, payoffs=payoffs ) class OffroundWaitPage(WaitPage): def is_displayed(self): return self.subsession.round_number == Constants.num_prac_rounds class Offround_start(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_prac_rounds def vars_for_template(self): if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) return dict( title_text = title, ) class ResultsWaitPage2(WaitPage): def is_displayed(self): return self.subsession.gamemode==2 class Info_feedback(Page): def cal_round_payoff(self): if self.player.roles != 'S' and self.subsession.framework == 0: self.player.roundpay = Constants.B1_incentive * self.player.payoff1 + Constants.B2_incentive * self.player.payoff2 self.player.roundpay2 = self.player.roundpay elif self.player.roles != 'S' and self.subsession.framework == 1: self.player.roundpay = Constants.G1_incentive * self.player.payoff1 + Constants.G2_incentive * self.player.payoff2 self.player.roundpay2 = self.player.roundpay elif self.player.roles == 'S' and self.subsession.framework == 0: self.player.roundpay = Constants.B1_incentive * self.player.payoff1 + Constants.B2_incentive * self.player.payoff2 self.player.roundpay2 = self.player.roundpay + Constants.B3_incentive * self.player.payoff4 elif self.player.roles == 'S' and self.subsession.framework == 1: self.player.roundpay = Constants.G1_incentive * self.player.payoff1 + Constants.G2_incentive * self.player.payoff2 self.player.roundpay2 = self.player.roundpay + Constants.G3_incentive * self.player.payoff4 return self.player.roundpay, self.player.roundpay2 def vars_for_template(self): roundpay, roundpay2 = self.cal_round_payoff() if self.subsession.framework == 0: incentive1=Constants.B1_incentive incentive2=Constants.B2_incentive incentive3=Constants.B3_incentive elif self.subsession.framework == 1: incentive1=Constants.G1_incentive incentive2=Constants.G2_incentive incentive3=Constants.G3_incentive if self.subsession.round_number < Constants.num_prac_rounds+1: title = "Practice Round " + str(self.subsession.round_number) else: title = "Official Round " + str(self.subsession.round_number - Constants.num_prac_rounds) if self.player.roles == 'R': sender_type = 1 elif self.player.roles == 'R_vs_bot': sender_type = 0 elif self.player.roles == 'S': sender_type = -1 return dict(title_text=title, shell=self.player.shell, type=self.player.type, message=self.player.message_sent, conjecture=self.player.conjecture, conjecture_normalized=self.player.conjecture/100, type_conjecture=self.player.type_conjecture, type_conjecture_normalized=self.player.type_conjecture/100, payoff1=self.player.payoff1, payoff2=self.player.payoff2, payoff4=self.player.payoff4, roundpay=roundpay, roundpay2=roundpay2, recom_0=self.player.recom_0, recomm_0=100-self.player.recom_0, recom_1=self.player.recom_1, recomm_1=100-self.player.recom_1, incentive1=incentive1, incentive2=incentive2, incentive3=incentive3, sender_type=sender_type ) class Beforedictator_ResultsWaitPage(WaitPage): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds class Dictator_Instruction(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds class Dictator_Game(Page): form_model = 'player' form_fields = ['kept'] def is_displayed(self): return self.subsession.round_number == Constants.num_rounds class Dictator_ResultsWaitPage(WaitPage): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds class Dictator_Results(Page): def is_displayed(self): return self.subsession.round_number == Constants.num_rounds def vars_for_template(self): draw=random.random() if draw<=1/2: self.player.payoff3=self.player.kept role="Participant 1" reason="귀하가 결정한 몫에 따라," else: players=self.subsession.get_players() if self.player.id_in_group==self.session.num_participants: dictator=players[0] else: dictator=players[self.player.id_in_group] #i.e. selecting next next player as one's dictator self.player.payoff3=Constants.dictator_pay-dictator.kept role="Participant 2" reason="상대방이 결정한 몫에 따라," return dict(payoff3=self.player.payoff3, role=role, kept=self.player.kept, reason=reason) class Final_payment(Page): def cal_final_payoff(self,local_seed): local_random = random.Random(local_seed+self.player.id_in_group) chosen_round = local_random.randint(Constants.num_prac_rounds+1, Constants.num_rounds) player = self.player.in_round(chosen_round) self.participant.payoff = player.roundpay2 return self.participant.payoff, chosen_round def is_displayed(self): return self.subsession.round_number == Constants.num_rounds def vars_for_template(self): final_payment, chosen_round = self.cal_final_payoff(self.subsession.local_seed) Shell_dict = {} Type_dict = {} Message_dict = {} Conjecture_dict = {} Earning_dict = {} for m in range(Constants.num_prac_rounds+1,Constants.num_rounds+1): player = self.player.in_round(m) Shell_dict[m-Constants.num_prac_rounds] = player.shell Type_dict[m-Constants.num_prac_rounds] = player.type Message_dict[m - Constants.num_prac_rounds] = player.message_sent Conjecture_dict[m-Constants.num_prac_rounds] = player.conjecture Earning_dict[m-Constants.num_prac_rounds] = int(player.roundpay2) payoffs=dict() for conjecture in range(0, 2): payoffs[conjecture] = {'R0': 1 - conjecture, 'R1': conjecture, 'S0': conjecture, 'S1': conjecture} #chosen_pair = random.randint(1, self.session.num_participants) #player1 = self.group.get_player_by_id(chosen_pair) #if chosen_pair+1>self.session.num_participants: # player2 = self.group.get_player_by_id(1) #else: # player2 = self.group.get_player_by_id(chosen_pair+1) if self.player.id_in_group == 1 or self.player.id_in_group == 2: self.participant.payoff=final_payment+self.player.payoff3 payoff3=self.player.payoff3+Constants.add_participation else: payoff3=Constants.add_participation self.participant.payoff=self.participant.payoff+Constants.add_participation return dict(money=final_payment, chosen_round=chosen_round - Constants.num_prac_rounds, total_payment=self.participant.payoff_plus_participation_fee(), tot_match_num=Constants.num_rounds - Constants.num_prac_rounds, Type_dict=Type_dict, Conjecture_dict=Conjecture_dict, Earning_dict=Earning_dict, payoffs=payoffs, expertise=self.subsession.expertise, num_S=self.subsession.num_S, payoff3=payoff3 ) page_sequence = [Instruction, PracticeWaitPage, RoundUsher, SenderPage1PAN, SenderPage1PC, SenderSecondBelief_PAN, SenderSecondBelief_PC, SenderPage11, WaitS1, ReceiverPage1, WaitR1, ResultsWaitPage1, Results1, Receiver_Belief, WaitR2, ResultsWaitPage2, Info_feedback, OffroundWaitPage, Offround_start, Beforedictator_ResultsWaitPage, Dictator_Instruction, Dictator_Game, Dictator_ResultsWaitPage, Dictator_Results, Final_payment]