-
Notifications
You must be signed in to change notification settings - Fork 0
Description
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