diff options
-rw-r--r-- | csrc/media_init.c | 1 | ||||
-rw-r--r-- | csrc/mkf.c | 37 | ||||
-rw-r--r-- | csrc/mkf.h | 20 | ||||
-rw-r--r-- | csrc/mkf_cfunc.c | 42 |
4 files changed, 54 insertions, 46 deletions
diff --git a/csrc/media_init.c b/csrc/media_init.c index eae6081..52479f0 100644 --- a/csrc/media_init.c +++ b/csrc/media_init.c @@ -39,7 +39,6 @@ uint16_t modded_key; // 0x46cb07 struct st st_46cb14 = {640, 480, 0, 0, NULL}; // 0x46cb14, 12 bytes uint8_t speed_tab[3] = {6, 4, 2}; // 0x64cb20 uint32_t dw_46cb23 = 0; -int pixel_fmt; // 0x47637c void fcn_00456280(struct st *s, int a1, int a2, int a3) { @@ -5,6 +5,8 @@ #include <windows.h> #include <stdint.h> +#include <string.h> +#include "mkf.h" #define NULL_HND ((HANDLE)(-1)) @@ -13,7 +15,6 @@ void fcn_00455040(char *arg1, char *arg2); /* mkf_cfunc.c */ void fcn_00451801(int16_t *a, int nbytes); -void fcn_00450069(char *s); struct mkf { @@ -22,7 +23,7 @@ struct mkf }; struct mkf mkf_stdata[16] = { { NULL_HND, NULL } }; // 0x4762f4 -int32_t load_mkf(const char *fn) +int load_mkf(const char *fn) { int i; int32_t x; @@ -60,7 +61,35 @@ void unload_mkf(int mkf_idx) m->data = NULL; } -char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize) //0x00450441 +static void update_spr_smp_ptr(char *s) +{ + struct spr_smp *sst = (struct spr_smp*)s; + int lastsz; + + if (strcmp(sst->sig, "SPR") == 0) { + lastsz = sst->chunk_tab[0].chunk_sz; + sst->chunk_tab[0].chunk_sz = (int32_t)s + sst->start_offset + 0x200; + + for (int i = 1; i < sst->nchunk; i++) { + int t = sst->chunk_tab[i].chunk_sz; + sst->chunk_tab[i].chunk_sz = lastsz + sst->chunk_tab[i-1].chunk_sz; + lastsz = t; + } + } + + if (strcmp(sst->sig, "SMP") == 0) { + lastsz = sst->chunk_tab[0].chunk_sz; + sst->chunk_tab[0].chunk_sz = (int32_t)s + sst->start_offset; + + for (int i = 1; i < sst->nchunk; i++) { + int t = sst->chunk_tab[i].chunk_sz; + sst->chunk_tab[i].chunk_sz = lastsz + sst->chunk_tab[i-1].chunk_sz; + lastsz = t; + } + } +} + +char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize) { uint32_t data[4]; int sz; @@ -93,7 +122,7 @@ char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize) //0x00450441 } if (strncmp(buf, "SPR", 3) == 0 || strncmp(buf, "SMP", 3) == 0) { - fcn_00450069(buf); + update_spr_smp_ptr(buf); } return buf; } diff --git a/csrc/mkf.h b/csrc/mkf.h new file mode 100644 index 0000000..3d5cbc4 --- /dev/null +++ b/csrc/mkf.h @@ -0,0 +1,20 @@ +int load_mkf(const char *fn); +void unload_mkf(int mkf_idx); +char * read_mkf(int mkf_idx, int a1, char *buf, int *bufsize); + +extern int pixel_fmt; + +struct spr_smp +{ + char sig[4]; /* "SPR" or "SMP" */ + int32_t nchunk; + int32_t start_offset; + int32_t t3, t4; /* unused? */ + struct { + /* in the file, it's the chunk size, + * after read_mkf(), it becomes the start address */ + int32_t chunk_sz; + int32_t v2, v3; /* unused? */ + } chunk_tab[0]; +}; + diff --git a/csrc/mkf_cfunc.c b/csrc/mkf_cfunc.c index 65c58d3..3855fc6 100644 --- a/csrc/mkf_cfunc.c +++ b/csrc/mkf_cfunc.c @@ -6,7 +6,7 @@ #include <string.h> #include <stdint.h> -extern int pixel_fmt; +int pixel_fmt; #ifndef UNROLL void fcn_00451801(int16_t *a, int nbytes) @@ -122,43 +122,3 @@ void fcn_00451801(int16_t *a1, int nbytes) } } #endif - -struct spr_smp -{ - char sig[4]; /* "SPR" or "SMP" */ - int t1; - int t2; - int t3, t4; /* unused? */ - struct { - int v1; - int v2, v3; /* unused? */ - } t[0]; -}; - -void fcn_00450069(char *s) -{ - struct spr_smp *sst = (struct spr_smp*)s; - - if (strcmp(sst->sig, "SPR") == 0) { - int oldv = sst->t[0].v1; - sst->t[0].v1 = (int32_t)s + sst->t2 + 0x200; - - for (int i = 1; i < sst->t1; i++) { - int t = sst->t[i].v1; - /* sum of old and new values of sst->t[i-1] */ - sst->t[i].v1 = oldv + sst->t[i-1].v1; - oldv = t; - } - } - - if (strcmp(sst->sig, "SMP") == 0) { - int oldv = sst->t[0].v1; // oldv@esi - sst->t[0].v1 = (int32_t)s + sst->t2; - - for (int i = 1; i < sst->t1; i++) { - int t = sst->t[i].v1; - sst->t[i].v1 = oldv + sst->t[i-1].v1; - oldv = t; - } - } -} |