apps: - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 1 name: NUM_ROUNDS custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: consent_given methods: [] Subsession: fields: [] methods: - code: "for player in subsession.get_players():\n if player.id_in_subsession % 2 == 1:\n player.participant.vars['group'] = 'Group 1'\n else:\n \ player.participant.vars['group'] = 'Group 2'" name: creating_session name: intro pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - consent_given form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: null is_waitpage: false js_vars: null live_method: null name: MyPage template: content: "\n\n
\n \
Informed Consent
\n
Please read the following information carefully before proceeding.
\n\n
\n
Purpose of the Study
\n

\n You are invited to participate in a research study conducted at the\n University of Vienna, Department of Economics.\n This experiment investigates decision-making behavior in interactive tasks.\n The study is part of a Master's thesis supervised by Prof. Karl Schlag.\n Data collection serves exclusively for scientific research within the framework\n \ of this thesis [GDPR Art. 89(1)].\n

\n
\n\n \
\n
What You Will Do
\n

\n The experiment consists of two tasks, followed by a brief questionnaire.\n The entire session takes approximately 10–15 minutes.\n Detailed instructions will be provided at the beginning of each part.\n

\n \
\n\n
\n
Compensation
\n \

\n Each task is linked to a personal lottery for a prize of €5.\n Your chance of winning depends on your own performance — the more points you earn, \n the higher your chance. You can earn up to €10 in total across both tasks.\n Details will be explained before each task.\n

\n \
\n\n
\n
Voluntary Participation & Withdrawal
\n

\n Participation in this study is entirely voluntary and based on your consent\n [GDPR Art. 6(1)(a)]. Minors do not participate in this study.\n

\n

\n \ You may withdraw your consent at any time without providing a reason and\n without any negative consequences [GDPR Art. 7(3)]. To withdraw during the\n experiment, simply close the browser window. If you withdraw, your data will not be used.\n

\n
\n\n \
\n
Data Collection & Privacy
\n

\n We collect your choices, response times, and questionnaire answers.\n Only data necessary for the research is processed [GDPR Art. 5(1)(b)].\n

\n
\n Data protection provisions:\n \
    \n
  • \n Data is stored in pseudonymised form (sequential ID numbers) and will not be\n shared with third parties [GDPR Art. 89(1)].\n
  • \n
  • \n Demographic data constitutes personal data, but tracing it back to an individual\n is neither intended nor technically feasible [GDPR Art. 4(5)].\n
  • \n \
  • \n You have the right to request deletion of and access to your personal data after\n \ the evaluation, provided you have supplied such data [GDPR Art. 5(1)(e)].\n
  • \n
\n
\n \
\n\n
\n
Prize Draw & Email
\n

\n At the end of the experiment, you may voluntarily provide your email address to\n be contacted if you win a prize (up to €10 across two personal lotteries of €5 each). \n \ Your email is collected separately from your research data and cannot be linked to \n your responses [GDPR Art. 5(1)(b)]. A separate consent form for this will appear \n on the final page. The email data will be used solely to notify winners and will be \n deleted immediately after the prizes are distributed.\n

\n
\n\n \
\n
Risks
\n \

\n This study poses no known risks beyond those of everyday computer use.\n Some parts of the experiment involve visual content displayed on screen.\n If you experience any discomfort, you may stop immediately.\n

\n
\n\n
\n \
Contact Information
\n
\n Researcher: Xiaopeng Dong — a12406641@unet.univie.ac.at
\n Supervisor: Prof. Karl Schlag — karl.schlag@univie.ac.at\n
\n
\n\n \
\n
Important Reminders
\n \n
\n\n \
\n \n \n
\n\n
\n Please check the box above to confirm your consent before continuing.\n
\n\n \n
\n\n\n
\n {{ formfield_errors 'consent_given' }}\n
\n\n" javascript: null title: Introduction timeout_seconds: null timer_text: null vars_for_template: null - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 30 name: NUM_ROUNDS - datatype: float js_value: 0 name: MY_CONSTANT - datatype: float js_value: 20 name: LEFT_ARM_PRIZE - datatype: float js_value: 50 name: RIGHT_ARM_PRIZE custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: choice - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_winner - datatype: CurrencyField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: payoff_this_round - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_optimal - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: attention_passed - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: bandit_earnings - datatype: CurrencyField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: cum_payoff - datatype: FloatField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: decision_rt - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 1. I understood the rules of this task. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: q1_rules - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 2. I understood how points in this task translated into lottery tickets. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: q2_tickets - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 3. I found this task engaging. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: q4_engaging - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 4. I was able to stay focused during this task. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: q6_focused - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 5. This task felt repetitive. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: q7_repetitive - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 6. I actively tried to identify which option performed best. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: q9_identify_best - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - no lottery tickets - no lottery tickets - - 1 lottery ticket - 1 lottery ticket - - 5 lottery tickets - 5 lottery tickets - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '1. In this study, each point earned gives you:' widget: constant: null expr_type: plain js_value: RadioSelect name: cq1 - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - fixed - fixed - - changing every round - changing every round - - chosen by the participant - chosen by the participant - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '2. Within a task, the probabilities associated with the options are:' widget: constant: null expr_type: plain js_value: RadioSelect name: cq2 - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - a higher chance of winning the prize draw - a higher chance of winning the prize draw - - a lower chance of winning the prize draw - a lower chance of winning the prize draw - - no difference in the chance of winning - no difference in the chance of winning - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '3. Earning more lottery tickets means:' widget: constant: null expr_type: plain js_value: RadioSelect name: cq3 - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: cq_fails - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p1_belief_alpha - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p1_belief_beta - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p1_belief_gamma methods: [] Subsession: fields: [] methods: [] name: experiment_t1_e1 pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - cq_fails form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' and player.round_number == 1 is_waitpage: false js_vars: null live_method: null name: Introduction template: content: "\n\n\n
\n \ \n \

Quick Rule Reminder

\n

One or more answers were incorrect. The highlighted questions need to be corrected. Remember:

\n \ \n
\n\n\n
\n

Task Instructions

\n

Welcome! You will participate in a task that lasts for 30 rounds.

\n \n

How It Works

\n

In each round, you will choose one of three options: A, B, or C.

\n

Each option works like a slot machine with two possible outcomes:

\n \n

Each option has its own fixed probability and its own fixed payoff. These values stay the same throughout all 30 rounds, but they are hidden from you. Your job is to figure out which option is best by trying them out.

\n\n
\n Example (for illustration only — not the actual values):\n

Suppose one of the options had these hidden values:

\n \n \n \n \n \ \n \n \n \ \n \n
Win ProbabilityPayoff When You Win
60%15 points
\n \

\n \ This means each time you choose this option, you have a 60% chance of winning 15 points and a 40% chance of winning nothing (0 points). \n Each of the three options in your task works this way, but with its own hidden probability and payoff.\n

\n
\n\n
\n \ €5 Personal Lottery

\n Every point you save in this task becomes a lottery ticket. \n At the end of the task, the computer will draw a random number between 1 and 5,000.

\n If the random number is equal to or less than your total number of tickets, you win €5. \n If the random number is higher, you win nothing.

\n The more points you save, the more tickets you collect — and the better your chance of winning.

\n \ This is your individual lottery — your result depends only on your own performance, not on other participants.\n
\n\n
\n \n \
\n
\n\n\n
\n\n \
Comprehension Check
\n \n
\n \ To ensure you understand the rules of the task, please answer the following questions. \n If any answer is incorrect, you will need to correct it before continuing.\n
\n\n
\n \ \n \
\n \n \ \n
\n
\n \n \n
\n
\n \n \n \
\n
\n \n \n
\n \
\n\n
\n \n \
\n \n \ \n
\n
\n \n \n
\n
\n \ \n \n
\n
\n \n \n
\n
\n\n
\n \n
\n \n \n \
\n
\n \n \n
\n
\n \n \ \n
\n
\n \ \n \n
\n
\n\n \n\n \n
\n\n\n" javascript: null title: Introduction timeout_seconds: null timer_text: null vars_for_template: null - app_after_this_page: null before_next_page: " import random \n if player.choice is not None:\n p_left, prize_left = 0.8, 10\n p_mid, prize_mid = 0.5, 16\n p_right, prize_right = 0.4, 20\n\n #choice and prize\n if player.choice == 'left':\n \ prob = p_left\n actual_prize = prize_left\n elif player.choice == 'mid':\n prob = p_mid\n actual_prize = prize_mid\n else: # 'right'\n prob = p_right\n actual_prize = prize_right\n\n # cal opt choice\n ev_left = p_left * prize_left\n \ ev_mid = p_mid * prize_mid\n ev_right = p_right * prize_right\n \ \n max_ev = max(ev_left, ev_mid, ev_right)\n \n if player.choice == 'left' and ev_left == max_ev:\n player.is_optimal = True\n elif player.choice == 'mid' and ev_mid == max_ev:\n player.is_optimal = True\n elif player.choice == 'right' and ev_right == max_ev:\n player.is_optimal = True\n else:\n player.is_optimal = False\n\n # bandit\n \ if random.random() < prob:\n player.is_winner = True\n player.payoff = actual_prize\n player.bandit_earnings = actual_prize\n else:\n \ player.is_winner = False\n player.payoff = 0\n player.bandit_earnings = 0\n\n # payoff\n if player.round_number == 1:\n player.cum_payoff = player.payoff\n else:\n prev_cum = player.in_round(player.round_number - 1).cum_payoff\n player.cum_payoff = (prev_cum if prev_cum else 0) + player.payoff\n \n if player.round_number == 30:\n player.participant.vars['task1_total_bank'] = int(player.cum_payoff)" error_message: null form_fields: - choice - decision_rt form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: ' return player.participant.vars.get(''group'') == ''Group 1''' is_waitpage: false js_vars: null live_method: null name: Decision template: content: "\n\n
\n \

Round {{ player.round_number }} of 30

\n\n {{ if last_earned != None }}\n
\n \ Previous round payoff: {{ last_earned }} points\n
\n \ {{ endif }}\n\n

Please choose one option.

\n\n \n \n \n\n \n
\n\n \n\n
\n {{ formfield_errors 'decision_rt' }} \n
\n\n\n\n" javascript: null title: Decision Task timeout_seconds: null timer_text: null vars_for_template: "last_earned = None\nif player.round_number > 1:\n prev_player = player.in_round(player.round_number - 1)\n if prev_player.bandit_earnings is not None:\n last_earned = prev_player.bandit_earnings\n\nreturn {\n \ 'last_earned': last_earned\n}" - app_after_this_page: null before_next_page: null error_message: null form_fields: [] form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Results template: content: "\n
\n
Task Completed
\n \n

You have finished all 30 rounds of this task.

\n \ \n \n \n \n \ \n
Total points earned:{{ total_earned }} Points
\n
\n Your points have been recorded as lottery tickets for the €5 prize draw.

\n \ Next, you will be asked to complete a short questionnaire before continuing with the experiment.\n
\n
\n \n
\n
" javascript: null title: Summary timeout_seconds: null timer_text: null vars_for_template: "all_players = player.in_all_rounds()\n\ntotal_wins = sum([1 for p in all_players if p.is_winner == True])\n\ntotal_earned = int(player.cum_payoff)\n\nreturn {\n 'total_wins': total_wins,\n 'total_earned': total_earned,\n}" - app_after_this_page: null before_next_page: null error_message: null form_fields: - q1_rules - q2_tickets - q4_engaging - q6_focused - q7_repetitive - q9_identify_best - p1_belief_alpha - p1_belief_beta - p1_belief_gamma form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Questionnaire template: content: "\n\n
\n \
Task Evaluation
\n
\n \ Please indicate your level of agreement with the following statements.
\n \ ( 1 = Strongly Disagree   |   7 = Strongly Agree )\n
\n\n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \n \n \n \ \n \n \n \n \n \n \n \n \ \n \n \n \ \n \n \n \n \ \n \n \n \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \ \n \n \n \n \ \n \n \n \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \ \n \n \n \n \ \n \n \n
Statements1
Strongly
Disagree
234567
Strongly
Agree
1. I understood the rules of this task.
2. I understood how points in this task translated into lottery tickets.
3. I found this task engaging.
4. I was able to stay focused during this task.
5. This task felt repetitive.
6. I actively tried to identify which option performed best.
\n\n
Your Beliefs About the Options
\n

\n Based on your experience in the task you just completed, what do you think was the\n probability of receiving a reward from each option? Please enter a number between 0 and 100 for each.\n

\n\n
\n
\n \
Option A
\n \n \
\n
\n
Option B
\n \n
\n
\n \
Option C
\n \n \
\n
\n

\n There are no right or wrong answers — we are interested in your impression based on your experience.\n

\n\n
\n \n \
\n
\n\n\n
\n
\U0001F4CB
\n
Before You Continue
\n
\n As you move to the next task, the point total displayed on your screen will reset to 0. This is because the next task has a separate €5 prize draw.

\n \ Your lottery tickets from the previous task are safely stored. You will receive new instructions before the next task begins.\n
\n \n
\n\n\n" javascript: null title: Questionnaire timeout_seconds: null timer_text: null vars_for_template: null - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 30 name: NUM_ROUNDS - datatype: int js_value: 20 name: LEFT_ARM_PRIZE - datatype: int js_value: 50 name: RIGHT_ARM_PRIZE custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: upgrade_bought - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: bandit_choice - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: bandit_is_win - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: bandit_earnings - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: hp_lost - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: attention_passed2 - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_winner - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_optimal - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: null max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: task_engagement - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: total_bank - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: pocket_money - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: spent_credits - datatype: FloatField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null max: null min: null widget: null name: decision_rt - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q1_rules - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q2_tickets - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q4_engaging - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q6_focused - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q7_repetitive - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q9_identify_best - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: game_familiarity - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: exp_familiarity - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: age - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: gender - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: field_of_study - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: study_level - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: coursework - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: prev_econ_exp - datatype: LongStringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: tech_issues - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: enter_draw - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: email - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: video_game_freq - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - Fewer coins are saved in the Bank for the Phase 2 prize draw - Fewer coins are saved in the Bank for the Phase 2 prize draw - - More coins are saved in the Bank for the Phase 2 prize draw - More coins are saved in the Bank for the Phase 2 prize draw - - It makes no difference to the number of coins saved in the Bank, - It makes no difference to the number of coins saved in the Bank - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '1. Buying a weapon upgrade in Phase 2 means:' widget: constant: null expr_type: plain js_value: RadioSelect name: p2_cq1 - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: p2_cq_errors - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - Your Bank balance is reduced - Your Bank balance is reduced - - Your Bank balance is unchanged - Your Bank balance is unchanged - - Your sector reward probabilities will change - Your sector reward probabilities will change - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '2. If you lose HP or fail the mini-game, this means:' widget: constant: null expr_type: plain js_value: RadioSelect name: p2_cq2 - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - The same as in Phase 1 - The same as in Phase 1 - - Different from Phase 1 - Different from Phase 1 - - Chosen by the participant - Chosen by the participant - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '3. In Phase 2, the sector reward patterns are:' widget: constant: null expr_type: plain js_value: RadioSelect name: p2_cq3 - datatype: BooleanField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: false label: null widget: null name: battle_skipped - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p2_belief_alpha - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p2_belief_beta - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p2_belief_gamma - datatype: LongStringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: comments - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: monthly_budget - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: p2_cq4 methods: [] Subsession: fields: [] methods: [] name: experiment_t2_e2 pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - p2_cq2 - p2_cq_errors - p2_cq4 form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' and player.round_number == 1 is_waitpage: false js_vars: null live_method: null name: Instruction template: content: "\n\n\n\n
\n \n

TRANSMISSION ERROR

\n \

One or more answers were incorrect. Highlighted questions need correction. Remember:

\n \n
\n\n\n\n
\n
MISSION BRIEFING
SPACE DEFENDER
\n\n

\n \ Welcome to Space Defender.\n You will complete 30 waves of combat across three sectors.\n

\n\n
\n NOTICE
\n Your point total has been reset to 0. This task has a separate €5 personal lottery. \n The sector reward probabilities and amounts are completely different from the previous task. \n Treat this as a brand new learning task.\n
\n\n \
Core Task
\n

\n Before each wave, choose one of three sectors:\n \ Alpha, Beta, or Gamma.\n

\n

\n Each sector works like a slot machine with two possible outcomes:\n

\n \n

\n Each sector has its own fixed probability and its own fixed reward. These values stay the same throughout all 30 waves, but they are hidden from you. Your job is to figure out which sector is best by trying them out.\n

\n\n
\n Example (for illustration only — not the actual values):\n

Suppose one of the sectors had these hidden values:

\n \n \n \ \n \ \n \n \n \n \n \n
Win ProbabilityReward When You Win
60%15 coins
\n

\n This means each time you choose this sector, you have a 60% chance of winning 15 coins and a 40% chance of winning nothing (0 coins).\n Each of the three sectors in your task works this way, but with its own hidden probability and reward.\n

\n
\n\n
\n

€5 PERSONAL LOTTERY

\n

\n Every coin saved in your Bank becomes a lottery ticket. \n At the end of this task, the computer will draw a random number between 1 and 5,000.

\n If the random number is equal to or less than your total tickets, you win €5. \n \ If the random number is higher, you win nothing.

\n The more coins you save, the more tickets you collect — and the better your chance of winning.

\n This is your individual lottery — your result depends only on your own performance, not on other participants.\n \

\n
\n\n
The Mini-Game & Your Choice
\n

\n After choosing a sector and seeing your coins, those coins become your Pocket Money for that wave. Before the mini-game starts, you must decide:\n

\n\n \ \n\n \
Important Rule
\n \n\n \ \n
\n\n\n\n
\n\n
COMPREHENSION CHECK
\n
\n \ Answer all questions correctly to begin Space Defender.\n
\n\n \
\n If any answer is incorrect, the question will be highlighted and you will need to correct it before continuing.\n
\n\n \ \n
\n \n
\n \n \n \
\n
\n \n \n
\n
\n \ \n \n
\n
\n \n \n \
\n
\n\n \n
\n \n
\n \n \n \
\n
\n \n \ \n \
\n
\n \n \n
\n
\n \n \ \n
\n \
\n\n \n
\n \ \n
\n \n \ \n \
\n
\n \n \ \n \
\n
\n \n \n
\n
\n \n \n \
\n
\n\n \n
\n \n \
\n \n \ \n
\n
\n \ \n \n
\n
\n \n \n
\n
\n \ \n \n \
\n
\n\n \n\n \n
\n\n\n" javascript: null title: Introduction timeout_seconds: null timer_text: null vars_for_template: null - app_after_this_page: null before_next_page: "import random\nif player.bandit_choice:\n my_choice = player.bandit_choice.lower()\n p_left, prize_left = 0.5, 22\n p_mid, prize_mid = 0.35, 28 \n p_right, prize_right = 0.65, 15\n\n if my_choice == 'left':\n prob = p_left\n actual_prize = prize_left\n elif my_choice == 'mid':\n prob = p_mid\n actual_prize = prize_mid\n else: # 'right'\n prob = p_right\n actual_prize = prize_right\n\n ev_left = p_left * prize_left\n ev_mid = p_mid * prize_mid\n ev_right = p_right * prize_right\n \n max_ev = max(ev_left, ev_mid, ev_right)\n \n if my_choice == 'left' and ev_left == max_ev:\n player.is_optimal = True\n elif my_choice == 'mid' and ev_mid == max_ev:\n player.is_optimal = True\n elif my_choice == 'right' and ev_right == max_ev:\n player.is_optimal = True\n else:\n player.is_optimal = False\n\n if random.random() < prob:\n player.is_winner = True\n player.payoff = actual_prize\n \ player.bandit_earnings = actual_prize\n else:\n player.is_winner = False\n player.payoff = 0\n player.bandit_earnings = 0" error_message: null form_fields: - bandit_choice - decision_rt form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' is_waitpage: false js_vars: null live_method: null name: BanditPage template: content: "\n\n
\n \

Wave {{ player.round_number }} of 30

\n \n {{ if player.round_number > 1 }}\n
\n --- PREVIOUS WAVE PAYOFF ---

\n \ Mining Yield: {{ last_earned }} coins\n
\n \ {{ endif }}\n\n

Choose a sector.

\n\n \ \n \ \n \n\n \ \n
\n\n\n\n
\n {{ formfield_errors 'decision_rt' }}\n
\n\n\n" javascript: null title: Sector Exploration timeout_seconds: null timer_text: null vars_for_template: " last_earned = None\n last_choice_name = None\n \n \ if player.round_number > 1:\n prev_player = player.in_round(player.round_number - 1)\n if prev_player.bandit_earnings is not None:\n last_earned = prev_player.bandit_earnings\n \n if prev_player.bandit_choice:\n \ choice_str = prev_player.bandit_choice.lower()\n if choice_str == 'left':\n last_choice_name = \"SECTOR ALPHA\"\n elif choice_str == 'mid':\n last_choice_name = \"SECTOR BETA\"\n elif choice_str == 'right':\n last_choice_name = \"SECTOR GAMMA\"\n \ else:\n last_choice_name = \"UNKNOWN SECTOR\"\n\n \ return {\n 'last_earned': last_earned,\n 'last_choice_name': last_choice_name\n }" - app_after_this_page: null before_next_page: "if player.round_number == 1:\n starting_bank = 0\nelse:\n \ prev_player = player.in_round(player.round_number - 1)\n starting_bank = prev_player.total_bank if prev_player.total_bank is not None else 0\n \npocket = player.bandit_earnings if player.bandit_earnings is not None else 0\nspt = player.spent_credits if player.spent_credits is not None else 0\nfinal_bank = starting_bank + pocket - spt\n \nif final_bank < 0:\n final_bank = 0\n \nplayer.total_bank = final_bank\nplayer.pocket_money = pocket" error_message: null form_fields: - upgrade_bought - hp_lost - spent_credits form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: ' return player.participant.vars.get(''group'') == ''Group 1''' is_waitpage: false js_vars: null live_method: null name: Encounter template: content: "\n\n
\n \
\n
\n Wave\n {{ round }}/30\n
\n
\n \ Shield\n 5/5\n
\n \
\n Time\n \ --\n \
\n
\n\n \n\n \n
\n \
\n
ARMORY
\n \
WAVE {{ round }} / 30
\n\n
\n Pocket Money\n {{ pocket_money }} ¢\n
\n\n
\n \
\n {{ weapon_name }}\n
\n \
\n \
\n\n
\n \n \ \n \
\n
\n
\n
\n\n\n\n\n\n
\n {{ formfield_errors 'upgrade_bought' }} {{ formfield_errors 'spent_credits' }}\n {{ formfield_errors 'hp_lost' }}\n
\n\n" javascript: null title: Encounter timeout_seconds: null timer_text: null vars_for_template: "SCENARIOS = [\n # ── ACT 1: TRAINING (Rounds 1–9) ──\n \ # Short and easy. Learn the controls. 4-5 seconds each.\n {\"cost\": 3, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"basic\", \"is_boss\": False, \"time\": 4}, # R1\n {\"cost\": 3, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"basic\", \"is_boss\": False, \"time\": 4}, # R2\n \ {\"cost\": 3, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"fast\", \"is_boss\": False, \"time\": 5}, # R3\n {\"cost\": 4, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"sine\", \"is_boss\": False, \"time\": 5}, # R4\n {\"cost\": 4, \"weapon\": \"Wave Cannon\", \ \"w_type\": 4, \"enemies\": \"basic,fast\", \"is_boss\": False, \"time\": 5}, # R5\n {\"cost\": 4, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"fast,sine\", \"is_boss\": False, \"time\": 5}, # R6\n \ {\"cost\": 5, \"weapon\": \"Ricochet Bolt\", \"w_type\": 6, \"enemies\": \"tank\", \"is_boss\": False, \"time\": 5}, # R7\n {\"cost\": 5, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"sine,fast\", \ \"is_boss\": False, \"time\": 5}, # R8\n {\"cost\": 5, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"basic,tank\", \"is_boss\": False, \"time\": 5}, # R9\n \n # ── BOSS 1 (Round 10) ──\n {\"cost\": 6, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"basic,fast\", \ \"is_boss\": True, \"time\": 7}, # R10\n \n # ── ACT 2: ESCALATION (Rounds 11–19) ──\n # Introduce splitter. Keep stealth rare. 5-6 seconds.\n \ {\"cost\": 5, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"fast,sine\", \"is_boss\": False, \"time\": 5}, # R11\n {\"cost\": 5, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"basic,tank\", \ \"is_boss\": False, \"time\": 5}, # R12\n {\"cost\": 5, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"tank,fast\", \"is_boss\": False, \"time\": 6}, # R13\n {\"cost\": 6, \"weapon\": \"Plasma Beam\", \ \"w_type\": 3, \"enemies\": \"sine,basic\", \"is_boss\": False, \"time\": 6}, # R14\n {\"cost\": 6, \"weapon\": \"Ricochet Bolt\", \"w_type\": 6, \"enemies\": \"fast,splitter\", \"is_boss\": False, \"time\": 6}, # R15\n \ {\"cost\": 6, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"tank,sine\", \"is_boss\": False, \"time\": 6}, # R16\n {\"cost\": 7, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"fast,tank\", \ \"is_boss\": False, \"time\": 6}, # R17\n {\"cost\": 7, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"sine,splitter\", \"is_boss\": False, \"time\": 6}, # R18\n {\"cost\": 7, \"weapon\": \"Spread Gun\", \ \"w_type\": 2, \"enemies\": \"fast,sine\", \"is_boss\": False, \"time\": 6}, # R19\n \n # ── BOSS 2 (Round 20) ──\n {\"cost\": 7, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"fast,tank\", \"is_boss\": True, \"time\": 8}, # R20\n \n # ── ACT 3: PEAK (Rounds 21–29) ──\n # No splitter or stealth here — feedback says they're frustrating.\n # Use fast, sine, tank combos which are challenging but fair. 5-7 seconds.\n {\"cost\": 6, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"fast,sine\", \ \"is_boss\": False, \"time\": 5}, # R21\n {\"cost\": 6, \"weapon\": \"Ricochet Bolt\", \"w_type\": 6, \"enemies\": \"tank,fast\", \"is_boss\": False, \"time\": 6}, # R22\n {\"cost\": 7, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"sine,tank\", \"is_boss\": False, \"time\": 6}, # R23\n {\"cost\": 7, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"fast,sine,tank\", \"is_boss\": False, \"time\": 6}, # R24\n \ {\"cost\": 7, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"fast,tank\", \"is_boss\": False, \"time\": 6}, # R25\n {\"cost\": 8, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"sine,fast\", \ \"is_boss\": False, \"time\": 7}, # R26\n {\"cost\": 8, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"tank,sine\", \"is_boss\": False, \"time\": 7}, # R27\n {\"cost\": 8, \"weapon\": \"Ricochet Bolt\", \ \"w_type\": 6, \"enemies\": \"fast,tank\", \"is_boss\": False, \"time\": 7}, # R28\n {\"cost\": 8, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"sine,fast,tank\", \"is_boss\": False, \"time\": 7}, # R29\n \n # ── FINAL BOSS (Round 30) ──\n {\"cost\": 8, \"weapon\": \"Wave Cannon\", \ \"w_type\": 4, \"enemies\": \"fast,tank,sine\", \"is_boss\": True, \"time\": 8}, # R30\n]\n \nif player.round_number == 1:\n starting_bank = 0\nelse:\n \ prev_player = player.in_round(player.round_number - 1)\n starting_bank = prev_player.total_bank if prev_player.total_bank is not None else 0\n \npocket = player.bandit_earnings if player.bandit_earnings is not None else 0\n \nidx = min(player.round_number - 1, len(SCENARIOS) - 1)\nsc = SCENARIOS[idx]\n \nreturn {\n 'starting_bank': starting_bank,\n 'pocket_money': pocket,\n \ 'upgrade_cost': sc['cost'],\n 'weapon_name': sc['weapon'],\n \ 'weapon_type': sc['w_type'],\n 'enemy_types': sc['enemies'],\n \ 'is_boss': 'True' if sc['is_boss'] else 'False',\n 'time_limit': \ sc['time'],\n 'round': player.round_number,\n }" - app_after_this_page: null before_next_page: null error_message: null form_fields: null form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Result template: content: "\n\n
\n
All Waves Complete
\n \
MISSION COMPLETE
\n
You have survived all 30 waves.
\n\n
\n
Final Coins Saved
\n
{{ final_tickets }}
\n
\n\n
\n Every coin saved has been converted into one lottery ticket for the €5 prize draw.\n
\n\n \
\n Click below to proceed to the final questionnaire.\n
\n\n \n
" javascript: null title: Summary timeout_seconds: null timer_text: null vars_for_template: "past_players = player.in_all_rounds()\n\nearned = sum([p.bandit_earnings for p in past_players if p.bandit_earnings is not None])\n\nspent = sum([p.spent_credits for p in past_players if p.spent_credits is not None])\n\nfinal_wealth = earned - spent\n\nif final_wealth < 0:\n final_wealth = 0\nplayer.participant.vars['task2_total_bank'] = final_wealth\nreturn {'final_tickets': final_wealth}" - app_after_this_page: null before_next_page: null error_message: null form_fields: - p2_q1_rules - p2_q2_tickets - p2_q4_engaging - p2_q6_focused - p2_q7_repetitive - p2_q9_identify_best - age - gender - field_of_study - study_level - coursework - prev_econ_exp - tech_issues - video_game_freq - p2_belief_alpha - p2_belief_beta - p2_belief_gamma - comments - monthly_budget form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 1' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Questionnaire template: content: "\n\n
\n
Final Questionnaire
\n \
\n Thank you for completing the tasks. Please answer the following questions about the task you have just completed.\n \
\n\n \n
Part 1: Task Evaluation
\n
( 1 = Strongly Disagree   |   7 = Strongly Agree )
\n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \n \n \n \n \n \n \n \ \n \n \n \n \n \n \
Statements1
Strongly
Disagree
234567
Strongly
Agree
1. I understood the rules of this task.
2. I understood how points in this task translated into lottery tickets.
3. I found this task engaging.
4. I was able to stay focused during this task.
5. This task felt repetitive.
6. I actively tried to identify which option performed best.
\n\n \n
Part 2: Your Beliefs About the Sectors
\n

\n Based on your experience in the most recent task, what do you think was the\n probability of receiving a reward from each sector? Please select your best estimate for each.\n

\n\n
\n \
\n
Sector Alpha
\n \n
\n
\n \
Sector Beta
\n \n \
\n
\n
Sector Gamma
\n \n
\n
\n

\n \ There are no right or wrong answers — we are interested in your impression based on your experience.\n

\n\n \n
Part 3: Background & Experience
\n\n \
\n \n \n \ \n \n \n \n
\n\n \n \
Part 4: Demographics
\n\n
\n
\n \n \n \
\n
\n \n \ \n
\n \
\n\n
\n \n \n \n \n \n
\n\n \
\n \n \n \
\n\n
\n \n \n \ \n \n \ \n \n \ \n \n
\n\n
\n \n \n \n
\n\n \
\n \n \n \ \n
\n\n
\n \n \ \n
\n\n \
\n \n \n
\n\n
\n \n
\n
" javascript: null title: Questionnaire timeout_seconds: null timer_text: null vars_for_template: null - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 1 name: NUM_ROUNDS custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: enter_draw - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: lottery_email - datatype: BooleanField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: false label: null widget: null name: email_consent - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: task1_tickets - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: task2_tickets methods: [] Subsession: fields: [] methods: [] name: emailpage pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - enter_draw - lottery_email - email_consent form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: ' return player.participant.vars.get(''group'') == ''Group 1''' is_waitpage: false js_vars: null live_method: null name: MyPage template: content: "\n\n
\n\n \n
\n
Prize Draw
\n \
You have completed the experiment. Thank you for your participation!
\n\n
\n \
\n Task 1 — Lottery Tickets\n {{ task1_tickets }}\n
\n
\n Task 2 — Lottery Tickets\n {{ task2_tickets }}\n
\n
\n\n
\n Two separate prize draws of €5 each will be conducted — one for each task.\n Your lottery tickets from each task are entered into their respective draws independently.\n Winners will be contacted by email after data collection is complete.\n
\n\n \
\n
Would you like to enter the prize draws?
\n \n \n
\n\n
\n \ \n \n\n \
\n \n \n \
\n
\n\n
\n\n
\n \ SurveyCircle Participants:
\n \ Redeem Survey Code with one click:
\n \n https://www.surveycircle.com/Z1RY-Y7ZX-GQEE-RM1G/\n \ \n
\n\n \n
\n
\n\n\n\n\n\n
\n {{ formfield_errors 'enter_draw' }}\n {{ formfield_errors 'lottery_email' }}\n {{ formfield_errors 'email_consent' }}\n
\n\n" javascript: null title: Prize Draw timeout_seconds: null timer_text: null vars_for_template: "task1_tickets = player.participant.vars.get('task1_total_bank', 0)\ntask2_tickets = player.participant.vars.get('task2_total_bank', 0)\nplayer.task1_tickets = task1_tickets\nplayer.task2_tickets = task2_tickets\nreturn {\n 'task1_tickets': task1_tickets,\n 'task2_tickets': task2_tickets,\n}" - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 30 name: NUM_ROUNDS - datatype: int js_value: 20 name: LEFT_ARM_PRIZE - datatype: int js_value: 50 name: RIGHT_ARM_PRIZE custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: upgrade_bought - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: bandit_choice - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: bandit_is_win - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: bandit_earnings - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: hp_lost - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: attention_passed2 - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_winner - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_optimal - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: null max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: task_engagement - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: total_bank - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: pocket_money - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: spent_credits - datatype: FloatField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null max: null min: null widget: null name: decision_rt - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q1_rules - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q2_tickets - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q4_engaging - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q6_focused - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q7_repetitive - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: p2_q9_identify_best - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: game_familiarity - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: exp_familiarity - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: age - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: gender - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: field_of_study - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: study_level - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: coursework - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: prev_econ_exp - datatype: LongStringField kwargs: blank: null choices: null initial: null label: null widget: null name: tech_issues - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: enter_draw - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: email - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: video_game_freq - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - Fewer coins are saved in the Bank for the Phase 2 prize draw - Fewer coins are saved in the Bank for the Phase 2 prize draw - - More coins are saved in the Bank for the Phase 2 prize draw - More coins are saved in the Bank for the Phase 2 prize draw - - It makes no difference to the number of coins saved in the Bank, - It makes no difference to the number of coins saved in the Bank - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '1. Buying a weapon upgrade in Phase 2 means:' widget: constant: null expr_type: plain js_value: RadioSelect name: p2_cq1 - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: p2_cq_errors - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - Your Bank balance is reduced - Your Bank balance is reduced - - Your Bank balance is unchanged - Your Bank balance is unchanged - - Your sector reward probabilities will change - Your sector reward probabilities will change - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '2. If you lose HP or fail the mini-game, this means:' widget: constant: null expr_type: plain js_value: RadioSelect name: p2_cq2 - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - Fixed throughout the phase - Fixed throughout the phase - - Changing every round - Changing every round - - Chosen by the participant - Chosen by the participant - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '3. In Phase 1, the sector reward patterns are:' widget: constant: null expr_type: plain js_value: RadioSelect name: p2_cq3 - datatype: BooleanField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: false label: null widget: null name: battle_skipped - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p1_belief_alpha - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p1_belief_beta - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p1_belief_gamma - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: p1_cq4 methods: [] Subsession: fields: [] methods: [] name: experiment_t2_e1 pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - p2_cq_errors - p1_cq4 form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 2' and player.round_number == 1 is_waitpage: false js_vars: null live_method: null name: Instruction template: content: "\n\n\n\n
\n \n

TRANSMISSION ERROR

\n \

One or more answers were incorrect. Highlighted questions need correction. Remember:

\n \n
\n\n\n\n
\n
MISSION BRIEFING
SPACE DEFENDER
\n\n

\n \ Welcome to Space Defender.\n You will complete 30 waves of combat across three sectors.\n

\n\n
Core Task
\n \

\n Before each wave, choose one of three sectors:\n Alpha, Beta, or Gamma.\n \

\n

\n Each sector works like a slot machine with two possible outcomes:\n

\n \n

\n Each sector has its own fixed probability and its own fixed reward. These values stay the same throughout all 30 waves, but they are hidden from you. Your job is to figure out which sector is best by trying them out.\n

\n\n
\n Example (for illustration only — not the actual values):\n

Suppose one of the sectors had these hidden values:

\n \n \n \ \n \ \n \n \n \n \n \n
Win ProbabilityReward When You Win
60%15 coins
\n

\n This means each time you choose this sector, you have a 60% chance of winning 15 coins and a 40% chance of winning nothing (0 coins).\n Each of the three sectors in your task works this way, but with its own hidden probability and reward.\n

\n
\n\n
\n

€5 PERSONAL LOTTERY

\n

\n Every coin saved in your Bank becomes a lottery ticket. \n At the end of this task, the computer will draw a random number between 1 and 5,000.

\n If the random number is equal to or less than your total tickets, you win €5. \n \ If the random number is higher, you win nothing.

\n The more coins you save, the more tickets you collect — and the better your chance of winning.

\n This is your individual lottery — your result depends only on your own performance, not on other participants.\n \

\n
\n\n
The Mini-Game & Your Choice
\n

\n After choosing a sector and seeing your coins, those coins become your Pocket Money for that wave. Before the mini-game starts, you must decide:\n

\n\n \ \n\n \
Important Rule
\n \n\n \ \n
\n\n\n\n
\n\n
COMPREHENSION CHECK
\n
\n \ Answer all questions correctly to begin Space Defender.\n
\n\n \
\n If any answer is incorrect, the question will be highlighted and you will need to correct it before continuing.\n
\n\n \ \n
\n \n
\n \n \n \
\n
\n \n \n
\n
\n \ \n \n
\n
\n \n \n \
\n
\n\n \n
\n \n
\n \n \n \
\n
\n \n \ \n \
\n
\n \n \n
\n
\n \n \ \n
\n \
\n\n \n
\n \ \n
\n \n \n
\n
\n \n \n
\n
\n \n \ \n
\n \
\n \n \n
\n
\n\n \n
\n \n
\n \n \n
\n
\n \n \n
\n \
\n \n \n
\n \
\n \n \n
\n
\n\n \n\n \n
\n\n\n" javascript: null title: Introduction timeout_seconds: null timer_text: null vars_for_template: null - app_after_this_page: null before_next_page: "import random\nif player.bandit_choice:\n my_choice = player.bandit_choice.lower()\n p_left, prize_left = 0.8, 10\n p_mid, prize_mid = 0.5, 16 \n p_right, prize_right = 0.4, 20\n\n if my_choice == 'left':\n prob = p_left\n actual_prize = prize_left\n elif my_choice == 'mid':\n prob = p_mid\n actual_prize = prize_mid\n else: # 'right'\n prob = p_right\n actual_prize = prize_right\n\n ev_left = p_left * prize_left\n ev_mid = p_mid * prize_mid\n ev_right = p_right * prize_right\n \n max_ev = max(ev_left, ev_mid, ev_right)\n \n if my_choice == 'left' and ev_left == max_ev:\n player.is_optimal = True\n elif my_choice == 'mid' and ev_mid == max_ev:\n player.is_optimal = True\n elif my_choice == 'right' and ev_right == max_ev:\n player.is_optimal = True\n else:\n player.is_optimal = False\n\n if random.random() < prob:\n player.is_winner = True\n player.payoff = actual_prize\n \ player.bandit_earnings = actual_prize\n else:\n player.is_winner = False\n player.payoff = 0\n player.bandit_earnings = 0" error_message: null form_fields: - bandit_choice - decision_rt form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: 'return player.participant.vars.get(''group'') == ''Group 2'' ' is_waitpage: false js_vars: null live_method: null name: BanditPage template: content: "\n\n
\n \

Wave {{ player.round_number }} of 30

\n \n {{ if player.round_number > 1 }}\n
\n --- PREVIOUS WAVE PAYOFF ---

\n \ Mining Yield: {{ last_earned }} coins\n
\n \ {{ endif }}\n\n

Choose a sector.

\n\n \ \n \ \n \n\n \ \n
\n\n\n\n
\n {{ formfield_errors 'decision_rt' }}\n
\n\n\n" javascript: null title: Sector Exploration timeout_seconds: null timer_text: null vars_for_template: " last_earned = None\n last_choice_name = None\n \n \ if player.round_number > 1:\n prev_player = player.in_round(player.round_number - 1)\n if prev_player.bandit_earnings is not None:\n last_earned = prev_player.bandit_earnings\n \n if prev_player.bandit_choice:\n \ choice_str = prev_player.bandit_choice.lower()\n if choice_str == 'left':\n last_choice_name = \"SECTOR ALPHA\"\n elif choice_str == 'mid':\n last_choice_name = \"SECTOR BETA\"\n elif choice_str == 'right':\n last_choice_name = \"SECTOR GAMMA\"\n \ else:\n last_choice_name = \"UNKNOWN SECTOR\"\n\n \ return {\n 'last_earned': last_earned,\n 'last_choice_name': last_choice_name\n }" - app_after_this_page: null before_next_page: "if player.round_number == 1:\n starting_bank = 0\nelse:\n \ prev_player = player.in_round(player.round_number - 1)\n starting_bank = prev_player.total_bank if prev_player.total_bank is not None else 0\n \npocket = player.bandit_earnings if player.bandit_earnings is not None else 0\nspt = player.spent_credits if player.spent_credits is not None else 0\nfinal_bank = starting_bank + pocket - spt\n \nif final_bank < 0:\n final_bank = 0\n \nplayer.total_bank = final_bank\nplayer.pocket_money = pocket" error_message: null form_fields: - upgrade_bought - hp_lost - spent_credits form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: 'return player.participant.vars.get(''group'') == ''Group 2'' ' is_waitpage: false js_vars: null live_method: null name: Encounter template: content: "\n\n
\n \
\n
\n Wave\n {{ round }}/30\n
\n
\n \ Shield\n 5/5\n
\n \
\n Time\n \ --\n \
\n
\n\n \n\n \n
\n \
\n
ARMORY
\n \
WAVE {{ round }} / 30
\n\n
\n Pocket Money\n {{ pocket_money }} ¢\n
\n\n
\n \
\n {{ weapon_name }}\n
\n \
\n \
\n\n
\n \n \ \n \
\n
\n
\n
\n\n\n\n\n\n
\n {{ formfield_errors 'upgrade_bought' }} {{ formfield_errors 'spent_credits' }}\n {{ formfield_errors 'hp_lost' }}\n
\n\n" javascript: null title: Encounter timeout_seconds: null timer_text: null vars_for_template: "SCENARIOS = [\n # ── ACT 1: TRAINING (Rounds 1–9) ──\n \ # Short and easy. Learn the controls. 4-5 seconds each.\n {\"cost\": 3, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"basic\", \"is_boss\": False, \"time\": 4}, # R1\n {\"cost\": 3, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"basic\", \"is_boss\": False, \"time\": 4}, # R2\n \ {\"cost\": 3, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"fast\", \"is_boss\": False, \"time\": 5}, # R3\n {\"cost\": 4, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"sine\", \"is_boss\": False, \"time\": 5}, # R4\n {\"cost\": 4, \"weapon\": \"Wave Cannon\", \ \"w_type\": 4, \"enemies\": \"basic,fast\", \"is_boss\": False, \"time\": 5}, # R5\n {\"cost\": 4, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"fast,sine\", \"is_boss\": False, \"time\": 5}, # R6\n \ {\"cost\": 5, \"weapon\": \"Ricochet Bolt\", \"w_type\": 6, \"enemies\": \"tank\", \"is_boss\": False, \"time\": 5}, # R7\n {\"cost\": 5, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"sine,fast\", \ \"is_boss\": False, \"time\": 5}, # R8\n {\"cost\": 5, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"basic,tank\", \"is_boss\": False, \"time\": 5}, # R9\n \n # ── BOSS 1 (Round 10) ──\n {\"cost\": 6, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"basic,fast\", \ \"is_boss\": True, \"time\": 7}, # R10\n \n # ── ACT 2: ESCALATION (Rounds 11–19) ──\n # Introduce splitter. Keep stealth rare. 5-6 seconds.\n \ {\"cost\": 5, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"fast,sine\", \"is_boss\": False, \"time\": 5}, # R11\n {\"cost\": 5, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"basic,tank\", \ \"is_boss\": False, \"time\": 5}, # R12\n {\"cost\": 5, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"tank,fast\", \"is_boss\": False, \"time\": 6}, # R13\n {\"cost\": 6, \"weapon\": \"Plasma Beam\", \ \"w_type\": 3, \"enemies\": \"sine,basic\", \"is_boss\": False, \"time\": 6}, # R14\n {\"cost\": 6, \"weapon\": \"Ricochet Bolt\", \"w_type\": 6, \"enemies\": \"fast,splitter\", \"is_boss\": False, \"time\": 6}, # R15\n \ {\"cost\": 6, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"tank,sine\", \"is_boss\": False, \"time\": 6}, # R16\n {\"cost\": 7, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"fast,tank\", \ \"is_boss\": False, \"time\": 6}, # R17\n {\"cost\": 7, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"sine,splitter\", \"is_boss\": False, \"time\": 6}, # R18\n {\"cost\": 7, \"weapon\": \"Spread Gun\", \ \"w_type\": 2, \"enemies\": \"fast,sine\", \"is_boss\": False, \"time\": 6}, # R19\n \n # ── BOSS 2 (Round 20) ──\n {\"cost\": 7, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"fast,tank\", \"is_boss\": True, \"time\": 8}, # R20\n \n # ── ACT 3: PEAK (Rounds 21–29) ──\n # No splitter or stealth here — feedback says they're frustrating.\n # Use fast, sine, tank combos which are challenging but fair. 5-7 seconds.\n {\"cost\": 6, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"fast,sine\", \ \"is_boss\": False, \"time\": 5}, # R21\n {\"cost\": 6, \"weapon\": \"Ricochet Bolt\", \"w_type\": 6, \"enemies\": \"tank,fast\", \"is_boss\": False, \"time\": 6}, # R22\n {\"cost\": 7, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"sine,tank\", \"is_boss\": False, \"time\": 6}, # R23\n {\"cost\": 7, \"weapon\": \"Dual Laser\", \"w_type\": 1, \"enemies\": \"fast,sine,tank\", \"is_boss\": False, \"time\": 6}, # R24\n \ {\"cost\": 7, \"weapon\": \"Spread Gun\", \"w_type\": 2, \"enemies\": \"fast,tank\", \"is_boss\": False, \"time\": 6}, # R25\n {\"cost\": 8, \"weapon\": \"Plasma Beam\", \"w_type\": 3, \"enemies\": \"sine,fast\", \ \"is_boss\": False, \"time\": 7}, # R26\n {\"cost\": 8, \"weapon\": \"Wave Cannon\", \"w_type\": 4, \"enemies\": \"tank,sine\", \"is_boss\": False, \"time\": 7}, # R27\n {\"cost\": 8, \"weapon\": \"Ricochet Bolt\", \ \"w_type\": 6, \"enemies\": \"fast,tank\", \"is_boss\": False, \"time\": 7}, # R28\n {\"cost\": 8, \"weapon\": \"Homing Missile\", \"w_type\": 5, \"enemies\": \"sine,fast,tank\", \"is_boss\": False, \"time\": 7}, # R29\n \n # ── FINAL BOSS (Round 30) ──\n {\"cost\": 8, \"weapon\": \"Wave Cannon\", \ \"w_type\": 4, \"enemies\": \"fast,tank,sine\", \"is_boss\": True, \"time\": 8}, # R30\n]\n \nif player.round_number == 1:\n starting_bank = 0\nelse:\n \ prev_player = player.in_round(player.round_number - 1)\n starting_bank = prev_player.total_bank if prev_player.total_bank is not None else 0\n \npocket = player.bandit_earnings if player.bandit_earnings is not None else 0\n \nidx = min(player.round_number - 1, len(SCENARIOS) - 1)\nsc = SCENARIOS[idx]\n \nreturn {\n 'starting_bank': starting_bank,\n 'pocket_money': pocket,\n \ 'upgrade_cost': sc['cost'],\n 'weapon_name': sc['weapon'],\n \ 'weapon_type': sc['w_type'],\n 'enemy_types': sc['enemies'],\n \ 'is_boss': 'True' if sc['is_boss'] else 'False',\n 'time_limit': \ sc['time'],\n 'round': player.round_number,\n }" - app_after_this_page: null before_next_page: null error_message: null form_fields: null form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 2' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Result template: content: "\n\n
\n
All Waves Complete
\n \
MISSION COMPLETE
\n
You have completed all 30 waves.
\n\n
\n
Final Coins Saved
\n
{{ final_tickets }}
\n
\n\n
\n Every coin saved has been converted into one lottery ticket for the €5 prize draw.\n
\n\n \
\n Next, you will complete a short questionnaire before continuing with the experiment.\n
\n\n \ \n
" javascript: null title: Summary timeout_seconds: null timer_text: null vars_for_template: "past_players = player.in_all_rounds()\n\nearned = sum([p.bandit_earnings for p in past_players if p.bandit_earnings is not None])\n\nspent = sum([p.spent_credits for p in past_players if p.spent_credits is not None])\n\nfinal_wealth = earned - spent\n\nif final_wealth < 0:\n final_wealth = 0\n\nplayer.participant.vars['task1_total_bank'] = final_wealth\n\nreturn {'final_tickets': final_wealth}" - app_after_this_page: null before_next_page: null error_message: null form_fields: - p2_q1_rules - p2_q2_tickets - p2_q4_engaging - p2_q6_focused - p2_q7_repetitive - p2_q9_identify_best - p1_belief_alpha - p1_belief_beta - p1_belief_gamma form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 2' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: QUES template: content: "\n\n
\n \
Task Evaluation
\n
\n \ Please indicate your level of agreement with the following statements.
\n \ ( 1 = Strongly Disagree   |   7 = Strongly Agree )\n
\n\n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \n \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \n \n \n \n \ \n \n \n \n \ \n \n \n \n \ \n \n \n \n \ \n \n \n
Statements1
Strongly
Disagree
234567
Strongly
Agree
1. I understood the rules of this task.
2. I understood how points in this task translated into lottery tickets.
3. I found this task engaging.
4. I was able to stay focused during this task.
5. This task felt repetitive.
6. I actively tried to identify which option performed best.
\n\n
Your Beliefs About the Sectors
\n

\n Based on your experience in the task you just completed, what do you think was the\n probability of receiving a reward from each sector? Please enter a number between 0 and 100 for each.\n

\n\n
\n
\n \
Sector Alpha
\n \n \
\n
\n
Sector Beta
\n \n
\n
\n \
Sector Gamma
\n \n \
\n
\n

\n There are no right or wrong answers — we are interested in your impression based on your experience.\n

\n\n
\n \n \
\n
\n\n\n
\n
\U0001F4CB
\n
Before You Continue
\n
\n As you move to the next task, the point total displayed on your screen will reset to 0. This is because the next task has a separate €5 prize draw.

\n \ Your lottery tickets from the previous task are safely stored. You will receive new instructions before the next task begins.\n
\n \n
\n\n\n" javascript: null title: Title timeout_seconds: null timer_text: null vars_for_template: null - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 30 name: NUM_ROUNDS - datatype: float js_value: 0 name: MY_CONSTANT - datatype: float js_value: 20 name: LEFT_ARM_PRIZE - datatype: float js_value: 50 name: RIGHT_ARM_PRIZE custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: choice - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_winner - datatype: CurrencyField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: payoff_this_round - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: is_optimal - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: attention_passed - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: bandit_earnings - datatype: CurrencyField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: cum_payoff - datatype: FloatField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: decision_rt - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 1. I understood the rules of this task. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: p2_q1_rules - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 2. I understood how points in this task translated into lottery tickets. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: p2_q2_tickets - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 3. I found this task engaging. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: p2_q4_engaging - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 4. I was able to stay focused during this task. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: p2_q6_focused - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 5. This task felt repetitive. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: p2_q7_repetitive - datatype: IntegerField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - 1 - '1' - - 2 - '2' - - 3 - '3' - - 4 - '4' - - 5 - '5' - - 6 - '6' - - 7 - '7' initial: null label: constant: null expr_type: plain js_value: 6. I actively tried to identify which option performed best. max: null min: null widget: constant: null expr_type: plain js_value: RadioSelectHorizontal name: p2_q9_identify_best - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - no lottery tickets - no lottery tickets - - 1 lottery ticket - 1 lottery ticket - - 5 lottery tickets - 5 lottery tickets - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '1. In Phase 2, each point earned gives you:' widget: constant: null expr_type: plain js_value: RadioSelect name: cq1 - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - fixed - fixed - - changing every round - changing every round - - chosen by the participant - chosen by the participant - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '2. Within Phase 2, the probabilities associated with the options are:' widget: constant: null expr_type: plain js_value: RadioSelect name: cq2 - datatype: StringField kwargs: blank: null choices: constant: null expr_type: plain js_value: - - The same as in Phase 1 - The same as in Phase 1 - - Different from Phase 1 - Different from Phase 1 - - Chosen by the participant - Chosen by the participant - - I am not sure - I am not sure initial: null label: constant: null expr_type: plain js_value: '3. In Phase 2, the option reward patterns are:' widget: constant: null expr_type: plain js_value: RadioSelect name: cq3 - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: cq_fails - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: video_game_freq - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: game_familiarity - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: exp_familiarity - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: null min: null widget: null name: age - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: gender - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: study_level - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: field_of_study - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: coursework - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: prev_econ_exp - datatype: LongStringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: tech_issues - datatype: StringField kwargs: blank: null choices: null initial: null label: null widget: null name: enter_draw - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: email - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p2_belief_alpha - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p2_belief_beta - datatype: IntegerField kwargs: blank: null choices: null initial: null label: null max: constant: null expr_type: plain js_value: 100 min: constant: null expr_type: plain js_value: 0 widget: null name: p2_belief_gamma - datatype: LongStringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: comments - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: monthly_budget methods: [] Subsession: fields: [] methods: [] name: experiment_t1_e2 pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - cq_fails form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 2' and player.round_number == 1 is_waitpage: false js_vars: null live_method: null name: Introduction template: content: "\n\n\n
\n \ \n \

Quick Rule Reminder

\n

One or more answers were incorrect. The highlighted questions need to be corrected. Remember:

\n \ \n
\n\n\n
\n \

New Task

\n

Welcome to the next part of the experiment. You will participate in a new task that lasts for 30 rounds.

\n \ \n
\n Important Update:
\n The reward probabilities and potential points for these options are completely different from the previous task. You should treat this as a brand new learning task.\n
\n\n

How It Works

\n

In each round, you will choose one of three options: A, B, or C.

\n

Each option works like a slot machine with two possible outcomes:

\n \n

Each option has its own fixed probability and its own fixed payoff. These values stay the same throughout all 30 rounds, but they are hidden from you. Your job is to figure out which option is best by trying them out.

\n\n
\n Example (for illustration only — not the actual values):\n

Suppose one of the options had these hidden values:

\n \n \n \n \n \ \n \n \n \ \n \n
Win ProbabilityPayoff When You Win
60%15 points
\n \

\n \ This means each time you choose this option, you have a 60% chance of winning 15 points and a 40% chance of winning nothing (0 points). \n Each of the three options in your task works this way, but with its own hidden probability and payoff.\n

\n
\n\n
\n \ €5 Personal Lottery

\n Every point you save in this task becomes a lottery ticket. \n At the end of the task, the computer will draw a random number between 1 and 5,000.

\n If the random number is equal to or less than your total number of tickets, you win €5. \n If the random number is higher, you win nothing.

\n The more points you save, the more tickets you collect — and the better your chance of winning.

\n \ This is your individual lottery — your result depends only on your own performance, not on other participants.\n
\n\n
\n \n \
\n
\n\n\n
\n\n \
Comprehension Check
\n \n
\n \ To ensure you understand the rules of the task, please answer the following questions. \n If any answer is incorrect, you will need to correct it before continuing.\n
\n\n
\n \ \n
\n \n \n
\n
\n \n \n
\n
\n \n \n \
\n
\n \n \ \n \
\n
\n\n
\n \n
\n \n \n
\n
\n \n \n \
\n
\n \n \ \n
\n
\n \ \n \n
\n
\n\n
\n \n
\n \ \n \n \
\n
\n \n \n
\n
\n \ \n \n
\n
\n \n \n
\n \
\n\n \n\n \n
\n\n\n" javascript: null title: Introduction timeout_seconds: null timer_text: null vars_for_template: null - app_after_this_page: null before_next_page: "import random \nif player.choice is not None:\n p_left, prize_left = 0.5, 22\n p_mid, prize_mid = 0.35, 28 \n p_right, prize_right = 0.65, 15\n #choice and prize\n if player.choice == 'left':\n prob = p_left\n actual_prize = prize_left\n \ elif player.choice == 'mid':\n prob = p_mid\n actual_prize = prize_mid\n else: # 'right'\n prob = p_right\n actual_prize = prize_right\n\n # cal opt choice\n ev_left = p_left * prize_left\n \ ev_mid = p_mid * prize_mid\n ev_right = p_right * prize_right\n \ \n max_ev = max(ev_left, ev_mid, ev_right)\n \n if player.choice == 'left' and ev_left == max_ev:\n player.is_optimal = True\n elif player.choice == 'mid' and ev_mid == max_ev:\n player.is_optimal = True\n elif player.choice == 'right' and ev_right == max_ev:\n player.is_optimal = True\n else:\n player.is_optimal = False\n\n # bandit\n \ if random.random() < prob:\n player.is_winner = True\n player.payoff = actual_prize\n player.bandit_earnings = actual_prize\n else:\n \ player.is_winner = False\n player.payoff = 0\n player.bandit_earnings = 0\n\n # payoff\n if player.round_number == 1:\n player.cum_payoff = player.payoff\n else:\n prev_cum = player.in_round(player.round_number - 1).cum_payoff\n player.cum_payoff = (prev_cum if prev_cum else 0) + player.payoff\nif player.round_number == 30:\n player.participant.vars['task2_total_bank'] = int(player.cum_payoff) " error_message: null form_fields: - choice - decision_rt form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: 'return player.participant.vars.get(''group'') == ''Group 2'' ' is_waitpage: false js_vars: null live_method: null name: Decision template: content: "\n\n
\n \

Round {{ player.round_number }} of 30

\n\n {{ if last_earned != None }}\n
\n \ Previous round payoff: {{ last_earned }} points\n
\n \ {{ endif }}\n\n

Please choose one option.

\n\n \n \n \n\n \n
\n\n \n\n
\n {{ formfield_errors 'decision_rt' }} \n
\n\n\n\n" javascript: null title: Decision Task timeout_seconds: null timer_text: null vars_for_template: "if 'treatment' not in player.participant.vars:\n if player.id_in_group % 2 == 1:\n player.participant.vars['treatment'] = 'A'\n else:\n player.participant.vars['treatment'] = 'B'\n\nlast_earned = None\nif player.round_number > 1:\n prev_player = player.in_round(player.round_number - 1)\n if prev_player.bandit_earnings is not None:\n last_earned = prev_player.bandit_earnings\n\nreturn {\n \ 'last_earned': last_earned\n}" - app_after_this_page: null before_next_page: null error_message: null form_fields: [] form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 2' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Results template: content: "\n
\n
Task Completed
\n \n

You have finished all 30 rounds of this task.

\n \ \n \n \n \n \ \n
Total points earned:{{ total_earned }} Points
\n
\n Your points have been recorded as lottery tickets for the €5 prize draw.

\n \ Please click the button below to proceed to the final questionnaire.\n \
\n
\n \n
\n
" javascript: null title: Summary timeout_seconds: null timer_text: null vars_for_template: "all_players = player.in_all_rounds()\n\ntotal_wins = sum([1 for p in all_players if p.is_winner == True])\n\ntotal_earned = int(player.cum_payoff)\n\nreturn {\n 'total_wins': total_wins,\n 'total_earned': total_earned,\n}" - app_after_this_page: null before_next_page: null error_message: null form_fields: - video_game_freq - age - gender - study_level - field_of_study - coursework - prev_econ_exp - tech_issues - p2_q1_rules - p2_q2_tickets - p2_q4_engaging - p2_q6_focused - p2_q7_repetitive - p2_q9_identify_best - monthly_budget - p2_belief_alpha - p2_belief_beta - p2_belief_gamma - comments form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: return player.participant.vars.get('group') == 'Group 2' and player.round_number == C.NUM_ROUNDS is_waitpage: false js_vars: null live_method: null name: Questionnaire template: content: "\n\n
\n
Final Questionnaire
\n \
\n Thank you for completing the tasks. Please answer the following questions about the task you have just completed.\n \
\n\n \n
Part 1: Task Evaluation
\n
( 1 = Strongly Disagree   |   7 = Strongly Agree )
\n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \ \n \n \n \n \n \n \n \n \n \n \ \n \n \n \n \n \n \
Statements1
Strongly
Disagree
234567
Strongly
Agree
1. I understood the rules of this task.
2. I understood how points in this task translated into lottery tickets.
3. I found this task engaging.
4. I was able to stay focused during this task.
5. This task felt repetitive.
6. I actively tried to identify which option performed best.
\n\n \n
Part 2: Your Beliefs About the Options
\n

\n Based on your experience in the most recent task, what do you think was the\n probability of receiving a reward from each option? Please select your best estimate for each.\n

\n\n
\n \
\n
Option A
\n \n
\n
\n \
Option B
\n \n \
\n
\n
Option C
\n \n
\n
\n

\n \ There are no right or wrong answers — we are interested in your impression based on your experience.\n

\n\n \n
Part 3: Background & Experience
\n\n \
\n \n \n \ \n \n \n \n
\n\n \n \
Part 4: Demographics
\n\n
\n
\n \n \n \
\n
\n \n \ \n
\n \
\n\n
\n \n \n \n \n \n
\n\n \
\n \n \n \
\n\n
\n \n \n \ \n \n \ \n \n \ \n \n
\n\n
\n \n \n \n
\n\n \
\n \n \n \ \n
\n\n
\n \n \ \n
\n\n \
\n \n \n
\n\n
\n \n
\n
" javascript: null title: Questionnaire timeout_seconds: null timer_text: null vars_for_template: null - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 1 name: NUM_ROUNDS custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: BooleanField kwargs: blank: null choices: null initial: null label: null widget: null name: enter_draw - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: lottery_email - datatype: BooleanField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: false label: null widget: null name: email_consent - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: task1_tickets - datatype: IntegerField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: 0 label: null max: null min: null widget: null name: task2_tickets methods: [] Subsession: fields: [] methods: [] name: emailpage2 pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - enter_draw - lottery_email - email_consent form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: ' return player.participant.vars.get(''group'') == ''Group 2''' is_waitpage: false js_vars: null live_method: null name: MyPage template: content: "\n\n
\n\n \n
\n
Prize Draw
\n \
You have completed the experiment. Thank you for your participation!
\n\n
\n \
\n Task 1 — Lottery Tickets\n {{ task1_tickets }}\n
\n
\n Task 2 — Lottery Tickets\n {{ task2_tickets }}\n
\n
\n\n
\n Two separate prize draws of €5 each will be conducted — one for each task.\n Your lottery tickets from each task are entered into their respective draws independently.\n Winners will be contacted by email after data collection is complete.\n
\n\n \
\n
Would you like to enter the prize draws?
\n \n \n
\n\n
\n \ \n \n\n \
\n \n \n \
\n
\n\n
\n\n
\n \ SurveyCircle Participants:
\n \ Redeem Survey Code with one click:
\n \n https://www.surveycircle.com/Z1RY-Y7ZX-GQEE-RM1G/\n \ \n
\n\n \n
\n
\n\n\n\n\n\n
\n {{ formfield_errors 'enter_draw' }}\n {{ formfield_errors 'lottery_email' }}\n {{ formfield_errors 'email_consent' }}\n
\n\n" javascript: null title: Prize Draw timeout_seconds: null timer_text: null vars_for_template: "task1_tickets = player.participant.vars.get('task1_total_bank', 0)\ntask2_tickets = player.participant.vars.get('task2_total_bank', 0)\nplayer.task1_tickets = task1_tickets\nplayer.task2_tickets = task2_tickets\nreturn {\n 'task1_tickets': task1_tickets,\n 'task2_tickets': task2_tickets,\n}" css: '' mturk_settings: null other_settings: DEMO_PAGE_INTRO_HTML: '' LANGUAGE_CODE: en PARTICIPANT_FIELDS: [] REAL_WORLD_CURRENCY_CODE: EUR SESSION_FIELDS: [] USE_POINTS: true rooms: [] session_config_defaults: participation_fee: 0 real_world_currency_per_point: 1 session_configs: - app_sequence: - intro - experiment_t1_e1 - experiment_t2_e2 - emailpage - experiment_t2_e1 - experiment_t1_e2 - emailpage2 custom_entries: [] name: session_demo num_demo_participants: 2 shared_out: ''