#ifndef _DOS_LEMM_H #define _DOS_LEMM_H #include 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 unk1[0x2]; uint16_t spr_data_ptr; //0xc - 0xd uint8_t floattime_dble; //0xe uint8_t unk2[0x5]; uint16_t ptr2; //0x14 - 0x15 uint8_t unk3[0xa]; uint8_t expl_countdown; //0x20 uint8_t steps_remain; //0x21 uint8_t unk4; 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 unk5[0x3]; } __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_t sk_climber, sk_climber2, sk_climber_tag; // [0x67] uint8_t sk_floater, sk_floater2, sk_floater_tag; // [0x6a] uint8_t sk_bomber, sk_bomber2, sk_bomber_tag ; // [0x6d] uint8_t sk_blocker, sk_blocker2, sk_blocker_tag; // [0x70] uint8_t sk_builder, sk_builder2, sk_builder_tag; // [0x73] uint8_t sk_basher, sk_basher2, sk_basher_tag; // [0x76] uint8_t sk_miner, sk_miner2, sk_miner_tag; // [0x79] uint8_t sk_digger, sk_digger2, sk_digger_tag; // [0x7c] } __attribute__ ((__packed__)); struct game_data { /* ds == 0x0b55 */ uint8_t unk1[0x27]; // TODO uint8_t paused; // [0x28] uint8_t unk2[0x10]; // TODO uint8_t lemm_count_to_process; // [0x39] uint8_t lemm_spawned_count; // [0x40] uint8_t unk3; // TODO uint8_t lemm_out_count; // [0x42] uint8_t unk4; // TODO uint8_t lemm_level_count; // [0x44] uint8_t next_spawn_ticks; // [0x45] uint8_t spawn_rate_ticks; // [0x46] uint8_t unk5[0x20]; // TODO struct _avail_skills avail_skills; // [0x67] - [0x7e] uint8_t unk6[0x06]; // TODO struct _lemm_data lemmings[100]; // [0x85] } __attribute__ ((__packed__)); #endif /*_DOS_LEMM_H*/