Skip to content

v1.1.11: Team HQ bonuses, bounties, character deletion clean-up, and fixes - #152

Merged
binary-knight merged 42 commits into
mainfrom
release-1.1.11
Sep 24, 2026
Merged

binary-knight merged 42 commits into
mainfrom
release-1.1.11

Conversation

@binary-knight

@binary-knight binary-knight commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Version 1.1.11. Release notes: DOCS/release-notes/RELEASE_NOTES_1.1.11.md; Steam text: DOCS/release-notes/steam/STEAM_RELEASE_NOTES_1.1.11.txt.

Changes

  • Team HQ: the Armory, Barracks, Infirmary and Training bonuses reach every hit, potion and combat XP award they name. Each has a coverage test that scans the source and lists its exclusions. The levels are the team's current ones, read again when older than a minute. The status screen shows them.
  • Teams and guilds: rankings count real members. Teams with no player, NPC or online member are removed with the world save. Leadership passes to the highest-level remaining player member when a leader leaves, is deleted or dies for good.
  • Bounties: beating a WANTED target counts in duels, spares and the Inn challenge. A Crown bounty on a player is paid to the duel winner at the posted amount (BountyGold is now saved), once across processes through the bounty_claims table. A failed claim write leaves the bounty open.
  • Character deletion: a same-name character starts clean. Deletion ends the character's reign, passes on its team and guild, removes its quests, bounties, mail and auction listings, and claims the removed bounties. A player or NPC with the same name is left alone. The death-cap permadeath deletes the dying character.
  • Rewards: an Old God kill pays once. The leader's Level x 6000 XP / Level x 1500 gold arrives in two payments: the fight's share, then the rest after the god's scene. Wilderness gold finds pay on the dungeon scale. The Alchemist's Potion Mastery reaches every healing potion. World boss rewards use the current Training level.
  • Other: a spell short of mana shows the mana needed. Doubled menu key markers are removed. Winning the throne from an NPC king is not a kill.

Decisions

  • Noctura's betrayal pays both rewards, and secret bosses pay flat XP on top of the fight: both kept as they are.
  • A Crown bounty on a player pays the duel winner.
  • A team's leader passes to the next highest-level member.

Deferred to 1.1.12

  • NPC grudge and NPC marriage clean-up on deletion. Another process's NPC save or the world sim's marriage registry restores them.
  • A stale process's ordinary save can write back a deleted king. The court write on every save is unversioned.
  • The login clean-up of quests on dead NPCs pays without the claim guard (main's code).
  • A decree posted while the NPC roster rebuilds is recorded as an NPC bounty (deliberate: a namesake NPC's bounty must not become a player's).
  • Player bounties posted before 1.1.11 have no IsPlayerBounty and are not paid in duels.
  • A removed team's war and siege records stay under its name.
  • A guild whose remaining members are all banned or emergency accounts has no leader until an admin promotes one.
  • The remaining rows of the same-name recreation map (character deletion).

Not in this release

  • The Electron client is shelved.
  • Harness randomness is unseeded.
  • CombatBuffConsumptionTests.Defeat still fails intermittently.

Tests

1,568 passing, up from 1,377.

binary-knight and others added 30 commits September 23, 2026 16:32
Ten labels carried their own key marker while the code writing them added
one too:
- the Inn's patron list: "[0] [0] Return to inn menu";
- the screen-reader main menu's language line: "L. L. Language";
- an inventory item's Equip, Drop and Back options: "[E] [E] Equip Item";
- the Dark Alley's loaded-dice calls: "[1] [1] Call now".
Each label was used only there, so the marker is removed from the text, in
all five languages. A test checks every place where the code writes the
marker, so a label carrying one again fails.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The rankings read a stored member count that was refreshed only when
someone opened that team's roster, so teams with players in them showed
0 members. The count is now counted each time the teams are read.

A team that no player's save names (banned players included), no NPC
carries and no online player has is now removed with the world save, with
its upgrades and vault, so a later team of the same name starts fresh.
The delete rechecks the player saves in the same statement.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The levels were read at login and after the buyer's own upgrade only, so
a player who joined a team had no bonus until the next login, a
teammate's upgrade reached nobody else, and a player who left a team
kept the bonus for the rest of the session.

TeamHQBonus now holds the four bonuses and reads the team's levels in
one query. They are read at login, on create and join, after an upgrade,
and at the start of every fight (both duellists, a defender's by its own
team). They count only while their team is still the player's team, and
never go into the save. The existing readers take their level from it;
the bonuses' reach is unchanged here.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
A malformed save cannot say which team it names, so its player could be
the last member of a team the cleanup would remove. While any save is
malformed the cleanup removes nothing and logs whose saves they are; the
delete itself rechecks this in the same statement (supervisor review).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The Active Buffs section appeared only when another buff or one of
certain classes turned it on, so a Warrior, Barbarian, Assassin, Ranger,
Sage, Bard or Mystic Shaman whose only bonus was the team's never saw it.
The team's bonuses now turn the section on, are read fresh when the screen
opens, and are shown in all five languages. The Infirmary's upgrade text
says "potion healing", which is what it improves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The fight's victory paid the god monster's Experience and Gold, the
god-defeated handler paid Level x 2000 XP and Level x 500 gold again, and
the dungeon added them a third time. The handler now pays once, at three
times the old per-level amount (Level x 6000 XP, Level x 1500 gold) so a
kill is worth what it was, with the Team HQ Training bonus on the XP.
Noctura's betrayal fight keeps its reward as it was.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The Armory multiplied attack power in the basic swing only, before armor
and ten other modifiers; Power Attack, Backstab, abilities, spells, PvP,
the world boss and the scripted fights had none of it.

It now multiplies the damage of each hit, after every other modifier and
just before it lands: the four shared PvE helpers, every ability and spell
effect that writes enemy HP directly, Corrupting Touch at cast, the Searing
Totem, both sides of a duel, the world boss (before the level ratio and
the round cap), the castle siege, the prison break and the Malachar fight.
Riders, reflect, damage-over-time ticks and repeats of a boosted hit are
left as they are. A test reads CombatEngine and fails on any enemy HP
write that neither applies it nor says why not.

The texts now say "damage dealt" in all five languages.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The Barracks added to defence in the monster basic attack only, before
the minimum floor and the caps; specials, boss abilities, Manwe, the boss
channel, AoE and corruption, grouped players, PvP, the world boss and the
scripted fights had none of it.

It now divides the damage of each hit by 1 + 5% per level, as the last
modifier before it lands and before anything computed from the final
number (divine intervention, sacrifice, reflect, drain heals). Where the
path has an anti-tank minimum, the minimum is applied again afterwards,
without ever raising a hit above its value before the Barracks. In a
duel the attacker's Armory applies first, then the defender's Barracks.
Damage-over-time ticks, disease, drugs and the world boss's telegraphed
strikes (answered by bracing) are left as they are. A test reads
CombatEngine and fails on any player HP write that neither applies it
nor says why not.

The status screen shows the real reduction ("-9% damage taken" at level
2), and the texts say "damage taken" in all five languages.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The Infirmary improved the quick-heal command only, and before the
difficulty multiplier. Drinking by the item key, the automatic potions
after a fight, potions given to allies, the quick potion in town, Home,
every dungeon potion menu, a group follower's potions, a duel defender's
potion and the world boss had none of it.

It now increases what each healing potion restores, after every other
modifier and before the cap to missing HP, using the bonus of the
potion's owner (the character whose potion is used). The potion menus'
estimates of what a potion heals and how many are needed use the same
number. A test reads every file under Scripts and fails on any
healing-potion use that neither applies it nor says why not.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The Training bonus was applied to the whole victory pot before fatigue,
the early-game multiplier and the split, so NPC teammates shared in the
leader's bonus; PvP wins, retreats' own share and every flat reward for
winning a fight (floor bosses, secret bosses, bounties, gang wars, the
Gauntlet, the tournament, Seth Able, the portal guardian, the duelist,
the prison break, Malachar, a bounty paid on a kill, saving a god in the
fight, Noctura's betrayal, the world boss) had none of it.

It now goes on each player's own XP, after every other modifier and after
any split, exactly once: the leader's share, each grouped player's own
share with their own levels, and each flat combat reward. Non-combat XP,
NPC and companion shares and the Rat King's dice game are left as they
are. A test reads every file under Scripts and fails on any XP award that
neither applies it nor says why not.

Also: a Barracks test compared one seeded swing with dodging on unseeded
dice; it now compares only swings that land.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
A level-36 player found about 150 gold in a ruins treasure or a foraged
valuable, where the matching dungeon finds pay 3,600 to 10,800 (player
report: "low by a factor of 100"). The wilderness finds grew by 3 to 20
gold a level; the dungeon's grow by 100 to 300.

They now pay what the matching dungeon find pays, at the level the
wilderness fights use (the region's minimum or the player's, whichever
is higher): a small find like the dungeon's small find, a medium find
and a ruins treasure like a treasure room, a large find a notch above a
chest. Wilderness trips stay capped at four a day and two revisits.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Only the street fights told the quest system an NPC had been beaten. A
duel (the Dormitory, the Dark Alley and its pit, the Inn, the Arena),
sparing an NPC who surrendered, and the Inn's challenge did not, so the
bounty was never paid and "Defeat <name>" stayed at 0/1 however many
times the target was beaten (player report: four times).

QuestSystem.RecordNPCDefeat pays any bounty on the NPC and records the
objective. A duel won against an NPC or ended by sparing one calls it,
and so does the Inn challenge. A player loaded from a save is not an NPC
and is left alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- Empty-team cleanup: it ran on an NPC roster that login restores clear
  and refill, and it could delete a team a player joined after its
  snapshot. It now skips an untrustworthy roster, removes a team only
  when it has stayed empty for 30 minutes, and checks online players
  again right before the delete.
- The fight-start HQ refresh enumerated the live party list, which other
  sessions change; it enumerates a copy.
- Two sessions beating the same target at once could both be paid the
  bounty; finding and claiming it now happen under one lock.
- Sparing a target, or beating an Inn patron, met kill-only assassination
  contracts; only a kill does now.
- Weapon enchant procs on a basic swing, Power Attack and the off-hand
  scale from the Armory-boosted hit again.
- The world boss's telegraphed strikes and channels apply the Barracks.
- An Old God's fight still paid the engine's 10-XP floor; the handler's
  single payout is the only one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- Joining a team and the empty-team cleanup's last check and delete now
  hold one gate (TeamMembershipGate), so a join between them can no
  longer lose the team, its upgrades and vault.
- A character archived by permadeath, restorable for seven days, still
  counts as a member of its team.
- A duel defender loaded from a save keeps its team, so it fights with
  its own team's HQ bonuses; an echo keeps none.
- Sparing an assassination target no longer meets the contract's
  objective, so it cannot be turned in by hand either.
- An Old God's fight pays the god's Level x 2000 XP and x 500 gold again,
  shared by grouped players and allies like any victory; zeroing it took
  their share away. The god-defeated handler adds the leader's Level x
  4000 XP and x 1000 gold once, so the leader's total is what it was.
- The ability off-hand and a teammate's swing pass the Armory-boosted hit
  to their enchantment riders like every other caller; the Shaman weapon
  enchant and a fixed poison value, which do not come from the hit, take
  the Armory themselves.
- A test pins the empty-team grace period at 30 minutes or more.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- The in-process gate between a team join and the empty-team cleanup did
  not reach a cleanup or a join running in another process. A successful
  join check now stamps the team's last_join_at in the database, and the
  cleanup's delete leaves a team alone for ten minutes after a join; the
  gate is gone.
- The Dormitory wake-up brawl brings the guest back after the fight, but
  a won brawl counted as a kill and could meet an assassination contract.
  PlayerVsPlayer takes a lethal flag; that brawl passes false.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
…eity

A player deleted a character and created a new one with the same name;
the new one kept the old board quests and chosen deity. Deleting from
character select or an alt slot, and both admin deletes, never ran the
purge permadeath runs; the deity was cleared by the account key while it
is stored by display name; the shared quest list was never cleared for
a new character; and single-player restored every character's deity
from every save.

- A new character clears anything left under its name at creation:
  deity (any case), quests it claimed or was offered, the Crown's WANTED
  bounties on it, and relationships. Display names are unique.
- Every online delete (character select, alt slot, both admin consoles,
  both permadeath paths) runs one purge first: the existing SQL and hook
  purge, plus queued bequests, pending gold transfers, undelivered world
  boss rewards, quests and WANTED bounties, the guild cache, NPC spouses
  and children. A test fails on any delete that skips it.
- Single-player: the slot delete goes through the save system and clears
  the deity by name; loading a save restores only that character's deity.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- The delete purge and the new-character clean-up pushed this process's
  whole quest list to the shared record; a delete in a fresh process,
  which has not loaded the shared quests, overwrote other players'. They
  now remove the character's quests from the shared record in place.
- The guild cache was also forgotten by display name, which can be
  another account's key; only the account key is used now.
- A character named after an NPC removed the Crown's bounty on that NPC.
  Only a bounty posted on a player (no title key) is removed, and never
  for a name an NPC carries.
- The admin deletes purged before deleting and ignored a failed delete,
  leaving a living character purged; they now purge only after the
  delete succeeds, and say when it failed.
- The delete guard ignores commented-out code (supervisor review).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- A bounty posted on a player now carries IsPlayerBounty, saved and
  loaded with the quest. A marked bounty is removed with its character
  even when an NPC shares the name; an unmarked legacy bounty counts as
  a player's only when the NPC roster is complete and no NPC has that
  name, so a legacy NPC bounty is never taken for one.
- The castle siege's fight with the king applies the Barracks to the
  king's hits, as the guard phases already do.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- A new charge on a player topped up any Crown bounty of that name, an
  NPC's included, and left a legacy player bounty unmarked; it now tops
  up only a bounty on the player and marks it.
- Beating an NPC could pay, and meet the objective of, a bounty posted on
  a player of the same name (the player could collect their own); the
  NPC-defeat payout and objectives now skip player bounties.
- The castle siege fights outside CombatEngine and never read the team's
  current HQ levels; it reads them when the siege starts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The Castle's crime report and the royal decree post bounties through
PostBountyOnPlayer, including on NPCs; marking every one as a player
bounty made a paid bounty on an NPC uncollectable (review). It takes
onPlayer: the crime report passes false, the royal decree passes false
for a name an NPC carries, and a top-up follows the same distinction.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The decree took "no NPC has this name" as proof the target is a player,
but during another session's NPC roster rebuild a real NPC can be missing
for a moment, and its bounty was then marked as a player's and could not
be collected (review). It is a player bounty only when a player has that
display name and no NPC does; otherwise it is an NPC bounty, which
beating the target can pay.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
A player may share an NPC's name; with the NPC missing from a roster
being rebuilt, a decree on that name was still marked as a player's
(review). It is a player bounty only when the roster is complete, a
player has the name and no NPC does; otherwise an NPC bounty.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
A queued world-boss reward applied the Training bonus with the levels
last read; a teammate's upgrade since then was missed, and the row was
then marked delivered for good (review). Delivery refreshes the levels
first.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The levels were read at fixed points (login, a fight's start, the status
screen, an upgrade, the siege, a reward delivery), so any other use, such
as a potion in town, could apply levels from before a teammate's upgrade
(review, for queued world-boss rewards). Online, a character's levels
are now read again whenever they are more than a minute old, which
closes that for every use at once.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Potion Mastery (+50%) was applied only by the combat quick-heal. The item
key, the automatic potions after a fight, potions given to allies, town,
Home, the dungeon menus, a group follower, a duel defender and the world
boss all missed it. PotionBonus.ApplyOwnerBonuses applies the potion
owner's Potion Mastery and then the team's Infirmary at every potion and
every potion estimate, and the quick-heal no longer applies it itself.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
A bounty the Crown posted on a player could never be collected. A duel
won against that player (the arena, a sleeping player at the Inn or
Dormitory, the Dark Alley, the throne) now pays it to the winner, lethal
or not. It is claimed under the payout lock before it is paid, so it is
paid once; the shared quest record is edited in place; and a player
never collects the bounty on themselves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
A team's leader record (where NPC members' bequests go) and a guild's
leader were never reassigned, so a leader who left, was deleted or died
for good kept the title; five live teams list a founder who is no
longer on them.

Leadership now passes to the highest-level remaining player member
(then the earliest to join a guild, then the username), skipping banned
and emergency accounts: when the leader quits the team or leaves the
guild, when the character is deleted or dies permanently (the shared
purge), and in a world-save pass after the empty-team cleanup. That pass
only takes teams whose leader is a known character no longer on the
team, never one joined in the last ten minutes, and never an unmatched
old key, which the admin's Fix Team Leaders screen handles. Every write
is guarded on the old leader.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
The quickbar showed a spell that lacked mana only as unavailable, so a
new Magician took the staff to be the problem (player report). It now
reads, for example, "Magic Missile (need 14 MP, have 6)". The staff and
silence labels go through the translations too, in all five languages.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
…'s main

The permadeath for too many deaths keyed its purge and its delete on the
account name, which is the main character's key; on an alt it would
purge and archive the main character and leave the alt. It uses the
character's own key, as the other permadeath path does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- A deleted king's reign ends through the existing abdication path
  (CastleLocation.EndPlayerReign), so the normal succession runs; an NPC
  king of the same name is left alone.
- NPC grudges against the deleted name (hostile memories) are dropped and
  each NPC's impression rebuilt from what remains, in memory and in the
  shared NPC record, edited in place with a versioned write.
- Mail to the display name and auction listings under it are purged with
  those under the account key. The old purge also deleted listings the
  character had bought, taking the seller's uncollected gold; it no
  longer does. A name an NPC may carry keeps its listings.
- The rebellion coin flip deleted by the display name as a key, which
  deletes nothing when they differ; it uses the character key and runs
  the shared purge first, and the delete guard now covers it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
binary-knight and others added 12 commits September 23, 2026 23:32
- The auction purge takes a seller name only when no other player uses it
  (display name or save name, malformed saves skipped), and the account
  key pass keeps an NPC's listings as the display-name pass does.
- A bounty is claimed once in the database (bounty_claims, INSERT OR
  IGNORE, also added as a migration) before it is paid, so two game
  processes holding the same bounty cannot both pay it.
- Only a character loaded from a player's save (IsLoadedPlayer, run time
  only) collects a player bounty; a hired guard of the same name does not.
- The world-save succession update rechecks the join grace itself, and
  guild succession reads and writes in one transaction, rolling back if
  the new leader has left.
- Deleting a king from a fresh process loads the shared royal court first.
- The shared NPC record edit that drops grudges also clears the marriage
  to the deleted character, so the world sim does not reload it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- A throne vacated by a deleted king is recorded as vacant in the shared
  royal court; both court loaders honour it and the world sim fills it
  through the usual NPC succession, instead of writing the king back.
- Deleting a character reads the shared court's king without applying it,
  and loads it only when the deleted character is the king.
- A player's marriage to an NPC ends with the player's deletion (it was
  taken for an NPC-NPC marriage), in memory, the shared record and the
  marriage registry.
- Guild leave re-reads the leader inside the removal's transaction and
  passes leadership there; a team successor is rechecked for eligibility
  in the update itself.
- The auction purge and its NPC guard share one alias list, married name
  included.
- A save-loaded duel defender keeps its married surname, so a bounty on
  the married name is collectable.
- A quest without an id is claimed by a stable key (a hash of initiator,
  target and title); bounty claims older than 90 days are pruned.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- Deleting a king always reads the shared royal court and ends the reign
  only when the shared king is the deleted character, writing it back
  with a versioned write that re-reads and decides again on a conflict;
  a process holding an old court no longer overwrites the current king.
- Removing quests from the shared record uses a versioned write with a
  re-read and retries, so concurrent removals and additions all persist.
- The shared cleanup after a player-bounty payout matches by the claim
  key, so one quest without an id no longer takes the others with it.
- Bounty claims are no longer pruned: the claim row is the only guard
  against a bounty restored from an old save being paid again.
- A deleted character's bounties are removed under every name it went
  by, married name included; its claimed quests only under its Name2.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
…erred

- Deleting a character no longer edits NPC grudges or NPC marriages. Another
  process's NPC save or the world sim's marriage registry could restore
  them; both return in 1.1.12 with an owner-process design.
- A player bounty keeps its gold across save and reload (QuestData
  BountyGold); rows with none still pay the 500 fallback.
- The married-name purge skips an alias another living player uses, so
  their bounty stays.
- A throne vacancy carries the monarch history and both loaders import it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- Deleting a player whose married name is another living player's name
  no longer ends that player's reign.
- Beating a married player collects a bounty under their married name only
  when no other character uses that name.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- A bounty whose claim could not be written (a busy database) stays open
  and unpaid instead of being dropped.
- A winner's married display name no longer blocks collecting the bounty
  on the player whose name it is; self-collection is judged by Name2.
- Winning the throne from an NPC king is not a kill, so it does not
  complete an Assassin contract on them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
- Deleting a character claims every bounty it removes, so another
  process's cached copy can never be paid, even against a later character
  of the same name.
- A deletion in a door process with no guild system of its own still
  passes on the guild it led.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CT1VB81uLs5VNysGendLKY
@binary-knight
binary-knight merged commit 51d0497 into main Sep 24, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant