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