If you're thinking of doing a larger patch, you might want to look into the bug-fixes thread. The scripts in my GitHub are pretty good for ripping the disc apart and reassembling a patched copy. I partner it with the armips assembler and a custom version of the PPF format, but you can just as easily do binary find-and-replace in a script if you don't want to go that route.
As to spell damage multipliers, yeah, they're in there somewhere. It's been a long time since I looked at that, though. Given that there were no bugs to do with those modifiers, I didn't go into it too deeply, and I remember next to nothing about it. I don't think I documented any part of it, except maybe a passing comment in a disassembly. As to the spells themselves, they're in MAGI.BIN, and somewhere on the forum I described the structs for spells and runes.
Here's some old code. I think the threads have other information, like the purpose of some of the unknowns.
Code: Select all
#define NAMESIZE 21
#define DESCSIZE 32
/*
byte after description appears to be spell damage type:
0x22 - Enemy
0x23 - Heal
0x42 - Status
Next byte maybe spell delay? Actually, I think target indicator.
Byte 2 after SDT seems to be the spell element
0x01 - Fire
0x02 - Water
0x03 - Wind
byte 3 after element possibly indicates enemy affect?*/
typedef struct s2magic {
unsigned char name[NAMESIZE];
unsigned char desc[DESCSIZE];
unsigned char unk1;
unsigned char unk2;
unsigned char element;
unsigned char unk4;
unsigned char unk5;
unsigned char unk6;
unsigned char unk7;
signed int damage;
} T_S2MAGIC;
typedef struct s2rune {
unsigned char name[NAMESIZE];
unsigned char desc[DESCSIZE];
unsigned char slotmask;
unsigned char unk1;
unsigned char unk2;
unsigned char spells[4];
unsigned short cost;
} T_S2RUNE;
static const wchar_t *ElementName[10] = {
L"Non-Elemental"
, L"Fire"
, L"Water"
, L"Wind"
, L"Earth"
, L"Lightning"
, L"Holy"
, L"Darkness"
, L"Bright Shield"
, L"Unknown 1"
//, L"Unknown 2"
};