diff options
Diffstat (limited to 'reverse-engineering/dosbox_snif/dos_lemm.h')
-rw-r--r-- | reverse-engineering/dosbox_snif/dos_lemm.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/reverse-engineering/dosbox_snif/dos_lemm.h b/reverse-engineering/dosbox_snif/dos_lemm.h new file mode 100644 index 0000000..f6c7c95 --- /dev/null +++ b/reverse-engineering/dosbox_snif/dos_lemm.h @@ -0,0 +1,132 @@ +#ifndef _DOS_LEMM_H +#define _DOS_LEMM_H + + +struct _state { + uint8_t s_splatting:1; //0x01 + uint8_t s_exploding:1; //0x02 combinable + uint8_t s_falling:1; //0x04 + uint8_t s_ascending:1; //0x08 + uint8_t s_digging:1; //0x10 + uint8_t s_climbing:1; //0x20 + uint8_t s_climb_ending:1; //0x40 + uint8_t s_building:1; //0x80 + + uint8_t s_blocking:1; //0x01 + uint8_t s_bashing:1; //0x02 + uint8_t s_floating:1; //0x04 + uint8_t s_mining:1; //0x08 + uint8_t s_drawning:1; //0x10 + uint8_t s_ending:1; //0x20 + uint8_t s_dying:1; //0x40 + uint8_t s_exploding2:1; //0x80 +} __attribute__ ((__packed__)); + +union state { + uint16_t raw; + struct _state bits; +}; + +enum state_masks { + s_splatting = 0x01, + s_exploding = 0x02, + s_falling = 0x04, + s_ascending = 0x08, + s_digging = 0x10, + s_climbing = 0x20, + s_climb_ending = 0x40, + s_building = 0x80, + + s_blocking = 0x0100, + s_bashing = 0x0200, + s_floating = 0x0400, + s_mining = 0x0800, + s_drawning = 0x1000, + s_ending = 0x2000, + s_dying = 0x4000, + s_exploding2 = 0x8000 +}; + +struct _flags1 { + uint8_t fl1_cap_climber:1; // 0x01 + uint8_t fl1_unused:6; + uint8_t fl1_walk_pause_for_shruggling:1; // 0x80 +} __attribute__ ((__packed__)); + +union flags1 { + uint8_t raw; + struct _flags1 bits; +}; + +enum flags1_masks { + fl1_cap_climber = 0x01; + fl1_walk_pause_for_shruggling = 0x80; +} + +struct _lemm_data { + /* First lemm is at ds:si == 0b55:0085 */ + uint16_t x_effective; //0x0 - 0x1 + uint16_t y_effective; //0x2 - 0x3 + int16_t x_spr_offset; //0x4 - 0x5 + int16_t y_spr_offset; //0x6 - 0x7 + union state state; //0x8 - 0x9 + uint8_t b_10,b_11; + uint16_t spr_data_ptr; //0xc - 0xd + uint8_t floattime_dble; //0xe + uint8_t b_15,b_16,b_17,b_18,b_19; + uint16_t ptr2; //0x14 - 0x15 + uint8_t b_22,b_23,b_24,b_25,b_26,b_27,b_28,b_29,b_30,b_31; + uint8_t expl_countdown; //0x20 + uint8_t steps_remain; //0x21 + uint8_t b_34; + uint8_t falldist; //0x23 + union flags1 flags1; //0x24 + uint8_t cap_floater; //0x25 + uint8_t is_gone; //0x26 + int8_t direction; //0x27 + uint8_t spr_frame; //0x28 + uint8_t draw_hint; //0x29 + uint8_t b_42,b_43,b_44; +} __attribute__ ((__packed__)); + +union lemm_data { + unsigned char raw[0x2d]; + struct _lemm_data s; +}; + +enum draw_hint { + hint_nothing=0x00, hint_falling=0x04, hint_special1=0x08, /* climbing or slow falling or shruggling */ + hint_walking=0x09, hint_building=0x10, hint_mining=0x18, hint_bashing=0x20 +}; + +struct _avail_skills { + uint8 sk_climber, sk_climber2, sk_climber_tag; // [0x67] + uint8 sk_floater, sk_floater2, sk_floater_tag; // [0x6a] + uint8 sk_bomber, sk_bomber2, sk_bomber_tag; // [0x6d] + uint8 sk_blocker, sk_blocker2, sk_blocker_tag; // [0x70] + uint8 sk_builder, sk_builder2, sk_builder_tag; // [0x73] + uint8 sk_basher, sk_basher2, sk_basher_tag; // [0x76] + uint8 sk_miner, sk_miner2, sk_miner_tag; // [0x79] + uint8 sk_digger, sk_digger2, sk_digger_tag; // [0x7c] +} __attribute__ ((__packed__)); + +struct game_data { + /* ds == 0x0b55 */ + uint8 unk1[0x27]; // TODO + uint8 paused; // [0x28] + uint8 unk2[0x10]; // TODO + uint8 lemm_count_to_process; // [0x39] + uint8 lemm_spawned_count; // [0x40] + uint8 unk3; // TODO + uint8 lemm_out_count; // [0x42] + uint8 unk4; // TODO + uint8 lemm_level_count; // [0x44] + uint8 next_spawn_ticks; // [0x45] + uint8 spawn_rate_ticks; // [0x46] + uint8 unk5[0x20]; // TODO + struct _avail_skills avail_skills; // [0x67] - [0x7e] + uint8 unk6[0x06]; // TODO + struct _lemm_data lemmings[100]; // [0x85] +} __attribute__ ((__packed__)); + +#endif /*_DOS_LEMM_H*/ |