From c5fea717cde9012c08372cc6987043bc316a736b Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Thu, 15 Aug 2013 22:29:07 +0200 Subject: Ameliorations outils dosbox --- .gitignore | 5 ++ src/dosbox_snif/dos_lemm.h | 85 +++++++++++++++++++++++++++ src/dosbox_snif/int16todec.c | 9 +++ src/dosbox_snif/main_dump_delta.c | 120 +++++++++----------------------------- src/include/data_game.h | 42 ++++++++++++- 5 files changed, 166 insertions(+), 95 deletions(-) create mode 100644 src/dosbox_snif/dos_lemm.h create mode 100644 src/dosbox_snif/int16todec.c diff --git a/.gitignore b/.gitignore index c2b750d..61fd49e 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,11 @@ sbspritegif testparseall testrender testplay +src/dosbox_snif/dump +src/dosbox_snif/dump_delta +src/dosbox_snif/int16todec +src/dosbox_snif/poke + # Temporaries and build objects *.swp diff --git a/src/dosbox_snif/dos_lemm.h b/src/dosbox_snif/dos_lemm.h new file mode 100644 index 0000000..2935f8d --- /dev/null +++ b/src/dosbox_snif/dos_lemm.h @@ -0,0 +1,85 @@ +#ifndef _DOS_LEMM_H +#define _DOS_LEMM_H + +struct _state { + uint8_t s_splatting:1; //0X1 + uint8_t s_exploding:1; //0X2 combinable + uint8_t s_falling:1; //0X4 + uint8_t s_ascending:1; //0X8 + 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; //0X1 + uint8_t s_bashing:1; //0X2 + uint8_t s_floating:1; //0X4 + uint8_t s_mining:1; //0X8 + uint8_t s_drawning:1; //0x10 + uint8_t s_ending:1; //0x20 + uint8_t s_dying:1; //0X40 + uint8_t s_exploding2:1; //0X80 when exploding too ? +} __attribute__ ((__packed__)); + +union state { + uint16_t raw; + struct _state bf; +}; + +struct _flags1 { + uint8_t cap_climber:1; // 0x1 + uint8_t bit_1:1; + uint8_t bit_2:1; + uint8_t bit_3:1; + uint8_t bit_4:1; + uint8_t bit_5:1; + uint8_t bit_6:1; + uint8_t walk_pause_for_shruggling:1; // 0X80 +} __attribute__ ((__packed__)); + +union flags1 { + uint8_t raw; + struct _flags1 bf; +}; + +struct _lemm_data { + 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_b7, s_exploding2 +}; + +#endif /*_DOS_LEMM_H*/ diff --git a/src/dosbox_snif/int16todec.c b/src/dosbox_snif/int16todec.c new file mode 100644 index 0000000..6499bf6 --- /dev/null +++ b/src/dosbox_snif/int16todec.c @@ -0,0 +1,9 @@ +#include +#include + +int main() { + int16_t i; + scanf("%x", &i); + printf("0x%04x => %i\n", i, i); + return 0; +} diff --git a/src/dosbox_snif/main_dump_delta.c b/src/dosbox_snif/main_dump_delta.c index 2e393c6..baaaa0d 100644 --- a/src/dosbox_snif/main_dump_delta.c +++ b/src/dosbox_snif/main_dump_delta.c @@ -1,100 +1,20 @@ #include "rsp.h" #include "rsp_lemm.h" #include "utils.h" +#include "dos_lemm.h" #include /* uint16_t... */ #include /* strcpy() */ #include /* printf() */ -struct _state { - uint8_t s_splatting:1; //0X1 - uint8_t s_exploding:1; //0X2 combinable - uint8_t s_falling:1; //0X4 - uint8_t s_ascending:1; //0X8 - 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; //0X1 - uint8_t s_bashing:1; //0X2 - uint8_t s_floating:1; //0X4 - uint8_t s_mining:1; //0X8 - uint8_t s_drawning:1; //0x10 - uint8_t s_ending:1; //0x20 - uint8_t s_b7:1; //0X40 - uint8_t s_b8:1; //0X80 when exploding too ? -} __attribute__ ((__packed__)); - -union state { - uint16_t raw; - struct _state bf; -}; - -struct _flags1 { - uint8_t cap_climber:1; // 0x1 - uint8_t bit_1:1; - uint8_t bit_2:1; - uint8_t bit_3:1; - uint8_t bit_4:1; - uint8_t bit_5:1; - uint8_t bit_6:1; - uint8_t walk_pause_for_shruggling:1; // 0X80 -} __attribute__ ((__packed__)); - -union flags1 { - uint8_t raw; - struct _flags1 bf; -}; - -struct _lemm_data { - 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 -}; -char draw_hint_str[256][16]; - -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_b7, s_b8 -}; -char state_str[16][16]; - int main(int argc, char *argv[]) { - int i, rv, end=0; + int i, rv, similar_frames, end; struct rsp_state rsp; char ds_si[10], command[16]; union lemm_data lemm, prevlemm; + char draw_hint_str[256][16]; + char state_str[16][16]; memset(lemm.raw, 0, sizeof(lemm.raw)); @@ -122,7 +42,7 @@ int main(int argc, char *argv[]) { strcpy(state_str[s_drawning],"s_drawning"); strcpy(state_str[s_ending],"s_ending"); strcpy(state_str[s_b7],"s_b7"); - strcpy(state_str[s_b8],"s_b8"); + strcpy(state_str[s_exploding2],"s_exploding2"); rv=rsp_lemm_init(&rsp, ds_si); if ( rv != 0 ) { @@ -130,6 +50,8 @@ int main(int argc, char *argv[]) { return 1; } + end=0; + similar_frames=0; while (!end) { rsp_query(&rsp, "c"); // Continue if ( rsp.replied != 1 ) printf("Bug 03\n"); @@ -138,14 +60,14 @@ int main(int argc, char *argv[]) { snprintf(command, 15, "m%s,0x2d", ds_si); rsp_query(&rsp, command); // Read a lemming record - if ( rsp_decode(&rsp) != 0x2d * 2 ) { + if ( rsp_decode(&rsp) != 2*sizeof(lemm.raw) ) { printf("Bug 07\n"); continue; } memcpy(prevlemm.raw, lemm.raw, sizeof(lemm.raw)); -// printf("%s\n", rsp.decoded); + //printf("%s\n", rsp.decoded); rv = hexascii2bin(rsp.decoded, lemm.raw, sizeof(lemm.raw)); if ( rv != sizeof(lemm.raw) ) { printf("Bug 08\n"); @@ -162,7 +84,21 @@ int main(int argc, char *argv[]) { case 0x2: // y case 0x3: // y case 0x28: //spr_frame - break; /* Don't want to see state changes because the is well-known and frequent */ + continue; // Don't want to see those state changes because is well-known and frequent + case 0x20: //expl_countdown + if ( lemm.s.expl_countdown < 0x4e && lemm.s.expl_countdown > 0x02) { + // Skip detailing all 80 changes... Just beginning and ending + continue; + } + } + + // If here, an interessting change has been detected + if ( similar_frames > 0) { + printf("(%i similar frames)\n", similar_frames); + } + similar_frames=-1; + + switch(i) { case 0x4: // x_spr_offset i=0x5; // go to the next case (prevents double printing) @@ -184,7 +120,7 @@ int main(int argc, char *argv[]) { printf("state\t\t%04x -> %04x (multiple)\n",prevlemm.s.state.raw, lemm.s.state.raw); break; case -1: - printf("state\t\t%04x -> %04x (none)\n",prevlemm.s.state.raw, lemm.s.state.raw); + printf("state\t\t%04x -> %04x (walking...)\n",prevlemm.s.state.raw, lemm.s.state.raw); break; default: printf("state\t\t%04x -> %04x (%s)\n",prevlemm.s.state.raw, lemm.s.state.raw, state_str[rv]); @@ -205,10 +141,7 @@ int main(int argc, char *argv[]) { printf("ptr2\t\t%04x -> %04x\n",prevlemm.s.ptr2, lemm.s.ptr2); break; case 0x20: //expl_countdown - if ( !( lemm.s.expl_countdown < 0x4e && lemm.s.expl_countdown > 0x02) ) { - // Skip detailing all 80 changes... Just beginning and ending - printf("expl_countdown\t%02x -> %02x\n",prevlemm.s.expl_countdown, lemm.s.expl_countdown); - } + printf("expl_countdown\t%02x -> %02x\n",prevlemm.s.expl_countdown, lemm.s.expl_countdown); break; case 0x21: //steps_remain printf("steps_remain\t%02x -> %02x\n",prevlemm.s.steps_remain, lemm.s.steps_remain); @@ -241,6 +174,7 @@ int main(int argc, char *argv[]) { printf("(0x%02x)\t\t%02x -> %02x\n", i, prevlemm.raw[i], lemm.raw[i]); } } + similar_frames++; } rsp_quit(&rsp); return 0; diff --git a/src/include/data_game.h b/src/include/data_game.h index 64b3827..669c0ef 100644 --- a/src/include/data_game.h +++ b/src/include/data_game.h @@ -7,9 +7,46 @@ #define MAX_LEMMINGS_COUNT 100 /* Should be used also by the parser... */ +enum lemmtype { + /* Well known types */ + faller,walker,climber,floater,stopper,builder, + digger,basher,miner, /* vertical / horizontal / diagonal */ + jumper, /* a Lemming jumping over a small obstacle */ + + /* Lemming disparitions */ + bomber, + splat, /* a Lemming dieing from a fall */ + drowning, /* a Lemming drowning in the water */ + trapped, /* a Lemming killed by a trap */ + exiting, + + /* transitionnal states, special animation*/ + climber_to_walker, + builder_end, /* a builder Lemmings with no more steps in his backpack (shrugling) */ + + /* transitionnal states, no special animation*/ + floater_start, + bomber_stopper, /* a stopper that is told to explode */ + + /* Special states for algorithmic purposes */ + nuke /* already dead Lemming */ + /*undefined No lemm type yet (usefull?) */ +}; + +enum lemmdir { left, right }; + typedef struct { - void *todo; - /* role, state, animframe... */ + enum lemmtype type; + enum lemmdir dir; + int x,y; /* Lemming Foot coords */ + int maskX, maskY; + int frameIdx; /* For animated sprites */ + int counter, counter2; /* counter used for internal state changes */ + int explodeNumCtr, explodeCtr; + int canFloat, canClimb, canChangeSkill, nuke, hasDied, hasLeft, + int selectCtr; /** counter used to display the select image in replay mode */ + + renderItem_t *renderItem; } lemming_t; enum skills { @@ -17,6 +54,7 @@ enum skills { sk_basher, sk_miner, sk_digger, sk_count }; + typedef struct { /* Game time counter */ int tick; -- cgit v1.2.3