SCI: Change the generated SCIFX code to arrays

The end result of these rules is palette adjustments, so there's no
reason to create custom code for each effect. Searching for palette
mods has an O(n) complexity, but the dataset is quite small, so it
should be negligible.
This commit is contained in:
Filippos Karapetis 2020-11-08 16:38:17 +02:00
parent 8cfef6c696
commit e9e30b0c23
4 changed files with 267 additions and 388 deletions

View File

@ -37,53 +37,66 @@ print("""
namespace Sci {
""")
def Chunker(seq, size):
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
def ModToIndex(m):
try:
return M.index(m)
return Mods.index(m)
except ValueError:
M.append(m)
return len(M)-1
Mods.append(m)
return len(Mods)-1
def PrintMods():
L = [ "\t{ " + ", ".join( [ "%4d" % (round(128 * (val - 1)),) for val in m ] ) + " }" for m in M ]
L = [ "\t{ " + ", ".join( [ "%4d" % (round(128 * (val - 1)),) for val in m ] ) + " }" for m in Mods ]
print("static const PaletteMod paletteMods" + GID + "[] = {")
print( ",\n".join(L) )
print("};")
def PrintPic(pic):
print("static void doCustomPic" + GID + "(GfxScreen *screen, int x) {")
print("\tbyte val = 0;")
print(pic)
print("\tif (val)")
print("\t\tscreen->setCurPaletteMapValue(val);")
print("}")
def PrintPic(pics, comments):
print("static const PicMod picMods" + GID + "[] = {")
def PrintView(view):
print("static void doCustomView" + GID + "(GfxScreen *screen, int x, int y, int z) {")
print("\tbyte val = 0;")
print(view)
print("\tif (val)")
print("\t\tscreen->setCurPaletteMapValue(val);")
print("}")
for comment in comments:
print("\t// " + comment)
def ParseList(l, v):
for chunk in Chunker(pics, 5):
t = ""
for pic in chunk:
t = t + "{ " + str(pic[0]).rjust(3, ' ') + ", " + str(pic[1]).rjust(2, ' ') + " }, "
print("\t" + t)
print("};")
def PrintView(views, comments):
print("static const ViewMod viewMods" + GID + "[] = {")
for comment in comments:
print("\t// " + comment)
for chunk in Chunker(views, 5):
t = ""
for view in chunk:
t = t + "{ " + str(view[0]).rjust(3, ' ') + ", " + str(view[1]).rjust(2, ' ') + ", " + str(view[2]).rjust(2, ' ') + ", " + str(view[3]).rjust(2, ' ') + " }, "
print("\t" + t)
print("};")
def ParseList(l):
assert(l[0] == '(')
e = l.find(")")
L = l[1:e].split(",")
tests = ""
tests = []
for t in L:
t = t.strip()
ell = t.find('..')
if ell >= 0:
start = int(t[0:ell])
end = int(t[ell+2:])
# interval
test = "(" + v + " >= " + t[0:ell] + " && " + v + " <= " + t[ell+2:] + ")"
for x in range(start, end + 1):
tests.append(x)
else:
test = v + " == " + t
if tests:
tests = tests + " || " + test
else:
tests = test
tests = "(" + tests + ")"
tests.append(t)
return l[e+1:], tests
def ParseTriple(l):
@ -96,10 +109,11 @@ def ParseTriple(l):
GIDs = []
for F in sys.argv[1:]:
pic = ""
view = ""
M = [(1.,1.,1.)]
GID=""
comments = []
pics = []
views = []
Mods = [(1.,1.,1.)]
GID = ""
for l in open(F, "r").readlines():
l = l.strip()
@ -107,8 +121,9 @@ for F in sys.argv[1:]:
continue
if l[0] == '#':
comment = l[1:].strip()
pic += " // " + comment + "\n"
view += " // " + comment + "\n"
# Only add the top comments (before the game ID is set)
if (GID == ""):
comments.append(comment)
continue
if l[0:6] == "gameid":
assert(GID == "")
@ -128,15 +143,14 @@ for F in sys.argv[1:]:
else:
assert(False)
S = ""
l,t = ParseList(l, "x")
S = S + "\tif " + t + "\n "
ids = []
loops = [-1]
cels = [-1]
l,ids = ParseList(l)
if l[0] == "(":
l,t = ParseList(l, "y")
S = S + "\tif " + t + "\n "
l,loops = ParseList(l)
if l[0] == "(":
l,t = ParseList(l, "z")
S = S + "\tif " + t + "\n "
l,cels = ParseList(l)
l = l.strip()
assert(l[0:2] == "*=")
assert(l[-1] == ";")
@ -146,11 +160,14 @@ for F in sys.argv[1:]:
val = (float(v) for v in val)
else:
val = (float(l), float(l), float(l))
S = S + "\tval = " + str(ModToIndex(val)) + "; // color * " + l + "\n"
if ruletype == "pic":
pic = pic + S
for pic in ids:
pics.append([pic, ModToIndex(val)])
elif ruletype == "view":
view = view + S
for view in ids:
for loop in loops:
for cel in cels:
views.append([view, loop, cel, ModToIndex(val)])
if GID == "":
raise ValueError("No gameid specified")
@ -159,45 +176,56 @@ for F in sys.argv[1:]:
PrintMods()
print()
PrintPic(pic)
PrintPic(pics, comments)
print()
PrintView(view)
PrintView(views, comments)
print()
print("void setupCustomPaletteMods(GfxScreen *screen) {")
print("\tswitch (g_sci->getGameId()) {")
print("static const SciFxMod mods[] = {")
for GID in GIDs:
print("\tcase GID_" + GID + ":")
print("\t\tscreen->setPaletteMods(paletteMods" + GID + ", ARRAYSIZE(paletteMods" + GID + "));")
print("\t\tbreak;")
print("\tdefault:")
print("\t\tbreak;")
print("\t}")
print("}")
print()
print("\t{{ GID_{0}, paletteMods{0}, ARRAYSIZE(paletteMods{0}), picMods{0}, ARRAYSIZE(picMods{0}), viewMods{0}, ARRAYSIZE(viewMods{0}) }},".format(GID));
print("};")
print("void doCustomViewPalette(GfxScreen *screen, int x, int y, int z) {")
print("\tswitch (g_sci->getGameId()) {")
for GID in GIDs:
print("\tcase GID_" + GID + ":")
print("\t\tdoCustomView" + GID + "(screen, x, y, z);")
print("\t\tbreak;")
print("\tdefault:")
print("\t\tbreak;")
print("\t}")
print("}")
print()
print("""
void setupCustomPaletteMods(GfxScreen *screen) {
for (int i = 0; i < ARRAYSIZE(mods); i++) {
if (mods[i].gameId == g_sci->getGameId()) {
screen->setPaletteMods(mods[i].paletteMods, mods[i].paletteModsSize);
break;
}
}
}
print("void doCustomPicPalette(GfxScreen *screen, int x) {")
print("\tswitch (g_sci->getGameId()) {")
for GID in GIDs:
print("\tcase GID_" + GID + ":")
print("\t\tdoCustomPic" + GID + "(screen, x);")
print("\t\tbreak;")
print("\tdefault:")
print("\t\tbreak;")
print("\t}")
print("}")
print()
void doCustomViewPalette(GfxScreen *screen, GuiResourceId view, int16 loop, int16 cel) {
for (int i = 0; i < ARRAYSIZE(mods); i++) {
SciFxMod mod = mods[i];
if (mod.gameId == g_sci->getGameId()) {
for (int j = 0; j < mod.viewModsSize; j++) {
ViewMod m = mod.viewMods[j];
if (m.id == view && (m.loop == -1 || m.loop == loop) && (m.cel == -1 || m.cel == cel)) {
screen->setCurPaletteMapValue(m.multiplier);
break;
}
}
break;
}
}
}
print("}")
void doCustomPicPalette(GfxScreen *screen, GuiResourceId pic) {
for (int i = 0; i < ARRAYSIZE(mods); i++) {
SciFxMod mod = mods[i];
if (mod.gameId == g_sci->getGameId()) {
for (int j = 0; j < mod.picModsSize; j++) {
PicMod m = mod.picMods[j];
if (m.id == pic) {
screen->setCurPaletteMapValue(m.multiplier);
break;
}
}
break;
}
}
}
}""")

View File

@ -31,6 +31,7 @@
#include "graphics/pixelformat.h"
#include "graphics/surface.h"
#endif
#include "sci/detection.h"
#include "sci/engine/vm_types.h"
#include "sci/graphics/helpers_detection_enums.h" // for enum ViewType
@ -269,6 +270,28 @@ struct PaletteMod {
int8 r, g, b;
};
struct PicMod {
uint16 id;
byte multiplier;
};
struct ViewMod {
uint16 id;
int16 loop;
int16 cel;
byte multiplier;
};
struct SciFxMod {
SciGameId gameId;
const PaletteMod *paletteMods;
const int paletteModsSize;
const PicMod *picMods;
const int picModsSize;
const ViewMod *viewMods;
const int viewModsSize;
};
struct PalSchedule {
byte from;
uint32 schedule;

View File

@ -49,112 +49,70 @@ static const PaletteMod paletteModsLSL2[] = {
{ 13, 0, 0 }
};
static void doCustomPicLSL2(GfxScreen *screen, int x) {
byte val = 0;
static const PicMod picModsLSL2[] = {
// LSL2 per-resource palette configuration
// Copyright (C) 2006 Matt Hargett
// ego
if (x == 28 || x == 99)
val = 1; // color * 1.25
if (x == 96)
val = 5; // color * 1.1
if (x == 92 || x == 93 || x == 18 || (x >= 20 && x <= 26) || x == 134 || x == 40 || x == 50 || (x >= 76 && x <= 82) || x == 181)
val = 2; // color * 0.9
if ((x >= 114 && x <= 118) || x == 125 || (x >= 11 && x <= 17) || x == 19 || x == 43 || (x >= 70 && x <= 74) || x == 44 || x == 86 || (x >= 101 && x <= 104) || x == 32 || x == 33 || x == 35 || x == 36 || x == 95)
val = 13; // color * 0.85
// titles
if (x == 10 || x == 90 || x == 91)
val = 15; // color * 0.4
// misc effects
{ 28, 1 }, { 99, 1 }, { 96, 5 }, { 92, 2 }, { 93, 2 },
{ 18, 2 }, { 20, 2 }, { 21, 2 }, { 22, 2 }, { 23, 2 },
{ 24, 2 }, { 25, 2 }, { 26, 2 }, { 134, 2 }, { 40, 2 },
{ 50, 2 }, { 76, 2 }, { 77, 2 }, { 78, 2 }, { 79, 2 },
{ 80, 2 }, { 81, 2 }, { 82, 2 }, { 181, 2 }, { 114, 13 },
{ 115, 13 }, { 116, 13 }, { 117, 13 }, { 118, 13 }, { 125, 13 },
{ 11, 13 }, { 12, 13 }, { 13, 13 }, { 14, 13 }, { 15, 13 },
{ 16, 13 }, { 17, 13 }, { 19, 13 }, { 43, 13 }, { 70, 13 },
{ 71, 13 }, { 72, 13 }, { 73, 13 }, { 74, 13 }, { 44, 13 },
{ 86, 13 }, { 101, 13 }, { 102, 13 }, { 103, 13 }, { 104, 13 },
{ 32, 13 }, { 33, 13 }, { 35, 13 }, { 36, 13 }, { 95, 13 },
{ 10, 15 }, { 90, 15 }, { 91, 15 },
};
if (val)
screen->setCurPaletteMapValue(val);
}
static void doCustomViewLSL2(GfxScreen *screen, int x, int y, int z) {
byte val = 0;
static const ViewMod viewModsLSL2[] = {
// LSL2 per-resource palette configuration
// Copyright (C) 2006 Matt Hargett
// ego
if (x == 507 || x == 155 || x == 161 || x == 163 || x == 170 || x == 197 || x == 198 || x == 431 || x == 432 || (x >= 145 && x <= 159) || (x >= 131 && x <= 141) || x == 191 || x == 104 || x == 244 || x == 215 || x == 217 || x == 219 || x == 100 || x == 101 || x == 110 || x == 111 || x == 112 || x == 113 || x == 192 || x == 193 || x == 604 || (x >= 704 && x <= 706) || x == 717 || x == 718 || x == 818 || x == 819 || x == 822 || x == 823 || x == 824 || x == 831 || x == 832 || x == 833 || x == 834 || x == 835)
val = 1; // color * 1.25
if (x == 218)
if (y == 3)
val = 1; // color * 1.25
if (x == 218)
if ((y >= 0 && y <= 2))
val = 2; // color * 0.9
if (x == 820)
if (y == 0 || y == 1)
val = 2; // color * 0.9
if (x == 227 || x == 224 || x == 206 || x == 208 || x == 209 || x == 220)
val = 2; // color * 0.9
if (x == 221 || x == 254 || x == 252)
val = 3; // color * 0.7
if (x == 820)
if ((y >= 2 && y <= 4))
val = 4; // color * 1.2
if (x == 816)
if (y == 5)
if (z == 0)
val = 4; // color * 1.2
if (x == 516 || x == 509 || (x >= 501 && x <= 504) || (x >= 401 && x <= 403) || x == 408 || x == 409 || x == 411 || x == 413 || x == 414 || x == 417 || x == 418 || x == 419 || x == 430 || x == 310 || x == 302 || x == 303 || (x >= 120 && x <= 124) || x == 232 || x == 223 || x == 208 || x == 710 || x == 716 || x == 714)
val = 5; // color * 1.1
if ((x >= 434 && x <= 438) || x == 311 || x == 313 || x == 316 || x == 319 || x == 321 || x == 323 || x == 324 || (x >= 306 && x <= 309) || x == 248 || x == 245 || x == 246 || (x >= 233 && x <= 235) || x == 237 || x == 226 || x == 229 || x == 222 || x == 203 || x == 204 || x == 205 || x == 600 || x == 525 || x == 524 || x == 523 || x == 522 || x == 520 || x == 602 || x == 605 || x == 608 || (x >= 707 && x <= 708))
val = 4; // color * 1.2
if (x == 305)
if (y == 4)
val = 5; // color * 1.1
if (x == 305)
if ((y >= 0 && y <= 3))
val = 6; // color * 0.6
if (x == 661)
if (y == 0 || y == 1 || (y >= 3 && y <= 5))
val = 4; // color * 1.2
if (x == 661)
if (y == 2)
val = 3; // color * 0.7
if (x == 711 || x == 712 || x == 713 || x == 60)
val = 7; // color * (0.9, 1.0, 1.0)
if (x == 816)
if ((y >= 0 && y <= 4))
val = 2; // color * 0.9
if (x == 506 || x == 508 || x == 500 || x == 252 || x == 803 || x == 804 || x == 433)
val = 6; // color * 0.6
if (x == 513)
if ((y >= 0 && y <= 5))
val = 8; // color * 0.5
if ((x >= 240 && x <= 243) || x == 701 || x == 722)
val = 9; // color * 0.8
if (x == 700)
if (y == 1)
val = 10; // color * (0.6, 0.9, 1.0)
if (x == 610 || x == 611)
val = 11; // color * (0.9, 1.0, 1.1)
if (x == 607)
if (y == 1)
val = 9; // color * 0.8
if (x == 253 || x == 228 || x == 247 || x == 300 || x == 326)
val = 9; // color * 0.8
if (x == 412)
val = 12; // color * 1.3
// titles
if (x == 800 || x == 801)
val = 14; // color * 1.5
// misc effects
if (x == 702)
val = 16; // color * (1.1, 1.0, 1.0)
if (x == 519)
val = 9; // color * 0.8
if (x == 200)
if (y == 0)
val = 3; // color * 0.7
if (x == 201 || x == 202)
val = 9; // color * 0.8
if (val)
screen->setCurPaletteMapValue(val);
}
{ 507, -1, -1, 1 }, { 155, -1, -1, 1 }, { 161, -1, -1, 1 }, { 163, -1, -1, 1 }, { 170, -1, -1, 1 },
{ 197, -1, -1, 1 }, { 198, -1, -1, 1 }, { 431, -1, -1, 1 }, { 432, -1, -1, 1 }, { 145, -1, -1, 1 },
{ 146, -1, -1, 1 }, { 147, -1, -1, 1 }, { 148, -1, -1, 1 }, { 149, -1, -1, 1 }, { 150, -1, -1, 1 },
{ 151, -1, -1, 1 }, { 152, -1, -1, 1 }, { 153, -1, -1, 1 }, { 154, -1, -1, 1 }, { 155, -1, -1, 1 },
{ 156, -1, -1, 1 }, { 157, -1, -1, 1 }, { 158, -1, -1, 1 }, { 159, -1, -1, 1 }, { 131, -1, -1, 1 },
{ 132, -1, -1, 1 }, { 133, -1, -1, 1 }, { 134, -1, -1, 1 }, { 135, -1, -1, 1 }, { 136, -1, -1, 1 },
{ 137, -1, -1, 1 }, { 138, -1, -1, 1 }, { 139, -1, -1, 1 }, { 140, -1, -1, 1 }, { 141, -1, -1, 1 },
{ 191, -1, -1, 1 }, { 104, -1, -1, 1 }, { 244, -1, -1, 1 }, { 215, -1, -1, 1 }, { 217, -1, -1, 1 },
{ 219, -1, -1, 1 }, { 100, -1, -1, 1 }, { 101, -1, -1, 1 }, { 110, -1, -1, 1 }, { 111, -1, -1, 1 },
{ 112, -1, -1, 1 }, { 113, -1, -1, 1 }, { 192, -1, -1, 1 }, { 193, -1, -1, 1 }, { 604, -1, -1, 1 },
{ 704, -1, -1, 1 }, { 705, -1, -1, 1 }, { 706, -1, -1, 1 }, { 717, -1, -1, 1 }, { 718, -1, -1, 1 },
{ 818, -1, -1, 1 }, { 819, -1, -1, 1 }, { 822, -1, -1, 1 }, { 823, -1, -1, 1 }, { 824, -1, -1, 1 },
{ 831, -1, -1, 1 }, { 832, -1, -1, 1 }, { 833, -1, -1, 1 }, { 834, -1, -1, 1 }, { 835, -1, -1, 1 },
{ 218, 3, -1, 1 }, { 218, 0, -1, 2 }, { 218, 1, -1, 2 }, { 218, 2, -1, 2 }, { 820, 0, -1, 2 },
{ 820, 1, -1, 2 }, { 227, -1, -1, 2 }, { 224, -1, -1, 2 }, { 206, -1, -1, 2 }, { 208, -1, -1, 2 },
{ 209, -1, -1, 2 }, { 220, -1, -1, 2 }, { 221, -1, -1, 3 }, { 254, -1, -1, 3 }, { 252, -1, -1, 3 },
{ 820, 2, -1, 4 }, { 820, 3, -1, 4 }, { 820, 4, -1, 4 }, { 816, 5, 0, 4 }, { 516, -1, -1, 5 },
{ 509, -1, -1, 5 }, { 501, -1, -1, 5 }, { 502, -1, -1, 5 }, { 503, -1, -1, 5 }, { 504, -1, -1, 5 },
{ 401, -1, -1, 5 }, { 402, -1, -1, 5 }, { 403, -1, -1, 5 }, { 408, -1, -1, 5 }, { 409, -1, -1, 5 },
{ 411, -1, -1, 5 }, { 413, -1, -1, 5 }, { 414, -1, -1, 5 }, { 417, -1, -1, 5 }, { 418, -1, -1, 5 },
{ 419, -1, -1, 5 }, { 430, -1, -1, 5 }, { 310, -1, -1, 5 }, { 302, -1, -1, 5 }, { 303, -1, -1, 5 },
{ 120, -1, -1, 5 }, { 121, -1, -1, 5 }, { 122, -1, -1, 5 }, { 123, -1, -1, 5 }, { 124, -1, -1, 5 },
{ 232, -1, -1, 5 }, { 223, -1, -1, 5 }, { 208, -1, -1, 5 }, { 710, -1, -1, 5 }, { 716, -1, -1, 5 },
{ 714, -1, -1, 5 }, { 434, -1, -1, 4 }, { 435, -1, -1, 4 }, { 436, -1, -1, 4 }, { 437, -1, -1, 4 },
{ 438, -1, -1, 4 }, { 311, -1, -1, 4 }, { 313, -1, -1, 4 }, { 316, -1, -1, 4 }, { 319, -1, -1, 4 },
{ 321, -1, -1, 4 }, { 323, -1, -1, 4 }, { 324, -1, -1, 4 }, { 306, -1, -1, 4 }, { 307, -1, -1, 4 },
{ 308, -1, -1, 4 }, { 309, -1, -1, 4 }, { 248, -1, -1, 4 }, { 245, -1, -1, 4 }, { 246, -1, -1, 4 },
{ 233, -1, -1, 4 }, { 234, -1, -1, 4 }, { 235, -1, -1, 4 }, { 237, -1, -1, 4 }, { 226, -1, -1, 4 },
{ 229, -1, -1, 4 }, { 222, -1, -1, 4 }, { 203, -1, -1, 4 }, { 204, -1, -1, 4 }, { 205, -1, -1, 4 },
{ 600, -1, -1, 4 }, { 525, -1, -1, 4 }, { 524, -1, -1, 4 }, { 523, -1, -1, 4 }, { 522, -1, -1, 4 },
{ 520, -1, -1, 4 }, { 602, -1, -1, 4 }, { 605, -1, -1, 4 }, { 608, -1, -1, 4 }, { 707, -1, -1, 4 },
{ 708, -1, -1, 4 }, { 305, 4, -1, 5 }, { 305, 0, -1, 6 }, { 305, 1, -1, 6 }, { 305, 2, -1, 6 },
{ 305, 3, -1, 6 }, { 661, 0, -1, 4 }, { 661, 1, -1, 4 }, { 661, 3, -1, 4 }, { 661, 4, -1, 4 },
{ 661, 5, -1, 4 }, { 661, 2, -1, 3 }, { 711, -1, -1, 7 }, { 712, -1, -1, 7 }, { 713, -1, -1, 7 },
{ 60, -1, -1, 7 }, { 816, 0, -1, 2 }, { 816, 1, -1, 2 }, { 816, 2, -1, 2 }, { 816, 3, -1, 2 },
{ 816, 4, -1, 2 }, { 506, -1, -1, 6 }, { 508, -1, -1, 6 }, { 500, -1, -1, 6 }, { 252, -1, -1, 6 },
{ 803, -1, -1, 6 }, { 804, -1, -1, 6 }, { 433, -1, -1, 6 }, { 513, 0, -1, 8 }, { 513, 1, -1, 8 },
{ 513, 2, -1, 8 }, { 513, 3, -1, 8 }, { 513, 4, -1, 8 }, { 513, 5, -1, 8 }, { 240, -1, -1, 9 },
{ 241, -1, -1, 9 }, { 242, -1, -1, 9 }, { 243, -1, -1, 9 }, { 701, -1, -1, 9 }, { 722, -1, -1, 9 },
{ 700, 1, -1, 10 }, { 610, -1, -1, 11 }, { 611, -1, -1, 11 }, { 607, 1, -1, 9 }, { 253, -1, -1, 9 },
{ 228, -1, -1, 9 }, { 247, -1, -1, 9 }, { 300, -1, -1, 9 }, { 326, -1, -1, 9 }, { 412, -1, -1, 12 },
{ 800, -1, -1, 14 }, { 801, -1, -1, 14 }, { 702, -1, -1, 16 }, { 519, -1, -1, 9 }, { 200, 0, -1, 3 },
{ 201, -1, -1, 9 }, { 202, -1, -1, 9 },
};
static const PaletteMod paletteModsSQ3[] = {
{ 0, 0, 0 },
@ -171,227 +129,97 @@ static const PaletteMod paletteModsSQ3[] = {
{ 64, 64, 64 }
};
static void doCustomPicSQ3(GfxScreen *screen, int x) {
byte val = 0;
static const PicMod picModsSQ3[] = {
// SQ3 per-resource palette configuration
// Copyright (C) 2006 Matt Hargett
// ego
// ego on garbage lifter -- lighten but not so as to make the lifter be obviously weird
// ego's shadow
// ego's hands controlling robot
if (x == 96)
val = 2; // color * 1.15
// peeking at scumsoft
if (x == 81 || x == 82)
val = 2; // color * 1.15
// lifted by robot
if (x == 430)
val = 2; // color * 1.15
// computer controls
if (x == 17 || x == 18 || (x >= 162 && x <= 164) || x == 170 || x == 180 || x == 191 || x == 300)
val = 6; // color * 0.75
// title screen
if (x == 1)
val = 4; // color * 0.9
if (x == 926)
val = 4; // color * 0.9
// humans(?)
if (x == 117)
val = 2; // color * 1.15
// ships, planets, and robots
if ((x >= 205 && x <= 209) || (x >= 112 && x <= 115))
val = 4; // color * 0.9
if ((x >= 60 && x <= 72))
val = 4; // color * 0.9
if (x == 153)
val = 5; // color * 0.8
if (x == 690)
val = 4; // color * 0.9
// in the garbage scow
if ((x >= 1 && x <= 20))
val = 6; // color * 0.75
if (x == 157)
val = 9; // color * 0.6
// rats
// guys from andromeda
// misc text bubbles, effects, etc
{ 96, 2 }, { 81, 2 }, { 82, 2 }, { 430, 2 }, { 17, 6 },
{ 18, 6 }, { 162, 6 }, { 163, 6 }, { 164, 6 }, { 170, 6 },
{ 180, 6 }, { 191, 6 }, { 300, 6 }, { 1, 4 }, { 926, 4 },
{ 117, 2 }, { 205, 4 }, { 206, 4 }, { 207, 4 }, { 208, 4 },
{ 209, 4 }, { 112, 4 }, { 113, 4 }, { 114, 4 }, { 115, 4 },
{ 60, 4 }, { 61, 4 }, { 62, 4 }, { 63, 4 }, { 64, 4 },
{ 65, 4 }, { 66, 4 }, { 67, 4 }, { 68, 4 }, { 69, 4 },
{ 70, 4 }, { 71, 4 }, { 72, 4 }, { 153, 5 }, { 690, 4 },
{ 1, 6 }, { 2, 6 }, { 3, 6 }, { 4, 6 }, { 5, 6 },
{ 6, 6 }, { 7, 6 }, { 8, 6 }, { 9, 6 }, { 10, 6 },
{ 11, 6 }, { 12, 6 }, { 13, 6 }, { 14, 6 }, { 15, 6 },
{ 16, 6 }, { 17, 6 }, { 18, 6 }, { 19, 6 }, { 20, 6 },
{ 157, 9 },
};
if (val)
screen->setCurPaletteMapValue(val);
}
static void doCustomViewSQ3(GfxScreen *screen, int x, int y, int z) {
byte val = 0;
static const ViewMod viewModsSQ3[] = {
// SQ3 per-resource palette configuration
// Copyright (C) 2006 Matt Hargett
// ego
if (x == 0 || x == 8 || x == 11 || x == 12 || x == 14 || x == 68 || x == 17 || (x >= 22 && x <= 26) || x == 32 || x == 35 || x == 751 || x == 289 || x == 288 || x == 261 || x == 260 || x == 257 || x == 213 || x == 199 || x == 193 || x == 192 || x == 138 || x == 137 || x == 134 || x == 109 || x == 110 || x == 113 || x == 114 || x == 117 || x == 122 || x == 123 || x == 100 || x == 99 || x == 97 || x == 95 || x == 89 || x == 88 || x == 87 || x == 85 || x == 84 || x == 82 || x == 76 || x == 68 || x == 63 || x == 104)
val = 1; // color * 1.25
if (x == 136)
val = 2; // color * 1.15
if (x == 106)
if (y == 4 || y == 5 || y == 9)
val = 1; // color * 1.25
if (x == 105)
if (y == 0 || y == 1)
val = 1; // color * 1.25
// ego on garbage lifter -- lighten but not so as to make the lifter be obviously weird
if (x == 13)
if (y == 0)
if (z == 2)
val = 2; // color * 1.15
if (x == 31)
val = 2; // color * 1.15
if (x == 15)
if (y == 3)
if (z == 0)
val = 1; // color * 1.25
if (x == 16 || x == 19)
if (y == 0)
val = 1; // color * 1.25
if (x == 57)
if ((y >= 5 && y <= 6))
val = 1; // color * 1.25
if (x == 21)
if (y == 1)
val = 1; // color * 1.25
// ego's shadow
if (x == 7 || x == 18)
val = 3; // color * 0.5
if ((x >= 6 && x <= 8) || x == 18)
val = 4; // color * 0.9
if (x == 901)
val = 1; // color * 1.25
if (x == 751)
val = 1; // color * 1.25
if (x == 750)
if (y == 1)
val = 1; // color * 1.25
if (x == 92)
if (y == 4)
val = 1; // color * 1.25
if (x == 83)
if (y == 0)
val = 1; // color * 1.25
if (x == 83)
if (y == 1)
if (z == 2)
val = 2; // color * 1.15
if (x == 83)
if (y == 2)
if (z == 2)
val = 2; // color * 1.15
if (x == 78)
if (y == 3)
val = 1; // color * 1.25
if (x == 64)
if (y == 2 || y == 3)
val = 1; // color * 1.25
// ego's hands controlling robot
// peeking at scumsoft
// lifted by robot
// computer controls
if (x == 40 || x == 41 || x == 42 || x == 149 || x == 146 || x == 141 || x == 151 || x == 152)
val = 5; // color * 0.8
if (x == 70 || x == 2)
val = 4; // color * 0.9
// title screen
if (x == 900)
val = 4; // color * 0.9
// humans(?)
if (x == 593 || x == 93 || x == 103 || (x >= 131 && x <= 133) || x == 210 || x == 130 || x == 115)
val = 7; // color * 1.2
if (x == 116)
if ((y >= 1 && y <= 2))
val = 7; // color * 1.2
// ships, planets, and robots
if (x == 39)
val = 4; // color * 0.9
if (x == 1)
val = 6; // color * 0.75
if (x == 96)
val = 4; // color * 0.9
if (x == 77)
if ((y >= 0 && y <= 2))
val = 8; // color * 0.7
if (x == 259)
val = 2; // color * 1.15
// in the garbage scow
if (x == 20)
if (y == 0)
val = 3; // color * 0.5
// rats
if (x == 15)
if (y == 0 || y == 1)
val = 9; // color * 0.6
if (x == 34)
val = 9; // color * 0.6
// guys from andromeda
if (x == 128)
val = 4; // color * 0.9
if (x == 601 || x == 602)
val = 4; // color * 0.9
// misc text bubbles, effects, etc
if (x == 94)
val = 10; // color * 1.1
if (x == 91 || x == 73)
val = 11; // color * 1.5
if (x == 57)
if (y == 3 || y == 4)
val = 11; // color * 1.5
if (x == 15)
if (y == 4)
val = 11; // color * 1.5
if (x == 64)
if (y == 0)
val = 11; // color * 1.5
if (x == 71)
if (y == 8)
val = 11; // color * 1.5
if (x == 10)
if (y == 6)
val = 11; // color * 1.5
{ 0, -1, -1, 1 }, { 8, -1, -1, 1 }, { 11, -1, -1, 1 }, { 12, -1, -1, 1 }, { 14, -1, -1, 1 },
{ 68, -1, -1, 1 }, { 17, -1, -1, 1 }, { 22, -1, -1, 1 }, { 23, -1, -1, 1 }, { 24, -1, -1, 1 },
{ 25, -1, -1, 1 }, { 26, -1, -1, 1 }, { 32, -1, -1, 1 }, { 35, -1, -1, 1 }, { 751, -1, -1, 1 },
{ 289, -1, -1, 1 }, { 288, -1, -1, 1 }, { 261, -1, -1, 1 }, { 260, -1, -1, 1 }, { 257, -1, -1, 1 },
{ 213, -1, -1, 1 }, { 199, -1, -1, 1 }, { 193, -1, -1, 1 }, { 192, -1, -1, 1 }, { 138, -1, -1, 1 },
{ 137, -1, -1, 1 }, { 134, -1, -1, 1 }, { 109, -1, -1, 1 }, { 110, -1, -1, 1 }, { 113, -1, -1, 1 },
{ 114, -1, -1, 1 }, { 117, -1, -1, 1 }, { 122, -1, -1, 1 }, { 123, -1, -1, 1 }, { 100, -1, -1, 1 },
{ 99, -1, -1, 1 }, { 97, -1, -1, 1 }, { 95, -1, -1, 1 }, { 89, -1, -1, 1 }, { 88, -1, -1, 1 },
{ 87, -1, -1, 1 }, { 85, -1, -1, 1 }, { 84, -1, -1, 1 }, { 82, -1, -1, 1 }, { 76, -1, -1, 1 },
{ 68, -1, -1, 1 }, { 63, -1, -1, 1 }, { 104, -1, -1, 1 }, { 136, -1, -1, 2 }, { 106, 4, -1, 1 },
{ 106, 5, -1, 1 }, { 106, 9, -1, 1 }, { 105, 0, -1, 1 }, { 105, 1, -1, 1 }, { 13, 0, 2, 2 },
{ 31, -1, -1, 2 }, { 15, 3, 0, 1 }, { 16, 0, -1, 1 }, { 19, 0, -1, 1 }, { 57, 5, -1, 1 },
{ 57, 6, -1, 1 }, { 21, 1, -1, 1 }, { 7, -1, -1, 3 }, { 18, -1, -1, 3 }, { 6, -1, -1, 4 },
{ 7, -1, -1, 4 }, { 8, -1, -1, 4 }, { 18, -1, -1, 4 }, { 901, -1, -1, 1 }, { 751, -1, -1, 1 },
{ 750, 1, -1, 1 }, { 92, 4, -1, 1 }, { 83, 0, -1, 1 }, { 83, 1, 2, 2 }, { 83, 2, 2, 2 },
{ 78, 3, -1, 1 }, { 64, 2, -1, 1 }, { 64, 3, -1, 1 }, { 40, -1, -1, 5 }, { 41, -1, -1, 5 },
{ 42, -1, -1, 5 }, { 149, -1, -1, 5 }, { 146, -1, -1, 5 }, { 141, -1, -1, 5 }, { 151, -1, -1, 5 },
{ 152, -1, -1, 5 }, { 70, -1, -1, 4 }, { 2, -1, -1, 4 }, { 900, -1, -1, 4 }, { 593, -1, -1, 7 },
{ 93, -1, -1, 7 }, { 103, -1, -1, 7 }, { 131, -1, -1, 7 }, { 132, -1, -1, 7 }, { 133, -1, -1, 7 },
{ 210, -1, -1, 7 }, { 130, -1, -1, 7 }, { 115, -1, -1, 7 }, { 116, 1, -1, 7 }, { 116, 2, -1, 7 },
{ 39, -1, -1, 4 }, { 1, -1, -1, 6 }, { 96, -1, -1, 4 }, { 77, 0, -1, 8 }, { 77, 1, -1, 8 },
{ 77, 2, -1, 8 }, { 259, -1, -1, 2 }, { 20, 0, -1, 3 }, { 15, 0, -1, 9 }, { 15, 1, -1, 9 },
{ 34, -1, -1, 9 }, { 128, -1, -1, 4 }, { 601, -1, -1, 4 }, { 602, -1, -1, 4 }, { 94, -1, -1, 10 },
{ 91, -1, -1, 11 }, { 73, -1, -1, 11 }, { 57, 3, -1, 11 }, { 57, 4, -1, 11 }, { 15, 4, -1, 11 },
{ 64, 0, -1, 11 }, { 71, 8, -1, 11 }, { 10, 6, -1, 11 },
};
if (val)
screen->setCurPaletteMapValue(val);
}
static const SciFxMod mods[] = {
{ GID_LSL2, paletteModsLSL2, ARRAYSIZE(paletteModsLSL2), picModsLSL2, ARRAYSIZE(picModsLSL2), viewModsLSL2, ARRAYSIZE(viewModsLSL2) },
{ GID_SQ3, paletteModsSQ3, ARRAYSIZE(paletteModsSQ3), picModsSQ3, ARRAYSIZE(picModsSQ3), viewModsSQ3, ARRAYSIZE(viewModsSQ3) },
};
void setupCustomPaletteMods(GfxScreen *screen) {
switch (g_sci->getGameId()) {
case GID_LSL2:
screen->setPaletteMods(paletteModsLSL2, ARRAYSIZE(paletteModsLSL2));
break;
case GID_SQ3:
screen->setPaletteMods(paletteModsSQ3, ARRAYSIZE(paletteModsSQ3));
break;
default:
break;
for (int i = 0; i < ARRAYSIZE(mods); i++) {
if (mods[i].gameId == g_sci->getGameId()) {
screen->setPaletteMods(mods[i].paletteMods, mods[i].paletteModsSize);
break;
}
}
}
void doCustomViewPalette(GfxScreen *screen, int x, int y, int z) {
switch (g_sci->getGameId()) {
case GID_LSL2:
doCustomViewLSL2(screen, x, y, z);
break;
case GID_SQ3:
doCustomViewSQ3(screen, x, y, z);
break;
default:
break;
void doCustomViewPalette(GfxScreen *screen, GuiResourceId view, int16 loop, int16 cel) {
for (int i = 0; i < ARRAYSIZE(mods); i++) {
SciFxMod mod = mods[i];
if (mod.gameId == g_sci->getGameId()) {
for (int j = 0; j < mod.viewModsSize; j++) {
ViewMod m = mod.viewMods[j];
if (m.id == view && (m.loop == -1 || m.loop == loop) && (m.cel == -1 || m.cel == cel)) {
screen->setCurPaletteMapValue(m.multiplier);
break;
}
}
break;
}
}
}
void doCustomPicPalette(GfxScreen *screen, int x) {
switch (g_sci->getGameId()) {
case GID_LSL2:
doCustomPicLSL2(screen, x);
break;
case GID_SQ3:
doCustomPicSQ3(screen, x);
break;
default:
break;
void doCustomPicPalette(GfxScreen *screen, GuiResourceId pic) {
for (int i = 0; i < ARRAYSIZE(mods); i++) {
SciFxMod mod = mods[i];
if (mod.gameId == g_sci->getGameId()) {
for (int j = 0; j < mod.picModsSize; j++) {
PicMod m = mod.picMods[j];
if (m.id == pic) {
screen->setCurPaletteMapValue(m.multiplier);
break;
}
}
break;
}
}
}

View File

@ -23,7 +23,7 @@
namespace Sci {
void setupCustomPaletteMods(GfxScreen *screen);
void doCustomViewPalette(GfxScreen *screen, int x, int y, int z);
void doCustomPicPalette(GfxScreen *screen, int x);
void doCustomViewPalette(GfxScreen *screen, GuiResourceId view, int16 loop, int16 cel);
void doCustomPicPalette(GfxScreen *screen, GuiResourceId pic);
}