diff options
author | lpouzenc <lpouzenc@gmail.com> | 2013-09-07 19:19:32 +0200 |
---|---|---|
committer | lpouzenc <lpouzenc@gmail.com> | 2013-09-07 19:19:32 +0200 |
commit | e36d15da613aae1a0bd6245b8cc23c3ac5ebf95f (patch) | |
tree | 1440340d50d8703a261fd0b327c299f1dca35f63 | |
parent | c1ccc2a10bbe759ec3e2b6fc3243b58a623d0e16 (diff) | |
download | mplemmings-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-- | .gitignore | 2 | ||||
-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.c | 12 | ||||
-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.txt | 30 |
15 files changed, 91 insertions, 55 deletions
@@ -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 |