void R_ParseTrnslate() { customTranslationMap.Clear(); translationtables[TRANSLATION_Custom].Clear(); int lump; int lastlump = 0; while (-1 != (lump = Wads.FindLump("TRNSLATE", &lastlump))) { FScanner sc(lump); while (sc.GetToken()) { sc.TokenMustBe(TK_Identifier); FName newtrans = sc.String; FRemapTable *base = nullptr; if (sc.CheckToken(':')) { sc.MustGetAnyToken(); if (sc.TokenType == TK_IntConst) { int max = 6; if (sc.Number < 0 || sc.Number > max) { sc.ScriptError("Translation must be in the range [0,%d]", max); } base = translationtables[TRANSLATION_Standard][sc.Number]; } else if (sc.TokenType == TK_Identifier) { int tnum = R_FindCustomTranslation(sc.String); if (tnum == -1) { sc.ScriptError("Base translation '%s' not found in '%s'", sc.String, newtrans.GetChars()); } base = translationtables[GetTranslationType(tnum)][GetTranslationIndex(tnum)]; } else { // error out. sc.TokenMustBe(TK_Identifier); } } sc.MustGetToken('='); FRemapTable NewTranslation; if (base != nullptr) NewTranslation = *base; else NewTranslation.MakeIdentity(); do { sc.MustGetToken(TK_StringConst); NewTranslation.AddToTranslation(sc.String); } while (sc.CheckToken(',')); int trans = NewTranslation.StoreTranslation(TRANSLATION_Custom); customTranslationMap[newtrans] = trans; } } }
DEFINE_ACTION_FUNCTION(_Translation, AddTranslation) { PARAM_SELF_STRUCT_PROLOGUE(FTranslation); FRemapTable NewTranslation; memcpy(&NewTranslation.Palette[0], self->colors, 256 * sizeof(PalEntry)); for (int i = 0; i < 256; i++) { NewTranslation.Remap[i] = ColorMatcher.Pick(self->colors[i]); } int trans = NewTranslation.StoreTranslation(TRANSLATION_Custom); ACTION_RETURN_INT(trans); }
void FRemapTable::StaticSerializeTranslations(FSerializer &arc) { if (arc.BeginArray("translations")) { // Does this level have custom translations? FRemapTable *trans; int w; if (arc.isWriting()) { for (unsigned int i = 0; i < translationtables[TRANSLATION_LevelScripted].Size(); ++i) { trans = translationtables[TRANSLATION_LevelScripted][i]; if (trans != NULL && !trans->IsIdentity()) { if (arc.BeginObject(nullptr)) { arc("index", i); trans->Serialize(arc); arc.EndObject(); } } } } else { while (arc.BeginObject(nullptr)) { arc("index", w); trans = translationtables[TRANSLATION_LevelScripted].GetVal(w); if (trans == NULL) { trans = new FRemapTable; translationtables[TRANSLATION_LevelScripted].SetVal(w, trans); } trans->Serialize(arc); arc.EndObject(); } } arc.EndArray(); } }
void G_SerializeLevel (FArchive &arc, bool hubLoad) { int i = level.totaltime; Renderer->StartSerialize(arc); arc << level.flags << level.flags2 << level.fadeto << level.found_secrets << level.found_items << level.killed_monsters << level.gravity << level.aircontrol << level.teamdamage << level.maptime << i; if (SaveVersion >= 3313) { arc << level.nextmusic; } // Hub transitions must keep the current total time if (!hubLoad) level.totaltime = i; if (SaveVersion >= 4507) { arc << level.skytexture1 << level.skytexture2; } else { level.skytexture1 = TexMan.GetTexture(arc.ReadName(), FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); level.skytexture2 = TexMan.GetTexture(arc.ReadName(), FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); } if (arc.IsLoading()) { sky1texture = level.skytexture1; sky2texture = level.skytexture2; R_InitSkyMap(); } G_AirControlChanged (); BYTE t; // Does this level have scrollers? if (arc.IsStoring ()) { t = level.Scrolls ? 1 : 0; arc << t; } else { arc << t; if (level.Scrolls) { delete[] level.Scrolls; level.Scrolls = NULL; } if (t) { level.Scrolls = new FSectorScrollValues[numsectors]; memset (level.Scrolls, 0, sizeof(level.Scrolls)*numsectors); } } FBehavior::StaticSerializeModuleStates (arc); if (arc.IsLoading()) interpolator.ClearInterpolations(); P_SerializeThinkers (arc, hubLoad); P_SerializeWorld (arc); P_SerializePolyobjs (arc); P_SerializeSubsectors(arc); StatusBar->Serialize (arc); if (SaveVersion >= 4222) { // This must be done *after* thinkers are serialized. arc << level.DefaultSkybox; } arc << level.total_monsters << level.total_items << level.total_secrets; // Does this level have custom translations? FRemapTable *trans; WORD w; if (arc.IsStoring ()) { for (unsigned int i = 0; i < translationtables[TRANSLATION_LevelScripted].Size(); ++i) { trans = translationtables[TRANSLATION_LevelScripted][i]; if (trans != NULL && !trans->IsIdentity()) { w = WORD(i); arc << w; trans->Serialize(arc); } } w = 0xffff; arc << w; } else { while (arc << w, w != 0xffff) { trans = translationtables[TRANSLATION_LevelScripted].GetVal(w); if (trans == NULL) { trans = new FRemapTable; translationtables[TRANSLATION_LevelScripted].SetVal(w, trans); } trans->Serialize(arc); } } // This must be saved, too, of course! FCanvasTextureInfo::Serialize (arc); AM_SerializeMarkers(arc); P_SerializePlayers (arc, hubLoad); P_SerializeSounds (arc); if (arc.IsLoading()) { for (i = 0; i < numsectors; i++) { P_Recalculate3DFloors(§ors[i]); } for (i = 0; i < MAXPLAYERS; ++i) { if (playeringame[i] && players[i].mo != NULL) { players[i].mo->SetupWeaponSlots(); } } } Renderer->EndSerialize(arc); }
void G_SerializeLevel (FArchive &arc, bool hubLoad) { int i = level.totaltime; Renderer->StartSerialize(arc); if (arc.IsLoading()) P_DestroyThinkers(hubLoad); arc << level.flags << level.flags2 << level.fadeto << level.found_secrets << level.found_items << level.killed_monsters << level.gravity << level.aircontrol << level.teamdamage << level.maptime << i; // Hub transitions must keep the current total time if (!hubLoad) level.totaltime = i; arc << level.skytexture1 << level.skytexture2; if (arc.IsLoading()) { sky1texture = level.skytexture1; sky2texture = level.skytexture2; R_InitSkyMap(); } G_AirControlChanged (); BYTE t; // Does this level have scrollers? if (arc.IsStoring ()) { t = level.Scrolls ? 1 : 0; arc << t; } else { arc << t; if (level.Scrolls) { delete[] level.Scrolls; level.Scrolls = NULL; } if (t) { level.Scrolls = new FSectorScrollValues[numsectors]; memset (level.Scrolls, 0, sizeof(level.Scrolls)*numsectors); } } FBehavior::StaticSerializeModuleStates (arc); if (arc.IsLoading()) interpolator.ClearInterpolations(); P_SerializeWorld(arc); P_SerializeThinkers (arc, hubLoad); P_SerializeWorldActors(arc); // serializing actor pointers in the world data must be done after SerializeWorld has restored the entire sector state, otherwise LinkToWorld may fail. P_SerializePolyobjs (arc); P_SerializeSubsectors(arc); StatusBar->Serialize (arc); arc << level.total_monsters << level.total_items << level.total_secrets; // Does this level have custom translations? FRemapTable *trans; WORD w; if (arc.IsStoring ()) { for (unsigned int i = 0; i < translationtables[TRANSLATION_LevelScripted].Size(); ++i) { trans = translationtables[TRANSLATION_LevelScripted][i]; if (trans != NULL && !trans->IsIdentity()) { w = WORD(i); arc << w; trans->Serialize(arc); } } w = 0xffff; arc << w; } else { while (arc << w, w != 0xffff) { trans = translationtables[TRANSLATION_LevelScripted].GetVal(w); if (trans == NULL) { trans = new FRemapTable; translationtables[TRANSLATION_LevelScripted].SetVal(w, trans); } trans->Serialize(arc); } } // This must be saved, too, of course! FCanvasTextureInfo::Serialize (arc); AM_SerializeMarkers(arc); P_SerializePlayers (arc, hubLoad); P_SerializeSounds (arc); if (arc.IsLoading()) { for (i = 0; i < numsectors; i++) { P_Recalculate3DFloors(§ors[i]); } for (i = 0; i < MAXPLAYERS; ++i) { if (playeringame[i] && players[i].mo != NULL) { players[i].mo->SetupWeaponSlots(); } } } Renderer->EndSerialize(arc); }
static void PushIdentityTable(int slot) { FRemapTable *table = new FRemapTable; table->MakeIdentity(); translationtables[slot].Push(table); }