From dbbd797baadc8b997c1b6d5d24a71df734248cd1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 28 Jan 2017 19:05:39 +0100 Subject: [PATCH] - added the needed properties for Doom64 colors and a little FraggleScript hack to test it with existing maps. --- src/fragglescript/t_func.cpp | 13 +++++++++++-- src/fragglescript/t_load.cpp | 19 +++++++++++++++++++ src/fragglescript/t_script.h | 1 + src/namedef.h | 5 +++++ src/p_saveg.cpp | 1 + src/p_setup.cpp | 1 + src/p_udmf.cpp | 21 +++++++++++++++++++++ src/r_defs.h | 9 ++++++++- 8 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 5aaa402e8..1ffd34fad 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -3875,7 +3875,7 @@ void FParser::SF_SetColor(void) color.r=intvalue(t_argv[1]); color.g=intvalue(t_argv[2]); color.b=intvalue(t_argv[3]); - color.a=0; + color.a = (DFraggleThinker::ActiveThinker->setcolormaterial) ? 255 : 0; } else return; @@ -3883,7 +3883,16 @@ void FParser::SF_SetColor(void) FSSectorTagIterator itr(tagnum); while ((i = itr.Next()) >= 0) { - level.sectors[i].ColorMap = GetSpecialLights (color, level.sectors[i].ColorMap->Fade, 0); + if (!DFraggleThinker::ActiveThinker->setcolormaterial) + level.sectors[i].ColorMap = GetSpecialLights(color, level.sectors[i].ColorMap->Fade, 0); + else + { + // little hack for testing the D64 color stuff. + for (int j = 0; j < 4; j++) level.sectors[i].SpecialColors[j] = color; + // simulates 'nocoloredspritelighting' settings. + int v = (color.r + color.g + color.b) / 3; + level.sectors[i].SpecialColors[4] = (255 + v + v) / 3; + } } } } diff --git a/src/fragglescript/t_load.cpp b/src/fragglescript/t_load.cpp index b3b38543d..eb7b602bf 100644 --- a/src/fragglescript/t_load.cpp +++ b/src/fragglescript/t_load.cpp @@ -73,15 +73,18 @@ struct FFsOptions : public FOptionalMapinfoData { identifier = "fragglescript"; nocheckposition = false; + setcolormaterial = false; } virtual FOptionalMapinfoData *Clone() const { FFsOptions *newopt = new FFsOptions; newopt->identifier = identifier; newopt->nocheckposition = nocheckposition; + newopt->setcolormaterial = setcolormaterial; return newopt; } bool nocheckposition; + bool setcolormaterial; }; DEFINE_MAP_OPTION(fs_nocheckposition, false) @@ -99,6 +102,21 @@ DEFINE_MAP_OPTION(fs_nocheckposition, false) } } +DEFINE_MAP_OPTION(fs_setcolormaterial, false) +{ + FFsOptions *opt = info->GetOptData("fragglescript"); + + if (parse.CheckAssign()) + { + parse.sc.MustGetNumber(); + opt->setcolormaterial = !!parse.sc.Number; + } + else + { + opt->setcolormaterial = true; + } +} + //----------------------------------------------------------------------------- // // Process the lump to strip all unneeded information from it @@ -307,6 +325,7 @@ bool FScriptLoader::ParseInfo(MapData * map) if (opt != NULL) { DFraggleThinker::ActiveThinker->nocheckposition = opt->nocheckposition; + DFraggleThinker::ActiveThinker->setcolormaterial = opt->setcolormaterial; } } diff --git a/src/fragglescript/t_script.h b/src/fragglescript/t_script.h index 7a5c21a10..6172c352a 100644 --- a/src/fragglescript/t_script.h +++ b/src/fragglescript/t_script.h @@ -695,6 +695,7 @@ public: TObjPtr RunningScripts; TArray > SpawnedThings; bool nocheckposition; + bool setcolormaterial; DFraggleThinker(); void OnDestroy() override; diff --git a/src/namedef.h b/src/namedef.h index 731947da7..ef7f1c58d 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -549,6 +549,11 @@ xx(Lightceilingabsolute) xx(Gravity) xx(Lightcolor) xx(Fadecolor) +xx(Color_Floor) +xx(Color_Ceiling) +xx(Color_Walltop) +xx(Color_Wallbottom) +xx(Color_Sprites) xx(Desaturation) xx(SoundSequence) xx(Silent) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 04c35d157..48908ea71 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -275,6 +275,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t ("linked_floor", p.e->Linked.Floor.Sectors) ("linked_ceiling", p.e->Linked.Ceiling.Sectors) ("colormap", p.ColorMap, def->ColorMap) + .Array("specialcolors", p.SpecialColors, def->SpecialColors, 5, true) ("gravity", p.gravity, def->gravity) .Terrain("floorterrain", p.terrainnum[0], &def->terrainnum[0]) .Terrain("ceilingterrain", p.terrainnum[1], &def->terrainnum[1]) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index b94e12b9b..e2dee7cf1 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1504,6 +1504,7 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex) ss->SeqName = NAME_None; ss->nextsec = -1; //jff 2/26/98 add fields to support locking out ss->prevsec = -1; // stair retriggering until build completes + memset(ss->SpecialColors, -1, sizeof(ss->SpecialColors)); ss->SetAlpha(sector_t::floor, 1.); ss->SetAlpha(sector_t::ceiling, 1.); diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index b0c9dbc15..6c732d67f 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -1307,6 +1307,7 @@ public: sec->sectornum = index; sec->damageinterval = 32; sec->terrainnum[sector_t::ceiling] = sec->terrainnum[sector_t::floor] = -1; + memset(sec->SpecialColors, -1, sizeof(sec->SpecialColors)); if (floordrop) sec->Flags = SECF_FLOORDROP; // killough 3/7/98: end changes @@ -1459,6 +1460,26 @@ public: fadecolor = CheckInt(key); continue; + case NAME_Color_Floor: + sec->SpecialColors[sector_t::floor] = CheckInt(key) || 0xff000000; + break; + + case NAME_Color_Ceiling: + sec->SpecialColors[sector_t::ceiling] = CheckInt(key) || 0xff000000; + break; + + case NAME_Color_Walltop: + sec->SpecialColors[sector_t::walltop] = CheckInt(key) || 0xff000000; + break; + + case NAME_Color_Wallbottom: + sec->SpecialColors[sector_t::wallbottom] = CheckInt(key) || 0xff000000; + break; + + case NAME_Color_Sprites: + sec->SpecialColors[sector_t::sprites] = CheckInt(key) || 0xff000000; + break; + case NAME_Desaturation: desaturation = int(255*CheckFloat(key)); continue; diff --git a/src/r_defs.h b/src/r_defs.h index 3c38f285d..ff5cdd690 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -479,6 +479,7 @@ enum SECF_UNDERWATERMASK = 32+64, SECF_DRAWN = 128, // sector has been drawn at least once SECF_HIDDEN = 256, // Do not draw on textured automap + SECF_SPECIALCOLORSABSOLUTE = 512, // The special colors ignore the light level except for fog density. }; enum @@ -660,10 +661,15 @@ public: FSectorPortal *ValidatePortal(int which); void CheckPortalPlane(int plane); + enum { floor, - ceiling + ceiling, + // only used for specialcolors array + walltop, + wallbottom, + sprites }; struct splane @@ -961,6 +967,7 @@ public: // [RH] give floor and ceiling even more properties FDynamicColormap *ColorMap; // [RH] Per-sector colormap + PalEntry SpecialColors[5]; TObjPtr SoundTarget;