Library · Arcade
Arcade
Our team built a game arcade to make our project's core concepts playable and approachable for a general audience
The film
iGEM 2026 · Taipei
SynPETic
The film is a 63-second animation of the SynPETic concept: an orbital biolab where engineered E. coli express PETase to break PET plastic into monomers, which are then rebuilt into new bottles. It is the same scroll-driven sequence that opens the home page; pressing play runs it end to end with a scrubber and seven chapter marks so you can jump between scenes.
intermediate.html · Bioreactor Tactical Ledger v7
Embedded directly in this page as vanilla JavaScript: no iframe, no external dependencies. Set the starting mass, temperature, pH and scaffolding, then advance the batch hour by hour. The reaction heats itself and acidifies as TPA accumulates; you get one cooling cycle and one buffer dose per hour to keep it alive for 24 hours.
2033_intermediate.html · Bioreactor Tactical Ledger v5
Embedded directly in this page as vanilla JavaScript: no iframe, no external dependencies. An earlier revision of the ledger: acidity drifts with TPA yield, alarms fade as the operator gets used to them, and a stalled reaction ends the batch with a failure report.
petase_circuit.html · PETase Gene Circuit Simulator
Embedded directly in this page as vanilla JavaScript: no iframe, no external dependencies. Promoter strength, plasmid copy number and cell density set the transcription rate; mRNA is translated into PETase and MHETase, which in turn convert PET to MHET and MHET to monomers. Step the circuit one hour at a time.
Pyodide-based games
SimulationX_22May2026.html, SimulationY_22May2026.html, and SimulationZ_22May2026.html ran their logic in Python via Pyodide, loaded at runtime from an external CDN. Because this means the program is not fully hosted on iGEM servers, these three games have been removed from the playable arcade; their Python source is kept below for reference. enzyme_game.html had the same issue but only needed Pyodide for two small helper functions, so it has been rewritten in vanilla JavaScript and restored as a playable, fully self-hosted game further down this page.
SimulationX_22May2026.html · PET Degradation Simulator
Removed; it ran via Pyodide (external CDN). Python source below. Michaelis–Menten kinetics with Arrhenius temperature scaling and a crystallinity hindrance term.
Python source (archived, read-only)
import math
sim_ticks = 50
temp_celsius = 30
pet_amorphous = 500.0
pet_crystalline = 500.0
mhet_pool = 0.0
tpa_pool = 0.0
eg_pool = 0.0
petase_conc = 10.0
mhetase_conc = 10.0
vmax_petase = 2.5 * petase_conc
km_petase = 150.0
total_substrate = pet_amorphous + pet_crystalline
if total_substrate > 0:
petase_velocity = (vmax_petase * total_substrate) / (km_petase + total_substrate)
else:
petase_velocity = 0.0
actual_petase_v = petase_velocity
# Slightly narrower layout to accommodate mobile view widths
print(f"{'Tick':<5}{'Amorph':<8}{'Cryst':<8}{'MHET':<8}{'TPA':<8}{'EG':<8}")
print("-" * 45)
for tick in range(1, sim_ticks + 1):
if pet_amorphous + pet_crystalline + mhet_pool <= 0 and tick > 1: break
vmax_mhetase = 4.0 * mhetase_conc
km_mhetase = 50.0
mhet_cleaved = (vmax_mhetase * mhet_pool) / (km_mhetase + mhet_pool) if mhet_pool > 0 else 0
mhet_cleaved = min(mhet_cleaved, mhet_pool)
mhet_pool -= mhet_cleaved
tpa_gain = mhet_cleaved * 0.73
eg_gain = mhet_cleaved * 0.27
tpa_pool += tpa_gain
eg_pool += eg_gain
current_pet = pet_amorphous + pet_crystalline
if current_pet <= 0:
actual_petase_v = 0.0
else:
actual_petase_v = (vmax_petase * current_pet) / (km_petase + current_pet)
r_constant = 8.314
activation_energy = 45000.0
kelvin_opt = 30 + 273.15
kelvin_curr = temp_celsius + 273.15
temp_diff = (1.0 / kelvin_opt) - (1.0 / kelvin_curr)
temp_factor = math.exp((activation_energy / r_constant) * temp_diff)
if temp_celsius > 55:
temp_factor *= math.exp(-0.3 * (temp_celsius - 55))
eff_petase_v = actual_petase_v * temp_factor
eff_mhetase_v = mhet_cleaved * temp_factor
if current_pet > 0:
amorph_ratio = pet_amorphous / current_pet
cryst_ratio = pet_crystalline / current_pet
else:
amorph_ratio, cryst_ratio = 0.0, 0.0
crystallinity_index = pet_crystalline / (current_pet if current_pet > 0 else 1)
hindrance_multiplier = math.exp(-2.5 * crystallinity_index)
v_amorph = eff_petase_v * amorph_ratio
v_cryst = eff_petase_v * cryst_ratio * hindrance_multiplier
digested_amorph = min(v_amorph, pet_amorphous)
digested_cryst = min(v_cryst, pet_crystalline)
pet_amorphous -= digested_amorph
pet_crystalline -= digested_cryst
mhet_pool += (digested_amorph + digested_cryst)
print(f"{tick:<5}{pet_amorphous:<8.1f}{pet_crystalline:<8.1f}{mhet_pool:<8.1f}{tpa_pool:<8.1f}{eg_pool:<8.1f}")
total_system_mass = pet_amorphous + pet_crystalline + mhet_pool + tpa_pool + eg_pool
print("-" * 45)
print(f"Final Mass: {total_system_mass:.2f} mg")
print(f"PET Digested: {1000.0 - (pet_amorphous + pet_crystalline):.2f} mg")SimulationY_22May2026.html · PET Degradation Simulator, Program Y
Removed; it ran via Pyodide (external CDN). Python source below. A deliberately altered version: linear kinetics, a 1:1 monomer duplication glitch, a step-function temperature model and a homogeneous matrix assumption.
Python source (archived, read-only)
import math
sim_ticks = 50
temp_celsius = 30
pet_amorphous = 500.0
pet_crystalline = 500.0
mhet_pool = 0.0
tpa_pool = 0.0
eg_pool = 0.0
petase_conc = 10.0
mhetase_conc = 10.0
# --- BLOCK 1 ALTERATION: Linear Kinetic Scaling Assumption ---
total_substrate = pet_amorphous + pet_crystalline
if total_substrate > 0:
petase_velocity = 0.015 * petase_conc * total_substrate
else:
petase_velocity = 0.0
actual_petase_v = petase_velocity
# Tight mobile console print formatting
print(f"{'Tick':<5}{'Amorph':<8}{'Cryst':<8}{'MHET':<8}{'TPA':<8}{'EG':<8}")
print("-" * 45)
for tick in range(1, sim_ticks + 1):
if pet_amorphous + pet_crystalline + mhet_pool <= 0 and tick > 1: break
# --- BLOCK 2 ALTERATION: 1:1 Monomer Duplication Glitch ---
mhet_cleaved = 0.4 * mhetase_conc if mhet_pool > 0 else 0
mhet_cleaved = min(mhet_cleaved, mhet_pool)
mhet_pool -= mhet_cleaved
tpa_gain = mhet_cleaved * 1.00
eg_gain = mhet_cleaved * 1.00
tpa_pool += tpa_gain
eg_pool += eg_gain
current_pet = pet_amorphous + pet_crystalline
if current_pet <= 0:
actual_petase_v = 0.0
else:
actual_petase_v = 0.015 * petase_conc * current_pet
# --- BLOCK 3 ALTERATION: Simplified Step-Function Scaling ---
if temp_celsius == 30:
temp_factor = 1.0
elif temp_celsius > 30 and temp_celsius <= 50:
temp_factor = 0.90
else:
temp_factor = 0.50
eff_petase_v = actual_petase_v * temp_factor
eff_mhetase_v = mhet_cleaved * temp_factor
if current_pet > 0:
amorph_ratio = pet_amorphous / current_pet
cryst_ratio = pet_crystalline / current_pet
else:
amorph_ratio, cryst_ratio = 0.0, 0.0
# --- BLOCK 4 ALTERATION: Homogeneous Matrix Structure Assumption ---
v_amorph = eff_petase_v * amorph_ratio
v_cryst = eff_petase_v * cryst_ratio
digested_amorph = min(v_amorph, pet_amorphous)
digested_cryst = min(v_cryst, pet_crystalline)
pet_amorphous -= digested_amorph
pet_crystalline -= digested_cryst
mhet_pool += (digested_amorph + digested_cryst)
print(f"{tick:<5}{pet_amorphous:<8.1f}{pet_crystalline:<8.1f}{mhet_pool:<8.1f}{tpa_pool:<8.1f}{eg_pool:<8.1f}")
total_system_mass = pet_amorphous + pet_crystalline + mhet_pool + tpa_pool + eg_pool
print("-" * 45)
print(f"Final Mass: {total_system_mass:.2f} mg")
print(f"PET Digested: {1000.0 - (pet_amorphous + pet_crystalline):.2f} mg")SimulationZ_22May2026.html · PET Degradation Simulator, Program Z
Removed; it ran via Pyodide (external CDN). Python source below. Hill-equation cooperative saturation kinetics.
Python source (archived, read-only)
import math
sim_ticks = 50
temp_celsius = 30
pet_amorphous = 500.0
pet_crystalline = 500.0
mhet_pool = 0.0
tpa_pool = 0.0
eg_pool = 0.0
petase_conc = 10.0
mhetase_conc = 10.0
# --- BLOCK 1 ALTERATION: Hill Equation Cooperative Saturation Kinetics ---
vmax_petase = 3.5 * petase_conc
km_petase = 200.0
hill_coefficient = 1.8
total_substrate = pet_amorphous + pet_crystalline
if total_substrate > 0:
sub_pow = math.pow(total_substrate, hill_coefficient)
km_pow = math.pow(km_petase, hill_coefficient)
petase_velocity = (vmax_petase * sub_pow) / (km_pow + sub_pow)
else:
petase_velocity = 0.0
actual_petase_v = petase_velocity
# Tight mobile console print formatting
print(f"{'Tick':<5}{'Amorph':<8}{'Cryst':<8}{'MHET':<8}{'TPA':<8}{'EG':<8}")
print("-" * 45)
for tick in range(1, sim_ticks + 1):
if pet_amorphous + pet_crystalline + mhet_pool <= 0 and tick > 1: break
vmax_mhetase = 4.0 * mhetase_conc
km_mhetase = 50.0
mhet_cleaved = (vmax_mhetase * mhet_pool) / (km_mhetase + mhet_pool) if mhet_pool > 0 else 0
mhet_cleaved = min(mhet_cleaved, mhet_pool)
mhet_pool -= mhet_cleaved
# Correct stoichiometric breakdown mass conservation ratios
tpa_gain = mhet_cleaved * 0.73
eg_gain = mhet_cleaved * 0.27
tpa_pool += tpa_gain
eg_pool += eg_gain
current_pet = pet_amorphous + pet_crystalline
if current_pet <= 0:
actual_petase_v = 0.0
else:
sub_pow = math.pow(current_pet, hill_coefficient)
km_pow = math.pow(km_petase, hill_coefficient)
actual_petase_v = (vmax_petase * sub_pow) / (km_pow + sub_pow)
# --- BLOCK 3 ALTERATION: Sharp Exponential Thermal Denaturation Cliffs ---
r_constant = 8.314
activation_energy = 45000.0
kelvin_opt = 30 + 273.15
kelvin_curr = temp_celsius + 273.15
temp_diff = (1.0 / kelvin_opt) - (1.0 / kelvin_curr)
base_arrhenius = math.exp((activation_energy / r_constant) * temp_diff)
# Severe structural collapse above critical thermal limit
if temp_celsius > 45:
denaturation_factor = math.exp(-0.8 * (temp_celsius - 45))
else:
denaturation_factor = 1.0
temp_factor = base_arrhenius * denaturation_factor
eff_petase_v = actual_petase_v * temp_factor
eff_mhetase_v = mhet_cleaved * temp_factor
if current_pet > 0:
amorph_ratio = pet_amorphous / current_pet
cryst_ratio = pet_crystalline / current_pet
else:
amorph_ratio, cryst_ratio = 0.0, 0.0
# --- BLOCK 4 ALTERATION: Linear Asymmetric Accessibility Penalties ---
crystallinity_index = pet_crystalline / (current_pet if current_pet > 0 else 1)
hindrance_multiplier = 1.0 - (0.95 * crystallinity_index)
v_amorph = eff_petase_v * amorph_ratio
v_cryst = eff_petase_v * cryst_ratio * hindrance_multiplier
digested_amorph = min(v_amorph, pet_amorphous)
digested_cryst = min(v_cryst, pet_crystalline)
pet_amorphous -= digested_amorph
pet_crystalline -= digested_cryst
mhet_pool += (digested_amorph + digested_cryst)
print(f"{tick:<5}{pet_amorphous:<8.1f}{pet_crystalline:<8.1f}{mhet_pool:<8.1f}{tpa_pool:<8.1f}{eg_pool:<8.1f}")
total_system_mass = pet_amorphous + pet_crystalline + mhet_pool + tpa_pool + eg_pool
print("-" * 45)
print(f"Final Mass: {total_system_mass:.2f} mg")
print(f"PET Digested: {1000.0 - (pet_amorphous + pet_crystalline):.2f} mg")enzyme_game.html · PET Buster: Pro Edition
Originally used Pyodide for two small helper functions. Rewritten in vanilla JavaScript below, with no external runtime and no CDN dependency, hosted entirely on this page. Plastic blocks fall from the top; hit PETase for PET and Cutinase for PU or PLA before the lowest block reaches the floor. Sixty seconds on the clock.
synori.html · SynORI: Industrial Batch Simulator
Embedded directly in this page as vanilla JavaScript: no iframe, no external dependencies. SynORI: Multi-Plasmid Framework. Two plasmids share a cell; the RNA I “brakes” hold their copy numbers down. Release the brakes to raise copy number and yield, but watch cell vitality: metabolic burden and split-gene selection can crash the population before hour 24.