about summary refs log tree commit diff stats
path: root/gba/source/savestructs.h
diff options
context:
space:
mode:
authorslipstream/RoL <l33twax@yahoo.com>2017-02-26 14:27:20 +0000
committerslipstream/RoL <l33twax@yahoo.com>2017-02-26 14:27:20 +0000
commite37cc7de9583b00166e96a6632ba25edefff43ca (patch)
tree592e49249f8e171a29cf3c140081ef054975eb59 /gba/source/savestructs.h
parentfac6ea00fd51e5be1d99db44746ed046378a6c65 (diff)
downloadgen3uploader-e37cc7de9583b00166e96a6632ba25edefff43ca.tar.gz
gen3uploader-e37cc7de9583b00166e96a6632ba25edefff43ca.tar.bz2
gen3uploader-e37cc7de9583b00166e96a6632ba25edefff43ca.zip
Major changes
- Added saveblock structures.
- Changed example payload, now it warps to Hall of Fame.
- Added helper library for Pokémon manipulation, checksum calculation,
etc.
- Removed libSave, it's not needed.
Diffstat (limited to 'gba/source/savestructs.h')
-rw-r--r--gba/source/savestructs.h793
1 files changed, 793 insertions, 0 deletions
diff --git a/gba/source/savestructs.h b/gba/source/savestructs.h new file mode 100644 index 0000000..2bf4d4d --- /dev/null +++ b/gba/source/savestructs.h
@@ -0,0 +1,793 @@
1/*
2 * Example Gen3-multiboot payload by slipstream/RoL 2017.
3 *
4 * This software may be modified and distributed under the terms
5 * of the MIT license. See the LICENSE file for details.
6 *
7 * saveblocks.h: describes structures used by saveblocks for all of Gen 3
8 */
9
10// Most of the structures come from pokeruby, FR/LG changes come from my own research / the firered IDB on pokecommunity
11
12#define POKEMON_NAME_LENGTH 10
13#define OT_NAME_LENGTH 7
14#define TILE_SIZE_4BPP 32
15
16struct Coords16
17{
18 s16 x;
19 s16 y;
20};
21
22struct UCoords16
23{
24 u16 x;
25 u16 y;
26};
27
28struct SecretBaseRecord
29{
30 u8 sbr_field_0; // ID?
31 u8 sbr_field_1_0:4;
32 u8 gender:1;
33 u8 sbr_field_1_5:1;
34 u8 sbr_field_2[7]; // 0xFF bytes?
35 u8 trainerId[4]; // byte 0 is used for determining trainer class
36 u16 sbr_field_e;
37 u8 sbr_field_10;
38 u8 sbr_field_11;
39 u8 decorations[16];
40 u8 sbr_field_22[16];
41 u32 partyPersonality[6];
42 u16 partyMoves[6 * 4];
43 u16 partySpecies[6];
44 u16 partyHeldItems[6];
45 u8 partyLevels[6];
46 u8 partyEVs[6];
47};
48
49typedef void (*TilesetCB)(void);
50
51struct Tileset
52{
53 u8 isCompressed;
54 u8 isSecondary;
55 void *tiles;
56 void *palettes;
57 void *metatiles;
58 void *metatileAttributes;
59 TilesetCB callback;
60};
61
62struct MapData
63{
64 s32 width;
65 s32 height;
66 u16 *border;
67 u16 *map;
68 struct Tileset *primaryTileset;
69 struct Tileset *secondaryTileset;
70};
71
72struct MapObjectTemplate
73{
74 /*0x00*/ u8 localId;
75 /*0x01*/ u8 graphicsId;
76 /*0x02*/ u8 unk2;
77 /*0x04*/ s16 x;
78 /*0x06*/ s16 y;
79 /*0x08*/ u8 elevation;
80 /*0x09*/ u8 movementType;
81 /*0x0A*/ u8 unkA_0:4;
82 u8 unkA_4:4;
83 ///*0x0B*/ u8 fillerB[1];
84 /*0x0C*/ u16 unkC;
85 /*0x0E*/ u16 unkE;
86 /*0x10*/ u8 *script;
87 /*0x14*/ u16 flagId;
88 /*0x16*/ u8 filler_16[2];
89}; /*size = 0x18*/
90
91struct WarpEvent
92{
93 s16 x, y;
94 s8 warpId;
95 u8 mapGroup;
96 u8 mapNum;
97 u8 unk7;
98};
99
100struct CoordEvent
101{
102 s16 x, y;
103 u8 unk4;
104 u8 filler_5;
105 u16 trigger;
106 u16 index;
107 u8 filler_A[0x2];
108 u8 *script;
109};
110
111struct BgEvent
112{
113 s16 x, y;
114 u8 unk4;
115 u8 kind;
116 s16 filler_6;
117 u8 *script;
118};
119
120struct MapEvents
121{
122 u8 mapObjectCount;
123 u8 warpCount;
124 u8 coordEventCount;
125 u8 bgEventCount;
126
127 struct MapObjectTemplate *mapObjects;
128 struct WarpEvent *warps;
129 struct CoordEvent *coordEvents;
130 struct BgEvent *bgEvents;
131};
132
133struct MapConnection
134{
135 u8 direction;
136 u32 offset;
137 u8 mapGroup;
138 u8 mapNum;
139};
140
141struct MapConnections
142{
143 s32 count;
144 struct MapConnection *connections;
145};
146
147struct MapHeader
148{
149 struct MapData *mapData;
150 struct MapEvents *events;
151 u8 *mapScripts;
152 struct MapConnections *connections;
153 u16 music;
154 u16 mapDataId;
155 u8 name;
156 u8 cave;
157 u8 weather;
158 /* 0x17 */ u8 mapType;
159 u8 filler_18;
160 u8 escapeRope;
161 u8 flags;
162 u8 battleType;
163};
164
165struct MapObject
166{
167 /*0x00*/ u32 active:1;
168 u32 mapobj_bit_1:1;
169 u32 mapobj_bit_2:1;
170 u32 mapobj_bit_3:1;
171 u32 mapobj_bit_4:1;
172 u32 mapobj_bit_5:1;
173 u32 mapobj_bit_6:1;
174 u32 mapobj_bit_7:1;
175 /*0x01*/ u32 mapobj_bit_8:1;
176 u32 mapobj_bit_9:1;
177 u32 mapobj_bit_10:1;
178 u32 mapobj_bit_11:1;
179 u32 mapobj_bit_12:1;
180 u32 mapobj_bit_13:1;
181 u32 mapobj_bit_14:1;
182 u32 mapobj_bit_15:1;
183 /*0x02*/ u32 mapobj_bit_16:1;
184 u32 mapobj_bit_17:1;
185 u32 mapobj_bit_18:1;
186 u32 mapobj_bit_19:1;
187 u32 mapobj_bit_20:1;
188 u32 mapobj_bit_21:1;
189 u32 mapobj_bit_22:1;
190 u32 mapobj_bit_23:1;
191 /*0x03*/ u32 mapobj_bit_24:1;
192 u32 mapobj_bit_25:1;
193 u32 mapobj_bit_26:1;
194 u32 mapobj_bit_27:1;
195 u32 mapobj_bit_28:1;
196 u32 mapobj_bit_29:1;
197 u32 mapobj_bit_30:1;
198 u32 mapobj_bit_31:1;
199 /*0x04*/ u8 spriteId;
200 /*0x05*/ u8 graphicsId;
201 /*0x06*/ u8 animPattern;
202 /*0x07*/ u8 trainerType;
203 /*0x08*/ u8 localId;
204 /*0x09*/ u8 mapNum;
205 /*0x0A*/ u8 mapGroup;
206 /*0x0B*/ u8 mapobj_unk_0B_0:4;
207 u8 elevation:4;
208 /*0x0C*/ struct Coords16 coords1;
209 /*0x10*/ struct Coords16 coords2;
210 /*0x14*/ struct Coords16 coords3;
211 /*0x18*/ u8 mapobj_unk_18:4; //current direction?
212 /*0x18*/ u8 placeholder18:4;
213 /*0x19*/ u8 mapobj_unk_19;
214 /*0x1A*/ u8 mapobj_unk_1A;
215 /*0x1B*/ u8 mapobj_unk_1B;
216 /*0x1C*/ u8 mapobj_unk_1C;
217 /*0x1D*/ u8 trainerRange_berryTreeId;
218 /*0x1E*/ u8 mapobj_unk_1E;
219 /*0x1F*/ u8 mapobj_unk_1F;
220 /*0x20*/ u8 mapobj_unk_20;
221 /*0x21*/ u8 mapobj_unk_21;
222 /*0x22*/ u8 animId;
223 /*size = 0x24*/
224};
225
226struct Berry
227{
228 const u8 name[7];
229 u8 firmness;
230 u16 size;
231 u8 maxYield;
232 u8 minYield;
233 const u8 *description1;
234 const u8 *description2;
235 u8 stageDuration;
236 u8 spicy;
237 u8 dry;
238 u8 sweet;
239 u8 bitter;
240 u8 sour;
241 u8 smoothness;
242};
243
244struct EnigmaBerry
245{
246 struct Berry berry;
247 u8 pic[(6 * 6) * TILE_SIZE_4BPP];
248 u16 palette[16];
249 u8 description1[45];
250 u8 description2[45];
251 u8 itemEffect[18];
252 u8 holdEffect;
253 u8 holdEffectParam;
254 u32 checksum;
255};
256
257struct BattleEnigmaBerry
258{
259 u8 name[7];
260 u8 holdEffect;
261 u8 itemEffect[18];
262 u8 holdEffectParam;
263};
264
265struct EnigmaBerryFRLGE {
266 struct Berry berry; // 0x00
267 u8 itemEffect[18]; // 0x1C
268 u8 holdEffect; // 0x2E
269 u8 holdEffectParam; // 0x2F
270 u32 checksum; // 0x30
271};
272
273struct __attribute__((aligned(4))) BerryTree
274{
275 u8 berry;
276 u8 stage:7;
277 u8 growthSparkle:1;
278 u16 secondsUntilNextStage;
279 u8 berryYield;
280 u8 regrowthCount:4;
281 u8 watered1:1;
282 u8 watered2:1;
283 u8 watered3:1;
284 u8 watered4:1;
285};
286
287struct PokemonSubstruct0
288{
289 u16 species;
290 u16 heldItem;
291 u32 experience;
292 u8 ppBonuses;
293 u8 friendship;
294};
295
296struct PokemonSubstruct1
297{
298 u16 moves[4];
299 u8 pp[4];
300};
301
302struct PokemonSubstruct2
303{
304 u8 hpEV;
305 u8 attackEV;
306 u8 defenseEV;
307 u8 speedEV;
308 u8 spAttackEV;
309 u8 spDefenseEV;
310 u8 cool;
311 u8 beauty;
312 u8 cute;
313 u8 smart;
314 u8 tough;
315 u8 sheen;
316};
317
318struct PokemonSubstruct3
319{
320 /* 0x00 */ u8 pokerus;
321 /* 0x01 */ u8 metLocation;
322
323 /* 0x02 */ u16 metLevel:7;
324 /* 0x02 */ u16 metGame:4;
325 /* 0x03 */ u16 pokeball:4;
326 /* 0x03 */ u16 otGender:1;
327
328 /* 0x04 */ u32 hpIV:5;
329 /* 0x04 */ u32 attackIV:5;
330 /* 0x05 */ u32 defenseIV:5;
331 /* 0x05 */ u32 speedIV:5;
332 /* 0x05 */ u32 spAttackIV:5;
333 /* 0x06 */ u32 spDefenseIV:5;
334 /* 0x07 */ u32 isEgg:1;
335 /* 0x07 */ u32 altAbility:1;
336
337 /* 0x08 */ u32 coolRibbon:3;
338 /* 0x08 */ u32 beautyRibbon:3;
339 /* 0x08 */ u32 cuteRibbon:3;
340 /* 0x09 */ u32 smartRibbon:3;
341 /* 0x09 */ u32 toughRibbon:3;
342 /* 0x09 */ u32 championRibbon:1;
343 /* 0x0A */ u32 winningRibbon:1;
344 /* 0x0A */ u32 victoryRibbon:1;
345 /* 0x0A */ u32 artistRibbon:1;
346 /* 0x0A */ u32 effortRibbon:1;
347 /* 0x0A */ u32 giftRibbon1:1;
348 /* 0x0A */ u32 giftRibbon2:1;
349 /* 0x0A */ u32 giftRibbon3:1;
350 /* 0x0A */ u32 giftRibbon4:1;
351 /* 0x0B */ u32 giftRibbon5:1;
352 /* 0x0B */ u32 giftRibbon6:1;
353 /* 0x0B */ u32 giftRibbon7:1;
354 /* 0x0B */ u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald
355};
356
357union PokemonSubstruct
358{
359 struct PokemonSubstruct0 type0;
360 struct PokemonSubstruct1 type1;
361 struct PokemonSubstruct2 type2;
362 struct PokemonSubstruct3 type3;
363 u16 raw[6];
364};
365
366struct BoxPokemon
367{
368 u32 personality;
369 u32 otId;
370 u8 nickname[POKEMON_NAME_LENGTH];
371 u8 language;
372 u8 isBadEgg:1;
373 u8 hasSpecies:1;
374 u8 isEgg:1;
375 u8 unused:5;
376 u8 otName[OT_NAME_LENGTH];
377 u8 markings;
378 u16 checksum;
379 u16 unknown;
380
381 union
382 {
383 u32 raw[12];
384 union PokemonSubstruct substructs[4];
385 } secure;
386};
387
388struct Pokemon
389{
390 struct BoxPokemon box;
391 u32 status;
392 u8 level;
393 u8 pokerus;
394 u16 hp;
395 u16 maxHP;
396 u16 attack;
397 u16 defense;
398 u16 speed;
399 u16 spAttack;
400 u16 spDefense;
401};
402
403struct UnknownPokemonStruct
404{
405 u16 species;
406 u16 heldItem;
407 u16 moves[4];
408 u8 level;
409 u8 ppBonuses;
410 u8 hpEV;
411 u8 attackEV;
412 u8 defenseEV;
413 u8 speedEV;
414 u8 spAttackEV;
415 u8 spDefenseEV;
416 u32 otId;
417 u32 hpIV:5;
418 u32 attackIV:5;
419 u32 defenseIV:5;
420 u32 speedIV:5;
421 u32 spAttackIV:5;
422 u32 spDefenseIV:5;
423 u32 gap:1;
424 u32 altAbility:1;
425 u32 personality;
426 u8 nickname[POKEMON_NAME_LENGTH + 1];
427 u8 friendship;
428};
429
430struct BattlePokemon
431{
432 /* 0x00 */ u16 species;
433 /* 0x02 */ u16 attack;
434 /* 0x04 */ u16 defense;
435 /* 0x06 */ u16 speed;
436 /* 0x08 */ u16 spAttack;
437 /* 0x0A */ u16 spDefense;
438 /* 0x0C */ u16 moves[4];
439 /* 0x14 */ u32 hpIV:5;
440 /* 0x14 */ u32 attackIV:5;
441 /* 0x15 */ u32 defenseIV:5;
442 /* 0x15 */ u32 speedIV:5;
443 /* 0x16 */ u32 spAttackIV:5;
444 /* 0x17 */ u32 spDefenseIV:5;
445 /* 0x17 */ u32 isEgg:1;
446 /* 0x17 */ u32 altAbility:1;
447 /* 0x18 */ s8 statStages[8];
448 /* 0x20 */ u8 ability;
449 /* 0x21 */ u8 type1;
450 /* 0x22 */ u8 type2;
451 /* 0x23 */ u8 unknown;
452 /* 0x24 */ u8 pp[4];
453 /* 0x28 */ u16 hp;
454 /* 0x2A */ u8 level;
455 /* 0x2B */ u8 friendship;
456 /* 0x2C */ u16 maxHP;
457 /* 0x2E */ u16 item;
458 /* 0x30 */ u8 nickname[POKEMON_NAME_LENGTH + 1];
459 /* 0x3B */ u8 ppBonuses;
460 /* 0x3C */ u8 otName[8];
461 /* 0x44 */ u32 experience;
462 /* 0x48 */ u32 personality;
463 /* 0x4C */ u32 status1;
464 /* 0x50 */ u32 status2;
465 /* 0x54 */ u32 otId;
466};
467
468struct BaseStats
469{
470 /* 0x00 */ u8 baseHP;
471 /* 0x01 */ u8 baseAttack;
472 /* 0x02 */ u8 baseDefense;
473 /* 0x03 */ u8 baseSpeed;
474 /* 0x04 */ u8 baseSpAttack;
475 /* 0x05 */ u8 baseSpDefense;
476 /* 0x06 */ u8 type1;
477 /* 0x07 */ u8 type2;
478 /* 0x08 */ u8 catchRate;
479 /* 0x09 */ u8 expYield;
480 /* 0x0A */ u16 evYield_HP:2;
481 /* 0x0A */ u16 evYield_Attack:2;
482 /* 0x0A */ u16 evYield_Defense:2;
483 /* 0x0A */ u16 evYield_Speed:2;
484 /* 0x0B */ u16 evYield_SpAttack:2;
485 /* 0x0B */ u16 evYield_SpDefense:2;
486 /* 0x0C */ u16 item1;
487 /* 0x0E */ u16 item2;
488 /* 0x10 */ u8 genderRatio;
489 /* 0x11 */ u8 eggCycles;
490 /* 0x12 */ u8 friendship;
491 /* 0x13 */ u8 growthRate;
492 /* 0x14 */ u8 eggGroup1;
493 /* 0x15 */ u8 eggGroup2;
494 /* 0x16 */ u8 ability1;
495 /* 0x17 */ u8 ability2;
496 /* 0x18 */ u8 safariZoneFleeRate;
497 /* 0x19 */ u8 bodyColor;
498};
499
500struct BattleMove
501{
502 u8 effect;
503 u8 power;
504 u8 type;
505 u8 accuracy;
506 u8 pp;
507 u8 secondaryEffectChance;
508 u8 target;
509 u8 priority;
510 u32 flags;
511};
512
513struct PokemonStorage
514{
515 /* 0x00 */ u8 currentBox;
516 /* 0x01 */ struct BoxPokemon boxes[14][30];
517 u8 boxNames[14][9];
518 u8 boxBackground[14];
519};
520
521struct WarpData
522{
523 s8 mapGroup;
524 s8 mapNum;
525 s8 warpId;
526 s16 x, y;
527};
528
529struct ItemSlot
530{
531 u16 itemId;
532 u16 quantity;
533};
534
535struct __attribute__((aligned(2))) Pokeblock
536{
537 u8 color;
538 u8 spicy;
539 u8 dry;
540 u8 sweet;
541 u8 bitter;
542 u8 sour;
543 u8 feel;
544};
545
546struct Roamer
547{
548 /*0x00*/ u32 ivs;
549 /*0x04*/ u32 personality;
550 /*0x08*/ u16 species;
551 /*0x0A*/ u16 hp;
552 /*0x0C*/ u8 level;
553 /*0x0D*/ u8 status;
554 /*0x0E*/ u8 cool;
555 /*0x0F*/ u8 beauty;
556 /*0x10*/ u8 cute;
557 /*0x11*/ u8 smart;
558 /*0x12*/ u8 tough;
559 /*0x13*/ u8 active;
560};
561
562struct RamScriptData
563{
564 u8 magic;
565 u8 mapGroup;
566 u8 mapNum;
567 u8 objectId;
568 u8 script[995];
569} __attribute__((aligned(1),packed));
570
571struct RamScript
572{
573 u32 checksum;
574 struct RamScriptData data;
575} __attribute__((aligned(1),packed));
576
577struct SB1_2EFC_Struct
578{
579 u8 unknown[0x20];
580};
581
582struct EasyChatPair
583{
584 u16 unk0_0:7;
585 u16 unk0_7:7;
586 u16 unk1_6:1;
587 u16 unk2;
588 u16 words[2];
589}; /*size = 0x8*/
590
591struct TVShowCommon {
592 /*0x00*/ u8 var00;
593 /*0x01*/ u8 var01;
594};
595
596struct TVShowFanClubLetter {
597 /*0x00*/ u8 var00;
598 /*0x01*/ u8 var01;
599 /*0x02*/ u16 species;
600 u8 pad04[12];
601 /*0x10*/ u8 playerName[8];
602 /*0x18*/ u8 var18;
603};
604
605struct TVShowRecentHappenings {
606 /*0x00*/ u8 var00;
607 /*0x01*/ u8 var01;
608 /*0x02*/ u16 var02;
609 u8 pad04[12];
610 /*0x10*/ u8 var10[8];
611 /*0x18*/ u8 var18;
612 u8 pad19[10];
613};
614
615struct TVShowFanclubOpinions {
616 /*0x00*/ u8 var00;
617 /*0x01*/ u8 var01;
618 /*0x02*/ u16 var02;
619 /*0x04*/ u8 var04A:4;
620 u8 var04B:4;
621 /*0x04*/ u8 var05[8];
622 /*0x0D*/ u8 var0D;
623 /*0x0E*/ u8 var0E;
624 /*0x0F*/ u8 var0F;
625 /*0x10*/ u8 var10[8];
626};
627
628struct TVShowNameRaterShow {
629 /*0x00*/ u8 var00;
630 /*0x01*/ u8 var01;
631 /*0x02*/ u16 species;
632 /*0x04*/ u8 pokemonName[11];
633 /*0x0F*/ u8 trainerName[11];
634 /*0x1A*/ u8 random;
635 /*0x1B*/ u8 random2;
636 /*0x1C*/ u16 var1C;
637 /*0x1E*/ u8 language;
638 /*0x1F*/ u8 var1F;
639};
640
641struct TVShowMassOutbreak {
642 /*0x00*/ u8 var00;
643 /*0x01*/ u8 var01;
644 /*0x02*/ u8 var02;
645 /*0x03*/ u8 var03;
646 /*0x04*/ u16 moves[4];
647 /*0x0C*/ u16 species;
648 /*0x0E*/ u16 var0E;
649 /*0x10*/ u8 locationMapNum;
650 /*0x11*/ u8 locationMapGroup;
651 /*0x12*/ u8 var12;
652 /*0x13*/ u8 probability;
653 /*0x14*/ u8 level;
654 /*0x15*/ u8 var15;
655 /*0x16*/ u16 var16;
656 /*0x18*/ u8 var18;
657 u8 pad19[11];
658};
659
660typedef union TVShow {
661 struct TVShowCommon common;
662 struct TVShowFanClubLetter fanclubLetter;
663 struct TVShowRecentHappenings recentHappenings;
664 struct TVShowFanclubOpinions fanclubOpinions;
665 struct TVShowNameRaterShow nameRaterShow;
666 struct TVShowMassOutbreak massOutbreak;
667} TVShow;
668
669struct __attribute__((aligned(4))) MailStruct
670{
671 /*0x00*/ u16 words[9];
672 /*0x12*/ u8 playerName[8];
673 /*0x1A*/ u8 trainerId[4];
674 /*0x1E*/ u16 species;
675 /*0x20*/ u16 itemId;
676};
677
678struct UnkMauvilleOldManStruct
679{
680 u8 unk_2D94;
681 u8 unk_2D95;
682 /*0x2D96*/ u16 mauvilleOldMan_ecArray[6];
683 /*0x2DA2*/ u16 mauvilleOldMan_ecArray2[6];
684 /*0x2DAE*/ u8 playerName[8];
685 /*0x2DB6*/ u8 filler_2DB6[0x3];
686 /*0x2DB9*/ u8 playerTrainerId[4];
687 u8 unk_2DBD;
688 /* size = 0x2C */
689};
690
691struct UnkMauvilleOldManStruct2
692{
693 u8 filler0;
694 u8 unk1;
695 u8 unk2;
696 u16 mauvilleOldMan_ecArray[10];
697 u16 mauvilleOldMan_ecArray2[6];
698 u8 fillerF[0x2];
699 /* size = 0x2C */
700};
701
702typedef union OldMan {
703 struct UnkMauvilleOldManStruct oldMan1;
704 struct UnkMauvilleOldManStruct2 oldMan2;
705} OldMan;
706
707struct QuestStoryNPC {
708 u16 bitfield;
709 u8 direction;
710 u8 height;
711 u8 type_id;
712 u8 running_behaviour_or_picture_id;
713 u8 is_trainer;
714 u8 local_id;
715 u8 local_mapnumber;
716 u8 local_mapbank;
717 u16 x;
718 u16 y;
719 u8 sight_distance;
720 u8 role_from;
721 u8 unknown_decrement_on_step;
722 u8 unk_11;
723 u16 padding_12;
724};
725
726struct QuestStory {
727 u8 active;
728 u8 bank;
729 u8 map;
730 u8 warpId;
731 u16 x;
732 u16 y;
733 struct QuestStoryNPC npc[0x10];
734 u8 unk_148[0x51f];
735};
736
737struct NPCState {
738 u8 bitfield;
739 u8 obj_anim_and_vis_control;
740 u8 unk_2;
741 u8 unk_3;
742 u8 oamid;
743 u8 type_id;
744 u8 running_behaviour_or_picture_id;
745 u8 is_trainer;
746 u8 local_id;
747 u8 local_mapnumber;
748 u8 local_mapbank;
749 u8 height;
750 struct Coords16 stay_around;
751 struct Coords16 to;
752 struct Coords16 from;
753 u8 direction;
754 u8 movement_area;
755 u8 objid_surfing;
756 u8 objid_1B;
757 u8 idx_movement_behaviour;
758 u8 sight_distance;
759 u8 role_to;
760 u8 role_from;
761 u8 unk_20;
762 u8 unknown_decrement_on_step;
763 u8 unk_22;
764 u8 unk_23;
765};
766
767struct DaycarePokemon {
768 struct BoxPokemon pokemon;
769 u8 unk_50[56];
770 u32 steps;
771};
772
773
774struct Time
775{
776 /*0x00*/ s16 days;
777 /*0x02*/ s8 hours;
778 /*0x03*/ s8 minutes;
779 /*0x04*/ s8 seconds;
780};
781
782struct Pokedex
783{
784 /*0x00*/ u8 order;
785 /*0x01*/ u8 unknown1;
786 /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode
787 /*0x03*/ u8 unknown2;
788 /*0x04*/ u32 unownPersonality; // set when you first see Unown
789 /*0x08*/ u32 spindaPersonality; // set when you first see Spinda
790 /*0x0C*/ u32 unknown3;
791 /*0x10*/ u8 owned[52];
792 /*0x44*/ u8 seen[52];
793}; \ No newline at end of file