summaryrefslogtreecommitdiff
path: root/reverse-engineering/dosbox_snif/dos_lemm.h
diff options
context:
space:
mode:
Diffstat (limited to 'reverse-engineering/dosbox_snif/dos_lemm.h')
-rw-r--r--reverse-engineering/dosbox_snif/dos_lemm.h132
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*/