summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-09-28 10:26:17 +0800
committerIru Cai <mytbk920423@gmail.com>2018-09-28 10:26:17 +0800
commit8db05a1a311f5d196c14e7946a1c0e6c3603007f (patch)
tree2e353b7c66088c788bee55f887d55d6d75bd2e5d
parentced4f8d857dd37c3d3317dbb78b6e6798a747e63 (diff)
downloadrich4-8db05a1a311f5d196c14e7946a1c0e6c3603007f.tar.xz
restruct mkf functions
-rw-r--r--csrc/media_init.c1
-rw-r--r--csrc/mkf.c37
-rw-r--r--csrc/mkf.h20
-rw-r--r--csrc/mkf_cfunc.c42
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)
{
diff --git a/csrc/mkf.c b/csrc/mkf.c
index f7406ff..535d120 100644
--- a/csrc/mkf.c
+++ b/csrc/mkf.c
@@ -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;
- }
- }
-}