summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlpouzenc <lpouzenc@gmail.com>2013-09-07 19:19:32 +0200
committerlpouzenc <lpouzenc@gmail.com>2013-09-07 19:19:32 +0200
commite36d15da613aae1a0bd6245b8cc23c3ac5ebf95f (patch)
tree1440340d50d8703a261fd0b327c299f1dca35f63
parentc1ccc2a10bbe759ec3e2b6fc3243b58a623d0e16 (diff)
downloadmplemmings-e36d15da613aae1a0bd6245b8cc23c3ac5ebf95f.tar.gz
mplemmings-e36d15da613aae1a0bd6245b8cc23c3ac5ebf95f.tar.bz2
mplemmings-e36d15da613aae1a0bd6245b8cc23c3ac5ebf95f.zip
Tout le reverse est regroupe a present. Manque le makefile car .gitignore un peu violent
-rw-r--r--.gitignore2
-rw-r--r--reverse-engineering/dosbox_snif/dos_lemm.h (renamed from src/dosbox_snif/dos_lemm.h)102
-rw-r--r--reverse-engineering/dosbox_snif/int16todec.c (renamed from src/dosbox_snif/int16todec.c)0
-rw-r--r--reverse-engineering/dosbox_snif/main_dump.c (renamed from src/dosbox_snif/main_dump.c)0
-rw-r--r--reverse-engineering/dosbox_snif/main_dump_delta.c (renamed from src/dosbox_snif/main_dump_delta.c)0
-rw-r--r--reverse-engineering/dosbox_snif/main_dump_ds0.c (renamed from src/dosbox_snif/main_dump_ds0.c)0
-rw-r--r--reverse-engineering/dosbox_snif/main_poke.c (renamed from src/dosbox_snif/main_poke.c)0
-rw-r--r--reverse-engineering/dosbox_snif/main_validate_code.c12
-rw-r--r--reverse-engineering/dosbox_snif/rsp.c (renamed from src/dosbox_snif/rsp.c)0
-rw-r--r--reverse-engineering/dosbox_snif/rsp.h (renamed from src/dosbox_snif/rsp.h)0
-rw-r--r--reverse-engineering/dosbox_snif/rsp_lemm.c (renamed from src/dosbox_snif/rsp_lemm.c)0
-rw-r--r--reverse-engineering/dosbox_snif/rsp_lemm.h (renamed from src/dosbox_snif/rsp_lemm.h)0
-rw-r--r--reverse-engineering/dosbox_snif/utils.c (renamed from src/dosbox_snif/utils.c)0
-rw-r--r--reverse-engineering/dosbox_snif/utils.h (renamed from src/dosbox_snif/utils.h)0
-rw-r--r--reverse-engineering/work/seg_code_0208.txt30
15 files changed, 91 insertions, 55 deletions
diff --git a/.gitignore b/.gitignore
index 6240c8d..4f95be9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
# autoreconf && configure stuff
INSTALL
-Makefile
+/Makefile
Makefile.in
aclocal.m4
autom4te.cache/
diff --git a/src/dosbox_snif/dos_lemm.h b/reverse-engineering/dosbox_snif/dos_lemm.h
index 4766011..f6c7c95 100644
--- a/src/dosbox_snif/dos_lemm.h
+++ b/reverse-engineering/dosbox_snif/dos_lemm.h
@@ -1,27 +1,6 @@
#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
@@ -30,8 +9,8 @@ struct _state {
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_climb_ending:1; //0x40
+ uint8_t s_building:1; //0x80
uint8_t s_blocking:1; //0x01
uint8_t s_bashing:1; //0x02
@@ -39,31 +18,51 @@ struct _state {
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
+ uint8_t s_dying:1; //0x40
+ uint8_t s_exploding2:1; //0x80
} __attribute__ ((__packed__));
union state {
uint16_t raw;
- struct _state bf;
+ 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 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
+ 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 bf;
+ 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
@@ -100,9 +99,34 @@ enum draw_hint {
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
-};
+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*/
diff --git a/src/dosbox_snif/int16todec.c b/reverse-engineering/dosbox_snif/int16todec.c
index 6499bf6..6499bf6 100644
--- a/src/dosbox_snif/int16todec.c
+++ b/reverse-engineering/dosbox_snif/int16todec.c
diff --git a/src/dosbox_snif/main_dump.c b/reverse-engineering/dosbox_snif/main_dump.c
index 68bd4c0..68bd4c0 100644
--- a/src/dosbox_snif/main_dump.c
+++ b/reverse-engineering/dosbox_snif/main_dump.c
diff --git a/src/dosbox_snif/main_dump_delta.c b/reverse-engineering/dosbox_snif/main_dump_delta.c
index 8db3671..8db3671 100644
--- a/src/dosbox_snif/main_dump_delta.c
+++ b/reverse-engineering/dosbox_snif/main_dump_delta.c
diff --git a/src/dosbox_snif/main_dump_ds0.c b/reverse-engineering/dosbox_snif/main_dump_ds0.c
index e54589d..e54589d 100644
--- a/src/dosbox_snif/main_dump_ds0.c
+++ b/reverse-engineering/dosbox_snif/main_dump_ds0.c
diff --git a/src/dosbox_snif/main_poke.c b/reverse-engineering/dosbox_snif/main_poke.c
index e0048fa..e0048fa 100644
--- a/src/dosbox_snif/main_poke.c
+++ b/reverse-engineering/dosbox_snif/main_poke.c
diff --git a/reverse-engineering/dosbox_snif/main_validate_code.c b/reverse-engineering/dosbox_snif/main_validate_code.c
new file mode 100644
index 0000000..a016a54
--- /dev/null
+++ b/reverse-engineering/dosbox_snif/main_validate_code.c
@@ -0,0 +1,12 @@
+#include "dos_lemm.h"
+
+int main() {
+ struct game_data g;
+ struct _lemm_data *lemm;
+
+ lemm = g.lemmings;
+ lemm->draw_hint = hint_walking;
+
+ return lemm->draw_hint;
+}
+
diff --git a/src/dosbox_snif/rsp.c b/reverse-engineering/dosbox_snif/rsp.c
index c9957b7..c9957b7 100644
--- a/src/dosbox_snif/rsp.c
+++ b/reverse-engineering/dosbox_snif/rsp.c
diff --git a/src/dosbox_snif/rsp.h b/reverse-engineering/dosbox_snif/rsp.h
index c8f1378..c8f1378 100644
--- a/src/dosbox_snif/rsp.h
+++ b/reverse-engineering/dosbox_snif/rsp.h
diff --git a/src/dosbox_snif/rsp_lemm.c b/reverse-engineering/dosbox_snif/rsp_lemm.c
index e39ef30..e39ef30 100644
--- a/src/dosbox_snif/rsp_lemm.c
+++ b/reverse-engineering/dosbox_snif/rsp_lemm.c
diff --git a/src/dosbox_snif/rsp_lemm.h b/reverse-engineering/dosbox_snif/rsp_lemm.h
index bd95d4f..bd95d4f 100644
--- a/src/dosbox_snif/rsp_lemm.h
+++ b/reverse-engineering/dosbox_snif/rsp_lemm.h
diff --git a/src/dosbox_snif/utils.c b/reverse-engineering/dosbox_snif/utils.c
index 8e26d46..8e26d46 100644
--- a/src/dosbox_snif/utils.c
+++ b/reverse-engineering/dosbox_snif/utils.c
diff --git a/src/dosbox_snif/utils.h b/reverse-engineering/dosbox_snif/utils.h
index a7031a8..a7031a8 100644
--- a/src/dosbox_snif/utils.h
+++ b/reverse-engineering/dosbox_snif/utils.h
diff --git a/reverse-engineering/work/seg_code_0208.txt b/reverse-engineering/work/seg_code_0208.txt
index 0efbed8..21a4ca0 100644
--- a/reverse-engineering/work/seg_code_0208.txt
+++ b/reverse-engineering/work/seg_code_0208.txt
@@ -1736,7 +1736,7 @@ main_loop_ingame:
00000F49 3C30 cmp al,0x30 if ( al == 0x30 ) goto no_lemm_left;
00000F4B 7502 jnz 0xf4f //
00000F4D EB57 jmp short 0xfa6 //
-00000F4F 803E2800FF cmp byte [0x28],0xff if ( ! [0x28] ) {
+00000F4F 803E2800FF cmp byte [0x28],0xff if ( ! paused ) {
00000F54 7437 jz 0xf8d //
00000F56 FE0E8200 dec byte [0x82] [0x82]--;
00000F5A 7531 jnz 0xf8d if ( [0x82] == 0 ) {
@@ -2769,7 +2769,7 @@ no_lemm_left:
0000182E C3 ret
void move_lemmings() {
-0000182F 803E2800FF cmp byte [0x28],0xff if ([0x28] == 0xff) { #
+0000182F 803E2800FF cmp byte [0x28],0xff if ( paused ) {
00001834 7503 jnz 0x1839
00001836 E9DC00 jmp word 0x1915 [0x4d] = 0; #
return;
@@ -2800,7 +2800,7 @@ no_lemm_left:
0000186F 7403 jz 0x1874 //
00001871 E9350E jmp word 0x26a9 //
00001874 8B4408 mov ax,[si+0x8] //
-00001877 23C0 and ax,ax if ( lemm->state.word == 0x0 )
+00001877 23C0 and ax,ax if ( lemm->state.raw == 0x0 )
00001879 7503 jnz 0x187e goto lbl_walking;
0000187B E9DF00 jmp word 0x195d //
0000187E A90200 test ax,0x2 if ( lemm->state.bits.s_exploding )
@@ -2882,7 +2882,7 @@ label1:
0000193A 7506 jnz 0x1942 //
0000193C FE064900 inc byte [0x49] //
00001940 EBD9 jmp short 0x191b //
-00001942 F744080380 test word [si+0x8],0x8003 if ( lemm->state.word & (s_exploding2 | s_splatting | s_exploding) == 0 ) {
+00001942 F744080380 test word [si+0x8],0x8003 if ( lemm->state.raw & (s_exploding2 | s_splatting | s_exploding) == 0 ) {
00001947 7504 jnz 0x194d lemm.expl_countdown = 79;
00001949 C644204F mov byte [si+0x20],0x4f }
0000194D FE064900 inc byte [0x49] [0x49]++;
@@ -4087,7 +4087,7 @@ lbl_anim_but_no_move:
000026B3 7403 jz 0x26b8 if ( lemm->spr_frame != 7 ) {
000026B5 E949F2 jmp word 0x1901 goto next_lemming;
}
-000026B8 C744080000 mov word [si+0x8],0x0 lemm->state.word = s_walking;
+000026B8 C744080000 mov word [si+0x8],0x0 lemm->state.raw = s_walking;
000026BD C7440A0000 mov word [si+0xa],0x0 //???
000026C2 C7440C0000 mov word [si+0xc],0x0 lemm->spr_data_ptr = 0;
000026C7 C744105A00 mov word [si+0x10],0x5a //???
@@ -4108,7 +4108,7 @@ lbl_anim_but_no_move:
000026F8 B001 mov al,0x1
000026FA FE4C20 dec byte [si+0x20] lemm.expl_countdown--;
000026FD 7555 jnz 0x2754 if ( lemm.expl_countdown == 0 ) {
-000026FF F744080454 test word [si+0x8],0x5404 if ( lemm->state.word == 0x5404 ) { //WTF?? #
+000026FF F744080454 test word [si+0x8],0x5404 if ( lemm->state.raw == 0x5404 ) { //WTF?? #
00002704 7551 jnz 0x2757 //
00002706 814C080080 or word [si+0x8],0x8000 lemm->state.bits.s_exploding2 = 1;
0000270B C7440A0800 mov word [si+0xa],0x8 // ??? #
@@ -4333,7 +4333,7 @@ lbl_on_exit:
00002997 CD61 int 0x61
00002999 C3 ret
void spawn_lemming() {
-0000299A 803E2800FF cmp byte [0x28],0xff if ( ![0x28] || ![0x52] ) return; #
+0000299A 803E2800FF cmp byte [0x28],0xff if ( paused || ![0x52] ) return; #
0000299F 7503 jnz 0x29a4 //
000029A1 E99F00 jmp word 0x2a43 //
000029A4 803E5200FF cmp byte [0x52],0xff //
@@ -4390,7 +4390,7 @@ lbl_on_exit:
00002A43 C3 ret return;
}
void apply_skill() {
-00002A44 803E2800FF cmp byte [0x28],0xff if ( [0x28] || [0x4d] || ![0x60] ) return;
+00002A44 803E2800FF cmp byte [0x28],0xff if ( paused || [0x4d] || ![0x60] ) return;
00002A49 7463 jz 0x2aae //
00002A4B 803E4D00FF cmp byte [0x4d],0xff //
00002A50 7502 jnz 0x2a54 //
@@ -4441,7 +4441,7 @@ lbl_apply_exploder:
00002ABA 7441 jz 0x2afd //
00002ABC 807C2000 cmp byte [si+0x20],0x0 //
00002AC0 753B jnz 0x2afd //
-00002AC2 F7440803C0 test word [si+0x8],0xc003 if ( lemm->state.word & (s_exploding2 | s_dying | s_exploding | s_splatting) !=0 )
+00002AC2 F7440803C0 test word [si+0x8],0xc003 if ( lemm->state.raw & (s_exploding2 | s_dying | s_exploding | s_splatting) !=0 )
00002AC7 7534 jnz 0x2afd return;
00002AC9 FE0E6D00 dec byte [0x6d] sk_bomber--;
00002ACD C6066F0000 mov byte [0x6f],0x0 sk_bomber_tag=0;
@@ -5679,7 +5679,7 @@ try_other_candidate_for_mining:
000037EC 3C0C cmp al,0xc
000037EE 7503 jnz 0x37f3
000037F0 E99B00 jmp word 0x388e
-000037F3 803E2800FF cmp byte [0x28],0xff
+000037F3 803E2800FF cmp byte [0x28],0xff if ( ! paused )
000037F8 7503 jnz 0x37fd
000037FA E98C00 jmp word 0x3889
000037FD 803E810000 cmp byte [0x81],0x0
@@ -5734,7 +5734,7 @@ try_other_candidate_for_mining:
00003888 C3 ret
00003889 C6065F00FF mov byte [0x5f],0xff
0000388E C3 ret
-0000388F 803E2800FF cmp byte [0x28],0xff
+0000388F 803E2800FF cmp byte [0x28],0xff if ( paused )
00003894 74F8 jz 0x388e
00003896 C606CC1F00 mov byte [0x1fcc],0x0
0000389B A0CF1F mov al,[0x1fcf]
@@ -5753,10 +5753,10 @@ try_other_candidate_for_mining:
000038C1 80FB02 cmp bl,0x2
000038C4 7302 jnc 0x38c8
000038C6 EBC6 jmp short 0x388e
-000038C8 80362800FF xor byte [0x28],0xff
+000038C8 80362800FF xor byte [0x28],0xff paused = !paused;
000038CD A25000 mov [0x50],al
000038D0 EBBC jmp short 0x388e
-000038D2 803E2800FF cmp byte [0x28],0xff
+000038D2 803E2800FF cmp byte [0x28],0xff if ( paused )
000038D7 74B5 jz 0x388e
000038D9 22C0 and al,al
000038DB 742B jz 0x3908
@@ -12418,8 +12418,8 @@ try_other_candidate_for_mining:
000070B3 C3 ret
}
void unk_03() {
-000070B4 803E2800FF cmp byte [0x28],0xff
-000070B9 745A jz 0x7115
+000070B4 803E2800FF cmp byte [0x28],0xff if ( paused ) return;
+000070B9 745A jz 0x7115 //
000070BB BEC817 mov si,0x17c8
000070BE BFE80F mov di,0xfe8
000070C1 B92000 mov cx,0x20