jevsnes.git / third-party / c / patches / 0011-shopkeeper-blocks-in-room-0123.patch
0011-shopkeeper-blocks-in-room-0123.patch30 lines · 1.9 KB · raw
1diff --git a/third-party/c/zbanks-alttp/ap_snes.h b/third-party/c/zbanks-alttp/ap_snes.h
2index 7080b203..f1418962 100644
3--- a/third-party/c/zbanks-alttp/ap_snes.h
4+++ b/third-party/c/zbanks-alttp/ap_snes.h
5@@ -753,7 +753,24 @@ static const struct ap_sprite_subtype ap_sprite_subtypes[] = {
6     { .type = 0x73, .subtype = 0x0200, .attrs = SPRITE_ATTR_BLKS },
7 
8     // Mini Moldorm Cave Guy
9-    { .type = 0xBB, .subtype = 0x0200, .only_dungeon_room = 0x123, .attrs = SPRITE_ATTR_NODE | SPRITE_ATTR_TALK },
10+    // Carried patch (jev): the general entry for type 0xBB (above,
11+    // SPRITE_ATTR_SUBT | SPRITE_ATTR_BLKF | SPRITE_ATTR_TALK) has BLKF; this
12+    // per-room override drops it, unlike every other TALK|NODE override that
13+    // keeps its blocking flag when the real sprite is solid (Sahasrahla,
14+    // .type = 0x16 above, keeps BLKF; uncle, .type = 0x73 .only_dungeon_room
15+    // = 0x55, correctly has none - he is lying down, not solid). Without
16+    // BLKF the pathfinder's obstacle cost in ap_pathfind_local (the
17+    // SPRITE_ATTR_BLKF | SPRITE_ATTR_BLKS check) never sees this sprite at
18+    // all, so A* finds a path straight through its real hitbox that the
19+    // engine's own collision then refuses - Link pinned one pixel from the
20+    // hitbox, pressing Down forever ("Stuck Link Detected! 5a88,2447 en
21+    // route to 5a78,24c0", room $0123's door D 0x80). Evidence:
22+    // ../../research/zbanks-alttp.md, "The door D 0x80 stall in room
23+    // $0123". Restoring BLKF makes carried patch 0006's own destination/
24+    // inside exemptions apply exactly as they do for Sahasrahla: Link's own
25+    // occupied margin cell unblocks so the search can start, the sprite's
26+    // real hitbox stays solid, and a route around it is found.
27+    { .type = 0xBB, .subtype = 0x0200, .only_dungeon_room = 0x123, .attrs = SPRITE_ATTR_NODE | SPRITE_ATTR_TALK | SPRITE_ATTR_BLKF },
28 };
29 
30 #define DOOR_ATTR_LIST \