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 "scumm/file_nes.h"
24 #include "common/debug.h"
25 #include "common/endian.h"
26 #include "common/md5.h"
27 #include "common/memstream.h"
28 #include "common/textconsole.h"
29 
30 namespace Scumm {
31 
32 #pragma mark -
33 #pragma mark --- ScummNESFile ---
34 #pragma mark -
35 
36 struct ScummNESFile::Resource {
37 	uint32 offset;
38 	uint16 length;
39 };
40 
41 struct ScummNESFile::ResourceGroup {
42 	ResType type;
43 	const Resource *langs[ScummNESFile::kROMsetNum];
44 };
45 
ScummNESFile()46 ScummNESFile::ScummNESFile() : _stream(0), _buf(0), _ROMset(kROMsetNum) {
47 }
48 
49 static const ScummNESFile::Resource res_roomgfx_usa[40] = {
50 	{ 0x04001, 0x03C9 }, { 0x043CA, 0x069E }, { 0x04A68, 0x0327 }, { 0x04D8F, 0x053B }, { 0x052CA, 0x06BE },
51 	{ 0x05988, 0x0682 }, { 0x0600A, 0x0778 }, { 0x06782, 0x0517 }, { 0x06C99, 0x07FB }, { 0x07494, 0x07BE },
52 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x0846 }, { 0x09BB3, 0x08C8 },
53 	{ 0x0A47B, 0x0844 }, { 0x0ACBF, 0x0515 }, { 0x0B1D4, 0x0799 }, { 0x0B96D, 0x04BB }, { 0x07C52, 0x0319 },
54 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x076D }, { 0x0CBD2, 0x0827 }, { 0x0D3F9, 0x0515 }, { 0x0D90E, 0x064E },
55 	{ 0x0DF5C, 0x0775 }, { 0x0E6D1, 0x06DD }, { 0x0EDAE, 0x0376 }, { 0x0F124, 0x05F7 }, { 0x0F71B, 0x0787 },
56 	{ 0x10001, 0x02D6 }, { 0x102D7, 0x06A3 }, { 0x1097A, 0x099F }, { 0x11319, 0x0361 }, { 0x1167A, 0x0489 },
57 	{ 0x11B03, 0x0437 }, { 0x11F3A, 0x084D }, { 0x0BE28, 0x0199 }, { 0x12787, 0x09A7 }, { 0x1312E, 0x037A }
58 };
59 static const ScummNESFile::Resource res_roomgfx_eur[40] = {
60 	{ 0x04001, 0x03B9 }, { 0x043BA, 0x069E }, { 0x04A58, 0x0327 }, { 0x04D7F, 0x053B }, { 0x052BA, 0x06BE },
61 	{ 0x05978, 0x0682 }, { 0x05FFA, 0x0778 }, { 0x06772, 0x0517 }, { 0x06C89, 0x07FB }, { 0x07484, 0x07BE },
62 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x0846 }, { 0x09BB3, 0x08C8 },
63 	{ 0x0A47B, 0x0844 }, { 0x0ACBF, 0x0515 }, { 0x0B1D4, 0x0799 }, { 0x0B96D, 0x04BB }, { 0x07C42, 0x0319 },
64 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x076D }, { 0x0CBD2, 0x0827 }, { 0x0D3F9, 0x0515 }, { 0x0D90E, 0x064E },
65 	{ 0x0DF5C, 0x0775 }, { 0x0E6D1, 0x06DD }, { 0x0EDAE, 0x0376 }, { 0x0F124, 0x05F7 }, { 0x0F71B, 0x0787 },
66 	{ 0x10001, 0x02D6 }, { 0x102D7, 0x06A3 }, { 0x1097A, 0x099F }, { 0x11319, 0x0361 }, { 0x1167A, 0x0489 },
67 	{ 0x11B03, 0x0437 }, { 0x11F3A, 0x084D }, { 0x12787, 0x0199 }, { 0x12920, 0x09A7 }, { 0x132C7, 0x037A }
68 };
69 static const ScummNESFile::Resource res_roomgfx_swe[40] = {
70 	{ 0x04001, 0x03F0 }, { 0x043F1, 0x069E }, { 0x04A8F, 0x0327 }, { 0x04DB6, 0x053B }, { 0x052F1, 0x06BE },
71 	{ 0x059AF, 0x0682 }, { 0x06031, 0x0778 }, { 0x067A9, 0x0517 }, { 0x06CC0, 0x07FB }, { 0x074BB, 0x07BE },
72 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x07E2 }, { 0x09B4F, 0x0791 },
73 	{ 0x0A2E0, 0x07B5 }, { 0x0AA95, 0x0515 }, { 0x0AFAA, 0x0799 }, { 0x0B743, 0x04BF }, { 0x0BC02, 0x0319 },
74 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x072C }, { 0x0CB91, 0x0827 }, { 0x0D3B8, 0x0515 }, { 0x0D8CD, 0x064E },
75 	{ 0x0DF1B, 0x0775 }, { 0x0E690, 0x06DD }, { 0x0ED6D, 0x0376 }, { 0x0F0E3, 0x05F7 }, { 0x0F6DA, 0x0791 },
76 	{ 0x07C79, 0x02D6 }, { 0x10001, 0x06A3 }, { 0x106A4, 0x0921 }, { 0x10FC5, 0x0361 }, { 0x11326, 0x0489 },
77 	{ 0x117AF, 0x0437 }, { 0x11BE6, 0x084F }, { 0x12435, 0x0199 }, { 0x125CE, 0x0947 }, { 0x12F15, 0x037A }
78 };
79 static const ScummNESFile::Resource res_roomgfx_fra[40] = {
80 	{ 0x04001, 0x0426 }, { 0x04427, 0x069E }, { 0x04AC5, 0x0327 }, { 0x04DEC, 0x053B }, { 0x05327, 0x06BE },
81 	{ 0x059E5, 0x0682 }, { 0x06067, 0x0778 }, { 0x067DF, 0x0517 }, { 0x06CF6, 0x07FB }, { 0x074F1, 0x07BE },
82 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x07E2 }, { 0x09B4F, 0x0791 },
83 	{ 0x0A2E0, 0x07B5 }, { 0x0AA95, 0x0515 }, { 0x0AFAA, 0x0799 }, { 0x0B743, 0x04BB }, { 0x0BBFE, 0x0319 },
84 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x072C }, { 0x0CB91, 0x0827 }, { 0x0D3B8, 0x0515 }, { 0x0D8CD, 0x064E },
85 	{ 0x0DF1B, 0x0775 }, { 0x0E690, 0x06DD }, { 0x0ED6D, 0x0376 }, { 0x0F0E3, 0x05F7 }, { 0x0F6DA, 0x0787 },
86 	{ 0x10001, 0x02D6 }, { 0x102D7, 0x06A3 }, { 0x1097A, 0x0921 }, { 0x1129B, 0x0361 }, { 0x115FC, 0x0489 },
87 	{ 0x11A85, 0x0437 }, { 0x11EBC, 0x070D }, { 0x07CAF, 0x0199 }, { 0x125C9, 0x0947 }, { 0x12F10, 0x037A }
88 };
89 static const ScummNESFile::Resource res_roomgfx_ger[40] = {
90 	{ 0x04001, 0x0406 }, { 0x04407, 0x069E }, { 0x04AA5, 0x0327 }, { 0x04DCC, 0x053B }, { 0x05307, 0x06BE },
91 	{ 0x059C5, 0x0682 }, { 0x06047, 0x0778 }, { 0x067BF, 0x0517 }, { 0x06CD6, 0x07FB }, { 0x074D1, 0x07BE },
92 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x07E2 }, { 0x09B4F, 0x0791 },
93 	{ 0x0A2E0, 0x07B5 }, { 0x0AA95, 0x0515 }, { 0x0AFAA, 0x0799 }, { 0x0B743, 0x04BB }, { 0x0BBFE, 0x0319 },
94 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x072C }, { 0x0CB91, 0x0827 }, { 0x0D3B8, 0x0515 }, { 0x0D8CD, 0x064E },
95 	{ 0x0DF1B, 0x0775 }, { 0x0E690, 0x06DD }, { 0x0ED6D, 0x0376 }, { 0x0F0E3, 0x05F7 }, { 0x0F6DA, 0x0787 },
96 	{ 0x07C8F, 0x02D6 }, { 0x10001, 0x06A3 }, { 0x106A4, 0x0921 }, { 0x10FC5, 0x0361 }, { 0x11326, 0x0489 },
97 	{ 0x117AF, 0x0437 }, { 0x11BE6, 0x07A0 }, { 0x12386, 0x0199 }, { 0x1251F, 0x0947 }, { 0x12E66, 0x037A }
98 };
99 static const ScummNESFile::Resource res_roomgfx_esp[40] = {
100 	{ 0x04001, 0x041B }, { 0x0441C, 0x069E }, { 0x04ABA, 0x0327 }, { 0x04DE1, 0x053B }, { 0x0531C, 0x06BE },
101 	{ 0x059DA, 0x0682 }, { 0x0605C, 0x0778 }, { 0x067D4, 0x0517 }, { 0x06CEB, 0x07FB }, { 0x074E6, 0x07BE },
102 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x07E2 }, { 0x09B4F, 0x0791 },
103 	{ 0x0A2E0, 0x07B5 }, { 0x0AA95, 0x0515 }, { 0x0AFAA, 0x0799 }, { 0x0B743, 0x04B9 }, { 0x0BBFC, 0x0319 },
104 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x072C }, { 0x0CB91, 0x0827 }, { 0x0D3B8, 0x0515 }, { 0x0D8CD, 0x064E },
105 	{ 0x0DF1B, 0x0775 }, { 0x0E690, 0x06DD }, { 0x0ED6D, 0x0376 }, { 0x0F0E3, 0x05F7 }, { 0x0F6DA, 0x078D },
106 	{ 0x07CA4, 0x02D6 }, { 0x10001, 0x06A3 }, { 0x106A4, 0x091F }, { 0x10FC3, 0x0361 }, { 0x11324, 0x0489 },
107 	{ 0x117AD, 0x0437 }, { 0x11BE4, 0x086E }, { 0x12452, 0x0199 }, { 0x125EB, 0x0947 }, { 0x12F32, 0x037A }
108 };
109 static const ScummNESFile::Resource res_roomgfx_ita[40] = {
110 	{ 0x04001, 0x03EF }, { 0x043F0, 0x069E }, { 0x04A8E, 0x0327 }, { 0x04DB5, 0x053B }, { 0x052F0, 0x06BE },
111 	{ 0x059AE, 0x0682 }, { 0x06030, 0x0778 }, { 0x067A8, 0x0517 }, { 0x06CBF, 0x07FB }, { 0x074BA, 0x07BE },
112 	{ 0x08001, 0x07A5 }, { 0x087A6, 0x06DD }, { 0x08E83, 0x04EA }, { 0x0936D, 0x07E2 }, { 0x09B4F, 0x0791 },
113 	{ 0x0A2E0, 0x07B5 }, { 0x0AA95, 0x0515 }, { 0x0AFAA, 0x0799 }, { 0x0B743, 0x04BB }, { 0x0BBFE, 0x0319 },
114 	{ 0x0C001, 0x0464 }, { 0x0C465, 0x072C }, { 0x0CB91, 0x0827 }, { 0x0D3B8, 0x0515 }, { 0x0D8CD, 0x064E },
115 	{ 0x0DF1B, 0x0775 }, { 0x0E690, 0x06DD }, { 0x0ED6D, 0x0376 }, { 0x0F0E3, 0x05F7 }, { 0x0F6DA, 0x0787 },
116 	{ 0x07C78, 0x02D6 }, { 0x10001, 0x06A3 }, { 0x106A4, 0x0921 }, { 0x10FC5, 0x0361 }, { 0x11326, 0x0489 },
117 	{ 0x117AF, 0x0437 }, { 0x11BE6, 0x0863 }, { 0x12449, 0x0199 }, { 0x125E2, 0x0947 }, { 0x12F29, 0x037A }
118 };
119 
120 const ScummNESFile::ResourceGroup res_roomgfx = {
121 	ScummNESFile::NES_ROOMGFX,
122 	{
123 	res_roomgfx_usa,
124 	res_roomgfx_eur,
125 	res_roomgfx_swe,
126 	res_roomgfx_fra,
127 	res_roomgfx_ger,
128 	res_roomgfx_esp,
129 	res_roomgfx_ita,
130 	}
131 };
132 
133 static const ScummNESFile::Resource res_costumegfx_usa[2] = { { 0x30001, 0x0EB8 }, { 0x2F9F1, 0x0340 } };
134 static const ScummNESFile::Resource res_costumegfx_eur[2] = { { 0x30001, 0x0EB8 }, { 0x2F9F1, 0x0340 } };
135 static const ScummNESFile::Resource res_costumegfx_swe[2] = { { 0x2EFE1, 0x0EB8 }, { 0x30001, 0x0340 } };
136 static const ScummNESFile::Resource res_costumegfx_fra[2] = { { 0x30001, 0x0EB8 }, { 0x2F608, 0x0340 } };
137 static const ScummNESFile::Resource res_costumegfx_ger[2] = { { 0x30001, 0x0EB8 }, { 0x2F4CE, 0x0340 } };
138 static const ScummNESFile::Resource res_costumegfx_esp[2] = { { 0x30001, 0x0EB8 }, { 0x2F0F6, 0x0340 } };
139 static const ScummNESFile::Resource res_costumegfx_ita[2] = { { 0x30001, 0x0EB8 }, { 0x2F4A0, 0x0340 } };
140 
141 const ScummNESFile::ResourceGroup res_costumegfx = {
142 	ScummNESFile::NES_COSTUMEGFX,
143 	{
144 	res_costumegfx_usa,
145 	res_costumegfx_eur,
146 	res_costumegfx_swe,
147 	res_costumegfx_fra,
148 	res_costumegfx_ger,
149 	res_costumegfx_esp,
150 	res_costumegfx_ita,
151 	}
152 };
153 
154 static const ScummNESFile::Resource res_rooms_usa[55] = {
155 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D0C }, { 0x134A8, 0x04B3 }, { 0x15397, 0x0849 }, { 0x15C68, 0x0685 },
156 	{ 0x16381, 0x0715 }, { 0x1395B, 0x04E7 }, { 0x16CE8, 0x0AC0 }, { 0x18001, 0x06BA }, { 0x17AED, 0x03CB },
157 	{ 0x18BE7, 0x0663 }, { 0x192A6, 0x0580 }, { 0x19A44, 0x0443 }, { 0x1A106, 0x0563 }, { 0x1A669, 0x0446 },
158 	{ 0x1AAAF, 0x03A7 }, { 0x1AE56, 0x07E3 }, { 0x1B699, 0x0692 }, { 0x1C001, 0x0B49 }, { 0x1CD09, 0x04C6 },
159 	{ 0x1D4C2, 0x0568 }, { 0x1DF6C, 0x0514 }, { 0x1E8FA, 0x05CC }, { 0x1EF83, 0x0389 }, { 0x1F5E4, 0x0723 },
160 	{ 0x20001, 0x049A }, { 0x20511, 0x04F8 }, { 0x21666, 0x05CB }, { 0x21DD6, 0x046B }, { 0x222F0, 0x0460 },
161 	{ 0x227B6, 0x0909 }, { 0x24001, 0x0366 }, { 0x23BDF, 0x03CA }, { 0x247DB, 0x050D }, { 0x25ACF, 0x0346 },
162 	{ 0x1BDBD, 0x01CA }, { 0x25E15, 0x0457 }, { 0x2626C, 0x0547 }, { 0x267B3, 0x064A }, { 0x1FD72, 0x024B },
163 	{ 0x2739A, 0x01FA }, { 0x2766D, 0x0219 }, { 0x28001, 0x02F4 }, { 0x284D6, 0x045C }, { 0x289A3, 0x09CF },
164 	{ 0x293C6, 0x05A0 }, { 0x27B65, 0x0201 }, { 0x2ADD1, 0x0325 }, { 0x2B339, 0x01FC }, { 0x2B535, 0x02A9 },
165 	{ 0x2B7DE, 0x02DE }, { 0x2C001, 0x03CE }, { 0x2BBC0, 0x0205 }, { 0x2C53A, 0x0170 }, { 0x13E42, 0x0169 }
166 };
167 static const ScummNESFile::Resource res_rooms_eur[55] = {
168 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D0C }, { 0x13641, 0x04B3 }, { 0x15397, 0x0849 }, { 0x15C68, 0x0685 },
169 	{ 0x16381, 0x0715 }, { 0x16CE8, 0x04E7 }, { 0x18001, 0x0ABF }, { 0x171CF, 0x06BA }, { 0x13AF4, 0x03D2 },
170 	{ 0x18E1A, 0x0663 }, { 0x194D9, 0x04A9 }, { 0x19BA0, 0x0443 }, { 0x1A262, 0x047C }, { 0x1A6DE, 0x0446 },
171 	{ 0x1AB24, 0x03A7 }, { 0x1AECB, 0x07E3 }, { 0x1B70E, 0x0692 }, { 0x1C001, 0x0ACA }, { 0x1CC8A, 0x04C6 },
172 	{ 0x1D443, 0x0568 }, { 0x1DEED, 0x0514 }, { 0x1E87B, 0x05CC }, { 0x1EF04, 0x0389 }, { 0x1F565, 0x0723 },
173 	{ 0x20001, 0x049A }, { 0x20511, 0x04F8 }, { 0x21666, 0x05D5 }, { 0x21DE0, 0x046B }, { 0x222FA, 0x0460 },
174 	{ 0x227C0, 0x0909 }, { 0x24001, 0x0366 }, { 0x247DB, 0x03CA }, { 0x24BA5, 0x050D }, { 0x23BE9, 0x0346 },
175 	{ 0x17DB5, 0x01CA }, { 0x25E99, 0x0457 }, { 0x262F0, 0x0547 }, { 0x26837, 0x064A }, { 0x1FCF3, 0x024B },
176 	{ 0x2741E, 0x01FA }, { 0x276F1, 0x0219 }, { 0x28001, 0x02F4 }, { 0x284D6, 0x045C }, { 0x289A3, 0x09CF },
177 	{ 0x293C6, 0x05A0 }, { 0x27BE9, 0x0201 }, { 0x2ADE3, 0x0325 }, { 0x2B34B, 0x01FC }, { 0x2B547, 0x02A9 },
178 	{ 0x2B7F0, 0x02DE }, { 0x2C001, 0x03CE }, { 0x2BBD2, 0x0205 }, { 0x2C53A, 0x0170 }, { 0x2BDD7, 0x0169 }
179 };
180 static const ScummNESFile::Resource res_rooms_swe[55] = {
181 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D12 }, { 0x1328F, 0x04B3 }, { 0x15367, 0x0859 }, { 0x13742, 0x0694 },
182 	{ 0x15C45, 0x0707 }, { 0x1658F, 0x04E0 }, { 0x16A6F, 0x0AC8 }, { 0x18001, 0x06C7 }, { 0x1789C, 0x03EA },
183 	{ 0x18C09, 0x0649 }, { 0x192AE, 0x04AB }, { 0x19982, 0x0447 }, { 0x1A04D, 0x047E }, { 0x1A4CB, 0x0444 },
184 	{ 0x1A90F, 0x03B9 }, { 0x1ACC8, 0x07E9 }, { 0x1B511, 0x06A4 }, { 0x1C001, 0x0B1A }, { 0x1CCFD, 0x0486 },
185 	{ 0x1D482, 0x0579 }, { 0x1DF61, 0x051E }, { 0x1E8EC, 0x05CF }, { 0x1EF73, 0x0398 }, { 0x1F5F0, 0x071A },
186 	{ 0x20001, 0x049C }, { 0x2051E, 0x051E }, { 0x21725, 0x05D5 }, { 0x21EA5, 0x047F }, { 0x223D1, 0x0460 },
187 	{ 0x22897, 0x090D }, { 0x24001, 0x0378 }, { 0x247C9, 0x03CA }, { 0x24B93, 0x050D }, { 0x25267, 0x0346 },
188 	{ 0x17CD0, 0x01CA }, { 0x255AD, 0x0453 }, { 0x25A00, 0x053E }, { 0x25F3E, 0x0647 }, { 0x1BC49, 0x024B },
189 	{ 0x26B58, 0x01FA }, { 0x26E27, 0x0217 }, { 0x27345, 0x02F4 }, { 0x27829, 0x045C }, { 0x28001, 0x098A },
190 	{ 0x289DF, 0x05A1 }, { 0x2A442, 0x0201 }, { 0x2A6E9, 0x0325 }, { 0x1FD75, 0x01FC }, { 0x2AC64, 0x02A9 },
191 	{ 0x2AF0D, 0x02D1 }, { 0x2B2E6, 0x03CC }, { 0x23D61, 0x0205 }, { 0x2B818, 0x0168 }, { 0x27CF6, 0x0169 }
192 };
193 static const ScummNESFile::Resource res_rooms_fra[55] = {
194 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D76 }, { 0x1328A, 0x04C6 }, { 0x15451, 0x0885 }, { 0x13750, 0x0693 },
195 	{ 0x15D68, 0x0709 }, { 0x166D4, 0x0528 }, { 0x16BFC, 0x0ACC }, { 0x18001, 0x06E2 }, { 0x17A63, 0x03E5 },
196 	{ 0x18C3B, 0x066A }, { 0x19301, 0x049E }, { 0x199C8, 0x044B }, { 0x1A0B1, 0x0478 }, { 0x1A529, 0x043F },
197 	{ 0x1A968, 0x03C8 }, { 0x1AD30, 0x086F }, { 0x1B5FF, 0x069B }, { 0x1C001, 0x0AA9 }, { 0x1CC97, 0x049E },
198 	{ 0x1D42C, 0x05A8 }, { 0x1DF71, 0x054E }, { 0x1E9D1, 0x0606 }, { 0x1F0A2, 0x039A }, { 0x1F74E, 0x071C },
199 	{ 0x20001, 0x04B5 }, { 0x2052E, 0x04FF }, { 0x2172E, 0x05DB }, { 0x21EAD, 0x0489 }, { 0x223E1, 0x0465 },
200 	{ 0x228AC, 0x0957 }, { 0x24001, 0x037E }, { 0x2481A, 0x03CA }, { 0x24BE4, 0x050D }, { 0x252C0, 0x0346 },
201 	{ 0x1BD30, 0x01CA }, { 0x25606, 0x046D }, { 0x25A73, 0x055A }, { 0x25FCD, 0x0654 }, { 0x26C98, 0x024B },
202 	{ 0x26EE3, 0x01FA }, { 0x271DD, 0x0217 }, { 0x27713, 0x02F4 }, { 0x28001, 0x045C }, { 0x284CE, 0x0975 },
203 	{ 0x28E97, 0x05E6 }, { 0x27C3A, 0x0201 }, { 0x2A9D6, 0x0325 }, { 0x2AF88, 0x01FC }, { 0x2B184, 0x02A9 },
204 	{ 0x2B42D, 0x02DF }, { 0x2B818, 0x03EC }, { 0x2BD67, 0x0209 }, { 0x2C001, 0x0168 }, { 0x2C4BF, 0x0169 }
205 };
206 static const ScummNESFile::Resource res_rooms_ger[55] = {
207 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D63 }, { 0x131E0, 0x04A9 }, { 0x13689, 0x086B }, { 0x15421, 0x06A8 },
208 	{ 0x15B5D, 0x0731 }, { 0x16507, 0x0501 }, { 0x16A08, 0x0AE9 }, { 0x18001, 0x06DA }, { 0x17880, 0x03D0 },
209 	{ 0x18C7B, 0x0651 }, { 0x19328, 0x04A7 }, { 0x199FE, 0x0447 }, { 0x1A0F1, 0x0486 }, { 0x1A577, 0x045D },
210 	{ 0x1A9D4, 0x03AE }, { 0x1AD82, 0x0840 }, { 0x1B622, 0x06C3 }, { 0x1C001, 0x0B07 }, { 0x1CD05, 0x0494 },
211 	{ 0x1D4A5, 0x05AC }, { 0x1DFD6, 0x0524 }, { 0x1E9C0, 0x05F7 }, { 0x1F09A, 0x038E }, { 0x1F75F, 0x0733 },
212 	{ 0x20001, 0x04A9 }, { 0x2052A, 0x052E }, { 0x2177C, 0x0621 }, { 0x21F57, 0x0495 }, { 0x2249A, 0x045E },
213 	{ 0x2295E, 0x0951 }, { 0x24001, 0x036E }, { 0x247F9, 0x03CA }, { 0x24BC3, 0x050D }, { 0x252A8, 0x0346 },
214 	{ 0x17CA2, 0x01CA }, { 0x255EE, 0x046F }, { 0x25A5D, 0x054D }, { 0x25FAA, 0x064B }, { 0x26BE2, 0x024B },
215 	{ 0x26E2D, 0x01FA }, { 0x2710F, 0x0217 }, { 0x27663, 0x02F4 }, { 0x28001, 0x045C }, { 0x284CE, 0x0A8F },
216 	{ 0x28FB1, 0x05FF }, { 0x27B69, 0x0201 }, { 0x2AAA9, 0x0325 }, { 0x1BD7C, 0x01FC }, { 0x2B031, 0x02A9 },
217 	{ 0x2B2DA, 0x02D8 }, { 0x2B6D2, 0x03D2 }, { 0x2BC0D, 0x020D }, { 0x2C001, 0x0168 }, { 0x27E11, 0x0169 }
218 };
219 static const ScummNESFile::Resource res_rooms_esp[55] = {
220 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D05 }, { 0x132AC, 0x04B0 }, { 0x153AB, 0x087B }, { 0x1375C, 0x06B3 },
221 	{ 0x15CB1, 0x0729 }, { 0x16625, 0x04F0 }, { 0x16B15, 0x0AD4 }, { 0x18001, 0x06ED }, { 0x17936, 0x03DE },
222 	{ 0x18C3E, 0x0671 }, { 0x1930B, 0x04C4 }, { 0x199EC, 0x0452 }, { 0x1A0DA, 0x048F }, { 0x1A569, 0x0449 },
223 	{ 0x1A9B2, 0x03A8 }, { 0x1AD5A, 0x0846 }, { 0x1B600, 0x0686 }, { 0x1C001, 0x0B58 }, { 0x1CD42, 0x049C },
224 	{ 0x1D4ED, 0x0586 }, { 0x1DFE9, 0x0526 }, { 0x1E9C9, 0x05CE }, { 0x1F04B, 0x0390 }, { 0x1F6CA, 0x073C },
225 	{ 0x20001, 0x04CB }, { 0x20543, 0x0530 }, { 0x2171B, 0x05FC }, { 0x21EBE, 0x0470 }, { 0x223DC, 0x045C },
226 	{ 0x2289E, 0x0928 }, { 0x24001, 0x036C }, { 0x247EC, 0x03CA }, { 0x24BB6, 0x050D }, { 0x25283, 0x0346 },
227 	{ 0x17D60, 0x01CA }, { 0x255C9, 0x0462 }, { 0x25A2B, 0x055C }, { 0x25F87, 0x0659 }, { 0x1BD19, 0x024B },
228 	{ 0x26B8A, 0x01F7 }, { 0x26E5D, 0x0217 }, { 0x2736A, 0x02F4 }, { 0x27845, 0x045C }, { 0x28001, 0x0969 },
229 	{ 0x289BE, 0x058E }, { 0x2A418, 0x0201 }, { 0x2A6BE, 0x0325 }, { 0x23D84, 0x01FC }, { 0x2AC46, 0x02A9 },
230 	{ 0x2AEEF, 0x02C9 }, { 0x2B2C0, 0x03D2 }, { 0x27D12, 0x0207 }, { 0x2B7FC, 0x0168 }, { 0x2BD06, 0x0169 }
231 };
232 static const ScummNESFile::Resource res_rooms_ita[55] = {
233 	{ 0x00000, 0x0000 }, { 0x14001, 0x0D70 }, { 0x132A3, 0x04EA }, { 0x15423, 0x086E }, { 0x1378D, 0x06B1 },
234 	{ 0x15D16, 0x070F }, { 0x16658, 0x04DB }, { 0x16B33, 0x0AEF }, { 0x18001, 0x06DF }, { 0x17991, 0x03E1 },
235 	{ 0x18C5C, 0x065E }, { 0x19316, 0x04AF }, { 0x199EA, 0x0448 }, { 0x1A09D, 0x0479 }, { 0x1A516, 0x0445 },
236 	{ 0x1A95B, 0x03A7 }, { 0x1AD02, 0x0826 }, { 0x1B588, 0x0693 }, { 0x1C001, 0x0B92 }, { 0x1CD70, 0x0484 },
237 	{ 0x1D4E3, 0x0598 }, { 0x1DFCB, 0x0538 }, { 0x1E9C9, 0x05D1 }, { 0x1F052, 0x0394 }, { 0x1F70D, 0x0741 },
238 	{ 0x20001, 0x04C2 }, { 0x2053F, 0x0528 }, { 0x21718, 0x05F6 }, { 0x21EB5, 0x0486 }, { 0x223E8, 0x048C },
239 	{ 0x228DA, 0x093A }, { 0x24001, 0x037A }, { 0x247EE, 0x03CA }, { 0x24BB8, 0x050D }, { 0x25289, 0x0346 },
240 	{ 0x1BCAC, 0x01CA }, { 0x255CF, 0x045F }, { 0x25A2E, 0x0552 }, { 0x25F80, 0x0651 }, { 0x26B93, 0x024B },
241 	{ 0x26DDE, 0x01FA }, { 0x270D6, 0x0217 }, { 0x275E4, 0x02F4 }, { 0x28001, 0x045C }, { 0x284CE, 0x08BD },
242 	{ 0x28DDF, 0x05DF }, { 0x27AC9, 0x0201 }, { 0x2A8A3, 0x0325 }, { 0x27D6F, 0x01FC }, { 0x2AE66, 0x02A9 },
243 	{ 0x2B10F, 0x02E7 }, { 0x2B4F9, 0x03DE }, { 0x2BA31, 0x0206 }, { 0x2C001, 0x0168 }, { 0x17DC0, 0x0169 }
244 };
245 
246 const ScummNESFile::ResourceGroup res_rooms = {
247 	ScummNESFile::NES_ROOM,
248 	{
249 	res_rooms_usa,
250 	res_rooms_eur,
251 	res_rooms_swe,
252 	res_rooms_fra,
253 	res_rooms_ger,
254 	res_rooms_esp,
255 	res_rooms_ita,
256 	}
257 };
258 
259 static const ScummNESFile::Resource res_scripts_usa[179] = {
260 	{ 0x00000, 0x0000 }, { 0x29966, 0x044D }, { 0x29DB3, 0x0207 }, { 0x29FBA, 0x009F }, { 0x2A059, 0x03F4 },
261 	{ 0x2A44D, 0x01A1 }, { 0x00000, 0x0000 }, { 0x2A5EE, 0x004A }, { 0x00000, 0x0000 }, { 0x2A638, 0x0005 },
262 	{ 0x2C6AA, 0x000D }, { 0x2C6B7, 0x000D }, { 0x186BB, 0x0040 }, { 0x186FB, 0x0016 }, { 0x1B639, 0x0046 },
263 	{ 0x1EEC6, 0x00BD }, { 0x21C31, 0x0055 }, { 0x177A8, 0x0027 }, { 0x1FD07, 0x0027 }, { 0x1FD2E, 0x0027 },
264 	{ 0x1BD2B, 0x0022 }, { 0x15BE0, 0x0088 }, { 0x22241, 0x0020 }, { 0x22261, 0x008F }, { 0x1924A, 0x002B },
265 	{ 0x1CB4A, 0x0061 }, { 0x1CBAB, 0x003C }, { 0x1CBE7, 0x0042 }, { 0x1CC29, 0x004F }, { 0x2049B, 0x0076 },
266 	{ 0x16A96, 0x0035 }, { 0x16ACB, 0x001C }, { 0x16AE7, 0x0014 }, { 0x16AFB, 0x001C }, { 0x16B17, 0x0027 },
267 	{ 0x16B3E, 0x01AA }, { 0x1D1CF, 0x0096 }, { 0x1D265, 0x010E }, { 0x1D373, 0x001C }, { 0x1D38F, 0x0056 },
268 	{ 0x1D3E5, 0x0072 }, { 0x1E480, 0x0028 }, { 0x1E4A8, 0x017D }, { 0x1E625, 0x0229 }, { 0x28932, 0x0071 },
269 	{ 0x17EB8, 0x004D }, { 0x162ED, 0x0039 }, { 0x18711, 0x028B }, { 0x1899C, 0x00BB }, { 0x18A57, 0x018B },
270 	{ 0x00000, 0x0000 }, { 0x19E87, 0x00ED }, { 0x21C86, 0x00F6 }, { 0x1E84E, 0x009B }, { 0x21D7C, 0x0047 },
271 	{ 0x2C6C4, 0x004D }, { 0x16326, 0x0024 }, { 0x14D0D, 0x0014 }, { 0x177CF, 0x0059 }, { 0x17828, 0x0109 },
272 	{ 0x17931, 0x0009 }, { 0x14D21, 0x01B6 }, { 0x2B0F6, 0x0243 }, { 0x230BF, 0x067F }, { 0x2C711, 0x001C },
273 	{ 0x2C72D, 0x001A }, { 0x2C747, 0x0021 }, { 0x2C768, 0x0024 }, { 0x2C78C, 0x0017 }, { 0x2C7A3, 0x0017 },
274 	{ 0x2C7BA, 0x0014 }, { 0x2C7CE, 0x0024 }, { 0x00000, 0x0000 }, { 0x2C7F2, 0x0011 }, { 0x1793A, 0x009D },
275 	{ 0x22750, 0x0066 }, { 0x14ED7, 0x0075 }, { 0x1F30C, 0x0120 }, { 0x1FD55, 0x001D }, { 0x1F42C, 0x008F },
276 	{ 0x1F4BB, 0x0097 }, { 0x179D7, 0x006A }, { 0x17A41, 0x0030 }, { 0x1F552, 0x0092 }, { 0x2C803, 0x00CC },
277 	{ 0x2C8CF, 0x00BA }, { 0x2C989, 0x0088 }, { 0x20A09, 0x01B0 }, { 0x20BB9, 0x0168 }, { 0x20D21, 0x006C },
278 	{ 0x20D8D, 0x0037 }, { 0x20DC4, 0x00E4 }, { 0x20EA8, 0x0045 }, { 0x20EED, 0x00E1 }, { 0x20FCE, 0x00F6 },
279 	{ 0x210C4, 0x0141 }, { 0x21205, 0x0183 }, { 0x21388, 0x0034 }, { 0x213BC, 0x00A9 }, { 0x24367, 0x011B },
280 	{ 0x1BD4D, 0x0070 }, { 0x1CC78, 0x0091 }, { 0x29372, 0x0054 }, { 0x19F74, 0x00CE }, { 0x1A042, 0x0077 },
281 	{ 0x14F4C, 0x0057 }, { 0x27886, 0x02DF }, { 0x1DA2A, 0x0219 }, { 0x1DC43, 0x00F9 }, { 0x1DD3C, 0x0056 },
282 	{ 0x1DD92, 0x01C2 }, { 0x14FA3, 0x004D }, { 0x27594, 0x00D9 }, { 0x21DC3, 0x0013 }, { 0x2A63D, 0x00F0 },
283 	{ 0x24482, 0x00E7 }, { 0x21465, 0x00F2 }, { 0x24569, 0x002B }, { 0x2C3CF, 0x010F }, { 0x24594, 0x00AA },
284 	{ 0x24CE8, 0x0DAB }, { 0x1B67F, 0x000D }, { 0x1B68C, 0x000D }, { 0x2373E, 0x017C }, { 0x282F5, 0x01E1 },
285 	{ 0x238BA, 0x0153 }, { 0x23A0D, 0x019C }, { 0x23BA9, 0x0016 }, { 0x2C4DE, 0x005C }, { 0x23BBF, 0x0020 },
286 	{ 0x27D66, 0x00A5 }, { 0x2A72D, 0x034D }, { 0x14FF0, 0x00E3 }, { 0x2BABC, 0x005F }, { 0x00000, 0x0000 },
287 	{ 0x25A93, 0x003C }, { 0x1E8E9, 0x0011 }, { 0x1634A, 0x0018 }, { 0x26DFD, 0x001F }, { 0x26E1C, 0x0054 },
288 	{ 0x26E70, 0x0149 }, { 0x26FB9, 0x004B }, { 0x27004, 0x017D }, { 0x27181, 0x0027 }, { 0x271A8, 0x0041 },
289 	{ 0x271E9, 0x01B1 }, { 0x16362, 0x001F }, { 0x2463E, 0x002A }, { 0x150D3, 0x019E }, { 0x19275, 0x0031 },
290 	{ 0x17A71, 0x007C }, { 0x21557, 0x00DC }, { 0x1D457, 0x0018 }, { 0x1D46F, 0x0053 }, { 0x18BE2, 0x0005 },
291 	{ 0x15271, 0x011B }, { 0x1538C, 0x000B }, { 0x24668, 0x0138 }, { 0x247A0, 0x0014 }, { 0x1DF54, 0x0018 },
292 	{ 0x247B4, 0x0027 }, { 0x1A0B9, 0x004D }, { 0x00000, 0x0000 }, { 0x2BB1B, 0x00A5 }, { 0x2AA7A, 0x00C1 },
293 	{ 0x2AB3B, 0x0140 }, { 0x19826, 0x00BF }, { 0x198E5, 0x014D }, { 0x19A32, 0x0012 }, { 0x2AC7B, 0x0005 },
294 	{ 0x2AC80, 0x0005 }, { 0x2AC85, 0x0005 }, { 0x2AC8A, 0x0005 }, { 0x2AC8F, 0x0005 }, { 0x21633, 0x0033 },
295 	{ 0x2AC94, 0x0005 }, { 0x00000, 0x0000 }, { 0x2AC99, 0x009C }, { 0x2AD35, 0x009C }
296 };
297 static const ScummNESFile::Resource res_scripts_eur[179] = {
298 	{ 0x00000, 0x0000 }, { 0x29966, 0x044D }, { 0x29DB3, 0x0207 }, { 0x29FBA, 0x009F }, { 0x2A059, 0x03F4 },
299 	{ 0x2A44D, 0x01A1 }, { 0x00000, 0x0000 }, { 0x2A5EE, 0x005C }, { 0x00000, 0x0000 }, { 0x2A64A, 0x0005 },
300 	{ 0x2C6AA, 0x000D }, { 0x2C6B7, 0x000D }, { 0x17889, 0x0040 }, { 0x178C9, 0x0016 }, { 0x1B6AE, 0x0046 },
301 	{ 0x1EE47, 0x00BD }, { 0x21C3B, 0x0055 }, { 0x18AC0, 0x0027 }, { 0x1FC88, 0x0027 }, { 0x1FCAF, 0x0027 },
302 	{ 0x1BDA0, 0x0022 }, { 0x15BE0, 0x0088 }, { 0x2224B, 0x0020 }, { 0x2226B, 0x008F }, { 0x1947D, 0x002B },
303 	{ 0x1CACB, 0x0061 }, { 0x1CB2C, 0x003C }, { 0x1CB68, 0x0042 }, { 0x1CBAA, 0x004F }, { 0x2049B, 0x0076 },
304 	{ 0x16A96, 0x0035 }, { 0x16ACB, 0x001C }, { 0x16AE7, 0x0014 }, { 0x16AFB, 0x001C }, { 0x16B17, 0x0027 },
305 	{ 0x16B3E, 0x01AA }, { 0x1D150, 0x0096 }, { 0x1D1E6, 0x010E }, { 0x1D2F4, 0x001C }, { 0x1D310, 0x0056 },
306 	{ 0x1D366, 0x0072 }, { 0x1E401, 0x0028 }, { 0x1E429, 0x017D }, { 0x1E5A6, 0x0229 }, { 0x28932, 0x0071 },
307 	{ 0x13EC6, 0x004D }, { 0x162ED, 0x0039 }, { 0x178DF, 0x028B }, { 0x17B6A, 0x00BB }, { 0x17C25, 0x018B },
308 	{ 0x00000, 0x0000 }, { 0x19FE3, 0x00ED }, { 0x21C90, 0x00F6 }, { 0x1E7CF, 0x009B }, { 0x21D86, 0x0047 },
309 	{ 0x2C6C4, 0x004D }, { 0x16326, 0x0024 }, { 0x14D0D, 0x0014 }, { 0x18AE7, 0x0059 }, { 0x18B40, 0x011E },
310 	{ 0x18C5E, 0x0009 }, { 0x14D21, 0x01B6 }, { 0x2B108, 0x0243 }, { 0x230C9, 0x067F }, { 0x2C711, 0x001C },
311 	{ 0x2C72D, 0x001A }, { 0x2C747, 0x0021 }, { 0x2C768, 0x0024 }, { 0x2C78C, 0x0017 }, { 0x2C7A3, 0x0017 },
312 	{ 0x2C7BA, 0x0014 }, { 0x2C7CE, 0x0024 }, { 0x00000, 0x0000 }, { 0x2C7F2, 0x0011 }, { 0x18C67, 0x009D },
313 	{ 0x2275A, 0x0066 }, { 0x14ED7, 0x0075 }, { 0x1F28D, 0x0120 }, { 0x1FCD6, 0x001D }, { 0x1F3AD, 0x008F },
314 	{ 0x1F43C, 0x0097 }, { 0x18D04, 0x006A }, { 0x18D6E, 0x0030 }, { 0x1F4D3, 0x0092 }, { 0x2C803, 0x00CC },
315 	{ 0x2C8CF, 0x00BA }, { 0x2C989, 0x0088 }, { 0x20A09, 0x01B0 }, { 0x20BB9, 0x0168 }, { 0x20D21, 0x006C },
316 	{ 0x20D8D, 0x0037 }, { 0x20DC4, 0x00E4 }, { 0x20EA8, 0x0045 }, { 0x20EED, 0x00E1 }, { 0x20FCE, 0x00F6 },
317 	{ 0x210C4, 0x0141 }, { 0x21205, 0x0183 }, { 0x21388, 0x0034 }, { 0x213BC, 0x00A9 }, { 0x24367, 0x011B },
318 	{ 0x1BDC2, 0x0070 }, { 0x1CBF9, 0x0091 }, { 0x29372, 0x0054 }, { 0x1A0D0, 0x00CE }, { 0x1A19E, 0x0077 },
319 	{ 0x14F4C, 0x0057 }, { 0x2790A, 0x02DF }, { 0x1D9AB, 0x0219 }, { 0x1DBC4, 0x00F9 }, { 0x1DCBD, 0x0056 },
320 	{ 0x1DD13, 0x01C2 }, { 0x14FA3, 0x004D }, { 0x27618, 0x00D9 }, { 0x21DCD, 0x0013 }, { 0x2A64F, 0x00F0 },
321 	{ 0x24482, 0x00E7 }, { 0x21465, 0x00F2 }, { 0x24569, 0x002B }, { 0x2C3CF, 0x010F }, { 0x24594, 0x00AA },
322 	{ 0x250B2, 0x0DAB }, { 0x1B6F4, 0x000D }, { 0x1B701, 0x000D }, { 0x23748, 0x017C }, { 0x282F5, 0x01E1 },
323 	{ 0x238C4, 0x0153 }, { 0x23A17, 0x019C }, { 0x23BB3, 0x0016 }, { 0x2C4DE, 0x005C }, { 0x23BC9, 0x0020 },
324 	{ 0x27DEA, 0x00A5 }, { 0x2A73F, 0x034D }, { 0x14FF0, 0x00E3 }, { 0x2BACE, 0x005F }, { 0x00000, 0x0000 },
325 	{ 0x25E5D, 0x003C }, { 0x1E86A, 0x0011 }, { 0x1634A, 0x0018 }, { 0x26E81, 0x001F }, { 0x26EA0, 0x0054 },
326 	{ 0x26EF4, 0x0149 }, { 0x2703D, 0x004B }, { 0x27088, 0x017D }, { 0x27205, 0x0027 }, { 0x2722C, 0x0041 },
327 	{ 0x2726D, 0x01B1 }, { 0x16362, 0x001F }, { 0x2463E, 0x002A }, { 0x150D3, 0x019E }, { 0x194A8, 0x0031 },
328 	{ 0x18D9E, 0x007C }, { 0x21557, 0x00DC }, { 0x1D3D8, 0x0018 }, { 0x1D3F0, 0x0053 }, { 0x17DB0, 0x0005 },
329 	{ 0x15271, 0x011B }, { 0x1538C, 0x000B }, { 0x24668, 0x0138 }, { 0x247A0, 0x0014 }, { 0x1DED5, 0x0018 },
330 	{ 0x247B4, 0x0027 }, { 0x1A215, 0x004D }, { 0x00000, 0x0000 }, { 0x2BB2D, 0x00A5 }, { 0x2AA8C, 0x00C1 },
331 	{ 0x2AB4D, 0x0140 }, { 0x19982, 0x00BF }, { 0x19A41, 0x014D }, { 0x19B8E, 0x0012 }, { 0x2AC8D, 0x0005 },
332 	{ 0x2AC92, 0x0005 }, { 0x2AC97, 0x0005 }, { 0x2AC9C, 0x0005 }, { 0x2ACA1, 0x0005 }, { 0x21633, 0x0033 },
333 	{ 0x2ACA6, 0x0005 }, { 0x00000, 0x0000 }, { 0x2ACAB, 0x009C }, { 0x2AD47, 0x009C }
334 };
335 static const ScummNESFile::Resource res_scripts_swe[179] = {
336 	{ 0x00000, 0x0000 }, { 0x28F80, 0x043B }, { 0x293BB, 0x0209 }, { 0x295C4, 0x00AB }, { 0x2966F, 0x03FD },
337 	{ 0x29A6C, 0x01A1 }, { 0x00000, 0x0000 }, { 0x29C0D, 0x005C }, { 0x00000, 0x0000 }, { 0x29C69, 0x0005 },
338 	{ 0x2B980, 0x000D }, { 0x2B98D, 0x000D }, { 0x186C8, 0x0040 }, { 0x18708, 0x0016 }, { 0x1B4B1, 0x0046 },
339 	{ 0x1EEBB, 0x00B8 }, { 0x21CFA, 0x005C }, { 0x17537, 0x0027 }, { 0x1FD0A, 0x0027 }, { 0x1FD31, 0x0027 },
340 	{ 0x1BBB5, 0x0022 }, { 0x15BC0, 0x0085 }, { 0x22324, 0x001E }, { 0x22342, 0x008F }, { 0x19252, 0x002B },
341 	{ 0x1CB1B, 0x006D }, { 0x1CB88, 0x004C }, { 0x1CBD4, 0x0044 }, { 0x1CC18, 0x0053 }, { 0x2049D, 0x0081 },
342 	{ 0x1634C, 0x0035 }, { 0x16381, 0x001C }, { 0x1639D, 0x0014 }, { 0x163B1, 0x001C }, { 0x163CD, 0x0027 },
343 	{ 0x163F4, 0x019B }, { 0x1D183, 0x0094 }, { 0x1D217, 0x0117 }, { 0x1D32E, 0x001C }, { 0x1D34A, 0x0056 },
344 	{ 0x1D3A0, 0x0072 }, { 0x1E47F, 0x0028 }, { 0x1E4A7, 0x0175 }, { 0x1E61C, 0x022B }, { 0x27C85, 0x0071 },
345 	{ 0x17C86, 0x004A }, { 0x13DD6, 0x0039 }, { 0x1871E, 0x0270 }, { 0x1898E, 0x00C0 }, { 0x18A4E, 0x01B6 },
346 	{ 0x00000, 0x0000 }, { 0x19DC9, 0x00EE }, { 0x21D56, 0x00F5 }, { 0x1E847, 0x0094 }, { 0x21E4B, 0x0047 },
347 	{ 0x2B99A, 0x004D }, { 0x13E0F, 0x0024 }, { 0x14D13, 0x0014 }, { 0x1755E, 0x0054 }, { 0x175B2, 0x011A },
348 	{ 0x176CC, 0x0009 }, { 0x14D27, 0x01B9 }, { 0x2AA0E, 0x0256 }, { 0x231A4, 0x06D2 }, { 0x2B9E7, 0x001D },
349 	{ 0x2BA04, 0x0016 }, { 0x2BA1A, 0x002D }, { 0x2BA47, 0x0027 }, { 0x2BA6E, 0x0016 }, { 0x2BA84, 0x0014 },
350 	{ 0x2BA98, 0x0015 }, { 0x2BAAD, 0x0029 }, { 0x00000, 0x0000 }, { 0x2BAD6, 0x0010 }, { 0x176D5, 0x00A2 },
351 	{ 0x22831, 0x0066 }, { 0x14EE0, 0x0077 }, { 0x1F30B, 0x011A }, { 0x1FD58, 0x001D }, { 0x1F425, 0x0095 },
352 	{ 0x1F4BA, 0x009E }, { 0x17777, 0x006F }, { 0x177E6, 0x002F }, { 0x1F558, 0x0098 }, { 0x2BAE6, 0x00C4 },
353 	{ 0x2BBAA, 0x00AE }, { 0x2BC58, 0x0088 }, { 0x20A3C, 0x01BB }, { 0x20BF7, 0x0197 }, { 0x20D8E, 0x006E },
354 	{ 0x20DFC, 0x0028 }, { 0x20E24, 0x00EA }, { 0x20F0E, 0x0049 }, { 0x20F57, 0x00E7 }, { 0x2103E, 0x010C },
355 	{ 0x2114A, 0x0151 }, { 0x2129B, 0x01B0 }, { 0x2144B, 0x0034 }, { 0x2147F, 0x00A9 }, { 0x24379, 0x010E },
356 	{ 0x1BBD7, 0x0072 }, { 0x1CC6B, 0x0092 }, { 0x2898B, 0x0054 }, { 0x19EB7, 0x00D3 }, { 0x19F8A, 0x0077 },
357 	{ 0x14F57, 0x0057 }, { 0x2703E, 0x0307 }, { 0x1D9FB, 0x024F }, { 0x1DC4A, 0x00E4 }, { 0x1DD2E, 0x0059 },
358 	{ 0x1DD87, 0x01C2 }, { 0x14FAE, 0x004D }, { 0x26D52, 0x00D5 }, { 0x21E92, 0x0013 }, { 0x29C6E, 0x00F0 },
359 	{ 0x24487, 0x00E0 }, { 0x21528, 0x00F2 }, { 0x24567, 0x0023 }, { 0x2B6B2, 0x010B }, { 0x2458A, 0x00A1 },
360 	{ 0x250A0, 0x018B }, { 0x1B4F7, 0x000D }, { 0x1B504, 0x000D }, { 0x23876, 0x018E }, { 0x27639, 0x01F0 },
361 	{ 0x23A04, 0x017B }, { 0x23B7F, 0x01AC }, { 0x23D2B, 0x0016 }, { 0x2B7BD, 0x005B }, { 0x23D41, 0x0020 },
362 	{ 0x2A643, 0x00A6 }, { 0x29D5E, 0x0399 }, { 0x14FFB, 0x00D2 }, { 0x2B1DE, 0x0063 }, { 0x00000, 0x0000 },
363 	{ 0x2522B, 0x003C }, { 0x1E8DB, 0x0011 }, { 0x13E33, 0x0018 }, { 0x26585, 0x001F }, { 0x265A4, 0x0054 },
364 	{ 0x265F8, 0x017D }, { 0x26775, 0x004B }, { 0x267C0, 0x0165 }, { 0x26925, 0x0027 }, { 0x2694C, 0x0041 },
365 	{ 0x2698D, 0x01CB }, { 0x13E4B, 0x001F }, { 0x2462B, 0x002A }, { 0x150CD, 0x0187 }, { 0x1927D, 0x0031 },
366 	{ 0x17815, 0x0087 }, { 0x2161A, 0x00D8 }, { 0x1D412, 0x0018 }, { 0x1D42A, 0x0058 }, { 0x18C04, 0x0005 },
367 	{ 0x15254, 0x0108 }, { 0x1535C, 0x000B }, { 0x24655, 0x0139 }, { 0x2478E, 0x0014 }, { 0x1DF49, 0x0018 },
368 	{ 0x247A2, 0x0027 }, { 0x1A001, 0x004C }, { 0x00000, 0x0000 }, { 0x2B241, 0x00A5 }, { 0x2A0F7, 0x00B5 },
369 	{ 0x2A1AC, 0x0140 }, { 0x19759, 0x00CA }, { 0x19823, 0x014D }, { 0x19970, 0x0012 }, { 0x2A2EC, 0x0005 },
370 	{ 0x2A2F1, 0x0005 }, { 0x2A2F6, 0x0005 }, { 0x2A2FB, 0x0005 }, { 0x2A300, 0x0005 }, { 0x216F2, 0x0033 },
371 	{ 0x2A305, 0x0005 }, { 0x00000, 0x0000 }, { 0x2A30A, 0x009C }, { 0x2A3A6, 0x009C }
372 };
373 static const ScummNESFile::Resource res_scripts_fra[179] = {
374 	{ 0x00000, 0x0000 }, { 0x2947D, 0x0480 }, { 0x298FD, 0x0226 }, { 0x29B23, 0x0092 }, { 0x29BB5, 0x040C },
375 	{ 0x29FC1, 0x01A1 }, { 0x00000, 0x0000 }, { 0x2A162, 0x005C }, { 0x00000, 0x0000 }, { 0x2A1BE, 0x0005 },
376 	{ 0x2C169, 0x000D }, { 0x2C176, 0x000D }, { 0x186E3, 0x0040 }, { 0x18723, 0x0016 }, { 0x1B59F, 0x0046 },
377 	{ 0x1EFD7, 0x00CB }, { 0x21D09, 0x0054 }, { 0x176C8, 0x0027 }, { 0x1FE6A, 0x0027 }, { 0x1FE91, 0x0027 },
378 	{ 0x1BC9A, 0x0022 }, { 0x15CD6, 0x0092 }, { 0x22336, 0x001C }, { 0x22352, 0x008F }, { 0x192A5, 0x002B },
379 	{ 0x1CAAA, 0x0069 }, { 0x1CB13, 0x0054 }, { 0x1CB67, 0x0048 }, { 0x1CBAF, 0x0058 }, { 0x204B6, 0x0078 },
380 	{ 0x16471, 0x0035 }, { 0x164A6, 0x001C }, { 0x164C2, 0x0014 }, { 0x164D6, 0x001C }, { 0x164F2, 0x0027 },
381 	{ 0x16519, 0x01BB }, { 0x1D135, 0x008D }, { 0x1D1C2, 0x0119 }, { 0x1D2DB, 0x001C }, { 0x1D2F7, 0x0056 },
382 	{ 0x1D34D, 0x0072 }, { 0x1E4BF, 0x0028 }, { 0x1E4E7, 0x01E0 }, { 0x1E6C7, 0x0241 }, { 0x2845D, 0x0071 },
383 	{ 0x17E48, 0x004C }, { 0x13DE3, 0x0039 }, { 0x18739, 0x0296 }, { 0x189CF, 0x00C2 }, { 0x18A91, 0x01A5 },
384 	{ 0x00000, 0x0000 }, { 0x19E13, 0x00F3 }, { 0x21D5D, 0x00F6 }, { 0x1E908, 0x00B8 }, { 0x21E53, 0x0047 },
385 	{ 0x2C183, 0x004D }, { 0x13E1C, 0x0024 }, { 0x14D77, 0x0014 }, { 0x176EF, 0x0059 }, { 0x17748, 0x013F },
386 	{ 0x17887, 0x0009 }, { 0x14D8B, 0x01D4 }, { 0x2ACFB, 0x028D }, { 0x23203, 0x0779 }, { 0x2C1D0, 0x001B },
387 	{ 0x2C1EB, 0x001F }, { 0x2C20A, 0x0024 }, { 0x2C22E, 0x0019 }, { 0x2C247, 0x0018 }, { 0x2C25F, 0x001D },
388 	{ 0x2C27C, 0x0016 }, { 0x2C292, 0x0027 }, { 0x00000, 0x0000 }, { 0x2C2B9, 0x0011 }, { 0x17890, 0x00AA },
389 	{ 0x22846, 0x0066 }, { 0x14F5F, 0x0083 }, { 0x1F43C, 0x013A }, { 0x1FEB8, 0x001D }, { 0x1F576, 0x0098 },
390 	{ 0x1F60E, 0x009B }, { 0x1793A, 0x006E }, { 0x179A8, 0x0033 }, { 0x1F6A9, 0x00A5 }, { 0x2C2CA, 0x00BA },
391 	{ 0x2C384, 0x00AC }, { 0x2C430, 0x008F }, { 0x20A2D, 0x01BE }, { 0x20BEB, 0x0158 }, { 0x20D43, 0x0079 },
392 	{ 0x20DBC, 0x002B }, { 0x20DE7, 0x00E8 }, { 0x20ECF, 0x004A }, { 0x20F19, 0x0110 }, { 0x21029, 0x0136 },
393 	{ 0x2115F, 0x0152 }, { 0x212B1, 0x01B3 }, { 0x21464, 0x0032 }, { 0x21496, 0x00A9 }, { 0x2437F, 0x0133 },
394 	{ 0x1BCBC, 0x0074 }, { 0x1CC07, 0x0090 }, { 0x28E43, 0x0054 }, { 0x19F06, 0x00DB }, { 0x19FE1, 0x0080 },
395 	{ 0x14FE2, 0x0057 }, { 0x273F4, 0x031F }, { 0x1D9D4, 0x0238 }, { 0x1DC0C, 0x00FE }, { 0x1DD0A, 0x005A },
396 	{ 0x1DD64, 0x01F5 }, { 0x15039, 0x004D }, { 0x270DD, 0x0100 }, { 0x21E9A, 0x0013 }, { 0x2A1C3, 0x00F0 },
397 	{ 0x244B2, 0x00E4 }, { 0x2153F, 0x00EC }, { 0x24596, 0x0033 }, { 0x2BC04, 0x0108 }, { 0x245C9, 0x009F },
398 	{ 0x250F1, 0x0193 }, { 0x1B5E5, 0x000D }, { 0x1B5F2, 0x000D }, { 0x2397C, 0x0199 }, { 0x27A07, 0x0233 },
399 	{ 0x23B15, 0x0171 }, { 0x23C86, 0x01BC }, { 0x23E42, 0x0016 }, { 0x2BD0C, 0x005B }, { 0x23E58, 0x0020 },
400 	{ 0x27E3B, 0x00B9 }, { 0x2A2B3, 0x03D3 }, { 0x15086, 0x00E4 }, { 0x2B70C, 0x0067 }, { 0x00000, 0x0000 },
401 	{ 0x25284, 0x003C }, { 0x1E9C0, 0x0011 }, { 0x13E40, 0x0018 }, { 0x26621, 0x001F }, { 0x26640, 0x0054 },
402 	{ 0x26694, 0x0173 }, { 0x26807, 0x004B }, { 0x26852, 0x0190 }, { 0x269E2, 0x0027 }, { 0x26A09, 0x0041 },
403 	{ 0x26A4A, 0x024E }, { 0x13E58, 0x001F }, { 0x24668, 0x002A }, { 0x1516A, 0x01C9 }, { 0x192D0, 0x0031 },
404 	{ 0x179DB, 0x0088 }, { 0x2162B, 0x00D0 }, { 0x1D3BF, 0x0018 }, { 0x1D3D7, 0x0055 }, { 0x18C36, 0x0005 },
405 	{ 0x15333, 0x0113 }, { 0x15446, 0x000B }, { 0x24692, 0x014D }, { 0x247DF, 0x0014 }, { 0x1DF59, 0x0018 },
406 	{ 0x247F3, 0x0027 }, { 0x1A061, 0x0050 }, { 0x00000, 0x0000 }, { 0x2B773, 0x00A5 }, { 0x2A686, 0x00BA },
407 	{ 0x2A740, 0x0140 }, { 0x1979F, 0x00CA }, { 0x19869, 0x014D }, { 0x199B6, 0x0012 }, { 0x2A880, 0x0005 },
408 	{ 0x2A885, 0x0005 }, { 0x2A88A, 0x0005 }, { 0x2A88F, 0x0005 }, { 0x2A894, 0x0005 }, { 0x216FB, 0x0033 },
409 	{ 0x2A899, 0x0005 }, { 0x00000, 0x0000 }, { 0x2A89E, 0x009C }, { 0x2A93A, 0x009C }
410 };
411 static const ScummNESFile::Resource res_scripts_ger[179] = {
412 	{ 0x00000, 0x0000 }, { 0x295B0, 0x045A }, { 0x29A0A, 0x0218 }, { 0x29C22, 0x00B1 }, { 0x29CD3, 0x0408 },
413 	{ 0x2A0DB, 0x01A1 }, { 0x00000, 0x0000 }, { 0x2A27C, 0x005C }, { 0x00000, 0x0000 }, { 0x2A2D8, 0x0005 },
414 	{ 0x2C169, 0x000D }, { 0x2C176, 0x000D }, { 0x186DB, 0x0040 }, { 0x1871B, 0x0016 }, { 0x1B5C2, 0x0046 },
415 	{ 0x1EFB7, 0x00E3 }, { 0x21D9D, 0x0069 }, { 0x174F1, 0x0027 }, { 0x1FE92, 0x0027 }, { 0x1FEB9, 0x0027 },
416 	{ 0x1BCE5, 0x0022 }, { 0x13EF4, 0x0087 }, { 0x223EC, 0x001F }, { 0x2240B, 0x008F }, { 0x192CC, 0x002B },
417 	{ 0x1CB08, 0x006E }, { 0x1CB76, 0x004E }, { 0x1CBC4, 0x004D }, { 0x1CC11, 0x0059 }, { 0x204AA, 0x0080 },
418 	{ 0x1628E, 0x0035 }, { 0x162C3, 0x001C }, { 0x162DF, 0x0014 }, { 0x162F3, 0x001C }, { 0x1630F, 0x0027 },
419 	{ 0x16336, 0x01D1 }, { 0x1D199, 0x00A0 }, { 0x1D239, 0x011C }, { 0x1D355, 0x001C }, { 0x1D371, 0x0056 },
420 	{ 0x1D3C7, 0x0072 }, { 0x1E4FA, 0x0028 }, { 0x1E522, 0x019D }, { 0x1E6BF, 0x023B }, { 0x2845D, 0x0071 },
421 	{ 0x17C50, 0x0052 }, { 0x15AC9, 0x0039 }, { 0x18731, 0x02E7 }, { 0x18A18, 0x00BC }, { 0x18AD4, 0x01A2 },
422 	{ 0x00000, 0x0000 }, { 0x19E45, 0x00F8 }, { 0x21E06, 0x00F7 }, { 0x1E8FA, 0x00B5 }, { 0x21EFD, 0x0047 },
423 	{ 0x2C183, 0x004D }, { 0x15B02, 0x0024 }, { 0x14D64, 0x0014 }, { 0x17518, 0x005E }, { 0x17576, 0x0125 },
424 	{ 0x1769B, 0x0009 }, { 0x14D78, 0x01C7 }, { 0x2ADCE, 0x0263 }, { 0x232AF, 0x077F }, { 0x2C1D0, 0x001E },
425 	{ 0x2C1EE, 0x0024 }, { 0x2C212, 0x002E }, { 0x2C240, 0x0022 }, { 0x2C262, 0x0013 }, { 0x2C275, 0x001E },
426 	{ 0x2C293, 0x0016 }, { 0x2C2A9, 0x0027 }, { 0x00000, 0x0000 }, { 0x2C2D0, 0x0012 }, { 0x176A4, 0x00A4 },
427 	{ 0x228F8, 0x0066 }, { 0x14F3F, 0x007F }, { 0x1F428, 0x013A }, { 0x1FEE0, 0x001D }, { 0x1F562, 0x00A0 },
428 	{ 0x1F602, 0x00A4 }, { 0x17748, 0x0076 }, { 0x177BE, 0x0036 }, { 0x1F6A6, 0x00B9 }, { 0x2C2E2, 0x00CB },
429 	{ 0x2C3AD, 0x00B7 }, { 0x2C464, 0x008A }, { 0x20A58, 0x01BD }, { 0x20C15, 0x0181 }, { 0x20D96, 0x0078 },
430 	{ 0x20E0E, 0x003C }, { 0x20E4A, 0x00E9 }, { 0x20F33, 0x0046 }, { 0x20F79, 0x00F6 }, { 0x2106F, 0x0118 },
431 	{ 0x21187, 0x015B }, { 0x212E2, 0x01AC }, { 0x2148E, 0x003F }, { 0x214CD, 0x00A9 }, { 0x2436F, 0x0126 },
432 	{ 0x1BD07, 0x0075 }, { 0x1CC6A, 0x009B }, { 0x28F5D, 0x0054 }, { 0x19F3D, 0x00E1 }, { 0x1A01E, 0x0086 },
433 	{ 0x14FBE, 0x0057 }, { 0x27326, 0x033D }, { 0x1DA51, 0x023B }, { 0x1DC8C, 0x00FB }, { 0x1DD87, 0x0056 },
434 	{ 0x1DDDD, 0x01E1 }, { 0x15015, 0x004D }, { 0x27027, 0x00E8 }, { 0x21F44, 0x0013 }, { 0x2A2DD, 0x00F0 },
435 	{ 0x24495, 0x00F8 }, { 0x21576, 0x00F9 }, { 0x2458D, 0x002B }, { 0x2BAA4, 0x010F }, { 0x245B8, 0x00A5 },
436 	{ 0x250D0, 0x019C }, { 0x1B608, 0x000D }, { 0x1B615, 0x000D }, { 0x23A2E, 0x0185 }, { 0x27957, 0x0212 },
437 	{ 0x23BB3, 0x0158 }, { 0x23D0B, 0x01C4 }, { 0x23ECF, 0x0016 }, { 0x2BBB3, 0x005A }, { 0x23EE5, 0x0020 },
438 	{ 0x27D6A, 0x00A7 }, { 0x2A3CD, 0x038C }, { 0x15062, 0x00F6 }, { 0x2B5B2, 0x007B }, { 0x00000, 0x0000 },
439 	{ 0x2526C, 0x003C }, { 0x1E9AF, 0x0011 }, { 0x15B26, 0x0018 }, { 0x265F5, 0x001F }, { 0x26614, 0x0054 },
440 	{ 0x26668, 0x018E }, { 0x267F6, 0x004B }, { 0x26841, 0x0196 }, { 0x269D7, 0x0027 }, { 0x269FE, 0x0041 },
441 	{ 0x26A3F, 0x01A3 }, { 0x15B3E, 0x001F }, { 0x2465D, 0x002A }, { 0x15158, 0x0198 }, { 0x192F7, 0x0031 },
442 	{ 0x177F4, 0x008C }, { 0x2166F, 0x00DA }, { 0x1D439, 0x0018 }, { 0x1D451, 0x0054 }, { 0x18C76, 0x0005 },
443 	{ 0x152F0, 0x0126 }, { 0x15416, 0x000B }, { 0x24687, 0x0137 }, { 0x247BE, 0x0014 }, { 0x1DFBE, 0x0018 },
444 	{ 0x247D2, 0x0027 }, { 0x1A0A4, 0x004D }, { 0x00000, 0x0000 }, { 0x2B62D, 0x00A5 }, { 0x2A759, 0x00BA },
445 	{ 0x2A813, 0x0140 }, { 0x197CF, 0x00D0 }, { 0x1989F, 0x014D }, { 0x199EC, 0x0012 }, { 0x2A953, 0x0005 },
446 	{ 0x2A958, 0x0005 }, { 0x2A95D, 0x0005 }, { 0x2A962, 0x0005 }, { 0x2A967, 0x0005 }, { 0x21749, 0x0033 },
447 	{ 0x2A96C, 0x0005 }, { 0x00000, 0x0000 }, { 0x2A971, 0x009C }, { 0x2AA0D, 0x009C }
448 };
449 static const ScummNESFile::Resource res_scripts_esp[179] = {
450 	{ 0x00000, 0x0000 }, { 0x28F4C, 0x0457 }, { 0x293A3, 0x0213 }, { 0x295B6, 0x009C }, { 0x29652, 0x03FE },
451 	{ 0x29A50, 0x01A1 }, { 0x00000, 0x0000 }, { 0x29BF1, 0x005C }, { 0x00000, 0x0000 }, { 0x29C4D, 0x0005 },
452 	{ 0x2B964, 0x000D }, { 0x2B971, 0x000D }, { 0x186EE, 0x0040 }, { 0x1872E, 0x0016 }, { 0x1B5A0, 0x0046 },
453 	{ 0x1EF97, 0x00B4 }, { 0x21D17, 0x0056 }, { 0x175E9, 0x0027 }, { 0x1FE06, 0x0027 }, { 0x1FE2D, 0x0027 },
454 	{ 0x1BC86, 0x0022 }, { 0x15C26, 0x008B }, { 0x2232E, 0x001F }, { 0x2234D, 0x008F }, { 0x192AF, 0x002B },
455 	{ 0x1CB59, 0x006B }, { 0x1CBC4, 0x0045 }, { 0x1CC09, 0x0046 }, { 0x1CC4F, 0x005D }, { 0x204CC, 0x0077 },
456 	{ 0x163DA, 0x0035 }, { 0x1640F, 0x001C }, { 0x1642B, 0x0014 }, { 0x1643F, 0x001C }, { 0x1645B, 0x0027 },
457 	{ 0x16482, 0x01A3 }, { 0x1D1DE, 0x009E }, { 0x1D27C, 0x011A }, { 0x1D396, 0x001C }, { 0x1D3B2, 0x0056 },
458 	{ 0x1D408, 0x0072 }, { 0x1E50F, 0x0028 }, { 0x1E537, 0x0199 }, { 0x1E6D0, 0x0240 }, { 0x27CA1, 0x0071 },
459 	{ 0x17D14, 0x004C }, { 0x13E0F, 0x0039 }, { 0x18744, 0x02B9 }, { 0x189FD, 0x00B9 }, { 0x18AB6, 0x0183 },
460 	{ 0x00000, 0x0000 }, { 0x19E3E, 0x00F0 }, { 0x21D6D, 0x00F7 }, { 0x1E910, 0x00A8 }, { 0x21E64, 0x0047 },
461 	{ 0x2B97E, 0x004D }, { 0x13E48, 0x0024 }, { 0x14D06, 0x0014 }, { 0x17610, 0x005B }, { 0x1766B, 0x0111 },
462 	{ 0x1777C, 0x0009 }, { 0x14D1A, 0x01C9 }, { 0x2A9E3, 0x0263 }, { 0x231C6, 0x06D6 }, { 0x2B9CB, 0x001C },
463 	{ 0x2B9E7, 0x001C }, { 0x2BA03, 0x0025 }, { 0x2BA28, 0x0023 }, { 0x2BA4B, 0x002A }, { 0x2BA75, 0x0033 },
464 	{ 0x2BAA8, 0x0016 }, { 0x2BABE, 0x0024 }, { 0x00000, 0x0000 }, { 0x2BAE2, 0x0011 }, { 0x17785, 0x00A2 },
465 	{ 0x22838, 0x0066 }, { 0x14EE3, 0x0079 }, { 0x1F3DB, 0x010F }, { 0x1FE54, 0x001D }, { 0x1F4EA, 0x00A2 },
466 	{ 0x1F58C, 0x0097 }, { 0x17827, 0x0061 }, { 0x17888, 0x0032 }, { 0x1F623, 0x00A7 }, { 0x2BAF3, 0x00CD },
467 	{ 0x2BBC0, 0x00BD }, { 0x2BC7D, 0x0089 }, { 0x20A73, 0x01C2 }, { 0x20C35, 0x016E }, { 0x20DA3, 0x006F },
468 	{ 0x20E12, 0x0037 }, { 0x20E49, 0x00EC }, { 0x20F35, 0x0047 }, { 0x20F7C, 0x00F8 }, { 0x21074, 0x0102 },
469 	{ 0x21176, 0x0133 }, { 0x212A9, 0x0197 }, { 0x21440, 0x002D }, { 0x2146D, 0x00A9 }, { 0x2436D, 0x0125 },
470 	{ 0x1BCA8, 0x0071 }, { 0x1CCAC, 0x0096 }, { 0x2896A, 0x0054 }, { 0x19F2E, 0x00DF }, { 0x1A00D, 0x007F },
471 	{ 0x14F5C, 0x0057 }, { 0x27074, 0x02F6 }, { 0x1DA73, 0x023A }, { 0x1DCAD, 0x00E8 }, { 0x1DD95, 0x0059 },
472 	{ 0x1DDEE, 0x01E3 }, { 0x14FB3, 0x004D }, { 0x26D81, 0x00DC }, { 0x21EAB, 0x0013 }, { 0x29C52, 0x00F0 },
473 	{ 0x24492, 0x00E4 }, { 0x21516, 0x00EE }, { 0x24576, 0x002D }, { 0x2B692, 0x010D }, { 0x245A3, 0x00AC },
474 	{ 0x250C3, 0x0184 }, { 0x1B5E6, 0x000D }, { 0x1B5F3, 0x000D }, { 0x2389C, 0x0182 }, { 0x2765E, 0x01E7 },
475 	{ 0x23A1E, 0x017A }, { 0x23B98, 0x01B6 }, { 0x23D4E, 0x0016 }, { 0x2B79F, 0x005D }, { 0x23D64, 0x0020 },
476 	{ 0x2A619, 0x00A5 }, { 0x29D42, 0x038F }, { 0x15000, 0x00ED }, { 0x2B1B8, 0x0063 }, { 0x00000, 0x0000 },
477 	{ 0x25247, 0x003C }, { 0x1E9B8, 0x0011 }, { 0x13E6C, 0x0018 }, { 0x265E0, 0x001F }, { 0x265FF, 0x0054 },
478 	{ 0x26653, 0x0147 }, { 0x2679A, 0x004B }, { 0x267E5, 0x0184 }, { 0x26969, 0x0027 }, { 0x26990, 0x0041 },
479 	{ 0x269D1, 0x01B9 }, { 0x13E84, 0x001F }, { 0x2464F, 0x002A }, { 0x150ED, 0x01A4 }, { 0x192DA, 0x0031 },
480 	{ 0x178BA, 0x007C }, { 0x21604, 0x00E4 }, { 0x1D47A, 0x0018 }, { 0x1D492, 0x005B }, { 0x18C39, 0x0005 },
481 	{ 0x15291, 0x010F }, { 0x153A0, 0x000B }, { 0x24679, 0x0138 }, { 0x247B1, 0x0014 }, { 0x1DFD1, 0x0018 },
482 	{ 0x247C5, 0x0027 }, { 0x1A08C, 0x004E }, { 0x00000, 0x0000 }, { 0x2B21B, 0x00A5 }, { 0x2A0D1, 0x00B1 },
483 	{ 0x2A182, 0x0140 }, { 0x197CF, 0x00BE }, { 0x1988D, 0x014D }, { 0x199DA, 0x0012 }, { 0x2A2C2, 0x0005 },
484 	{ 0x2A2C7, 0x0005 }, { 0x2A2CC, 0x0005 }, { 0x2A2D1, 0x0005 }, { 0x2A2D6, 0x0005 }, { 0x216E8, 0x0033 },
485 	{ 0x2A2DB, 0x0005 }, { 0x00000, 0x0000 }, { 0x2A2E0, 0x009C }, { 0x2A37C, 0x009C }
486 };
487 static const ScummNESFile::Resource res_scripts_ita[179] = {
488 	{ 0x00000, 0x0000 }, { 0x293BE, 0x046B }, { 0x29829, 0x020C }, { 0x29A35, 0x00AA }, { 0x29ADF, 0x03FD },
489 	{ 0x29EDC, 0x01A1 }, { 0x00000, 0x0000 }, { 0x2A07D, 0x005C }, { 0x00000, 0x0000 }, { 0x2A0D9, 0x0005 },
490 	{ 0x2C169, 0x000D }, { 0x2C176, 0x000D }, { 0x186E0, 0x0040 }, { 0x18720, 0x0016 }, { 0x1B528, 0x0046 },
491 	{ 0x1EF9A, 0x00B8 }, { 0x21D0E, 0x0056 }, { 0x17622, 0x0027 }, { 0x1FE4E, 0x0027 }, { 0x1FE75, 0x0027 },
492 	{ 0x1BC1B, 0x0022 }, { 0x15C91, 0x0085 }, { 0x2233B, 0x001E }, { 0x22359, 0x008F }, { 0x192BA, 0x002B },
493 	{ 0x1CB93, 0x0065 }, { 0x1CBF8, 0x003F }, { 0x1CC37, 0x004E }, { 0x1CC85, 0x0055 }, { 0x204C3, 0x007C },
494 	{ 0x16425, 0x0035 }, { 0x1645A, 0x001C }, { 0x16476, 0x0014 }, { 0x1648A, 0x001C }, { 0x164A6, 0x0027 },
495 	{ 0x164CD, 0x018B }, { 0x1D1F4, 0x009B }, { 0x1D28F, 0x010A }, { 0x1D399, 0x001C }, { 0x1D3B5, 0x0056 },
496 	{ 0x1D40B, 0x0072 }, { 0x1E503, 0x0028 }, { 0x1E52B, 0x01AA }, { 0x1E6D5, 0x0233 }, { 0x2845D, 0x0071 },
497 	{ 0x17D72, 0x004E }, { 0x13E3E, 0x0039 }, { 0x18736, 0x02C8 }, { 0x189FE, 0x00BB }, { 0x18AB9, 0x019E },
498 	{ 0x00000, 0x0000 }, { 0x19E32, 0x00F8 }, { 0x21D64, 0x00F7 }, { 0x1E908, 0x00B0 }, { 0x21E5B, 0x0047 },
499 	{ 0x2C183, 0x004D }, { 0x13E77, 0x0024 }, { 0x14D71, 0x0014 }, { 0x17649, 0x0058 }, { 0x176A1, 0x010A },
500 	{ 0x177AB, 0x0009 }, { 0x14D85, 0x01B7 }, { 0x2ABC8, 0x029E }, { 0x23214, 0x070B }, { 0x2C1D0, 0x001A },
501 	{ 0x2C1EA, 0x0021 }, { 0x2C20B, 0x0022 }, { 0x2C22D, 0x0023 }, { 0x2C250, 0x0016 }, { 0x2C266, 0x001E },
502 	{ 0x2C284, 0x0016 }, { 0x2C29A, 0x0027 }, { 0x00000, 0x0000 }, { 0x2C2C1, 0x000E }, { 0x177B4, 0x00AA },
503 	{ 0x22874, 0x0066 }, { 0x14F3C, 0x007B }, { 0x1F3E6, 0x0126 }, { 0x1FE9C, 0x001D }, { 0x1F50C, 0x00B4 },
504 	{ 0x1F5C0, 0x00AA }, { 0x1785E, 0x006D }, { 0x178CB, 0x003F }, { 0x1F66A, 0x00A3 }, { 0x2C2CF, 0x00AF },
505 	{ 0x2C37E, 0x00BD }, { 0x2C43B, 0x0085 }, { 0x20A67, 0x01AA }, { 0x20C11, 0x016A }, { 0x20D7B, 0x0073 },
506 	{ 0x20DEE, 0x003B }, { 0x20E29, 0x00F0 }, { 0x20F19, 0x0047 }, { 0x20F60, 0x00FD }, { 0x2105D, 0x00FF },
507 	{ 0x2115C, 0x0157 }, { 0x212B3, 0x0195 }, { 0x21448, 0x002E }, { 0x21476, 0x00A9 }, { 0x2437B, 0x011F },
508 	{ 0x1BC3D, 0x006F }, { 0x1CCDA, 0x0096 }, { 0x28D8B, 0x0054 }, { 0x19F2A, 0x00B8 }, { 0x19FE2, 0x0071 },
509 	{ 0x14FB7, 0x0057 }, { 0x272ED, 0x02F7 }, { 0x1DA7B, 0x021C }, { 0x1DC97, 0x00FA }, { 0x1DD91, 0x0053 },
510 	{ 0x1DDE4, 0x01CF }, { 0x1500E, 0x004D }, { 0x26FD8, 0x00FE }, { 0x21EA2, 0x0013 }, { 0x2A0DE, 0x00F0 },
511 	{ 0x2449A, 0x00DC }, { 0x2151F, 0x00E7 }, { 0x24576, 0x0022 }, { 0x2B8D7, 0x00FE }, { 0x24598, 0x00BB },
512 	{ 0x250C5, 0x0188 }, { 0x1B56E, 0x000D }, { 0x1B57B, 0x000D }, { 0x2391F, 0x0182 }, { 0x278D8, 0x01F1 },
513 	{ 0x23AA1, 0x0150 }, { 0x23BF1, 0x01C2 }, { 0x23DB3, 0x0016 }, { 0x2B9D5, 0x005C }, { 0x23DC9, 0x0020 },
514 	{ 0x27CCA, 0x00A5 }, { 0x2A1CE, 0x0384 }, { 0x1505B, 0x00FA }, { 0x2B3F6, 0x005E }, { 0x00000, 0x0000 },
515 	{ 0x2524D, 0x003C }, { 0x1E9B8, 0x0011 }, { 0x13E9B, 0x0018 }, { 0x265D1, 0x001F }, { 0x265F0, 0x0054 },
516 	{ 0x26644, 0x0155 }, { 0x26799, 0x004B }, { 0x267E4, 0x017C }, { 0x26960, 0x0027 }, { 0x26987, 0x0041 },
517 	{ 0x269C8, 0x01CB }, { 0x13EB3, 0x001F }, { 0x24653, 0x002A }, { 0x15155, 0x01A4 }, { 0x192E5, 0x0031 },
518 	{ 0x1790A, 0x0087 }, { 0x21606, 0x00DF }, { 0x1D47D, 0x0018 }, { 0x1D495, 0x004E }, { 0x18C57, 0x0005 },
519 	{ 0x152F9, 0x011F }, { 0x15418, 0x000B }, { 0x2467D, 0x0136 }, { 0x247B3, 0x0014 }, { 0x1DFB3, 0x0018 },
520 	{ 0x247C7, 0x0027 }, { 0x1A053, 0x004A }, { 0x00000, 0x0000 }, { 0x2B454, 0x00A5 }, { 0x2A552, 0x00BB },
521 	{ 0x2A60D, 0x0140 }, { 0x197C5, 0x00C6 }, { 0x1988B, 0x014D }, { 0x199D8, 0x0012 }, { 0x2A74D, 0x0005 },
522 	{ 0x2A752, 0x0005 }, { 0x2A757, 0x0005 }, { 0x2A75C, 0x0005 }, { 0x2A761, 0x0005 }, { 0x216E5, 0x0033 },
523 	{ 0x2A766, 0x0005 }, { 0x00000, 0x0000 }, { 0x2A76B, 0x009C }, { 0x2A807, 0x009C }
524 };
525 
526 const ScummNESFile::ResourceGroup res_scripts = {
527 	ScummNESFile::NES_SCRIPT,
528 	{
529 	res_scripts_usa,
530 	res_scripts_eur,
531 	res_scripts_swe,
532 	res_scripts_fra,
533 	res_scripts_ger,
534 	res_scripts_esp,
535 	res_scripts_ita,
536 	}
537 };
538 
539 static const ScummNESFile::Resource res_sounds_usa[82] = {
540 	{ 0x0FFE8, 0x000A }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 },
541 	{ 0x30ECA, 0x0832 }, { 0x17FCA, 0x0011 }, { 0x27E0B, 0x0073 }, { 0x17FDB, 0x0011 }, { 0x17FEC, 0x0011 },
542 	{ 0x27E7E, 0x0056 }, { 0x27ED4, 0x001F }, { 0x23FEE, 0x0011 }, { 0x0FFF2, 0x000A }, { 0x27EF3, 0x000A },
543 	{ 0x27EFD, 0x0019 }, { 0x27F16, 0x004B }, { 0x27F61, 0x000A }, { 0x27F6B, 0x000F }, { 0x27F7A, 0x001D },
544 	{ 0x27F97, 0x0045 }, { 0x27FDC, 0x000F }, { 0x2FD42, 0x001B }, { 0x2FD5D, 0x0033 }, { 0x27FEB, 0x0011 },
545 	{ 0x2BFEF, 0x000F }, { 0x2FD90, 0x0075 }, { 0x2FE05, 0x0014 }, { 0x0FFE8, 0x000A }, { 0x2FE19, 0x00FF },
546 	{ 0x2FF18, 0x000F }, { 0x2FF27, 0x000F }, { 0x2FF36, 0x0092 }, { 0x2FF36, 0x0092 }, { 0x2FFC8, 0x002D },
547 	{ 0x316FC, 0x00F8 }, { 0x317F4, 0x0016 }, { 0x3180A, 0x0011 }, { 0x3181B, 0x004B }, { 0x31866, 0x0011 },
548 	{ 0x31877, 0x003B }, { 0x318B2, 0x008A }, { 0x3193C, 0x0011 }, { 0x3194D, 0x000F }, { 0x3195C, 0x00A2 },
549 	{ 0x319FE, 0x00D3 }, { 0x31AD1, 0x0097 }, { 0x2BFEF, 0x000F }, { 0x3195C, 0x00A2 }, { 0x31B68, 0x05D1 },
550 	{ 0x31B68, 0x05D1 }, { 0x32139, 0x0011 }, { 0x0FFE8, 0x000A }, { 0x2FD90, 0x0075 }, { 0x27ED4, 0x001F },
551 	{ 0x3214A, 0x098E }, { 0x3181B, 0x004B }, { 0x32AD8, 0x0011 }, { 0x30ECA, 0x0832 }, { 0x32AE9, 0x000F },
552 	{ 0x32AF8, 0x002F }, { 0x32B27, 0x001D }, { 0x32B44, 0x0018 }, { 0x32B5C, 0x0016 }, { 0x32B72, 0x001B },
553 	{ 0x32B8D, 0x0088 }, { 0x32C15, 0x0065 }, { 0x32C7A, 0x0065 }, { 0x32CDF, 0x0073 }, { 0x32D52, 0x00F9 },
554 	{ 0x32E4B, 0x049E }, { 0x34001, 0x0EA8 }, { 0x332E9, 0x0B18 }, { 0x34EA9, 0x0B9C }, { 0x35A45, 0x0C6B },
555 	{ 0x366B0, 0x0E56 }, { 0x38001, 0x0C70 }, { 0x38C71, 0x0DEC }, { 0x39A5D, 0x0B77 }, { 0x37506, 0x042F },
556 	{ 0x3A5D4, 0x0AC5 }, { 0x3B099, 0x0BE4 }
557 };
558 static const ScummNESFile::Resource res_sounds_eur[82] = {
559 	{ 0x0BF54, 0x000A }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 },
560 	{ 0x30ECA, 0x0832 }, { 0x0BF5E, 0x0011 }, { 0x27ECB, 0x0073 }, { 0x0BF6F, 0x0011 }, { 0x0FF5D, 0x0011 },
561 	{ 0x316FC, 0x0056 }, { 0x13F4E, 0x001F }, { 0x0FF6E, 0x0011 }, { 0x13F6D, 0x000A }, { 0x1BF47, 0x000A },
562 	{ 0x1BF51, 0x0019 }, { 0x31752, 0x004B }, { 0x1BF6A, 0x000A }, { 0x27F3E, 0x000F }, { 0x27F4D, 0x001D },
563 	{ 0x3179D, 0x0045 }, { 0x27F6A, 0x000F }, { 0x2BF40, 0x001B }, { 0x317E2, 0x0033 }, { 0x2BF5B, 0x0011 },
564 	{ 0x2BF6C, 0x000F }, { 0x31815, 0x0075 }, { 0x2FF6C, 0x0014 }, { 0x0BF54, 0x000A }, { 0x3188A, 0x00FF },
565 	{ 0x31989, 0x000F }, { 0x31998, 0x000F }, { 0x319A7, 0x0092 }, { 0x319A7, 0x0092 }, { 0x31A39, 0x002D },
566 	{ 0x31A66, 0x00F8 }, { 0x31B5E, 0x0016 }, { 0x31B74, 0x0011 }, { 0x31B85, 0x004B }, { 0x31BD0, 0x0011 },
567 	{ 0x31BE1, 0x003B }, { 0x31C1C, 0x008A }, { 0x31CA6, 0x0011 }, { 0x31CB7, 0x000F }, { 0x31CC6, 0x00A2 },
568 	{ 0x31D68, 0x00D3 }, { 0x31E3B, 0x0097 }, { 0x2BF6C, 0x000F }, { 0x31CC6, 0x00A2 }, { 0x31ED2, 0x05D1 },
569 	{ 0x31ED2, 0x05D1 }, { 0x324A3, 0x0011 }, { 0x0BF54, 0x000A }, { 0x31815, 0x0075 }, { 0x13F4E, 0x001F },
570 	{ 0x324B4, 0x098E }, { 0x31B85, 0x004B }, { 0x32E42, 0x0011 }, { 0x30ECA, 0x0832 }, { 0x32E53, 0x000F },
571 	{ 0x32E62, 0x002F }, { 0x32E91, 0x001D }, { 0x32EAE, 0x0018 }, { 0x32EC6, 0x0016 }, { 0x32EDC, 0x001B },
572 	{ 0x32EF7, 0x0088 }, { 0x32F7F, 0x0065 }, { 0x32FE4, 0x0065 }, { 0x33049, 0x0073 }, { 0x330BC, 0x00F9 },
573 	{ 0x331B5, 0x049E }, { 0x34001, 0x0EA8 }, { 0x34EA9, 0x0B18 }, { 0x359C1, 0x0B9C }, { 0x3655D, 0x0C6B },
574 	{ 0x38001, 0x0E56 }, { 0x371C8, 0x0C70 }, { 0x38E57, 0x0DEC }, { 0x39C43, 0x0B77 }, { 0x33653, 0x042F },
575 	{ 0x3A7BA, 0x0AC5 }, { 0x3B27F, 0x0BE4 }
576 };
577 static const ScummNESFile::Resource res_sounds_swe[82] = {
578 	{ 0x0BF58, 0x000A }, { 0x30352, 0x0832 }, { 0x30352, 0x0832 }, { 0x30352, 0x0832 }, { 0x30352, 0x0832 },
579 	{ 0x30352, 0x0832 }, { 0x0BF62, 0x0011 }, { 0x27E5F, 0x0073 }, { 0x17F5A, 0x0011 }, { 0x17F6B, 0x0011 },
580 	{ 0x27ED2, 0x0056 }, { 0x1BF55, 0x001F }, { 0x23F66, 0x0011 }, { 0x0BF73, 0x000A }, { 0x1BF74, 0x000A },
581 	{ 0x27F28, 0x0019 }, { 0x2BF0A, 0x004B }, { 0x1FF71, 0x000A }, { 0x27F41, 0x000F }, { 0x27F50, 0x001D },
582 	{ 0x2FEAA, 0x0045 }, { 0x27F6D, 0x000F }, { 0x2BF55, 0x001B }, { 0x2FEEF, 0x0033 }, { 0x2FF22, 0x0011 },
583 	{ 0x2BF70, 0x000F }, { 0x30B84, 0x0075 }, { 0x2FF33, 0x0014 }, { 0x0BF58, 0x000A }, { 0x30BF9, 0x00FF },
584 	{ 0x2FF47, 0x000F }, { 0x2FF56, 0x000F }, { 0x30CF8, 0x0092 }, { 0x30CF8, 0x0092 }, { 0x30D8A, 0x002D },
585 	{ 0x30DB7, 0x00F8 }, { 0x2FF65, 0x0016 }, { 0x30EAF, 0x0011 }, { 0x30EC0, 0x004B }, { 0x30F0B, 0x0011 },
586 	{ 0x30F1C, 0x003B }, { 0x30F57, 0x008A }, { 0x30FE1, 0x0011 }, { 0x30FF2, 0x000F }, { 0x31001, 0x00A2 },
587 	{ 0x310A3, 0x00D3 }, { 0x31176, 0x0097 }, { 0x2BF70, 0x000F }, { 0x31001, 0x00A2 }, { 0x3120D, 0x05D1 },
588 	{ 0x3120D, 0x05D1 }, { 0x317DE, 0x0011 }, { 0x0BF58, 0x000A }, { 0x30B84, 0x0075 }, { 0x1BF55, 0x001F },
589 	{ 0x317EF, 0x098E }, { 0x30EC0, 0x004B }, { 0x3217D, 0x0011 }, { 0x30352, 0x0832 }, { 0x3218E, 0x000F },
590 	{ 0x3219D, 0x002F }, { 0x321CC, 0x001D }, { 0x321E9, 0x0018 }, { 0x32201, 0x0016 }, { 0x32217, 0x001B },
591 	{ 0x32232, 0x0088 }, { 0x322BA, 0x0065 }, { 0x3231F, 0x0065 }, { 0x32384, 0x0073 }, { 0x323F7, 0x00F9 },
592 	{ 0x324F0, 0x049E }, { 0x3298E, 0x0EA8 }, { 0x34001, 0x0B18 }, { 0x34B19, 0x0B9C }, { 0x356B5, 0x0C6B },
593 	{ 0x36320, 0x0E56 }, { 0x37176, 0x0C70 }, { 0x38001, 0x0DEC }, { 0x38DED, 0x0B77 }, { 0x33836, 0x042F },
594 	{ 0x39964, 0x0AC5 }, { 0x3A429, 0x0BE4 }
595 };
596 static const ScummNESFile::Resource res_sounds_fra[82] = {
597 	{ 0x07F74, 0x000A }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 },
598 	{ 0x30ECA, 0x0832 }, { 0x0BF6C, 0x0011 }, { 0x1BEFA, 0x0073 }, { 0x17F10, 0x0011 }, { 0x17F21, 0x0011 },
599 	{ 0x1FED5, 0x0056 }, { 0x17F32, 0x001F }, { 0x17F51, 0x0011 }, { 0x0FF76, 0x000A }, { 0x17F62, 0x000A },
600 	{ 0x1FF2B, 0x0019 }, { 0x23E78, 0x004B }, { 0x17F6C, 0x000A }, { 0x1BF6D, 0x000F }, { 0x1FF44, 0x001D },
601 	{ 0x23EC3, 0x0045 }, { 0x1FF61, 0x000F }, { 0x23F08, 0x001B }, { 0x23F23, 0x0033 }, { 0x23F56, 0x0011 },
602 	{ 0x1FF70, 0x000F }, { 0x27EF4, 0x0075 }, { 0x23F67, 0x0014 }, { 0x07F74, 0x000A }, { 0x2FB83, 0x00FF },
603 	{ 0x27F69, 0x000F }, { 0x2BF70, 0x000F }, { 0x2FC82, 0x0092 }, { 0x2FC82, 0x0092 }, { 0x2FD14, 0x002D },
604 	{ 0x2FD41, 0x00F8 }, { 0x2FE39, 0x0016 }, { 0x2FE4F, 0x0011 }, { 0x2FE60, 0x004B }, { 0x2FEAB, 0x0011 },
605 	{ 0x2FEBC, 0x003B }, { 0x316FC, 0x008A }, { 0x2FEF7, 0x0011 }, { 0x2FF08, 0x000F }, { 0x31786, 0x00A2 },
606 	{ 0x31828, 0x00D3 }, { 0x318FB, 0x0097 }, { 0x1FF70, 0x000F }, { 0x31786, 0x00A2 }, { 0x31992, 0x05D1 },
607 	{ 0x31992, 0x05D1 }, { 0x2FF17, 0x0011 }, { 0x07F74, 0x000A }, { 0x27EF4, 0x0075 }, { 0x17F32, 0x001F },
608 	{ 0x31F63, 0x098E }, { 0x2FE60, 0x004B }, { 0x2FF28, 0x0011 }, { 0x30ECA, 0x0832 }, { 0x2FF39, 0x000F },
609 	{ 0x2FF48, 0x002F }, { 0x328F1, 0x001D }, { 0x3290E, 0x0018 }, { 0x32926, 0x0016 }, { 0x3293C, 0x001B },
610 	{ 0x32957, 0x0088 }, { 0x329DF, 0x0065 }, { 0x32A44, 0x0065 }, { 0x32AA9, 0x0073 }, { 0x32B1C, 0x00F9 },
611 	{ 0x32C15, 0x049E }, { 0x330B3, 0x0EA8 }, { 0x34001, 0x0B18 }, { 0x34B19, 0x0B9C }, { 0x356B5, 0x0C6B },
612 	{ 0x36320, 0x0E56 }, { 0x37176, 0x0C70 }, { 0x38001, 0x0DEC }, { 0x38DED, 0x0B77 }, { 0x39964, 0x042F },
613 	{ 0x39D93, 0x0AC5 }, { 0x3A858, 0x0BE4 }
614 };
615 static const ScummNESFile::Resource res_sounds_ger[82] = {
616 	{ 0x0BF6D, 0x000A }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 },
617 	{ 0x30ECA, 0x0832 }, { 0x23F05, 0x0011 }, { 0x2FA49, 0x0073 }, { 0x23F16, 0x0011 }, { 0x23F27, 0x0011 },
618 	{ 0x2FABC, 0x0056 }, { 0x23F38, 0x001F }, { 0x23F57, 0x0011 }, { 0x0FF76, 0x000A }, { 0x17F71, 0x000A },
619 	{ 0x2BF2F, 0x0019 }, { 0x2FB12, 0x004B }, { 0x23F68, 0x000A }, { 0x2BF48, 0x000F }, { 0x2BF57, 0x001D },
620 	{ 0x2FB5D, 0x0045 }, { 0x2FBA2, 0x000F }, { 0x2FBB1, 0x001B }, { 0x2FBCC, 0x0033 }, { 0x2FBFF, 0x0011 },
621 	{ 0x2FC10, 0x000F }, { 0x2FC1F, 0x0075 }, { 0x2FC94, 0x0014 }, { 0x0BF6D, 0x000A }, { 0x2FCA8, 0x00FF },
622 	{ 0x2FDA7, 0x000F }, { 0x2FDB6, 0x000F }, { 0x2FDC5, 0x0092 }, { 0x2FDC5, 0x0092 }, { 0x2FE57, 0x002D },
623 	{ 0x2FE84, 0x00F8 }, { 0x316FC, 0x0016 }, { 0x31712, 0x0011 }, { 0x31723, 0x004B }, { 0x3176E, 0x0011 },
624 	{ 0x3177F, 0x003B }, { 0x317BA, 0x008A }, { 0x31844, 0x0011 }, { 0x31855, 0x000F }, { 0x31864, 0x00A2 },
625 	{ 0x31906, 0x00D3 }, { 0x319D9, 0x0097 }, { 0x2FC10, 0x000F }, { 0x31864, 0x00A2 }, { 0x31A70, 0x05D1 },
626 	{ 0x31A70, 0x05D1 }, { 0x32041, 0x0011 }, { 0x0BF6D, 0x000A }, { 0x2FC1F, 0x0075 }, { 0x23F38, 0x001F },
627 	{ 0x32052, 0x098E }, { 0x31723, 0x004B }, { 0x329E0, 0x0011 }, { 0x30ECA, 0x0832 }, { 0x329F1, 0x000F },
628 	{ 0x32A00, 0x002F }, { 0x32A2F, 0x001D }, { 0x32A4C, 0x0018 }, { 0x32A64, 0x0016 }, { 0x32A7A, 0x001B },
629 	{ 0x32A95, 0x0088 }, { 0x32B1D, 0x0065 }, { 0x32B82, 0x0065 }, { 0x32BE7, 0x0073 }, { 0x32C5A, 0x00F9 },
630 	{ 0x32D53, 0x049E }, { 0x34001, 0x0EA8 }, { 0x331F1, 0x0B18 }, { 0x34EA9, 0x0B9C }, { 0x35A45, 0x0C6B },
631 	{ 0x366B0, 0x0E56 }, { 0x38001, 0x0C70 }, { 0x38C71, 0x0DEC }, { 0x39A5D, 0x0B77 }, { 0x37506, 0x042F },
632 	{ 0x3A5D4, 0x0AC5 }, { 0x3B099, 0x0BE4 }
633 };
634 static const ScummNESFile::Resource res_sounds_esp[82] = {
635 	{ 0x13F63, 0x000A }, { 0x2F671, 0x0832 }, { 0x2F671, 0x0832 }, { 0x2F671, 0x0832 }, { 0x2F671, 0x0832 },
636 	{ 0x2F671, 0x0832 }, { 0x13F6D, 0x0011 }, { 0x1FEED, 0x0073 }, { 0x17F6F, 0x0011 }, { 0x1BF64, 0x0011 },
637 	{ 0x27F19, 0x0056 }, { 0x1FF60, 0x001F }, { 0x27F6F, 0x0011 }, { 0x1BF75, 0x000A }, { 0x2BE6F, 0x000A },
638 	{ 0x2BE79, 0x0019 }, { 0x2BE92, 0x004B }, { 0x2BEDD, 0x000A }, { 0x2BEE7, 0x000F }, { 0x2BEF6, 0x001D },
639 	{ 0x2BF13, 0x0045 }, { 0x2BF58, 0x000F }, { 0x2FEA3, 0x001B }, { 0x2FEBE, 0x0033 }, { 0x2BF67, 0x0011 },
640 	{ 0x2FEF1, 0x000F }, { 0x2FF00, 0x0075 }, { 0x30ECA, 0x0014 }, { 0x13F63, 0x000A }, { 0x30EDE, 0x00FF },
641 	{ 0x30FDD, 0x000F }, { 0x30FEC, 0x000F }, { 0x30FFB, 0x0092 }, { 0x30FFB, 0x0092 }, { 0x3108D, 0x002D },
642 	{ 0x310BA, 0x00F8 }, { 0x311B2, 0x0016 }, { 0x311C8, 0x0011 }, { 0x311D9, 0x004B }, { 0x31224, 0x0011 },
643 	{ 0x31235, 0x003B }, { 0x31270, 0x008A }, { 0x312FA, 0x0011 }, { 0x3130B, 0x000F }, { 0x3131A, 0x00A2 },
644 	{ 0x313BC, 0x00D3 }, { 0x3148F, 0x0097 }, { 0x2FEF1, 0x000F }, { 0x3131A, 0x00A2 }, { 0x31526, 0x05D1 },
645 	{ 0x31526, 0x05D1 }, { 0x31AF7, 0x0011 }, { 0x13F63, 0x000A }, { 0x2FF00, 0x0075 }, { 0x1FF60, 0x001F },
646 	{ 0x31B08, 0x098E }, { 0x311D9, 0x004B }, { 0x32496, 0x0011 }, { 0x2F671, 0x0832 }, { 0x324A7, 0x000F },
647 	{ 0x324B6, 0x002F }, { 0x324E5, 0x001D }, { 0x32502, 0x0018 }, { 0x3251A, 0x0016 }, { 0x32530, 0x001B },
648 	{ 0x3254B, 0x0088 }, { 0x325D3, 0x0065 }, { 0x32638, 0x0065 }, { 0x3269D, 0x0073 }, { 0x32710, 0x00F9 },
649 	{ 0x32809, 0x049E }, { 0x32CA7, 0x0EA8 }, { 0x34001, 0x0B18 }, { 0x34B19, 0x0B9C }, { 0x356B5, 0x0C6B },
650 	{ 0x36320, 0x0E56 }, { 0x37176, 0x0C70 }, { 0x38001, 0x0DEC }, { 0x38DED, 0x0B77 }, { 0x33B4F, 0x042F },
651 	{ 0x39964, 0x0AC5 }, { 0x3A429, 0x0BE4 }
652 };
653 static const ScummNESFile::Resource res_sounds_ita[82] = {
654 	{ 0x0BF54, 0x000A }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 }, { 0x30ECA, 0x0832 },
655 	{ 0x30ECA, 0x0832 }, { 0x0BF5E, 0x0011 }, { 0x1FEB9, 0x0073 }, { 0x0BF6F, 0x0011 }, { 0x13F57, 0x0011 },
656 	{ 0x23EFE, 0x0056 }, { 0x1BF37, 0x001F }, { 0x13F68, 0x0011 }, { 0x0FF76, 0x000A }, { 0x17F64, 0x000A },
657 	{ 0x1BF56, 0x0019 }, { 0x1FF2C, 0x004B }, { 0x17F6E, 0x000A }, { 0x1BF6F, 0x000F }, { 0x23F54, 0x001D },
658 	{ 0x2BE61, 0x0045 }, { 0x23F71, 0x000F }, { 0x2BEA6, 0x001B }, { 0x2BEC1, 0x0033 }, { 0x27F6B, 0x0011 },
659 	{ 0x2BEF4, 0x000F }, { 0x2BF03, 0x0075 }, { 0x2F7F1, 0x0014 }, { 0x0BF54, 0x000A }, { 0x2F805, 0x00FF },
660 	{ 0x2F904, 0x000F }, { 0x2F913, 0x000F }, { 0x2F922, 0x0092 }, { 0x2F922, 0x0092 }, { 0x2F9B4, 0x002D },
661 	{ 0x2F9E1, 0x00F8 }, { 0x2FAD9, 0x0016 }, { 0x2FAEF, 0x0011 }, { 0x2FB00, 0x004B }, { 0x2FB4B, 0x0011 },
662 	{ 0x2FB5C, 0x003B }, { 0x2FB97, 0x008A }, { 0x2FC21, 0x0011 }, { 0x2FC32, 0x000F }, { 0x2FC41, 0x00A2 },
663 	{ 0x2FCE3, 0x00D3 }, { 0x2FDB6, 0x0097 }, { 0x2BEF4, 0x000F }, { 0x2FC41, 0x00A2 }, { 0x316FC, 0x05D1 },
664 	{ 0x316FC, 0x05D1 }, { 0x2FE4D, 0x0011 }, { 0x0BF54, 0x000A }, { 0x2BF03, 0x0075 }, { 0x1BF37, 0x001F },
665 	{ 0x31CCD, 0x098E }, { 0x2FB00, 0x004B }, { 0x2FE5E, 0x0011 }, { 0x30ECA, 0x0832 }, { 0x2FE6F, 0x000F },
666 	{ 0x2FE7E, 0x002F }, { 0x2FEAD, 0x001D }, { 0x2FECA, 0x0018 }, { 0x2FEE2, 0x0016 }, { 0x2FEF8, 0x001B },
667 	{ 0x3265B, 0x0088 }, { 0x2FF13, 0x0065 }, { 0x326E3, 0x0065 }, { 0x32748, 0x0073 }, { 0x327BB, 0x00F9 },
668 	{ 0x328B4, 0x049E }, { 0x32D52, 0x0EA8 }, { 0x34001, 0x0B18 }, { 0x34B19, 0x0B9C }, { 0x356B5, 0x0C6B },
669 	{ 0x36320, 0x0E56 }, { 0x37176, 0x0C70 }, { 0x38001, 0x0DEC }, { 0x38DED, 0x0B77 }, { 0x39964, 0x042F },
670 	{ 0x39D93, 0x0AC5 }, { 0x3A858, 0x0BE4 }
671 };
672 
673 const ScummNESFile::ResourceGroup res_sounds = {
674 	ScummNESFile::NES_SOUND,
675 	{
676 	res_sounds_usa,
677 	res_sounds_eur,
678 	res_sounds_swe,
679 	res_sounds_fra,
680 	res_sounds_ger,
681 	res_sounds_esp,
682 	res_sounds_ita,
683 	}
684 };
685 
686 static const ScummNESFile::Resource res_costumes_usa[25] = {
687 	{ 0x17F05, 0x0055 }, { 0x17F05, 0x0055 }, { 0x17F05, 0x0055 }, { 0x17F05, 0x0055 }, { 0x17F05, 0x0055 },
688 	{ 0x17F05, 0x0055 }, { 0x17F05, 0x0055 }, { 0x17F05, 0x0055 }, { 0x13FAB, 0x004B }, { 0x17F05, 0x0055 },
689 	{ 0x17F05, 0x0055 }, { 0x17F05, 0x0055 }, { 0x17F5A, 0x0036 }, { 0x17F90, 0x003A }, { 0x17F90, 0x003A },
690 	{ 0x17F05, 0x0055 }, { 0x1BF87, 0x003B }, { 0x17F05, 0x0055 }, { 0x23FA9, 0x0045 }, { 0x1FFBD, 0x0040 },
691 	{ 0x1BFC2, 0x003C }, { 0x17F90, 0x003A }, { 0x17F90, 0x003A }, { 0x17F05, 0x0055 }, { 0x13FAB, 0x004B }
692 };
693 static const ScummNESFile::Resource res_costumes_eur[25] = {
694 	{ 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 },
695 	{ 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 }, { 0x0FEA2, 0x004B }, { 0x0BEFF, 0x0055 },
696 	{ 0x0BEFF, 0x0055 }, { 0x0BEFF, 0x0055 }, { 0x0FEED, 0x0036 }, { 0x0FF23, 0x003A }, { 0x0FF23, 0x003A },
697 	{ 0x0BEFF, 0x0055 }, { 0x13F13, 0x003B }, { 0x0BEFF, 0x0055 }, { 0x23F2F, 0x0045 }, { 0x1FF3E, 0x0040 },
698 	{ 0x27E8F, 0x003C }, { 0x0FF23, 0x003A }, { 0x0FF23, 0x003A }, { 0x0BEFF, 0x0055 }, { 0x0FEA2, 0x004B }
699 };
700 static const ScummNESFile::Resource res_costumes_swe[25] = {
701 	{ 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 },
702 	{ 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 }, { 0x17E9A, 0x004B }, { 0x0FEF5, 0x0055 },
703 	{ 0x0FEF5, 0x0055 }, { 0x0FEF5, 0x0055 }, { 0x0FF4A, 0x0036 }, { 0x17EE5, 0x003A }, { 0x17EE5, 0x003A },
704 	{ 0x0FEF5, 0x0055 }, { 0x17F1F, 0x003B }, { 0x0FEF5, 0x0055 }, { 0x1BE94, 0x0045 }, { 0x1BED9, 0x0040 },
705 	{ 0x1BF19, 0x003C }, { 0x17EE5, 0x003A }, { 0x17EE5, 0x003A }, { 0x0FEF5, 0x0055 }, { 0x17E9A, 0x004B }
706 };
707 static const ScummNESFile::Resource res_costumes_fra[25] = {
708 	{ 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 },
709 	{ 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 }, { 0x13E77, 0x004B }, { 0x0BF17, 0x0055 },
710 	{ 0x0BF17, 0x0055 }, { 0x0BF17, 0x0055 }, { 0x07F3E, 0x0036 }, { 0x13EC2, 0x003A }, { 0x13EC2, 0x003A },
711 	{ 0x0BF17, 0x0055 }, { 0x13EFC, 0x003B }, { 0x0BF17, 0x0055 }, { 0x13F37, 0x0045 }, { 0x17E94, 0x0040 },
712 	{ 0x17ED4, 0x003C }, { 0x13EC2, 0x003A }, { 0x13EC2, 0x003A }, { 0x0BF17, 0x0055 }, { 0x13E77, 0x004B }
713 };
714 static const ScummNESFile::Resource res_costumes_ger[25] = {
715 	{ 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 },
716 	{ 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x17E6C, 0x004B }, { 0x0FEEB, 0x0055 },
717 	{ 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FF40, 0x0036 }, { 0x17EB7, 0x003A }, { 0x17EB7, 0x003A },
718 	{ 0x0FEEB, 0x0055 }, { 0x17EF1, 0x003B }, { 0x0FEEB, 0x0055 }, { 0x17F2C, 0x0045 }, { 0x1FEFD, 0x0040 },
719 	{ 0x1FF3D, 0x003C }, { 0x17EB7, 0x003A }, { 0x17EB7, 0x003A }, { 0x0FEEB, 0x0055 }, { 0x17E6C, 0x004B }
720 };
721 static const ScummNESFile::Resource res_costumes_esp[25] = {
722 	{ 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 },
723 	{ 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 }, { 0x13EA3, 0x004B }, { 0x0FEF1, 0x0055 },
724 	{ 0x0FEF1, 0x0055 }, { 0x0FEF1, 0x0055 }, { 0x0FF46, 0x0036 }, { 0x13EEE, 0x003A }, { 0x13EEE, 0x003A },
725 	{ 0x0FEF1, 0x0055 }, { 0x13F28, 0x003B }, { 0x0FEF1, 0x0055 }, { 0x17F2A, 0x0045 }, { 0x1FE71, 0x0040 },
726 	{ 0x1FEB1, 0x003C }, { 0x13EEE, 0x003A }, { 0x13EEE, 0x003A }, { 0x0FEF1, 0x0055 }, { 0x13EA3, 0x004B }
727 };
728 static const ScummNESFile::Resource res_costumes_ita[25] = {
729 	{ 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 },
730 	{ 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x13ED2, 0x004B }, { 0x0FEEB, 0x0055 },
731 	{ 0x0FEEB, 0x0055 }, { 0x0FEEB, 0x0055 }, { 0x0FF40, 0x0036 }, { 0x13F1D, 0x003A }, { 0x13F1D, 0x003A },
732 	{ 0x0FEEB, 0x0055 }, { 0x17F29, 0x003B }, { 0x0FEEB, 0x0055 }, { 0x1BE76, 0x0045 }, { 0x1BEBB, 0x0040 },
733 	{ 0x1BEFB, 0x003C }, { 0x13F1D, 0x003A }, { 0x13F1D, 0x003A }, { 0x0FEEB, 0x0055 }, { 0x13ED2, 0x004B }
734 };
735 
736 const ScummNESFile::ResourceGroup res_costumes = {
737 	ScummNESFile::NES_COSTUME,
738 	{
739 	res_costumes_usa,
740 	res_costumes_eur,
741 	res_costumes_swe,
742 	res_costumes_fra,
743 	res_costumes_ger,
744 	res_costumes_esp,
745 	res_costumes_ita,
746 	}
747 };
748 
749 static const ScummNESFile::Resource res_globdata_usa[1] = { { 0x2CA11, 0x0307 } };
750 static const ScummNESFile::Resource res_globdata_eur[1] = { { 0x2CA11, 0x0307 } };
751 static const ScummNESFile::Resource res_globdata_swe[1] = { { 0x2C001, 0x0307 } };
752 static const ScummNESFile::Resource res_globdata_fra[1] = { { 0x2C628, 0x0307 } };
753 static const ScummNESFile::Resource res_globdata_ger[1] = { { 0x2C4EE, 0x0307 } };
754 static const ScummNESFile::Resource res_globdata_esp[1] = { { 0x2C001, 0x0307 } };
755 static const ScummNESFile::Resource res_globdata_ita[1] = { { 0x2C4C0, 0x0307 } };
756 
757 const ScummNESFile::ResourceGroup res_globdata = {
758 	ScummNESFile::NES_GLOBDATA,
759 	{
760 	res_globdata_usa,
761 	res_globdata_eur,
762 	res_globdata_swe,
763 	res_globdata_fra,
764 	res_globdata_ger,
765 	res_globdata_esp,
766 	res_globdata_ita,
767 	}
768 };
769 
770 // sprite palette data
771 static const ScummNESFile::Resource res_sprpals_usa[2] = { { 0x0BFC1, 0x0010 }, { 0x0BFD1, 0x0010 } };
772 static const ScummNESFile::Resource res_sprpals_eur[2] = { { 0x07F61, 0x0010 }, { 0x0BEB2, 0x0010 } };
773 static const ScummNESFile::Resource res_sprpals_swe[2] = { { 0x07F55, 0x0010 }, { 0x07F65, 0x0010 } };
774 static const ScummNESFile::Resource res_sprpals_fra[2] = { { 0x07ED8, 0x0010 }, { 0x07EE8, 0x0010 } };
775 static const ScummNESFile::Resource res_sprpals_ger[2] = { { 0x07F6B, 0x0010 }, { 0x0BF17, 0x0010 } };
776 static const ScummNESFile::Resource res_sprpals_esp[2] = { { 0x0BF15, 0x0010 }, { 0x0BF25, 0x0010 } };
777 static const ScummNESFile::Resource res_sprpals_ita[2] = { { 0x07F54, 0x0010 }, { 0x07F64, 0x0010 } };
778 
779 const ScummNESFile::ResourceGroup res_sprpals = {
780 	ScummNESFile::NES_SPRPALS,
781 	{
782 	res_sprpals_usa,
783 	res_sprpals_eur,
784 	res_sprpals_swe,
785 	res_sprpals_fra,
786 	res_sprpals_ger,
787 	res_sprpals_esp,
788 	res_sprpals_ita,
789 	}
790 };
791 
792 // associates costume IDs with sprite sets (indexes into SPRLENS/SPROFFS)
793 static const ScummNESFile::Resource res_sprdesc_usa[2] = { { 0x0FFB7, 0x0031 }, { 0x0BFE1, 0x0009 } };
794 static const ScummNESFile::Resource res_sprdesc_eur[2] = { { 0x0BEC2, 0x0031 }, { 0x07F71, 0x0009 } };
795 static const ScummNESFile::Resource res_sprdesc_swe[2] = { { 0x0BF1B, 0x0031 }, { 0x07F75, 0x0009 } };
796 static const ScummNESFile::Resource res_sprdesc_fra[2] = { { 0x07EF8, 0x0031 }, { 0x07F29, 0x0009 } };
797 static const ScummNESFile::Resource res_sprdesc_ger[2] = { { 0x0BF27, 0x0031 }, { 0x0BF58, 0x0009 } };
798 static const ScummNESFile::Resource res_sprdesc_esp[2] = { { 0x0BF35, 0x0031 }, { 0x0BF66, 0x0009 } };
799 static const ScummNESFile::Resource res_sprdesc_ita[2] = { { 0x0BF17, 0x0031 }, { 0x07F74, 0x0009 } };
800 
801 const ScummNESFile::ResourceGroup res_sprdesc = {
802 	ScummNESFile::NES_SPRDESC,
803 	{
804 	res_sprdesc_usa,
805 	res_sprdesc_eur,
806 	res_sprdesc_swe,
807 	res_sprdesc_fra,
808 	res_sprdesc_ger,
809 	res_sprdesc_esp,
810 	res_sprdesc_ita,
811 	}
812 };
813 
814 // number of sprites in each set (indicates length within SPRDATA)
815 static const ScummNESFile::Resource res_sprlens_usa[2] = { { 0x0FEA2, 0x0115 }, { 0x07FF5, 0x0006 } };
816 static const ScummNESFile::Resource res_sprlens_eur[2] = { { 0x1BE32, 0x0115 }, { 0x07F5B, 0x0006 } };
817 static const ScummNESFile::Resource res_sprlens_swe[2] = { { 0x13E6A, 0x0115 }, { 0x07F4F, 0x0006 } };
818 static const ScummNESFile::Resource res_sprlens_fra[2] = { { 0x0FE61, 0x0115 }, { 0x07ED2, 0x0006 } };
819 static const ScummNESFile::Resource res_sprlens_ger[2] = { { 0x2BE1A, 0x0115 }, { 0x07F65, 0x0006 } };
820 static const ScummNESFile::Resource res_sprlens_esp[2] = { { 0x2EFE1, 0x0115 }, { 0x07F7A, 0x0006 } };
821 static const ScummNESFile::Resource res_sprlens_ita[2] = { { 0x23DE9, 0x0115 }, { 0x07F4E, 0x0006 } };
822 
823 const ScummNESFile::ResourceGroup res_sprlens = {
824 	ScummNESFile::NES_SPRLENS,
825 	{
826 	res_sprlens_usa,
827 	res_sprlens_eur,
828 	res_sprlens_swe,
829 	res_sprlens_fra,
830 	res_sprlens_ger,
831 	res_sprlens_esp,
832 	res_sprlens_ita,
833 	}
834 };
835 
836 // offset of each sprite set (indexes into SPRDATA)
837 static const ScummNESFile::Resource res_sproffs_usa[2] = { { 0x2BDC5, 0x022A }, { 0x0BFEA, 0x000C } };
838 static const ScummNESFile::Resource res_sproffs_eur[2] = { { 0x2FD42, 0x022A }, { 0x0BEF3, 0x000C } };
839 static const ScummNESFile::Resource res_sproffs_swe[2] = { { 0x2BCE0, 0x022A }, { 0x0BF4C, 0x000C } };
840 static const ScummNESFile::Resource res_sproffs_fra[2] = { { 0x2F959, 0x022A }, { 0x07F32, 0x000C } };
841 static const ScummNESFile::Resource res_sproffs_ger[2] = { { 0x2F81F, 0x022A }, { 0x0BF61, 0x000C } };
842 static const ScummNESFile::Resource res_sproffs_esp[2] = { { 0x2F447, 0x022A }, { 0x0BF6F, 0x000C } };
843 static const ScummNESFile::Resource res_sproffs_ita[2] = { { 0x2BC37, 0x022A }, { 0x0BF48, 0x000C } };
844 
845 const ScummNESFile::ResourceGroup res_sproffs = {
846 	ScummNESFile::NES_SPROFFS,
847 	{
848 	res_sproffs_usa,
849 	res_sproffs_eur,
850 	res_sproffs_swe,
851 	res_sproffs_fra,
852 	res_sproffs_ger,
853 	res_sproffs_esp,
854 	res_sproffs_ita,
855 	}
856 };
857 
858 // sprite data sets (packed NES sprite data)
859 static const ScummNESFile::Resource res_sprdata_usa[2] = { { 0x2CE11, 0x2BE0 }, { 0x07F6B, 0x008A } };
860 static const ScummNESFile::Resource res_sprdata_eur[2] = { { 0x2CE11, 0x2BE0 }, { 0x0BE28, 0x008A } };
861 static const ScummNESFile::Resource res_sprdata_swe[2] = { { 0x2C401, 0x2BE0 }, { 0x0FE6B, 0x008A } };
862 static const ScummNESFile::Resource res_sprdata_fra[2] = { { 0x2CA28, 0x2BE0 }, { 0x07E48, 0x008A } };
863 static const ScummNESFile::Resource res_sprdata_ger[2] = { { 0x2C8EE, 0x2BE0 }, { 0x0FE61, 0x008A } };
864 static const ScummNESFile::Resource res_sprdata_esp[2] = { { 0x2C401, 0x2BE0 }, { 0x0FE67, 0x008A } };
865 static const ScummNESFile::Resource res_sprdata_ita[2] = { { 0x2C8C0, 0x2BE0 }, { 0x0FE61, 0x008A } };
866 
867 const ScummNESFile::ResourceGroup res_sprdata = {
868 	ScummNESFile::NES_SPRDATA,
869 	{
870 	res_sprdata_usa,
871 	res_sprdata_eur,
872 	res_sprdata_swe,
873 	res_sprdata_fra,
874 	res_sprdata_ger,
875 	res_sprdata_esp,
876 	res_sprdata_ita,
877 	}
878 };
879 
880 static const ScummNESFile::Resource res_charset_usa[1] = { { 0x3F6EE, 0x0090 } };
881 static const ScummNESFile::Resource res_charset_eur[1] = { { 0x3F724, 0x0090 } };
882 static const ScummNESFile::Resource res_charset_swe[1] = { { 0x3F739, 0x0090 } };
883 static const ScummNESFile::Resource res_charset_fra[1] = { { 0x3F739, 0x0090 } };
884 static const ScummNESFile::Resource res_charset_ger[1] = { { 0x3F739, 0x0090 } };
885 static const ScummNESFile::Resource res_charset_esp[1] = { { 0x3F739, 0x0090 } };
886 static const ScummNESFile::Resource res_charset_ita[1] = { { 0x3F739, 0x0090 } };
887 
888 const ScummNESFile::ResourceGroup res_charset = {
889 	ScummNESFile::NES_CHARSET,
890 	{
891 	res_charset_usa,
892 	res_charset_eur,
893 	res_charset_swe,
894 	res_charset_fra,
895 	res_charset_ger,
896 	res_charset_esp,
897 	res_charset_ita,
898 	}
899 };
900 
901 static const ScummNESFile::Resource res_preplist_usa[1] = { { 0x3FB5A, 0x000E } };
902 static const ScummNESFile::Resource res_preplist_eur[1] = { { 0x3FB90, 0x000E } };
903 static const ScummNESFile::Resource res_preplist_swe[1] = { { 0x3FBA9, 0x000E } };
904 static const ScummNESFile::Resource res_preplist_fra[1] = { { 0x3FBAF, 0x0010 } };
905 static const ScummNESFile::Resource res_preplist_ger[1] = { { 0x3FBAB, 0x000F } };
906 static const ScummNESFile::Resource res_preplist_esp[1] = { { 0x3FBAE, 0x000F } };
907 static const ScummNESFile::Resource res_preplist_ita[1] = { { 0x3FBAA, 0x0010 } };
908 
909 const ScummNESFile::ResourceGroup res_preplist = {
910 	ScummNESFile::NES_PREPLIST,
911 	{
912 	res_preplist_usa,
913 	res_preplist_eur,
914 	res_preplist_swe,
915 	res_preplist_fra,
916 	res_preplist_ger,
917 	res_preplist_esp,
918 	res_preplist_ita,
919 	}
920 };
921 
write_byte(Common::WriteStream * out,byte val)922 static uint16 write_byte(Common::WriteStream *out, byte val) {
923 	val ^= 0xFF;
924 	if (out != 0)
925 		out->writeByte(val);
926 	return 1;
927 }
928 
write_word(Common::WriteStream * out,uint16 val)929 static uint16 write_word(Common::WriteStream *out, uint16 val) {
930 	val ^= 0xFFFF;
931 	if (out != 0)
932 		out->writeUint16LE(val);
933 	return 2;
934 }
935 
fileReadByte()936 byte ScummNESFile::fileReadByte() {
937 	byte b = 0;
938 	File::read(&b, 1);
939 	return b;
940 }
941 
fileReadUint16LE()942 uint16 ScummNESFile::fileReadUint16LE() {
943 	uint16 a = fileReadByte();
944 	uint16 b = fileReadByte();
945 	return a | (b << 8);
946 }
947 
extractResource(Common::WriteStream * output,const Resource * res,ResType type)948 uint16 ScummNESFile::extractResource(Common::WriteStream *output, const Resource *res, ResType type) {
949 	uint16 len, i, j;
950 	byte val;
951 	byte cnt;
952 	uint16 reslen = 0;
953 
954 	if (res == NULL)
955 		error("extract_resource - no resource specified");
956 
957 	if ((res->offset == 0) && (res->length == 0))
958 		return 0;	/* there are 8 scripts that are zero bytes long, so we should skip them */
959 
960 	File::seek(res->offset, SEEK_SET);
961 
962 	switch (type) {
963 	case NES_GLOBDATA:
964 		len = res->length;
965 
966 		for (i = 0; i < len; i++)
967 			reslen += write_byte(output, fileReadByte());
968 
969 		break;
970 
971 	case NES_ROOMGFX:
972 	case NES_COSTUMEGFX:
973 		reslen += write_word(output, (uint16)(res->length + 2));
974 		len = fileReadByte();
975 		reslen += write_byte(output, (byte)len);
976 
977 		if (!len)
978 			len = 256;
979 		len = len << 4;
980 
981 		for (i = 0; i < len;) {
982 			reslen += write_byte(output, cnt = fileReadByte());
983 			for (j = 0; j < (cnt & 0x7F); j++, i++)
984 				if ((cnt & 0x80) || (j == 0))
985 					reslen += write_byte(output, fileReadByte());
986 		}
987 
988 		if (File::pos() - res->offset != res->length)
989 			error("extract_resource - length mismatch while extracting graphics resource (was %04X, should be %04X)", (int32)File::pos() - res->offset, res->length);
990 
991 		break;
992 
993 	case NES_ROOM:
994 	case NES_SCRIPT:
995 		len = fileReadUint16LE();
996 
997 		if (len != res->length)
998 			error("extract_resource - length mismatch while extracting room/script resource (was %04X, should be %04X)", len, res->length);
999 
1000 		File::seek(-2, SEEK_CUR);
1001 
1002 		for (i = 0; i < len; i++)
1003 			reslen += write_byte(output, fileReadByte());
1004 
1005 		break;
1006 
1007 	case NES_SOUND:
1008 		len = res->length + 2;
1009 		val = fileReadByte();
1010 		cnt = fileReadByte();
1011 
1012 		if ((val == 2) && (cnt == 100)) {
1013 			reslen += write_word(output, len);
1014 			reslen += write_byte(output, val);
1015 			reslen += write_byte(output, cnt);
1016 
1017 			cnt = fileReadByte();
1018 			reslen += write_byte(output, cnt);
1019 			for (i = 0; i < cnt; i++)
1020 				reslen += write_byte(output, fileReadByte());
1021 			for (i = 0; i < cnt; i++)
1022 				reslen += write_byte(output, fileReadByte());
1023 
1024 			while (1) {
1025 				reslen += write_byte(output, val = fileReadByte());
1026 				if (val >= 0xFE)
1027 					break;
1028 			}
1029 		} else if (((val == 0) || (val == 1) || (val == 4)) && (cnt == 10)) {
1030 			reslen += write_word(output, len);
1031 			reslen += write_byte(output, val);
1032 			reslen += write_byte(output, cnt);
1033 			while (1) {
1034 				reslen += write_byte(output, val = fileReadByte());
1035 
1036 				if (val >= 0xFE)
1037 					break;
1038 
1039 				if (val >= 0x10)
1040 					reslen += write_byte(output, fileReadByte());
1041 				else {
1042 					reslen += write_byte(output, fileReadByte());
1043 					reslen += write_byte(output, fileReadByte());
1044 					reslen += write_byte(output, fileReadByte());
1045 					reslen += write_byte(output, fileReadByte());
1046 				}
1047 			}
1048 		} else
1049 			error("extract_resource - unknown sound type %d/%d detected",val,cnt);
1050 
1051 		if (File::pos() - res->offset != res->length)
1052 			error("extract_resource - length mismatch while extracting sound resource (was %04X, should be %04X)", (int32)File::pos() - res->offset, res->length);
1053 
1054 		break;
1055 
1056 	case NES_COSTUME:
1057 	case NES_SPRPALS:
1058 	case NES_SPRDESC:
1059 	case NES_SPRLENS:
1060 	case NES_SPROFFS:
1061 	case NES_SPRDATA:
1062 	case NES_CHARSET:
1063 		len = res->length;
1064 		reslen += write_word(output, (uint16)(len + 2));
1065 
1066 		for (i = 0; i < len; i++)
1067 			reslen += write_byte(output, fileReadByte());
1068 
1069 		break;
1070 
1071 	case NES_PREPLIST:
1072 		len = res->length;
1073 		reslen += write_word(output, 0x002A);
1074 
1075 		reslen += write_byte(output, ' ');
1076 		for (i = 1; i < 8; i++)
1077 			reslen += write_byte(output, 0);
1078 
1079 		for (j = 0; j < 4; j++) {
1080 			reslen += write_byte(output,' ');
1081 			for (i = 1; (val = fileReadByte()); i++)
1082 				reslen += write_byte(output, val);
1083 			for (; i < 8; i++)
1084 				reslen += write_byte(output, 0);
1085 		}
1086 		break;
1087 
1088 	default:
1089 		error("extract_resource - unknown resource type %d specified", type);
1090 	}
1091 
1092 	return reslen;
1093 }
1094 
1095 struct ScummNESFile::LFLEntry {
1096 	const ResourceGroup *type;
1097 	int index;
1098 };
1099 
1100 // based on structure of Classic PC Maniac Mansion LFL files
1101 // (roomgfx resources are arranged in order, one per file,
1102 // after the room blocks)
1103 static const ScummNESFile::LFLEntry lfl_01[] = { {&res_rooms, 1}, {&res_roomgfx, 1}, {&res_scripts, 57}, {&res_scripts, 61}, {&res_scripts, 76}, {&res_scripts, 105}, {&res_scripts, 111}, {&res_sounds, 5}, {&res_scripts, 132}, {&res_scripts, 148}, {&res_scripts, 155}, {&res_scripts, 156}, {&res_sounds, 39}, {NULL, 0} };
1104 static const ScummNESFile::LFLEntry lfl_02[] = { {&res_rooms, 2}, {&res_roomgfx, 2}, {NULL, 0} };
1105 static const ScummNESFile::LFLEntry lfl_03[] = { {&res_rooms, 3}, {&res_roomgfx, 3}, {&res_scripts, 21}, {&res_sounds, 26}, {NULL, 0} };
1106 static const ScummNESFile::LFLEntry lfl_04[] = { {&res_rooms, 4}, {&res_roomgfx, 4}, {&res_scripts, 46}, {&res_scripts, 56}, {&res_scripts, 137}, {&res_scripts, 146}, {&res_sounds, 12}, {&res_sounds, 11}, {&res_sounds, 13}, {&res_sounds, 42}, {NULL, 0} };
1107 static const ScummNESFile::LFLEntry lfl_05[] = { {&res_rooms, 5}, {&res_roomgfx, 5}, {&res_scripts, 30}, {&res_scripts, 31}, {&res_scripts, 32}, {&res_scripts, 33}, {&res_scripts, 34}, {&res_scripts, 35}, {&res_sounds, 22}, {&res_sounds, 23}, {&res_sounds, 24}, {&res_sounds, 21}, {&res_sounds, 46}, {NULL, 0} };
1108 static const ScummNESFile::LFLEntry lfl_06[] = { {&res_rooms, 6}, {&res_roomgfx, 6}, {NULL, 0} };
1109 static const ScummNESFile::LFLEntry lfl_07[] = { {&res_rooms, 7}, {&res_roomgfx, 7}, {&res_scripts, 17}, {&res_scripts, 58}, {&res_scripts, 59}, {&res_scripts, 60}, {&res_scripts, 74}, {&res_scripts, 81}, {&res_scripts, 82}, {&res_scripts, 150}, {&res_sounds, 14}, {&res_sounds, 15}, {&res_sounds, 16}, {&res_sounds, 17}, {NULL, 0} };
1110 static const ScummNESFile::LFLEntry lfl_08[] = { {&res_rooms, 8}, {&res_roomgfx, 8}, {&res_scripts, 7}, {&res_scripts, 12}, {&res_scripts, 13}, {&res_scripts, 47}, {&res_scripts, 48}, {&res_scripts, 49}, {&res_scripts, 154}, {&res_sounds, 32}, {&res_sounds, 33}, {&res_sounds, 36}, {NULL, 0} };
1111 static const ScummNESFile::LFLEntry lfl_09[] = { {&res_rooms, 9}, {&res_roomgfx, 9}, {&res_scripts, 10}, {&res_scripts, 11}, {&res_scripts, 45}, {&res_scripts, 55}, {&res_scripts, 84}, {&res_scripts, 85}, {&res_scripts, 86}, {NULL, 0} };
1112 static const ScummNESFile::LFLEntry lfl_10[] = { {&res_rooms, 10}, {&res_roomgfx, 10}, {&res_scripts, 24}, {&res_scripts, 149}, {&res_sounds, 28}, {NULL, 0} };
1113 static const ScummNESFile::LFLEntry lfl_11[] = { {&res_rooms, 11}, {&res_roomgfx, 11}, {&res_scripts, 166}, {&res_scripts, 167}, {&res_scripts, 168}, {NULL, 0} };
1114 static const ScummNESFile::LFLEntry lfl_12[] = { {&res_rooms, 12}, {&res_roomgfx, 12}, {&res_scripts, 51}, {&res_scripts, 103}, {&res_scripts, 104}, {&res_scripts, 161}, {&res_sounds, 63}, {&res_costumes, 14}, {NULL, 0} };
1115 static const ScummNESFile::LFLEntry lfl_13[] = { {&res_rooms, 13}, {&res_roomgfx, 13}, {NULL, 0} };
1116 static const ScummNESFile::LFLEntry lfl_14[] = { {&res_rooms, 14}, {&res_roomgfx, 14}, {NULL, 0} };
1117 static const ScummNESFile::LFLEntry lfl_15[] = { {&res_rooms, 15}, {&res_roomgfx, 15}, {&res_sounds, 27}, {NULL, 0} };
1118 static const ScummNESFile::LFLEntry lfl_16[] = { {&res_rooms, 16}, {&res_roomgfx, 16}, {&res_scripts, 14}, {&res_scripts, 121}, {&res_scripts, 122}, {&res_sounds, 40}, {&res_sounds, 64}, {&res_sounds, 68}, {NULL, 0} };
1119 static const ScummNESFile::LFLEntry lfl_17[] = { {&res_rooms, 17}, {&res_roomgfx, 17}, {&res_scripts, 20}, {&res_scripts, 100}, {&res_sounds, 25}, {&res_sounds, 44}, {&res_sounds, 2}, {&res_sounds, 50}, {&res_sounds, 52}, {NULL, 0} };
1120 static const ScummNESFile::LFLEntry lfl_18[] = { {&res_rooms, 18}, {&res_roomgfx, 18}, {&res_scripts, 25}, {&res_scripts, 26}, {&res_scripts, 27}, {&res_scripts, 28}, {&res_scripts, 64}, {&res_scripts, 65}, {&res_scripts, 66}, {&res_scripts, 67}, {&res_scripts, 68}, {&res_scripts, 69}, {&res_scripts, 70}, {&res_scripts, 71}, {&res_scripts, 73}, {&res_scripts, 101}, {&res_sounds, 35}, {NULL, 0} };
1121 static const ScummNESFile::LFLEntry lfl_19[] = { {&res_rooms, 19}, {&res_roomgfx, 19}, {&res_scripts, 36}, {&res_scripts, 37}, {&res_scripts, 38}, {&res_scripts, 39}, {&res_scripts, 40}, {&res_scripts, 152}, {&res_scripts, 153}, {&res_costumes, 10}, {NULL, 0} };
1122 static const ScummNESFile::LFLEntry lfl_20[] = { {&res_rooms, 20}, {&res_roomgfx, 20}, {&res_scripts, 107}, {&res_scripts, 108}, {&res_scripts, 109}, {&res_scripts, 110}, {&res_scripts, 159}, {NULL, 0} };
1123 static const ScummNESFile::LFLEntry lfl_21[] = { {&res_rooms, 21}, {&res_roomgfx, 21}, {&res_scripts, 41}, {&res_scripts, 42}, {&res_scripts, 43}, {&res_scripts, 53}, {&res_scripts, 136}, {&res_sounds, 29}, {&res_sounds, 20}, {&res_sounds, 37}, {NULL, 0} };
1124 static const ScummNESFile::LFLEntry lfl_22[] = { {&res_rooms, 22}, {&res_roomgfx, 22}, {&res_scripts, 15}, {NULL, 0} };
1125 static const ScummNESFile::LFLEntry lfl_23[] = { {&res_rooms, 23}, {&res_roomgfx, 23}, {&res_scripts, 77}, {&res_scripts, 79}, {&res_scripts, 80}, {&res_scripts, 83}, {&res_sounds, 41}, {NULL, 0} };
1126 static const ScummNESFile::LFLEntry lfl_24[] = { {&res_rooms, 24}, {&res_roomgfx, 24}, {&res_scripts, 18}, {&res_scripts, 19}, {&res_scripts, 78}, {&res_sounds, 7}, {&res_sounds, 3}, {&res_sounds, 18}, {&res_sounds, 34}, {&res_costumes, 12}, {NULL, 0} };
1127 static const ScummNESFile::LFLEntry lfl_25[] = { {&res_rooms, 25}, {&res_roomgfx, 25}, {&res_scripts, 29}, {&res_sounds, 30}, {&res_sounds, 31}, {NULL, 0} };
1128 static const ScummNESFile::LFLEntry lfl_26[] = { {&res_rooms, 26}, {&res_roomgfx, 26}, {&res_scripts, 87}, {&res_scripts, 88}, {&res_scripts, 89}, {&res_scripts, 90}, {&res_scripts, 91}, {&res_scripts, 92}, {&res_scripts, 93}, {&res_scripts, 94}, {&res_scripts, 95}, {&res_scripts, 96}, {&res_scripts, 97}, {&res_scripts, 98}, {&res_scripts, 116}, {&res_scripts, 151}, {&res_scripts, 174}, {&res_costumes, 11}, {NULL, 0} };
1129 static const ScummNESFile::LFLEntry lfl_27[] = { {&res_rooms, 27}, {&res_roomgfx, 27}, {&res_scripts, 16}, {&res_scripts, 52}, {&res_scripts, 54}, {&res_scripts, 113}, {&res_sounds, 45}, {&res_costumes, 19}, {NULL, 0} };
1130 static const ScummNESFile::LFLEntry lfl_28[] = { {&res_rooms, 28}, {&res_roomgfx, 28}, {&res_scripts, 22}, {&res_scripts, 23}, {NULL, 0} };
1131 static const ScummNESFile::LFLEntry lfl_29[] = { {&res_rooms, 29}, {&res_roomgfx, 29}, {&res_scripts, 75}, {&res_sounds, 43}, {NULL, 0} };
1132 static const ScummNESFile::LFLEntry lfl_30[] = { {&res_rooms, 30}, {&res_roomgfx, 30}, {&res_scripts, 63}, {&res_sounds, 0}, {&res_scripts, 123}, {&res_scripts, 125}, {&res_scripts, 126}, {&res_scripts, 127}, {&res_scripts, 129}, {&res_sounds, 55}, {&res_sounds, 59}, {&res_sounds, 60}, {&res_costumes, 8}, {NULL, 0} };
1133 static const ScummNESFile::LFLEntry lfl_31[] = { {&res_rooms, 31}, {&res_roomgfx, 31}, {&res_scripts, 99}, {&res_scripts, 115}, {&res_scripts, 117}, {&res_scripts, 119}, {&res_scripts, 147}, {&res_scripts, 157}, {&res_scripts, 158}, {&res_scripts, 160}, {&res_costumes, 13}, {&res_costumes, 9}, {&res_costumes, 23}, {&res_costumes, 24}, {NULL, 0} };
1134 static const ScummNESFile::LFLEntry lfl_32[] = { {&res_rooms, 32}, {&res_roomgfx, 32}, {&res_costumes, 15}, {NULL, 0} };
1135 static const ScummNESFile::LFLEntry lfl_33[] = { {&res_rooms, 33}, {&res_roomgfx, 33}, {&res_scripts, 120}, {&res_scripts, 135}, {&res_sounds, 56}, {&res_sounds, 57}, {&res_sounds, 58}, {&res_sounds, 1}, {&res_costumes, 22}, {NULL, 0} };
1136 static const ScummNESFile::LFLEntry lfl_34[] = { {&res_rooms, 34}, {&res_roomgfx, 34}, {NULL, 0} };
1137 static const ScummNESFile::LFLEntry lfl_35[] = { {&res_rooms, 35}, {&res_roomgfx, 35}, {NULL, 0} };
1138 static const ScummNESFile::LFLEntry lfl_36[] = { {&res_rooms, 36}, {&res_roomgfx, 36}, {&res_sounds, 10}, {&res_sounds, 4}, {NULL, 0} };
1139 static const ScummNESFile::LFLEntry lfl_37[] = { {&res_rooms, 37}, {&res_roomgfx, 37}, {NULL, 0} };
1140 static const ScummNESFile::LFLEntry lfl_38[] = { {&res_rooms, 38}, {&res_roomgfx, 38}, {&res_scripts, 138}, {&res_scripts, 139}, {&res_scripts, 140}, {&res_scripts, 141}, {&res_scripts, 142}, {&res_scripts, 143}, {&res_scripts, 144}, {&res_scripts, 145}, {NULL, 0} };
1141 static const ScummNESFile::LFLEntry lfl_39[] = { {&res_rooms, 39}, {&res_roomgfx, 39}, {NULL, 0} };
1142 static const ScummNESFile::LFLEntry lfl_40[] = { {&res_rooms, 40}, {&res_roomgfx, 0}, {&res_scripts, 112}, {&res_costumes, 17}, {NULL, 0} };
1143 static const ScummNESFile::LFLEntry lfl_41[] = { {&res_rooms, 41}, {&res_scripts, 106}, {&res_sounds, 47}, {&res_sounds, 48}, {&res_sounds, 53}, {&res_sounds, 49}, {&res_sounds, 51}, {NULL, 0} };
1144 static const ScummNESFile::LFLEntry lfl_42[] = { {&res_rooms, 42}, {&res_scripts, 124}, {&res_costumes, 18}, {NULL, 0} };
1145 static const ScummNESFile::LFLEntry lfl_43[] = { {&res_rooms, 43}, {&res_scripts, 44}, {&res_sounds, 19}, {NULL, 0} };
1146 static const ScummNESFile::LFLEntry lfl_44[] = { {&res_rooms, 44}, {&res_scripts, 102}, {&res_sounds, 6}, {&res_sounds, 38}, {&res_sounds, 8}, {&res_sounds, 9}, {&res_costumes, 1}, {&res_costumes, 2}, {&res_costumes, 5}, {&res_costumes, 6}, {&res_costumes, 3}, {&res_costumes, 4}, {&res_costumes, 7}, {NULL, 0} };
1147 static const ScummNESFile::LFLEntry lfl_45[] = { {&res_rooms, 45}, {&res_scripts, 1}, {&res_scripts, 2}, {&res_scripts, 3}, {&res_scripts, 4}, {&res_scripts, 5}, {&res_scripts, 9}, {&res_scripts, 114}, {&res_scripts, 131}, {&res_scripts, 164}, {&res_scripts, 165}, {&res_scripts, 169}, {&res_scripts, 170}, {&res_scripts, 171}, {&res_scripts, 172}, {&res_scripts, 173}, {&res_scripts, 175}, {&res_sounds, 54}, {NULL, 0} };
1148 static const ScummNESFile::LFLEntry lfl_46[] = { {&res_rooms, 46}, {&res_scripts, 130}, {&res_sounds, 65}, {&res_costumes, 0}, {&res_costumes, 21}, {NULL, 0} };
1149 static const ScummNESFile::LFLEntry lfl_47[] = { {&res_rooms, 47}, {&res_scripts, 62}, {&res_sounds, 69}, {NULL, 0} };
1150 static const ScummNESFile::LFLEntry lfl_48[] = { {&res_rooms, 48}, {NULL, 0} };
1151 static const ScummNESFile::LFLEntry lfl_49[] = { {&res_rooms, 49}, {NULL, 0} };
1152 static const ScummNESFile::LFLEntry lfl_50[] = { {&res_rooms, 50}, {&res_scripts, 133}, {&res_scripts, 163}, {NULL, 0} };
1153 static const ScummNESFile::LFLEntry lfl_51[] = { {&res_rooms, 51}, {&res_scripts, 118}, {&res_scripts, 128}, {&res_sounds, 61}, {&res_sounds, 62}, {&res_sounds, 67}, {&res_sounds, 66}, {&res_costumes, 16}, {&res_costumes, 20}, {NULL, 0} };
1154 static const ScummNESFile::LFLEntry lfl_52[] = { {&res_rooms, 52}, {NULL, 0} };
1155 // remaining 'standard' resources (not used by any of the original LFL files)
1156 static const ScummNESFile::LFLEntry lfl_53[] = { {&res_rooms, 53}, {&res_scripts, 177}, {&res_scripts, 178}, {&res_sounds, 70}, {&res_sounds, 71}, {&res_sounds, 72}, {&res_sounds, 73}, {&res_sounds, 74}, {&res_sounds, 75}, {&res_sounds, 76}, {&res_sounds, 77}, {&res_sounds, 78}, {&res_sounds, 79}, {&res_sounds, 80}, {&res_sounds, 81}, {NULL, 0} };
1157 // all 'non-standard' resources (the costume-related stuff)
1158 static const ScummNESFile::LFLEntry lfl_54[] = { {&res_rooms, 54}, {&res_sprdesc, 0}, {&res_sprdesc, 1}, {&res_sprlens, 0}, {&res_sprlens, 1}, {&res_sproffs, 0}, {&res_sproffs, 1}, {&res_sprdata, 0}, {&res_sprdata, 1}, {&res_costumegfx, 0}, {&res_costumegfx, 1}, {&res_sprpals, 0}, {&res_sprpals, 1}, {&res_charset, 0}, {&res_preplist, 0}, {NULL, 0} };
1159 
1160 struct ScummNESFile::LFL {
1161 	int num;
1162 	const ScummNESFile::LFLEntry *entries;
1163 };
1164 
1165 static const ScummNESFile::LFL lfls[] = {
1166 	{  1, lfl_01 },
1167 	{  2, lfl_02 },
1168 	{  3, lfl_03 },
1169 	{  4, lfl_04 },
1170 	{  5, lfl_05 },
1171 	{  6, lfl_06 },
1172 	{  7, lfl_07 },
1173 	{  8, lfl_08 },
1174 	{  9, lfl_09 },
1175 	{ 10, lfl_10 },
1176 	{ 11, lfl_11 },
1177 	{ 12, lfl_12 },
1178 	{ 13, lfl_13 },
1179 	{ 14, lfl_14 },
1180 	{ 15, lfl_15 },
1181 	{ 16, lfl_16 },
1182 	{ 17, lfl_17 },
1183 	{ 18, lfl_18 },
1184 	{ 19, lfl_19 },
1185 	{ 20, lfl_20 },
1186 	{ 21, lfl_21 },
1187 	{ 22, lfl_22 },
1188 	{ 23, lfl_23 },
1189 	{ 24, lfl_24 },
1190 	{ 25, lfl_25 },
1191 	{ 26, lfl_26 },
1192 	{ 27, lfl_27 },
1193 	{ 28, lfl_28 },
1194 	{ 29, lfl_29 },
1195 	{ 30, lfl_30 },
1196 	{ 31, lfl_31 },
1197 	{ 32, lfl_32 },
1198 	{ 33, lfl_33 },
1199 	{ 34, lfl_34 },
1200 	{ 35, lfl_35 },
1201 	{ 36, lfl_36 },
1202 	{ 37, lfl_37 },
1203 	{ 38, lfl_38 },
1204 	{ 39, lfl_39 },
1205 	{ 40, lfl_40 },
1206 	{ 41, lfl_41 },
1207 	{ 42, lfl_42 },
1208 	{ 43, lfl_43 },
1209 	{ 44, lfl_44 },
1210 	{ 45, lfl_45 },
1211 	{ 46, lfl_46 },
1212 	{ 47, lfl_47 },
1213 	{ 48, lfl_48 },
1214 	{ 49, lfl_49 },
1215 	{ 50, lfl_50 },
1216 	{ 51, lfl_51 },
1217 	{ 52, lfl_52 },
1218 	{ 53, lfl_53 },
1219 	{ 54, lfl_54 },
1220 	{ -1, NULL }
1221 };
1222 
1223 #include "common/pack-start.h"	// START STRUCT PACKING
1224 
1225 struct _lfl_index {
1226 	byte	room_lfl[55];
1227 	uint16	room_addr[55];
1228 	byte	costume_lfl[80];
1229 	uint16	costume_addr[80];
1230 	byte	script_lfl[200];
1231 	uint16	script_addr[200];
1232 	byte	sound_lfl[100];
1233 	uint16	sound_addr[100];
1234 } PACKED_STRUCT;
1235 
1236 #include "common/pack-end.h"	// END STRUCT PACKING
1237 
generateResource(int res)1238 bool ScummNESFile::generateResource(int res) {
1239 	const LFL *lfl = &lfls[res - 1];
1240 	int j;
1241 	int bufsize = 2;
1242 
1243 	for (j = 0; lfl->entries[j].type != NULL; j++)
1244 		bufsize += extractResource(0, &lfl->entries[j].type->langs[_ROMset][lfl->entries[j].index], lfl->entries[j].type->type);
1245 
1246 	free(_buf);
1247 	_buf = (byte *)calloc(1, bufsize);
1248 
1249 	Common::MemoryWriteStream out(_buf, bufsize);
1250 
1251 	for (j = 0; lfl->entries[j].type != NULL; j++) {
1252 		const Resource *entry = &lfl->entries[j].type->langs[_ROMset][lfl->entries[j].index];
1253 		extractResource(&out, entry, lfl->entries[j].type->type);
1254 	}
1255 	write_byte(&out, 0xD1);
1256 	write_byte(&out, 0xF5);
1257 
1258 	delete _stream;
1259 
1260 	_stream = new Common::MemoryReadStream(_buf, bufsize);
1261 
1262 	return true;
1263 }
1264 
generateIndex()1265 bool ScummNESFile::generateIndex() {
1266 	int i, j;
1267 	_lfl_index lfl_index;
1268 
1269 	memset(&lfl_index, 0, sizeof(lfl_index));
1270 
1271 	for (i = 0; lfls[i].num != -1; i++) {
1272 		const LFL *lfl = &lfls[i];
1273 		uint16 respos = 0;
1274 
1275 		for (j = 0; lfl->entries[j].type != NULL; j++) {
1276 			const LFLEntry *entry = &lfl->entries[j];
1277 
1278 			switch (entry->type->type) {
1279 			case NES_ROOM:
1280 				lfl_index.room_lfl[entry->index] = lfl->num;
1281 				lfl_index.room_addr[entry->index] = TO_LE_16(respos);
1282 				break;
1283 			case NES_COSTUME:
1284 				lfl_index.costume_lfl[entry->index] = lfl->num;
1285 				lfl_index.costume_addr[entry->index] = TO_LE_16(respos);
1286 				break;
1287 			case NES_SPRDESC:
1288 				lfl_index.costume_lfl[entry->index + 25] = lfl->num;
1289 				lfl_index.costume_addr[entry->index + 25] = TO_LE_16(respos);
1290 				break;
1291 			case NES_SPRLENS:
1292 				lfl_index.costume_lfl[entry->index + 27] = lfl->num;
1293 				lfl_index.costume_addr[entry->index + 27] = TO_LE_16(respos);
1294 				break;
1295 			case NES_SPROFFS:
1296 				lfl_index.costume_lfl[entry->index + 29] = lfl->num;
1297 				lfl_index.costume_addr[entry->index + 29] = TO_LE_16(respos);
1298 				break;
1299 			case NES_SPRDATA:
1300 				lfl_index.costume_lfl[entry->index + 31] = lfl->num;
1301 				lfl_index.costume_addr[entry->index + 31] = TO_LE_16(respos);
1302 				break;
1303 			case NES_COSTUMEGFX:
1304 				lfl_index.costume_lfl[entry->index + 33] = lfl->num;
1305 				lfl_index.costume_addr[entry->index + 33] = TO_LE_16(respos);
1306 				break;
1307 			case NES_SPRPALS:
1308 				lfl_index.costume_lfl[entry->index + 35] = lfl->num;
1309 				lfl_index.costume_addr[entry->index + 35] = TO_LE_16(respos);
1310 				break;
1311 			case NES_ROOMGFX:
1312 				lfl_index.costume_lfl[entry->index + 37] = lfl->num;
1313 				lfl_index.costume_addr[entry->index + 37] = TO_LE_16(respos);
1314 				break;
1315 			case NES_SCRIPT:
1316 				lfl_index.script_lfl[entry->index] = lfl->num;
1317 				lfl_index.script_addr[entry->index] = TO_LE_16(respos);
1318 				break;
1319 			case NES_SOUND:
1320 				lfl_index.sound_lfl[entry->index] = lfl->num;
1321 				lfl_index.sound_addr[entry->index] = TO_LE_16(respos);
1322 				break;
1323 			case NES_CHARSET:
1324 				lfl_index.costume_lfl[77] = lfl->num;
1325 				lfl_index.costume_addr[77] = TO_LE_16(respos);
1326 				break;
1327 			case NES_PREPLIST:
1328 				lfl_index.costume_lfl[78] = lfl->num;
1329 				lfl_index.costume_addr[78] = TO_LE_16(respos);
1330 				break;
1331 			default:
1332 				error("Unindexed entry found");
1333 				break;
1334 			}
1335 			respos += extractResource(0, &entry->type->langs[_ROMset][entry->index], entry->type->type);
1336 		}
1337 	}
1338 
1339 	int bufsize = 2;
1340 
1341 	bufsize += 775;
1342 	bufsize += sizeof(lfl_index);
1343 
1344 	free(_buf);
1345 	_buf = (byte *)calloc(1, bufsize);
1346 
1347 	Common::MemoryWriteStream out(_buf, bufsize);
1348 
1349 	write_byte(&out, 0x43);
1350 	write_byte(&out, 0x46);
1351 
1352 	extractResource(&out, &res_globdata.langs[_ROMset][0], res_globdata.type);
1353 
1354 	for (i = 0; i < (int)sizeof(lfl_index); i++)
1355 		write_byte(&out, ((byte *)&lfl_index)[i]);
1356 
1357 	delete _stream;
1358 
1359 	_stream = new Common::MemoryReadStream(_buf, bufsize);
1360 
1361 	return true;
1362 }
1363 
open(const Common::Path & filename)1364 bool ScummNESFile::open(const Common::Path &filename) {
1365 
1366 	if (_ROMset == kROMsetNum) {
1367 		Common::String md5str;
1368 		File f;
1369 		f.open(filename);
1370 		if (f.isOpen())
1371 			md5str = Common::computeStreamMD5AsString(f);
1372 		if (!md5str.empty()) {
1373 
1374 			if (md5str == "3905799e081b80a61d4460b7b733c206") {
1375 				_ROMset = kROMsetUSA;
1376 				debug(1, "ROM contents verified as Maniac Mansion (USA)");
1377 			} else if (md5str == "d8d07efcb88f396bee0b402b10c3b1c9") {
1378 				_ROMset = kROMsetEurope;
1379 				debug(1, "ROM contents verified as Maniac Mansion (Europe)");
1380 			} else if (md5str == "22d07d6c386c9c25aca5dac2a0c0d94b") {
1381 				_ROMset = kROMsetSweden;
1382 				debug(1, "ROM contents verified as Maniac Mansion (Sweden)");
1383 			} else if (md5str == "81bbfa181184cb494e7a81dcfa94fbd9") {
1384 				_ROMset = kROMsetFrance;
1385 				debug(2, "ROM contents verified as Maniac Mansion (France)");
1386 			} else if (md5str == "257f8c14d8c584f7ddd601bcb00920c7") {
1387 				_ROMset = kROMsetGermany;
1388 				debug(2, "ROM contents verified as Maniac Mansion (Germany)");
1389 			} else if (md5str == "f163cf53f7850e43fb482471e5c52e1a") {
1390 				_ROMset = kROMsetSpain;
1391 				debug(2, "ROM contents verified as Maniac Mansion (Spain)");
1392 			} else if (md5str == "54a68a5f5e3c86da42b7ca5f51e79b1d") {
1393 				_ROMset = kROMsetItaly;
1394 				debug(2, "ROM contents verified as Maniac Mansion (Italy)");
1395 			} else {
1396 				error("Unsupported Maniac Mansion ROM, md5: %s", md5str.c_str());
1397 				return false;
1398 			}
1399 		} else {
1400 			return false;
1401 		}
1402 	}
1403 
1404 	if (File::open(filename)) {
1405 		delete _stream;
1406 		_stream = 0;
1407 
1408 		free(_buf);
1409 		_buf = 0;
1410 
1411 		return true;
1412 	} else {
1413 		return false;
1414 	}
1415 }
1416 
close()1417 void ScummNESFile::close() {
1418 	delete _stream;
1419 	_stream = 0;
1420 
1421 	free(_buf);
1422 	_buf = 0;
1423 
1424 	File::close();
1425 }
1426 
openSubFile(const Common::String & filename)1427 bool ScummNESFile::openSubFile(const Common::String &filename) {
1428 	assert(isOpen());
1429 
1430 	const char *ext = strrchr(filename.c_str(), '.');
1431 	char resNum[3];
1432 	int res;
1433 
1434 	// We always have file name in form of XX.lfl
1435 	resNum[0] = ext[-2];
1436 	resNum[1] = ext[-1];
1437 	resNum[2] = 0;
1438 
1439 	res = atoi(resNum);
1440 
1441 	if (res == 0) {
1442 		return generateIndex();
1443 	} else {
1444 		return generateResource(res);
1445 	}
1446 }
1447 
read(void * dataPtr,uint32 dataSize)1448 uint32 ScummNESFile::read(void *dataPtr, uint32 dataSize) {
1449 	uint32 realLen = _stream->read(dataPtr, dataSize);
1450 
1451 	if (_encbyte) {
1452 		byte *p = (byte *)dataPtr;
1453 		byte *end = p + realLen;
1454 		while (p < end)
1455 			*p++ ^= _encbyte;
1456 	}
1457 
1458 	return realLen;
1459 }
1460 
1461 } // End of namespace Scumm
1462