Place eggs near their Pal's boss, and make one plan serve both builds #1

Merged
brian merged 1 commit from egg-placement-geography into main 2026-08-14 19:32:21 +00:00
Owner

Egg placement gains a geographic tie-break. Where a Pal has a field boss,
the spawner whose map footprint is nearest that boss wins -- but only among
the spawners the element theme and rarity band already allowed, so a Pal
never leaves its theme to be near its boss. Of 54 candidates, 15 have a
usable boss location and 9 land inside their boss's own footprint; the rest
are theme-blocked and settle for the nearest spawner their element permits.
Paladius now hatches in the desert it patrols rather than in grassland.

tools/geo.py supplies both halves from the game's own files. Boss positions
come from DT_BossSpawnerLoactionData, whose 159 rows include 69 human NPC
bosses with no CharacterID. The egg spawners have no location table at all,
so each Blueprint's footprint is recovered by scanning the world-partition
grid -- 648 of ~10,000 cells reference one. The 25600-uu cell size is
confirmed against the boss table's own region prefixes rather than assumed:
worldtree_* and skyisland_* bosses land inside the matching spawner's cell
range at that size and no other.

plan_additions no longer reads the config. It covers all 54 candidates and
the caller filters -- the pak bakes the opted-in subset, egg_plan.lua ships
the whole plan and gates it at runtime. This is what makes the two agree.
Planning only the opted-in subset made placement depend on how many Pals
were enabled, because the tie-breaks count what a spawner has already taken:
the pak and egg_plan.lua disagreed for 14 of 20 Pals, and enabling one Pal
in the TOML silently moved others. Both now match exactly, and placement is
byte-identical across configs of 0, 1 and 54 enabled Pals.

The pak consequently rewrites only the spawners that gain a Pal -- 10 of 14
at the default config, down from all 14, and 68,376 bytes from 94,285.

Round-trip byte-match holds for all 14 spawners, structural diff is clean
for all 10 rebuilt, and the Lua suite passes.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

Egg placement gains a geographic tie-break. Where a Pal has a field boss, the spawner whose map footprint is nearest that boss wins -- but only among the spawners the element theme and rarity band already allowed, so a Pal never leaves its theme to be near its boss. Of 54 candidates, 15 have a usable boss location and 9 land inside their boss's own footprint; the rest are theme-blocked and settle for the nearest spawner their element permits. Paladius now hatches in the desert it patrols rather than in grassland. tools/geo.py supplies both halves from the game's own files. Boss positions come from DT_BossSpawnerLoactionData, whose 159 rows include 69 human NPC bosses with no CharacterID. The egg spawners have no location table at all, so each Blueprint's footprint is recovered by scanning the world-partition grid -- 648 of ~10,000 cells reference one. The 25600-uu cell size is confirmed against the boss table's own region prefixes rather than assumed: worldtree_* and skyisland_* bosses land inside the matching spawner's cell range at that size and no other. plan_additions no longer reads the config. It covers all 54 candidates and the caller filters -- the pak bakes the opted-in subset, egg_plan.lua ships the whole plan and gates it at runtime. This is what makes the two agree. Planning only the opted-in subset made placement depend on how many Pals were enabled, because the tie-breaks count what a spawner has already taken: the pak and egg_plan.lua disagreed for 14 of 20 Pals, and enabling one Pal in the TOML silently moved others. Both now match exactly, and placement is byte-identical across configs of 0, 1 and 54 enabled Pals. The pak consequently rewrites only the spawners that gain a Pal -- 10 of 14 at the default config, down from all 14, and 68,376 bytes from 94,285. Round-trip byte-match holds for all 14 spawners, structural diff is clean for all 10 rebuilt, and the Lua suite passes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Egg placement gains a geographic tie-break. Where a Pal has a field boss,
the spawner whose map footprint is nearest that boss wins -- but only among
the spawners the element theme and rarity band already allowed, so a Pal
never leaves its theme to be near its boss. Of 54 candidates, 15 have a
usable boss location and 9 land inside their boss's own footprint; the rest
are theme-blocked and settle for the nearest spawner their element permits.
Paladius now hatches in the desert it patrols rather than in grassland.

tools/geo.py supplies both halves from the game's own files. Boss positions
come from DT_BossSpawnerLoactionData, whose 159 rows include 69 human NPC
bosses with no CharacterID. The egg spawners have no location table at all,
so each Blueprint's footprint is recovered by scanning the world-partition
grid -- 648 of ~10,000 cells reference one. The 25600-uu cell size is
confirmed against the boss table's own region prefixes rather than assumed:
worldtree_* and skyisland_* bosses land inside the matching spawner's cell
range at that size and no other.

plan_additions no longer reads the config. It covers all 54 candidates and
the caller filters -- the pak bakes the opted-in subset, egg_plan.lua ships
the whole plan and gates it at runtime. This is what makes the two agree.
Planning only the opted-in subset made placement depend on how many Pals
were enabled, because the tie-breaks count what a spawner has already taken:
the pak and egg_plan.lua disagreed for 14 of 20 Pals, and enabling one Pal
in the TOML silently moved others. Both now match exactly, and placement is
byte-identical across configs of 0, 1 and 54 enabled Pals.

The pak consequently rewrites only the spawners that gain a Pal -- 10 of 14
at the default config, down from all 14, and 68,376 bytes from 94,285.

Round-trip byte-match holds for all 14 spawners, structural diff is clean
for all 10 rebuilt, and the Lua suite passes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brian merged commit c0bc0e530d into main 2026-08-14 19:32:21 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
brian/PacifistPal!1
No description provided.