class AudienceShare: START_SHARE = 10 def __init__(self): self._share = type(self).START_SHARE self._share_diff_sum = 0 self._last_share_diff = 0 self._label = Label('', 0, 0, font_size=20) self._diff_label = Label('', 0, 0, font_size=20) self.update() get_game().register('on_draw', self.on_draw) def get_label_y(self): return self._label.y def _calc_share(self, question_difficulty: QuestionDifficulty): stage_coeff = (get_game().questions_stages.current_stage_index + 1) if stage_coeff <= 2: probable_change, possible_shift = { QuestionDifficulty.EASY: (1, 0.25), QuestionDifficulty.AVERAGE: (2, 1), QuestionDifficulty.HARD: (2, 2) }[question_difficulty] elif stage_coeff <= 5: probable_change, possible_shift = { QuestionDifficulty.EASY: (0.5, 0.5), QuestionDifficulty.AVERAGE: (1, 0.5), QuestionDifficulty.HARD: (2, 1) }[question_difficulty] else: probable_change, possible_shift = { QuestionDifficulty.EASY: (2, 2), QuestionDifficulty.AVERAGE: (2, 1), QuestionDifficulty.HARD: (2, 0) }[question_difficulty] self._last_share_diff = (random() * probable_change) - possible_shift if self._last_share_diff + self._share < 0: self._last_share_diff = -self._share self._update_diff_lbl(self._last_share_diff) self._share += self._last_share_diff self._share_diff_sum += self._last_share_diff if self._share > 100: self._share = 100 def _update_diff_lbl(self, diff): if diff == 0: self._diff_label.text = '' return if diff > 0: sign = '+' self._diff_label.color = arcade.color.GREEN else: sign = '-' self._diff_label.color = arcade.color.RED self._diff_label.text = '({}{})'.format(sign, AudienceShare._share_as_str(diff)) @staticmethod def _share_as_str(share): as_str = str(share) if as_str[1] == '.': return as_str[:4] + '%' return as_str[:5] + '%' def get_diff_sum(self): diff_sum = self._share_diff_sum self._share_diff_sum = 0 sign = '-' if diff_sum < 0 else '+' return sign + AudienceShare._share_as_str(diff_sum) def reset(self, diff_only=False): if diff_only: self._last_share_diff = 0 self._diff_label.text = '' return self.update() def update(self, question_answered: typing.Optional[QuestionData] = None): if question_answered is None: self._share = type(self).START_SHARE self._last_share_diff = 0 self._diff_label.text = '' self._share_diff_sum = 0 else: self._calc_share(question_answered.difficulty) self._label.text = 'Rating: {}'.format(AudienceShare._share_as_str(self._share)) self._label.x = 10 self._label.y = get_game().budget.ui.get_y() - self._label.get_size()[1] - 5 self._diff_label.x = self._label.x + self._label.get_size()[0] + 10 self._diff_label.y = self._label.y if self._last_share_diff != 0: get_game().budget.add_amount(int(self._last_share_diff * 75000)) def on_draw(self): w_sum = self._label.get_size()[0] if len(self._diff_label.text) > 0: w_sum += 10 + self._diff_label.get_size()[0] arcade.draw_xywh_rectangle_filled(self._label.x - 2, self._label.y - 2, w_sum + 4, self._label.get_size()[1] + 4, (0, 0, 0, 200)) self._label.on_draw() self._diff_label.on_draw()
class QuestionsPool(VisibilityToggle): def __init__(self, easy_questions, average_questions, hard_questions): super().__init__(is_visible=False) self._show_highlight = False self._highlighted_index = 0 self._selected_question = None self._choose_question_label = Label("Choose a question difficulty:", 0, 0) easy_question_label = Button('Easy', 0, 0, lambda: self._on_difficulty_clicked(0)) average_question_label = Button('Average', 0, 0, lambda: self._on_difficulty_clicked(1)) hard_question_label = Button('Hard', 0, 0, lambda: self._on_difficulty_clicked(2)) total_w = self._choose_question_label.get_size()[0] + 25 + easy_question_label.get_size()[0] + 25 + \ average_question_label.get_size()[0] + 25 + hard_question_label.get_size()[0] self._choose_question_label.x = SCREEN_WIDTH / 2 - total_w / 2 easy_question_label.x = self._choose_question_label.x + self._choose_question_label.get_size( )[0] + 25 average_question_label.x = easy_question_label.x + easy_question_label.get_size( )[0] + 25 hard_question_label.x = average_question_label.x + average_question_label.get_size( )[0] + 25 self._questions = [easy_questions, average_questions, hard_questions] self._buttons = [ easy_question_label, average_question_label, hard_question_label ] get_game().register('on_draw', self.on_draw) for btn in self._buttons: get_game().register_button_mouse_events(btn) def _on_difficulty_clicked(self, index): get_game().pause_gameplay() [ get_game().sound_controller.play_select_easy, get_game().sound_controller.play_select_average, get_game().sound_controller.play_select_hard ][index]() self._show_selected_answer(index) def show(self): super().show() get_game().disable_all_buttons() self._selected_question = None self._choose_question_label.y = get_game().on_screen_question_ui.get_question_box_y() - \ self._choose_question_label.get_size()[1] / 2 for btn in self._buttons: btn.y = self._choose_question_label.y btn.enable() def draw_if_visible(self): self._choose_question_label.on_draw() for btn in self._buttons: btn.on_draw() @property def selected_question(self): return self._selected_question @sleep_before(3) def _answer_question(self): question = get_game().on_screen_question get_game().current_contestant.answer(question) question.verify_answered_question() @sleep_before(0.1) def _show_selected_answer(self, index): self._selected_question = random.choice(self._questions[index]) self.hide() get_game().background_controller.show_host() get_game().questions_stages.hide() get_game().unpause_gameplay() add_timer(1, lambda: get_game().background_controller.show_question()) add_timer(2, lambda: get_game().background_controller.show_contestant()) self._answer_question()