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
|
#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*/
|