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
141
142
143
144
145
146
147
148
|
#ifndef _DOS_LEMM_H
#define _DOS_LEMM_H
#include <stdint.h>
#define TRUE 0xFF
#define FALSE 0x00
#define LEVEL_HEIGHT 160
#define LEVEL_WIDTH 1664
struct _state {
uint8_t s_splatting:1; //0x01
uint8_t s_exploding_spe: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 cap_climber:1; // 0x01
uint8_t unused:6;
uint8_t 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 */
uint16_t unk0; // TODO
uint16_t unk0b; // TODO cf 00002BB5
uint16_t stencil_line_width;
uint8_t unk1[0x22]; // 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[2]; // [0x85]
//struct _lemm_data lemmings[100]; // [0x85]
} __attribute__ ((__packed__));
#endif /*_DOS_LEMM_H*/
|