summaryrefslogtreecommitdiff
path: root/src/dosbox_snif/dos_lemm.h
blob: 476601136f13f793ba95d611d30d6c0b72e5f428 (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
#ifndef _DOS_LEMM_H
#define _DOS_LEMM_H

uint8 lemm_count_to_process; // [0x39]
uint8 lemm_spawned_count; // [0x40]

uint8 lemm_out_count; // [0x42]

uint8 lemm_level_count; // [0x44]
uint8 next_spawn_ticks; // [0x45]
uint8 spawn_rate_ticks; // [0x46]


struct _avail_skils {
	/* ds:si == 0b5b:0067 */
	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]
};

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 bf;
};

struct _flags1 {
	uint8_t cap_climber:1; // 0x1
	uint8_t unused_bit_1:1;
	uint8_t unused_bit_2:1;
	uint8_t unused_bit_3:1;
	uint8_t unused_bit_4:1;
	uint8_t unused_bit_5:1;
	uint8_t unused_bit_6:1;
	uint8_t walk_pause_for_shruggling:1; // 0X80
} __attribute__ ((__packed__));

union flags1 {
	uint8_t raw;
	struct _flags1 bf;
};

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
};

enum state_bit {
	s_splatting=0, s_exploding, s_falling, s_ascending, s_digging, s_climbing, s_climb_ending, s_building,
	s_blocking, s_bashing, s_floating, s_mining, s_drawning, s_ending, s_dying, s_exploding2
};

#endif /*_DOS_LEMM_H*/