X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fcommon%2Fwadres.c;h=6ff943ab03d876ba682ab436f22bc6af66b29567;hb=refs%2Fheads%2Frenders;hp=356f591f2267be52967cfed126d433fefa21623b;hpb=1d587e933326d5d8c90b965cc02a25224b2942a8;p=flatwaifu.git diff --git a/src/common/wadres.c b/src/common/wadres.c index 356f591..6ff943a 100644 --- a/src/common/wadres.c +++ b/src/common/wadres.c @@ -3,9 +3,9 @@ #include #include -#include "wadres.h" -#include "streams.h" -#include "cp866.h" +#include "common/wadres.h" +#include "common/streams.h" +#include "common/cp866.h" typedef struct Entry { long offset, size; @@ -25,9 +25,11 @@ static Stream *wads[MAX_WADS]; static Entry resources[MAX_RESOURCES]; static Block *blocks[MAX_RESOURCES]; +static int s_start, s_end; + static int check_header (Stream *r) { - assert(r != NULL); char ident[4]; + assert(r != NULL); stream_setpos(r, 0); // !!! stream_read(ident, 4, 1, r); return (memcmp(ident, "IWAD", 4) == 0) || (memcmp(ident, "PWAD", 4) == 0); @@ -45,8 +47,9 @@ int WADRES_addwad (Stream *r) { } static int WADRES_addresource (const Entry *e) { + int i; assert(e != NULL); - for (int i = 0; i < n_resources; ++i) { + for (i = 0; i < n_resources; ++i) { if (cp866_strncasecmp(resources[i].name, e->name, 8) == 0) { memcpy(&resources[i], e, sizeof(Entry)); return i; @@ -61,13 +64,14 @@ static int WADRES_addresource (const Entry *e) { } static int WADRES_read (int f) { + int ok = 1; + int32_t n, dir, i; Stream *r = wads[f]; stream_setpos(r, 4); // skip magic - int32_t n = stream_read32(r); - int32_t dir = stream_read32(r); + n = stream_read32(r); + dir = stream_read32(r); stream_setpos(r, dir); - int ok = 1; - for (int32_t i = 0; ok && i < n; ++i) { + for (i = 0; ok && i < n; ++i) { Entry e; e.offset = stream_read32(r); e.size = stream_read32(r); @@ -79,12 +83,15 @@ static int WADRES_read (int f) { } int WADRES_rehash (void) { + int i; int ok = 1; - for (int i = 0; i < n_wads; ++i) { + for (i = 0; i < n_wads; ++i) { if (!WADRES_read(i)) { ok = 0; } } + s_start = WADRES_find("S_START"); + s_end = WADRES_find("S_END"); return ok; } @@ -100,6 +107,27 @@ int WADRES_maxids (void) { return n_resources; } +int WADRES_findsprite (const char n[4], int s, int d, char *dir) { + int i; + s += 'A'; + d += '0'; + for (i = s_start + 1; i < s_end; i++) { + char a, b; + char *wn = resources[i].name; + if (cp866_strncasecmp(wn, n, 4) == 0 && (wn[4] == s || wn[6] == s)) { + a = wn[4] == s ? wn[5] : 0; + b = wn[6] == s ? wn[7] : 0; + if (a == '0' || b == '0' || a == d || b == d) { + if (dir != NULL) { + *dir = (a != '0' && b == '0') || (a != d && b == d); + } + return i; + } + } + } + return -1; +} + Stream *WADRES_getbasereader (int id) { assert(id >= 0 && id < n_resources); return wads[resources[id].f]; @@ -121,9 +149,11 @@ void WADRES_getname (int id, char *name) { } void WADRES_getdata (int id, void *data) { + long pos; + Stream *r; assert(id >= 0 && id < n_resources); - Stream *r = wads[resources[id].f]; - long pos = stream_getpos(r); + r = wads[resources[id].f]; + pos = stream_getpos(r); stream_setpos(r, resources[id].offset); stream_read(data, resources[id].size, 1, r); stream_setpos(r, pos); @@ -151,9 +181,11 @@ void *WADRES_lock (int id) { } void WADRES_unlock (void *data) { + int id; + Block *x; if (data) { - Block *x = data - sizeof(Block); - int id = x->id; + x = (Block*)((uintptr_t)data - sizeof(Block)); + id = x->id; assert(id >= 0 && id < MAX_RESOURCES); x->ref -= 1; assert(x->ref >= 0);