Skills, auto-attack, aura and chain lightning rework, Esc, cache fix
- Skill bar: no art selection; slot 0 is the right-click art, keys 0-6 cast slots directly; cooldown labels in exact seconds; slot 0 set apart. - Arts regenerate on their own (casting no longer refills the group). - Auto-attack after targeting or casting at a hostile creature, at the speed of a held button. - Auras can be recast while active (renew, no second visual). - Blicke wie Klingen hits every enemy in range, physical, with life leech. - Blitzschlag steers the game's own chain: 3 + level/5 hits, 1 + level/10 chains, re-hits a lone enemy. - Weapon sets: click selects, drag only from the selected set; the leftmost set is clickable (signed hit tests). - Esc closes open windows before opening the game menu. - HUD: standalone buttons and texts are centred. - Record cache sized for widened views (town lag while walking). - Shared game code: orders, fx events, text drawing, cooldowns, effects. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
f721d2a486
commit
1fd89524d3
41 files changed
+2347
-214
No files matched your search
@@ -205,6 +205,43 @@ constexpr re::BytePatch kTaskbarSlotLoopBounds[] = { // cmp reg, 5
|
||||
{0x006dffd2, 3, 5}, // SetSlotCount: cmp si, 5
|
||||
{0x006df7c5, 1, 5}, {0x006e2593, 1, 5}, {0x006dffd8, 1, 5}, // mov reg, 5 (count / clamp)
|
||||
};
|
||||
// Combat-art slots without a selection: slot 0 (the right mouse button's art)
|
||||
// is drawn as the selected one, every slot's ready art with the selected icon.
|
||||
constexpr re::CodeReplacement kTaskbarSkillSelectionLook[] = {
|
||||
// UpdateSlotHighlight, slot background: `cmp ebx, eax` (slot == selected)
|
||||
// -> `test ebx, ebx` (slot == 0)
|
||||
{0x006dfa77, {0x3b, 0xd8}, {0x85, 0xdb}, 2},
|
||||
// RenderArtSlots, frame: `cmp edi, eax` -> `test edi, edi`
|
||||
{0x006e3813, {0x3b, 0xf8}, {0x85, 0xff}, 2},
|
||||
// RenderArtSlots: a ready art is drawn with its third ("selected") icon
|
||||
// only in the selected slot: `jne` skipped
|
||||
{0x006e3575, {0x75, 0x54}, {0x90, 0x90}, 2},
|
||||
};
|
||||
// Taskbar code passes mouse positions to the slot controls' hit tests as
|
||||
// `and reg, 0FFFFh` (zero-extended u16): with 7 slots the leftmost weapon set
|
||||
// lies at x < 0 of the layout and never matched. Sign-extended instead:
|
||||
// `and edx, 0FFFFh` -> `movsx edx, dx`, `and eax, 0FFFFh` -> `cwde`.
|
||||
constexpr re::CodeReplacement kTaskbarSignedHitTests[] = {
|
||||
{0x006dfcfe, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006dfd07, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006dfd5e, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006dfd67, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e1a5c, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e1a67, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e2093, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e209e, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e20e7, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e20f2, {0x81, 0xe2, 0xff, 0xff, 0x00, 0x00}, {0x0f, 0xbf, 0xd2, 0x90, 0x90, 0x90}, 6},
|
||||
{0x006e1a0c, {0x25, 0xff, 0xff, 0x00, 0x00}, {0x98, 0x90, 0x90, 0x90, 0x90}, 5},
|
||||
{0x006e1a16, {0x25, 0xff, 0xff, 0x00, 0x00}, {0x98, 0x90, 0x90, 0x90, 0x90}, 5},
|
||||
{0x006e1e8e, {0x25, 0xff, 0xff, 0x00, 0x00}, {0x98, 0x90, 0x90, 0x90, 0x90}, 5},
|
||||
{0x006e1e98, {0x25, 0xff, 0xff, 0x00, 0x00}, {0x98, 0x90, 0x90, 0x90, 0x90}, 5},
|
||||
{0x006e1ee1, {0x25, 0xff, 0xff, 0x00, 0x00}, {0x98, 0x90, 0x90, 0x90, 0x90}, 5},
|
||||
{0x006e1eeb, {0x25, 0xff, 0xff, 0x00, 0x00}, {0x98, 0x90, 0x90, 0x90, 0x90}, 5},
|
||||
};
|
||||
// SetSlotCount: the decorative strip right of the centre starts at
|
||||
// 0x23a + n * 0x40 (`add ecx, 23Ah`).
|
||||
constexpr uint32_t kTaskbarRightStripStart = 0x006e01cc;
|
||||
// cCreature::AssignArtToSlot (0x55fac0) rejects slots > 4 (`cmp eax, 4`).
|
||||
constexpr re::BytePatch kAssignArtMaxSlot[] = {{0x0055fae3, 2, 4}};
|
||||
// SlotCountForLevel (stdcall, level): (level, count) table at 0x95503c, max 5.
|
||||
|
||||
Reference in new issue
Block a user