DEADSOFTWARE

files: move getsprid to wadres
[flatwaifu.git] / src / kos32 / files.c
1 /* Copyright (C) 1996-1997 Aleksey Volynskov
2 * Copyright (C) 2011 Rambo
3 * Copyright (C) 2020 SovietPony
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3 of the License ONLY.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
18 #include "glob.h"
19 #include <stdio.h>
20 #include <string.h>
21 #include <stdlib.h>
22 #include <assert.h>
23 #include "files.h"
24 #include "error.h"
26 #include "map.h" // MAP_load
27 #include "save.h" // SAVE_getname
29 #include "kos32/streams.h"
30 #include "common/streams.h"
31 #include "common/wadres.h"
32 #include "common/cp866.h"
34 int d_start, d_end;
36 char savname[SAVE_MAX][SAVE_MAXLEN];
37 char savok[SAVE_MAX];
39 static int m_start, m_end;
40 static int s_start, s_end;
42 void F_addwad (const char *fn) {
43 static int i = 0;
44 static KOS32_Stream wadh[MAX_WADS];
45 if (i < MAX_WADS) {
46 if (KOS32_Open(&wadh[i], fn)) {
47 if (WADRES_addwad(&wadh[i].base)) {
48 i += 1;
49 } else {
50 ERR_failinit("Invalid WAD %s", fn);
51 }
52 } else {
53 ERR_failinit("Unable to add WAD %s", fn);
54 }
55 } else {
56 ERR_failinit("Too many wads");
57 }
58 }
60 void F_initwads (void) {
61 if (!WADRES_rehash()) {
62 ERR_failinit("F_initwads: failed rehash");
63 }
64 d_start = F_getresid("D_START");
65 d_end = F_getresid("D_END");
66 m_start = F_getresid("M_START");
67 m_end = F_getresid("M_END");
68 s_start = F_getresid("S_START");
69 s_end = F_getresid("S_END");
70 }
72 int F_findres (const char n[8]) {
73 return WADRES_find(n);
74 }
76 int F_getresid (const char n[8]) {
77 int i = F_findres(n);
78 if (i == -1) {
79 ERR_fatal("F_getresid: resource %.8s not found", n);
80 }
81 return i;
82 }
84 void F_getresname (char n[8], int r) {
85 WADRES_getname(r, n);
86 }
88 int F_getsprid (const char n[4], int s, int d, char *dir) {
89 int i = WADRES_findsprite(n, s, d, dir);
90 if (i == -1) {
91 ERR_fatal("F_getsprid: image %.4s%c%c not found", n, s, d);
92 }
93 return i;
94 }
96 int F_getreslen (int r) {
97 return WADRES_getsize(r);
98 }
100 /*
101 void F_nextmus (char *s) {
102 int i = F_findres(s);
103 if (i <= m_start || i >= m_end) {
104 i = m_start;
106 for (++i; ; ++i) {
107 if (i >= m_end) {
108 i = m_start + 1;
110 WADRES_getname(i, s);
111 if (cp866_strcasecmp(s, "MENU") == 0 ||
112 cp866_strcasecmp(s, "INTERMUS") == 0 ||
113 cp866_strcasecmp(s, "\x8a\x8e\x8d\x85\x96\x0") == 0) {
114 continue;
116 if (cp866_strncasecmp(s, "DMI", 3) != 0) {
117 break;
122 void F_randmus (char *s) {
123 int i;
124 int n = myrand(10);
125 for (i = 0; i < n; i++) {
126 F_nextmus(s);
129 */
131 void F_loadmap (char n[8]) {
132 int id = F_getresid(n);
133 if (id != -1) {
134 Stream *r = WADRES_getbasereader(id);
135 long offset = WADRES_getoffset(id);
136 stream_setpos(r, offset);
137 if (!MAP_load(r)) {
138 ERR_fatal("Failed to load map");
140 } else {
141 ERR_fatal("Failed to load map: resource %.8s not found", n);
145 static char *getsavfpname (int n, int ro) {
146 static char fn[] = "savgame0.dat";
147 static char p[100];
148 fn[7] = n + '0';
149 strcpy(p, fn);
150 return p;
153 void F_getsavnames (void) {
154 KOS32_Stream rd;
155 for (int i = 0; i < SAVE_MAX; ++i) {
156 savok[i] = 0;
157 char *p = getsavfpname(i, 1);
158 if (KOS32_Open(&rd, p)) {
159 savok[i] = SAVE_getname(&rd.base, savname[i]);
160 KOS32_Close(&rd);
162 if (!savok[i]) {
163 memset(savname[i], 0, 24);
164 } else {
165 savname[i][23] = 0;
170 void F_loadgame (int n) {
171 KOS32_Stream rd;
172 char *p = getsavfpname(n, 1);
173 if (KOS32_Open(&rd, p)) {
174 SAVE_load(&rd.base);
175 KOS32_Close(&rd);
179 void F_savegame (int n, char *s) {
180 KOS32_Stream wr;
181 char *p = getsavfpname(n, 0);
182 if (KOS32_Create(&wr, p)) {
183 SAVE_save(&wr.base, s);
184 KOS32_Close(&wr);