Skip to content

Badges on events #2

@brisbang

Description

@brisbang

This is a specification for transforming medals and badges into an event-based model. It is based off definitions as at SHA bffba63 (2025-06-24)

There is an order of dependency consideration to make. Currently challenges will invalidate medals/badges. For example, AoB is defined to invalidate the shotguns badge.

This definition inverts the model so that badges/medals will invalidate themselves based on the selected challenge. This to me is sensible because the written definition of the badge/medal is to be on top of the challenge setup.

Similarly some badges refer to medals and for this reason badges will check if a medal exists. Therefore an order of precedence needs to occur so that medal hooks are made before badge hooks.

Events

GameStart()

  • When the game is initialised and before the player takes their first turn.
  • Assumes difficulty and challenges are specified.
  • It could be feasible to split these out into separate events, such as DifficultySelected and ChallengeSelected which would start to reduce options. However given that these events would start to eliminate badges, the UI couldn't really allow the user to 'go back' one screen. Instead the user would have to start world configuration from scratch.
  • The selection of first trait comes from a separate event.

GameEnd()

  • When the player can take no more turns in the game. This event is favoured over player death triggers because a victory state can occur despite player death.
  • Because some badges depend on medals being awarded, (e.g. untouchable or conqueror), game end events need to happen on medals before badges.

LevelBegin()

  • When the level is entered and before the player takes their first turn.

LevelEnd()

  • When the stairs are taken
  • When a victory condition is met

LevelSkip()

  • Thrown when you enter the stairs for bonus levels that were not generated
  • Thrown when you enter the stairs for bonus levels that were available but not taken
  • Thrown when a game starts and the configuration skips various standard levels (e.g. Ao100)

LevelStatusUpdate()

  • Thrown when there is a new status for the level

LevelNuked()

  • Thrown when a nuclear weapon is detonated on the level

LeverPulled()

  • When a lever is pulled for the first time

PlayerDamaged()

  • Thrown when the player takes damage

PlayerLevelUp()

  • Thrown when the player gains a level and before a trait is selected

AssemblyDiscovery()

  • Thrown when an assembly schema is picked up
  • Thrown when an assembly is manufactured

UniqueFirstPickup()

  • Thrown when a specific unique is picked up for the first time. If a unique is discovered multiple times in a play through (or even on the same level) then this event should be triggered multiple times.

MedalGained()

  • Thrown when a medal is awarded

MedalFailed()

  • Thrown when a medal is no longer available

TraitGained()

  • When the player acquires a new trait. Can occur before the first turn.

MonsterDeath()

  • When a monster hp is zero or less

Tick()

  • After a player has decided on their action

Badges

Badges are not available if already earnt (as opposed to Medals).

Technician1
On AssemblyDiscovery(level):
If assembly is new Award

Technician2
On AssemblyDiscovery(level):
If level = 2:
If assembly is new: Award

Technician3
On AssemblyDiscovery(level):
If level = 1
If assembly is new
If there are no remaining Assembly Level 1 to discover: Award

Technician4
On AssemblyDiscovery(level):
If level = 2
If assembly is new
If there are no remaining Assembly Level 2 to discover: Award

Technician5
On AssemblyDiscovery(level):
If assembly is new
If there are no remaining Assemblies to discover: Award

Armorer1
On UniqueFirstPickup()
If notPrevioulsyFound
If the number of uniques = 10: Award

Armorer2
On UniqueFirstPickup()
If notPrevioulsyFound
If the number of uniques = 30: Award

Armorer3
On UniqueFirstPickup()
If notPrevioulsyFound
If the number of not found uniques = 0: Award

Armorer4
On UniqueFirstPickup()
If the total number of picked up uniques = 1000: Award

Armorer5
On UniqueFirstPickup()
If the number of pickups of this unique is 3
The number of pickups of all uniques >= 3: Award

Heroic1
On MedalGained()
If not previously received
If the number of distinct medals awarded = 8: Award

Heroic2
On MedalGained()
If not previously received
If the number of distinct medals awarded = 16: Award

Heroic3
On MedalGained()
If not previously received
If the number of distinct medals awarded = 24: Award

Heroic4
On MedalGained()
If not previously received
If the number of distinct medals awarded = 32: Award

Heroic5
On MedalGained()
If not previously received
If the number of remaining medals not yet awarded = 0: Award

Buac1
On GameStart()
If challenge attempted: D/Q
On GameEnd()
If non-victory: D/Q
Award

Buac2
On GameStart()
If challenge attempted: D/Q
If difficulty < H: D/Q
On GameEnd()
If non-victory: D/Q
Award

Buac3
On GameStart()
If challenge attempted: D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
Award

Buac4
On GameStart()
If challenge attempted: D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Buac5
On GameStart()
If challenge attempted: D/Q
If difficulty < N: D/Q

On Tick()
If Time >= 20 min: D/Q
On GameEnd()
If non-victory: D/Q
Award

Buac6
On GameStart()
If challenge attempted: D/Q
If difficulty < N: D/Q
On PlayerDamaged()
If Damage > 0 D/Q
On GameEnd()
If non-victory: D/Q
Award

Veteran1
On LevelEnd()
If any non-spawned monsters remain: D/Q
On GameEnd()
If non-victory: D/Q
Award

Veteran2
On GameStart()
If difficulty < H then D/Q
On LevelEnd()
If any non-spawned monsters remain: D/Q
On GameEnd()
If non-victory: D/Q
Award

Veteran3
On GameStart()
If difficulty < U then D/Q
On LevelEnd()
If any non-spawned monsters remain: D/Q
On GameEnd()
If non-victory: D/Q
Award

Veteran4
On GameStart()
If difficulty < U then D/Q
On GameEnd()
If non-victory: D/Q
If victory type in (partial/standard) : D/Q
Award

Veteran5
On GameStart()
If difficulty < N then D/Q
On GameEnd()
If non-victory: D/Q
If victory type in (partial/standard) : D/Q
Award

Veteran6
On GameStart()
If difficulty < N then D/Q
On LevelEnd()
If any non-spawned monsters remain: D/Q
On GameEnd()
If non-victory: D/Q
If victory type in (partial/standard) : D/Q
Award

Strongman1
On GameStart()
If challenge then D/Q
On MonsterDeath()
If DamageCause is not in other, melee, knife, chainsaw: D/Q
On GameEnd()
If non-victory: D/Q
Award

Strongman2
On GameStart()
If challenge then D/Q
On MonsterDeath()
If DamageCause is not in other, melee, knife: D/Q
On GameEnd()
If non-victory: D/Q
Award

Strongman3
On GameStart()
If challenge then D/Q
If difficulty < H then D/Q
On MonsterDeath()
If DamageCause is not in other, melee, knife: D/Q
On GameEnd()
If non-victory: D/Q
Award

Strongman4
On GameStart()
If challenge then D/Q
If difficulty < H then D/Q
On MonsterDeath()
If DamageCause is not in other, melee: D/Q
On GameEnd()
If non-victory: D/Q
Award

Strongman5
On GameStart()
If challenge then D/Q
If difficulty < H then D/Q
On LevelEnd()
If any non-spawned monsters remain: D/Q
On MonsterDeath()
If DamageCause is not in other, melee: D/Q
On GameEnd()
If non-victory: D/Q
Award

Strongman6
On GameStart()
If challenge then D/Q
If difficulty < N then D/Q
On MonsterDeath()
If DamageCause is not in other, melee: D/Q
On GameEnd()
If Kill % < 90: D/Q
If non-victory: D/Q
Award

Speedrunner1
OnTick()
If time > 30min then D/Q
On GameEnd()
If non-victory: D/Q
Award

Speedrunner2
On GameStart()
If difficulty < M then D/Q
OnTick()
If time > 25min then D/Q
On GameEnd()
If non-victory: D/Q
Award

Speedrunner3
On GameStart()
If difficulty < H then D/Q
OnTick()
If time > 20min then D/Q
On GameEnd()
If non-victory: D/Q
Award

Speedrunner6
On GameStart()
If difficulty < N then D/Q
OnTick()
If time > 4min then D/Q
On GameEnd()
If non-victory: D/Q
Award

Elite4
On GameStart()
If challenge then D/Q
If difficulty < U then D/Q
On LevelSkip()
If level was available then D/Q
On MedalFailed()
If medal = conqueror: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes conqueror: Award

Elite5
On GameStart()
If challenge then D/Q
If difficulty < N then D/Q
On GameEnd()
If Kill % < 90: D/Q
If non-victory: D/Q
Award

Elite6
On GameStart()
If challenge then D/Q
If difficulty < N then D/Q
On LevelSkip()
If level was available then D/Q
On MedalFailed()
If medal = conqueror: D/Q
On GameEnd()
If non-victory: D/Q
Award

Demonic4
On GameStart()
If challenge then D/Q
If difficulty < N then D/Q
On MedalFailed()
If medal = explorer: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes explorer: Award

Demonic5
On GameStart()
If challenge then D/Q
If difficulty < N then D/Q
On MedalFailed()
If medal is untouchable2 then D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes untouchable2 or untouchable3: Award

*Demonic6
On GameStart()
If challenge then D/Q
If difficulty < N then D/Q
On PlayerDamaged()
If Damage > 0 then D/Q
On LevelEnd()
If non-spawned monster count > 0 then D/Q
On GameEnd()
If non-victory: D/Q
Award

Lava1
On LevelSkip()
If level was available and level in lava pits, Mt Erebus: D/Q
On LevelEnd()
If level = lava pits or level = Mt Erebus
If level was not complete: D/Q
If level was complete: Award

Lava2
On GameStart()
If challenge != "AoI": D/Q
On LevelSkip()
If level was available and level in lava pits, Mt Erebus: D/Q
On LevelEnd()
If level in lava pits, Mt Erebus
If level was not complete: D/Q
If level was complete: Award

Reaper1
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On LevelBegin()
If level in Limbo/Mortuary: Award

Reaper2
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On LevelEnd()
If level in Limbo/Mortuary: Award

Reaper3
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On LevelEnd()
If level in Limbo/Mortuary:
If level is not completed: D/Q
If level is completed: Award

Reaper4
On GameStart()
If difficulty < N: D/Q
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On LevelEnd()
If level in Limbo/Mortuary:
If level is not completed: D/Q
If level is completed: Award

Reaper5
On GameStart()
If difficulty < N: D/Q
If challenge != "AoCn"
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On LevelEnd()
If level in Limbo/Mortuary:
If level is not completed: D/Q
If level is completed: Award

Wall1
On LevelSkip()
If level was available and level in Wall/Containment Area: D/Q
On LevelEnd()
If level in Wall/Containment Area:
If level is not completed: D/Q
If level is completed: Award

Wall2
On GameStart()
If challenge not in "AoB", "AoMr", "AoSh": D/Q
On LevelSkip()
If level was available and level in Wall/Containment Area: D/Q
On LevelEnd()
If level in Wall/Containment Area:
If level is not completed: D/Q
If level is completed: Award

Skull1
On LevelSkip()
If level was available and level in City of Skulls / Abyssal Plains: D/Q
On LevelEnd()
If level in City of Skulls / Abyssal Plains
If level is not completed: D/Q
If level is completed: Award

Skull2
On GameStart()
If challenge not in "AoRA": D/Q
On LevelSkip()
If level was available and level in City of Skulls / Abyssal Plains: D/Q
On LevelEnd()
If level in City of Skulls / Abyssal Plains
If level is not completed: D/Q
If level is completed: Award

Berserker1
On GameStart()
If challenge != "AoB": D/Q
On PlayerLevelUp()
If level = 9: Award

Berserker2
On GameStart()
If challenge != "AoB": D/Q
On GameEnd()
If non-victory: D/Q
Award

Berserker3
On GameStart()
If difficulty < H: D/Q
If challenge != "AoB": D/Q
On GameEnd()
If non-victory: D/Q
Award

Berserker4
On GameStart()
If difficulty < U: D/Q
If challenge != "AoB": D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 75: D/Q
Award

Berserker5
On GameStart()
If difficulty < N: D/Q
If challenge != "AoB": D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 60: D/Q
Award

Berserker6
On GameStart()
If difficulty < N: D/Q
If challenge != "AoB" + "AoMs": D/Q
On GameEnd()
If non-victory: D/Q
Award

Marksman1
On GameStart()
If challenge != "AoMr": D/Q
On PlayerLevelUp()
If level = 16: Award

Marksman2
On GameStart()
If challenge != "AoMr": D/Q
On GameEnd()
If non-victory: D/Q
Award

Marksman3
On GameStart()
If challenge != "AoMr": D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
Award

Marksman4
On GameStart()
If challenge != "AoMr": D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 75: D/Q
Award

Marksman5
On GameStart()
If challenge != "AoMr": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Marksman6
On GameStart()
If challenge != "AoMr" + "AoD": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 75: D/Q
Award

Shotgun1
On GameStart()
If challenge != "AoSh": D/Q
On PlayerLevelUp()
If level = 16: Award

Shotgun2
On GameStart()
If challenge != "AoSh": D/Q
On GameEnd()
If non-victory: D/Q
Award

Shotgun3
On GameStart()
If challenge != "AoSh": D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
Award

Shotgun4
On GameStart()
If challenge != "AoSh": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Shotgun5
On GameStart()
If challenge != "AoSh": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 80: D/Q
Award

Shotgun6
On GameStart()
If challenge != "AoSh" + "AoOC": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 75: D/Q
Award

Lightfoot1
On GameStart()
If challenge != "AoLT": D/Q
On PlayerLevelUp()
If level = 9: Award

Lightfoot2
On GameStart()
If challenge != "AoLT": D/Q
On GameEnd()
If non-victory: D/Q
Award

Lightfoot3
On GameStart()
If challenge != "AoLT": D/Q
If difficulty < H: D/Q
On GameEnd()
If non-victory: D/Q
Award

Lightfoot4
On GameStart()
If challenge != "AoLT": D/Q
If difficulty < U: D/Q
On Tick()
If num turns >= 20000: D/Q
On GameEnd()
If non-victory: D/Q
Award

Lightfoot5
On GameStart()
If challenge != "AoLT": D/Q
If difficulty < N: D/Q
On MonsterDeath()
If DamageCause is in melee, or an item belonging to the group melee: D/Q
On GameEnd()
If non-victory: D/Q
Award

Lightfoot6
On GameStart()
If challenge != "AAoLT": D/Q
If difficulty < N: D/Q
On MonsterDeath()
If DamageCause is in melee, or an item belonging to the group melee: D/Q
On GameEnd()
If non-victory: D/Q
Award

Impatient1
On GameStart()
If challenge != "AoI": D/Q
On PlayerLevelUp()
If level = 9: Award

Impatient2
On GameStart()
If challenge != "AoI": D/Q
On GameEnd()
If non-victory: D/Q
Award

Impatient3
On GameStart()
If challenge != "AoI": D/Q
If difficulty < H: D/Q
On GameEnd()
If non-victory: D/Q
Award

Impatient4
On GameStart()
If challenge != "AoI": D/Q
If class = marine: D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
Award

Impatient5
On GameStart()
If challenge != "AoI": D/Q
If class = technician: D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Impatient6
On GameStart()
If challenge != "AoI" + "AoRA": D/Q
If class = technician: D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 90: D/Q
Award

Confident1
On GameStart()
If challenge != "AoCn": D/Q
On PlayerLevelUp()
If level = 9: Award

Confident2
On GameStart()
If challenge != "AoCn": D/Q
On GameEnd()
If non-victory: D/Q
Award

Confident4
On GameStart()
If challenge != "AoCn": D/Q
If difficulty < U: D/Q
On LevelEnd()
If non-spawned unique count > 0: D/Q
On GameEnd()
If non-victory: D/Q
Award

Purity3
On GameStart()
If challenge != "AoP": D/Q
On GameEnd()
If non-victory: D/Q
Award

Purity4
On GameStart()
If challenge != "AoP": D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
Award

Purity5
On GameStart()
If challenge != "AoP": D/Q
If difficulty < N: D/Q
If class != "marine": D/Q
On GameEnd()
If non-victory: D/Q
Award

Purity6
On GameStart()
If challenge != "AoP" + "AoRA": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

RedAlert1
On GameStart()
If challenge != "AoRA": D/Q
On PlayerLevelUp()
If level = 16: Award

RedAlert2
On GameStart()
If challenge != "AoRA": D/Q
On GameEnd()
If non-victory: D/Q
Award

RedAlert3
On GameStart()
If challenge != "AoRA": D/Q
On LevelEnd()
If non-spawned unique count > 0: D/Q
On GameEnd()
If non-victory: D/Q
Award

RedAlert4
On GameStart()
If challenge != "AoRA": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

RedAlert5
On GameStart()
If challenge != "AoRA": D/Q
If difficulty < U: D/Q
On LevelEnd()
If non-spawned unique count > 0: D/Q
On GameEnd()
If non-victory: D/Q
Award

RedAlert6
On GameStart()
If challenge != "AAoRA": D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 80: D/Q
Award

Darkness1
On GameStart()
If challenge != "AoD": D/Q
On PlayerLevelUp()
If level = 9: Award

Darkness2
On GameStart()
If challenge != "AoD": D/Q
On GameEnd()
If non-victory: D/Q
Award

Darkness3
On GameStart()
If challenge != "AoD": D/Q
If difficulty < H: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 80: D/Q
Award

Darkness4
On GameStart()
If challenge != "AoD": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Darkness5
On GameStart()
If challenge != "AoD": D/Q
If difficulty < N: D/Q
On MedalFailed()
If medal = explorer: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes explorer: Award

Carnage1
On GameStart()
If challenge != "AoMC": D/Q
On PlayerLevelUp()
If level = 16: Award

Carnage2
On GameStart()
If challenge != "AoMC": D/Q
On GameEnd()
If non-victory: D/Q
Award

Carnage3
On GameStart()
If challenge != "AoMC": D/Q
If difficulty < H: D/Q
On MedalFailed()
If medal = untouchable1: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes untouchable1, untouchable2, untouchable3: Award

Carnage4
On GameStart()
If challenge != "AoMC": D/Q
If difficulty < U: D/Q
On MedalFailed()
If medal = untouchable2: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes untouchable2, untouchable3: Award

Carnage5
On GameStart()
If challenge != "AoMC": D/Q
If difficulty < N: D/Q
On MedalFailed()
If medal = untouchable3: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes untouchable3: Award

Masochism3
On GameStart()
If challenge != "AoMs": D/Q
On GameEnd()
If non-victory: D/Q
Award

Masochism4
On GameStart()
If challenge != "AoMs": D/Q
If difficulty < H: D/Q
On TraitGained()
If trait = Bad: D/Q
On GameEnd()
If non-victory: D/Q
Award

Masochism5
On GameStart()
If challenge != "AoMs": D/Q
If difficulty < N: D/Q
On TraitGained()
If trait in (Iro, Bad): D/Q
On GameEnd()
If non-victory: D/Q
Award

Masochism6
On GameStart()
If challenge != "AAoMs": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Century1
On GameStart()
If challenge != "Ao100": D/Q
On LevelEnd()
If level = 16: Award

Century2
On GameStart()
If challenge != "Ao100": D/Q
On LevelEnd()
If level = 51: Award

Century3
On GameStart()
If challenge != "Ao100": D/Q
On GameEnd()
If non-victory: D/Q
Award

Century4
On GameStart()
If challenge != "Ao100": D/Q
If difficulty < U: D/Q
On GameEnd()
If non-victory: D/Q
Award

Century5
On GameStart()
If challenge != "Ao100": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Century6
On GameStart()
If challenge != "AAo666": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Pacifism1
On GameStart()
If challenge != "AoPc": D/Q
On PlayerLevelUp()
If level = 16: Award

Pacifism2
On GameStart()
If challenge != "AoPc": D/Q
On GameEnd()
If non-victory: D/Q
Award

Pacifism3
On GameStart()
If challenge != "AoPc": D/Q
OnTick()
If game time >= 10 min: D/Q
On GameEnd()
If non-victory: D/Q
Award

Pacifism6
On GameStart()
If challenge != "AAoPc": D/Q
On MonsterDeath()
If total kill count > 1: D/Q
On GameEnd()
If non-victory: D/Q
Award

Everyman3
On GameStart()
If challenge != "AoHu": D/Q
On GameEnd()
If non-victory: D/Q
Award

Everyman4
On GameStart()
If challenge != "AoHu": D/Q
On MedalFailed()
If medal = conqueror: D/Q
On GameEnd()
If non-victory: D/Q
Award

Everyman5
On GameStart()
If challenge != "AoHu": D/Q
If difficulty < U: D/Q
On MedalFailed()
If medal = conqueror: D/Q
On GameEnd()
If non-victory: D/Q
If medals awarded includes conqueror: Award

Everyman6
On GameStart()
If challenge != "AAoHu": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Confident3
On GameStart()
If challenge != "AoOC": D/Q
On GameEnd()
If non-victory: D/Q
Award

Confident5
On GameStart()
If challenge != "AoOC": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
If non-spawned kill percent < 80: D/Q
Award

Arena1
On LevelSkip()
If level = arena: D/Q
On LevelEnd()
If level = arena
If level is completed: Award

Arena2
On GameStart()
If difficulty < U: D/Q
On LevelSkip()
If level = arena: D/Q
On LevelEnd()
If level = arena
If level is completed: Award

Arena3
On GameStart()
If challenge != "AoMr": D/Q
If difficulty < U: D/Q
On LevelSkip()
If level = arena: D/Q
On LevelEnd()
If level = arena
If level is completed: Award

Arena4
On GameStart()
If difficulty < N: D/Q
On LevelSkip()
If level = arena: D/Q
On LevelEnd()
If level = arena
If level is completed: Award

Arena5
On GameStart()
If difficulty < N: D/Q
If challenge != "AoB": D/Q
On LevelSkip()
If level = arena: D/Q
On LevelEnd()
If level = arena
If level is completed: Award

Hellgate1
On LevelSkip()
If level = hellgate: D/Q
On LevelEnd()
If level = hellgate
If level is completed: Award

Hellgate2
On LevelSkip()
If level = hellgate: D/Q
On PlayerDamaged()
If level = hellgate: D/Q
On LevelEnd()
If level = hellgate
If level is completed: Award

Hellgate3
On GameStart()
If difficulty < M: D/Q
On LevelSkip()
If level = tower_of_babel: D/Q
On PlayerDamaged()
If level = tower_of_babel: D/Q
On LevelEnd()
If level = tower_of_babel
If level is completed: Award

Hellgate4
On GameStart()
If difficulty < N: D/Q
On LevelSkip()
If level = hellgate: D/Q
On PlayerDamaged()
If level = hellgate: D/Q
On LevelEnd()
If level = hellgate
If level is completed: Award

Hellgate5
On GameStart()
If difficulty < U: D/Q
On LevelSkip()
If level in (hellgate, tower_of_babel): D/Q
On PlayerDamaged()
If level in (hellgate, tower_of_babel): D/Q
On LevelEnd()
If level = tower_of_babel --Assumes Tower of babel is second
If level is completed: Award

Death3
On LevelSkip()
If level = unholy_cathedral: D/Q
On LevelEnd()
If level = unholy_cathedral
If level is completed: Award

Death4
If difficulty < N: D/Q
On LevelSkip()
If level = unholy_cathedral: D/Q
On LevelEnd()
If level = unholy_cathedral
If level is completed: Award

Death5
If difficulty < N: D/Q
On TraitGained()
If trait = "Bru": D/Q
On LevelSkip()
If level = unholy_cathedral: D/Q
On LevelEnd()
If level = unholy_cathedral
If level is completed: Award

Arachno1
On LevelSkip()
If level = spiders_lair: D/Q
On LevelEnd()
If level = spiders_lair
If level is completed: Award

Arachno2
On GameStart()
If challenge != "AoD": D/Q
On LevelSkip()
If level = spiders_lair: D/Q
On LevelEnd()
If level = spiders_lair
If level is completed: Award

Vaults1
On LevelSkip()
If level = the_vaults: D/Q
On LevelBegin()
If level = the_vaults: Award

Vaults2
On LevelSkip()
If level = the_vaults: D/Q
On LevelNuked()
If level = the_vaults: D/Q
On LevelStatusUpdate()
If level = the_vaults
If status in (1, 3): Award

Vaults3
On LevelSkip()
If level = the_vaults: D/Q
On LevelNuked()
If level = the_vaults: D/Q
On LevelStatusUpdate()
If level = the_vaults
If status in (2, 4): Award

Vaults4
On LevelSkip()
If level = the_vaults: D/Q
On LevelNuked()
If level = the_vaults: D/Q
On LevelStatusUpdate()
If level = the_vaults
If status = 3: D/Q
If status = 2: Award

Vaults5
On GameStart()
If difficulty < U: D/Q
On LevelSkip()
If level = the_vaults: D/Q
On LevelNuked()
If level = the_vaults: D/Q
On LevelStatusUpdate()
If level = the_vaults
If status = 3: D/Q
If status = 2: Award

Medals

There are issues here with preventing cross-over medals. So if I have a fist only run ("fist") then I can't also get "shotguns" or "knives". The rules below prioritise finding clauses that naturally eliminate cross-over instead of restricting getting both at once.

Killall
On LevelEnd()
If non-unique monster count > 0: D/Q
On GameEnd()
If non-victory: D/Q
Award

Killfew
On GameStart()
If challenge in ("AoPc", "AAoPc): D/Q
On GameEnd()
If non-victory: D/Q
If non-unique kill percentage < 10: Award

Shotguns
Technically I'd say that AoB no longer needs inclusion due to the shotgun kill count check
On GameStart()
If challenge in ("AoSh", AoPc, AAoPc): D/Q
On MonsterDeath()
If DamageCause is not in other, melee, shotgun group: D/Q
On GameEnd()
If non-victory: D/Q
If shotgun group kill count = 0: D/Q
Award

Pistols
Technically I'd say that AoB no longer needs inclusion due to the pistol kill count check
On GameStart()
If challenge in (AoB, AoMr, AoPc, AAoPc): D/Q
On MonsterDeath()
If DamageCause is not in other, melee, pistol group: D/Q
On GameEnd()
If non-victory: D/Q
If pistol group kill count = 0: D/Q
Award

Knives
On GameStart()
If challenge in "AoPc", "AAoPc": D/Q
On MonsterDeath()
If DamageCause is not in other, melee, knife: D/Q
On GameEnd()
If non-victory: D/Q
If knife kill count = 0: D/Q
Award

Fist
On GameStart()
If challenge in "AoPc", "AAoPc": D/Q
On MonsterDeath()
If DamageCause is not in other, melee: D/Q
On GameEnd()
If non-victory: D/Q
If melee kill count = 0: D/Q
Award

Zen
On GameStart()
If challenge in "AoPc", "AAoPc": D/Q
On MonsterDeath()
If DamageCause is not in other: D/Q
On GameEnd()
If non-victory: D/Q
Award

Uac1
On MedalGained()
If medal = Uac3: D/Q
On GameEnd()
If kill-streak between 25 and 49: Award

Uac2
On MedalGained()
If medal = Uac3: D/Q
On GameEnd()
If kill-streak between 50 and 99: Award

Uac3
On MonsterDeath()
If kill-streak >= 100: Award

Icarus1
On GameStart()
If challenge in "AoCn", "AoOC": D/Q
On Tick()
If Number of turns >= 40000: D/Q
On GameEnd()
If non-victory: D/Q
Award

Icarus2
On GameStart()
If challenge in "AoCn", "AoOC": D/Q
On Tick()
If Number of turns >= 20000: D/Q
On GameEnd()
If non-victory: D/Q
Award

Gambler
On GameStart()
If challenge in "Ao100", "AAo666": D/Q
On LeverPulled()
If number of levers pulled > 24: Award

Aurora
On GameStart()
If challenge in "Ao100", "AAo666": D/Q
On UniqueFirstPickup()
If number of uniques > 3: Award

Explorer
On GameStart()
If challenge in "AoCn", "Ao100", "AAo666", AoOC: D/Q
On LevelSkip()
If level was available: D/Q
On GameEnd()
If non-victory: D/Q
Award

Conqueror
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On LevelSkip()
If level was available: D/Q
On LevelEnd()
If level was not completed: D/Q
On GameEnd()
If non-victory: D/Q
Award

Competn1
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On Tick()
If game time >= 30 min: D/Q
On GameEnd()
If non-victory: D/Q
Award

Competn2
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On Tick()
If game time >= 20 min: D/Q
On GameEnd()
If non-victory: D/Q
Award

Competn3
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On Tick()
If game time >= 10 min: D/Q
On GameEnd()
If non-victory: D/Q
Award

Fallout1
On GameStart()
If challenge in "AoRA", "AAoRA", "Ao100", "AAo666": D/Q
On GameEnd()
If levels nuked between 3 and 5: Award

Fallout2
On GameStart()
If challenge in "AoRA", "AAoRA", "Ao100", "AAo666": D/Q
On GameEnd()
If levels nuked between 6 and 11: Award

Fallout3
On GameStart()
If challenge in "AoRA", "AAoRA", "Ao100", "AAo666": D/Q
On LevelNuked()
If levels nuked = 12: Award

Ironskull1
On GameStart()
If challenge in "Ao100", "AAo666": D/Q
On PlayerDamaged()
If total damage >= 5000: Award

Untouchable1
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On PlayerDamaged()
If total damage >= 500: D/Q
On GameEnd()
If non-victory: D/Q
If player damage >= 200: Award

Untouchable2
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On PlayerDamaged()
If total damage >= 200: D/Q
On GameEnd()
If non-victory: D/Q
If player damage >= 50: Award

Untouchable3
On GameStart()
If challenge in "AoCn", AoOC: D/Q
On PlayerDamaged()
If total damage >= 50: D/Q
On GameEnd()
If non-victory: D/Q
Award

Experience1
On GameStart()
If challenge in (AoPc, AAoPc): D/Q
On GameEnd()
If level between 20 and 24: Award

Experience2
On GameStart()
If challenge in (AoPc, AAoPc): D/Q
On PlayerLevelUp()
If level >= 25: Award --Could someone get so much experience from a monster that they skip level 25? Who knows!

Purple
On GameStart()
If challenge in (AoPc, AAoPc): D/Q
On PlayerDeath()
If level >= 20: Award

Mortuary
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On LevelEnd()
If level in Limbo/Mortuary:
If level is not completed: D/Q
If damage taken on level = 0: D/Q --Mortuary2
Award

Mortuary2
On LevelSkip()
If level was available and level in Limbo/Mortuary: D/Q
On PlayerDamaged()
If level in Limbo/Mortuary: D/Q
On LevelEnd()
If level in Limbo/Mortuary:
If level is not completed: D/Q
Award

Armory1
On LevelSkip()
If level was available and level in Hell's Armory/Deimos Lab: D/Q
On LevelEnd()
If level in Hell's Armory/Deimos Lab:
If level is not completed: D/Q
If damage taken on level = 0: D/Q --Armory2
Award

Armory2
On LevelSkip()
If level was available and level in Hell's Armory/Deimos Lab: D/Q
On PlayerDamaged()
If level in Hell's Armory/Deimos Lab: D/Q
On LevelEnd()
If level in Hell's Armory/Deimos Lab:
If level is not completed: D/Q
If damage taken on level = 0: D/Q --Armory2
Award

EverySoldier
On GameStart()
If challenge != "AoHu": D/Q
On LevelSkip()
If level was available and level in The Wall/Containment Area: D/Q
On LevelEnd()
If level in The Wall/Containment Area:
If level is not completed: D/Q
Award

Cyberdemon1
On LevelSkip()
If level = tower_of_babel: D/Q
On PlayerDamaged()
If level = tower_of_babel: D/Q
On LevelNuked()
If level = tower_of_babel: D/Q
On MonsterDeath()
If monster = Cyberdemon: Award

Mastermind1
On LevelSkip()
If level = dis: D/Q
On PlayerDamaged()
If level = dis: D/Q
On LevelNuked()
If level = dis: D/Q
On MonsterDeath()
If monster = Mastermind: Award

Dragonslayer2
On MonsterDeath()
If monster = Apostle: Award

Gargulec1
On GameStart()
If challenge != "AoB": D/Q
If difficulty >= U: D/Q
On LevelEnd()
If any non-spawned monsters remain: D/Q
On GameEnd()
If non-victory: D/Q
Award

Gargulec2
On GameStart()
If challenge != "AoB": D/Q
If difficulty < U: D/Q
On LevelEnd()
If any non-spawned monsters remain: D/Q
On GameEnd()
If non-victory: D/Q
Award

Dervis
On GameStart()
If challenge != "Ao100": D/Q
If difficulty < N: D/Q
On GameEnd()
If non-victory: D/Q
Award

Thomas
On GameStart()
If challenge != "AoHu": D/Q
On MedalFailed()
If medal = conqueror: D/Q
On GameEnd()
If non-victory: D/Q
Award

Cleric
On MonsterDeath()
If monster = Mastermind
If weapon != uberetta: D/Q
Award

Dragonslayer
On MonsterDeath()
If monster = Mastermind
If weapon != udragon: D/Q
Award

Dragonslayed
On PlayerDeath()
If weapon = udragon: Award

Chessmaster1
On GameStart()
If difficulty != U: D/Q
If challenge not in 'AoMs', 'AoI': D/Q
On LevelSkip()
If level = Hell's Arena: D/Q
On LevelEnd()
If level = Hell's Arena
If level not completed: D/Q
Award

Chessmaster2
On GameStart()
If difficulty < N: D/Q
If challenge not in 'AoMs', 'AoI': D/Q
On LevelSkip()
If level = Hell's Arena: D/Q
On LevelEnd()
If level = Hell's Arena
If level not completed: D/Q
Award

HellChampion
On LevelSkip()
If level = Hell's Arena: D/Q
On LevelEnd()
If level = Hell's Arena
If level not completed: D/Q
If player damage on level = 0: D/Q
Award

HellChampion2
On GameStart()
If difficulty >= N: D/Q
On LevelSkip()
If level = Hell's Arena: D/Q
On PlayerDamage()
If level = Hell's Arena: D/Q
On LevelEnd()
If level = Hell's Arena
If level not completed: D/Q
Award

HellChampion3
On GameStart()
If difficulty < N: D/Q
On LevelSkip()
If level = Hell's Arena: D/Q
On PlayerDamage()
If level = Hell's Arena: D/Q
On LevelEnd()
If level = Hell's Arena
If level not completed: D/Q
Award

EverySpider
On GameStart()
If challenge != 'AoHu': D/Q
On LevelSkip()
If level = Spider's Lair: D/Q
On LevelEnd()
If level = Spider's Lair:
If level not completed: D/Q
Award

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions