summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-08-15 22:29:07 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-08-15 22:29:07 +0200
commitc5fea717cde9012c08372cc6987043bc316a736b (patch)
treee53de4cf40513c0df861d547198d6c868233d40c
parent2be2581c8089858c6ad581469cdf77c33d5c4f2a (diff)
downloadmplemmings-c5fea717cde9012c08372cc6987043bc316a736b.tar.gz
mplemmings-c5fea717cde9012c08372cc6987043bc316a736b.tar.bz2
mplemmings-c5fea717cde9012c08372cc6987043bc316a736b.zip
Ameliorations outils dosbox
-rw-r--r--.gitignore5
-rw-r--r--src/dosbox_snif/dos_lemm.h85
-rw-r--r--src/dosbox_snif/int16todec.c9
-rw-r--r--src/dosbox_snif/main_dump_delta.c120
-rw-r--r--src/include/data_game.h42
5 files changed, 166 insertions, 95 deletions
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 <stdint.h>
+#include <stdio.h>
+
+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 <stdint.h> /* uint16_t... */
#include <string.h> /* strcpy() */
#include <stdio.h> /* 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;