mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-21 12:01:05 +00:00
Add A_SetTranslation and load TRNSLATE before SOC and Lua scripts
This commit is contained in:
parent
d479917bb7
commit
0731272fab
11 changed files with 279 additions and 63 deletions
|
@ -50,6 +50,7 @@
|
||||||
#include "p_saveg.h"
|
#include "p_saveg.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
#include "r_local.h"
|
#include "r_local.h"
|
||||||
|
#include "r_translation.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "st_stuff.h"
|
#include "st_stuff.h"
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
|
@ -1475,6 +1476,8 @@ void D_SRB2Main(void)
|
||||||
// setup loading screen
|
// setup loading screen
|
||||||
SCR_Startup();
|
SCR_Startup();
|
||||||
|
|
||||||
|
PaletteRemap_Init();
|
||||||
|
|
||||||
HU_Init();
|
HU_Init();
|
||||||
|
|
||||||
CON_Init();
|
CON_Init();
|
||||||
|
|
|
@ -572,7 +572,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
|
||||||
if (mathlib) return luaL_error(L, "NiGHTS grade '%s' could not be found.\n", word);
|
if (mathlib) return luaL_error(L, "NiGHTS grade '%s' could not be found.\n", word);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (fastncmp("MN_",word,3)) {
|
else if (fastncmp("MN_",word,3))
|
||||||
|
{
|
||||||
p = word+3;
|
p = word+3;
|
||||||
for (i = 0; i < NUMMENUTYPES; i++)
|
for (i = 0; i < NUMMENUTYPES; i++)
|
||||||
if (fastcmp(p, MENUTYPES_LIST[i])) {
|
if (fastcmp(p, MENUTYPES_LIST[i])) {
|
||||||
|
@ -582,6 +583,19 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
|
||||||
if (mathlib) return luaL_error(L, "menutype '%s' could not be found.\n", word);
|
if (mathlib) return luaL_error(L, "menutype '%s' could not be found.\n", word);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else if (mathlib && fastncmp("TRANSLATION_",word,12))
|
||||||
|
{
|
||||||
|
p = word+12;
|
||||||
|
for (i = 0; i < (signed)numcustomtranslations; i++)
|
||||||
|
{
|
||||||
|
if (fasticmp(p, customtranslations[i].name) == 0)
|
||||||
|
{
|
||||||
|
lua_pushinteger(L, (int)customtranslations[i].id);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return luaL_error(L, "translation '%s' could not be found.\n", word);
|
||||||
|
}
|
||||||
|
|
||||||
if (fastcmp(word, "BT_USE")) // Remove case when 2.3 nears release...
|
if (fastcmp(word, "BT_USE")) // Remove case when 2.3 nears release...
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "m_misc.h"
|
#include "m_misc.h"
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
#include "st_stuff.h"
|
#include "st_stuff.h"
|
||||||
|
#include "r_translation.h"
|
||||||
#include "fastcmp.h"
|
#include "fastcmp.h"
|
||||||
#include "lua_script.h"
|
#include "lua_script.h"
|
||||||
#include "lua_libs.h"
|
#include "lua_libs.h"
|
||||||
|
|
|
@ -219,6 +219,7 @@ actionpointer_t actionpointers[] =
|
||||||
{{A_ChangeColorRelative}, "A_CHANGECOLORRELATIVE"},
|
{{A_ChangeColorRelative}, "A_CHANGECOLORRELATIVE"},
|
||||||
{{A_ChangeColorAbsolute}, "A_CHANGECOLORABSOLUTE"},
|
{{A_ChangeColorAbsolute}, "A_CHANGECOLORABSOLUTE"},
|
||||||
{{A_Dye}, "A_DYE"},
|
{{A_Dye}, "A_DYE"},
|
||||||
|
{{A_SetTranslation}, "A_SETTRANSLATION"},
|
||||||
{{A_MoveRelative}, "A_MOVERELATIVE"},
|
{{A_MoveRelative}, "A_MOVERELATIVE"},
|
||||||
{{A_MoveAbsolute}, "A_MOVEABSOLUTE"},
|
{{A_MoveAbsolute}, "A_MOVEABSOLUTE"},
|
||||||
{{A_Thrust}, "A_THRUST"},
|
{{A_Thrust}, "A_THRUST"},
|
||||||
|
|
|
@ -173,6 +173,7 @@ enum actionnum
|
||||||
A_CHANGECOLORRELATIVE,
|
A_CHANGECOLORRELATIVE,
|
||||||
A_CHANGECOLORABSOLUTE,
|
A_CHANGECOLORABSOLUTE,
|
||||||
A_DYE,
|
A_DYE,
|
||||||
|
A_SETTRANSLATION,
|
||||||
A_MOVERELATIVE,
|
A_MOVERELATIVE,
|
||||||
A_MOVEABSOLUTE,
|
A_MOVEABSOLUTE,
|
||||||
A_THRUST,
|
A_THRUST,
|
||||||
|
@ -445,6 +446,7 @@ void A_SetRandomTics();
|
||||||
void A_ChangeColorRelative();
|
void A_ChangeColorRelative();
|
||||||
void A_ChangeColorAbsolute();
|
void A_ChangeColorAbsolute();
|
||||||
void A_Dye();
|
void A_Dye();
|
||||||
|
void A_SetTranslation();
|
||||||
void A_MoveRelative();
|
void A_MoveRelative();
|
||||||
void A_MoveAbsolute();
|
void A_MoveAbsolute();
|
||||||
void A_Thrust();
|
void A_Thrust();
|
||||||
|
|
|
@ -196,6 +196,7 @@ void A_SetRandomTics(mobj_t *actor);
|
||||||
void A_ChangeColorRelative(mobj_t *actor);
|
void A_ChangeColorRelative(mobj_t *actor);
|
||||||
void A_ChangeColorAbsolute(mobj_t *actor);
|
void A_ChangeColorAbsolute(mobj_t *actor);
|
||||||
void A_Dye(mobj_t *actor);
|
void A_Dye(mobj_t *actor);
|
||||||
|
void A_SetTranslation(mobj_t *actor);
|
||||||
void A_MoveRelative(mobj_t *actor);
|
void A_MoveRelative(mobj_t *actor);
|
||||||
void A_MoveAbsolute(mobj_t *actor);
|
void A_MoveAbsolute(mobj_t *actor);
|
||||||
void A_Thrust(mobj_t *actor);
|
void A_Thrust(mobj_t *actor);
|
||||||
|
@ -9068,6 +9069,27 @@ void A_Dye(mobj_t *actor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function: A_SetTranslation
|
||||||
|
//
|
||||||
|
// Description: Changes the translation of an actor.
|
||||||
|
//
|
||||||
|
// var1 = translation ID
|
||||||
|
// var2 = unused
|
||||||
|
//
|
||||||
|
void A_SetTranslation(mobj_t *actor)
|
||||||
|
{
|
||||||
|
INT32 locvar1 = var1;
|
||||||
|
|
||||||
|
mobj_t *target = actor;
|
||||||
|
if (LUA_CallAction(A_SETTRANSLATION, actor))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (R_TranslationIsValid(locvar1))
|
||||||
|
actor->translation = (UINT32)locvar1;
|
||||||
|
else
|
||||||
|
actor->translation = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Function: A_MoveRelative
|
// Function: A_MoveRelative
|
||||||
//
|
//
|
||||||
// Description: Moves an object (wrapper for P_Thrust)
|
// Description: Moves an object (wrapper for P_Thrust)
|
||||||
|
|
|
@ -8165,7 +8165,7 @@ static boolean P_LoadAddon(UINT16 numlumps)
|
||||||
HWR_ClearAllTextures();
|
HWR_ClearAllTextures();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
R_LoadTrnslateLumps();
|
R_LoadParsedTranslations();
|
||||||
|
|
||||||
//
|
//
|
||||||
// search for sprite replacements
|
// search for sprite replacements
|
||||||
|
|
|
@ -1209,11 +1209,8 @@ void R_InitData(void)
|
||||||
R_Init8to16();
|
R_Init8to16();
|
||||||
}
|
}
|
||||||
|
|
||||||
CONS_Printf("PaletteRemap_Init()...\n");
|
CONS_Printf("R_LoadParsedTranslations()...\n");
|
||||||
PaletteRemap_Init();
|
R_LoadParsedTranslations();
|
||||||
|
|
||||||
CONS_Printf("R_LoadTrnslateLumps()...\n");
|
|
||||||
R_LoadTrnslateLumps();
|
|
||||||
|
|
||||||
CONS_Printf("R_LoadTextures()...\n");
|
CONS_Printf("R_LoadTextures()...\n");
|
||||||
R_LoadTextures();
|
R_LoadTextures();
|
||||||
|
|
|
@ -140,7 +140,7 @@ boolean PaletteRemap_AddIndexRange(remaptable_t *tr, int start, int end, int pal
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean PaletteRemap_AddColorRange(remaptable_t *tr, int start, int end, int _r1,int _g1, int _b1, int _r2, int _g2, int _b2)
|
boolean PaletteRemap_AddColorRange(remaptable_t *tr, int start, int end, int _r1, int _g1, int _b1, int _r2, int _g2, int _b2)
|
||||||
{
|
{
|
||||||
if (IndicesOutOfRange(start, end))
|
if (IndicesOutOfRange(start, end))
|
||||||
return false;
|
return false;
|
||||||
|
@ -295,6 +295,91 @@ boolean PaletteRemap_AddTint(remaptable_t *tr, int start, int end, int r, int g,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ParsedTranslation
|
||||||
|
{
|
||||||
|
struct ParsedTranslation *next;
|
||||||
|
remaptable_t *remap;
|
||||||
|
remaptable_t *baseTranslation;
|
||||||
|
struct PaletteRemapParseResult *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ParsedTranslation *parsedTranslationListHead = NULL;
|
||||||
|
static struct ParsedTranslation *parsedTranslationListTail = NULL;
|
||||||
|
|
||||||
|
static void AddParsedTranslation(unsigned id, int base_translation, struct PaletteRemapParseResult *data)
|
||||||
|
{
|
||||||
|
struct ParsedTranslation *node = Z_Calloc(sizeof(struct ParsedTranslation), PU_STATIC, NULL);
|
||||||
|
|
||||||
|
node->remap = paletteremaps[id];
|
||||||
|
node->data = data;
|
||||||
|
|
||||||
|
if (base_translation != -1)
|
||||||
|
node->baseTranslation = paletteremaps[base_translation];
|
||||||
|
|
||||||
|
if (parsedTranslationListHead == NULL)
|
||||||
|
parsedTranslationListHead = parsedTranslationListTail = node;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parsedTranslationListTail->next = node;
|
||||||
|
parsedTranslationListTail = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PaletteRemap_ApplyResult(remaptable_t *tr, struct PaletteRemapParseResult *data)
|
||||||
|
{
|
||||||
|
int start = data->start;
|
||||||
|
int end = data->end;
|
||||||
|
|
||||||
|
switch (data->type)
|
||||||
|
{
|
||||||
|
case REMAP_ADD_INDEXRANGE:
|
||||||
|
PaletteRemap_AddIndexRange(tr, start, end, data->indexRange.pal1, data->indexRange.pal2);
|
||||||
|
break;
|
||||||
|
case REMAP_ADD_COLORRANGE:
|
||||||
|
PaletteRemap_AddColorRange(tr, start, end,
|
||||||
|
data->colorRange.r1, data->colorRange.g1, data->colorRange.b1,
|
||||||
|
data->colorRange.r2, data->colorRange.g2, data->colorRange.b2);
|
||||||
|
break;
|
||||||
|
case REMAP_ADD_COLOURISATION:
|
||||||
|
PaletteRemap_AddColourisation(tr, start, end,
|
||||||
|
data->colourisation.r, data->colourisation.g, data->colourisation.b);
|
||||||
|
break;
|
||||||
|
case REMAP_ADD_DESATURATION:
|
||||||
|
PaletteRemap_AddDesaturation(tr, start, end,
|
||||||
|
data->desaturation.r1, data->desaturation.g1, data->desaturation.b1,
|
||||||
|
data->desaturation.r2, data->desaturation.g2, data->desaturation.b2);
|
||||||
|
break;
|
||||||
|
case REMAP_ADD_TINT:
|
||||||
|
PaletteRemap_AddTint(tr, start, end, data->tint.r, data->tint.g, data->tint.b, data->tint.amount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void R_LoadParsedTranslations(void)
|
||||||
|
{
|
||||||
|
struct ParsedTranslation *node = parsedTranslationListHead;
|
||||||
|
while (node)
|
||||||
|
{
|
||||||
|
struct PaletteRemapParseResult *result = node->data;
|
||||||
|
struct ParsedTranslation *next = node->next;
|
||||||
|
|
||||||
|
remaptable_t *tr = node->remap;
|
||||||
|
PaletteRemap_SetIdentity(tr);
|
||||||
|
|
||||||
|
if (node->baseTranslation)
|
||||||
|
memcpy(tr, node->baseTranslation, sizeof(remaptable_t));
|
||||||
|
|
||||||
|
PaletteRemap_ApplyResult(tr, result);
|
||||||
|
|
||||||
|
Z_Free(result);
|
||||||
|
Z_Free(node);
|
||||||
|
|
||||||
|
node = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
parsedTranslationListHead = parsedTranslationListTail = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static boolean ExpectToken(tokenizer_t *sc, const char *expect)
|
static boolean ExpectToken(tokenizer_t *sc, const char *expect)
|
||||||
{
|
{
|
||||||
return strcmp(sc->get(sc, 0), expect) == 0;
|
return strcmp(sc->get(sc, 0), expect) == 0;
|
||||||
|
@ -360,10 +445,21 @@ static struct PaletteRemapParseResult *ThrowError(const char *format, ...)
|
||||||
vsprintf(err->error, format, argptr);
|
vsprintf(err->error, format, argptr);
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
|
|
||||||
|
err->has_error = true;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct PaletteRemapParseResult *PaletteRemap_ParseString(remaptable_t *tr, tokenizer_t *sc)
|
static struct PaletteRemapParseResult *MakeResult(enum PaletteRemapType type, int start, int end)
|
||||||
|
{
|
||||||
|
struct PaletteRemapParseResult *tr = Z_Calloc(sizeof(struct PaletteRemapParseResult), PU_STATIC, NULL);
|
||||||
|
tr->type = type;
|
||||||
|
tr->start = start;
|
||||||
|
tr->end = end;
|
||||||
|
return tr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct PaletteRemapParseResult *PaletteRemap_ParseString(tokenizer_t *sc)
|
||||||
{
|
{
|
||||||
int start, end;
|
int start, end;
|
||||||
|
|
||||||
|
@ -426,7 +522,14 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(remaptable_t *tr
|
||||||
if (!ExpectToken(sc, "]"))
|
if (!ExpectToken(sc, "]"))
|
||||||
return ThrowError("expected ']'");
|
return ThrowError("expected ']'");
|
||||||
|
|
||||||
PaletteRemap_AddColorRange(tr, start, end, r1, g1, b1, r2, g2, b2);
|
struct PaletteRemapParseResult *tr = MakeResult(REMAP_ADD_COLORRANGE, start, end);
|
||||||
|
tr->colorRange.r1 = r1;
|
||||||
|
tr->colorRange.g1 = g1;
|
||||||
|
tr->colorRange.b1 = b1;
|
||||||
|
tr->colorRange.r2 = r2;
|
||||||
|
tr->colorRange.g2 = g2;
|
||||||
|
tr->colorRange.b2 = b2;
|
||||||
|
return tr;
|
||||||
}
|
}
|
||||||
else if (strcmp(tkn, "%") == 0)
|
else if (strcmp(tkn, "%") == 0)
|
||||||
{
|
{
|
||||||
|
@ -474,7 +577,14 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(remaptable_t *tr
|
||||||
if (!ExpectToken(sc, "]"))
|
if (!ExpectToken(sc, "]"))
|
||||||
return ThrowError("expected ']'");
|
return ThrowError("expected ']'");
|
||||||
|
|
||||||
PaletteRemap_AddDesaturation(tr, start, end, r1, g1, b1, r2, g2, b2);
|
struct PaletteRemapParseResult *tr = MakeResult(REMAP_ADD_DESATURATION, start, end);
|
||||||
|
tr->desaturation.r1 = r1;
|
||||||
|
tr->desaturation.g1 = g1;
|
||||||
|
tr->desaturation.b1 = b1;
|
||||||
|
tr->desaturation.r2 = r2;
|
||||||
|
tr->desaturation.g2 = g2;
|
||||||
|
tr->desaturation.b2 = b2;
|
||||||
|
return tr;
|
||||||
}
|
}
|
||||||
else if (strcmp(tkn, "#") == 0)
|
else if (strcmp(tkn, "#") == 0)
|
||||||
{
|
{
|
||||||
|
@ -496,7 +606,11 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(remaptable_t *tr
|
||||||
if (!ExpectToken(sc, "]"))
|
if (!ExpectToken(sc, "]"))
|
||||||
return ThrowError("expected ']'");
|
return ThrowError("expected ']'");
|
||||||
|
|
||||||
PaletteRemap_AddColourisation(tr, start, end, r, g, b);
|
struct PaletteRemapParseResult *tr = MakeResult(REMAP_ADD_COLOURISATION, start, end);
|
||||||
|
tr->colourisation.r = r;
|
||||||
|
tr->colourisation.g = g;
|
||||||
|
tr->colourisation.b = b;
|
||||||
|
return tr;
|
||||||
}
|
}
|
||||||
else if (strcmp(tkn, "@") == 0)
|
else if (strcmp(tkn, "@") == 0)
|
||||||
{
|
{
|
||||||
|
@ -522,7 +636,12 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(remaptable_t *tr
|
||||||
if (!ExpectToken(sc, "]"))
|
if (!ExpectToken(sc, "]"))
|
||||||
return ThrowError("expected ']'");
|
return ThrowError("expected ']'");
|
||||||
|
|
||||||
PaletteRemap_AddTint(tr, start, end, r, g, b, a);
|
struct PaletteRemapParseResult *tr = MakeResult(REMAP_ADD_TINT, start, end);
|
||||||
|
tr->tint.r = r;
|
||||||
|
tr->tint.g = g;
|
||||||
|
tr->tint.b = b;
|
||||||
|
tr->tint.amount = a;
|
||||||
|
return tr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -535,21 +654,24 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(remaptable_t *tr
|
||||||
if (!ParseNumber(sc, &pal2))
|
if (!ParseNumber(sc, &pal2))
|
||||||
return ThrowError("expected a number for ending index");
|
return ThrowError("expected a number for ending index");
|
||||||
|
|
||||||
PaletteRemap_AddIndexRange(tr, start, end, pal1, pal2);
|
struct PaletteRemapParseResult *tr = MakeResult(REMAP_ADD_INDEXRANGE, start, end);
|
||||||
|
tr->indexRange.pal1 = pal1;
|
||||||
|
tr->indexRange.pal2 = pal2;
|
||||||
|
return tr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PaletteRemapParseResult *PaletteRemap_ParseTranslation(remaptable_t *tr, const char *translation)
|
struct PaletteRemapParseResult *PaletteRemap_ParseTranslation(const char *translation)
|
||||||
{
|
{
|
||||||
tokenizer_t *sc = Tokenizer_Open(translation, 1);
|
tokenizer_t *sc = Tokenizer_Open(translation, 1);
|
||||||
struct PaletteRemapParseResult *error = PaletteRemap_ParseString(tr, sc);
|
struct PaletteRemapParseResult *result = PaletteRemap_ParseString(sc);
|
||||||
Tokenizer_Close(sc);
|
Tokenizer_Close(sc);
|
||||||
return error;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void P_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
{
|
{
|
||||||
char *lumpData = (char *)W_CacheLumpNumPwad(wadNum, lumpnum, PU_STATIC);
|
char *lumpData = (char *)W_CacheLumpNumPwad(wadNum, lumpnum, PU_STATIC);
|
||||||
size_t lumpLength = W_LumpLengthPwad(wadNum, lumpnum);
|
size_t lumpLength = W_LumpLengthPwad(wadNum, lumpnum);
|
||||||
|
@ -562,7 +684,7 @@ static void P_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
const char *tkn = sc->get(sc, 0);
|
const char *tkn = sc->get(sc, 0);
|
||||||
while (tkn != NULL)
|
while (tkn != NULL)
|
||||||
{
|
{
|
||||||
remaptable_t *tr = NULL;
|
int base_translation = -1;
|
||||||
|
|
||||||
char *name = Z_StrDup(tkn);
|
char *name = Z_StrDup(tkn);
|
||||||
|
|
||||||
|
@ -571,10 +693,8 @@ static void P_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
{
|
{
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
|
|
||||||
remaptable_t *tbl = R_GetTranslationByID(R_FindCustomTranslation(tkn));
|
base_translation = R_FindCustomTranslation(tkn);
|
||||||
if (tbl)
|
if (base_translation == -1)
|
||||||
tr = PaletteRemap_Copy(tbl);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': No translation named '%s'\n", name, tkn);
|
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': No translation named '%s'\n", name, tkn);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -582,11 +702,6 @@ static void P_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
|
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
tr = PaletteRemap_New();
|
|
||||||
PaletteRemap_SetIdentity(tr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(tkn, "=") != 0)
|
if (strcmp(tkn, "=") != 0)
|
||||||
{
|
{
|
||||||
|
@ -595,12 +710,13 @@ static void P_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
}
|
}
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
|
|
||||||
|
struct PaletteRemapParseResult *result = NULL;
|
||||||
do {
|
do {
|
||||||
struct PaletteRemapParseResult *error = PaletteRemap_ParseTranslation(tr, tkn);
|
result = PaletteRemap_ParseTranslation(tkn);
|
||||||
if (error)
|
if (result->has_error)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': %s\n", name, error->error);
|
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': %s\n", name, result->error);
|
||||||
Z_Free(error);
|
Z_Free(result);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,10 +730,17 @@ static void P_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
// add it
|
// Allocate it and register it
|
||||||
|
remaptable_t *tr = PaletteRemap_New();
|
||||||
unsigned id = PaletteRemap_Add(tr);
|
unsigned id = PaletteRemap_Add(tr);
|
||||||
R_AddCustomTranslation(name, id);
|
R_AddCustomTranslation(name, id);
|
||||||
|
|
||||||
|
// Free this, since it's no longer needed
|
||||||
Z_Free(name);
|
Z_Free(name);
|
||||||
|
|
||||||
|
// The translation is not generated until later, because the palette may not have been loaded.
|
||||||
|
// We store the result for when it's needed.
|
||||||
|
AddParsedTranslation(id, base_translation, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -625,29 +748,8 @@ fail:
|
||||||
Z_Free(text);
|
Z_Free(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void R_LoadTrnslateLumps(void)
|
customtranslation_t *customtranslations = NULL;
|
||||||
{
|
unsigned numcustomtranslations = 0;
|
||||||
for (INT32 w = numwadfiles-1; w >= 0; w--)
|
|
||||||
{
|
|
||||||
UINT16 lump = W_CheckNumForNamePwad("TRNSLATE", w, 0);
|
|
||||||
|
|
||||||
while (lump != INT16_MAX)
|
|
||||||
{
|
|
||||||
P_ParseTrnslate(w, lump);
|
|
||||||
lump = W_CheckNumForNamePwad("TRNSLATE", (UINT16)w, lump + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct CustomTranslation
|
|
||||||
{
|
|
||||||
char *name;
|
|
||||||
unsigned id;
|
|
||||||
UINT32 hash;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct CustomTranslation *customtranslations = NULL;
|
|
||||||
static unsigned numcustomtranslations = 0;
|
|
||||||
|
|
||||||
int R_FindCustomTranslation(const char *name)
|
int R_FindCustomTranslation(const char *name)
|
||||||
{
|
{
|
||||||
|
@ -664,12 +766,12 @@ int R_FindCustomTranslation(const char *name)
|
||||||
|
|
||||||
void R_AddCustomTranslation(const char *name, int trnum)
|
void R_AddCustomTranslation(const char *name, int trnum)
|
||||||
{
|
{
|
||||||
struct CustomTranslation *tr = NULL;
|
customtranslation_t *tr = NULL;
|
||||||
UINT32 hash = quickncasehash(name, strlen(name));
|
UINT32 hash = quickncasehash(name, strlen(name));
|
||||||
|
|
||||||
for (unsigned i = 0; i < numcustomtranslations; i++)
|
for (unsigned i = 0; i < numcustomtranslations; i++)
|
||||||
{
|
{
|
||||||
struct CustomTranslation *lookup = &customtranslations[i];
|
customtranslation_t *lookup = &customtranslations[i];
|
||||||
if (hash == lookup->hash && strcmp(name, lookup->name) == 0)
|
if (hash == lookup->hash && strcmp(name, lookup->name) == 0)
|
||||||
{
|
{
|
||||||
tr = lookup;
|
tr = lookup;
|
||||||
|
@ -680,7 +782,7 @@ void R_AddCustomTranslation(const char *name, int trnum)
|
||||||
if (tr == NULL)
|
if (tr == NULL)
|
||||||
{
|
{
|
||||||
numcustomtranslations++;
|
numcustomtranslations++;
|
||||||
customtranslations = Z_Realloc(customtranslations, sizeof(struct CustomTranslation) * numcustomtranslations, PU_STATIC, NULL);
|
customtranslations = Z_Realloc(customtranslations, sizeof(customtranslation_t) * numcustomtranslations, PU_STATIC, NULL);
|
||||||
tr = &customtranslations[numcustomtranslations - 1];
|
tr = &customtranslations[numcustomtranslations - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,8 +798,16 @@ unsigned R_NumCustomTranslations(void)
|
||||||
|
|
||||||
remaptable_t *R_GetTranslationByID(int id)
|
remaptable_t *R_GetTranslationByID(int id)
|
||||||
{
|
{
|
||||||
if (id < 0 || id >= (signed)numpaletteremaps)
|
if (!R_TranslationIsValid(id))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return paletteremaps[id];
|
return paletteremaps[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean R_TranslationIsValid(int id)
|
||||||
|
{
|
||||||
|
if (id < 0 || id >= (signed)numpaletteremaps)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -29,23 +29,75 @@ boolean PaletteRemap_IsIdentity(remaptable_t *tr);
|
||||||
unsigned PaletteRemap_Add(remaptable_t *tr);
|
unsigned PaletteRemap_Add(remaptable_t *tr);
|
||||||
|
|
||||||
boolean PaletteRemap_AddIndexRange(remaptable_t *tr, int start, int end, int pal1, int pal2);
|
boolean PaletteRemap_AddIndexRange(remaptable_t *tr, int start, int end, int pal1, int pal2);
|
||||||
boolean PaletteRemap_AddColorRange(remaptable_t *tr, int start, int end, int _r1,int _g1, int _b1, int _r2, int _g2, int _b2);
|
boolean PaletteRemap_AddColorRange(remaptable_t *tr, int start, int end, int _r1, int _g1, int _b1, int _r2, int _g2, int _b2);
|
||||||
boolean PaletteRemap_AddDesaturation(remaptable_t *tr, int start, int end, double r1, double g1, double b1, double r2, double g2, double b2);
|
boolean PaletteRemap_AddDesaturation(remaptable_t *tr, int start, int end, double r1, double g1, double b1, double r2, double g2, double b2);
|
||||||
boolean PaletteRemap_AddColourisation(remaptable_t *tr, int start, int end, int r, int g, int b);
|
boolean PaletteRemap_AddColourisation(remaptable_t *tr, int start, int end, int r, int g, int b);
|
||||||
boolean PaletteRemap_AddTint(remaptable_t *tr, int start, int end, int r, int g, int b, int amount);
|
boolean PaletteRemap_AddTint(remaptable_t *tr, int start, int end, int r, int g, int b, int amount);
|
||||||
|
|
||||||
|
enum PaletteRemapType
|
||||||
|
{
|
||||||
|
REMAP_ADD_INDEXRANGE,
|
||||||
|
REMAP_ADD_COLORRANGE,
|
||||||
|
REMAP_ADD_COLOURISATION,
|
||||||
|
REMAP_ADD_DESATURATION,
|
||||||
|
REMAP_ADD_TINT
|
||||||
|
};
|
||||||
|
|
||||||
struct PaletteRemapParseResult
|
struct PaletteRemapParseResult
|
||||||
{
|
{
|
||||||
|
int start, end;
|
||||||
|
enum PaletteRemapType type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int pal1, pal2;
|
||||||
|
} indexRange;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int r1, g1, b1;
|
||||||
|
int r2, g2, b2;
|
||||||
|
} colorRange;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
double r1, g1, b1;
|
||||||
|
double r2, g2, b2;
|
||||||
|
} desaturation;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int r, g, b;
|
||||||
|
} colourisation;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int r, g, b, amount;
|
||||||
|
} tint;
|
||||||
|
};
|
||||||
|
|
||||||
|
boolean has_error;
|
||||||
char error[4096];
|
char error[4096];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PaletteRemapParseResult *PaletteRemap_ParseTranslation(remaptable_t *tr, const char *translation);
|
struct PaletteRemapParseResult *PaletteRemap_ParseTranslation(const char *translation);
|
||||||
|
|
||||||
|
void PaletteRemap_ApplyResult(remaptable_t *tr, struct PaletteRemapParseResult *data);
|
||||||
|
|
||||||
|
typedef struct CustomTranslation
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
unsigned id;
|
||||||
|
UINT32 hash;
|
||||||
|
} customtranslation_t;
|
||||||
|
|
||||||
|
extern customtranslation_t *customtranslations;
|
||||||
|
extern unsigned numcustomtranslations;
|
||||||
|
|
||||||
int R_FindCustomTranslation(const char *name);
|
int R_FindCustomTranslation(const char *name);
|
||||||
void R_AddCustomTranslation(const char *name, int trnum);
|
void R_AddCustomTranslation(const char *name, int trnum);
|
||||||
unsigned R_NumCustomTranslations(void);
|
unsigned R_NumCustomTranslations(void);
|
||||||
remaptable_t *R_GetTranslationByID(int id);
|
remaptable_t *R_GetTranslationByID(int id);
|
||||||
|
boolean R_TranslationIsValid(int id);
|
||||||
|
|
||||||
void R_LoadTrnslateLumps(void);
|
void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum);
|
||||||
|
void R_LoadParsedTranslations(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
14
src/w_wad.c
14
src/w_wad.c
|
@ -59,6 +59,7 @@
|
||||||
#include "r_textures.h"
|
#include "r_textures.h"
|
||||||
#include "r_patch.h"
|
#include "r_patch.h"
|
||||||
#include "r_picformats.h"
|
#include "r_picformats.h"
|
||||||
|
#include "r_translation.h"
|
||||||
#include "i_time.h"
|
#include "i_time.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
#include "i_video.h" // rendermode
|
#include "i_video.h" // rendermode
|
||||||
|
@ -829,6 +830,16 @@ static void W_ReadFileShaders(wadfile_t *wadfile)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void W_LoadTrnslateLumps(UINT16 w)
|
||||||
|
{
|
||||||
|
UINT16 lump = W_CheckNumForNamePwad("TRNSLATE", w, 0);
|
||||||
|
while (lump != INT16_MAX)
|
||||||
|
{
|
||||||
|
R_ParseTrnslate(w, lump);
|
||||||
|
lump = W_CheckNumForNamePwad("TRNSLATE", (UINT16)w, lump + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate a wadfile, setup the lumpinfo (directory) and
|
// Allocate a wadfile, setup the lumpinfo (directory) and
|
||||||
// lumpcache, add the wadfile to the current active wadfiles
|
// lumpcache, add the wadfile to the current active wadfiles
|
||||||
//
|
//
|
||||||
|
@ -979,6 +990,9 @@ UINT16 W_InitFile(const char *filename, boolean mainfile, boolean startup)
|
||||||
// Read shaders from file
|
// Read shaders from file
|
||||||
W_ReadFileShaders(wadfile);
|
W_ReadFileShaders(wadfile);
|
||||||
|
|
||||||
|
// The below hack makes me load this here.
|
||||||
|
W_LoadTrnslateLumps(numwadfiles - 1);
|
||||||
|
|
||||||
// TODO: HACK ALERT - Load Lua & SOC stuff right here. I feel like this should be out of this place, but... Let's stick with this for now.
|
// TODO: HACK ALERT - Load Lua & SOC stuff right here. I feel like this should be out of this place, but... Let's stick with this for now.
|
||||||
switch (wadfile->type)
|
switch (wadfile->type)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue