Moderator: MacroQuest Developers
Code: Select all
#define SPELLLIST_STARTOFFSET 0x24
#define TOTAL_SPELL_COUNT 0x0FA0 // # of spells in game
typedef struct _SPELLLIST {
/*0x000*/ DWORD ID;
/*0x004*/ FLOAT Range;
/*0x008*/ BYTE Unknown0x008[12];
/*0x014*/ DWORD CastTime;
/*0x018*/ DWORD FizzleTime;
/*0x01c*/ DWORD RecastTime;
/*0x020*/ DWORD DurationType; //DurationFormula on Lucy
/*0x024*/ DWORD DurationValue1;
/*0x028*/ DWORD Unknown0x024;
/*0x02c*/ DWORD Mana;
/*0x030*/ DWORD Base[12]; //Base1-Base12
/*0x060*/ DWORD Max[12]; //Max1-Max12
/*0x090*/ DWORD BookIcon;
/*0x094*/ DWORD GemIcon;
/*0x098*/ DWORD ReagentId[4]; //ReagentId1-ReagentId4
/*0x0a8*/ DWORD ReagentCount[4]; //ReagentCount1-ReagentCount4
/*0x0b8*/ DWORD Unknown0x0b8[4];
/*0x0c8*/ BYTE Calc[12]; //Calc1-Calc12
/*0x0d4*/ BYTE Unknown0x0d4;
/*0x0d5*/ BYTE Deletable; // untested
/*0x0d6*/ BYTE Unknown0x0d6[2];
/*0x0d8*/ BYTE Attrib[12]; //Attrib1-Attrib12
/*0x0e4*/ BYTE Unknown0x0e4;
/*0x0e5*/ BYTE FizzLeadj;
/*0x0e6*/ BYTE Unknown0x0e6;
/*0x0e7*/ BYTE Unknown0x0e7;
/*0x0e8*/ BYTE Unknown0x0e8[3];
/*0x0eb*/ BYTE Level[15];
/*0x0fa*/ BYTE Unknown0x0fa[16];
/*0x10a*/ BYTE CastingAnim;
/*0x10b*/ BYTE Unknown0x10b[5];
/*0x110*/ DWORD UnknownFlags0x110; // Lucy lists this as 'descnum', but I think it's flags.
/*0x114*/ DWORD UnknownFlags0x114;
/*0x118*/ BYTE Unknown0x118[12];
/*0x124*/ DWORD UnknownFlags0x124;
/*0x128*/ DWORD UnknownFlags0x128;
/*0x12c*/ DWORD Unknown0x12c[2];
/*0x134*/ CHAR *Name;
/*0x138*/ CHAR *Target;
/*0x13c*/ CHAR *Unknown0x13c;
/*0x140*/ CHAR *Unknown0x140;
/*0x144*/ CHAR *Unknown0x144; // new struct that indicates casting sound possibly?
/*0x148*/ CHAR *CastOnYou;
/*0x14c*/ CHAR *CastOnAnother;
/*0x150*/ CHAR *WearOff;
/*0x154*/ CHAR *Unknown0x154; // new sprites animation struct?
/*0x158*/ DWORD spaindex;
/*0x15c*/ DWORD Unknown0x15c;
/*0x160*/ DWORD SpellAnim;
/*0x164*/ DWORD Unknown0x164;
/*0x168*/ DWORD Unknown130; // This is Unknown130 from Lucy
/*0x16c*/ DWORD Unknown0x16c;
/*0x170*/ DWORD SpellIcon;
/*0x174*/ BYTE Unknown0x174[12];
} SPELLLIST, *PSPELLLIST;
Code: Select all
DWORD GetSpellDuration(PSPELLLIST pSpell, PSPAWNINFO pSpawn)
{
switch (pSpell->DurationType) {
case 0:
return 0;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 8:
case 9:
case 10:
case 11:
case 12:
if (pSpell->DurationValue1) {
return (pSpell->DurationValue1);
} else {
return (pSpell->DurationType*10);
}
case 7:
if (pSpell->DurationValue1) {
return (pSpell->DurationValue1);
} else {
return (pSpawn->Level*10);
}
case 50:
return 0xFFFFFFFF;
case 3600:
return 6000;
default:
return 0xFFFFFFFE;
}
}
Code: Select all
#turbo 100
#event haste "You begin casting Quickness"
#define counter v1
#define curtime v3
Sub Main
/zapvars
:mainloop
/for v2 0 to 99
/doevents
/varset curtime $calc($time(h)*3600+$time(m)*60+$time(s))
/if n $a(2,$v2)>0 /if n $a(2,$v2)<$curtime {
/echo $a(1,$v2) has expired on $a(3,$v2)
/varset a(1,$v2) 0
/varset a(2,$v2) 0
/varset a(3,$v2) 0
}
/next v2
/goto :mainloop
/return
Sub Track
/echo Added $p0 on $p1 to tracking.
/if n $counter==99 /varset counter 0
/varset a(1,$counter) $p0
/varset a(2,$counter) $calc($time(h)*3600+$time(m)*60+$time(s))
/varadd a(2,$counter) $spell($p0,duration)
/varset a(3,$counter) $p1
/varadd counter 1
/return
Sub Event_haste
/call Track "Quickness" $target(name)
/return
Code: Select all
} else if (Tics=0) {
Code: Select all
} else if (Tics==0) {