Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define RGB16(r,g,b) ((r)+(g<<5)+(b<<10))
- register int *r4 asm ("r4"); //One register for manual-use only. Usually used for addresses.
- int main() {
- char x,y;
- unsigned short* Screen = (unsigned short*)0x6000000;
- *(unsigned long*)0x4000000 = 0x403; // mode3, bg2 on
- // clear screen, and draw a blue back ground
- for(x = 0; x<240;x++) //loop through all x
- {
- for(y = 0; y<160; y++) //loop through all y
- {
- Screen[x+y*240] = RGB16(0,0,31);
- }
- }
- // draw a white HI on the background
- for(x = 20; x<=60; x+=15)
- for(y = 30; y<50; y++)
- Screen[x+y*240] = RGB16(31,31,31);
- for (x = 20; x < 35; x++)
- Screen[x+40*240] = RGB16(31,31,31);
- ((int*)0x02002348)[8] = 888;
- while(1){} //loop forever
- }
- //#define aa (char*)0x3
- #define curParty (char*)0x02000458 //0x02000240 + 0x218
- //PARTY MECHANICS!
- //NOTE: Many of these function/variable names may be WIP, so suggestions recommended.
- //Public functions should be left alone since they're supposed to be 8 bytes/entry after compiled.
- //These functions do mov pc, r4 instead of bx r4... but both do the same things.
- int pub() {
- r4=(int*)main; goto *r4;
- }
- void init() { //080AD338
- initPlayerData();
- pub_bootMap(0);
- }
- int getAvailableSummonsAddr(int team) { //080AD348
- if (team == 0) {
- return 0x0200024C;
- } else {
- return pub_getCharAddr(0x83);
- }
- }
- int getAvgLevel() { //080AD360
- int partyAmt = getPartyAmt();
- int avgLevel = 0;
- if (partyAmt != 0) {
- char* a = curParty;
- int i = partyAmt;
- do {
- avgLevel += *(char*)(pub_getCharAddr(*a++) + 0xF);
- } while (--i != 0);
- avgLevel = pub_division(avgLevel, partyAmt);
- }
- return avgLevel;
- }
- int getEnemyStatsAddr(int index) { //080AD360
- index -= 8;
- if ((unsigned int)index >= 0x3E8) { index = 0; }
- return 0x080B9E7C + (index * 0x4C);
- }
- void copyBytes(int addr1, int addr2, int size, int direction) { //080AD3A8
- //Note: r4 is used in the original game, but don't need to use it...
- if (direction != 0) {
- while (0 < size--) {
- *(char*)addr2++ = *(char*)addr1++;
- }
- } else {
- while (0 < size--) {
- *(char*)addr1++ = *(char*)addr2++;
- }
- }
- }
- //#define BASEHP *(short*)(charAddr + 0x10)
- //#define BASEPP *(short*)(charAddr + 0x12)
- //#define PSY (int*)(charAddr + 0x58)
- //#define ITEM (short*)(charAddr + 0xD8)
- //#define DJINN (int*)(charAddr + 0xF8)
- void calcStats(int charSlot) { //080AD3F8
- int addr = pub_getFreeSpaceW(0x60);
- int charAddr = pub_getCharAddr(charSlot);
- //Put all the data in a temp buffer.
- *(int*)(addr + 0x00) = *(short*)(charAddr + 0x10); //Base HP
- *(int*)(addr + 0x04) = *(short*)(charAddr + 0x12); //Base PP
- *(int*)(addr + 0x08) = *(unsigned short*)(charAddr + 0x18); //Base Attack
- *(int*)(addr + 0x0C) = *(unsigned short*)(charAddr + 0x1A); //Base Defense
- *(int*)(addr + 0x10) = *(unsigned short*)(charAddr + 0x1C); //Base Agility
- *(int*)(addr + 0x18) = *(char*)(charAddr + 0x1E); //Base Luck
- *(int*)(addr + 0x1C) = *(char*)(charAddr + 0x1F) & 0xF; //Base Turns
- *(int*)(addr + 0x20) = *(char*)(charAddr + 0x20); //Base HP Recovery
- *(int*)(addr + 0x24) = *(char*)(charAddr + 0x21); //Base PP Recovery
- int i = 3, eAddr1 = charAddr + 0x24, eAddr2 = addr + 0x28;
- do {
- *(int*)(eAddr2) = *(short*)(eAddr1); //Base ePower
- *(int*)(eAddr2 + 0x04) = *(short*)(eAddr1 + 0x2); //Base eResist
- eAddr1 += 4; eAddr2 += 8;
- } while (--i >= 0);
- //HP/PP Validation
- int statn = *(short*)(charAddr + 0x34) * *(short*)(charAddr + 0x14);
- if (statn < 0) { statn += 0x3FFF; }
- statn >>= 0xE; // The Current HP of the percent calculation.
- int curStat = *(short*)(charAddr + 0x38);
- if (((statn - curStat) <= 1) || ((curStat - statn) <= 1)) { //If HP is valid, then check PP.
- statn = *(short*)(charAddr + 0x36) * *(short*)(charAddr + 0x16);
- if (statn < 0) { statn += 0x3FFF; }
- statn >>= 0xE; // The Current PP of the percent calculation.
- curStat = *(short*)(charAddr + 0x3A);
- }
- //If HP or PP are invalid, reset both to full.
- if (((statn - curStat) > 1) || ((curStat - statn) > 1)) {
- *(short*)(charAddr + 0x14) = 0x4000;
- *(short*)(charAddr + 0x16) = 0x4000;
- *(short*)(charAddr + 0x38) = *(short*)(charAddr + 0x34);
- *(short*)(charAddr + 0x3A) = *(short*)(charAddr + 0x36);
- }
- //Curse-related
- *(char*)(charAddr + 0x130) = *(char*)(charAddr + 0x130) & -4; //0xFC;
- if ((*(char*)(charAddr + 0x130) & 4) != 0) {
- *(char*)(charAddr + 0x130) |= 1;
- }
- //Unknown purpose, but gives bonus turn.
- if (*(char*)(charAddr + 0x144) != 0) {
- *(int*)(addr + 0x1C) += 1;
- }
- //Unleash Critical Rate
- *(char*)(charAddr + 0x142) = 0;
- if (*(char*)(charAddr + 0x129) != 0) { //Check class for PC, basically.
- //int pcItemAddr = (charAddr + 0xD8);
- //Item
- int pcItemInd = 0;
- do {
- unsigned short item = *(unsigned short*)(charAddr + 0xD8 + (pcItemInd << 1));
- if ((item & 0x0200) != 0) { //If item is equipped.
- int itemAddr = getItemAddr(item);
- int itemCursed = *(char*)(itemAddr +0x3) & 0x1;
- //*(int*)(addr + 0x58) = itemAddr;
- if (itemCursed != 0) {
- *(char*)(charAddr + 0x130) |= 3;
- }
- *(int*)(addr + 0x08) += *(short*)(itemAddr + 0x8); //Attack
- *(int*)(addr + 0x0C) += *(signed char*)(itemAddr + 0xA); //Defense
- int i = 0;
- do {
- *(int*)(addr + 0x48) = *(char*)(itemAddr + 0x18 + (i * 4));
- *(int*)(addr + 0x54) = *(signed char*)(itemAddr + 0x18 + (i * 4) + 1);
- switch (*(int*)(addr + 0x48)) {
- case 1:
- *(int*)(addr + 0x00) += *(int*)(addr + 0x54);
- break;
- case 2:
- *(int*)(addr + 0x20) += *(int*)(addr + 0x54);
- break;
- case 3:
- *(int*)(addr + 0x04) += *(int*)(addr + 0x54);
- break;
- case 4:
- *(int*)(addr + 0x24) += *(int*)(addr + 0x54);
- break;
- case 5:
- *(int*)(addr + 0x10) += *(int*)(addr + 0x54);
- break;
- case 6:
- *(int*)(addr + 0x18) += *(int*)(addr + 0x54);
- break;
- case 0xF:
- *(int*)(addr + 0x28) += *(int*)(addr + 0x54);
- break;
- case 0x10:
- *(int*)(addr + 0x30) += *(int*)(addr + 0x54);
- break;
- case 0x11:
- *(int*)(addr + 0x38) += *(int*)(addr + 0x54);
- break;
- case 0x12:
- *(int*)(addr + 0x40) += *(int*)(addr + 0x54);
- break;
- case 0x13:
- *(int*)(addr + 0x2C) += *(int*)(addr + 0x54);
- break;
- case 0x14:
- *(int*)(addr + 0x34) += *(int*)(addr + 0x54);
- break;
- case 0x15:
- *(int*)(addr + 0x3C) += *(int*)(addr + 0x54);
- break;
- case 0x16:
- *(int*)(addr + 0x44) += *(int*)(addr + 0x54);
- break;
- case 0x17:
- *(char*)(charAddr + 0x142) += *(int*)(addr + 0x54);
- break;
- case 0x19: //Curse is removable
- *(char*)(charAddr + 0x130) |= 8;
- break;
- case 0x1A:
- *(int*)(addr + 0x1C) += *(int*)(addr + 0x54);
- break;
- }
- } while (++i <= 3);
- }
- } while (++pcItemInd <= 0xE);
- //Curse-related
- if ((*(char*)(charAddr + 0x130) & 8) != 0) {
- *(char*)(charAddr + 0x130) = *(char*)(charAddr + 0x130) & -0xA; //0xF6;
- }
- //Djinn
- int element = 0; //Note: Original game used r4.
- do {
- int djinn = *(int*)(charAddr + 0x108 + element * 4);
- int djinni = 0;
- do {
- if ((djinn & (1 << djinni)) == 0) { continue; }
- int djinniAddr = getDjinniAddr(element, djinni);
- *(int*)(addr + 0x00) += *(signed char*)(djinniAddr + 0x4);
- *(int*)(addr + 0x04) += *(signed char*)(djinniAddr + 0x5);
- *(int*)(addr + 0x08) += *(signed char*)(djinniAddr + 0x6);
- *(int*)(addr + 0x0C) += *(signed char*)(djinniAddr + 0x7);
- *(int*)(addr + 0x10) += *(signed char*)(djinniAddr + 0x8);
- *(int*)(addr + 0x18) += *(signed char*)(djinniAddr + 0x9);
- } while (++djinni <= 0x13);
- } while (++element <= 3);
- //int pcDjinnAddr = charAddr;
- //getDjinniAddr();
- //Class
- int classAddr = getClassAddr(*(char*)(charAddr + 0x129));
- *(int*)(addr + 0x00) = pub_division(*(int*)(addr + 0x00) * *(char*)(classAddr + 0x8), 10);
- *(int*)(addr + 0x04) = pub_division(*(int*)(addr + 0x04) * *(char*)(classAddr + 0x9), 10);
- *(int*)(addr + 0x08) = pub_division(*(int*)(addr + 0x08) * *(char*)(classAddr + 0xA), 10);
- *(int*)(addr + 0x0C) = pub_division(*(int*)(addr + 0x0C) * *(char*)(classAddr + 0xB), 10);
- *(int*)(addr + 0x10) = pub_division(*(int*)(addr + 0x10) * *(char*)(classAddr + 0xC), 10);
- *(int*)(addr + 0x18) = pub_division(*(int*)(addr + 0x18) * *(char*)(classAddr + 0xD), 10);
- //Item
- pcItemInd = 0;
- do {
- unsigned short item = *(unsigned short*)(charAddr + 0xD8 + (pcItemInd << 1));
- if ((item & 0x0200) != 0) { //If item is equipped.
- int itemAddr = getItemAddr(item);
- //*(int*)(addr + 0x58) = itemAddr;
- int i = 0;
- do {
- *(int*)(addr + 0x48) = *(char*)(itemAddr + 0x18 + (i * 4));
- *(int*)(addr + 0x54) = *(signed char*)(itemAddr + 0x18 + (i * 4) + 1);
- switch (*(int*)(addr + 0x48)) {
- case 7:
- *(int*)(addr + 0x00) = pub_division(*(int*)(addr + 0x00) * *(int*)(addr + 0x54), 10);
- break;
- case 8:
- *(int*)(addr + 0x20) = pub_division(*(int*)(addr + 0x20) * *(int*)(addr + 0x54), 10);
- break;
- case 9:
- *(int*)(addr + 0x04) = pub_division(*(int*)(addr + 0x04) * *(int*)(addr + 0x54), 10);
- break;
- case 0xA:
- *(int*)(addr + 0x24) = pub_division(*(int*)(addr + 0x24) * *(int*)(addr + 0x54), 10);
- break;
- case 0xB:
- *(int*)(addr + 0x08) = pub_division(*(int*)(addr + 0x08) * *(int*)(addr + 0x54), 10);
- break;
- case 0xC:
- *(int*)(addr + 0x0C) = pub_division(*(int*)(addr + 0x0C) * *(int*)(addr + 0x54), 10);
- break;
- case 0xD:
- *(int*)(addr + 0x10) = pub_division(*(int*)(addr + 0x10) * *(int*)(addr + 0x54), 10);
- break;
- case 0xE:
- *(int*)(addr + 0x18) = pub_division(*(int*)(addr + 0x18) * *(int*)(addr + 0x54), 10);
- break;
- }
- } while (++i <= 3);
- }
- } while (++pcItemInd <= 0xE);
- }
- //Attack Effect Multiplier
- int a = (*(signed char*)(charAddr + 0x133) + 8) * *(int*)(addr + 0x08);
- if (a < 0) { a += 7; }
- *(int*)(addr + 0x08) = a >> 3;
- //Defense Effect Multiplier
- a = (*(signed char*)(charAddr + 0x135) + 8) * *(int*)(addr + 0x0C);
- if (a < 0) { a += 7; }
- *(int*)(addr + 0x0C) = a >> 3;
- //Agility Effect Multiplier
- a = (*(signed char*)(charAddr + 0x147) + 8) * *(int*)(addr + 0x10);
- if (a < 0) { a += 7; }
- *(int*)(addr + 0x10) = a >> 3;
- //Summon Multipliers
- i = 3; eAddr1 = charAddr + 0x12C; eAddr2 = addr + 0x28;
- do {
- a = *(signed char*)(eAddr1);
- *(int*)(eAddr2) = (a * a + a) * 5;
- eAddr1 += 1; eAddr2 += 8;
- } while (--i >= 0);
- //Resistance Multiplier
- i = 3; eAddr1 = charAddr + 0x137; eAddr2 = addr + 0x2C;
- do {
- a = *(signed char*)(eAddr1);
- *(int*)(eAddr2) += a * 20;
- eAddr1 += 0; eAddr2 += 8;
- } while (--i >= 0);
- //PP Recovery
- if (*(char*)(charAddr + 0x129) != 0) { //Check class for PC, basically.
- int ppr = 0;
- switch (*(unsigned short*)(charAddr + 0x14A)) {
- case 0: case 4:
- ppr = pub_getFlag(0x110);
- break;
- case 1: case 5:
- ppr = pub_getFlag(0x112);
- break;
- case 2: case 6:
- ppr = pub_getFlag(0x113);
- break;
- case 3: case 7:
- ppr = pub_getFlag(0x111);
- break;
- }
- if (ppr != 0) {
- *(int*)(addr + 0x24) += 4;
- }
- }
- // Stat Min/Max
- if (*(int*)(addr + 0x08) < 0) { *(int*)(addr + 0x08) = 0; }
- if (*(int*)(addr + 0x08) > 999) { *(int*)(addr + 0x08) = 999; }
- if (*(int*)(addr + 0x0C) < 0) { *(int*)(addr + 0x0C) = 0; }
- if (*(int*)(addr + 0x0C) > 999) { *(int*)(addr + 0x0C) = 999; }
- if (*(int*)(addr + 0x10) < 0) { *(int*)(addr + 0x10) = 0; }
- if (*(int*)(addr + 0x10) > 999) { *(int*)(addr + 0x10) = 999; }
- if (*(int*)(addr + 0x18) < 0) { *(int*)(addr + 0x18) = 0; }
- if (*(int*)(addr + 0x18) > 99) { *(int*)(addr + 0x18) = 99; }
- if (*(char*)(charAddr + 0x129) == 0) {
- if (*(int*)(addr + 0x1C) < 0) { *(int*)(addr + 0x1C) = 0; }
- if (*(int*)(addr + 0x1C) > 4) { *(int*)(addr + 0x1C) = 4; }
- } else {
- if (*(int*)(addr + 0x1C) < 0) { *(int*)(addr + 0x1C) = 0; }
- if (*(int*)(addr + 0x1C) > 2) { *(int*)(addr + 0x1C) = 2; }
- }
- if (*(int*)(addr + 0x20) < 0) { *(int*)(addr + 0x20) = 0; }
- if (*(int*)(addr + 0x20) > 10000) { *(int*)(addr + 0x20) = 10000; }
- if (*(int*)(addr + 0x24) < 0) { *(int*)(addr + 0x24) = 0; }
- if (*(int*)(addr + 0x24) > 200) { *(int*)(addr + 0x24) = 200; }
- i = 3, eAddr2 = addr + 0x28;
- do {
- if (*(int*)(eAddr2) < 0) { *(int*)(eAddr2) = 0; }
- if (*(int*)(eAddr2) > 200) { *(int*)(eAddr2) = 200; }
- if (*(int*)(eAddr2 + 4) < 0) { *(int*)(eAddr2 + 4) = 0; }
- if (*(int*)(eAddr2 + 4) > 200) { *(int*)(eAddr2 + 4) = 200; }
- eAddr2 += 8;
- } while (--i >= 0);
- *(unsigned short*)(charAddr + 0x3C) = *(int*)(addr + 0x08); //Attack
- *(unsigned short*)(charAddr + 0x3E) = *(int*)(addr + 0x0C); //Defense
- *(unsigned short*)(charAddr + 0x40) = *(int*)(addr + 0x10); //Agility
- *(char*)(charAddr + 0x42) = *(int*)(addr + 0x18); //Luck
- *(char*)(charAddr + 0x43) = *(int*)(addr + 0x1C); //Turns
- *(char*)(charAddr + 0x44) = *(int*)(addr + 0x20); //HP Recovery
- *(char*)(charAddr + 0x45) = *(int*)(addr + 0x24); //PP Recovery
- i = 3, eAddr1 = charAddr + 0x48, eAddr2 = addr + 0x28;
- do {
- *(short*)(eAddr1) = *(int*)(eAddr2); //ePower
- *(short*)(eAddr1 + 0x2) = *(int*)(eAddr2 + 0x04); //eResist
- eAddr1 += 4; eAddr2 += 8;
- } while (--i >= 0);
- int hpmax = 0, ppmax = 0;
- if (*(char*)(charAddr + 0x129) == 0) {
- hpmax = 0x3FFF; ppmax = 9999;
- } else {
- hpmax = 1999; ppmax = 1999;
- }
- int oldhp = *(short*)(charAddr + 0x34);
- if (*(int*)(addr + 0x00) < 0) { *(int*)(addr + 0x00) = 0; }
- if (*(int*)(addr + 0x00) > hpmax) { *(int*)(addr + 0x00) = hpmax; }
- *(short*)(charAddr + 0x34) = *(int*)(addr + 0x00); //HP
- if (*(short*)(charAddr + 0x34) != oldhp) {
- int hp = *(short*)(charAddr + 0x34) * *(short*)(charAddr + 0x14);
- if (hp < 0) { hp += 0x3FFF; }
- hp >>= 0xE;
- if (hp < 0) { hp = 0; }
- if (hp > hpmax) { hp = hpmax; }
- if ((*(short*)(charAddr + 0x38) != 0) && (hp == 0)) { hp = 1; }
- *(short*)(charAddr + 0x38) = hp;
- }
- int oldpp = *(short*)(charAddr + 0x36);
- if (*(int*)(addr + 0x04) < 0) { *(int*)(addr + 0x04) = 0; }
- if (*(int*)(addr + 0x04) > ppmax) { *(int*)(addr + 0x04) = ppmax; }
- *(short*)(charAddr + 0x36) = *(int*)(addr + 0x04); //PP
- if (*(short*)(charAddr + 0x36) != oldpp) {
- int pp = *(short*)(charAddr + 0x36) * *(short*)(charAddr + 0x16);
- if (pp < 0) { pp += 0x3FFF; }
- pp >>= 0xE;
- if (pp < 0) { pp = 0; }
- if (pp > hpmax) { pp = ppmax; }
- if ((*(short*)(charAddr + 0x3A) != 0) && (pp == 0)) { pp = 1; }
- *(short*)(charAddr + 0x38) = pp;
- }
- pub_setFreeSpace(addr);
- }
- void boostEncountersCheck() { //080ADBEC
- pub_clearFlag(0x167);
- int partyAmt = getPartyAmt();
- char* pcIndAddr = (char*)0x02000458;
- while (partyAmt-- > 0) {
- int charAddr = pub_getCharAddr(*pcIndAddr++);
- int items = 0xE;
- charAddr += 0xD8; // Only need to check items.
- do {
- int item = *(short*)charAddr;
- if ((item & 0x0200) != 0) {
- int itemEffectAddr = getItemAddr(item) + 0x18;
- int itemEffects = 3;
- do {
- if (*(char*)itemEffectAddr == 0x1B) {
- pub_setFlag(0x167);
- }
- } while (--itemEffects >= 0);
- }
- } while (--items >= 0);
- }
- }
- //Ship Hover stuff...
- int getPartyPPPercent() { //080ADC90
- int partycurpp = 0, partymaxpp = 0;
- int partyAmt = getPartyAmt();
- char* pcIndAddr = (char*)0x02000458;
- int percentage = 0;
- int pcSlot = 0;
- while (partyAmt-- > 0) {
- int charAddr = pub_getCharAddr(*pcIndAddr++);
- partycurpp += *(short*)(charAddr + 0x3A);
- partymaxpp += *(short*)(charAddr + 0x36);
- }
- if (partymaxpp != 0)
- percentage = pub_division(partycurpp << 0x10, partymaxpp);
- return percentage; //0x10000 = 100%
- }
- int decPartyPP() { //080ADCEC
- int partyAmt = getPartyAmt();
- char* pcIndAddr = (char*)0x02000458;
- int percent = 0;
- int pc = -1;
- while (partyAmt-- > 0) {
- int charAddr = pub_getCharAddr(*pcIndAddr);
- int maxpp = *(short*)(charAddr + 0x36);
- int perc = 0;
- if (maxpp != 0)
- perc = pub_division(*(short*)(charAddr + 0x3A), maxpp);
- if (perc > percent) {
- percent = perc;
- pc = *pcIndAddr;
- }
- pcIndAddr++;
- }
- int amt = 0;
- if (pc != -1)
- amt = addPP(pc, -1);
- return amt;
- }
- int massDecPartyPP(int PP) { //080ADD5C
- while (PP-- > 0) {
- decPartyPP();
- }
- return getPartyPPPercent();
- }
- int calcBuildDate() { //080ADD74 = Not sure if used for anything useful?
- //Could this have been an unused RNG seed? Save version, or...?
- int fAddr = pub_getFile(2);
- int num = ((*(char*)fAddr++ - 0x30) * 10) + (*(char*)fAddr++ - 0x30); //Year
- num = (num << 4) + ((*(char*)fAddr++ - 0x30) * 10) + (*(char*)fAddr++ - 0x30); //Month
- num = (num << 6) + ((*(char*)fAddr++ - 0x30) * 10) + (*(char*)fAddr++ - 0x30); //Day
- num |= 0x1000;
- if (*(char*)0x03001238)
- num |= 0x8000;
- return (unsigned short)num;
- }
- int initPlayerData() { //080ADDF0
- //Clear Player Data, etc. - Switch to stmia later?
- volatile int a = 0;
- *(int*)0x040000D4 = &a;
- *(int*)0x040000D8 = (int)0x02000240;
- *(int*)0x040000DC = (int)0x850000B8;
- *(int*)0x040000D4 = &a;
- *(int*)0x040000D8 = (int)0x02001000;
- *(int*)0x040000DC = (int)0x850007C8;
- while (*(int*)0x040000DC & 0x80000000 != 0) {}
- *(int*)0x040000D4 = &a;
- *(int*)0x040000D8 = (int)0x02000040;
- *(int*)0x040000DC = (int)0x85000080;
- *(char*)0x02001004 = 0xFF;
- *(int*)0x040000D4 = &a;
- *(int*)0x040000D8 = (int)0x02000520;
- *(int*)0x040000DC = (int)0x85000298;
- initPartyData()
- //Actions/Keypad stuff
- *(short*)0x04000470 = 0x0001;
- *(short*)0x04000472 = 0x0002;
- *(short*)0x04000474 = 0x0004;
- *(short*)0x04000476 = 0x0008;
- *(short*)0x04000478 = 0x0200;
- *(short*)0x0400047A = 0x0100;
- *(short*)0x0400047C = 0x0002; //B button to run.
- *(short*)0x04000480 = 0x0000; //L & R Psynergy Shortcuts
- *(short*)0x04000482 = 0x0000;
- *(short*)0x04000454 = 0x0004; //Set Party Leader.
- joinParty(4);
- joinParty(5);
- learnPsynergy(4, 0x95); //Felix: Retreat
- learnPsynergy(4, 0x8C); //Felix: Move
- learnPsynergy(6, 0x8D); //Sheba: Mind Read
- learnPsynergy(7, 0x21); //Piers: Douse
- learnPsynergy(0, 0x95); //Isaac: Retreat
- learnPsynergy(0, 0x8C); //Isaac: Move
- learnPsynergy(1, 0x8C); //Garet: Move
- learnPsynergy(2, 0x8D); //Ivan: Mind Read
- learnPsynergy(2, 0x90); //Ivan: Reveal
- *(int*)0x02000250 = 200; //Coins
- *(int*)0x020004CC = 0; //Coins from GS1 party.
- *(short*)0x020004FC = 0; //Forge Item Reward
- *(char*)0x020004B4 = 0; //???
- *(char*)0x0200046C = 1; //Message speed
- *(char*)0x0200046A = 1; //Speech
- *(char*)0x0200046B = 1; //???
- *(char*)0x02000465 = 1; //Window color
- *(char*)0x02000466 = 1; //Window brightness
- *(int*)0x02000240 = 0; //Build date (Set on save. Possibly affects whether you load to sanctum?)
- *(int*)0x02000518 = calcBuildDate(); //Initial build date. (Unknown purpose.)
- *(int*)0x0300117C = 0; //Frame number
- *(char*)0x03001200 = 0; //Auto-sleep
- *(int*)0x02000244 = 0; //Frame number on save.
- *(char*)0x0200048A = *(char*)0x03001200;
- *(char*)0x03001218 = 0; //Auto-sleep counter
- *(short*)0x020036D0 = -1; //???
- *(char*)0x020004C6 = *(short*)0x02003860 //???
- //Lemuria Spring - Item chance rates
- *(char*)0x0200037D = *(char*)0x04;
- *(char*)0x0200037E = *(char*)0x04;
- *(char*)0x0200037F = *(char*)0x04;
- *(char*)0x02000380 = *(char*)0x08;
- *(char*)0x02000381 = *(char*)0x08;
- *(char*)0x02000382 = *(char*)0x08;
- *(char*)0x02000383 = *(char*)0x10;
- *(char*)0x02000384 = *(char*)0x10;
- *(char*)0x02000385 = *(char*)0x10;
- *(char*)0x02000386 = *(char*)0x20;
- *(char*)0x02000387 = *(char*)0x20;
- *(char*)0x02000388 = *(char*)0x20;
- *(char*)0x02000389 = *(char*)0x40;
- *(char*)0x0200038A = *(char*)0x40;
- *(char*)0x0200038B = *(char*)0x40;
- //??? - Random values of 0-4 set. (Unused?)
- int entry = 0;
- do {
- int addr = 0x020021B8 + (entry * 0xC);
- int cnt = 7;
- do {
- *(char*)addr++ = (pub_generateGRN() * 5) >> 0x10;
- } while (--cnt >= 0);
- } while (++entry <= 0x1F);
- //??? - 080AE092 - 4 entries of 5 bytes. I'm lazy, so transferring as 32-bits.
- //Todo: Fix it.
- *(int*)0x02002338 = *(int*)0x080B1F2C;
- *(int*)0x0200233C = *(int*)0x080B1F30;
- *(int*)0x02002340 = *(int*)0x080B1F34;
- *(int*)0x02002344 = *(int*)0x080B1F38;
- *(int*)0x02002348 = *(int*)0x080B1F3C;
- }
- void teamJenna() { //080AE0DC
- *(int*)0x02000454 = 5;
- }
- void teamFelix() { //080AE0F0
- *(int*)0x02000454 = 4;
- joinParty(4);
- leaveParty(5);
- leaveParty(6);
- }
- void joinPiersDjinn() { //080AE118
- //Game does this via a loop, but I find that unnecessary.
- //Djinni: Spring
- pub_setFlag(0x4D);
- joinDjinni(7, 1, 9);
- setDjinni(7, 1, 9);
- //Djinni: Shade
- pub_setFlag(0x4E);
- joinDjinni(7, 1, 10);
- setDjinni(7, 1, 10);
- sortDjinn(0);
- int amt = getPartyAmt();
- char* pcIndAddr = (char*)0x02000458;
- while (amt-- >= 0) {
- calcStats(*pcIndAddr++);
- }
- }
- void maxCureParty(int curePoisonHaunt) { //080AE16C
- int amt = getPartyAmt();
- char* pcIndAddr = (char*)0x02000458;
- while (amt-- > 0) {
- int charAddr = pub_getCharAddr(*a++);
- *(short*)(charAddr + 0x38) = *(short*)(charAddr + 0x34)
- *(short*)(charAddr + 0x3A) = *(short*)(charAddr + 0x36)
- //080AE198 = Game seems to calculate the percents. I'll take the shortcut and do 100%.
- //Probably should be 0% if max HP/PP was 0, but I'll skip that...
- *(short*)(charAddr + 0x14) = 0x4000;
- *(short*)(charAddr + 0x16) = 0x4000;
- if (curePoisonHaunt == 1) {
- *(char*)(charAddr + 0x131) = 0;
- *(char*)(charAddr + 0x140) = 0;
- }
- }
- }
- void sortDjinn(int unused) { //080AE358
- }
- int addPP(int pc, int value) {
- return 0;
- }
- int getItemAddr(int item) {
- return 0;
- }
- void learnPsynergy(int pc, int psynergy) { //080AF6F4
- }
- void initPartyData() { //080AF7AC //PC names, etc.
- }
- void joinParty(int pc) {
- }
- void leaveParty(int pc) {
- }
- int getPartyAmt() { //080AFDBC
- return 0;//*aa; //*(int*)0x02001234;
- }
- int getClassAddr(int classInd) {
- return 0;
- }
- int getDjinniAddr(int element, int djinni) {
- return 0;
- }
- void joinDjinni(int pc, int element, int djinni) {
- }
- void setDjinni(int pc, int element, int djinni) {
- }
- int getParty3() {
- return *(int*)0x02001234;
- }
- //Call out functions... (Should be okay to modify.)
- int pub_division(int numerator, int denominator) {
- r4=(int*)0x08002055; goto *r4;
- }
- int pub_getFile(int fileID) {
- r4=(int*)0x08013301; goto *r4;
- }
- int pub_getFreeSpaceW(int size) { //Check 02 RAM first, then 03 RAM, if failed, return 0.
- r4=(int*)0x08014DAD; goto *r4;
- }
- int pub_setFreeSpace(int address) {
- r4=(int*)0x08013165; goto *r4;
- }
- int pub_generateGRN() {
- r4=(int*)0x08014879; goto *r4;
- }
- int pub_getCharAddr(int charSlot) {
- r4=(int*)0x08016CA5; goto *r4;
- }
- int pub_getFlag(int flagInd) {
- r4=(int*)0x08016CE5; goto *r4;
- }
- int pub_setFlag(int flagInd) {
- r4=(int*)0x08016CFD; goto *r4;
- }
- int pub_clearFlag(int flagInd) {
- r4=(int*)0x08016D19; goto *r4;
- }
- int pub_bootMap(int type) { //type is only for debug mode.
- r4=(int*)0x080C8009; goto *r4;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement