From 9716ca09c8ce98ff017a6ef079ad53648fe8503c Mon Sep 17 00:00:00 2001 From: JesterWizard Date: Thu, 6 Nov 2025 15:46:45 +0000 Subject: [PATCH 1/4] Initial commit --- .../StatusExpansion/AssembleLynEvent.bat | 26 + .../StatusExpansion/Enfeeble/Enfeeble.event | 14 + .../Enfeeble/Enfeeble.lyn.event | 7 + .../StatusExpansion/Enfeeble/Enfeeble.s | 37 + .../StatusExpansion/Freeze/EventFreeze.event | 18 + .../StatusExpansion/Freeze/Freeze.event | 67 + .../Freeze/asm/AssembleARM.bat | 20 + .../Freeze/asm/freeze_decrease.dmp | Bin 0 -> 44 bytes .../Freeze/asm/freeze_decrease.s | 30 + .../Freeze/asm/freeze_decrease_2.dmp | Bin 0 -> 108 bytes .../Freeze/asm/freeze_decrease_2.s | 65 + .../StatusExpansion/Freeze/asm/freezeall.dmp | Bin 0 -> 40 bytes .../StatusExpansion/Freeze/asm/freezeall.s | 27 + .../Freeze/asm/unused/freeze.dmp | Bin 0 -> 52 bytes .../Freeze/asm/unused/freeze.s | 32 + .../Freeze/asm/unused/freezemovement.dmp | 1 + .../Haste/AssembleLynEvent.bat | 26 + .../StatusExpansion/Haste/Haste.event | 22 + .../StatusExpansion/Haste/Haste.lyn.event | 11 + .../StatusExpansion/Haste/Haste.s | 75 + .../StatusExpansion/HexingRod/HexingRod.event | 13 + .../StatusExpansion/MinimugBoxNames.png | Bin 0 -> 909 bytes .../StatusExpansion/Numb/AssembleLynEvent.bat | 26 + .../StatusExpansion/Numb/Numb.event | 11 + .../StatusExpansion/Numb/Numb.lyn.event | 8 + .../ExternalHacks/StatusExpansion/Numb/Numb.s | 55 + .../Regen/AssembleLynEvent.bat | 26 + .../StatusExpansion/Regen/Regen.event | 13 + .../StatusExpansion/Regen/Regen.lyn.event | 7 + .../StatusExpansion/Regen/Regen.s | 32 + .../Regen/RenewalAmaterasu.lyn.event | 40 + .../StatusExpansion/Regen/RenewalAmaterasu.s | 281 ++++ .../StatusExpansion/Slow/AssembleLynEvent.bat | 26 + .../StatusExpansion/Slow/Slow.event | 14 + .../StatusExpansion/Slow/Slow.lyn.event | 6 + .../ExternalHacks/StatusExpansion/Slow/Slow.s | 41 + .../StatusExpansion/StatusExpansion.event | 274 ++++ .../StatusExpansion/StatusExpansion.lyn.event | 11 + .../StatusExpansion/StatusExpansion.s | 59 + .../StatusExpansion/_compat/Boon.dmp | Bin 0 -> 100 bytes .../StatusExpansion/_compat/Boon.s | 86 + .../_compat/CanUnitWieldWeapon.dmp | Bin 0 -> 244 bytes .../_compat/CanUnitWieldWeapon.s | 183 +++ .../_compat/ProcSkills/proc_deadeye.dmp | Bin 0 -> 108 bytes .../_compat/ProcSkills/proc_deadeye.s | 76 + .../_compat/ProcSkills/proc_enrage.dmp | Bin 0 -> 108 bytes .../_compat/ProcSkills/proc_enrage.s | 76 + .../_compat/ProcSkills/proc_petrify.dmp | Bin 0 -> 108 bytes .../_compat/ProcSkills/proc_petrify.s | 76 + .../_compat/WarningAndHpBars.lyn.event | 29 + .../_compat/WarningAndHpBars.s | 442 ++++++ .../StatusExpansion/_compat/mss_defs.s | 1397 +++++++++++++++++ .../StatusExpansion/_compat/status_text.txt | 51 + EngineHacks/_MasterHackInstaller.event | 4 + 54 files changed, 3841 insertions(+) create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/AssembleLynEvent.bat create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/EventFreeze.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/Freeze.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/AssembleARM.bat create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freeze_decrease.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freeze_decrease.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freeze_decrease_2.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freeze_decrease_2.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freezeall.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freezeall.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freezemovement.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Haste/AssembleLynEvent.bat create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/HexingRod/HexingRod.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/MinimugBoxNames.png create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Numb/AssembleLynEvent.bat create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Regen/AssembleLynEvent.bat create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Slow/AssembleLynEvent.bat create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.dmp create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.lyn.event create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/mss_defs.s create mode 100644 EngineHacks/ExternalHacks/StatusExpansion/_compat/status_text.txt diff --git a/EngineHacks/ExternalHacks/StatusExpansion/AssembleLynEvent.bat b/EngineHacks/ExternalHacks/StatusExpansion/AssembleLynEvent.bat new file mode 100644 index 00000000..b78658fe --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/AssembleLynEvent.bat @@ -0,0 +1,26 @@ +@echo off + +SET startDir="C:\devkitPro\devkitARM\bin\" +SET as="%startDir%arm-none-eabi-as" +SET LYN="C:\devkitPro\lyn.exe" + +@rem Assemble into an elf +%as% -g -mcpu=arm7tdmi -mthumb-interwork %1 -o "%~n1.elf" + +if exist "Definitions.s" ( + + @rem Assemble definitions into a .elf if exists + %as% -g -mcpu=arm7tdmi -mthumb-interwork "Definitions.s" -o "Definitions.elf" + + @rem Assebmle into a .lyn.event with definitions + %LYN% "%~n1.elf" "Definitions.elf" > "%~n1.lyn.event" + + echo y | del "%~dp0Definitions.elf" +) else ( + @rem Assemble into a .lyn.event + %LYN% "%~n1.elf" > "%~n1.lyn.event" +) + +echo y | del "%~n1.elf" + +pause \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.event b/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.event new file mode 100644 index 00000000..2d7cbd0c --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.event @@ -0,0 +1,14 @@ +#define EnfeebleStatusID 0x0E //last valid status ID + +// SetStatusName(EnfeebleStatusID,EnfeebleStatusName) +// SetStatusDesc(EnfeebleStatusID,EnfeebleStatusDesc) +SetStatusBlinkyIconFunc(EnfeebleStatusID,BlinkyIconFuncSilenceIcon) + +#include "Enfeeble.lyn.event" + +ALIGN 4 +EnfeebleStatusIDLink: +BYTE EnfeebleStatusID + +// Add `EnfeebleStatDebuff` to stat getters for stats you want enfeeble to debuff +// Define EnfeebleName and EnfeebleDesc (only used on stat screen) diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.lyn.event new file mode 100644 index 00000000..bd8b39a7 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.lyn.event @@ -0,0 +1,7 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EnfeebleStatDebuff: +POP +SHORT $B5F0 $1C05 $1C0C $4E08 $7836 $1C20 $3030 $7800 $211F $4001 $42B1 $D101 $940 $1A2D $1C28 $1C21 $BCF0 $BC04 $4710 +BYTE $0 $0 +POIN EnfeebleStatusIDLink diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.s b/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.s new file mode 100644 index 00000000..af8d7bb6 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Enfeeble/Enfeeble.s @@ -0,0 +1,37 @@ +.thumb +.align + + +.global EnfeebleStatDebuff +.type EnfeebleStatDebuff, %function + + +EnfeebleStatDebuff: +push {r4-r7,r14} +mov r5, r0 @stat +mov r4, r1 @unit +ldr r6,=EnfeebleStatusIDLink +ldrb r6,[r6] + +mov r0,r4 +add r0,#0x30 +ldrb r0,[r0] +mov r1,#0x1F +and r1,r0 +cmp r1,r6 +bne EndEnfeebled + +lsr r0,r0,#5 +sub r5,r0 + + +EndEnfeebled: +mov r0,r5 +mov r1,r4 +pop {r4-r7} +pop {r2} +bx r2 + + +.ltorg +.align diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/EventFreeze.event b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/EventFreeze.event new file mode 100644 index 00000000..6125f2c3 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/EventFreeze.event @@ -0,0 +1,18 @@ +#ifndef EVENT_FREEZE +#define EVENT_FREEZE + +// Freeze all enemies ASMC. +// Hack by circleseverywhere + +#ifdef _FE8_ + + ALIGN 4 + FreezeAllASMC: + #incbin "asm/freezeall.dmp" + WORD FreezeStatusID + +#else // _FE8_ + ERROR Freeze All ASMC hack is for FE8 +#endif // _FE8_ + +#endif // EVENT_FREEZE diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/Freeze.event b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/Freeze.event new file mode 100644 index 00000000..53678f54 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/Freeze.event @@ -0,0 +1,67 @@ +#define FreezeStatusID 0xF + +// SetStatusName(FreezeStatusID,FreezeStatusName) +// SetStatusDesc(FreezeStatusID,FreezeStatusDesc) +SetStatusBlinkyIconFunc(FreezeStatusID,BlinkyIconFuncSleepIcon) + +//Define text IDs for name and desc +//put the following in the mov getter in place of what's normally there for freeze +// prNullifyIfFreeze: +// rIfUnitHasStatus(FreezeStatusID) +// rConstant(0) + +// Freeze status. +// Hack by CrazyColorz5 + +#ifdef _FE8_ + + { + + // TODO: make the sleep staff inflict freeze + + PUSH + //ORG 0x276F8 //sick displays sleep map anim + //WORD 0x80277A8 + + // ORG 0x178EA //2 turns = 1 player phase + // BYTE 0x20 + + //ORG 0x8C3D8 + // WORD 0x808C3F0 //HP area display + + ORG $18d50 + // jumpToHack(FreezeEffect) //I think the move getters are good enough + + ORG $188e4 + jumpToHack(FreezeDecrease) + + ORG $18878 + jumpToHack(FreezeDecrease2) + POP + + ALIGN 4 + // FreezeEffect: + // #incbin "ASM/freeze.dmp" + // POIN FreezeMovement + + ALIGN 4 + // FreezeMovement: + // #incbin "ASM/freezemovement.dmp" + + ALIGN 4 + FreezeDecrease: + #incbin "asm/freeze_decrease.dmp" + WORD FreezeStatusID + + ALIGN 4 + FreezeDecrease2: + #incbin "asm/freeze_decrease_2.dmp" + WORD FreezeStatusID + + } + +#else // _FE8_ + ERROR Freeze hack is for FE8 +#endif // _FE8_ + + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/AssembleARM.bat b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/AssembleARM.bat new file mode 100644 index 00000000..43a1b73d --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/AssembleARM.bat @@ -0,0 +1,20 @@ +@echo off + +SET startDir=C:\devkitPro\devkitARM\bin\ + +@rem Assemble into an elf +SET as="%startDir%arm-none-eabi-as" +%as% -g -mcpu=arm7tdmi -mthumb-interwork %1 -o "%~n1.elf" + +@rem Print symbol table +SET readelf="%startDir%arm-none-eabi-readelf" +%readelf% -s "%~n1.elf" > "%~n1.symbols.log" + +@rem Extract raw assembly binary (text section) from elf +SET objcopy="%startDir%arm-none-eabi-objcopy" +%objcopy% -S "%~n1.elf" -O binary "%~n1.dmp" + +echo y | del "%~n1.elf" + +echo y | del "%~n1.symbols.log" +pause \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freeze_decrease.dmp b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freeze_decrease.dmp new file mode 100644 index 0000000000000000000000000000000000000000..faf93ba07804d1727e7773df1a251b8cfbc3b9c9 GIT binary patch literal 44 ycmd%ov*hG_Au^YaA#mJn8L^b0RN#3C;$Ke literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freezeall.s b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freezeall.s new file mode 100644 index 00000000..aee68470 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/freezeall.s @@ -0,0 +1,27 @@ +.thumb +@freeze all enemies + +push {r4-r6,lr} +mov r4, #0x81 @first enemy +ldr r5, =0x8019430 @get ram from dplynum +mov r6, #0x30 @status byte +NextEnemy: +mov r0, r4 +mov lr, r5 +.short 0xf800 +@r0 is now ram +ldr r2,FreezeStatusID +mov r1,#0x2 @1-turn duration +orr r1,r2 +strb r1, [r0, r6] +add r4, #1 +cmp r4, #0xC0 +blt NextEnemy +pop {r4-r6} +pop {r0} +bx r0 + +.ltorg +.align + +FreezeStatusID: diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.dmp b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.dmp new file mode 100644 index 0000000000000000000000000000000000000000..bc64f656943912d5085874b0a3b1a4b9ec3fb619 GIT binary patch literal 52 zcmXp|5QyPd)nMuQ?JBZmWn2Ga#54`xpecMxV^kl53}(cR0)kqX2B DE5i$n literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.s b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.s new file mode 100644 index 00000000..e1123b76 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freeze.s @@ -0,0 +1,32 @@ +.thumb +@replaces 8018d50 (use jumpToHack there) +@0x8 bytes) + +mov r0, #0x30 +ldrb r0, [r2,r0] @status +mov r1, #0xF +and r0, r1 +cmp r0, #0x9 +bne NotFrozen +ldr r0, FrozenMovementTable +b MoveFound + +NotFrozen: +ldr r0, [r2, #0xC] +mov r1, #0x80 +lsl r1, #4 @bit 0x800 'in ballista' +and r0, r1 +cmp r0, #0 +beq NotBallista +ldr r0, =0x880bc18 @ballista movement + +MoveFound: +ldr r1, =0x8018d8a+1 @return with movement found +bx r1 +NotBallista: +ldr r1, =0x8018d64+1 @return for normal +bx r1 + +.ltorg +FrozenMovementTable: +@POIN table of 0xFF 104 times diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freezemovement.dmp b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freezemovement.dmp new file mode 100644 index 00000000..6e5b7a5f --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Freeze/asm/unused/freezemovement.dmp @@ -0,0 +1 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Haste/AssembleLynEvent.bat b/EngineHacks/ExternalHacks/StatusExpansion/Haste/AssembleLynEvent.bat new file mode 100644 index 00000000..b78658fe --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Haste/AssembleLynEvent.bat @@ -0,0 +1,26 @@ +@echo off + +SET startDir="C:\devkitPro\devkitARM\bin\" +SET as="%startDir%arm-none-eabi-as" +SET LYN="C:\devkitPro\lyn.exe" + +@rem Assemble into an elf +%as% -g -mcpu=arm7tdmi -mthumb-interwork %1 -o "%~n1.elf" + +if exist "Definitions.s" ( + + @rem Assemble definitions into a .elf if exists + %as% -g -mcpu=arm7tdmi -mthumb-interwork "Definitions.s" -o "Definitions.elf" + + @rem Assebmle into a .lyn.event with definitions + %LYN% "%~n1.elf" "Definitions.elf" > "%~n1.lyn.event" + + echo y | del "%~dp0Definitions.elf" +) else ( + @rem Assemble into a .lyn.event + %LYN% "%~n1.elf" > "%~n1.lyn.event" +) + +echo y | del "%~n1.elf" + +pause \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.event b/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.event new file mode 100644 index 00000000..799525e7 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.event @@ -0,0 +1,22 @@ + +#include "Haste.lyn.event" + +#define HasteStatusID 0x0B + +// SetStatusName(HasteStatusID,HasteStatusName) +// SetStatusDesc(HasteStatusID,HasteStatusDesc) +SetStatusBlinkyIconFunc(HasteStatusID,BlinkyIconFuncDancerRingIcon) + +HasteStatusIDLink: +BYTE HasteStatusID + +// define text & put `HastePostBattle` in the post-battle calc loop + +ALIGN 4 +HasteEvent: //plays a sound when getting refreshed +CAM1 0xFFFF +SOUN 0x10F +STAL 0x16 +NoFade +ENDA + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.lyn.event new file mode 100644 index 00000000..59a797f4 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.lyn.event @@ -0,0 +1,11 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;HastePostBattle: +POP +SHORT $B500 $7CE0 $2800 $D024 $68E0 $2104 $209 $4008 $2800 $D11E $1C20 $3030 $7800 $211F $4008 $490E $7809 $4288 $D115 $68E0 $2142 $43C9 $4008 $2104 $209 $4308 $60E0 $4809 $7AE1 $3001 $7802 $2A00 $D1FB $7001 $3001 $7002 $4805 $4686 $4805 $2101 +BYTE $0 $F8 +SHORT $BC01 $4700 +BYTE $0 $0 +POIN HasteStatusIDLink +BYTE $3 $AA $3 $2 $7C $D0 $0 $8 +POIN HasteEvent diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.s b/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.s new file mode 100644 index 00000000..39860dc9 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Haste/Haste.s @@ -0,0 +1,75 @@ +.thumb +.align + +.global HastePostBattle +.type HastePostBattle, %function + +.macro blh to, reg=r3 + ldr \reg, =\to + mov lr, \reg + .short 0xf800 +.endm + +HastePostBattle: +push {r14} + +@check if dead +ldrb r0, [r4,#0x13] +cmp r0, #0x00 +beq End + +@check if already galeforced this turn +ldr r0, [r4,#0x0C] @status bitfield +mov r1, #0x04 +lsl r1, #0x08 +and r0, r1 +cmp r0, #0x00 +bne End + +@check for status +mov r0, r4 +add r0,#0x30 +ldrb r0,[r0] +mov r1,#0x1F +and r0,r1 +ldr r1,=HasteStatusIDLink +ldrb r1,[r1] +cmp r0,r1 +bne End + +@unset 0x2 and 0x40, set 0x400, write to status +ldr r0, [r4,#0x0C] @status bitfield +mov r1, #0x42 +mvn r1, r1 +and r0, r1 @unset bits 0x42 +mov r1, #0x04 +lsl r1, #0x08 +orr r0, r1 +str r0, [r4,#0x0C] + +@add unit to the AI list so enemies act twice +ldr r0,=#0x203AA03 +ldrb r1, [r4,#0x0B] @allegiance byte of the character we are checking +AddAILoop: +add r0, #0x01 +ldrb r2, [r0] +cmp r2, #0x00 +bne AddAILoop +strb r1, [r0] +add r0, #0x01 +strb r2, [r0] + +Event: +ldr r0,=#0x800D07C @event engine thingy +mov lr, r0 +ldr r0, =HasteEvent @this event is just "play some sound effects" +mov r1, #0x01 @0x01 = wait for events +.short 0xF800 + +End: +pop {r0} +bx r0 + +.ltorg +.align + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/HexingRod/HexingRod.event b/EngineHacks/ExternalHacks/StatusExpansion/HexingRod/HexingRod.event new file mode 100644 index 00000000..9be1c6f5 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/HexingRod/HexingRod.event @@ -0,0 +1,13 @@ + +#define HexingRodStatusID 0x0A + +// SetStatusName(HexingRodStatusID,HexingRodStatusName) +// SetStatusDesc(HexingRodStatusID,HexingRodStatusDesc) +SetStatusBlinkyIconFunc(HexingRodStatusID,BlinkyIconFuncNoIcon) + +//add this to the max HP getter file +// prHexingRodStatus: +// rIfUnitHasStatus(HexingRodStatusID); rHalved +//and a ptr to prHexingRodStatus to the getter loop itself +//define text IDs for name and desc (only used on stat screen) + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/MinimugBoxNames.png b/EngineHacks/ExternalHacks/StatusExpansion/MinimugBoxNames.png new file mode 100644 index 0000000000000000000000000000000000000000..483d0c11bde8a6a18dd8ab812ea814952c82baee GIT binary patch literal 909 zcmV;819JR{P)*x0zZxF{$n5S}QK0009R zNklnWBc0zCi#+~q+~jqnIw zd_!Y-+N1yxhzRtF1LUs%ZM}d#25KLCLdGs8M;rNHofUc_4!n0S=~mA+@u+x zdhK@Z)MJR9upWqi^cX4ZI_RF{BbGOI@~eMPi|N9S#>cOdf7p}@lJuy4@CkAkvYZ1f zMs|~V=pdZY{vxBMaxu~mq%H93mw4^Jg4X<8Tfmr~eVU1k7P2Bqn|ca;juVchOk}i> z)!`gIF%;Gx8mo&dRE1H4j6d@=>b`66C|zElDWP;bF0g}x`Z0Y{fHXn7 z*dnQK|8Sp^g)&&OQz)~8b_<|fgK@Jkk7N&y3W`sL1K2dYzhAA7#{9^s5hJ_@gp6d( zm3h4CO|UXR4Ac-Yw*Sp&*K!c>B>o)9TtOiO6;qJF{%~0CpVW-Gc0g${)&OHckP?V2 z0NTAN+d(#PU3ktH;je8tD(6Oeyuy%i5wa!8ZcqX(6eN3d7LOxBU_WAHIty9{jZ{f1 z5qVJC&)O+QHIn;{6Cd|fi}Wm#XnBYHe#ecBh|#mu`#p=4^b62#1FsX+sni84r{nsC zj-a*{nl4sSGolyOmP5<6=uV};dl|i3De&r(%_n_Jl(qCcscj%>VQ>DJpd?P?h*{6B zr>R_LD38lVDiI~0U>tuEg>$2FqDn4hZJ1UQlICb7rKmn@a-a8`&=>$ril>N6PrxIfCH*24K1lto7N "%~n1.lyn.event" + + echo y | del "%~dp0Definitions.elf" +) else ( + @rem Assemble into a .lyn.event + %LYN% "%~n1.elf" > "%~n1.lyn.event" +) + +echo y | del "%~n1.elf" + +pause \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.event b/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.event new file mode 100644 index 00000000..63d2cc93 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.event @@ -0,0 +1,11 @@ + +#define NumbStatusID 0x08 + +// SetStatusName(NumbStatusID,NumbStatusName) +// SetStatusDesc(NumbStatusID,NumbStatusDesc) +SetStatusBlinkyIconFunc(NumbStatusID,BlinkyIconFuncSilenceIcon) + +#include "Numb.lyn.event" + +NumbStatusIDLink: +BYTE NumbStatusID diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.lyn.event new file mode 100644 index 00000000..7889eadc --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.lyn.event @@ -0,0 +1,8 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;NumbFunc: +POP +SHORT $B5F0 $1C04 $1C0D $1C16 $1C20 $3030 $7800 $6C0 $EC0 $490D $7809 $4288 $D111 $21FF $4029 $2024 $4341 $480A $1842 $1C10 $3008 $6800 $2146 $4008 $2800 $D104 $79D0 $2804 $D001 $2000 $E000 $2001 $BCF0 $BC02 $4708 +BYTE $0 $0 +POIN NumbStatusIDLink +POIN ItemTable diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.s b/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.s new file mode 100644 index 00000000..df32b540 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Numb/Numb.s @@ -0,0 +1,55 @@ +.thumb +.align + + +.global NumbFunc +.type NumbFunc, %function +NumbFunc: @return usability bool in r0 + +push {r4-r7,r14} +mov r4,r0 @character pointer +mov r5,r1 @item halfword +mov r6,r2 @character wrank. + +mov r0,r4 +add r0,#0x30 +ldrb r0,[r0] +lsl r0,#27 +lsr r0,#27 +ldr r1,=NumbStatusIDLink +ldrb r1,[r1] +cmp r0,r1 +bne RetTrue + +@load weapon ability word @@@@@this is not an attacker struct we can't use the version in ram!!! +mov r1,#0xFF +and r1,r5 +mov r0,#0x24 +mul r1,r0 +ldr r0,=ItemTable +add r2,r0,r1 +mov r0,r2 +add r0,#8 +ldr r0,[r0] +mov r1,#0x46 @magic weapon or staff or magic sword +and r0,r1 +cmp r0,#0 +bne RetTrue +ldrb r0,[r2,#7] @weapon type +cmp r0,#4 @staff because apparently the staff bit doesn't count +beq RetTrue + +RetFalse: +mov r0,#0 +b GoBack + +RetTrue: +mov r0,#1 + +GoBack: +pop {r4-r7} +pop {r1} +bx r1 + +.ltorg +.align diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Regen/AssembleLynEvent.bat b/EngineHacks/ExternalHacks/StatusExpansion/Regen/AssembleLynEvent.bat new file mode 100644 index 00000000..b78658fe --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Regen/AssembleLynEvent.bat @@ -0,0 +1,26 @@ +@echo off + +SET startDir="C:\devkitPro\devkitARM\bin\" +SET as="%startDir%arm-none-eabi-as" +SET LYN="C:\devkitPro\lyn.exe" + +@rem Assemble into an elf +%as% -g -mcpu=arm7tdmi -mthumb-interwork %1 -o "%~n1.elf" + +if exist "Definitions.s" ( + + @rem Assemble definitions into a .elf if exists + %as% -g -mcpu=arm7tdmi -mthumb-interwork "Definitions.s" -o "Definitions.elf" + + @rem Assebmle into a .lyn.event with definitions + %LYN% "%~n1.elf" "Definitions.elf" > "%~n1.lyn.event" + + echo y | del "%~dp0Definitions.elf" +) else ( + @rem Assemble into a .lyn.event + %LYN% "%~n1.elf" > "%~n1.lyn.event" +) + +echo y | del "%~n1.elf" + +pause \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.event b/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.event new file mode 100644 index 00000000..6ccb64d9 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.event @@ -0,0 +1,13 @@ + +#define RegenStatusID 0x09 + +// SetStatusName(RegenStatusID,RegenStatusName) +// SetStatusDesc(RegenStatusID,RegenStatusDesc) + +ALIGN 4 +RegenStatusIDLink: +BYTE RegenStatusID + +#include "Regen.lyn.event" + +//add `RegenFunc` to HP restoration calc loop diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.lyn.event new file mode 100644 index 00000000..c2bee942 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.lyn.event @@ -0,0 +1,7 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;RegenFunc: +POP +SHORT $B500 $3030 $7800 $221F $4010 $4A04 $7812 $4290 $D100 $3119 $1C08 $BC02 $4708 +BYTE $0 $0 +POIN RegenStatusIDLink diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.s b/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.s new file mode 100644 index 00000000..49821b59 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Regen/Regen.s @@ -0,0 +1,32 @@ +.thumb +.align + +.global RegenFunc +.type RegenFunc, %function + +RegenFunc: +push {r14} + +//r0 = unit, r1 = current heal % +//return new heal % in r0 + +@check for status +add r0,#0x30 +ldrb r0,[r0] +mov r2,#0x1F +and r0,r2 +ldr r2,=RegenStatusIDLink +ldrb r2,[r2] +cmp r0,r2 +bne NoRegenStatus + +@add 25% regen +add r1,#25 + +NoRegenStatus: +mov r0, r1 @return the amount healed. +pop {r1} +bx r1 + +.ltorg +.align diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.lyn.event new file mode 100644 index 00000000..c297abe6 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.lyn.event @@ -0,0 +1,40 @@ +ALIGN 4 +SHORT $B570 $4951 $1840 $7800 $600 $1604 $484F $4686 $1C28 $494F $7809 +BYTE $0 $F8 +SHORT $2800 $D000 $341E $484D $4686 $1C28 $494C $7809 $2200 $2302 +BYTE $0 $F8 +SHORT $2800 $D000 $3414 $4845 $4686 $1C28 $4948 $7809 +BYTE $0 $F8 +SHORT $2800 $D009 $4843 $4686 $1C28 $2100 $2200 $2302 +BYTE $0 $F8 +SHORT $2800 $D000 $340A $483C $4686 $1C28 $4940 $7809 +BYTE $0 $F8 +SHORT $2800 $D009 $483A $4686 $1C28 $2100 $2200 $2302 +BYTE $0 $F8 +SHORT $2800 $D100 $3414 $4835 $4686 $1C28 $4938 $7809 $2200 $2303 +BYTE $0 $F8 +SHORT $2800 $D000 $340A $482E $4686 $1C28 $4933 $7809 +BYTE $0 $F8 +SHORT $2800 $D00F $7C28 $7C69 $89 $4A30 $6812 $5852 $5C10 $492F $780A $2A00 $D004 $4282 $D001 $3101 $E7F8 $3414 $4822 $4686 $1C28 $492A $7809 +BYTE $0 $F8 +SHORT $2800 $D009 $1C28 $303A $7800 $2164 $4348 $1C29 $7C89 $1840 $DF06 $1824 $4824 $7B80 $4924 $468E +BYTE $0 $F8 +SHORT $6A03 $3B06 $7C28 $7C69 $4E21 $7836 $3306 $881A $2A00 $D012 $781A $42B2 $D1F8 $785A $4290 $D1F5 $789A $4291 $D1F2 $B40B $7958 $491A $468E +BYTE $0 $F8 +SHORT $2801 $BC0B $D0EA $791A $1914 $1C28 $3030 $7800 $211F $4008 $4914 $7809 $4288 $D100 $3419 $1C20 $BC70 $BC02 $4708 $46C0 +BYTE $44 $C7 $80 $8 +POIN SkillTester +POIN RenewalRenewalIDLink +POIN AuraSkillCheck +POIN RenewalAmaterasuIDLink +POIN RenewalCamaraderieIDLink +POIN RenewalReliefIDLink +POIN RenewalBondIDLink +POIN RenewalForagerIDLink +BYTE $DC $E4 $2 $2 +POIN ForagerList +POIN RenewalImbueIDLink +BYTE $F0 $BC $2 $2 $B0 $46 $3 $8 +POIN RenewalHealTrapID +BYTE $A8 $3D $8 $8 +POIN RegenStatusIDLink diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.s b/EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.s new file mode 100644 index 00000000..870b708e --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Regen/RenewalAmaterasu.s @@ -0,0 +1,281 @@ +.thumb +@.equ RenewalID, SkillTester+4 +@.equ AuraSkillCheck, RenewalID+4 +@.equ AmaterasuID, AuraSkillCheck+4 +@.equ CamaraderieID, AmaterasuID+4 +@.equ ReliefID, CamaraderieID+4 +@.equ BondID, ReliefID+4 +@.equ ChapterDataStruct, BondID+4 +@.equ GetChapterEvents, ChapterDataStruct+4 +@.equ HealTrapID, GetChapterEvents+4 + +@.equ ChapterDataStruct, #0x0202BCF0 +@.equ GetChapterEvents, #0x080346B0 +@.equ CheckEventID, #0x08083DA8 + +.macro blh to, reg + ldr \reg, =\to + mov lr, \reg + .short 0xF800 +.endm + +push {r4 - r6, lr} +ldr r1, Some_Offset +add r0, r0, r1 +ldrb r0, [r0] +lsl r0, r0, #0x18 +asr r4, r0, #0x18 +@That much is copy-paste from vanilla. +@It loads %HP to heal from terrain into r4 + +@Now check for Renewal skill + +ldr r0, =SkillTester +mov lr, r0 +mov r0, r5 +ldr r1, =RenewalRenewalIDLink +ldrb r1, [ r1 ] +.short 0xf800 +cmp r0, #0x0 +beq no_renewal + @add hp + add r4, #30 +no_renewal: + +@Now check for Amaterasu +ldr r0, =AuraSkillCheck +mov lr, r0 +mov r0, r5 @unit +ldr r1, =RenewalAmaterasuIDLink +ldrb r1, [ r1 ] +mov r2, #0 @same_team +mov r3, #2 @range +.short 0xf800 +cmp r0, #0 +beq no_amaterasu +add r4, #20 @heal 20% hp + +no_amaterasu: + +@Now check for Camaraderie +ldr r0, =SkillTester +mov lr, r0 +mov r0, r5 +ldr r1, =RenewalCamaraderieIDLink +ldrb r1, [ r1 ] +.short 0xf800 +cmp r0, #0x0 +beq no_camaraderie + @check for allies in range: + ldr r0, =AuraSkillCheck + mov lr, r0 + mov r0, r5 @unit + mov r1, #0 @always true + mov r2, #0 @same_team + mov r3, #2 @range + .short 0xf800 + cmp r0, #0 + beq no_camaraderie + @if allies in range, heal 10% + add r4, #10 + +no_camaraderie: + +@check for relief +ldr r0, =SkillTester +mov lr, r0 +mov r0, r5 +ldr r1, =RenewalReliefIDLink +ldrb r1, [ r1 ] +.short 0xf800 +cmp r0, #0x0 +beq no_relief + @check for allies in range: + ldr r0, =AuraSkillCheck + mov lr, r0 + mov r0, r5 @unit + mov r1, #0 @always true + mov r2, #0 @same_team + mov r3, #2 @range + .short 0xf800 + cmp r0, #0 + bne no_relief + @if no allies in range, heal 20% + add r4, #20 + +no_relief: + +@Now check for bond +ldr r0, =AuraSkillCheck +mov lr, r0 +mov r0, r5 @unit +ldr r1, =RenewalBondIDLink +ldrb r1, [ r1 ] +mov r2, #0 @same_team +mov r3, #3 @range +.short 0xf800 +cmp r0, #0 +beq no_bond +add r4, #10 @heal 10% hp + +no_bond: + +@Now check for forager +ldr r0, =SkillTester +mov lr,r0 +mov r0,r5 +ldr r1, =RenewalForagerIDLink +ldrb r1,[r1] +.short 0xf800 +cmp r0,#0x0 +beq no_forager + +@check the terrain the unit is on, compare it against the list +ldrb r0,[r5,#0x10] @x coord of unit +ldrb r1,[r5,#0x11] @y coord of unit +lsl r1,#2 @y times 4 since it's pointer +ldr r2,=0x202E4DC @tile id map pointer +ldr r2,[r2] @tile id map offset +ldr r2,[r2,r1] @load pointer to y row +ldrb r0,[r2,r0] @load x byte of the row, which gets us tile id +ldr r1, =ForagerList +ForagerLoop: +ldrb r2,[r1] +cmp r2,#0 +beq no_forager +cmp r2,r0 +beq yes_forager +add r1,#1 +b ForagerLoop + +@if on correct terrain, heal 20% +yes_forager: +add r4,#20 + +no_forager: + +@check for Imbue +ldr r0, =SkillTester +mov lr,r0 +mov r0,r5 +ldr r1, =RenewalImbueIDLink +ldrb r1,[r1] +.short 0xf800 +cmp r0,#0x0 +beq NoImbue + +@unit is in r5 +@get mag stat +mov r0,r5 +add r0,#0x3A +ldrb r0,[r0] @r0 = mag + +@multiply it by 100 +mov r1,#100 +mul r0,r1 + + +@divide it by MHP +mov r1,r5 +ldrb r1,[r1,#0x12] @r1 = mhp + +@add MHP to dividend to make it round up +add r0,r1 + +swi 0x6 @div [r0/r1] + +@r0 = div result +@add it to r4 +add r4,r0 + + +NoImbue: + +@ Check for healing tiles +ldr r0, =#0x0202BCF0 +ldrb r0, [ r0, #0x0E ] +@blh GetChapterEvents, r1 +ldr r1, =#0x080346B0 +mov lr, r1 +.short 0xF800 +ldr r3, [ r0, #0x20 ] @ Pointer to trap data in r3. +sub r3, #6 +ldrb r0, [ r5, #0x10 ] @ X coordinate of current unit in r0 +ldrb r1, [ r5, #0x11 ] @ Y coordinate of current unit in r1 +ldr r6, =RenewalHealTrapID +ldrb r6, [ r6 ] + +BeginHealingTileLoop: +add r3, #6 +ldrh r2, [ r3 ] +cmp r2, #0x00 +beq NoHealingTiles @ If this is an ENDTRAP, end. +ldrb r2, [ r3 ] +cmp r2, r6 +bne BeginHealingTileLoop @ If this isn't an 0x23, loop back and try again. +ldrb r2, [ r3, #1 ] +cmp r0, r2 +bne BeginHealingTileLoop @ If the X coordinates don't match up, loop back. +ldrb r2, [ r3, #2 ] +cmp r1, r2 +bne BeginHealingTileLoop @ If the Y coordinates don't match up, loop back. +push { r0, r1, r3 } +ldrb r0, [ r3, #5 ] @ Event ID of this one in r0. +ldr r1, =#0x08083DA8 +mov lr, r1 +.short 0xF800 +cmp r0, #0x01 +pop { r0, r1, r3 } +beq BeginHealingTileLoop @ If the event ID is set, loop back. + +@ If I'm here, this unit is on a good healing tile. Spooky. + +ldrb r2, [ r3, #4 ] @ Percent healed in r2 +add r4, r2, r4 @ Add to the main healing percentage. + +@346B0: (Get_Chapter_Events) (FE8J: 345B8) (FE7: 315BC) +@Params: r0=chapter number +@Returns: Pointer to that chapter's events + +@83DA8: (Check_Event_ID) (FE7: 798F8) (FE8J: 860D0) (FE6: 6BA5C) +@Params: r0=event id to check +@Returns: True if event id is set + +NoHealingTiles: + + +@check for status +mov r0,r5 +add r0,#0x30 +ldrb r0,[r0] +mov r1,#0x1F +and r0,r1 +ldr r1,=RegenStatusIDLink +ldrb r1,[r1] +cmp r0,r1 +bne NoRegenStatus + +@add 10% regen +add r4,#25 + + +NoRegenStatus: + +mov r0, r4 @return the amount healed. +pop {r4 - r6} +pop {r1} +bx r1 +.align +Some_Offset: +.long 0x880C744 +@SkillTester: +@POIN SkillTester +@WORD RenewalID +@POIN AuraSkillCheck +@WORD AmaterasuID +@WORD CamaraderieID +@WORD ReliefID +@WORD BondID +@WORD ChapterDataStruct +@POIN GetChapterEvents +@WORD HealTileTrapID diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Slow/AssembleLynEvent.bat b/EngineHacks/ExternalHacks/StatusExpansion/Slow/AssembleLynEvent.bat new file mode 100644 index 00000000..b78658fe --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Slow/AssembleLynEvent.bat @@ -0,0 +1,26 @@ +@echo off + +SET startDir="C:\devkitPro\devkitARM\bin\" +SET as="%startDir%arm-none-eabi-as" +SET LYN="C:\devkitPro\lyn.exe" + +@rem Assemble into an elf +%as% -g -mcpu=arm7tdmi -mthumb-interwork %1 -o "%~n1.elf" + +if exist "Definitions.s" ( + + @rem Assemble definitions into a .elf if exists + %as% -g -mcpu=arm7tdmi -mthumb-interwork "Definitions.s" -o "Definitions.elf" + + @rem Assebmle into a .lyn.event with definitions + %LYN% "%~n1.elf" "Definitions.elf" > "%~n1.lyn.event" + + echo y | del "%~dp0Definitions.elf" +) else ( + @rem Assemble into a .lyn.event + %LYN% "%~n1.elf" > "%~n1.lyn.event" +) + +echo y | del "%~n1.elf" + +pause \ No newline at end of file diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.event b/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.event new file mode 100644 index 00000000..760d3f9f --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.event @@ -0,0 +1,14 @@ + +#include "Slow.lyn.event" + +#define SlowStatusID 0x0C + +// SetStatusName(SlowStatusID,SlowStatusName) +// SetStatusDesc(SlowStatusID,SlowStatusDesc) +SetStatusBlinkyIconFunc(SlowStatusID,BlinkyIconFuncNoIcon) + +SlowStatusIDLink: +BYTE SlowStatusID + +//define text IDs, and add SlowStatusEffect to (near the end of) pre-battle calc loop + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.lyn.event new file mode 100644 index 00000000..35b810c9 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.lyn.event @@ -0,0 +1,6 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;SlowStatusEffect: +POP +SHORT $B530 $1C04 $1C0D $1C28 $3030 $7800 $211F $4008 $4906 $7809 $4288 $D106 $1C28 $305E $8800 $3004 $1C21 $315E $8008 $BC30 $BC01 $4700 +POIN SlowStatusIDLink diff --git a/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.s b/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.s new file mode 100644 index 00000000..9f1b4f59 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/Slow/Slow.s @@ -0,0 +1,41 @@ +.thumb +.align + +.global SlowStatusEffect +.type SlowStatusEffect, %function + + +SlowStatusEffect: +push {r4-r5,r14} +mov r4,r0 @attacker +mov r5,r1 @defender + +@does defender have slow status? + +mov r0,r5 +add r0,#0x30 +ldrb r0,[r0] +mov r1,#0x1F +and r0,r1 +ldr r1,=SlowStatusIDLink +ldrb r1,[r1] +cmp r0,r1 +bne GoBack + +@attacker AS = defender AS +4 +mov r0,r5 +add r0,#0x5E +ldrh r0,[r0] +add r0,#4 +mov r1,r4 +add r1,#0x5E +strh r0,[r1] + + +GoBack: +pop {r4-r5} +pop {r0} +bx r0 + +.ltorg +.align diff --git a/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.event b/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.event new file mode 100644 index 00000000..2a837559 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.event @@ -0,0 +1,274 @@ + +#ifndef STATUS_EXPANSION_INSTALLED +#define STATUS_EXPANSION_INSTALLED + +PUSH + +//ORG $16604 //CanUnitWieldWeapon +//SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $178EA //SetUnitNewStatus +SHORT 0x21A0 //change 0x50 duration to 0xA0 duration + +ORG $178F6 //SetUnitStatus +SHORT 0x231F //change 0xF bitmask to 0x1F bitmask +SHORT 0x0152 //change left shift amount to 1 more bit + +ORG $1941C //draw status ID +SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0E40 //change right shift amount to 1 less bit (0x19 from 0x1A) + +ORG $1D58E +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $24D18 +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $25AA6 +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $27200 +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $27A8C +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $27B42 +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $88A38 //cond desc getter +SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC0 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $8C470 +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + + +ORG $A5F34 +SHORT 0x06D1 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC9 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $A60A2 +SHORT 0x06C9 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC9 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $8C536 +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $8C440 //minimug box status duration +SHORT 0x0940 //change right shift amount to 1 more bit (5 from 4) + +ORG $8C396 //minimug box status ID +SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC0 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $1D732 +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $178E6 +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $25FC4 //restore staff targeting +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $2A8E4 //stone-related thing +SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC0 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $2C88C +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $25A22 +SHORT 0x201F //change 0xF bitmask to 0x1F bitmask + +ORG $2AD98 +SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC0 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $2AE62 +SHORT 0x221F //change 0xF bitmask to 0x1F bitmask + +ORG $59A8C //something stone-related +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $569BA //stone-related thing +SHORT 0x211F //change 0xF bitmask to 0x1F bitmask + +ORG $54A58 //probably the glow +SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +SHORT 0x0EC0 //change right shift amount to 1 less bit (0x1B from 0x1C) + +//conflicts w/ HP bars +//ORG $276BA +//SHORT 0x06C0 //change left shift amount to 1 less bit (0x1B from 0x1C) +//SHORT 0x0EC0 //change right shift amount to 1 less bit (0x1B from 0x1C) + +ORG $178EA +SHORT 0x21A0 //updated 5-turn duration on applied statuses + +//things to let you actually apply statuses with the highest bit set via staves +//should be made irrelevant by IER +//ORG $2FF94 +//SHORT 0x0E00 //asr -> lsr (this is really dumb) +//ORG $30026 +//SHORT 0x7820 0x2800 0xD009 //ldsb -> ldrb, unchanged cmp, blt -> beq +//ORG $30036 +//SHORT 0x7821 //ldsb -> ldrb + +//change staff battle init to not give 0xFF status on miss +ORG $2CBAC +SHORT 0x2100 //mov r1,#1 -> mov r1,#0 +SHORT 0x46C0 //neg r1,r1 -> nop +ORG $2A5FE +SHORT 0x2000 //mov r0,#0xFF -> mov r0,#0 + +ORG $88A3C +jumpToHack(NewStatusDescIndexer) + +ORG $8C39C +jumpToHack(NewMinimugBoxGraphicIndexer) + +ORG $19410 +POIN StatusNameTextIDTable +ORG $1942C +POIN StatusNameTextIDTable + +// ORG $276C0 +// jumpToHack(NewBlinkyStatusIcons) + +POP + + +#include "StatusExpansion.lyn.event" + + +ALIGN 4 +NewMinimugBoxLabelNames: +#incext Png2Dmp "MinimugBoxNames.png" + +ALIGN 4 +StatusNameTextIDTable: +FILL 256 + +ALIGN 4 +StatusDescTextIDTable: +FILL 128 + +ALIGN 4 +BlinkyStatusIconJumpTable: +FILL 256 + + +#define SetStatusName(statusID,textID) "PUSH; ORG (StatusNameTextIDTable+(statusID*4)); WORD textID; POP" + +#define SetStatusDesc(statusID,textID) "PUSH; ORG (StatusDescTextIDTable+(2*statusID)); SHORT textID; POP" + +#define SetStatusBlinkyIconFunc(statusID,funcPtr) "PUSH; ORG (BlinkyStatusIconJumpTable+(statusID*4)); POIN funcPtr; POP" + +/* +#define NoStatusID 0 +#define PoisonStatusID 1 +#define SleepStatusID 2 +#define SilenceStatusID 3 +#define BerserkStatusID 4 +#define AtkRingStatusID 5 +#define DefRingStatusID 6 +#define CritRingStatusID 7 +#define AvoRingStatusID 8 +#define SickStatusID 9 +#define PetrifyStatusID 13 +*/ +SetStatusName(NoStatusID,0x536) +SetStatusName(PoisonStatusID,0x514) +SetStatusName(SleepStatusID,0x515) +SetStatusName(SilenceStatusID,0x516) +SetStatusName(BerserkStatusID,0x517) +SetStatusName(AtkRingStatusID,0x51B) +SetStatusName(DefRingStatusID,0x51C) +SetStatusName(CritRingStatusID,0x51D) +SetStatusName(AvoRingStatusID,0x51E) +SetStatusName(SickStatusID,0x518) +SetStatusName(PetrifyStatusID,0x51A) + +SetStatusDesc(NoStatusID,0x552) +SetStatusDesc(PoisonStatusID,0x553) +SetStatusDesc(SleepStatusID,0x554) +SetStatusDesc(SilenceStatusID,0x556) +SetStatusDesc(BerserkStatusID,0x555) +SetStatusDesc(AtkRingStatusID,0x558) +SetStatusDesc(DefRingStatusID,0x559) +SetStatusDesc(CritRingStatusID,0x55A) +SetStatusDesc(AvoRingStatusID,0x55B) +SetStatusDesc(SickStatusID,0x553) +SetStatusDesc(PetrifyStatusID,0x557) + +#define BlinkyIconFuncNoIcon $278A6 +#define BlinkyIconFuncPoisonIcon $27700 +#define BlinkyIconFuncSleepIcon $277A8 +#define BlinkyIconFuncSilenceIcon $27754 +#define BlinkyIconFuncBerserkIcon $277F8 +#define BlinkyIconFuncDancerRingIcon $27858 + +SetStatusBlinkyIconFunc(NoStatusID,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(PoisonStatusID,BlinkyIconFuncPoisonIcon) +SetStatusBlinkyIconFunc(SleepStatusID,BlinkyIconFuncSleepIcon) +SetStatusBlinkyIconFunc(SilenceStatusID,BlinkyIconFuncSilenceIcon) +SetStatusBlinkyIconFunc(BerserkStatusID,BlinkyIconFuncBerserkIcon) +SetStatusBlinkyIconFunc(AtkRingStatusID,BlinkyIconFuncDancerRingIcon) +SetStatusBlinkyIconFunc(DefRingStatusID,BlinkyIconFuncDancerRingIcon) +SetStatusBlinkyIconFunc(CritRingStatusID,BlinkyIconFuncDancerRingIcon) +SetStatusBlinkyIconFunc(AvoRingStatusID,BlinkyIconFuncDancerRingIcon) +SetStatusBlinkyIconFunc(SickStatusID,BlinkyIconFuncNoIcon) +//fill the rest with no icon by default to avoid issues +SetStatusBlinkyIconFunc(10,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(11,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(12,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(13,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(14,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(15,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(16,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(17,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(18,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(19,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(20,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(21,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(22,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(23,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(24,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(25,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(26,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(27,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(28,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(29,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(30,BlinkyIconFuncNoIcon) +SetStatusBlinkyIconFunc(31,BlinkyIconFuncNoIcon) + + +/* +fix all proc skills that apply statuses + +things changed: +- HP Bars +- MSG InstallHelpers +- Freeze decrease funcs +- MSS defs + +Compatibility folder contains updated funcs for various things listed above, +This is the updated MSG InstallHelpers bit +a +prCheckUnitStatus: + SHORT 0x6B08 0x231F 0x4018 0x4290 0xD101 0x202A 0xE000 0x2000 0x4770 0x46C0 + +*/ + +#include "Enfeeble/Enfeeble.event" +#include "Freeze/Freeze.event" +#include "Freeze/EventFreeze.event" +#include "Slow/Slow.event" +#include "Numb/Numb.event" +#include "HexingRod/HexingRod.event" +#include "Regen/Regen.event" +#include "Haste/Haste.event" + +#endif // STATUS_EXPANSION_INSTALLED + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.lyn.event new file mode 100644 index 00000000..19ac341a --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.lyn.event @@ -0,0 +1,11 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;NewMinimugBoxGraphicIndexer: +ORG CURRENTOFFSET+$20;NewStatusDescIndexer: +POP +SHORT $2800 $D006 $3801 $21A0 $4348 $4903 $1840 $4B03 $4718 $BC70 $BC01 $4700 +POIN NewMinimugBoxLabelNames +BYTE $21 $C4 $8 $8 +SHORT $40 $4904 $1840 $8800 $1C11 $314C $8008 $BC01 $4700 +BYTE $0 $0 +POIN StatusDescTextIDTable diff --git a/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.s b/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.s new file mode 100644 index 00000000..c0a1b702 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/StatusExpansion.s @@ -0,0 +1,59 @@ +.thumb +.align + +.global NewMinimugBoxGraphicIndexer +.type NewMinimugBoxGraphicIndexer, %function + + +NewMinimugBoxGraphicIndexer: @r3 hook at 8C39C +cmp r0,#0 +beq MinimugBoxGfx_NoStatus + +sub r0,#1 +mov r1,#0xA0 +mul r0,r1 +ldr r1,=NewMinimugBoxLabelNames +add r0,r1 +ldr r3,=#0x808C421 @return point +bx r3 + + +MinimugBoxGfx_NoStatus: +pop {r4-r6} +pop {r0} +bx r0 + + +.ltorg +.align + + + + + +.global NewStatusDescIndexer +.type NewStatusDescIndexer, %function + + +NewStatusDescIndexer: @r3 hook at 88A3C +lsl r0,r0,#1 +ldr r1,=StatusDescTextIDTable +add r0,r1 +ldrh r0,[r0] +mov r1,r2 +add r1,#0x4C +strh r0,[r1] + +pop {r0} +bx r0 + +.ltorg +.align + + + + + + + + diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.dmp b/EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.dmp new file mode 100644 index 0000000000000000000000000000000000000000..92cdb8f47a11a16482705da974683818d6e61257 GIT binary patch literal 100 zcmdJ$zf_6(k(EH5f1OYOq{nQo7{)AVa|6K?2_%1_h1+ xo(Ft;7&I6!auhH>a9|X0<|z38oU`JC0<)KZ`vEruWbI_+007d`A7ual literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.s new file mode 100644 index 00000000..983ab40e --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/Boon.s @@ -0,0 +1,86 @@ +.thumb +.align 4 + +.equ BoonID,SkillTester+4 + +@check if you have boon +push {r1-r3} @don't crucify me this is the easiest way to do this since every single register is in use here +mov r0,r4 +ldr r1,BoonID +ldr r2,SkillTester +mov r14,r2 +.short 0xF800 +cmp r0,#1 +bne DecrementStatusTimer @if you don't have Boon, do vanilla + +BoonEffect: +pop {r1-r3} + +@ Issue #374 +@ Boon needs to unset petrify state bits + +@ r1 - Address unit.status +@ r3 - Value unit.status +@ r4 - unit* + +push {r1-r3} + +# Are we petrified? +mov r0, #0x1F +and r0, r3 @ status index low 5 bits +cmp r0, #0xB @ petrify index +beq YesPetrify +cmp r0, #0xD @ also petrify index +bne NoPetrify + +YesPetrify: +# We are petrified so unset state bits +mov r2, #2 +mvn r2, r2 + +ldr r0, [r4, #0xC] @ unit state + +and r0, r2 +str r0, [r4, #0xC] + +NoPetrify: +pop {r1-r3} +mov r0,#0 @otherwise, status is over +strb r0,[r1] +b GoBack + +DecrementStatusTimer: @the part of the vanilla function that the hook overwrites and we return to after +pop {r1-r3} +mov r2,#0x1F +and r2,r3 +lsr r0,r3,#5 +sub r0,#1 +cmp r0,#0 +bne KeepStatus +strb r0,[r1] +b GoBack +KeepStatus: +lsl r0,r0,#5 +orr r0,r2 +strb r0,[r1] +b GoBack + + + + + +GoBack: +ldrb r1,[r1] +mov r0,#0xF0 + +ldr r2,ReturnPoint +bx r2 + +.ltorg +.align 4 + +ReturnPoint: +.word 0x8018905 +SkillTester: +@POIN SkillTester +@WORD BoonID diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.dmp b/EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.dmp new file mode 100644 index 0000000000000000000000000000000000000000..c959a480bbfc3ac6ca5108d1fadc984daa1e454a GIT binary patch literal 244 zcmeycl|_bEhCw&z!hc0g2NeYmXA4gUiKYxj1pxnK+vGzz{KdlpvitgK}J)C*R#)!;Rgd7gN6{0Z(zV!A+NyUAnwhq!FLhlo)ZiX z5)BLoBpNc96ghydV7|bhDD^-rosk3LT1RId4+n{Zl?pN%1`ZNz72N*T84TJSV6%;6 c=7G%CczS`w{PS~0MGlz{dzkicxF2u>0M$oDg8%>k literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.s new file mode 100644 index 00000000..64c28fc5 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/CanUnitWieldWeapon.s @@ -0,0 +1,183 @@ +.thumb +.align +.equ LookupList,ItemTable+4 +.equ ExternalLoop,LookupList+4 + +.macro blh to, reg + ldr \reg, =\to + mov lr, \reg + .short 0xF800 +.endm + +CanUnitWieldWeapon: +push {r4-r7,r14} + +mov r4,r0 @r4= char struct pointer +mov r5,r1 @r5= item halfword +cmp r5,#0 +beq CannotWield + +HasAWeapon: +mov r1,#0xFF +and r1,r5 @get just item ID in r1 +mov r0,#0x24 +mul r0,r1 +ldr r1,ItemTable +add r0,r1 @r0= item table data offset +ldr r2,[r0,#8] @r2 = weapon ability word +mov r0,#1 +and r0,r2 +mov r3,r1 @r3 = item table offset +cmp r0,#0 @check if the "is a weapon" bit is set +beq CannotWield @if so, continue + +IsAWeapon: +ldr r0,=#0x003D3C00 @word to be &ed to the item ability word +and r0,r2 +cmp r0,#0 +beq IsUnitStatused + +HasWeaponLocks: + +@this is terrible so let's redo it entirely +@1. lookup list; each entry is 8 bytes, ties item ability bit to character/class ability bit in a word for each (this alone is 1/4 the size of the current function and is data that will likely be larger than the replacement for the current function!!) +@2. BEGIN with the check for no ability bits to be set on character/class, then skip the whole loop if there are none (This will free up cycles so it doesn't have to run all of this every time even if it's unnecessary!!) +@3. loop that goes through the list, testing for each bit set in both +@4. list is terminated by 0xFFFFFFFF word, at which point it continues (since it will have exited from the loop with a return false if it's found a combination that doesn't work) +@this should get rid of a ton of the bloat in this function which lets us put more things inline along with this!!! + + +ldr r0,[r4] +ldr r0,[r0,#0x28] +ldr r1,[r4,#4] +ldr r1,[r1,#0x28] +orr r0,r1 +mov r6,r0 @r6= char/class ability word + +ldr r0,=#0xF0070000 +tst r0,r6 +beq CannotWield @don't run the loop if we don't have any weapon locks set, we know we can't use it since to reach this point it needs to have a lock + +mov r1,#0xFF +and r1,r5 +mov r0,#0x24 +mul r1,r0 +ldr r0,ItemTable +add r1,r0 +ldr r0,[r1,#8] +mov r3,r0 @r3= item ability word + +ldr r7,LookupList @r7= current lookup list position + +LoopStart: +ldr r0,[r7] +ldr r1,=#0xFFFFFFFF +cmp r0,r1 +beq IsUnitStatused @if we've reached the end, leave + +@otherwise, check for our current lock on our current item + +TestItemAbilityByte: +tst r0,r3 @if this returns true, then the current lock is not set on the weapon +beq RestartLoop + +@otherwise, check if the equivalent char/class ability bit is set +ldr r0,[r7,#4] + +TestCharClassAbilityByte: +tst r0,r6 +beq CannotWield + +RestartLoop: +add r7,#8 +b LoopStart + +.ltorg +.align + +LockCheck7: +mov r0,#0x80 +lsl r0,r0,#9 +and r1,r0 +cmp r1,#0 +beq IsUnitStatused +mov r0,r4 +mov r1,r5 +blh 0x8016716,r1 +lsl r0,r0,#0x18 +cmp r0,#0 +beq CannotWield + +IsUnitStatused: +mov r0,r4 +add r0,#0x30 +ldrb r1,[r0] @This is the status byte? +mov r0,#0x1F @status bitmask +and r0,r1 +ldr r3,ItemTable +cmp r0,#3 @checking for Sleep status, can't attack if sleeped +bne PrepareExternalLoop +mov r1,#0xFF +and r1,r5 +lsl r0,r1,#3 +add r0,r1 +lsl r0,r0,#2 +add r0,r3 +ldr r0,[r0,#8] +mov r1,#2 +and r0,r1 +cmp r0,#0 +beq PrepareExternalLoop + +CannotWield: +mov r1,#0 +b GoBack + +.ltorg +.align + +PrepareExternalLoop: +@get weapon rank for item type and put it in r6, but don't do the "is your wrank high enough for this weapon" part +mov r1,#0xFF +and r1,r5 +mov r0,#0x24 +mul r1,r0 +ldr r0,ItemTable +add r0,r1 +ldrb r1,[r0,#7] @weapon type +mov r0,r4 +add r0,#0x28 @start of wranks +add r0,r1 @proper wrank +ldrb r6,[r0] @r6 = rank + +@here we gonna put our external function loop +ldr r7,ExternalLoop +ExternalLoopStart: +ldr r3,[r7] +cmp r3,#0 +beq ExitLoop +mov r0,r4 +mov r1,r5 +mov r2,r6 +mov lr,r3 +.short 0xF800 +cmp r0,#0 +beq CannotWield +add r7,#4 +b ExternalLoopStart + +ExitLoop: +mov r1,#1 + +GoBack: +mov r0,r1 +Reeg: +pop {r4-r7} +pop {r1} +bx r1 + +.ltorg +.align + +ItemTable: +@POIN ItemTable diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.dmp b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.dmp new file mode 100644 index 0000000000000000000000000000000000000000..4b4c685f3305365b8b424daf20782d63026e2bd7 GIT binary patch literal 108 zcmeycl|_bEModOtMj*q1*@63jA}14*A%~OV#e4;gFa{0TTM9Blo`T-<+!%f^Xoy`% zs8y8V2J;v-_%9k|1TuSaJ18(PIT$cHvv~+Oa5x(zuz461GAZOMW`um$!?=gRU1up1 J2Lr>8{{WUH8_NIy literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.s new file mode 100644 index 00000000..4f36161f --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_deadeye.s @@ -0,0 +1,76 @@ +.thumb + +.macro blh to, reg=r3 + ldr \reg, =\to + mov lr, \reg + .short 0xf800 +.endm + +.equ PetrifyID, SkillTester+4 +.equ d100Result, 0x802a52c +.equ NextRN_100, 0x8000C64 + +@ r0 is attacker, r1 is defender, r2 is current buffer, r3 is battle data + +push {r4-r7,lr} +mov r4, r0 @attacker +mov r5, r1 @defender +mov r6, r2 @battle buffer +mov r7, r3 @battle data +ldr r0,[r2] @r0 = battle buffer @ 0802B40A 6800 +lsl r0,r0,#0xD @ 0802B40C 0340 +lsr r0,r0,#0xD @Without damage data @ 0802B40E 0B40 +mov r1, #0xC0 @skill flag +lsl r1, #8 @0xC000 +add r1, #2 @miss +tst r0, r1 +bne End @if another skill already activated, don't do anything +mov r0,#0x6F +ldsb r0,[r5,r0] +cmp r0,#0 +bge End @if already inflicting a status, don't check for ours + +mov r0,r4 +ldr r1,PetrifyID +ldr r3,SkillTester +mov r14,r3 +.short 0xF800 +cmp r0,#0 +beq End +ldrb r0,[r4,#0x15] @skill% proc rate +@mov r0,#100 @for testing +mov r1,r4 +blh d100Result +cmp r0,#1 +bne End @didn't proc + +@if we proc, set the offensive skill and poison flag +ldr r2,[r6] +lsl r1,r2,#0xD @ 0802B42C 0351 +lsr r1,r1,#0xD @ 0802B42E 0B49 +mov r0, #0x40 +lsl r0, #8 @0x4000, attacker skill activated +add r0,#0x40 @poison +orr r1, r0 +ldr r0,=#0xFFF80000 @ 0802B434 4804 +and r0,r2 @ 0802B436 4010 +orr r0,r1 @ 0802B438 4308 +str r0,[r6] @ 0802B43A 6018 + +ldrb r0, PetrifyID +strb r0, [r6,#4] + + +WriteStatus: +mov r0,#0x2 @sleep ID +mov r1,#0x6F +strb r0,[r5,r1] + +End: +pop {r4-r7} +pop {r0} +bx r0 + +.ltorg +SkillTester: +@ diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.dmp b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.dmp new file mode 100644 index 0000000000000000000000000000000000000000..7ae33ac838abf535c7c6b184ad7baf7e33a555c3 GIT binary patch literal 108 zcmeycl|_bEModOtMj*q1*@63jA}14*A%~OV#e4;gFa{0TTM9Blo`T-<+!%f^Xoy`% zs8y8V2J;v-_%9k|1TuSaJ18(PIT$cHvv~+Oa5x(zuz461vMA&$W`um$!?=gRU1up1 J2Lr>8{{WUv8_fU! literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.s new file mode 100644 index 00000000..bfca4420 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_enrage.s @@ -0,0 +1,76 @@ +.thumb + +.macro blh to, reg=r3 + ldr \reg, =\to + mov lr, \reg + .short 0xf800 +.endm + +.equ PetrifyID, SkillTester+4 +.equ d100Result, 0x802a52c +.equ NextRN_100, 0x8000C64 + +@ r0 is attacker, r1 is defender, r2 is current buffer, r3 is battle data + +push {r4-r7,lr} +mov r4, r0 @attacker +mov r5, r1 @defender +mov r6, r2 @battle buffer +mov r7, r3 @battle data +ldr r0,[r2] @r0 = battle buffer @ 0802B40A 6800 +lsl r0,r0,#0xD @ 0802B40C 0340 +lsr r0,r0,#0xD @Without damage data @ 0802B40E 0B40 +mov r1, #0xC0 @skill flag +lsl r1, #8 @0xC000 +add r1, #2 @miss +tst r0, r1 +bne End @if another skill already activated, don't do anything +mov r0,#0x6F +ldsb r0,[r5,r0] +cmp r0,#0 +bge End @if already inflicting a status, don't check for ours + +mov r0,r4 +ldr r1,PetrifyID +ldr r3,SkillTester +mov r14,r3 +.short 0xF800 +cmp r0,#0 +beq End +ldrb r0,[r4,#0x15] @skill% proc rate +@mov r0,#100 @for testing +mov r1,r4 +blh d100Result +cmp r0,#1 +bne End @didn't proc + +@if we proc, set the offensive skill and poison flag +ldr r2,[r6] +lsl r1,r2,#0xD @ 0802B42C 0351 +lsr r1,r1,#0xD @ 0802B42E 0B49 +mov r0, #0x40 +lsl r0, #8 @0x4000, attacker skill activated +add r0,#0x40 @poison +orr r1, r0 +ldr r0,=#0xFFF80000 @ 0802B434 4804 +and r0,r2 @ 0802B436 4010 +orr r0,r1 @ 0802B438 4308 +str r0,[r6] @ 0802B43A 6018 + +ldrb r0, PetrifyID +strb r0, [r6,#4] + + +WriteStatus: +mov r0,#0x4 @berserk ID +mov r1,#0x6F +strb r0,[r5,r1] + +End: +pop {r4-r7} +pop {r0} +bx r0 + +.ltorg +SkillTester: +@ diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.dmp b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.dmp new file mode 100644 index 0000000000000000000000000000000000000000..4870520133751a0f62354b4e037e5526fef94f59 GIT binary patch literal 108 zcmeycl|_bEModOtMj*q1*@63jA}14*A%~OV#e4;gFa{0TTM9Blo`T-<+!%f^Xoy`% zs8y8V2J;v-_%9k|1TuSaJ18(PIT$cHvv~+Oa5x(zuz461ax3I3W`um$!?=gRU1up1 J2Lr>8{{WWR8`J;* literal 0 HcmV?d00001 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.s new file mode 100644 index 00000000..4d3e7310 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/ProcSkills/proc_petrify.s @@ -0,0 +1,76 @@ +.thumb + +.macro blh to, reg=r3 + ldr \reg, =\to + mov lr, \reg + .short 0xf800 +.endm + +.equ PetrifyID, SkillTester+4 +.equ d100Result, 0x802a52c +.equ NextRN_100, 0x8000C64 + +@ r0 is attacker, r1 is defender, r2 is current buffer, r3 is battle data + +push {r4-r7,lr} +mov r4, r0 @attacker +mov r5, r1 @defender +mov r6, r2 @battle buffer +mov r7, r3 @battle data +ldr r0,[r2] @r0 = battle buffer @ 0802B40A 6800 +lsl r0,r0,#0xD @ 0802B40C 0340 +lsr r0,r0,#0xD @Without damage data @ 0802B40E 0B40 +mov r1, #0xC0 @skill flag +lsl r1, #8 @0xC000 +add r1, #2 @miss +tst r0, r1 +bne End @if another skill already activated, don't do anything +mov r0,#0x6F +ldsb r0,[r5,r0] +cmp r0,#0 +bge End @if already inflicting a status, don't check for ours + +mov r0,r4 +ldr r1,PetrifyID +ldr r3,SkillTester +mov r14,r3 +.short 0xF800 +cmp r0,#0 +beq End +ldrb r0,[r4,#0x15] @skill% proc rate +@mov r0,#100 @for testing +mov r1,r4 +blh d100Result +cmp r0,#1 +bne End @didn't proc + +@if we proc, set the offensive skill and poison flag +ldr r2,[r6] +lsl r1,r2,#0xD @ 0802B42C 0351 +lsr r1,r1,#0xD @ 0802B42E 0B49 +mov r0, #0x40 +lsl r0, #8 @0x4000, attacker skill activated +add r0,#0x40 @poison +orr r1, r0 +ldr r0,=#0xFFF80000 @ 0802B434 4804 +and r0,r2 @ 0802B436 4010 +orr r0,r1 @ 0802B438 4308 +str r0,[r6] @ 0802B43A 6018 + +ldrb r0, PetrifyID +strb r0, [r6,#4] + + +WriteStatus: +mov r0,#0xB @petrify ID +mov r1,#0x6F +strb r0,[r5,r1] + +End: +pop {r4-r7} +pop {r0} +bx r0 + +.ltorg +SkillTester: +@ diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.lyn.event b/EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.lyn.event new file mode 100644 index 00000000..26a97b47 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.lyn.event @@ -0,0 +1,29 @@ +ALIGN 4 +SHORT $B4F0 $B084 $4824 $7800 $2180 $4208 $D000 $E0E1 $2000 $9000 $2110 $5661 $109 $4A20 $230C $5ED0 $1A0B $2011 $5620 $100 $210E $5E51 $1A42 $1C19 $3110 $2080 $40 $4281 $D838 $1C10 $3010 $28B0 $D834 $2101 $9100 $9301 $9202 $4915 $9103 $2012 $5620 $B480 $1C07 $2013 $5620 $1C02 $1C38 $BC80 $2A00 $D023 $4282 $DA21 $1C01 $1A80 $220B $4350 $DF06 $490C $468E $82 $4B0B $18D2 $6812 $9903 $9B01 $1858 $3902 $4008 $9902 $31FB $23FF $4019 $2300 +BYTE $0 $F8 +SHORT $E00A $46C0 +BYTE $31 $BD $2 $2 $B0 $BC $2 $2 $1 $2 $0 $0 $B8 $2B $0 $8 +POIN HPFramePointers +SHORT $4E0D $6836 $2E00 $D007 $7AF0 $21C0 $4208 $D103 $7B30 $2101 $4208 $D103 $4808 $2100 $6001 $E083 $4806 $7801 $2902 $D064 $7841 $7AE2 $428A $DC07 $2102 $7001 $E05D $46C0 +BYTE $50 $4E $0 $3 $0 $AE $3 $2 +SHORT $7042 $2101 $7001 $2700 $483B $7800 $2110 $4208 $D12C $7AE0 $2180 $4208 $D028 $1C20 $1C31 $4A37 $4696 +BYTE $0 $F8 +SHORT $2800 $D11C $251E $5B61 $2900 $D01D $1C20 $4A33 $4696 +BYTE $0 $F8 +SHORT $2800 $D00E $5B60 $1C31 $4A30 $4696 +BYTE $0 $F8 +SHORT $2800 $D10B $5B60 $492E $468E +BYTE $0 $F8 +SHORT $28FF $D001 $2818 $DC06 $3502 $2D26 $DDE4 $E004 $2001 $4307 $E001 $2002 $4307 $6830 $7900 $6821 $7909 $4A25 $4696 +BYTE $0 $F8 +SHORT $2800 $D001 $2004 $4307 $4823 $3002 $7AE1 $1840 $7007 $7AE0 $21C0 $4208 $D129 $1C30 $6821 $7909 $F000 $F85B $2800 $D001 $2004 $4307 $481A $3002 $7AE1 $1840 $7007 $E01A $4D17 $3502 $7AE0 $5C2D $2D00 $D014 $2001 $4228 $D003 $2000 $4669 $F000 $F826 $2002 $4228 $D003 $2008 $4669 $F000 $F81F $2004 $4228 $D003 $2010 $4669 $F000 $F818 $B004 $BCF0 $2030 $5C20 $6C0 $EC0 $4907 $4708 +BYTE $31 $BD $2 $2 $88 $6C $1 $8 $74 $65 $1 $8 $EC $6B $1 $8 $24 $76 $1 $8 $68 $3F $8 $8 $0 $AE $3 $2 $BF $76 $2 $8 +SHORT $B530 $680A $2A00 $D011 $1C04 $1C0D $4909 $468E $68E9 $6868 $1840 $300B $3902 $4008 $68A9 $31EE $22FF $4011 $4A04 $1912 $2300 +BYTE $0 $F8 +SHORT $BC30 $BC01 $4700 $46C0 +BYTE $B8 $2B $0 $8 +POIN WS_FrameData +SHORT $B518 $1C03 $6800 $6AC0 $1C02 $2800 $D00F $2400 $3C01 $3401 $2C07 $DA09 $1910 $7800 $4288 $D1F8 $1C18 $1C21 $4A03 $4696 +BYTE $0 $F8 +SHORT $E000 $2000 $BC18 $BC02 $4708 +BYTE $10 $83 $2 $8 diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.s new file mode 100644 index 00000000..b6fb3079 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/WarningAndHpBars.s @@ -0,0 +1,442 @@ +@Don't have more than 1 of these equal to 1 at a time. Issues will arise. +.equ FE6, 0 +.equ FE7, 0 +.equ FE8, 1 @untested + +.thumb +.org 0 + +@jumped to at 22410 (fe6) +@r4 = char data ptr + +.equ crit_warning_cutoff, 24 @anything less than or equal this won't trigger the ! + +.if FE6 == 1 + .equ WarningCache, 0x0203ACC0 @free space in ram. Change this if necessary. + .equ OptionByte2, 0x0202AA66 + .equ CameraStuff, 0x0202AA08 + .equ WRAMDisplay, 0x08003870 + .equ CurrentCharPtr, 0x030044B0 + .equ Can_Equip_Item, 0x08016538 + @ .equ Get_Unit_Max_Hp, TODO + .equ Get_Item_Crit, 0x08017224 + .equ Check_Effectiveness, 0x08016A10 + .equ Talk_Check, 0x0806AF4C + .equ return_addr, 0x0802241A+1 + .equ x_coord, 0x0E + .equ y_coord, 0x0F + .equ maximum_hp, 0x10 + .equ current_hp, 0x11 + .equ inventory_slot1, 0x1C + .equ status_byte, 0x2E +.endif + +.if FE7 == 1 + .equ WarningCache, 0x0203ACC0 @free space in ram. Change this if necessary. + .equ OptionByte2, 0x0202BC39 + .equ CameraStuff, 0x0202BBB8 + .equ WRAMDisplay, 0x08004388 + .equ CurrentCharPtr, 0x03004690 + .equ Can_Equip_Item, 0x080161A4 + @ .equ Get_Unit_Max_Hp, TODO + .equ Get_Item_Crit, 0x08017328 + .equ Check_Effectiveness, 0x08016820 + .equ Talk_Check, 0x080789FC + .equ return_addr, 0x08025C16+1 + .equ x_coord, 0x10 + .equ y_coord, 0x11 + .equ maximum_hp, 0x12 + .equ current_hp, 0x13 + .equ inventory_slot1, 0x1E + .equ status_byte, 0x30 +.endif + +.if FE8 == 1 + .equ WarningCache, 0x0203AE00 @free space in ram. Change this if necessary. + .equ OptionByte2, 0x0202BD31 + .equ CameraStuff, 0x0202BCB0 + .equ WRAMDisplay, 0x08002BB8 + .equ CurrentCharPtr, 0x03004E50 + .equ Can_Equip_Item, 0x08016574 + .equ Get_Unit_Max_Hp, 0x08019190 + .equ Get_Unit_Cur_HP, 0x08019150 + .equ Get_Item_Crit, 0x08017624 + .equ Check_Effectiveness, 0x08016BEC + .equ Slayer_Check, 0x08016C88 + .equ Talk_Check, 0x08083F68 + .equ Support_Check, 0x08028310 + .equ return_addr, 0x080276BE+1 + .equ x_coord, 0x10 + .equ y_coord, 0x11 + .equ maximum_hp, 0x12 + .equ current_hp, 0x13 + .equ inventory_slot1, 0x1E + .equ status_byte, 0x30 +.endif + +push {r4-r7} +add sp,#-0x10 + +@First, check if all this stuff is even enabled +ldr r0,=OptionByte2 +ldrb r0,[r0] +.if FE8 == 1 +mov r1,#0x80 +.else +@ NOTE: this is either the fe6-specific bit, or teq has added an extra setting in the original impl of this +mov r1,#0x20 +.endif +tst r0,r1 +beq HpBars @if bit isn't set, hp bars are on (at the very least) +b GoBack + +HpBars: +mov r0,#0 +str r0,[sp] @bool for whether the unit is on the screen +mov r1,#x_coord +ldsb r1,[r4,r1] +lsl r1,#4 +ldr r2,=CameraStuff +mov r3,#0xC +ldsh r0,[r2,r3] @camera x +sub r3,r1,r0 @r3= x - camera_x +mov r0,#y_coord +ldsb r0,[r4,r0] +lsl r0,#4 +mov r1,#0xE +ldsh r1,[r2,r1] @camera y +sub r2,r0,r1 @r2 = y - camera_y +mov r1,r3 +add r1,#0x10 +mov r0,#0x80 +lsl r0,#1 +cmp r1,r0 +bhi CheckIfSelected @x is either >0x100 or <0, so out of range +mov r0,r2 +add r0,#0x10 +cmp r0,#0xB0 +bhi CheckIfSelected @y is either >0xB0 or <0, so out of range +mov r1,#1 +str r1,[sp] @change bool to true (display whatever) +str r3,[sp,#0x4] @sp+4 = x - x' +str r2,[sp,#0x8] @sp+8 = y - y' +ldr r1,=#0x201 +str r1,[sp,#0xC] @constant to determine where things get drawn +@Find out whether we even need to display an hp bar +@.if FE8 == 1 @ TODO: other games +@ mov r0, r4 @ arg r0 = Unit +@ ldr r1, =Get_Unit_Max_Hp +@ mov r14,r1 +@ .short 0xF800 +@.else + mov r0,#maximum_hp + ldsb r0,[r4,r0] +@.endif +push {r7} +mov r7,r0 +@.if FE8 == 1 +@ mov r0,r4 +@ ldr r1,=Get_Unit_Cur_HP +@ mov r14,r1 +@ .short 0xF800 +@.else +mov r0,#current_hp +ldsb r0,[r4,r0] +@.endif + +mov r2,r0 +mov r0,r7 +pop {r7} + +cmp r2, #0x0 +beq CheckIfSelected @if hp is zero, don't try to show the bar + +cmp r2,r0 +bge CheckIfSelected @if hp is max, don't show the bar +mov r1,r0 @ arg r1 = mhp +sub r0,r2 +mov r2,#11 +mul r0,r2 @ arg r0 = damage*11 +swi #6 @damage*11/maxHP +@Call the drawing routine +ldr r1,=WRAMDisplay +mov r14,r1 +lsl r2,r0,#2 +ldr r3,=HPFramePointers @EA defined +add r2,r3 +ldr r2,[r2] +ldr r1,[sp,#0xC] @0x201 +ldr r3,[sp,#0x4] @x-x' +add r0,r3,r1 +sub r1,#2 @0x1FF +and r0,r1 +ldr r1,[sp,#0x8] @y-y' +add r1,#0xFB +mov r3,#0xFF +and r1,r3 +mov r3,#0 +.short 0xF800 @call routine to display bars +b CheckIfSelected + +.align +.ltorg + +@This section is for effectiveness/talk/wta/whatever, which only display if a unit is selected. Since checking for this every frame makes it super laggy, we create a cache. First byte will be reserved for status of the operation: 0 if unit isn't selected, 1 if filling the cache, 2 if done +CheckIfSelected: +ldr r6,=CurrentCharPtr +ldr r6,[r6] +cmp r6,#0 +beq UnitNotSelected @no current unit +ldrb r0,[r6,#0xB] +mov r1,#0xC0 +tst r0,r1 +bne UnitNotSelected @selecting enemy/ally shouldn't do anything + +ldrb r0,[r6,#0xC] @status byte +mov r1,#1 @do not display standing map sprite +tst r0,r1 +bne CheckIfFirstPass + +UnitNotSelected: +ldr r0,=WarningCache +mov r1,#0 +str r1,[r0] +b GoBack + +CheckIfFirstPass: +ldr r0,=WarningCache +ldrb r1,[r0] +cmp r1,#2 +beq DisplayOtherIcons +@at this point, we must be on the first pass +ldrb r1,[r0,#1] @most recent allegiance byte we looked at +ldrb r2,[r4,#0xB] @current allegiance +cmp r2,r1 +bgt FirstPass @we haven't looped through all the units yet if current>previous +mov r1,#2 +strb r1,[r0] @first pass is complete +b DisplayOtherIcons + +.align +.ltorg + +FirstPass: +strb r2,[r0,#1] @replace previous looked-at unit with current one +mov r1,#1 +strb r1,[r0] @and ensure we're still in first-pass mode +mov r7,#0 @initialize the bitfield we write to the cache + +@Effectiveness/Critical checks (WTA/D would also go here, if applicable) +ldr r0,=OptionByte2 +ldrb r0,[r0] +mov r1,#0x10 +tst r0,r1 +bne TalkEventCheck @if this bit is set, we only want hp bars and talk icons +ldrb r0,[r4,#0xB] +mov r1,#0x80 +tst r0,r1 +beq TalkEventCheck @if not enemy, no need for this check + +@slayer check for fe8 +.if FE8 == 1 + mov r0,r4 + mov r1,r6 + ldr r2,=Slayer_Check + mov r14,r2 + .short 0xF800 + cmp r0,#0 + bne IsEffective +.endif +mov r5,#inventory_slot1 +LoopThroughItems: +ldrh r1,[r4,r5] +cmp r1,#0 +beq TalkEventCheck +mov r0,r4 +ldr r2,=Can_Equip_Item +mov r14,r2 +.short 0xF800 +cmp r0,#0 +beq NextItem +ldrh r0,[r4,r5] +mov r1,r6 +ldr r2,=Check_Effectiveness +mov r14,r2 +.short 0xF800 +cmp r0,#0 +bne IsEffective +ldrh r0,[r4,r5] +ldr r1,=Get_Item_Crit +mov r14,r1 +.short 0xF800 +cmp r0,#0xFF +beq NextItem +cmp r0,#crit_warning_cutoff +bgt IsCritty +NextItem: +add r5,#2 +cmp r5,#inventory_slot1+8 +ble LoopThroughItems +b TalkEventCheck + +IsEffective: +mov r0,#1 +orr r7,r0 +b TalkEventCheck + +IsCritty: +mov r0,#2 +orr r7,r0 + +TalkEventCheck: +ldr r0,[r6] +ldrb r0,[r0,#4] @active unit's char id +ldr r1,[r4] +ldrb r1,[r1,#4] @current unit's char id +ldr r2,=Talk_Check +mov r14,r2 +.short 0xF800 +cmp r0,#0 +beq WriteToCache +mov r0,#4 +orr r7,r0 +WriteToCache: +ldr r0,=WarningCache +add r0,#2 @first 2 bytes are occupied +ldrb r1,[r4,#0xB] +add r0,r1 +strb r7,[r0] + +SupportCheck: +@28310 should work, but it needs to check the SupportDenier code. +ldrb r0,[r4,#0xB] @allegiance +mov r1,#0xC0 +tst r0,r1 +bne GoBack @selecting enemy/ally shouldn't do anything + +mov r0,r6 @current unit's RAM ptr +ldr r1,[r4] +ldrb r1,[r1,#4] @current unit's char id +bl SupportCheckerFunction +cmp r0,#0 +beq WriteToCache2 +mov r0,#4 +orr r7,r0 +WriteToCache2: +ldr r0,=WarningCache +add r0,#2 @first 2 bytes are occupied (we can use same bit as talk) +ldrb r1,[r4,#0xB] +add r0,r1 +strb r7,[r0] +b GoBack @opting to do the displaying on the second pass + +DisplayOtherIcons: +ldr r5,=WarningCache +add r5,#2 +ldrb r0,[r4,#0xB] +ldrb r5,[r5,r0] +cmp r5,#0 +beq GoBack @nothing to display +@DisplayEffective +mov r0,#1 @effective +tst r0,r5 +beq DisplayCrit +mov r0,#0 +mov r1,sp +bl Draw_Warning_Sign +DisplayCrit: +mov r0,#2 +tst r0,r5 +beq DisplayTalk +mov r0,#8 +mov r1,sp +bl Draw_Warning_Sign +DisplayTalk: +mov r0,#4 +tst r0,r5 +beq GoBack +mov r0,#0x10 +mov r1,sp +bl Draw_Warning_Sign + +GoBack: +add sp,#0x10 +pop {r4-r7} +mov r0,#status_byte +ldrb r0,[r4,r0] +lsl r0,#0x1B +lsr r0,#0x1B +ldr r1,=return_addr +bx r1 + +.align +.ltorg + +Draw_Warning_Sign: +@r0=thing to determine what we're drawing, r1=sp (to retrieve x and y stuff) +push {r4,r5,r14} +ldr r2,[r1] @bool to determine whether we're on screen +cmp r2,#0 +beq FinishedDrawing +mov r4,r0 +mov r5,r1 +ldr r1,=WRAMDisplay +mov r14,r1 +ldr r1,[r5,#0xC] @0x201 +ldr r0,[r5,#0x4] @x-x' +add r0,r1 +add r0,#0xB @tweak for x coordinate, whatever that means +sub r1,#2 +and r0,r1 +ldr r1,[r5,#0x8] @y-y' +add r1,#0xEE @y coordinate tweak? +mov r2,#0xFF +and r1,r2 +ldr r2,=WS_FrameData +add r2,r4 +mov r3,#0 +.short 0xF800 @call routine to display bars +FinishedDrawing: +pop {r4-r5} +pop {r0} +bx r0 + +.align +.ltorg + +SupportCheckerFunction: @r0=unit struct, r1=unitID. Check if unitID is in unit's support list +push {r3,r4,lr} +mov r3, r0 @save unit pointer to r3 +ldr r0, [r0] @unit ROM data +ldr r0, [r0, #0x2C] @unit support data +mov r2, r0 @save support data to r2 +cmp r0, #0x0 +beq EndSupportCheckerFunc +mov r4, #0x0 +sub r4, #0x1 + +SupportPartnerLoop: +add r4, #0x1 +cmp r4, #0x7 +bge ReturnNoSupport +add r0, r2, r4 +ldrb r0, [r0] @unit id +cmp r0, r1 +bne SupportPartnerLoop + +mov r0, r3 +mov r1, r4 +ldr r2,=Support_Check +mov r14,r2 +.short 0xF800 +b EndSupportCheckerFunc + +ReturnNoSupport: +mov r0, #0x0 +EndSupportCheckerFunc: +pop {r3,r4} +pop {r1} +bx r1 + +.align +.ltorg diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/mss_defs.s b/EngineHacks/ExternalHacks/StatusExpansion/_compat/mss_defs.s new file mode 100644 index 00000000..bcceb202 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/mss_defs.s @@ -0,0 +1,1397 @@ +@graphics and text +.equ CopyToPaletteBuffer, 0x08000DB8 +.equ _ResetIconGraphics, 0x08003578 +.equ DrawIcon, 0x080036BC +.equ Text_InitFont, 0x08003C94 +.equ Text_GetColorID, 0x08003E64 +.equ Text_Display, 0x08003E70 +.equ Text_GetStringTextWidth, 0x08003EDC +.equ Text_GetStringTextCenteredPos, 0x08003F90 +.equ Text_DrawString, 0x08004004 +.equ DrawTextInline, 0x0800443C +.equ Text_InsertString, 0x08004480 +.equ DrawSpecialUiChar, 0x08004B0C +.equ DrawDecNumber, 0x08004B94 +.equ DrawUiSmallNumber, 0x08004BE4 +.equ DrawStatScreenBonusNumber, 0x08004BF0 +.equ DrawLargeFont, 0x08004D5C +.equ String_GetFromIndex, 0x0800A240 +.equ String_ExpandTactName, 0x0800A3B8 + +@Menus and boxes +.equ FillBgMap, 0x08001220 +.equ Decompress, 0x08012F50 +.equ LoadNewUIPal, 0x0804E0A8 +.equ MakeUIWindowTileMap_BG0BG1, 0x0804E368 +.equ MovingMapSprite_CreateForUI, 0x080784F4 +.equ MovingMapSprite_EndAll, 0x080790A4 +.equ BgMap_ApplyTsa, 0x080D74A0 +.equ BgMapFillRect, 0x080D74B8 + +@getters +.equ UnitHasMagicRank, 0x08018A58 +.equ MountedIconHelper, 0x08018AF0 +.equ MagCheck, 0x8018A58 +.equ AidCheck, 0x080189B8 +.equ CurHPGetter, 0x08019150 +.equ MaxHPGetter, 0x08019190 +.equ StrGetter, 0x080191b0 +.equ MagGetter, 0x080191b8 +.equ SklGetter, 0x080191d0 +.equ SpdGetter, 0x08019210 +.equ LuckGetter, 0x08019298 +.equ DefGetter, 0x08019250 +.equ ResGetter, 0x08019270 +.equ MagConGetter, 0x08019284 @defined in the modularstatgetter +.equ MovGetter, 0x08019224 @defined in the modularstatgetter +.equ AffinityGetter, 0x080286BC +.equ EquippedWeaponGetter, 0x08016B28 +.equ EquippedItemSlotGetter, 0x08016B58 +.equ GetItemRangeString, 0x08016CC0 +.equ IsItemUsable, 0x08016EE4 +.equ ItemWeightGetter, 0x0801760C +.equ GetUnitItemCount, 0x080179D8 +.equ SetupBattleStructFromUnitAndWeapon, 0x0802A400 +.equ GetBallistaItemAt, 0x0803798C +.equ CheckGameLinkArenaBit, 0x08042E98 + +@Statscreen-specific stuff +.equ DrawItemOnStatscreen, 0x08016A2C +.equ WriteTrvText, 0x080193E8 +.equ WriteStatusText, 0x08019414 +.equ Statscreen_ClearBuffer, 0x08086DF0 @clears 2003c00 region +.equ DrawStatscreenTextMap, 0x08086E00 +.equ Statscreen_StartLeftPanel, 0x08086E44 +.equ DrawBWLNumbers, 0x08086FAC +.equ DrawBar, 0x080870BC +.equ DrawSupports, 0x08087698 +.equ DrawWeaponRank, 0x08087788 + +@RAM +.equ DebuffTable, 0x203F100 +.equ gActiveBattleUnit, 0x203A4EC +.equ StatScreenStruct, 0x2003BFC +.equ BgBitfield, 0x300000D +.equ TileBufferBase, 0x2003C2C +.equ tile_origin, 0x2003C94 +.equ gpStatScreenPageBg0Map, 0x2003D2C +.equ gpStatScreenPageBg2Map, 0x200472C +.equ gGenericBuffer, 0x2020188 +.equ gBg0MapBuffer, 0x2022CA8 +.equ gCurrentTextString, 0x202A6AC +.equ Const_2022D40, 0x2022D40 +.equ Const_2023D40, 0x2023D40 +.equ Const_2003D2C, 0x2003D2C +.equ Const_200472C, 0x200472C + +@With this in mind, any unlabeled RAM addresses beginning with 0x200 can reasonably be assumed to be offsets within the tilemap + +@Colours +.equ Green, 4 +.equ Yellow, 3 +.equ Blue, 2 +.equ Grey, 1 +.equ White, 0 + +@Hardcoded classIDs (Gorgon Eggs) +.equ Deny_Statscreen_Class_Lo, 0x34 +.equ Deny_Statscreen_Class_Hi, 0x62 + +.macro blh to, reg=r3 + push {\reg} + ldr \reg, =\to + mov lr, \reg + pop {\reg} + .short 0xf800 +.endm + +.macro blm to, from=origin + .equ func_\to, . + \to - \from + bl func_\to +.endm + +@08087184 +.macro page_start + push {r4-r7, r14} + mov r7, r8 + push {r7} + add sp, #-0x50 + ldr r7, =TileBufferBase @r7 contains the latest buffer. starts at 2003c2c. + ldr r5, =StatScreenStruct + ldr r0, [r5, #0xC] + mov r8, r0 @r8 contains the current unit's data + clear_buffers +.endm + +.macro page_end + add sp, #0x50 + pop {r7} + mov r8, r7 + pop {r4-r7} + pop {r0} + bx r0 +.endm + +.macro draw_textID_at tile_x, tile_y, textID=0, width=3, colour=3, growth_func=-1 @growth func is # of growth getter in growth_getters_table; 0=hp, 1=str, 2=skl, etc + mov r3, r7 + mov r1, #\width + @r3 is current buffer location, r1 is width. + ldrh r2, [r3] @current number + add r2, r1 @for the next one. + strb r1, [r3, #4] @store width + strb r2, [r3, #8] @assign the next one. + .if \textID + ldr r0, =\textID @otherwise assume it's in r0 + .endif + blh String_GetFromIndex + mov r2, #0x0 + str r2, [sp] + str r0, [sp, #4] + mov r2, #\colour @colour + .ifge \growth_func + ldr r1, [sp, #0xC] @growth getters table + mov r0, #\growth_func-1 + lsl r0, #2 + ldr r1, [r1, r0] @relevant growth getter function + mov r0, r8 + mov r14, r1 + .short 0xF800 @returns growth + mov r1, sp + add r1, #0x18 + ldr r2, [sp, #0x14] @growth options word and'd with 0x10, so non-zero if stat name color should reflect growth + ldr r3, =Get_Palette_Index + mov r14, r3 + .short 0xF800 @given growth, returns palette index, and does some shenanigans + mov r2, r0 + .endif + mov r0, r7 + ldr r1, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r3, #0 + blh DrawTextInline, r4 + .ifge \growth_func + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x18] + bl Restore_Palette @see that func for an explanation (mss_page1_skills) + .endif + add r7, #8 +.endm + +.macro draw_buffered_text, tile_x, tile_y, width=10, colour=3 + mov r0, sp + mov r1, #\width + str r1, [r0] + mov r0, #0 + ldr r1, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r2, #\colour + mov r3, #0 + blh DrawTextInline, r4 + bl Restore_Palette +.endm + +.macro draw_skillname_at tile_x, tile_y, textID=0, width=14, colour=3, growth_func=-1 @growth func is # of growth getter in growth_getters_table; 0=hp, 1=str, 2=skl, etc + mov r3, r7 + mov r1, #\width + @r3 is current buffer location, r1 is width. + ldrh r2, [r3] @current number + add r2, r1 @for the next one. + strb r1, [r3, #4] @store width + strb r2, [r3, #8] @assign the next one. + .if \textID + ldr r0, =#\textID @otherwise assume it's in r0 + .endif + blh String_GetFromIndex + bl GetSkillNameFromSkillDesc + mov r2, #0x0 + str r2, [sp] + str r0, [sp, #4] + mov r2, #\colour @colour + .ifge \growth_func + ldr r1, [sp, #0xC] @growth getters table + mov r0, #\growth_func-1 + lsl r0, #2 + ldr r1, [r1, r0] @relevant growth getter function + mov r0, r8 + mov r14, r1 + .short 0xF800 @returns growth + mov r1, sp + add r1, #0x18 + ldr r2, [sp, #0x14] @growth options word and'd with 0x10, so non-zero if stat name color should reflect growth + .set pal_index, (Get_Palette_Index - . - 6) + ldr r3, =pal_index + add r3, pc + ldr r3, [r3] + mov r14, r3 + .short 0xF800 @given growth, returns palette index, and does some shenanigans + mov r2, r0 + .endif + mov r0, r7 + ldr r1, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r3, #0 + blh DrawTextInline, r4 + .ifge \growth_func + ldr r1, [sp, #0x14] + ldr r0, [sp, #0x18] + bl Restore_Palette @see that func for an explanation (mss_page1_skills) + .endif + add r7, #8 +.endm + +.macro draw_bar_at bar_x, bar_y, getter, offset, bar_id + mov r0, r8 + blh \getter + mov r1, r8 + mov r3, #\offset + ldsb r3, [r1, r3] + str r0, [sp] + ldr r0, [r1, #0x4] @class + ldrb r0, [r0, #\offset] @stat cap + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + str r0, [sp, #0x4] + mov r0, #(\bar_id) + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_bar_at_with_cap_getter bar_x, bar_y, statgetter, capgetter, offset, bar_id + mov r0, r8 + blh \statgetter + mov r1, r8 + mov r3, #\offset + ldsb r3, [r1, r3] + str r0, [sp] + ldr r0, [r1, #0x4] @class + ldrb r0, [r0, #0x4] @class id + blh \capgetter + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + str r0, [sp, #0x4] + mov r0, #(\bar_id) + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_halved_bar_at bar_x, bar_y, getter, offset, bar_id + mov r0, r8 + blh \getter + mov r1, r8 + mov r3, #\offset + ldsb r3, [r1, r3] @base stat + asr r3, #1 + str r0, [sp] + ldr r0, [r1, #0x4] @class + ldrb r0, [r0, #\offset] @stat cap + lsl r0, r0, #0x18 + asr r0, r0, #0x19 @divided by 2 + str r0, [sp, #0x4] + mov r0, #(\bar_id) + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_str_bar_at, bar_x, bar_y + draw_bar_at \bar_x, \bar_y, StrGetter, 0x14, 0 +.endm + +.macro draw_mag_bar_at, bar_x, bar_y + mov r0, r8 + blh MagGetter + mov r1, r8 + mov r3, #0x3A + ldsb r3, [r1, r3] + str r0, [sp] + ldr r0, [r1, #0x4] @class + ldrb r0, [r0, #0x4] @class id + lsl r0, #0x2 + ldr r1, =MagClassTable + add r0, r1 + ldrb r0, [r0, #0x2] + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + str r0, [sp, #0x4] + mov r0, #0x1 + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_skl_bar_at, bar_x, bar_y + draw_bar_at \bar_x, \bar_y, SklGetter, 0x15, 2 +.endm + +.macro draw_skl_reduced_bar_at, bar_x, bar_y @for rescuing + draw_halved_bar_at \bar_x, \bar_y, SklGetter, 0x15, 2 +.endm + +.macro draw_spd_bar_at, bar_x, bar_y + draw_bar_at \bar_x, \bar_y, SpdGetter, 0x16, 3 +.endm + +.macro draw_spd_reduced_bar_at, bar_x, bar_y @for rescuing + draw_halved_bar_at \bar_x, \bar_y, SpdGetter, 0x16, 3 +.endm + +.macro draw_luck_bar_at, bar_x, bar_y + mov r0, r8 + blh LuckGetter + mov r1, r8 + mov r3, #0x19 + ldsb r3, [r1, r3] + str r0, [sp] + mov r0, #0x1e @cap is always 30 + str r0, [sp, #0x4] + mov r0, #0x6 + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_def_bar_at, bar_x, bar_y + draw_bar_at \bar_x, \bar_y, DefGetter, 0x17, 4 +.endm + +.macro draw_res_bar_at, bar_x, bar_y + draw_bar_at \bar_x, \bar_y, ResGetter, 0x18, 5 +.endm + +.macro draw_growth_at, bar_x, bar_y + mov r14, r0 @r0 = growth getter to bl to + mov r0, r8 + .short 0xF800 @returns total growth in r0, base growth in r1 + sub r0, r0, r1 @difference between total and base + str r0, [sp, #0x10] + mov r2, r1 @base in r2 + mov r1, #0x2 @palette index + ldr r0, =(tile_origin+(0x20*2*\bar_y)+(2*\bar_x)) + blh DrawDecNumber + ldr r0, [sp, #0x10] @difference from earlier + ldr r1, =(tile_origin+(0x20*2*\bar_y)+(2*(\bar_x+1))) + blh DrawStatScreenBonusNumber +.endm + +.macro draw_move_bar_at, bar_x, bar_y + mov r1, r8 + @check AI + mov r3, #0x41 + ldrb r3, [r1, r3] @AI byte 4 + cmp r3, #0x20 + beq NoMove + mov r3, #0x30 + ldrb r3, [r1, r3] @status + mov r0, #0xF + and r3, r0 + cmp r3, #0x9 @freeze status + beq NoMove + ldr r0, [r1, #0x4] @class + mov r3, #0x12 @move + ldsb r3, [r0, r3] + mov r0, #0x1D @bonus + ldsb r0, [r1, r0] + b NormalMove + + NoMove: + mov r0, #0 + mov r3, #1 + neg r3, r3 + b DrawMove + + NormalMove: + DrawMove: + add r0, r0, r3 + str r0, [sp] @r0 is total, r3 is base + mov r6, #0xF + str r6, [sp, #0x4] + mov r0, #0x6 @why 6? + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_move_bar_with_getter_at, bar_x, bar_y +@base in r3, final in sp, cap in sp+4, call getter + mov r1, r8 + ldr r0, [r1, #0x4] @class + mov r3, #0x12 @move + ldsb r3, [r0, r3] + @ mov r0, #0x1D @bonus + @ ldsb r0, [r1, r0] + @ add r0, r0, r3 + + push {r1-r3} + mov r0, r8 + blh MovGetter + pop {r1-r3} + cmp r0, #0 + bne MoveNotNegated + mvn r0, r0 + mov r3, r0 + MoveNotNegated: + str r0, [sp] @final + mov r6, #0xF + str r6, [sp, #4] + mov r0, #0x8 + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_move_number_at, tile_x, tile_y + mov r1, r8 + ldr r0, [r1, #0x4] @class + mov r3, #0x12 @move + ldsb r3, [r0, r3] + mov r0, #0x1D @bonus + ldsb r0, [r1, r0] + cmp r0, #0 + beq MoveNotBoosted + mov r1, #Green + b FromMoveBoosted + MoveNotBoosted: + mov r1, #Blue + FromMoveBoosted: + add r0, r0, r3 + draw_number_at \tile_x, \tile_y +.endm + +.macro draw_con_bar_at, bar_x, bar_y + mov r1, r8 + ldr r0, [r1, #0x4] @class + mov r3, #0x11 @con + ldsb r3, [r0, r3] + ldr r0, [r1] + ldrb r0, [r0, #0x13] @bonus + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + add r3, r3, r0 + mov r0, #0x1A + ldsb r0, [r1, r0] + add r0, r3, r0 + str r0, [sp] + ldr r0, [r1, #0x4] + ldrb r0, [r0, #0x19] + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + str r0, [sp, #0x4] + mov r0, #0x7 + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_rating_at, tile_x, tile_y + push {r4} + mov r4, #0x0 + mov r0, r8 + blh MaxHPGetter + add r4, r4, r0 + mov r0, r8 + blh StrGetter + add r4, r4, r0 + mov r0, r8 + blh SklGetter + add r4, r4, r0 + mov r0, r8 + blh SpdGetter + add r4, r4, r0 + mov r0, r8 + blh LuckGetter + add r4, r4, r0 + mov r0, r8 + blh DefGetter + add r4, r4, r0 + mov r0, r8 + blh ResGetter + add r4, r4, r0 + mov r0, r4 + pop {r4} + mov r1, #Blue + draw_number_at \tile_x, \tile_y +.endm + +.macro draw_con_number_at, tile_x, tile_y + mov r1, r8 + ldr r0, [r1, #0x4] @class + mov r3, #0x11 @con + ldsb r3, [r0, r3] + ldr r0, [r1] + ldrb r0, [r0, #0x13] @bonus + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + add r3, r3, r0 + mov r0, #0x1A + ldsb r0, [r1, r0] + cmp r0, #0 + beq ConNotBoosted + mov r1, #Green + b FromConBoosted + ConNotBoosted: + mov r1, #Blue + FromConBoosted: + add r0, r0, r3 + draw_number_at \tile_x, \tile_y +.endm + +.macro draw_con_bar_with_getter_at, bar_x, bar_y +@base in r3, final in sp, cap in sp+4, call getter + mov r1, r8 + ldr r0, [r1, #0x4] @class + mov r3, #0x11 @con + ldsb r3, [r0, r3] + ldr r0, [r1] + ldrb r0, [r0, #0x13] @bonus + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + add r3, r3, r0 + + push {r1-r3} + mov r0, r8 + blh MagConGetter + pop {r1-r3} + str r0, [sp] @final + ldr r0, [r1, #0x4] + ldrb r0, [r0, #0x19] + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + str r0, [sp, #0x4] @store cap + mov r0, #0x7 + mov r1, #(\bar_x-11) + mov r2, #(\bar_y-2) + blh DrawBar, r4 +.endm + +.macro draw_number_at, num_x, num_y, routine=0, colour=2 @r0 is number and r1 is colour + .if \routine + mov r0, r8 + blh \routine + .endif + mov r1, #\colour @defaults to blue + mov r2, r0 + ldr r0, =(tile_origin+(0x20*2*\num_y)+(2*\num_x)) + blh DrawDecNumber +.endm + +.macro draw_charge_at, num_x, num_y, colour=2 @r0 is number and r1 is colour + mov r0, r8 + mov r1, #0x47 + ldrb r0, [r0, r1] + sub r0, #0x10 + cmp r0, #0x0 + beq Greeny + mov r1, #0x2 + b Naxty + Greeny: + mov r1, #0x4 + Naxty: + mov r2, r0 + ldr r0, =(tile_origin+(0x20*2*\num_y)+(2*\num_x)) + blh DrawDecNumber +.endm + +.macro draw_aid_icon_at tile_x, tile_y + mov r0, r8 + ldr r1, [r0] + ldr r2, [r0, #4] + ldr r0, [r1, #0x28] + ldr r1, [r2, #0x28] + orr r0, r1 + blh MountedIconHelper + mov r1, #3 @sheet ID + lsl r1, r1, #8 @shifted 8 bits left + orr r1, r0 + mov r2, #0xA0 + lsl r2, #7 + ldr r0, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + blh DrawIcon +.endm + +.macro draw_trv_text_at, tile_x, tile_y, colour=Blue + draw_textID_at \tile_x, \tile_y, 0x4f9, width=9 @trv + mov r4, r7 + sub r4, #8 @un-advance the buffer + mov r0, r8 + blh WriteTrvText + mov r3, r0 + mov r0, r4 + mov r1, #0x18 @what is this? + mov r2, #\colour + blh Text_InsertString, r4 +.endm + +.macro draw_talk_text_at, tile_x, tile_y, colour=Blue + draw_textID_at \tile_x, \tile_y, width=9 @ideally you want a diff id. + blh CheckGameLinkArenaBit, r4 + mov r4, r7 + sub r4, #8 + cmp r0, #1 + beq DidntFindAPerson + mov r0, r8 + ldr r0, [r0] + ldrb r0, [r0, #0x4] @char byte + bl GetTalkee + cmp r0, #0x0 + bne FoundAPerson + DidntFindAPerson: + ldr r1, =0x7f7f7f @---[X] + ldr r0, =gCurrentTextString + str r1, [r0] + b TextBuffered + FoundAPerson: + mov r1, #0x34 + mul r0, r1 + ldr r1, =0x8017d64 @pointer to character table (in case repointed) + ldr r1, [r1] @actual character table + add r0, r1 + ldrh r0, [r0] + ldr r1, =String_GetFromIndex + mov r14, r1 + .short 0xF800 + TextBuffered: + mov r3, r0 + ldr r0, =Text_InsertString + mov r14, r0 + mov r0, r4 + @ add r0, #0x90 + mov r1, #0x18 + mov r2, #\colour + .short 0xF800 +.endm + +.macro rescue_check + mov r1, r8 + ldr r0, [r1, #0xc] @status + mov r1, #0x10 @rescuing? + and r0, r1 +.endm + +.macro draw_status_text_at, tile_x, tile_y, colour=Blue + draw_textID_at \tile_x, \tile_y, 0x4fa, width=9 @cond + mov r4, r7 + sub r4, #8 + mov r1, r8 + mov r0, r1 + blh WriteStatusText + mov r3, r0 + mov r0, r4 + mov r1, #0x16 @16 if status, otherwise 18??? + mov r2, #\colour + blh Text_InsertString, r4 + mov r1, r8 + add r1, #0x30 + ldrb r2, [r1] + cmp r2, #0 + beq NoStatusCount + ldr r0, =(0x2003ca2+(0x20*2*\tile_y)+(2*\tile_x)) + lsr r2, #5 + mov r1, #0 + blh DrawUiSmallNumber + NoStatusCount: +.endm + +.macro draw_affinity_icon_at, tile_x, tile_y + ldr r4, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r0, r8 + blh AffinityGetter + mov r1, #2 @icon sheet ID + lsl r1, r1, #8 @shifted 8 bits left + orr r1, r0 + mov r2, #0xA0 + lsl r2, r2, #0x7 + mov r0, r4 + blh DrawIcon +.endm + +.macro draw_icon_at, tile_x, tile_y, number=0 + @assumes icon number in r0 or else in number + .if \number + mov r0, #\number + .endif + ldr r4, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r1, r0 + mov r2, #0xA0 + lsl r2, r2, #0x7 + mov r0, r4 + blh DrawIcon +.endm + +.macro draw_stats_box showBallista=0 + ldr r0, =#0x8A02204 @box TSA + ldr r4, =gGenericBuffer + mov r1, r4 + blh Decompress + ldr r0, =#0x20049EE @somewhere on the bgmap + mov r2, #0xC1 + lsl r2, r2, #0x6 + mov r1, r4 + blh BgMap_ApplyTsa + ldr r0, =#0x8205A24 @map of text labels and positions + blh DrawStatscreenTextMap + ldr r6, =StatScreenStruct + ldr r0, [r6, #0xC] + ldr r0, [r0, #0x4] + ldrb r0, [r0, #0x4] + cmp r0, #Deny_Statscreen_Class_Hi + beq SS_DoneEquipHighlightBar + cmp r0, #Deny_Statscreen_Class_Lo + beq SS_DoneEquipHighlightBar + + .if \showBallista + + ldr r2, [r6, #0xC] + ldr r0, [r2, #0xC] + mov r1, #0x80 + lsl r1, r1, #0x4 @Check "in ballista" bit + and r0, r1 + cmp r0, #0x0 + beq NoBallistaEquipped_Box + + @get a non-empty ballista at unit position + mov r0, #0x10 + mov r1, #0x11 + ldsb r0, [r2, r0] + ldsb r1, [r2, r1] + blh GetBallistaItemAt + cmp r0, #0x0 + beq NoBallistaEquipped_Box + mov r5, r0 + mov r4, #0x0 @slot id + b SS_DrawEquippedItemHighlight + + .endif + + NoBallistaEquipped_Box: + ldr r0, [r6, #0xC] + blh EquippedItemSlotGetter + mov r4, r0 + mov r5, #0x0 + cmp r4, #0x0 @no equipped item will be -1 + blt SS_DoneEquipHighlightBar + + SS_DrawEquippedItemHighlight: + lsl r4, r4, #0x1 + add r0, r4, #1 + lsl r0, r0, #0x6 + ldr r1, =#0x2003D4C + add r0, r0, r1 + mov r1, #0x0 + mov r2, #0x35 @the equip 'E' + blh DrawSpecialUiChar + add r0, r4, #2 + lsl r0, r0, #0x6 + ldr r1, =#0x200472E + add r0, r0, r1 + ldr r1, =#0x8A02250 @TSA for highlight bar + mov r2, #0xC1 + lsl r2, r2, #0x6 + blh BgMap_ApplyTsa + + cmp r5, #0x0 + bne SS_DoneEquipHighlightBar + + SS_ItemBox_GetID: + ldr r0, [r6, #0xC] + add r0, #0x1E + add r0, r0, r4 + ldrh r5, [r0] + + SS_DoneEquipHighlightBar: + ldr r0, =StatScreenStruct + ldr r0, [r0, #0xC] + ldr r0, [r0, #0x4] + ldrb r0, [r0, #0x4] + cmp r0, #Deny_Statscreen_Class_Hi + beq SS_DrawItemBox_Unarmed + cmp r0, #Deny_Statscreen_Class_Lo + beq SS_DrawItemBox_Unarmed + + ldr r4, =#0x200407C @bgmap offset + ldr r6, =gActiveBattleUnit + mov r0, r6 + add r0, #0x5A @load battle atk + mov r1, #0x0 + ldsh r2, [r0, r1] + mov r0, r4 + mov r1, #0x2 + blh DrawDecNumber + mov r0, r4 + add r0, #0x80 + mov r1, r6 + add r1, #0x60 @load battle hit + mov r3, #0x0 + ldsh r2, [r1, r3] + mov r1, #0x2 + blh DrawDecNumber + mov r0, r4 + add r0, #0xE + mov r1, r6 + add r1, #0x66 @load battle crit + mov r3, #0x0 + ldsh r2, [r1, r3] + mov r1, #0x2 + blh DrawDecNumber + add r4, #0x8E + mov r0, r6 + add r0, #0x62 @load battle avoid + mov r6, #0x0 + ldsh r2, [r0, r6] + mov r0, r4 + mov r1, #0x2 + blh DrawDecNumber + b SS_DrawItemBox_RangeText + + SS_DrawItemBox_Unarmed: + ldr r4, =#0x200407C + mov r0, r4 + mov r1, #0x2 + mov r2, #0xFF + blh DrawDecNumber + mov r0, r4 + add r0, #0x80 + mov r1, #0x2 + mov r2, #0xFF + blh DrawDecNumber + mov r0, r4 + add r0, #0xE + mov r1, #0x2 + mov r2, #0xFF + blh DrawDecNumber + add r4, #0x8E + ldr r0, =gActiveBattleUnit + add r0, #0x62 @load battle avoid + mov r1, #0x0 + ldsh r2, [r0, r1] + mov r0, r4 + mov r1, #0x2 + blh DrawDecNumber + mov r5, #0x0 @set item as blank + + SS_DrawItemBox_RangeText: + mov r0, r5 + blh GetItemRangeString + mov r5, r0 + ldr r4, =#0x2003CB4 + blh Text_GetStringTextWidth + mov r1, #0x37 + sub r1, r1, r0 + mov r0, r4 + mov r2, #0x2 + mov r3, r5 + blh Text_InsertString, r4 + mov r4, #0x0 + ldr r0, =gpStatScreenPageBg0Map + ldr r3, =#0x7060 + mov r5, r3 + ldr r6, =#0x2C2 + add r2, r0, r6 + ldr r1, =#0x7068 + mov r3, r1 + add r6, #0x40 + add r1, r0, r6 + + @i think this loop just clears a gfx buffer + loc_0x8087660: + add r0, r4, r5 + strh r0, [r2] + add r0, r4, r3 + strh r0, [r1] + add r2, #0x2 + add r1, #0x2 + add r4, #0x1 + cmp r4, #0x7 + ble loc_0x8087660 + +.endm + +.macro draw_items_text showBallista=0 + push {r7} + mov r7, r8 + push {r7} + ldr r2, =StatScreenStruct + ldr r1, [r2, #0xC] + ldr r0, [r1, #0x4] + ldrb r0, [r0, #0x4] + cmp r0, #Deny_Statscreen_Class_Hi + beq GorgonEggSkip_ItemList + cmp r0, #Deny_Statscreen_Class_Lo + beq GorgonEggSkip_ItemList + + SS_StartItemsList: + mov r6, #0x40 + mov r7, r2 + + .if \showBallista + + ldr r2, [r7, #0xC] + ldr r0, [r2, #0xC] + mov r1, #0x80 + lsl r1, r1, #0x4 @Check "in ballista" bit + and r0, r1 + cmp r0, #0x0 + beq NoBallistaEquipped + + @get a non-empty ballista at unit position + mov r0, #0x10 + mov r1, #0x11 + ldsb r0, [r2, r0] + ldsb r1, [r2, r1] + blh GetBallistaItemAt + cmp r0, #0x0 + beq NoBallistaEquipped + mov r5, r0 + + mov r4, #0x2 + neg r4, r4 + mov r8, r4 + mov r4, #0x0 @draws item 1 in slot 2 + mov r2, #Yellow + b SS_DrawItemName + + .endif + + NoBallistaEquipped: + ldr r1, [r7, #0xC] + mov r4, #0x0 + ldrh r5, [r1, #0x1E] + cmp r5, #0x0 @does unit have items left? + beq GorgonEggSkip_ItemList + mov r8, r4 + b SS_LoopItemsList + + GorgonEggSkip_ItemList: + b SS_FinishItemsList + + SS_LoopItemsList: + ldr r2, [r7, #0xC] + ldr r0, [r2, #0xC] + mov r1, #0x80 + lsl r1, r1, #0x5 @Check "drop item" bit + and r0, r1 + cmp r0, #0x0 + beq SS_NotDroppableItem + + mov r0, r2 + blh GetUnitItemCount + sub r0, #0x1 + cmp r4, r0 + bne SS_NotDroppableItem + mov r2, #Green + b SS_DrawItemName + + .ltorg + + SS_NotDroppableItem: + ldr r0, [r7, #0xC] + mov r1, r5 + blh IsItemUsable + mov r2, #White + lsl r0, r0, #0x18 + cmp r0, #0x0 + bne SS_DrawItemName + mov r2, #Grey + SS_DrawItemName: + lsl r0, r4, #0x3 + ldr r1, =#0x2003C8C + add r0, r0, r1 + ldr r3, =#0x2003D2E @ypos? + add r3, r6, r3 + mov r1, r5 + blh DrawItemOnStatscreen, r5 + mov r0, #0x2 + add r8, r0 + add r6, #0x80 + add r4, #0x1 + cmp r4, #0x4 + bgt SS_FinishItemsList + ldr r0, [r7, #0xC] + add r0, #0x1E + add r0, r8 + ldrh r5, [r0] + cmp r5, #0x0 + bne SS_LoopItemsList + b SS_FinishItemsList + + .ltorg + + SS_FinishItemsList: + pop {r7} + mov r8, r7 + pop {r7} +.endm + +.macro clear_buffers + blh Text_InitFont + blh _ResetIconGraphics + @ blh Statscreen_ClearBuffer + blh DontBlinkLeft + @ blh MovingMapSprite_EndAll + @ ldr r4, =StatScreenStruct + @ ldr r0, [r4, #0xc] + @ mov r1, #0x50 + @ mov r2, #0x8A + @ blh MovingMapSprite_CreateForUI + @ str r0, [r4, #0x10] + blh Statscreen_StartLeftPanel + mov r0, #0 + str r0, [sp] + mov r0, sp + ldr r1, =0x6001380 + ldr r2, =0x1000a68 + swi 0xC @clear vram +.endm + + +.equ Sword, 0 +.equ Lance, 1 +.equ Axe, 2 +.equ Bow, 3 +.equ Staff, 4 +.equ Anima, 5 +.equ Light, 6 +.equ Dark, 7 + +.macro draw_weapon_rank_at, tile_x, tile_y, weapon, id + mov r0, #\id + mov r1, #\tile_x + mov r2, #\tile_y + mov r3, #\weapon + blh DrawWeaponRank, r4 +.endm + +.macro get_attack_speed + mov r0, r8 + blh SpdGetter + mov r4, r0 @speed in r4 + mov r0, r8 + blh EquippedWeaponGetter + blh ItemWeightGetter + mov r5, r0 @weight in r5 + mov r1, r8 + ldr r0, [r1, #0x4] @class + mov r3, #0x11 @con + ldsb r3, [r0, r3] + ldr r0, [r1] + ldrb r0, [r0, #0x13]@char bonus + lsl r0, r0, #0x18 + asr r0, r0, #0x18 + add r3, r3, r0 + mov r0, #0x1A + ldsb r0, [r1, r0] @body ring bonus + add r0, r3, r0 @total con in r0 + cmp r0, r5 + blt WeighedDown + mov r0, r4 @put speed directly + b AS_End + WeighedDown: + sub r5, r0 @weight - con in r5 + sub r0, r4, r5 + AS_End: +.endm + +.macro get_attack + ldr r6, =gActiveBattleUnit + mov r0, r6 + add r0, #0x5A + mov r1, #0x0 + ldsh r0, [r0, r1] +.endm + +.macro get_hit + mov r1, r6 + add r1, #0x60 + mov r3, #0x0 + ldsh r0, [r1, r3] +.endm + +.macro get_avoid + ldr r0, =gActiveBattleUnit + add r0, #0x62 + mov r1, #0x0 + ldsh r0, [r0, r1] +.endm + +@requires alternateicondraw +.macro draw_skill_icon_at, tile_x, tile_y, number=0 + .if NoAltIconDraw + .if \number + mov r0, #\number + .endif + + @ r1 = 0x0100 + mov r1, #1 + lsl r1, #8 + + @ r1 = [0x01][SkillIndex] + orr r1, r0 + + @ r2 = 0x4000 (aka tiles have palette #4) + mov r2, #0x40 + lsl r2, #8 + + ldr r0, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + + blh DrawIcon + .else + @assumes icon number in r0 or else in number + .if \number + mov r0, #\number + .endif + + ldr r4, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r1, r0 + mov r2, #0x80 + lsl r2, r2, #0x7 + mov r0, r4 + bl DrawSkillIcon + .endif +.endm + + +.macro draw_rating_icon_at, tile_x, tile_y, number=0 + .if NoAltIconDraw + .if \number + mov r0, #\number + .endif + + @ r1 = 0x0100 + mov r1, #1 + lsl r1, #9 + + @ r1 = [0x01][SkillIndex] + orr r1, r0 + + @ r2 = 0x4000 (aka tiles have palette #4) + mov r2, #0x20 + lsl r2, #8 + + ldr r0, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + + blh DrawIcon + .else + @assumes icon number in r0 or else in number + .if \number + mov r0, #\number + .endif + + ldr r4, =(tile_origin+(0x20*2*\tile_y)+(2*\tile_x)) + mov r1, r0 + mov r2, #0x80 + lsl r2, r2, #0x7 + mov r0, r4 + bl DrawSkillIcon + .endif +.endm + +.macro setup_menu + ldr r0, =0x020234A8 + mov r1, #0 + blh FillBgMap + mov r0, #0x0 + mvn r0, r0 @-1 + blh LoadNewUIPal+1 +.endm + +.macro draw_menu, tile_x, tile_y, width, height + push {r4} + sub sp, #4 + mov r0, #0 + str r0, [sp] + mov r0, #\tile_x+0xC + mov r1, #\tile_y+0x2 + mov r2, #\width + mov r3, #\height + blh MakeUIWindowTileMap_BG0BG1+1, reg=r4 + add sp, #4 + pop {r4} +.endm + + +.macro draw_character_name_at, tile_x, tile_y + ldr r0, [r7, #0xC] @load unit's pointer + ldr r0, [r0] @load character pointer + ldrh r0, [r0] @load name + blh String_GetFromIndex + mov r5, r0 + mov r0, #0x30 + mov r1, r5 + blh Text_GetStringTextCenteredPos + mov r6, r0 + + mov r0, r7 + add r0, #0x18 + ldr r1, =(0x20*2*\tile_y)+(2*\tile_x) + add r1, r8 + mov r4, #0 + str r4, [sp] + str r5, [sp, #4] + mov r2, #0 + mov r3, r6 + add r3, #3 + blh DrawTextInline +.endm + +.macro draw_class_name_at, tile_x, tile_y + ldr r0, [r7, #0xC] @load unit's pointer + ldr r0, [r0, #4] @load class pointer + ldrh r0, [r0] @load class name + blh String_GetFromIndex + mov r2, r7 + add r2, #0x20 + ldr r1, =(0x20*2*\tile_y)+(2*\tile_x) @#0x342 + add r1, r8 + str r4, [sp] + str r0, [sp, #4] + mov r0, r2 + mov r2, #0 + mov r3, #0 + blh DrawTextInline +.endm + +.macro draw_lv_icon_at, tile_x, tile_y + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) @#0x3C2 + add r0, r8 + mov r1, #3 + mov r2, #0x24 + mov r3, #0x25 + blh DrawLargeFont +.endm + +.macro draw_exp_icon_at, tile_x, tile_y + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) @#0x3CA + add r0, r8 + mov r1, #3 + mov r2, #0x1D + blh DrawSpecialUiChar +.endm + +.macro draw_hp_icon_at, tile_x, tile_y + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) @#0x442 + add r0, r8 + mov r1, #3 + mov r2, #0x22 + mov r3, #0x23 + blh DrawLargeFont +.endm + +.macro draw_ui_slash_at, tile_x, tile_y + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) @#0x44A + add r0, r8 + mov r1, #3 + mov r2, #0x16 + blh DrawSpecialUiChar +.endm + +.macro draw_level_at, tile_x, tile_y + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) @#0xF2 + add r0, r8 + ldr r1, [r7, #0xC] @unit pointer + mov r2, #8 + ldrb r2, [r1, r2] @level + mov r1, #2 + blh DrawDecNumber +.endm + +.macro draw_exp_at, tile_x, tile_y + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) @#0x3CE + add r0, r8 + ldr r1, [r7, #0xC] @unit pointer + ldrb r2, [r1, #9] @exp + mov r1, #2 + blh DrawDecNumber +.endm + +.macro draw_hp_at, tile_x, tile_y + ldr r0, [r7, #0xC] @unit pointer + blh CurHPGetter + cmp r0, #100 + ble DrawHP + mov r0, #0 + sub r0, #1 + DrawHP: + mov r2, r0 + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) + add r0, r8 + @ldr r0, [r7, #0xC] @unit pointer + @blh CurHPGetter + mov r1, #2 + blh DrawDecNumber +.endm + +.macro draw_max_hp, tile_x, tile_y + ldr r0, [r7, #0xC] @unit pointer + blh MaxHPGetter + cmp r0, #100 + blt DrawMaxHP + mov r0, #0 + sub r0, #1 + DrawMaxHP: + mov r2, r0 + ldr r0, =(0x20*2*\tile_y)+(2*\tile_x) + add r0, r8 + mov r1, #2 + blh DrawDecNumber + DrawMaxHP_End: +.endm + +.macro leftpage_start + push {r4-r7, r14} + mov r7, r8 + push {r7} + add sp, #-0x50 + ldr r7, =TileBufferBase @r7 contains the latest buffer. starts at 2003c2c. + ldr r5, =StatScreenStruct + ldr r0, [r5, #0xC] + mov r8, r0 @r8 contains the current unit's data + blh Text_InitFont + blh _ResetIconGraphics + @blh Statscreen_ClearBuffer + blh DontBlinkLeft + mov r0, #0 + str r0, [sp] + mov r0, sp + ldr r1, =0x6001380 + ldr r2, =0x1000a68 + swi 0xC @clear vram + ldr r7, =0x2003BFC + ldr r0, =gBg0MapBuffer + mov r8, r0 + mov r1, #0 + blh FillBgMap + ldr r4, [r7, #0xC] @load unit's pointer + mov r0, r4 + blh EquippedItemSlotGetter + mov r1, r0 + lsl r1, #0x18 + lsr r1, #0x18 + mov r0, r4 + blh SetupBattleStructFromUnitAndWeapon +.endm + +.macro draw_left_affinity_icon_at, tileX, tileY + ldr r0, [r7, #0xC] @load unit's pointer + blh AffinityGetter + mov r1, #2 + lsl r1, #8 + orr r1, r0 + mov r2, #0xA0 + lsl r2, r2, #0x7 + ldr r0, =(gBg0MapBuffer+(0x20*2*\tileY)+(2*\tileX)) + blh DrawIcon +.endm + +.macro draw_gaiden_spells_at, tile_x, tile_y, gaidenStatScreenRoutine +@ This will do nothing if Gaiden Magic is not installed. + ldr r0, =\gaidenStatScreenRoutine + ldr r1, [ r0 ] + cmp r1, #0x00 + beq SkipGaidenDraw + @ Gaiden magic is installed. Call the function for stat screen drawing. + mov lr, r0 + mov r0, #\tile_x @ X coordinate. + mov r1, #\tile_y @ Y coordinate. + mov r2, r7 @ Current TextHandle. + .short 0xF800 + mov r0, r7 @ Next "blank" TextHandle. + SkipGaidenDraw: +.endm diff --git a/EngineHacks/ExternalHacks/StatusExpansion/_compat/status_text.txt b/EngineHacks/ExternalHacks/StatusExpansion/_compat/status_text.txt new file mode 100644 index 00000000..91d83223 --- /dev/null +++ b/EngineHacks/ExternalHacks/StatusExpansion/_compat/status_text.txt @@ -0,0 +1,51 @@ +// this is what I use for status names & descriptions +// you are free to add/change/remove anything you want + +## EnfeebleName +Feeble[X] + +## EnfeebleDesc +Oof.... So heavy...[N] +Stats are lowered...[X] + +## HexingRodStatusName +Hexed[X] + +## HexingRodStatusDesc +You've been hexed![N] +Max HP is halved![X] + +## FreezeStatusName +Frozen[X] + +## FreezeStatusDesc +Brr! Too...cold![N] +Can't...move![X] + +## RegenStatusName +Regen[X] + +## RegenStatusDesc +Ahh! Invigorating![N] +Heal some every turn![X] + +## HasteStatusName +Haste[X] + +## HasteStatusDesc +I feel so light![N] +Move twice per turn![X] + +## SlowStatusName +Slow[X] + +## SlowStatusDesc +I feel so heavy... Enemies[N] +will always attack twice.[X] + +## NumbStatusName +Numb[X] + +## NumbStatusDesc +I can't feel my hands...[N] +I can only attack with magic.[X] diff --git a/EngineHacks/_MasterHackInstaller.event b/EngineHacks/_MasterHackInstaller.event index c5d6437f..860bda5b 100644 --- a/EngineHacks/_MasterHackInstaller.event +++ b/EngineHacks/_MasterHackInstaller.event @@ -212,6 +212,10 @@ POP // Unlock working on chests #include "ExternalHacks/UnlockChest/UnlockChest.event" + + // Status expansion by Sme + ALIGN 4 + #include "ExternalHacks/StatusExpansion/StatusExpansion.event" ALIGN 4 #include "SkillSystem/SkillSystemInstaller.event" From 6aff8d7f27ce7c7fe707c19a932e09a39bdfad4f Mon Sep 17 00:00:00 2001 From: JesterWizard Date: Thu, 6 Nov 2025 19:50:46 +0000 Subject: [PATCH 2/4] Initial commit --- .../data/EkrDragonDuma/Monster_001.img.bin | Bin 0 -> 5144 bytes .../data/EkrDragonDuma/Monster_001.map.bin | Bin 0 -> 576 bytes .../data/EkrDragonDuma/Monster_001.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_002.img.bin | Bin 0 -> 5032 bytes .../data/EkrDragonDuma/Monster_002.map.bin | Bin 0 -> 576 bytes .../data/EkrDragonDuma/Monster_002.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_003.img.bin | Bin 0 -> 5212 bytes .../data/EkrDragonDuma/Monster_003.map.bin | Bin 0 -> 584 bytes .../data/EkrDragonDuma/Monster_003.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_004.img.bin | Bin 0 -> 5168 bytes .../data/EkrDragonDuma/Monster_004.map.bin | Bin 0 -> 568 bytes .../data/EkrDragonDuma/Monster_004.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_005.img.bin | Bin 0 -> 6464 bytes .../data/EkrDragonDuma/Monster_005.map.bin | Bin 0 -> 640 bytes .../data/EkrDragonDuma/Monster_005.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_006.img.bin | Bin 0 -> 4940 bytes .../data/EkrDragonDuma/Monster_006.map.bin | Bin 0 -> 568 bytes .../data/EkrDragonDuma/Monster_006.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_007.img.bin | Bin 0 -> 6188 bytes .../data/EkrDragonDuma/Monster_007.map.bin | Bin 0 -> 616 bytes .../data/EkrDragonDuma/Monster_007.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_008.img.bin | Bin 0 -> 4412 bytes .../data/EkrDragonDuma/Monster_008.map.bin | Bin 0 -> 516 bytes .../data/EkrDragonDuma/Monster_008.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_009.img.bin | Bin 0 -> 5032 bytes .../data/EkrDragonDuma/Monster_009.map.bin | Bin 0 -> 544 bytes .../data/EkrDragonDuma/Monster_009.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_010.img.bin | Bin 0 -> 3060 bytes .../data/EkrDragonDuma/Monster_010.map.bin | Bin 0 -> 404 bytes .../data/EkrDragonDuma/Monster_010.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_011.img.bin | Bin 0 -> 3124 bytes .../data/EkrDragonDuma/Monster_011.map.bin | Bin 0 -> 408 bytes .../data/EkrDragonDuma/Monster_011.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_012.img.bin | Bin 0 -> 976 bytes .../data/EkrDragonDuma/Monster_012.map.bin | Bin 0 -> 248 bytes .../data/EkrDragonDuma/Monster_012.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_013.img.bin | Bin 0 -> 976 bytes .../data/EkrDragonDuma/Monster_013.map.bin | Bin 0 -> 248 bytes .../data/EkrDragonDuma/Monster_013.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_014.img.bin | Bin 0 -> 36 bytes .../data/EkrDragonDuma/Monster_014.map.bin | Bin 0 -> 164 bytes .../data/EkrDragonDuma/Monster_014.pal.bin | Bin 0 -> 32 bytes .../data/EkrDragonDuma/Monster_015.img.bin | Bin 0 -> 12 bytes .../data/EkrDragonDuma/Monster_015.map.bin | Bin 0 -> 160 bytes .../data/EkrDragonDuma/Monster_015.pal.bin | Bin 0 -> 32 bytes .../source/BanimCmdHooksASM.lyn.event | 19 ++++++ .../source/BanimCmdHooksASM.o | Bin 0 -> 1580 bytes .../source/EfxCallDK.lyn.event | 36 +++++++++++ .../source/EfxCallDoma.lyn.event | 44 +++++++++++++ .../source/EfxRemoveDK.lyn.event | 27 ++++++++ .../source/EfxRemoveDoma.lyn.event | 59 ++++++++++++++++++ .../source/EraseDispUp.lyn.event | 5 ++ .../source/FakeHitBlack.lyn.event | 22 +++++++ .../source/FakeHitRed.lyn.event | 23 +++++++ .../BanimCmdExpansion/source/Utils.lyn.event | 6 ++ .../source/UtilsASM.lyn.event | 5 ++ .../BanimCmdExpansion/source/UtilsASM.o | Bin 0 -> 780 bytes EngineHacks/Others/MasterInstaller.event | 2 +- 58 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_001.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_001.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_001.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.img.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.map.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.pal.bin create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.o create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/EfxCallDK.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDK.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/EraseDispUp.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/FakeHitBlack.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/FakeHitRed.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/Utils.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.lyn.event create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.o diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_001.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_001.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..793d9433f07c6f2eb8e949e6b2de9475dc3f330f GIT binary patch literal 5144 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 literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..11ecd562706c20954b5b78b0a08b1e07e81cf4fc GIT binary patch literal 5032 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 XR;#eqI8#KczBX#Q&|iuxHlO)_8~mPg literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..f1eb38750d5710b5b42282701dc38efe54c1b070 GIT binary patch literal 576 zcmY+>cYDqU6vpw-uSt`KlqQIzq_Pl?B$C>rG+JU4dyiU0ONUXrv8lcH-lM9N8bwl3 zqh3T_!tWjM{QTGJ{B`d0y{>ca`=t9&Ibl$q7WjZ9$q6NeR51-S6r}k`BaOq7>M-!J zbQv_!R5O`0mnGXLa$0B^7Dqr1pK2vn9{CCsYAtA^ts?Eh;+hDFYp<9Rr8+2+*#DW1 zI!WoQi>_g5g3(QPJ@llP&-K=aFI4F3OW9xP7nars{Z%r+K!Xfsh@plV9y3Cf_(-E_ z!m|2cv@ymq&Uh0{WRl6In5uG`_;fQOvB*|3x+Hthd2NHrZ^8t?y6S=2zR=ztx&>@GzvMAppjylG1C!BPO)6O{SoYeC!xEMu~*C_dt%dW_}D!Asl8-7!mbJOo( zJPaz*ZmIY~=52TUDdVnt^8a!_EUJrURml%zJ`_Cix5u7@`H6SbBt2E5R`8E!>O2o~ b-;4ix;ice}*Z%V+%zYaM|F8O}tq$G+$H|NO literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_002.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..a532dcf69fec354580e9b76c4597b5522354bfc3 GIT binary patch literal 5212 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 literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..c65d7f5276273bd0568bd583d5869949debe1e60 GIT binary patch literal 584 zcmY+=`+v@L7{~GF_rBR7TN|TUscmMsjkZy_8?u$0V>wG|ITRh8PmwVq!(dR_0w^?tmsd~H<`qWbJejJP&wl0l{{*`AQuPLABr zD@5`7YPIokUM5)LBtTq(W4Z`?P0t;aSfqRzj(+%5>AYT=!6sKGB1o5_+ki zw?3X%DeYgauYMX{2z}C;7rjJ(NiVBmfPn^ig~4joc~!$}q4GgA#OsDK%y1)&WR%g~ zFs4b5vFg1UDpPUej5onVCYfxCsiL<`^S0>{8Si*kL#R&0-^((?Oog+|=6xTSV{VoY zeI)U*PpW*{BKpicweuA&u+SnFTVknY>Xu8a@VS+tx-k`B1;@ZsJ7kD&hd+1{pNhk1s7dXb~))v>-wr|jXM4Ax;M1& literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_003.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..98b8ed45eaf59940415249981b252a57c8276fcc GIT binary patch literal 5168 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 literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_004.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..a6c1a475a6c85a2460f5083d23a50d4b969bdc51 GIT binary patch literal 568 zcmXxg=W>;06b0bt;{-xTA_*ZR!9Y$F2nUQwP(Z2)EmEZ@pnwEWP?U~Rq(quh6j7RV zX%?y!MT#6Cz+WyQm+)SJ^a6D$rIfA)1^MX+uI*25CpO_HuNPohwg% z=o2Cxy^zTQg>+J+vtm&fB}$crR60b-{H|V9PB-0ENK)w~FYBSSr(U6NW<(XerS#F4 zS5$jdjm-W!{k*31b^Sw4Yc#+>-Z02uLl|n9;ohWPgAqp78WoF18$+YFj5Ut&CYWfF zhPPEsHpSFX)7%T{iT z##!e?=l$YWza=Zne|I6IV)CN;ONuYM;;O!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..b414ef0fd2034315ac9bd223520ef843935f0072 GIT binary patch literal 6464 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 Vn#7l_eN?Z literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..fb5586135733a0d49afa60e347f34d46066786c7 GIT binary patch literal 640 zcmY+>_rK3|0LAg=r%(4@vb*Gxkq{YOw`&x|CCX@sj7Ub5RYqpk*KC+6tK~LP%F0aj zHHws$J<3fs^?3gW`hI`xaUSQFb6$_f`Qen6p%EeKTs(3Eu^UrKCRvIp?j~6!lvFCz z3z0HPr(9M!ZkDaQ3f!Wi9F^o$c57&uf~rteHPzil4Y#YQ7PZ}>j=FO0R4?QvC7svz(R|>&SGzP z(-M|iX1Nu-#S#kjW+p` z&9>NT8{6&hm7PT)H~rVwzVR(dyX>}yy}t9keX;$1a3FnGLYW`^v-K=VIqwa52;jQDGwMlI+W_xEj0W TAOD6LA-W!-|0@}yf(ZWsqJpC$ literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_005.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..b4344ce74fb0ac2fd650227a83eccfb011d3cb00 GIT binary patch literal 4940 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 AdH?_b literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..28f3ba29593d74554a70f0133a8f88d63e812486 GIT binary patch literal 568 zcmXxh)l!gQ5P;$5S8Nm%6|t}tQL#I)ySuv!>=wJbySuv;+e0sbOZcw9k$)U#4|eC> zcXnrXlNHmP5apDJ6rreuLQSZK`Mj@(Iwk+i&NmiZ;QdCq)R9UJj(n4l_ zh$K~2O?7IhDP1jUtD~-Zir3db!_c%KYD9*{GBu&8X0qb#Ewt21>qKp|4Oszk@>MS%4lO4Yn<^WFwrEF zP0?qnjA^FF%8Zg`nk99%Im|WBd<$4;k;RrYw={Ng@qjpL`9(iU`6SBs*%x0!`tO*1lk(jU=|BAnHA3_+{`@cE IoE;_c7n~}G-2eap literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_006.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..cf0653079cc4e27368e87e91503f954974db0262 GIT binary patch literal 6188 zcmWky4RjmTnf+#-el6LS?KmXl2k|muY{ja>Pk@Ckb%ZD(kdhi6QiVZ*7H2t2HrWB? zC1$i^+^A@sZUIv^D8vxdsBs2NSQc6qwxBgJO4xD76(qu`r-BVFY|~A=PQ~yu?%UZp zbLPA`XXebC``&l&{chmEa<~j&j+^5^16~0rF|EWH3zRhfc8t}18ZdH*nhMrHlPyit z7zDwB?ve!dKzgXmY7?4;*aFK;F<1r{fu>O^Qc8O;@Do^~;*BL}hJYwmFjg8UmUKW2 zRz?5|BF3zS!C-qOQyDdZ)eOq2lmd&~Yi|4Yz4M?%Du#jaR_KpPTl*u@7U+)@s#^_w z5-R;S_8U98`+=EN95W&!#I{Bb#VQdRh*mlQMWpBlo``@)U=W*I2jTXuj44}825id? z#*BV@AQ)7MV9ZBq7~>2qrXG_S3LH^b6(S~6s`HHDssxuyCJRi8AHeDWHv-@IX`q3M zyP;3SoeF$Qm;qH1_8m@ks<7{SGlhLKh6)j5T+M{k91IXOrxHT0%qGAQKw0ny`Q$XT z!_ou<){`9R>i{&ieMR6KaAlzgM8&u;MAFxc!~wzj01{wRMVp=!VJY5p&hG`6 zN(N>q&i9+?Dr}{M_R|#e7&KK6p#DsJ-3fRlhJ|RJZ-^b{+X~SbAOWu{@E5AlLR4*e z2h?0Hu`gk-hMFK*bvQv9)ZrWfong%3j+-z4nMcjBIW5be4#-&yX4e5a=5 zvCbAp@k9ItG46NVe_}8d0pGg?i{XlaKCiT$W@v_jfbmJgFbx>JzkkPGqu=DJw4YVY ze#g?DliX{yXvMsw<}o9^hQr@aclgDAqaVHjml_oEMkH@ku)yKaDI-!0qp_Zt_DxAfC1$W}o7J{5`tLvM&+ z5+V|i8xjHuC8Cfk4&$(Ja2OKB=x{>aFa{MfL*YRc16u{d#1%km=k$IhE$SubR+^K66+8ClBT3Pj%IAYIf&1S|J|8Izaxxwd ztJ3&DOEwXLr!bD9AjI%Ur!X>NGfjR}H4HU@LYU;z@kOW5wU38ZjPFBhM)D)$2pgku zJm7fcir)`9StKfK&BS6sEIC#S5hD`i!!sDCv16w2Kag@<+Zq;K9gfvo_{)M@HlWKx zF~KN8Y@i?SqNAc+ZIP-#BPRiyk^YU6($8P=0X-QJ_?Q4RL*qoE@nBY1gNP`_8N|bN z77x{#gAvLGoY$u@;A98Jy*9RZD3zu|3KhhH^W33Si&n3ZF0Q|u+fm{M{Mh^5k%Vz?Dfd3*#y&RqV|IayRzd#NmgMHc6RQC+*3Q>iqDKbM}O@+H(T^N3jrR zp(G?3i6>KJpRH!%K7UEf!|{?BnUZS}n3_IP8JI4fu#2epbpH6EKf6;Ty^}cE+UeG$ zGn^oyF#7E&*LCUe`BS&mf@m6+?RW1Po+Ko?*R}7x2*3HzmHU5wp!K6STR$l-e*2C$7QYo*{6_1ukGS3+ zC{Aj)_@h?`ulzI=N|1C>h2C^QwGZBks8}b!X1~oooO( zR%uR;J`B!H3tHCymXn1m}TR8*?Qhe+k_0d7~q zbE~Vk^Tw9b#|9mnLgR7r)M1GyC+;F-(y@8+X-|GO>DlMJlZ0X*k&sZ%c1Un28E8f zf}3tz8*qDfIGf^RZ%>7%a%W-7yP7k$b%z*kSX^sZwsTuhT!Z+h0{ypM8@Q3x&Vh(444~taDcYdDW$_ zKECS5VS(qx2~7iKp6PUhZSn9|Bw8pBkGYe27{?plgQvOiwek=k=j*fw>E2I3OOhff zN?!%Zxc3)(C6W!VE2H0()hvFI`#T?v7jWzGkn?lyD#&3WmkSHTk?Ro130OF>0R&Rq z5Q9=-j5`+zptw&W@HmXe;qk)~Y;V4cKxxej*Yvi%=-jJun&*mGg459NrJ`T$P@ih} z5kEs}m6r28sLFkR@37|`0n&Y{V8%%l<_)qzijZMAHAOlG%A^BKo!l_5B+2FwT8iGw zknsUMU~Q%Ti$*$W{BJaF+A(mLzZS5YDqF4Qk z%Vylx6Gkgc#S>aMj?tqtp8v{t{-7*j@vQS@R7&PH47tr)C{=Fp{aAe&ezxAXu02T7 zw)l4>dx?-3BAbWY7q=p__Ss4ks-LZ_pZNXC1VqoQOoYyyCHE8qi2FMI=$RJoGx+$@ zvuA&@^5e7UM2u+>v|vbPEJ~JTDL$n>sCS6Ex>eAlPF7ZLfJ|dvE0z+P)IUc^#m=8BPm_3Q{7$e z(R{C;!WIi31;zSsLbsl-@EQwuGL37qu8%ZwQE8Tw;uPKC__}2) z@f<1L*SY)(f3h^?%CV*kH&vTfE;Ow&b!~dnZvT6@y^fQK8bk}Eh6l)VKjfyTsX`c_ z<>#e(+pk(?z2D3w8-2b09LWj})z#c3IrQ!jF8gN6A`mJ`L>B)HSxuC(tcW3-lEoxD zNWj!cR@cOwLsM`9K1i0ezTWxCuA$~e+0+!PvB!3l#abW9T75vmT3RQ(+k}BTuq5r{p)4xt~=eZC$;M}9Qr6SpNG&aBCmai0QrC_UUE{8XRM{lOS8bgkZ`iu=>qc_MG1~LG?{9_@DI$u&UIpD> zl}sx2h>lkL>#{7Jg|f`f*d1^JUehc~vlRR9#txd6rV1Yna@WPAv?*Ydqw}<^P-Tht zy(O)DGtoTDnCBuX$Gs}fTMer%rn?w5P1^j&hCterqGsB2w?fk#O;Ngq(WcutT``$1 z>rHoqZd$TwT2_-u8TB6n2Ozz`eX0dfC~CQ5+B)J|L)Htr?OxlpQK9AZL)@p5_vjAE zw?BXydVu>&5S4(XFtBj~qNO@(R9U8@2f_Uv05@nYr=91V=3!SHwjUmLn@-ww$04-0 zfSwt`)9p*M7m`r!k@E7NCAe~C5WSw!{jjjj;vtpR^i=Z+wnUTb-cAqArn|UUR4Cno zg>ODH4cmGg3*go4X-PTn%<^+So?s8x^{BrYf;id~U-FEvd+z$1Hh3;-Yrbx%fMXzZ zOBicbcf+urdav=CNpHTs&T8n;6Ir4;c-LeM4<)=$xJOfv=*!lL_TyYniu>74O^Ii% z2Hld=TvZKRRlGIK-<->>c)0DCj*k|7kz3+Q>x}!0r75MrNq!R}lVxoZ^ivDEHel!% zvp9cw*`n0Z)J_$R`$ZW%CV$y24E>5qoaOp8v+Oj2>6T*Jdcn$#-MX$RL)>Z0RG8Mf zjD}3x5Lfl)8%$Vzz*je+ySB|NKWB##rZy5=&|oBL>W4Z_9rQ3`de|~M^-(}w;J#(P z#r);ti06II^+Eu(IymihUoH6c=`}w7>v6lmjC6(tEX>{VD)(@y<%NqM-X4f#bAO$f z^v|r?bI%J+J=o)fE*vXpy5)bY2{FPReC&yr1Ao8r@{gRgrf+fQEkEdrV*&^%qbDb= z_L3%YXSyzYRGuE~X@r+>EEc2D3LxK@?7FFBIerG4`kH=O@>~SdHaVxuv7tmf*6SfG zx*JfeZrg$APQ5@5ve%kc)Nk9ns8e%X%ABxWbKZh}$NyZn%yhUrgq{)6GhOHz%b~>S zL<&8xP|UV?h80Y`PvF4-Dq9#YXc&@`-X-DkyAZ9gD&fxZ1Xo@LN&FHMQ zV2c*bFiWZ035;BJys)4s=;Lkh`2(iRw1o$z9qn9M<{K=F>d>WG3!1L&800Un>NQ=_ zXP4@-$v?NK)xz#Y@Zy3W_M6Rs_DgQCq~@&w9cFQG$@wbb7M zb*^Ne0!iPh0jkGbzx|Fl$MrNof#BQwNO}lLar+_{cL(4Aam15$S0C&(FZf)aEo)?r zOdTgZm9(rA&}EjW%QVN6npsTM(6#Jxra3Qh{>V1mUvO($%chP}`U9&rF?ctOS*8nb zgG@J;6%ot8HsS}&DQxjymN8q<9T!orUY4ozPQ`Hb1ouV*Xu_&S|NM&Y{)b!xu8o@P z{K(p@qrKqN%GQ_cUX%OhcG=Py|B?05qTlEae#)h~|CuW&ySeu*S(`yqraz$R3?b^b z!K?Y1wm+~w12;eB{YR}+Yr5b2{foY}z zfxFK(2mXwrHJff(bC+jZyjP?yy!JKMkD&F)NOrq#s>Iz45T^;S%{Tzw_q-w06%Q+kXn5N3WVgzdCUGZ4>-}4L?Lj zY%Xv^_ee9yLjhE=pftK9de?mu+*4z zaiRT2I{>cU=KZK;ZR3CGM;iZ7Zv5l%6=wrJ zZdoV#_Fb;m@I)6NmklD^9&GoK;nMTocP#x&AD4gJvlP#BXM`y&$_bJl74Vn*52%<{eS;o*;4=j literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..20f65afa0df38e065729430c0ec77f5b8afc4195 GIT binary patch literal 616 zcmYMxS94bd7{uY{5RwoQNhAgWh7ynx11VCJDmE19AX0_URGK6jssa&E1iKXJy$gua zLEx`61(YU56o|kFIG0|UbHOls^Um&X=AGG16R&_UC{7GiB2MKBCxJv&B&kZW6pyH; zC^gJ057IoUI_Vyhp$0W&s--rM%Th<(SeRcP)KgzJ4K(zGMl{w$Q#pbsG1fSl<4uULcTA*MiFdt6 zsYxcA!c@~t_kM~G%!sg=%u?n}dki!I?> zOD(fJ#R@B<&Q`J78f&d%y$v?n#AaJ;wN2J`--Y>MAaw^j?ee|d{NP7>>=o>@-vI~1 z+*lZNN5P%YYD}t literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_007.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..57c050fb21e4b13a43667295d03e14c0262d08cd GIT binary patch literal 4412 zcmWkye{@q-p8wwW(xhpVHlh4dq{hn&Y178)DE^vpEYBcNb?ip2i4hIzn#yVqoTuSJ zNqpUEBv#MRgRV@FE*Od6Q`R}^s4Fx01UpfD?87L;BJTvwIHMzOw~NL%>Z^CN=iGD8 zz2CpS_kO>hANP7r&w;A|rqMK7tEGLDeia!!k!NV44OTp!HX&7$h24 zPH7-8?BUB8%M?q!I`E8Q8p0q1FlJS30NXB^^0>*MYEV|8ltJhobKMR1oRc9`HVljh zlORfi$&fUVgixU}Xy6lNNG?wr8+wuq%nA-0p+Fc0Lwm#J5EXspPT)h5_-V*1;B9a> zHV0u93^FDUn2f=|2F8qJeIXcB4q+U!RWZgHm`hDyhD<4z8B{_hlPl+#msKRVOsXe0 zX9*2Jmj`Wwi=Xi{T~yz!4&Y81t^;9Gk%S#D#i3K#ar}x? zn~-b_Y#u%ft~Y#K9Ol4zG4QM)^KzsE_vOQg&VT*RW7v0iS~VnUNQ7x;Ew=c#R({&HJwmgB6g)46BGUEL;zS1QTtM3<%>g!vTSLdI$zSz~mVCnOrEc zftzoLb3M3zldI8THiAksjIEnN|ApaX@sjoSCFJp9C{i8Ki_J5lt|ICTbqO zF`0=Thu6Yb=n(Vh>zB~C1u>ihUcd$Pqaqf3qT+o)$>m}@AeN0OF_Kl#XpAVMIRacS zfu=s96t@vnJf{)A3w%6G0FVZN;%>ANqg5KlWtd}iD|}-a-JAY+pf`@bSK@I}Z`7fL zT#ynh1cj&-h{RO`C{blf$Z^OYCC5WYNfAQl*zt0Z5lH20q?k_-t|L!K?j?Sm)dLp# ztNOq1dE84+dloLuqa%4xPvyZ5dFaM3sdyzP?96xKypP`m%k!P3o_wbUavtkU#1H=- zy&Ogd(aYGB1%&Szz=5*C+xyFHFEBn&1&rZ@VVK7F+9Yh)ZY0eLO*XNLndIL&f&Q%u zV%c0=HA9hJgV&ODLm+9aNy5c&sX_Bb2=Yc53)p|M$p{sL{QY6x!caB@Jed>>=*)yO zVn*Bqfk`8Ti#P&79HOS*$N=%5$k0HtUZ2!Jl9EB-cXLAu6bX*_31H$U5?K}lf%s!$ zt~d%fDC`-H6-5}0DSi9OrXR?VjI%$=xR-Dvq$Y=mKJU~~%=-?ZE6|%4b@e(v7N@BK z)0GAaDy8UP03EvjX1*1gk3sWvfY`{0LbCh^v8+!Kxb{_q6eGv^E`Z+Mq|-( zfSm@YlLo+;f?+Ha4-DJh&F8~HK96nXd_Gh_7vTL6RHXew*_b~E1Y?og9j-G*r?73C zvLinZieV@*KPDICQqkGha0i6U{vE^I@3-Z*?Z?LW1yMX?n|1lJhD1n2!eAyG#uEQB z2q7aR1}E`6oWi!N3y|Osc#o_NH01b~2T*ySk9!^bVZkVdhmwFd(ec0}4M9bqp%d5) zLGorvPA>kGdQOA{^o2k(6h((BlQ!E zBv6Wu$TU!BxW&6S5w-nXtGc|4zd%>iIib0D2#JDn1Lm{hNbcOnzxc$3RBeJXt!7_y z1U=o)r>kiDtLV9+YI_rSb?RV~@wp{JdVS4E-MeJxRB^XwnP+8j&b#EDIS2ix=e*??9!OCY-1 zzIh+;2_KUCKg*?RkSNwzqPUUuChVINI7iGt&OR0xjdPJ=oS=9ylE{)EECoLyVu!A! zJ2>6msM+sGy$?PR`ToN43E0Q`QxHoJ%?Hlxf>+SQZuDXQRg3(N$9()K$)0rBeiuCi z|HAc%DN{lJnsSPa6p_1#y^r>)e7|phl#IR9B#~oxUec;Mu0FLU?zqPGOX3ep1pGoN z+aWo!brp1w;EmgKyrxwsI|64CKQ9rYxKBXrA9grTR%Mfau{y3KqM zJr!|$7Rf;m+S1WmYXp{}v04g3F;aOaMs9|)|DYpN8|mA9Q!6gaM!EMMvu`;72fA`o zQwMWin3{UhduHkY@e~V%E5DA_NcIQYraF`N&0mGT2@0qHfkT=mpJO`EK8@iYi3o+# z=)Slf#F=QLcN)#%J@Z$-|07(~OaRu`8**;R{?W2mJgrfHS!?~a??DV_b6CjbASjSr zhd_=G!_4tMffW0~4ZD>NWvuaUyBj}UTlK!)%O69F#zr02gOGA5g6SY2o^z8v$xUGN z>-)h1Z2FE6v?&;V8FzLV<$6}YvqFLK|?sPo2w9g*B ziBkC{=PNMp**cw~jqNBsa3{<(v0#(294%U2!`C{_`vu`~``Ne2J9I;(3;zTxVpBDy6RzyJ#c7hO1 zg@m!&Nk>d=yDU>@Aw#isKwhbKb%Qp!fK2sRuAu3ILTP2ma0lT0nB5#-Gyxh_gM!)JPU| zEs)b>9P3Tn`U4{=hU1XX0#T-=2YzLE8uay_BA>w|RQRhcCY}&3(BM96v3Zb?e-K^|C-j=3c5u9+OJ$f{fJ?q$Mb&>qqTPFFb2m znk7@vG<}b0X^Kzy6n+j%DN_J!(sQ&VQ%Rn?cCLhUqS-gIVY@782@*JG4L5dKOlQC)t-A}lX{CA7v@DalH@IKi)#6}u)!z2? zb7SorFWRTN&U&gUOJHF9egc*fbso0eGR@z@_s=@A;NQE$qTp6T|a0(H?WX`r5* z0kwaqX`(Lps`MpuQ6_hN+|8VjDf|fOt)mSQMXvBwGKsXsf_Nm zOqprk=e*QB0l1=DfR90!Gi5?gb)8wddKYVHn%(RO=nh*wVPJJaw9JB!cX@bK3!tv< z(+iuv`N`wP;c%F)6@hR3AZ>d>wHyN-u)6t5wT&Lbb>mqIkHn(kNF!n5W59=N46wLS zFOWU#ttO)uY=+xfmkJksdi_UR+IIo?{ImXi{kr*^pV{Ausl$sse90Pa`A-eUCA|($ zTvGk`9Q3qcsmf3XS_l0;;<-Yev(3+6MGcMX&0zLqDabO;nv#UbO4y{=*l(968*2*Y&%;eR`~+ zQ1@V~R+H3-3enUEq>GQi`MXJ>g}7dhIJ(qsU3XkdT2f7a2XcR^dagH&R3ykLC;3rm4HaiMR3KXLEpAkHMq^Ga>242(&f3Yg%ntl zfvazaYgdnMUSEF~W1+-w_z-Af_&Y5ae%Pk@!&rCRFjJh3vEiPFVPC0=X5^!EK%PNt zNkv0{Yq*nnYv=ffJ(ji$eN_FyGCkD{Yx#;*O*YJ5#muz1j#={ujP#tXj@NWc>vuVN zTztlrku}t6rZq?D6!$zg9Vo&2fFs_WnX$bGd%JoTT-Mez9r@gxRc(K6-lOxjlvcjb z{`|@dzq}*rtMpdWf!0HwlINrT!%Phl{<(oEnP0iKM^FO&5bGd-GKkBVqvwU&v zr^ou6%=4p<*vtoO9S0hJ>w1oh5f%YPhN(+#|Bc?nj9 zZ3rTw3*uty{@vi9t|#$_pyS`Uw&RB#74h$ZaTkJM*##NudTV-m%nbei55}?R3L!iO z{Q5gPV5=WDs+p|hd_V$e*vCg`$OQvQt_Q5OGAo?!?0G?yT!RQvLvEx6IbsARHQb1QAtQ}4+8D+f zXS@kw6IGieHCcK}vt_Dj)R=CDnancV9CJnU%(uY8P*tD#Ws$|n!X+%V%yKJOX_eL1 zNUv?qSZBTJbTYBQMw{4di>G`(WA1$q z6h0I^^4JqkLun?dDd(BzUWi_LrP1q9k|BTpeB-Tm;_rR%F_eTT+y5t@eepGf;w(<) UfAd}KkC4cs|MTbnB8un#1=(qM+W-In literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_008.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..fab4164acb02218ea5a626cb84e29e9bf38c1c0b GIT binary patch literal 5032 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 N(Rp#EwZHeZ{{y_M7>WP@ literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_009.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..1069cbea693f9e7ac2cf476db92c84ded1c152d5 GIT binary patch literal 544 zcmYk&cU-~J~ z-vD8tK?WNV^OJRk8fG{nj5Nw<#u#gy@zN%kXwttrlT9(zG^U$jrdiB3$6ST7=9ypS zEMTEU7F)tn%PhBol~!48jl#8M&N}PaV53bov&B~1Y!`OeX_wtG|3~sWdlcErKKmVT zkV6hT;;6(i$77oq3M!xAq*G2S=8Ut>IWKX+#n>W-!itw5NZ zQF@8n>fGV3d+vK+?ZcQ8LrLl*k9p#$XP!&E@G>@u;m6Ncy!OUh?!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..28531a638afa5908087cf1f71d588a131427f060 GIT binary patch literal 3060 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 WQ20`+N@}H=sLw!cSGoR!3G^3uCcN?h literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..99593a847337eb4e785053fcf7c55a6a30aeda7b GIT binary patch literal 404 zcmX|*S5iVz5Jb;a@QH|`h))C*On^D(0Op)?#GG?lfE#fq`eBv7E`cS?4wNTi&Bt{0 znW=6&X6ixImr|raDyF!T1{&#D$iQPIQ-Y#=HXCG-jh!6G#X%lUJo)Gn5EZr-fQv%h zc)&{$#rV+tlu#-m2jnG6hEwrMw(N0GKt4_M; zrYD}!OCMn(X#ET@n7|A%%m||}#yAs9qNbQ;hFJ-{8|~(pX8{&jVwn}xDr>B>A%Qr3 zHE*)THjy1%QFhrA|A(lU+UEf0A)X_S#Vbk_CveIc=Ul|Z{p(zEg?7yiw+Z9LXS?H` e2hl}+8o`e|iPJcJi&~z=VW`A>C&m9x3Vr|&D_jTw literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_010.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..8984162e2bdf4527bd7afb213ee0ebd6d78eef75 GIT binary patch literal 3124 zcmWlbZ*UvOdB)$p!#|Qx2#}(r*ii$maXu0vMLAAmrS`jN?NN_T!pUGFep)pFcmsUle*(+jL1RGv6oqvmW)s$hMp)Bx1%;@ zsh&@^kJ+N1_QTHXJM--G{+=fk>4dES%jhMUF9HiP0Au;%p*2D1g&Opn1K&761ez`VAgo(DWno9Y;CLIXREp#h!3&jsCM&C;E4 zWQf*}&|DpKnj%{XXw*AT=*rtuEF^HRJB$U)Y|+b7&7Dl?+K& zV)0=5l=QCh@J;D=n7j@(7HbC}=RDO6d438Vn>sOqid7|J6e=00;_4t~Q2R_j>)IBc zDc-f_Q?XG<=V>`j&kh2{O;KkTgv8y7uyf(LbUcL`&C;W!?1=c0UGOH*gZ>@C15BM~5#FI6W2AVR#CC1DTNe z89F1~Ah86>L`j5Pg-3dILUySa(}nCUL{!o=jH3z9*%-JwrKD)k5zj|iV%w~GQM#B)BoZe1cz!d?lHE7|yA3awKpV3=?I$FVawBo3cDT+a&xGJO!rgGQOWoBGhadG%R ze4Bf(mb{N8dv+41s8u}IaGE@|?u$3!m(!V-fA_tr1~0$D8l$}#(sPkiJio6he{1>< zY{MtLFUY-cPl2>Nb(tuqO4Ippj?{Z*D$J064OPLic8(cf^ZGQg-^fDR=7u6%0~FhJ z@rSMaIYyUSu62VzECv~!gI~9n!13Q3lKpqQfgTIVb1C%1KL3_WKa~DtO8PVZAe>v< zd)JM>==rD;t5!>;ki3mlyPx!bBD~}If*;^oa~3jGK#(*VjO15=5ycTCpSz6)mr>X2 z>wggW8UTGKJhZHA?NEPaj;f%m$qNabF@Vw}xD>;#X=y1!;XXzQ2s2H%E5u9QKGQqk z)wn*GKpIucF`;_@Dr^g~_Gvet^4z(>B@8zE8cfqA!FFQZl77fOMjURSv*Ew*S)e2S zHK`o2sY}4l4<>Dv#qmbBGh3gI_EDI|&Ag?KrCMm4cg*9e5p)C?C3i2N*Ovcv`2UX3^7WVQ`pmPQJsK*PRIEj7kA zb?*LY(U%)Fu zVmFhLt<~F0e6P7f)sDYu@pF1_U;EcZL@WFMS#x+weLUm2ujj{F$wZH^JIL;I*Q}S+jj$EZ!;n!%!84K1L9Oj@t6p|pkN)I<@P*U1 zAKKC_oO+MKPLLyN+UqaVpdBM){r zUdFRfyH{QHJ|x|$E!=wm literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..b9f03fb04f5132aede1526828d8e9f73bbaaf9a9 GIT binary patch literal 408 zcmYL@S5kse428dILqrrsLbHb^3MTvql&bi<+#Fe=JoNLq#5pKB?cT_t*>pc%V feu-00hUJN8aeQhWHou5n3sFD+Em6M{QlH@$R1jWD literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_011.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..7ccf6f3c0db766982c06348951be99393ab283ea GIT binary patch literal 976 zcmWNPL1-Lh0EOS|BqTH&Gie$VLCoZL$7#0L|^7v=+de6ewRSY$%NVwHVSi+Go7I_hi zzA1i3G0m}Cl_Ke-R};L#m_@s5d*X)l*N)J4)1Y*H15Z|w1TJj@uGz#xze%BWLfUpi zis}QG#=cA8n-1}5wK?9T6q)MfE5k5xkOFg-;=2)p>#^uLyUH-!6{KP0p=7gCf6bZy zQtoc08HYH>P8npz@f@}0Ao9|p9KkG0@S}WHTTpx0%rE46RIy<>j#CRAM@&Mmmqdah ziC`6)>oLm~NSJuUW*~YGFL<0o4qovKpm?IZXp0IbF?>{A6M~nK3evr7>dW-?~-S zby;7AxJfoOT`JRbR1%m9N|i9ZDIFLDDb5a7$nl7&3@X>P?EF}?jHwajFi literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_012.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..0553979deb6a600d3b7de8754fa57faf794e966e GIT binary patch literal 976 zcmWlXQD_`h6o&tq*%(PSX415#f-%$Uu9I%JBpR%*n_)nRg6Y!hj^oNK_$pEchLO0- zgf)vxeF+7Lg`#yyOgbbq*ashc87gsJZkQUV5$z%pP(g%E?64w(*YP}@hx2pbobUhT z+5lbzdO{!(jMp(i@06r%Ji7|@zAPz}DnhF@-I*S^W>VjW{1#3xnmAj*(@S{(WiN|d zKMUw5BUrHaf&33U$SL;pQyocVw%VA(^ z_W)ZxK(I-~J;qp6MaDy!CF`a&Q^wz{V8kqEN}Q3h$MMXpC|4QB7f!-0v6ZldC%ELv z5sMZlElT;9xZ}tXrfGtUY?4{Dx3(+Ef9wdEfg1*;H}Pl{34#XQK*MYU5B)aPx*_OB zBc#rQ259UzsBgL;K6Tn{O1B_7in5Rhwx2{o zUY1yurXsU!5+*|)u^C7o&v^>xP`T&fCVUgCwJ ztv}CwS`){fN`yJ_u`KRpLW@`5t4(bf@3cOj6D%gwP!8iKSQ78ym*Y2PhuK&1g;9C$ z+y{qRf9&mD6%qG%#F8J;2$KioAoVv-+(0D+r6Q!Oq#O`!lBAwU^P~3#9Y-0`B>p{F z4T`nmci$-AmfHng2T7|#LN;5p=l`9ZYEr{T$8764O(P&VUCog~GHbiyIGM=OI0o~# zwko==msTLHlXXq6C^W@N0yAGmHB4hl2O(1);X*WOaPVk7j+pjnkh6_W+`D^u3a4Iq zs61KhNW?mMzcefb+a_>JoapgS$P`(T9N~9L3^b@_1T=pQ*mf)g4*wW0vAQ(w3m?X^ z)D(7TJOl%e=cP2N`8biDCt>YsFJ(1TjuIomDl87dp|WxLyZvVipM{{+ZB76Bgogu>t|j_gZUqYI(-KK literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..acc094a303436281531ac2dc9cb741ccc95627c9 GIT binary patch literal 248 zcmbV{TM~g_9L0Yh@<}L{3ZYWDJy}9aX$c-ZT8gDv!hZ!)jLEY(FXu9I&Kw7WGl&ue z3a3Ro@;a5NyJ&iniYiP@`dAFehXf;R94=$YMBVg+Da>&3@X>P?EF}?jHwajFi literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_013.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..f12107882301fe3087a20ca26cc25c75bfe7c2a6 GIT binary patch literal 36 scmWe=U|=w0VEDkefc4CoGXgB%1UNs)D##fy@qCbLkmot@LCSy;0LI=68~^|S literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_014.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..3d5f2d03c1817bab47a1291eb9b79022deaf4dca GIT binary patch literal 164 vcmWe&U}dmiVEDlJf$;((BLkB?1M>$l5Dx!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.img.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.img.bin new file mode 100644 index 0000000000000000000000000000000000000000..e772a4aa0129b403d7a9a7253cd681d5d9058d6b GIT binary patch literal 12 TcmWeoU|=v{VEDi|fsp|K3K9Y1 literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.map.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.map.bin new file mode 100644 index 0000000000000000000000000000000000000000..466c67b097ffe68f8fee77dbc90c6024af2f8a8e GIT binary patch literal 160 ecmWe&U}dmpVEDj@fd3Ip2y1`@8a^=o{|^9IIZdJf literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.pal.bin b/EngineHacks/Others/BanimCmdExpansion/data/EkrDragonDuma/Monster_015.pal.bin new file mode 100644 index 0000000000000000000000000000000000000000..ec1e52cb2c8a72ed05a6fa4d8a89ded2c0ec7de3 GIT binary patch literal 32 ncmZQzu#iyX`Cre-lERZHkSw6g;=tm>!o~4aCXq)(V6g}QWxobt literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.lyn.event new file mode 100644 index 00000000..415eb9cb --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.lyn.event @@ -0,0 +1,19 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;C0E_Hook: +ORG CURRENTOFFSET+$10;C0F_Hook: +ORG CURRENTOFFSET+$10;C16_Hook: +ORG CURRENTOFFSET+$10;C17_Hook: +ORG CURRENTOFFSET+$10;C53_Hook: +ORG CURRENTOFFSET+$10;C54_Hook: +ORG CURRENTOFFSET+$10;C55_Hook: +POP +WORD $B4081C38 $469E4B1A $BC08F800 $47004819 $B4081C38 $469E4B18 $BC08F800 $47004815 $B4081C38 $469E4B15 $BC08F800 $47004811 $B4081C38 $469E4B12 $BC08F800 $4700480D $B4081C38 $469E4B0F $BC08F800 $47004809 $B4081C38 $469E4B0C $BC08F800 $47004805 $B4081C38 $469E4B09 $BC08F800 $47004801 +POIN BanimCmd_FakeHitRed +WORD $80596CD +POIN BanimCmd_FakeHitBlack +POIN BanimCmd_CallDK +POIN BanimCmd_RemoveDK +POIN BanimCmd_CallDuma +POIN BanimCmd_RemoveDuma +POIN BanimCmd_RemoveDumaNonBlocking diff --git a/EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.o b/EngineHacks/Others/BanimCmdExpansion/source/BanimCmdHooksASM.o new file mode 100644 index 0000000000000000000000000000000000000000..50cc2e8fa6342b9fa1608577b21e1647a519378a GIT binary patch literal 1580 zcma)+PiqrF7{=etpSlr6TL{!zG)k19xTM(H;wgXH7;P#VJctN&(kymOHYv$eD+qe% z!Gnk5!HeKm@Z!OP$6h`A1^f^meV^HP?YLI-4Kwfio9CI?-O0|rTxm5N$DueJD$xNE z?PrXVoj0jOIdW-f*8McI`k_HT+%Kn^bOSssoEOduPYO>79~V9$oD)7KoE6RqJIuKB z*LPXh+`=JU^(+r6Uv&a<@?2)C?X|^w%WF4jBIP;6w1Ksu^HVzkSeYMe}`rNgITvz@6@+u3938C$W!>2x^ zg{uk4%-IeVOY;dyW<}z{U&Y(QL9IXB=mmqv(SMqnCEDRfOr0Tmfm|T7f2s3CyI}tF zUL#*5dV`D?-5Wm-wd!!zqbP62)yVIA+TYRSb(L1+b;e`z_rv3z*8Z3m_`kqs z0`Jv?*zrxmUyOZbJK#lJ<_7=2eC5cq#mNNL zD@3K~_jmy32KSEp!+VBjh_A^dX@+koB;xgOmTccHFHnh1oMYclS0A9m literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDK.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDK.lyn.event new file mode 100644 index 00000000..fe821c23 --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDK.lyn.event @@ -0,0 +1,36 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxCallDkBaseHide: +ORG CURRENTOFFSET+$14;EfxCallDkMain: +ORG CURRENTOFFSET+$128;EfxCallDkOnEnd: +ORG CURRENTOFFSET+$4c;EfxCallDkCustomBgFadeIn: +ORG CURRENTOFFSET+$50;NewEfxCallDk: +ORG CURRENTOFFSET+$5c;BanimCmd_CallDK: +POP +WORD $6C40B510 $F0004B02 $BC10F935 $4700BC01 $8076911 $232AB570 $45EC2 $D0082A02 $4123201 $85621412 $D0512A7E $BC01BC70 $4B2A4700 $68182102 $F0004B29 $2001F91B $F0004B28 $4828F917 $F0004B28 $2101F913 $4B284827 $F90EF000 $20084B27 $F90AF000 $48274D26 $F0004927 $4927F907 $F0004827 $2100F903 $4B262090 $F8FCF000 $21004B25 $4B256818 $F8F6F000 $22032302 $20002101 $F0004D22 $4D22F8F1 $282208 $4B224921 $F8E8F000 $F0004B21 $2006F8E5 $F0004B20 $23F8E1 $282278 $4D1E2106 $F8DCF000 $5EE2232A $4123201 $85621412 $D1AD2A7E $4B190020 $F8CEF000 $46C0E7A8 $2000000 $806FA85 $8076621 $60016001 $80559D1 $20244A8 $8001221 $8001FAD $8012F51 $87F4798 $6008000 $2019790 $87F798C $806FAD9 $201FB0C $806FB2D +POIN EfxDragonSetBgPriorityASM +WORD $87F85DC $2022968 $80D1675 $8001F95 $8013A85 $8013929 $8002E95 $6C44B5F8 $204E0E $F899F000 $C04D0D $205947 $F893F000 $300400C0 $4D0A5946 $F0000020 $38F88B $F888F000 $F0000030 $2240F885 $43138A23 $BCF88223 $4700BC01 $805A16D $2000000 +POIN SetAnimStateUnfrozen +WORD $222AB530 $22085E83 $B0830004 $92002104 $32082001 $F0004D0B $4B0BF86B $F866F000 $33018D63 $141B041B $D0042B09 $B0038563 $BC01BC30 $23004700 $85630020 $F0004B03 $E7F4F855 $8012DCD $807168D $8002E95 $2103B5F8 $4B100004 $F0004810 $2300F847 $85434E0F $206444 $F843F000 $C04D0D $205947 $F83DF000 $300400C0 $205945 $F0004C09 $38F834 $F831F000 $F0000028 $BCF8F82E $4700BC01 $8002C7D +POIN CURRENTOFFSET+100 +WORD $805A16D $2000000 +POIN SetAnimStateFrozen +WORD $6A02B510 $62031F13 $48A03 $D5080699 $D5030659 $438B2160 $62028203 $BC01BC10 $22204700 $82034313 $F0004B04 $2800F809 $20D1F4 $FFB6F7FF $46C0E7F0 $805A155 $47204718 $47304728 +ALIGN 4 +WORD $43786665 $446C6C61 +SHORT $4B +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$0;ProScr_EfxCallDK: +POP +WORD $1 +POIN CURRENTOFFSET-16 +WORD $E $0 $2 +POIN CURRENTOFFSET-667 +WORD $3 +POIN CURRENTOFFSET-283 +WORD $3 +POIN CURRENTOFFSET-663 +WORD $2 +POIN CURRENTOFFSET-375 +WORD $0 $0 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.lyn.event new file mode 100644 index 00000000..d50b81d3 --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.lyn.event @@ -0,0 +1,44 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxCallDumaBaseHide: +ORG CURRENTOFFSET+$14;EfxCallDumaBG3Start: +ORG CURRENTOFFSET+$30;EfxCallDumaBG3: +ORG CURRENTOFFSET+$d4;EfxCallDumaOnEnd: +ORG CURRENTOFFSET+$4c;EfxCallDumaCustomBgFadeIn: +ORG CURRENTOFFSET+$50;NewEfxCallDuma: +ORG CURRENTOFFSET+$7c;BanimCmd_CallDuma: +POP +WORD $6C40B510 $F0004B02 $BC10F933 $4700BC01 $8076911 $4B08B510 $21026818 $F0004B07 $2302F927 $21012203 $4C052000 $F921F000 $BC01BC10 $46C04700 $2000000 $806FA85 +POIN EfxDragonSetBgPriorityASM +WORD $B5F80001 $46B02 $312C4B22 $F000302A $2800F90D $3001DA04 $BCF8D035 $4700BC01 $6B634E1D $59580085 $4F1C0031 $F902F000 $302280 $491A0192 $F0004B1A $2001F8F7 $F0004B19 $2101F8F3 $4B194818 $F8EEF000 $49186BA3 $F0005958 $2100F8ED $4B162080 $F8E4F000 $21004B15 $4B156818 $F8DEF000 $22086BE3 $49135958 $F0004B13 $4B13F8D7 $F8D4F000 $2300E7C9 $85630020 $F0004B10 $E7C2F8CD $80558F5 $2017790 $8012F51 $6008000 $8002015 $8076621 $20244A8 $8001221 $2019790 $806FAD9 $201FB0C $806FB2D $2022968 $80D1675 $8001F95 $8002E95 $6C44B5F8 $204E0E $F8A9F000 $C04D0D $205947 $F8A3F000 $300400C0 $4D0A5946 $F0000020 $38F89B $F898F000 $F0000030 $2240F895 $43138A23 $BCF88223 $4700BC01 $805A16D $2000000 +POIN SetAnimStateUnfrozen +WORD $222AB530 $22085E83 $B0830004 $92002104 $32082001 $F0004D0B $4B0BF87B $F876F000 $33018D63 $141B041B $D0042B09 $B0038563 $BC01BC30 $23004700 $85630020 $F0004B03 $E7F4F865 $8012DCD $807168D $8002E95 $4D16B5F8 $42103 $284B15 $F856F000 $85432300 $4B1362C3 $4B136343 $4B136383 $63C33540 $64444E12 $206305 $F849F000 $C04D10 $205947 $F843F000 $300400C0 $205945 $F0004C0C $38F83A $F837F000 $F0000028 $BCF8F834 $4700BC01 +POIN CURRENTOFFSET+120 +WORD $8002C7D +POIN ImgLut_Duma +POIN TsaLut_Duma +POIN PalLut_Duma +WORD $805A16D $2000000 +POIN SetAnimStateFrozen +WORD $6A02B510 $62031F13 $48A03 $D5080699 $D5030659 $438B2160 $62028203 $BC01BC10 $22204700 $82034313 $F0004B04 $2800F809 $20D1F4 $FFA6F7FF $46C0E7F0 $805A155 $47204718 $47304728 $46C04738 +ALIGN 4 +WORD $43786665 $446C6C61 $616D75 +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$0;ProScr_EfxCallDuma: +ORG CURRENTOFFSET+$40;FrameLut_EfxCallDuma: +POP +WORD $1 +POIN CURRENTOFFSET-16 +WORD $E $0 $2 +POIN CURRENTOFFSET-667 +WORD $3 +POIN CURRENTOFFSET-319 +WORD $2 +POIN CURRENTOFFSET-663 +WORD $3 +POIN CURRENTOFFSET-623 +WORD $2 +POIN CURRENTOFFSET-419 +WORD $0 $0 $10000 $10001 $10002 $20003 $20004 $20005 $20006 $20007 $30008 $30009 $3000A $3000B $4000C $4000D $4000E +SHORT $FFFF diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDK.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDK.lyn.event new file mode 100644 index 00000000..9509e616 --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDK.lyn.event @@ -0,0 +1,27 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxRemoveDkOnEnd2: +ORG CURRENTOFFSET+$c;EfxRemoveDkOnEnd: +ORG CURRENTOFFSET+$8c;NewEfxRemoveDK: +ORG CURRENTOFFSET+$5c;BanimCmd_RemoveDK: +POP +WORD $6DC22140 $430B8A13 $47708213 $46CEB5F8 $6DC34647 $4D19B580 $180004 $F0004698 $4E17F88B $598700C0 $F0004640 $C0F885 $59833004 $4E134699 $F0004640 $38F87E $F87BF000 $F0004648 $6DE0F878 $F874F000 $4B0D2201 $52C20040 $F0006DE0 $4B0BF86D $F868F000 $4B0A2200 $4B0A701A $BCC0701A $46B046B9 $BC01BCF8 $46C04700 $805A16D $2000000 +POIN SetAnimStateUnfrozen +WORD $203E104 $805A395 $2020048 $2020058 $2103B5F8 $4B100004 $F0004810 $2300F847 $85834E0F $2065C4 $F843F000 $C04D0D $205947 $F83DF000 $300400C0 $205945 $F0004C09 $38F834 $F831F000 $F0000028 $BCF8F82E $4700BC01 $8002C7D +POIN CURRENTOFFSET+100 +WORD $805A16D $2000000 +POIN SetAnimStateFrozen +WORD $6A02B510 $62031F13 $48A03 $D5080699 $D5030659 $438B2160 $62028203 $BC01BC10 $22204700 $82034313 $F0004B04 $2800F809 $20D1F4 $FFB6F7FF $46C0E7F0 $805A155 $47204718 $47304728 +ALIGN 4 +WORD $52786665 $766F6D65 $4B4465 +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$0;ProScr_EfxRemoveDK: +POP +WORD $1 +POIN CURRENTOFFSET-16 +WORD $E $0 $3 $8076819 $3 $80768A1 $2 +POIN CURRENTOFFSET-351 +WORD $2 +POIN CURRENTOFFSET-371 +WORD $0 $0 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.lyn.event new file mode 100644 index 00000000..9df6e6e2 --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.lyn.event @@ -0,0 +1,59 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxRemoveDumaDragonStatus: +ORG CURRENTOFFSET+$24;EfxRemoveDumaBG3: +ORG CURRENTOFFSET+$d4;EfxRemoveDumaOnEnd: +ORG CURRENTOFFSET+$94;EfxRemoveDumaOnExitBlocking: +ORG CURRENTOFFSET+$14;NewEfxRemoveDuma: +ORG CURRENTOFFSET+$84;BanimCmd_RemoveDuma: +ORG CURRENTOFFSET+$40;NewEfxRemoveDumaNonBlocking: +ORG CURRENTOFFSET+$4c;BanimCmd_RemoveDumaNonBlocking: +POP +WORD $4B510 $4B050021 $F0004805 $2300F97D $6C638583 $BC1065C3 $4700BC01 $8002CE1 +POIN CURRENTOFFSET+796 +WORD $B5F80001 $46B02 $312C4B22 $F000302A $2800F969 $3001DA04 $BCF8D035 $4700BC01 $6B634E1D $59580085 $4F1C0031 $F95DF000 $302280 $491A0192 $F0004B1A $2001F953 $F0004B19 $2101F94F $4B194818 $F94AF000 $49186BA3 $F0005958 $2100F948 $4B162080 $F940F000 $21004B15 $4B156818 $F93AF000 $22086BE3 $49135958 $F0004B13 $4B13F933 $F930F000 $2300E7C9 $85630020 $F0004B10 $E7C2F929 $80558F5 $2017790 $8012F51 $6008000 $8002015 $8076621 $20244A8 $8001221 $2019790 $806FAD9 $201FB0C $806FB2D $2022968 $80D1675 $8001F95 $8002E95 $46CEB5F8 $6C444647 $4E1BB580 $200005 $F900F000 $C04F19 $2059C3 $F0004698 $C0F8F9 $59C33004 $4F154699 $F0000020 $4640F8F2 $F8EFF000 $F0004648 $6C68F8EC $F8E8F000 $4B0F2201 $52C20040 $F0006C68 $4B0DF8E1 $F8DCF000 $4B0C2200 $4B0C701A $2240701A $43138A23 $BCC08223 $46B046B9 $BC01BCF8 $46C04700 $805A16D $2000000 +POIN SetAnimStateUnfrozen +WORD $203E104 $805A395 $2020048 $2020058 $56C32340 $D0042B00 $6C422140 $430B8A13 $47708213 $4D18B5F8 $280004 $4B172103 $F0003028 $2300F8AB $62C38543 $63434B14 $63834B14 $22014B14 $234063C3 $64443570 $4E126305 $2054C2 $F89AF000 $C04D10 $205947 $F894F000 $300400C0 $205945 $F0004C0C $38F88C $F889F000 $F0000028 $BCF8F886 $4700BC01 +POIN CURRENTOFFSET+312 +WORD $8002C7D +POIN ImgLut_Duma +POIN TsaLut_Duma +POIN PalLut_Duma +WORD $805A16D $2000000 +POIN SetAnimStateFrozen +WORD $6A02B510 $62031F13 $48A03 $D5080699 $D5030659 $438B2160 $62028203 $BC01BC10 $22204700 $82034313 $F0004B04 $2800F85B $20D1F4 $FFA2F7FF $46C0E7F0 $805A155 $4C0DB570 $200005 $4B0C2103 $F0003028 $2300F849 $62C38543 $63434B09 $63834B09 $22004B09 $234063C3 $64453470 $54C26304 $BC01BC70 $46C04700 +POIN CURRENTOFFSET+160 +WORD $8002C7D +POIN ImgLut_Duma +POIN TsaLut_Duma +POIN PalLut_Duma +WORD $4B0FB570 $F0000005 $1E04F827 $BC70D002 $4700BC01 $304E0B $21034B0B $F0003028 $4B0AF81B $4B0A6343 $4B0A6383 $63C32200 $36702340 $85446445 $630662C4 $E7E654C2 $805A155 +POIN CURRENTOFFSET+72 +WORD $8002C7D +POIN ImgLut_Duma +POIN TsaLut_Duma +POIN PalLut_Duma +WORD $47204718 $47384730 +ALIGN 4 +WORD $52786665 $766F6D65 $6D754465 $61 $52786645 $766F6D65 $6D754465 $61724461 $536E6F67 $75746174 +SHORT $73 +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$0;ProScr_EfxRemoveDumaDragonStatus: +ORG CURRENTOFFSET+$28;ProScr_EfxRemoveDuma: +ORG CURRENTOFFSET+$48;FrameLut_EfxRemoveDuma: +POP +WORD $1 +POIN CURRENTOFFSET-32 +WORD $E $0 $3 $8076819 $3 $80768A1 $0 $0 $1 +POIN CURRENTOFFSET-88 +WORD $E $0 $3 +POIN CURRENTOFFSET-851 +WORD $3000E $0 $2 +POIN CURRENTOFFSET-903 +WORD $E $0 $2 +POIN CURRENTOFFSET-671 +WORD $2 +POIN CURRENTOFFSET-531 +WORD $0 $0 $2000E $2000D $2000C $2000B $2000A $20009 $20008 $20007 $10006 $10005 $10004 $10003 $10002 $10001 $10000 +SHORT $FFFF diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EraseDispUp.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/EraseDispUp.lyn.event new file mode 100644 index 00000000..0ed67155 --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/EraseDispUp.lyn.event @@ -0,0 +1,5 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;BanimCmd_EraseDispUp: +POP +WORD $4B06B510 $F80EF000 $D0022800 $BC01BC10 $4B034700 $F806F000 $46C0E7F8 $805A155 $8051B91 $46C04718 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/FakeHitBlack.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/FakeHitBlack.lyn.event new file mode 100644 index 00000000..f3939d5b --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/FakeHitBlack.lyn.event @@ -0,0 +1,22 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxFakeHitBlackMain: +ORG CURRENTOFFSET+$78;NewEfxFakeHitBlack: +ORG CURRENTOFFSET+$24;BanimCmd_FakeHitBlack: +POP +WORD $46C6B5F0 $8D43B500 $41B3301 $4141B $85436C45 $D0202B01 $D0042B12 $46B8BC80 $BC01BCF0 $4B104700 $46980028 $F85EF000 $C04E0E $285987 $F859F000 $8A3B2140 $430B00C0 $59823004 $8A13823B $8213430B $4B070020 $F84AF000 $2110E7E0 $4B050028 $F844F000 $46C0E7DA $805A16D $2000000 $8002E95 $8053F8D $2103B510 $4B050004 $F0004805 $2300F833 $85436444 $BC01BC10 $46C04700 $8002C7D +POIN CURRENTOFFSET+104 +WORD $6A02B570 $62031F13 $48A03 $D5080699 $D5030659 $438B2160 $62028203 $BC01BC70 $22204700 $82034313 $F0004B06 $1E05F811 $2103D1F4 $4B054804 $F80AF000 $85456444 $46C0E7EC $805A155 +POIN CURRENTOFFSET+28 +WORD $8002C7D $47404718 +ALIGN 4 +WORD $46786665 $48656B61 $6C427469 $6B6361 +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$0;ProScr_EfxFakeHitBlack: +POP +WORD $1 +POIN CURRENTOFFSET-20 +WORD $3 +POIN CURRENTOFFSET-267 +WORD $0 $0 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/FakeHitRed.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/FakeHitRed.lyn.event new file mode 100644 index 00000000..a53fdd1f --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/FakeHitRed.lyn.event @@ -0,0 +1,23 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxFakeHitRedMain: +ORG CURRENTOFFSET+$78;NewEfxFakeHitRed: +ORG CURRENTOFFSET+$24;BanimCmd_FakeHitRed: +POP +WORD $46C6B5F0 $8D43B500 $41B3301 $4141B $85436C45 $D0202B01 $D0042B12 $46B8BC80 $BC01BCF0 $4B104700 $46980028 $F85EF000 $C04E0E $285987 $F859F000 $8A3B2140 $430B00C0 $59823004 $8A13823B $8213430B $4B070020 $F84AF000 $2110E7E0 $4B050028 $F844F000 $46C0E7DA $805A16D $2000000 $8002E95 $8053F4D $2103B510 $4B050004 $F0004805 $2300F833 $85436444 $BC01BC10 $46C04700 $8002C7D +POIN CURRENTOFFSET+104 +WORD $6A02B570 $62031F13 $48A03 $D5080699 $D5030659 $438B2160 $62028203 $BC01BC70 $22204700 $82034313 $F0004B06 $1E05F811 $2103D1F4 $4B054804 $F80AF000 $85456444 $46C0E7EC $805A155 +POIN CURRENTOFFSET+28 +WORD $8002C7D $47404718 +ALIGN 4 +WORD $46786665 $48656B61 $65527469 +SHORT $64 +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$0;ProScr_EfxFakeHitRed: +POP +WORD $1 +POIN CURRENTOFFSET-20 +WORD $3 +POIN CURRENTOFFSET-267 +WORD $0 $0 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/Utils.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/Utils.lyn.event new file mode 100644 index 00000000..94ac14e3 --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/Utils.lyn.event @@ -0,0 +1,6 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;SetAnimStateFrozen: +ORG CURRENTOFFSET+$54;SetAnimStateUnfrozen: +POP +WORD $4F12B5F8 $F0000004 $4E11F84F $598500C0 $F0000020 $C0F849 $59833004 $21082020 $43028A22 $88228222 $8022430A $43028A2A $882A822A $802A430A $43028A1A $881A821A $801A430A $BC01BCF8 $46C04700 $805A16D $2000000 $4F12B5F8 $F0000004 $4E11F825 $598500C0 $F0000020 $C0F81F $59833004 $21082040 $43028A22 $88228222 $8022438A $43028A2A $882A822A $802A438A $43028A1A $881A821A $801A438A $BC01BCF8 $46C04700 $805A16D $2000000 $46C04738 diff --git a/EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.lyn.event b/EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.lyn.event new file mode 100644 index 00000000..db2e4b2f --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.lyn.event @@ -0,0 +1,5 @@ +ALIGN 4 +PUSH +ORG CURRENTOFFSET+$1;EfxDragonSetBgPriorityASM: +POP +WORD $1C04B570 $1C161C0D $68D04A0C $4008490C $43081C21 $691060D0 $40084909 $43081C29 $69506110 $40084906 $43081C31 $69906150 $40084903 $43081C19 $BD706190 $3003080 $FFFFFFFC diff --git a/EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.o b/EngineHacks/Others/BanimCmdExpansion/source/UtilsASM.o new file mode 100644 index 0000000000000000000000000000000000000000..c8c7cb0723fdb805313c5ecb56f778761211e027 GIT binary patch literal 780 zcmah`UrPc(5TEtb?!dr;g6N@&lwmBl0Ej&9-g{jp6solPkjX+`v84~ z9{Ub{pulFlTRVHG-!V78+5OGz?Cfi!b;lS34F)Cni2&ZCAalJIl)wTLCLd{g*FLm! z_se0fX;uohSzkWqg@ybad7gJf7WozO4qpfZ`4RF3pL|l8uhnW*Jwd{K?g?NANHf)k z_RXW)ZbCL?GAr2vrEJ02>JY%dF9`$EzZ48t0B$#;?eYd>UOQi40`NsyLsfkyiObeEB4f^H3}cN)?4U)Lj_O02&jU!c(&kx_s2CUggV ZCQ>M2Vwp$`U2hNLq^^e>6)i%qb>DK4M~VOd literal 0 HcmV?d00001 diff --git a/EngineHacks/Others/MasterInstaller.event b/EngineHacks/Others/MasterInstaller.event index 2c773588..f7c6e651 100644 --- a/EngineHacks/Others/MasterInstaller.event +++ b/EngineHacks/Others/MasterInstaller.event @@ -48,5 +48,5 @@ #include "CantoBugFix/Installer.event" // by Contro -// #include "BanimCmdExpansion/BanimCmdExpansion.event" +#include "BanimCmdExpansion/BanimCmdExpansion.event" // by MokhaLee From 8f4b771aaa6dbfe2ca887524ac5eeaaffd8c712d Mon Sep 17 00:00:00 2001 From: Alice Date: Thu, 6 Nov 2025 17:49:12 -0500 Subject: [PATCH 3/4] Changed frame data --- .../Others/BanimCmdExpansion/source/EfxCallDoma.c | 14 -------------- .../BanimCmdExpansion/source/EfxRemoveDoma.c | 14 -------------- 2 files changed, 28 deletions(-) diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.c b/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.c index 3c835df5..f2c3a928 100644 --- a/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.c +++ b/EngineHacks/Others/BanimCmdExpansion/source/EfxCallDoma.c @@ -12,20 +12,6 @@ const s16 FrameLut_EfxCallDuma[] = { /* FrameIndex Duration */ 0, 1, - 1, 1, - 2, 1, - 3, 2, - 4, 2, - 5, 2, - 6, 2, - 7, 2, - 8, 3, - 9, 3, - 10, 3, - 11, 3, - 12, 4, - 13, 4, - 14, 4, -1, }; diff --git a/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.c b/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.c index 32b0afd1..0e8a2d81 100644 --- a/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.c +++ b/EngineHacks/Others/BanimCmdExpansion/source/EfxRemoveDoma.c @@ -11,20 +11,6 @@ const s16 FrameLut_EfxRemoveDuma[] = { /* FrameIndex Duration */ - 14, 2, - 13, 2, - 12, 2, - 11, 2, - 10, 2, - 9, 2, - 8, 2, - 7, 2, - 6, 1, - 5, 1, - 4, 1, - 3, 1, - 2, 1, - 1, 1, 0, 1, -1, }; From 62f3acec4c0ecd841d5a833fb894138a7480793e Mon Sep 17 00:00:00 2001 From: Alice Date: Thu, 6 Nov 2025 18:26:05 -0500 Subject: [PATCH 4/4] Makefile --- .../BanimCmdExpansion/source/AssembleLyn.bat | 26 +++++++++++++++++++ .../Others/BanimCmdExpansion/source/aMake.bat | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/AssembleLyn.bat create mode 100644 EngineHacks/Others/BanimCmdExpansion/source/aMake.bat diff --git a/EngineHacks/Others/BanimCmdExpansion/source/AssembleLyn.bat b/EngineHacks/Others/BanimCmdExpansion/source/AssembleLyn.bat new file mode 100644 index 00000000..b78658fe --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/AssembleLyn.bat @@ -0,0 +1,26 @@ +@echo off + +SET startDir="C:\devkitPro\devkitARM\bin\" +SET as="%startDir%arm-none-eabi-as" +SET LYN="C:\devkitPro\lyn.exe" + +@rem Assemble into an elf +%as% -g -mcpu=arm7tdmi -mthumb-interwork %1 -o "%~n1.elf" + +if exist "Definitions.s" ( + + @rem Assemble definitions into a .elf if exists + %as% -g -mcpu=arm7tdmi -mthumb-interwork "Definitions.s" -o "Definitions.elf" + + @rem Assebmle into a .lyn.event with definitions + %LYN% "%~n1.elf" "Definitions.elf" > "%~n1.lyn.event" + + echo y | del "%~dp0Definitions.elf" +) else ( + @rem Assemble into a .lyn.event + %LYN% "%~n1.elf" > "%~n1.lyn.event" +) + +echo y | del "%~n1.elf" + +pause \ No newline at end of file diff --git a/EngineHacks/Others/BanimCmdExpansion/source/aMake.bat b/EngineHacks/Others/BanimCmdExpansion/source/aMake.bat new file mode 100644 index 00000000..69a32b7f --- /dev/null +++ b/EngineHacks/Others/BanimCmdExpansion/source/aMake.bat @@ -0,0 +1,2 @@ +make "EfxCallDoma.lyn.event" +pause