void R_SetGlobalLevelColormap() { global_cmap_index = R_ColormapNumForName(LevelInfo.colorMap); global_fog_index = R_ColormapNumForName(LevelInfo.outdoorFog); // 04/15/08: this error can be tolerated; default to COLORMAP. if(global_cmap_index < 0) global_cmap_index = 0; if(global_fog_index < 0) global_fog_index = 0; }
static void parseSector(FScanner &sc, TMap<int, EDSector> &EDSectors) { EDSector sec; memset(&sec, 0, sizeof(sec)); sec.Overlayalpha[sector_t::floor] = sec.Overlayalpha[sector_t::ceiling] = 1.; sec.floorterrain = sec.ceilingterrain = -1; sc.MustGetStringName("{"); while (!sc.CheckString("}")) { sc.MustGetString(); if (sc.Compare("recordnum")) { sc.CheckString("="); sc.MustGetNumber(); sec.recordnum = sc.Number; } else if (sc.Compare("flags")) { uint32_t *flagvar = nullptr; if (sc.CheckString(".")) { sc.MustGetString(); if (sc.Compare("add")) { flagvar = &sec.flagsAdd; } else if (sc.Compare("remove")) { flagvar = &sec.flagsRemove; } else { sc.ScriptError("Invalid property 'flags.%s'", sc.String); } } else { sec.flagsSet = true; flagvar = &sec.flags; } sc.CheckString("="); do { sc.MustGetString(); for (const char *tok = strtok(sc.String, ",+ \t"); tok != nullptr; tok = strtok(nullptr, ",+ \t")) { if (!stricmp(tok, "SECRET")) *flagvar |= SECF_SECRET | SECF_WASSECRET; else if (!stricmp(tok, "FRICTION")) *flagvar |= SECF_FRICTION; else if (!stricmp(tok, "PUSH")) *flagvar |= SECF_PUSH; else if (!stricmp(tok, "KILLSOUND")) *flagvar |= SECF_SILENT; else if (!stricmp(tok, "KILLMOVESOUND")) *flagvar |= SECF_SILENTMOVE; else sc.ScriptError("Unknown option '%s'", tok); } } while (sc.CheckString("|")); // Unquoted strings with '|' separator - parse as a separate string in the loop. } else if (sc.Compare("damage")) { sc.CheckString("="); sc.MustGetNumber(); sec.damageamount = sc.Number; } else if (sc.Compare("damagemod")) { sc.CheckString("="); sc.MustGetString(); sec.damagetype = sc.String; } else if (sc.Compare("damagemask")) { sc.CheckString("="); sc.MustGetNumber(); sec.damageinterval = sc.Number; } else if (sc.Compare("damageflags")) { uint32_t *flagvar = nullptr; uint8_t *leakvar = nullptr; if (sc.CheckString(".")) { sc.MustGetString(); if (sc.Compare("add")) { flagvar = &sec.damageflagsAdd; leakvar = &sec.leakyadd; } else if (sc.Compare("remove")) { flagvar = &sec.damageflagsRemove; leakvar = &sec.leakyremove; } else { sc.ScriptError("Invalid property 'flags.%s'", sc.String); } } else { sec.damageflagsSet = true; flagvar = &sec.damageflags; leakvar = &sec.leaky; } sc.CheckString("="); do { sc.MustGetString(); for (const char *tok = strtok(sc.String, ",+ \t"); tok != nullptr; tok = strtok(nullptr, ",+ \t")) { if (!stricmp(tok, "LEAKYSUIT")) *leakvar |= 1; else if (!stricmp(tok, "IGNORESUIT")) *leakvar |= 2; // these 2 bits will be used to set 'leakychance', but this can only be done when the sector gets initialized else if (!stricmp(tok, "ENDGODMODE")) *flagvar |= SECF_ENDGODMODE; else if (!stricmp(tok, "ENDLEVEL")) *flagvar |= SECF_ENDLEVEL; else if (!stricmp(tok, "TERRAINHIT")) *flagvar |= SECF_DMGTERRAINFX; else sc.ScriptError("Unknown option '%s'", tok); } } while (sc.CheckString("|")); // Unquoted strings with '|' separator - parse as a separate string in the loop. } else if (sc.Compare("floorterrain")) { sc.CheckString("="); sc.MustGetString(); sec.floorterrain = P_FindTerrain(sc.String); } else if (sc.Compare("floorangle")) { sc.CheckString("="); sc.MustGetFloat(); sec.angle[sector_t::floor] = sc.Float; } else if (sc.Compare("flooroffsetx")) { sc.CheckString("="); sc.MustGetFloat(); sec.xoffs[sector_t::floor] = sc.Float; } else if (sc.Compare("flooroffsety")) { sc.CheckString("="); sc.MustGetFloat(); sec.yoffs[sector_t::floor] = sc.Float; } else if (sc.Compare("ceilingterrain")) { sc.CheckString("="); sc.MustGetString(); sec.ceilingterrain = P_FindTerrain(sc.String); } else if (sc.Compare("ceilingangle")) { sc.CheckString("="); sc.MustGetFloat(); sec.angle[sector_t::ceiling] = sc.Float; } else if (sc.Compare("ceilingoffsetx")) { sc.CheckString("="); sc.MustGetFloat(); sec.xoffs[sector_t::ceiling] = sc.Float; } else if (sc.Compare("ceilingoffsety")) { sc.CheckString("="); sc.MustGetFloat(); sec.yoffs[sector_t::ceiling] = sc.Float; } else if (sc.Compare("colormaptop") || sc.Compare("colormapbottom")) { sc.CheckString("="); sc.MustGetString(); // these properties are not implemented by ZDoom } else if (sc.Compare("colormapmid")) { sc.CheckString("="); sc.MustGetString(); // Eternity is based on SMMU and uses colormaps differently than all other ports. // The only solution here is to convert the colormap to an RGB value and set it as the sector's color. uint32_t cmap = R_ColormapNumForName(sc.String); if (cmap != 0) { sec.color = R_BlendForColormap(cmap) & 0xff000000; sec.colorSet = true; } } else if (sc.Compare("overlayalpha")) { sc.MustGetStringName("."); sc.MustGetString(); if (sc.Compare("floor")) { sc.MustGetNumber(); if (sc.CheckString("%")) sc.Float = sc.Number / 100.f; else sc.Float = sc.Number / 255.f; sec.Overlayalpha[sector_t::floor] = sc.Float; } else if (sc.Compare("ceiling")) { sc.MustGetFloat(); if (sc.CheckString("%")) sc.Float = sc.Number / 100.f; else sc.Float = sc.Number / 255.f; sec.Overlayalpha[sector_t::floor] = sc.Float; } } else if (sc.Compare("portalflags")) { int dest = 0; sc.MustGetStringName("."); sc.MustGetString(); if (sc.Compare("floor")) dest = sector_t::floor; else if (sc.Compare("ceiling")) dest = sector_t::ceiling; else sc.ScriptError("Unknown portal type '%s'", sc.String); sc.CheckString("="); do { sc.MustGetString(); for (const char *tok = strtok(sc.String, ",+ \t"); tok != nullptr; tok = strtok(nullptr, ",+ \t")) { if (!stricmp(tok, "DISABLED")) sec.portalflags[dest] |= PLANEF_DISABLED; else if (!stricmp(tok, "NORENDER")) sec.portalflags[dest] |= PLANEF_NORENDER; else if (!stricmp(tok, "NOPASS")) sec.portalflags[dest] |= PLANEF_NOPASS; else if (!stricmp(tok, "BLOCKSOUND")) sec.portalflags[dest] |= PLANEF_BLOCKSOUND; else if (!stricmp(tok, "OVERLAY")) sec.portalflags[dest] |= 0; // we do not use this. Alpha is the sole determinant for overlay drawing else if (!stricmp(tok, "ADDITIVE")) sec.portalflags[dest] |= PLANEF_ADDITIVE; else if (!stricmp(tok, "USEGLOBALTEX")) {} // not implemented else sc.ScriptError("Unknown option '%s'", tok); } } while (sc.CheckString("|")); // Unquoted strings with '|' separator - parse as a separate string in the loop. } else { sc.ScriptError("Unknown property '%s'", sc.String); } } EDSectors[sec.recordnum] = sec; }
// // Loads sectors // void UDMFParser::loadSectors(UDMFSetupSettings &setupSettings) const { numsectors = (int)mSectors.getLength(); sectors = estructalloctag(sector_t, numsectors, PU_LEVEL); for(int i = 0; i < numsectors; ++i) { sector_t *ss = sectors + i; const USector &us = mSectors[i]; if(mNamespace == namespace_Eternity) { // These two pass the fixed_t value now ss->floorheight = us.heightfloor; ss->ceilingheight = us.heightceiling; // New to Eternity ss->floor_xoffs = us.xpanningfloor; ss->floor_yoffs = us.ypanningfloor; ss->ceiling_xoffs = us.xpanningceiling; ss->ceiling_yoffs = us.ypanningceiling; ss->floorbaseangle = static_cast<float> (E_NormalizeFlatAngle(us.rotationfloor) * PI / 180.0f); ss->ceilingbaseangle = static_cast<float> (E_NormalizeFlatAngle(us.rotationceiling) * PI / 180.0f); // Flags ss->flags |= us.secret ? SECF_SECRET : 0; // Friction: set the parameter directly from UDMF if(us.friction >= 0) // default: -1 { int friction, movefactor; P_CalcFriction(us.friction, friction, movefactor); ss->flags |= SECF_FRICTION; // add the flag too ss->friction = friction; ss->movefactor = movefactor; } // Damage ss->damage = us.damageamount; ss->damagemask = us.damageinterval; ss->damagemod = E_DamageTypeNumForName(us.damagetype.constPtr()); // If the following flags are true for the current sector, then set the // appropriate damageflags to true, otherwise don't set them. ss->damageflags |= us.damage_endgodmode ? SDMG_ENDGODMODE : 0; ss->damageflags |= us.damage_exitlevel ? SDMG_EXITLEVEL : 0; ss->damageflags |= us.damageterraineffect ? SDMG_TERRAINHIT : 0; ss->leakiness = eclamp(us.leakiness, 0, 256); // Terrain types if(us.floorterrain.strCaseCmp(DEFAULT_flat)) ss->floorterrain = E_TerrainForName(us.floorterrain.constPtr()); if (us.ceilingterrain.strCaseCmp(DEFAULT_flat)) ss->ceilingterrain = E_TerrainForName(us.ceilingterrain.constPtr()); // Lights ss->floorlightdelta = static_cast<int16_t>(us.lightfloor); ss->ceilinglightdelta = static_cast<int16_t>(us.lightceiling); ss->flags |= (us.lightfloorabsolute ? SECF_FLOORLIGHTABSOLUTE : 0) | (us.lightceilingabsolute ? SECF_CEILLIGHTABSOLUTE : 0); // sector colormaps ss->topmap = ss->midmap = ss->bottommap = -1; // mark as not specified } else { ss->floorheight = us.heightfloor << FRACBITS; ss->ceilingheight = us.heightceiling << FRACBITS; } ss->floorpic = R_FindFlat(us.texturefloor.constPtr()); P_SetSectorCeilingPic(ss, R_FindFlat(us.textureceiling.constPtr())); ss->lightlevel = us.lightlevel; ss->special = us.special; ss->tag = us.identifier; P_InitSector(ss); // // HERE GO THE PROPERTIES THAT MUST TAKE EFFECT AFTER P_InitSector // if(mNamespace == namespace_Eternity) { if(us.colormaptop.strCaseCmp(DEFAULT_default)) { ss->topmap = R_ColormapNumForName(us.colormaptop.constPtr()); setupSettings.setSectorFlag(i, UDMF_SECTOR_INIT_COLORMAPPED); } if(us.colormapmid.strCaseCmp(DEFAULT_default)) { ss->midmap = R_ColormapNumForName(us.colormapmid.constPtr()); setupSettings.setSectorFlag(i, UDMF_SECTOR_INIT_COLORMAPPED); } if(us.colormapbottom.strCaseCmp(DEFAULT_default)) { ss->bottommap = R_ColormapNumForName(us.colormapbottom.constPtr()); setupSettings.setSectorFlag(i, UDMF_SECTOR_INIT_COLORMAPPED); } // Portal fields // Floors ss->f_pflags |= us.portal_floor_alpha << PO_OPACITYSHIFT; ss->f_pflags |= us.portal_floor_blocksound ? PF_BLOCKSOUND : 0; ss->f_pflags |= us.portal_floor_disabled ? PF_DISABLED : 0; ss->f_pflags |= us.portal_floor_nopass ? PF_NOPASS : 0; ss->f_pflags |= us.portal_floor_norender ? PF_NORENDER : 0; if(!us.portal_floor_overlaytype.strCaseCmp(RENDERSTYLE_translucent)) ss->f_pflags |= PS_OVERLAY; else if(!us.portal_floor_overlaytype.strCaseCmp(RENDERSTYLE_add)) ss->f_pflags |= PS_OBLENDFLAGS; // PS_OBLENDFLAGS is PS_OVERLAY | PS_ADDITIVE ss->f_pflags |= us.portal_floor_useglobaltex ? PS_USEGLOBALTEX : 0; // Ceilings ss->c_pflags |= us.portal_ceil_alpha << PO_OPACITYSHIFT; ss->c_pflags |= us.portal_ceil_blocksound ? PF_BLOCKSOUND : 0; ss->c_pflags |= us.portal_ceil_disabled ? PF_DISABLED : 0; ss->c_pflags |= us.portal_ceil_nopass ? PF_NOPASS : 0; ss->c_pflags |= us.portal_ceil_norender ? PF_NORENDER : 0; if(!us.portal_ceil_overlaytype.strCaseCmp(RENDERSTYLE_translucent)) ss->c_pflags |= PS_OVERLAY; else if(!us.portal_ceil_overlaytype.strCaseCmp(RENDERSTYLE_add)) ss->c_pflags |= PS_OBLENDFLAGS; // PS_OBLENDFLAGS is PS_OVERLAY | PS_ADDITIVE ss->c_pflags |= us.portal_ceil_useglobaltex ? PS_USEGLOBALTEX : 0; } } }