Skip to content
Merged
12 changes: 9 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
- A *death spell* cast at a group.
- A monster that regenerates (a troll, a thoul, or a vampire).
- A monster whose attack has an effect, like a ghoul's paralysing claw or a wight's level drain.
- A basilisk's or a medusa's gaze, including a basilisk that surprises the party.
- A basilisk's or a medusa's gaze, including a basilisk that surprises the party, whether or not a battle follows.
- A melee attack on a petrified creature.
- A spitting cobra's spit that hits.
- A ghoul or a thoul that attacks while one member in its reach is paralysed and another isn't.
- A monster or an NPC adventurer that attacks while one member in its reach is turned to stone and another isn't.
- A monster that can choose between attack routines: a spitting cobra, a thoul, a mule, a minotaur, a wererat, or a monster of your own with more than one unlabelled routine.
- An attack declared with no `weapon_id` by a member who wields a weapon.
- A wand, staff, rod, or turning that now fizzles.
Expand All @@ -65,9 +68,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
- When a wandering monster interrupts a rest, the full turns the party rested before the monsters came now count (#169). Before, a 48-turn night broken after four full turns cleared neither fatigue nor exhaustion. Now one full turn of rest clears fatigue. Each full turn also counts toward the three that clear exhaustion from a chase, and the next rest adds to that count. A rest interrupted during its first turn still clears nothing. An interrupted night still isn't sleep for preparing spells, and an interrupted day still heals nobody. The fix makes no new draws, and no golden file changed.
- Trolls, thouls, and vampires regenerate in play (#167). Until this release a spawned one never healed, though its template had the ability. A monster whose template has the `regeneration` ability now starts to regenerate when its encounter opens. That's true whether the monster came from a [`SpawnMonsters`][osrlib.crawl.commands.SpawnMonsters] command, a keyed area, or a wandering-monster check. The command that opened the encounter reports an [`EffectAttachedEvent`][osrlib.core.events.EffectAttachedEvent] for each such monster. A hurt troll gets back 3 hit points a round, starting 3 rounds after it last took damage. It never gets back damage from fire or acid. A troll slain while its encounter is still running gets back up 2d6 rounds later and fights again. It stays dead if fire and acid alone did as much damage as its maximum hit points. The session rolls the revival delay on the effects stream. A thoul or a vampire heals every round while it lives. The session releases the effect when the encounter ends, so a troll that is still dead then stays dead. A game recorded under 2.0.1 that met one of these monsters replays differently under this release. No golden file changed.
- Undead that a cleric turns now flee and attack no one, even when the cleric turns only some of a group (#168). Before, the turned members of a partly turned group kept closing and attacking, the cleric who turned them included. Now they break away as a new group, which runs from the battle the way a wholly turned group does. The session reports the split with a [`MonsterFledEvent`][osrlib.crawl.events.MonsterFledEvent] whose `group_id` is the new group's id. The members who weren't turned stay in the original group and fight on, and a policy you registered for that group still chooses their actions. The group's shared treasure stays with the members who fight on, and each turned member takes only the treasure it carries. A turned monster that can't move, such as one caught in a *web*, stays where it is and does nothing. The session skips any action a policy returns for a turned monster. A wholly turned group behaves as before, and no golden file changed.
- When a monster's attack hits in battle, the session applies the effects the attack lists (#167). A ghoul's or a thoul's claw paralyses for 2d4 turns unless the target saves versus paralysis. An elf isn't affected. A carcass crawler's tentacle and a gelatinous cube's touch paralyse the same way, and they affect elves too. A poisonous bite or sting kills unless the target saves versus death. The target dies at once, or when the poison's onset runs out if the monster's poison has one. The session records the death as a poison death, so *neutralize poison* can revive the character. A mummy's touch gives mummy rot, with no save. A wight's, a wraith's, a spectre's, or a vampire's touch drains levels, also with no save. A basilisk's bite and a cockatrice's beak turn the target to stone unless it saves versus petrification. The basilisk's and the medusa's petrifying gaze reaches each character in the party's front rank once a round while the gazer is in melee. The gaze takes no attack roll, and the session no longer rolls the basilisk's gaze as an attack. A character with the `averted_eyes` condition doesn't meet the gaze, and a member who sets the new [`BattleDeclaration.gaze_defense`][osrlib.crawl.commands.BattleDeclaration.gaze_defense] field doesn't meet it either. The adaptations register lists the attack effects that the session leaves to the referee. In a battle against one of these monsters, the session now makes more draws from the combat, effects, and advancement streams. So the same seed and commands give a different battle than they gave under 2.0.1. No golden file changed.
- A basilisk that surprises the party now gazes at every member in its free round, as the OSE SRD's basilisk says: "Characters surprised by a basilisk meet its gaze." The gaze reaches the back rank too, at whatever distance the encounter opened, and each member makes a saving throw versus paralysis, which in B/X also covers petrification, or turns to stone. The gaze takes the place of the round's front-rank gaze, so no member meets it twice. Before, the basilisk gazed in its free round only when it was already in melee, and then only at the front rank. A medusa's free round is unchanged, because her entry has no such rule. In the monster catalog, the basilisk's `surprise` ability is no longer `manual`, and its `params` include `meets_gaze: true`. You don't need to set either.
- When a monster's attack hits in battle, the session applies the effects the attack lists (#167). A ghoul's or a thoul's claw paralyses for 2d4 turns unless the target saves versus paralysis. An elf isn't affected. A carcass crawler's tentacle and a gelatinous cube's touch paralyse the same way, and they affect elves too. A poisonous bite or sting kills unless the target saves versus death. The target dies at once, or when the poison's onset runs out if the monster's poison has one. The session records the death as a poison death, so *neutralize poison* can revive the character. A mummy's touch gives mummy rot, with no save. A wight's, a wraith's, a spectre's, or a vampire's touch drains levels, also with no save. A basilisk's bite and a cockatrice's beak turn the target to stone unless it saves versus petrification. The basilisk's and the medusa's petrifying gaze reaches each character in the party's front rank once a round while the gazer is in melee. The gaze takes no attack roll, and the session no longer rolls the basilisk's gaze as an attack. A character with the `averted_eyes` condition doesn't meet the gaze, and a member who sets the new [`BattleDeclaration.gaze_defense`][osrlib.crawl.commands.BattleDeclaration.gaze_defense] field doesn't meet it either. A blind character can't meet a gaze, so [`resolve_gaze`][osrlib.core.combat.resolve_gaze] spares one too. The adaptations register lists the attack effects that the session leaves to the referee. In a battle against one of these monsters, the session now makes more draws from the combat, effects, and advancement streams. So the same seed and commands give a different battle than they gave under 2.0.1. No golden file changed.
- Every member of a party a basilisk surprises now meets its gaze as the encounter opens, as the OSE SRD's basilisk says: "Characters surprised by a basilisk meet its gaze." Each living member, back rank included, makes one saving throw versus paralysis, which in B/X also covers petrification, or turns to stone. A blind member can't meet the gaze and makes no save. The gaze comes at whatever distance the encounter opened and whatever the monsters' reaction, so it comes in an encounter that never becomes a battle. It comes when the basilisk is surprised too, because a gaze takes no action. The saving throws come among the opening events of [`start_encounter`][osrlib.crawl.encounter.start_encounter], so the command that opened the encounter reports them, whether the encounter came from a [`SpawnMonsters`][osrlib.crawl.commands.SpawnMonsters] command, a keyed area, or a wandering-monster check. A battle that opens from the encounter doesn't repeat the gaze. When the basilisk attacks at once, it doesn't gaze again in its free round, so a member in melee meets its gaze once. Before, a basilisk that surprised the party gazed only once it was in melee, and then only at the front rank. A medusa doesn't do this, because her entry has no such rule. In the monster catalog, the basilisk's `surprise` ability is no longer `manual`, and its `params` include `meets_gaze: true`. You don't need to set either.
- Battle now uses a monster's other attack routines, not only the first. Before, it used only the first routine in the monster's stat block, so a thoul never used a weapon, a mule never bit, and an elephant never trampled, and an effect in a later routine never applied. Now the default policy, [`ScriptedPolicy`][osrlib.crawl.battle.ScriptedPolicy], picks a routine for each melee attack, with equal chance among the first routine and the alternatives the OSE SRD offers. Each round, the spitting cobra either spits or bites, and its bite poisons. The thoul either claws or swings a weapon, the mule kicks or bites, the minotaur gores and bites or swings a weapon, and the wererat bites or uses a weapon. The policy never picks a situational routine, like an elephant's trample. A policy of your own can name one, and battle then rolls it as a melee attack. Battle never rolls a breath, a gaze, or a spell as an attack, even when a policy names one. The policy draws the pick from the monster-action stream, and only for a monster that has a choice. Every other monster draws as before.
- A spitting cobra's spit now blinds, as the OSE SRD's snake entry says: "A hit causes permanent blindness (save vs poison)." Before, a spit that hit did nothing. Now the target makes a saving throw versus death, which in B/X also covers poison, or is blind for good. The SRD's combat rules say "A blind character is unable to attack", so [`ResolveBattleRound`][osrlib.crawl.commands.ResolveBattleRound] refuses an attack from a blind member with `combat.attack.attacker_blind`. The blindness is permanent and *dispel magic* doesn't end it. No spell osrlib runs cures it, so a cure is the referee's call. In the monster catalog, the cobra's spit ability has the tag `blindness` where it had `blinding_spit`, and it's no longer `manual`. A game that looks the ability up with [`MonsterTemplate.ability`][osrlib.core.monsters.MonsterTemplate.ability] passes `"blindness"` now. The save draws from the combat stream, so a battle in which a spit hits plays out differently than before. No golden file changed.
- A ghoul or a thoul now turns from a member it has paralysed and attacks someone else, as the OSE SRD's ghoul entry says: "After paralysing a target, ghouls will attack others." The thoul's entry says the same of thouls. Before, the default policy, [`ScriptedPolicy`][osrlib.crawl.battle.ScriptedPolicy], picked a paralysed member as often as any other. Now the policy passes over a paralysed member while someone who is neither paralysed nor turned to stone is in reach. It attacks a paralysed member only when no one else is in reach, and a paralysed member still comes before a statue. The policy reads the new param `attacks_others` in the monster's `paralysis` ability, not the monster's id, so a monster you define can have it too. In the monster catalog, the ghoul's and the thoul's `paralysis` abilities have `attacks_others: true`. A carcass crawler and a gelatinous cube still attack the members they paralyse, because their entries don't say otherwise. The policy picks a target once a round, so the rest of a ghoul's attacks that round stay on a member its claw has just paralysed. When a ghoul or a thoul passes over a paralysed member, its pick from the monster-action stream changes, so that fight plays out differently than before. No golden file changed.
- A monster or an NPC adventurer no longer attacks a member who was turned to stone while someone else is in reach. Before, the default policies, [`ScriptedPolicy`][osrlib.crawl.battle.ScriptedPolicy] for monsters and [`NpcPartyPolicy`][osrlib.crawl.battle.NpcPartyPolicy] for NPC adventurers, picked a statue as often as any other member of the front rank, so a basilisk kept biting the members it had already turned to stone. A statue is out of the fight, so now both policies pass over one while a member who isn't stone is in reach. A paralysed member comes before a statue. When every member in reach is stone, the attacker picks a statue, as before. The SRD doesn't say this, so the adaptations register records it as a judgement. A monster with no paralysed or petrified member in reach, an NPC adventurer with no statue in reach, and either one with only statues in reach draw from the monster-action stream exactly as before. No golden file changed.
- A trap's saving throw now adds the `modifier` of the trap's [`SaveSpec`][osrlib.core.spells.SaveSpec], as a spell's save does. Before, the session left the modifier out, so a trap you wrote with a bonus or a penalty on its save played as if it had none. The modifier changes whether the save passes, and the dice the session rolls are the same as before (#167).
- Lighting the last oil flask in a pile on the floor with [`LightSource`][osrlib.crawl.commands.LightSource] now leaves the pile when gems, jewellery, or magic items are still in it. Before, the session removed the pile once it had no ordinary items and no coins, which deleted any gems, jewellery, or magic items still in it (#167).
- When a breath weapon or *disintegrate* kills a party member, the magic items that make their saving throw now go to a drop pile on the party's cell in the same command. The party picks them up with [`TakeTreasure`][osrlib.crawl.commands.TakeTreasure] and the feature id `"pile"`. Before, the items stayed in the dead member's inventory, and the commands that hand over or drop an item refuse a dead member, so the party couldn't recover them. [`EquipmentDestroyedEvent`][osrlib.core.events.EquipmentDestroyedEvent]`.saved_items` still lists them, and the draws are unchanged (#167).
Expand Down
Loading
Loading