Port Headbutt and Rock Smash encounters

Facing a Headbutt tree asks to HEADBUTT it, and HEADBUTT from the party
menu skips the question. ShakeHeadbuttTree shakes the tree as a sprite over
grass, then TreeMonEncounter scores the facing tile against the trainer ID
and draws from the map's common or rare tree table. A Pokémon that falls
fights as BATTLETYPE_TREE: "fell out of the tree!", and the time of day's
AsleepTreeMons species start asleep.

Smashable rocks run SmashRockScript, and ROCK SMASH from the party menu
acts on the facing rock; after the rock breaks, RockMonEncounter gives the
map's rock set a 40% chance of a wild battle.

Closes #26

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Sébastien QUEROLandClaude Opus 5.5 committed 2026-10-02 12:20:13 +02:00
1 parent ee55d344af
commit f259163da9
18 files changed
+789 -36

No files matched your search

+4
View File
@@ -500,6 +500,10 @@ export class CrystalAssets {
r.byte(entry + 2),
);
}
/** HeadbuttTreeGFX: the shaking tree's two 2x2 frames, eight tiles. */
headbuttTree(): Uint8Array {
return this.reader.slice(OVERWORLD.HeadbuttTreeGFX, 8 * 16);
}
/** GetIcon: a species' two-frame party menu icon (ReadMonMenuIcon and
* IconPointers), eight tiles. */
monIcon(species: number): Uint8Array {
+16
View File
@@ -159,6 +159,7 @@ export const RAM = {
strengthSpecies: 0xd1ef,
curHPAnimDeltaHP: 0xd1f3,
visitedSpawns: 0xdca5,
tempWildMonSpecies: 0xd22e,
/** hMoneyTemp: HRAM, not WRAM like the other entries above. */
moneyTemp: 0xffc3,
} as const;
@@ -233,6 +234,17 @@ export const OVERWORLD = {
Script_WaterfallFromMenu: 0xcb1c,
"SweetScentFromMenu.SweetScent": 0x506c8,
SweetScentEncounter: 0x506ef,
HeadbuttFromMenuScript: 0xcea7,
AskHeadbuttScript: 0xcedc,
ShakeHeadbuttTree: 0x8c80a,
HeadbuttTreeGFX: 0x8c893,
TreeMonEncounter: 0xb81ea,
RockMonEncounter: 0xb8219,
TreeMonMaps: 0xb825e,
RockMonMaps: 0xb82c5,
TreeMons: 0xb82e8,
RockSmashFromMenuScript: 0xcf2e,
HasRockSmash: 0xcf7c,
"CheckBadge.BadgeRequiredText": 0xc73d,
"FieldMoveFailed.CantUseItemText": 0xc780,
CutNothingText: 0xc7c9,
@@ -685,6 +697,10 @@ export const BATTLE = {
WasBurnedText: 0x8123c,
WasPoisonedText: 0x811d5,
WildPokemonAppearedText: 0x80746,
PokemonFellFromTreeText: 0x80778,
AsleepTreeMonsNite: 0x3eb5d,
AsleepTreeMonsDay: 0x3eb69,
AsleepTreeMonsMorn: 0x3eb6f,
WokeUpText: 0x80cfa,
WontDropAnymoreText: 0x8128f,
WontRiseAnymoreText: 0x81272,