1 /* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #include "sword2/header.h"
24 #include "sword2/object.h"
25 #include "sword2/screen.h"
26 #include "sword2/sword2.h"
27
28 #include "common/memstream.h"
29 #include "common/endian.h"
30
31 namespace Sword2 {
32
read(byte * addr)33 void ResHeader::read(byte *addr) {
34 Common::MemoryReadStream readS(addr, size());
35
36 fileType = readS.readByte();
37 compType = readS.readByte();
38 compSize = readS.readUint32LE();
39 decompSize = readS.readUint32LE();
40 readS.read(name, NAME_LEN);
41 }
42
write(byte * addr)43 void ResHeader::write(byte *addr) {
44 Common::MemoryWriteStream writeS(addr, size());
45
46 writeS.writeByte(fileType);
47 writeS.writeByte(compType);
48 writeS.writeUint32LE(compSize);
49 writeS.writeUint32LE(decompSize);
50 writeS.write(name, NAME_LEN);
51 }
52
read(byte * addr)53 void AnimHeader::read(byte *addr) {
54 Common::MemoryReadStream readS(addr, size());
55
56 if (Sword2Engine::isPsx()) {
57 noAnimFrames = readS.readUint16LE();
58 feetStartX = readS.readUint16LE();
59 feetStartY = readS.readUint16LE();
60 feetEndX = readS.readUint16LE();
61 feetEndY = readS.readUint16LE();
62 blend = readS.readUint16LE();
63 runTimeComp = readS.readByte();
64 feetStartDir = readS.readByte();
65 feetEndDir = readS.readByte();
66 } else {
67 runTimeComp = readS.readByte();
68 noAnimFrames = readS.readUint16LE();
69 feetStartX = readS.readUint16LE();
70 feetStartY = readS.readUint16LE();
71 feetStartDir = readS.readByte();
72 feetEndX = readS.readUint16LE();
73 feetEndY = readS.readUint16LE();
74 feetEndDir = readS.readByte();
75 blend = readS.readUint16LE();
76 }
77 }
78
write(byte * addr)79 void AnimHeader::write(byte *addr) {
80 Common::MemoryWriteStream writeS(addr, size());
81
82 writeS.writeByte(runTimeComp);
83 writeS.writeUint16LE(noAnimFrames);
84 writeS.writeUint16LE(feetStartX);
85 writeS.writeUint16LE(feetStartY);
86 writeS.writeByte(feetStartDir);
87 writeS.writeUint16LE(feetEndX);
88 writeS.writeUint16LE(feetEndY);
89 writeS.writeByte(feetEndDir);
90 writeS.writeUint16LE(blend);
91 }
92
size()93 int CdtEntry::size() {
94 if (Sword2Engine::isPsx())
95 return 12;
96 else
97 return 9;
98 }
99
read(byte * addr)100 void CdtEntry::read(byte *addr) {
101 Common::MemoryReadStream readS(addr, size());
102
103 if (Sword2Engine::isPsx()) {
104 readS.readByte(); // Skip a byte in psx version
105 x = readS.readUint16LE();
106 y = readS.readUint16LE();
107 frameOffset = readS.readUint32LE();
108 frameType = readS.readByte();
109 } else {
110 x = readS.readUint16LE();
111 y = readS.readUint16LE();
112 frameOffset = readS.readUint32LE();
113 frameType = readS.readByte();
114 }
115 }
116
write(byte * addr)117 void CdtEntry::write(byte *addr) {
118 Common::MemoryWriteStream writeS(addr, size());
119
120 writeS.writeUint16LE(x);
121 writeS.writeUint16LE(y);
122 writeS.writeUint32LE(frameOffset);
123 writeS.writeByte(frameType);
124 }
125
read(byte * addr)126 void FrameHeader::read(byte *addr) {
127 Common::MemoryReadStream readS(addr, size());
128
129 compSize = readS.readUint32LE();
130 width = readS.readUint16LE();
131 height = readS.readUint16LE();
132
133 if (Sword2Engine::isPsx()) { // In PSX version, frames are half height
134 height *= 2;
135 width = (width % 2) ? width + 1 : width;
136 }
137 }
138
write(byte * addr)139 void FrameHeader::write(byte *addr) {
140 Common::MemoryWriteStream writeS(addr, size());
141
142 writeS.writeUint32LE(compSize);
143 writeS.writeUint16LE(width);
144 writeS.writeUint16LE(height);
145 }
146
read(byte * addr)147 void MultiScreenHeader::read(byte *addr) {
148 Common::MemoryReadStream readS(addr, size());
149
150 palette = readS.readUint32LE();
151 bg_parallax[0] = readS.readUint32LE();
152 bg_parallax[1] = readS.readUint32LE();
153 screen = readS.readUint32LE();
154 fg_parallax[0] = readS.readUint32LE();
155 fg_parallax[1] = readS.readUint32LE();
156 layers = readS.readUint32LE();
157 paletteTable = readS.readUint32LE();
158 maskOffset = readS.readUint32LE();
159 }
160
write(byte * addr)161 void MultiScreenHeader::write(byte *addr) {
162 Common::MemoryWriteStream writeS(addr, size());
163
164 writeS.writeUint32LE(palette);
165 writeS.writeUint32LE(bg_parallax[0]);
166 writeS.writeUint32LE(bg_parallax[1]);
167 writeS.writeUint32LE(screen);
168 writeS.writeUint32LE(fg_parallax[0]);
169 writeS.writeUint32LE(fg_parallax[1]);
170 writeS.writeUint32LE(layers);
171 writeS.writeUint32LE(paletteTable);
172 writeS.writeUint32LE(maskOffset);
173 }
174
read(byte * addr)175 void ScreenHeader::read(byte *addr) {
176 Common::MemoryReadStream readS(addr, size());
177
178 width = readS.readUint16LE();
179 height = readS.readUint16LE();
180 noLayers = readS.readUint16LE();
181 }
182
write(byte * addr)183 void ScreenHeader::write(byte *addr) {
184 Common::MemoryWriteStream writeS(addr, size());
185
186 writeS.writeUint16LE(width);
187 writeS.writeUint16LE(height);
188 writeS.writeUint16LE(noLayers);
189 }
190
read(byte * addr)191 void LayerHeader::read(byte *addr) {
192 Common::MemoryReadStream readS(addr, size());
193
194 x = readS.readUint16LE();
195 y = readS.readUint16LE();
196 width = readS.readUint16LE();
197 height = readS.readUint16LE();
198 maskSize = readS.readUint32LE();
199 offset = readS.readUint32LE();
200 }
201
write(byte * addr)202 void LayerHeader::write(byte *addr) {
203 Common::MemoryWriteStream writeS(addr, size());
204
205 writeS.writeUint16LE(x);
206 writeS.writeUint16LE(y);
207 writeS.writeUint16LE(width);
208 writeS.writeUint16LE(height);
209 writeS.writeUint32LE(maskSize);
210 writeS.writeUint32LE(offset);
211 }
212
read(byte * addr)213 void TextHeader::read(byte *addr) {
214 Common::MemoryReadStream readS(addr, size());
215
216 noOfLines = readS.readUint32LE();
217 }
218
write(byte * addr)219 void TextHeader::write(byte *addr) {
220 Common::MemoryWriteStream writeS(addr, size());
221
222 writeS.writeUint32LE(noOfLines);
223 }
224
read(byte * addr)225 void PSXScreensEntry::read(byte *addr) {
226 Common::MemoryReadStream readS(addr, size());
227
228 bgPlxXres = readS.readUint16LE();
229 bgPlxYres = readS.readUint16LE();
230 bgPlxOffset = readS.readUint32LE();
231 bgPlxSize = readS.readUint32LE();
232 bgXres = readS.readUint16LE();
233 bgYres = readS.readUint16LE();
234 bgOffset = readS.readUint32LE();
235 bgSize = readS.readUint32LE();
236 fgPlxXres = readS.readUint16LE();
237 fgPlxYres = readS.readUint16LE();
238 fgPlxOffset = readS.readUint32LE();
239 fgPlxSize = readS.readUint32LE();
240 }
241
write(byte * addr)242 void PSXScreensEntry::write(byte *addr) {
243 Common::MemoryWriteStream writeS(addr, size());
244
245 writeS.writeUint16LE(bgPlxXres);
246 writeS.writeUint16LE(bgPlxYres);
247 writeS.writeUint32LE(bgPlxOffset);
248 writeS.writeUint32LE(bgPlxSize);
249 writeS.writeUint16LE(bgXres);
250 writeS.writeUint16LE(bgYres);
251 writeS.writeUint32LE(bgOffset);
252 writeS.writeUint32LE(bgSize);
253 writeS.writeUint16LE(fgPlxXres);
254 writeS.writeUint16LE(fgPlxYres);
255 writeS.writeUint32LE(fgPlxOffset);
256 writeS.writeUint32LE(fgPlxSize);
257 }
258
read(byte * addr)259 void PSXFontEntry::read(byte *addr) {
260 Common::MemoryReadStream readS(addr, size());
261
262 offset = readS.readUint16LE() / 2;
263 skipLines = readS.readUint16LE();
264 charWidth = readS.readUint16LE() / 2;
265 charHeight = readS.readUint16LE();
266 }
267
write(byte * addr)268 void PSXFontEntry::write(byte *addr) {
269 Common::MemoryWriteStream writeS(addr, size());
270
271 writeS.writeUint16LE(offset);
272 writeS.writeUint16LE(skipLines);
273 writeS.writeUint16LE(charWidth);
274 writeS.writeUint16LE(charHeight);
275 }
276
read(byte * addr)277 void Parallax::read(byte *addr) {
278 Common::MemoryReadStream readS(addr, size());
279
280 w = readS.readUint16LE();
281 h = readS.readUint16LE();
282 }
283
write(byte * addr)284 void Parallax::write(byte *addr) {
285 Common::MemoryWriteStream writeS(addr, size());
286
287 writeS.writeUint16LE(w);
288 writeS.writeUint16LE(h);
289 }
290
read(byte * addr)291 void ObjectMouse::read(byte *addr) {
292 Common::MemoryReadStream readS(addr, size());
293
294 x1 = readS.readSint32LE();
295 y1 = readS.readSint32LE();
296 x2 = readS.readSint32LE();
297 y2 = readS.readSint32LE();
298 priority = readS.readSint32LE();
299 pointer = readS.readSint32LE();
300 }
301
write(byte * addr)302 void ObjectMouse::write(byte *addr) {
303 Common::MemoryWriteStream writeS(addr, size());
304
305 writeS.writeSint32LE(x1);
306 writeS.writeSint32LE(y1);
307 writeS.writeSint32LE(x2);
308 writeS.writeSint32LE(y2);
309 writeS.writeSint32LE(priority);
310 writeS.writeSint32LE(pointer);
311 }
312
read(byte * addr)313 void ObjectWalkdata::read(byte *addr) {
314 Common::MemoryReadStream readS(addr, size());
315
316 nWalkFrames = readS.readUint32LE();
317 usingStandingTurnFrames = readS.readUint32LE();
318 usingWalkingTurnFrames = readS.readUint32LE();
319 usingSlowInFrames = readS.readUint32LE();
320 usingSlowOutFrames = readS.readUint32LE();
321
322 int i;
323
324 for (i = 0; i < ARRAYSIZE(nSlowInFrames); i++)
325 nSlowInFrames[i] = readS.readUint32LE();
326
327 for (i = 0; i < ARRAYSIZE(leadingLeg); i++)
328 leadingLeg[i] = readS.readUint32LE();
329
330 for (i = 0; i < ARRAYSIZE(dx); i++)
331 dx[i] = readS.readUint32LE();
332
333 for (i = 0; i < ARRAYSIZE(dy); i++)
334 dy[i] = readS.readUint32LE();
335 }
336
write(byte * addr)337 void ObjectWalkdata::write(byte *addr) {
338 Common::MemoryWriteStream writeS(addr, size());
339
340 writeS.writeUint32LE(nWalkFrames);
341 writeS.writeUint32LE(usingStandingTurnFrames);
342 writeS.writeUint32LE(usingWalkingTurnFrames);
343 writeS.writeUint32LE(usingSlowInFrames);
344 writeS.writeUint32LE(usingSlowOutFrames);
345
346 int i;
347
348 for (i = 0; i < ARRAYSIZE(nSlowInFrames); i++)
349 writeS.writeUint32LE(nSlowInFrames[i]);
350
351 for (i = 0; i < ARRAYSIZE(leadingLeg); i++)
352 writeS.writeUint32LE(leadingLeg[i]);
353
354 for (i = 0; i < ARRAYSIZE(dx); i++)
355 writeS.writeUint32LE(dx[i]);
356
357 for (i = 0; i < ARRAYSIZE(dy); i++)
358 writeS.writeUint32LE(dy[i]);
359 }
360
361 } // End of namespace Sword2
362