Advertisement
Guest User

Inindo S-RAM structure

a guest
Jan 13th, 2020
353
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef inc_save
  2. #define inc_save
  3.  
  4. #include "types.h"
  5. #include "enumerations.h"
  6.  
  7. #pragma pack(push)
  8. #pragma pack(1)
  9. namespace inindo
  10. {
  11.     enum lineup_t : u08
  12.     {
  13.         front_right,
  14.         front_center,
  15.         front_left,
  16.         rear_right,
  17.         rear_center,
  18.         rear_left,
  19.     };
  20.  
  21.     enum location_type_t : u08
  22.     {
  23.         castle,
  24.         inn,
  25.         tea,
  26.         unk,
  27.     };
  28.  
  29.     enum game_mode_t : u08
  30.     {
  31.         normal,
  32.         sorcerer,
  33.     };
  34.  
  35.     struct save_data_t
  36.     {
  37.         // 000
  38.         u08 head[2];
  39.         struct date_t
  40.         {
  41.             // 002
  42.             u08 year;
  43.             // 003
  44.             u08 month;
  45.             // 004
  46.             u08 day;
  47.             // 005
  48.             u08 time;
  49.         } date;
  50.         // 006
  51.         u08 unk0;
  52.         // 007
  53.         // energy left before rest needed
  54.         // max 180 = 60 time units * 3 days
  55.         u08 strength;
  56.         // 008
  57.         u08 unk1a;
  58.         // 009
  59.         // high nibble = step (8)
  60.         // low nibble = facing direction (NWES = 0123)
  61.         u08 unk1b;
  62.         // 00a
  63.         u08 unk1c;
  64.         // 00b
  65.         u16 unk2[2];
  66.         // 00f
  67.         struct party_t
  68.         {
  69.             // 00f
  70.             struct location_t
  71.             {
  72.                 // world (nihon) map position
  73.                 // 00f
  74.                 u16 w[4];
  75.                 // sub-map position (town, dungeon, ...)
  76.                 // 017
  77.                 u16 x;
  78.                 // 019
  79.                 u16 y;
  80.             } location;
  81.             // 01b
  82.             u16 gold;
  83.             // 01d
  84.             u08 size;
  85.             // 01e
  86.             u08 member_id[3];
  87.             // combat formation
  88.             // 021
  89.             lineup_t lineup[3];
  90.             // 024
  91.             struct status_flags_t
  92.             {
  93.                 // poison shows over injury
  94.                 u08 poison : 1;
  95.                 u08 injury : 1;
  96.                 // aphrodisia (eel extract) shows over poison or injury
  97.                 // makes you walk in random directions (?)
  98.                 // shows as "blind" in the US version
  99.                 // has own icon in the Japanese version
  100.                 u08 aphrodisia : 1;
  101.                 // other bits show up as injury (?)
  102.                 u08 unk45678 : 5;
  103.             } status[3];
  104.             // 027
  105.             item_id_t inventory[3][15];
  106.         } party;
  107.         //
  108.         struct pawn_t
  109.         {
  110.             u08 thousand_gold;
  111.             item_id_t slot[31];
  112.         } pawn;
  113.         //
  114.         struct bingo_t
  115.         {
  116.             u16 lowclass_chips;
  117.             u16 highclass_chips;
  118.         } bingo;
  119.         // 078
  120.         u08 player_level;
  121.         // 079
  122.         u16 unk3[24];
  123.         // 0a9
  124.         char name[11];
  125.         // 0b4
  126.         struct character_status_t
  127.         {
  128.             // static (ROM) character description index
  129.             u08 character_index;
  130.             // linked list starting from location flags
  131.             // status index, not description index
  132.             u08 with_index;
  133.             u16 max_health;
  134.             u16 health;
  135.             u16 max_energy;
  136.             u16 energy;
  137.             u16 exp_needed;
  138.             u08 level;
  139.             struct flags_bitset_t
  140.             {
  141.                 location_type_t location_type : 2;
  142.                 u08 unk345678 : 6;
  143.             } flags;
  144.             u08 trust;
  145.             u08 intelligence;
  146.             u08 speed;
  147.             // 0c0
  148.             u08 luck;
  149.             u16 magic;
  150.             u08 defense;
  151.             u08 resist;
  152.             u08 power;
  153.             item_id_t equipped[5];
  154.             u08 ai_data[3];
  155.             struct ai_status_t
  156.             {
  157.                 character_ai_command_t command : 3;
  158.                 u08 unk : 5;
  159.             } ai_status;
  160.         } status[63];
  161.         // 894
  162.         u16 unk4a[52];
  163.         // 8fc
  164.         u16 unk4b[16];
  165.         // 91c
  166.         struct province_t
  167.         {
  168.             u08 ruler;
  169.             u08 daimyo;
  170.             u16 gold;
  171.             u16 rice;
  172.             u16 soldiers;
  173.             u08 arms;
  174.             u08 training;
  175.             u08 person[3];
  176.             u08 trust[3];
  177.             struct ai_status_t
  178.             {
  179.                 province_id_t target_province : 5;
  180.                 province_ai_algorithm_t algorithm : 3;
  181.                 u08 people : 2;
  182.                 province_ai_command_t command : 2;
  183.                 u08 unk : 4;
  184.             } ai_status;
  185.         } province[30];
  186.         // b38
  187.         struct location_flags_t
  188.         {
  189.             // linked list end via status indices
  190.             u08 visitor : 8;
  191.             u08 unk1 : 8;
  192.             u08 unk2 : 7;
  193.             // the player has visited this location
  194.             u08 visited : 1;
  195.         } location[48];
  196.         // bc8
  197.         // most even bytes = 0, few change to 2
  198.         u08 unk5[828];
  199.         // f04
  200.         // game flags
  201.         // 0 - 17: 0 (null), 1 (active) or 2 (complete)
  202.         // 18 is game mode: 0 (normal), 1 (magical)
  203.         // 19 is unknown
  204.         u08 flag[20];
  205.     };
  206.  
  207.     // container that implements checksum functions
  208.     struct save_container_t
  209.     {
  210.         u16 compute_checksum(const void *pdata, int length)
  211.         {
  212.             u08 *p = (u08 *)pdata;
  213.             u16 checksum = 0;
  214.             for (int i = 0; i < length; i++) {
  215.                 checksum += p[i];
  216.             }
  217.             return checksum;
  218.         }
  219.        
  220.         bool fix_checksum()
  221.         {
  222.             const int game_data_size = sizeof(save_data_t);
  223.             ASSERT(game_data_size == 3864);
  224.             u16 new_checksum = compute_checksum(&save_data, game_data_size);
  225.             if (new_checksum == checksum) {
  226.                 return false;
  227.             } else {
  228.                 checksum = new_checksum;
  229.                 return true;
  230.             }
  231.         }
  232.  
  233.         bool is_dirty()
  234.         {
  235.             const int game_data_size = sizeof(save_data_t);
  236.             ASSERT(game_data_size == 3864);
  237.             u16 new_checksum = compute_checksum(&save_data, game_data_size);
  238.             return (new_checksum != checksum);
  239.         }
  240.  
  241.         void write(const char *filename);
  242.  
  243.         // 000
  244.         save_data_t save_data;
  245.         // f18
  246.         u16 checksum;
  247.         // f1a
  248.         char koei[4];
  249.         // f1e
  250.         u08 padding[226];
  251.     };
  252. };
  253. #pragma pack(pop)
  254.  
  255. #endif
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement