Auto-attack: next target, melee/ranged rule after arts; chain range = cast range

- autoattack: when the target dies, the nearest enemy within close range
  (contact distance + a step) takes over; after an art the hero auto-attacks
  if the art was melee (walked up / cast close by), or ranged with a ranged
  weapon, or ranged with an enemy already in melee range; measured action
  codes and weapon classes in game/engine/orders.h
- chainlightning: jumps reach Blitzschlag's cast range (20 ray segments of
  30, the art code's hit check) via the shared NearestHostile search
- guards: burning bone render hook had the wrong signature (device plus a
  4x4 matrix by value, ret 0x44) and corrupted the stack when fire arrows hit
- crash reports follow the ebp chain before the raw stack scan

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
khallaandClaude Opus 5.5 committed 2026-10-16 09:16:47 +02:00
1 parent 5338527b49
commit 16c2844400
8 files changed
+275 -60

No files matched your search

+17 -1
View File
@@ -62,7 +62,23 @@ void WriteReport(EXCEPTION_POINTERS* info) {
}
fprintf(file, "eax %08lx ebx %08lx ecx %08lx edx %08lx esi %08lx edi %08lx ebp %08lx esp %08lx\n", c.Eax, c.Ebx,
c.Ecx, c.Edx, c.Esi, c.Edi, c.Ebp, c.Esp);
fprintf(file, "return addresses on the stack (innermost first):\n");
// Frame pointer chain (our debug build and most of sacred.exe keep ebp).
fprintf(file, "frames (ebp chain):\n");
uintptr_t frame = c.Ebp;
for (int i = 0; i < 64 && frame; ++i) {
MEMORY_BASIC_INFORMATION mem;
if (!VirtualQuery(reinterpret_cast<void*>(frame), &mem, sizeof(mem)) || mem.State != MEM_COMMIT) {
break;
}
const auto* slots = reinterpret_cast<const uintptr_t*>(frame);
DescribeAddress(slots[1], where, sizeof(where));
fprintf(file, " %s\n", where);
if (slots[0] <= frame) {
break;
}
frame = slots[0];
}
fprintf(file, "code addresses on the stack (innermost first; may include data):\n");
const auto* stack = reinterpret_cast<const uintptr_t*>(c.Esp);
int found = 0;
for (int i = 0; i < 4096 && found < 48; ++i) {