summaryrefslogtreecommitdiff
path: root/reverse-engineering/dosbox_snif/dos_lemm.h
blob: 5504feef752ce822f41f8aad108053a146074893 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifndef _DOS_LEMM_H
#define _DOS_LEMM_H

#include <stdint.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_exploding:1;		//0x80
} __attribute__ ((__packed__));

union state {
	uint16_t raw;
	struct _state bits;
};

enum state_masks {
	s_splatting	= 0x01,
	s_exploding_spe	= 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_exploding	= 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 draw_trick1;	//0x2a
	uint8_t unk5;
	uint8_t unk6;
} __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 unk0;				// TODO
	uint8_t unk1[0x27];			// TODO
	uint8_t paused;				// [0x28]
	uint8_t unk2[0x16];			// TODO
	uint8_t lemm_count_to_process;		// [0x3f]
	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;				// TODO
	uint8_t nuke_all_in_progress;		// [0x48]
	uint8_t nuke_i;				// [0x49]
	uint8_t unk6[0x1d];			// TODO
	struct _avail_skills avail_skills;	// [0x67] - [0x7e]
	uint8_t unk7[0x06];			// TODO
	struct _lemm_data lemmings[1];		// [0x85]
	//struct _lemm_data lemmings[100];	// [0x85]
} __attribute__ ((__packed__));
	
#endif /*_DOS_LEMM_H*/