from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import time import logging from otreeutils.pages import ExtendedPage logger = logging.getLogger(__name__) class Instructions(ExtendedPage): timeout_seconds = 300 custom_name_in_url = 'c' def is_displayed(self): logger.info(f"Entered memory_matching. It should be round number 1. but it is round {self.player.round_number}") return self.round_number == 1 def before_next_page(self): if self.timeout_happened: self.player.timeout = 1 # participant is excluded from study if time runs out class GamePage(ExtendedPage): form_model = 'player' form_fields = ['star_rating'] custom_name_in_url = 'd' def is_displayed(self): logger.info(f"Is memory game displayed?") if 'expiry' not in self.participant.vars: # Need to clear these at the beginning of the app self.player.participant.vars['num_correct'] = 0 self.player.participant.vars['num_attempts'] = 0 self.player.participant.vars['correct_answer'] = 0 logger.info(f"Yes! just started the game.") # Set the game timer up too self.participant.vars['expiry'] = time.time() + Constants.total_time logger.info(f"Setting timer to : {self.participant.vars['expiry']}") if 'gameover' in self.participant.vars: logger.info(f"No! Time is up. no memory game") return False else: logger.info(f"yes!") return True def before_next_page(self): self.player.calc_payoff() self.player.participant.vars['completed_matrices'] = self.player.round_number - 1 self.player.participant.vars['payoff_memory'] = Constants.payoff_per_star * self.player.participant.vars[ 'num_correct'] if self.timeout_happened: self.participant.vars['gameover'] = True self.player.calc_final_payoff() logger.info(f"Timeout on round {self.round_number}") def get_timeout_seconds(self): return self.participant.vars['expiry'] - time.time() class Results(ExtendedPage): form_model = 'player' custom_name_in_url = 'e' timeout_seconds = 300 def is_displayed(self): return self.player.round_number == Constants.num_rounds def vars_for_template(self): self.player.participant.vars['payoff_memory_rounded'] = self.player.participant.vars['payoff_memory'] # def js_vars(self): return dict(final_payoff=self.player.participant.payoff_plus_participation_fee()) def before_next_page(self): if self.timeout_happened: self.player.timeout = 1 # participant is excluded from study if time runs out class TimeOutNew(ExtendedPage): # shown if timeout custom_name_in_url = 'time_out' def is_displayed(self): return self.player.timeout == 1 page_sequence = [ Instructions, TimeOutNew, GamePage, Results, TimeOutNew]