- added rudimentary support for SVE.wad from the Strife Veteran edition so that the extended single player campaign is usable:

* all new things got either an sctor definition or are explicitly deleted through the 'doomednums' section in MAPINFO. CTC related actors are non-functional!
* added a 'noskillflags' option to 'doomednums' so that the lightmap definition things in the maps can be repurposed as dynamic lights.
* added the new dagger powerup.
* added MAPINFO entries for the added maps.
This commit is contained in:
Christoph Oelckers 2017-05-01 20:44:41 +02:00
parent dcded0e183
commit 050acc9271
11 changed files with 434 additions and 8 deletions

View file

@ -88,6 +88,7 @@ struct MapinfoEdMapItem
// These are for error reporting. We must store the file information because it's no longer available when these items get resolved. // These are for error reporting. We must store the file information because it's no longer available when these items get resolved.
FString filename; FString filename;
int linenum; int linenum;
bool noskillflags;
}; };
typedef TMap<int, MapinfoEdMapItem> IdMap; typedef TMap<int, MapinfoEdMapItem> IdMap;
@ -184,12 +185,18 @@ void FMapInfoParser::ParseDoomEdNums()
} }
memset(editem.args, 0, sizeof(editem.args)); memset(editem.args, 0, sizeof(editem.args));
editem.argsdefined = 0; editem.argsdefined = 0;
editem.noskillflags = false;
int minargs = 0; int minargs = 0;
int maxargs = 5; int maxargs = 5;
FString specialname; FString specialname;
if (sc.CheckString(",")) if (sc.CheckString(","))
{ {
if (sc.CheckString("noskillflags"))
{
editem.noskillflags = true;
if (!sc.CheckString(",")) goto noargs;
}
editem.argsdefined = 5; // mark args as used - if this is done we need to prevent assignment of map args in P_SpawnMapThing. editem.argsdefined = 5; // mark args as used - if this is done we need to prevent assignment of map args in P_SpawnMapThing.
if (editem.special < 0) editem.special = 0; if (editem.special < 0) editem.special = 0;
if (!sc.CheckNumber()) if (!sc.CheckNumber())
@ -238,6 +245,7 @@ void FMapInfoParser::ParseDoomEdNums()
error++; error++;
} }
} }
noargs:
DoomEdFromMapinfo.Insert(ednum, editem); DoomEdFromMapinfo.Insert(ednum, editem);
} }
else else
@ -275,6 +283,7 @@ void InitActorNumsFromMapinfo()
ent.Type = cls; ent.Type = cls;
ent.Special = pair->Value.special; ent.Special = pair->Value.special;
ent.ArgsDefined = pair->Value.argsdefined; ent.ArgsDefined = pair->Value.argsdefined;
ent.NoSkillFlags = pair->Value.noskillflags;
memcpy(ent.Args, pair->Value.args, sizeof(ent.Args)); memcpy(ent.Args, pair->Value.args, sizeof(ent.Args));
DoomEdMap.Insert(pair->Key, ent); DoomEdMap.Insert(pair->Key, ent);
} }

View file

@ -358,6 +358,7 @@ struct FDoomEdEntry
PClassActor *Type; PClassActor *Type;
short Special; short Special;
signed char ArgsDefined; signed char ArgsDefined;
bool NoSkillFlags;
int Args[5]; int Args[5];
}; };

View file

@ -5817,7 +5817,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position)
} }
mask = G_SkillProperty(SKILLP_SpawnFilter); mask = G_SkillProperty(SKILLP_SpawnFilter);
if (!(mthing->SkillFilter & mask)) if (!(mthing->SkillFilter & mask) && !mentry->NoSkillFlags)
{ {
return NULL; return NULL;
} }

View file

@ -100,10 +100,22 @@ IWad
BannerColors = "ff ff 00", "00 c0 00" BannerColors = "ff ff 00", "00 c0 00"
} }
IWad
{
Name = "Strife: Veteran Edition"
Autoname = "strife.veteran"
Game = "Strife"
Config = "Strife"
Mapinfo = "mapinfo/strife.txt"
MustContain = "MAP35", "I_RELB", "FXAA_F"
BannerColors = "f0 f0 f0", "6b 3c 18"
Required = "Strife: Quest for the Sigil"
}
IWad IWad
{ {
Name = "Strife: Quest for the Sigil" Name = "Strife: Quest for the Sigil"
Autoname = "strife" Autoname = "strife.strife"
Game = "Strife" Game = "Strife"
Config = "Strife" Config = "Strife"
Mapinfo = "mapinfo/strife.txt" Mapinfo = "mapinfo/strife.txt"
@ -418,4 +430,5 @@ Names
"hacx2.wad" "hacx2.wad"
"square1.pk3" "square1.pk3"
"delaweare.wad" "delaweare.wad"
"sve.wad"
} }

View file

@ -2807,3 +2807,12 @@ TCMNU_MAGFILTER = "Linear filter when upscaling";
TCMNU_MIPMAP = "Use mipmapped textures"; TCMNU_MIPMAP = "Use mipmapped textures";
TCMNU_DYNLIGHTS = "Dynamic lights"; TCMNU_DYNLIGHTS = "Dynamic lights";
// SVE strings:
TAG_TALISMANRED = "Red Talisman";
TAG_TALISMANGREEN = "Green Talisman";
TAG_TALISMANBLUE = "Blue Talisman";
MSG_TALISMANRED = "You have a feeling that it wasn't to be touched...";
MSG_TALISMANGREEN = "Whatever it is, it doesn't belong in this world...";
MSG_TALISMANBLUE = "It must do something...";
MSG_TALISMANPOWER = "You have super strength!";

View file

@ -323,4 +323,12 @@ conversationids
341 = QuestItem30 341 = QuestItem30
342 = QuestItem31 342 = QuestItem31
343 = SlideshowStarter 343 = SlideshowStarter
345 = SVEBlueChalice
346 = SVEFlagSpotRed
347 = SVEFlagSpotBlue
348 = SVETalismanRed
349 = SVETalismanGreen
350 = SVETalismanBlue
351 = SVEOpenDoor225
} }

View file

@ -323,6 +323,30 @@ DoomEdNums
3004 = Peasant1 3004 = Peasant1
3005 = Crusader 3005 = Crusader
3006 = Sentinel 3006 = Sentinel
5080 = none // CTC stuff
5081 = none
5130 = SVEFlagSpotBlue
5131 = SVEFlagSpotRed
7957 = none // AltLight for lightmapped geometry.
7958 = SVELight7958, noskillflags
7959 = SVELight7959, noskillflags
7960 = SVELight7960, noskillflags
7961 = SVELight7961, noskillflags
7962 = SVELight7962, noskillflags
7963 = none
7964 = SVELight7964, noskillflags
7965 = SVELight7965, noskillflags
7966 = SVETalismanRed
7967 = SVETalismanGreen
7968 = SVETalismanBlue
7969 = none // Bloom threshold.
7970 = SVEBlueChalice
7971 = SVELight7971, noskillflags
7972 = SVELight7972, noskillflags
7973 = SVELight7973, noskillflags
7974 = SVELight7974, noskillflags
7975 = SVEOreSpawner
} }
SpawnNums SpawnNums
@ -860,6 +884,38 @@ map MAP34 "AREA 3: Movement Base"
noallies noallies
} }
map MAP35 "AREA 35: Factory: Production"
{
next = "MAP01"
sky1 = "SKYMNT01"
music = "D_TRIBAL"
cluster = 1
}
map MAP36 "AREA 36: Castle Clash"
{
next = "MAP37"
sky1 = "SKYMNT01"
music = "D_MARCH"
cluster = 3
}
map MAP37 "AREA 37: Killing Grounds"
{
next = "MAP38"
sky1 = "SKYMNT01"
music = "D_STRIKE"
cluster = 3
}
map MAP38 "AREA 38: Ordered Chaos"
{
next = "MAP36"
sky1 = "SKYMNT01"
music = "D_TRIBAL"
cluster = 3
}
cluster 1 cluster 1
{ {
hub hub

View file

@ -247,6 +247,8 @@ version "2.5"
#include "zscript/strife/weapongrenade.txt" #include "zscript/strife/weapongrenade.txt"
#include "zscript/strife/weaponmauler.txt" #include "zscript/strife/weaponmauler.txt"
#include "zscript/strife/sigil.txt" #include "zscript/strife/sigil.txt"
#include "zscript/strife/svestuff.txt"
#include "zscript/strife/svelights.txt"
#include "zscript/chex/chexmonsters.txt" #include "zscript/chex/chexmonsters.txt"
#include "zscript/chex/chexkeys.txt" #include "zscript/chex/chexkeys.txt"

View file

@ -0,0 +1,129 @@
// This turns the helper things for creating lightmaps in SVE into actual light sources
class SVELight : PointLight
{
override void BeginPlay()
{
Super.BeginPlay();
if (!bSpawnCeiling) AddZ(height);
}
}
class SVELight7958 : SVELight
{
Default
{
+SPAWNCEILING
+DYNAMICLIGHT.ATTENUATE
Height 6;
Args 255,255,224,128;
}
}
class SVELight7959 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 6;
Args 255,255,224,128;
}
}
class SVELight7960 : SVELight
{
Default
{
+SPAWNCEILING
+DYNAMICLIGHT.ATTENUATE
Height 6;
Args 255,255,64,100;
}
}
class SVELight7961 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 6;
Args 255,255,64,100;
}
}
class SVELight7962 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 8;
Args 255,64,16,128;
}
}
// 7963 has intentionally been omitted
class SVELight7964 : SVELight
{
Default
{
+SPAWNCEILING
+DYNAMICLIGHT.ATTENUATE
Height 64;
Args 200,200,170,160;
}
}
class SVELight7965 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 64;
Args 200,200,170,160;
}
}
class SVELight7971 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 80;
Args 248,248,224,144;
}
}
class SVELight7972 : SVELight
{
Default
{
+SPAWNCEILING
+DYNAMICLIGHT.ATTENUATE
Height 24;
Args 168,175,255,128;
}
}
class SVELight7973 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 80;
Args 112,112,112,100;
}
}
class SVELight7974 : SVELight
{
Default
{
+DYNAMICLIGHT.ATTENUATE
Height 80;
Args 100,100,90,100;
}
}

View file

@ -0,0 +1,191 @@
// CTC flag spots. They are not functional and only here so that something gets spawned for them.
class SVEFlagSpotRed : Inventory
{
States
{
Spawn:
FLGR A 1 BRIGHT;
FLGR A 0 BRIGHT; // A_FlagStandSpawn
FLGR A 1 BRIGHT; // A_FlagStandCheck
Wait;
}
}
class SVEFlagSpotBlue : Inventory
{
States
{
Spawn:
FLGB A 1 BRIGHT;
FLGB A 0 BRIGHT; // A_FlagStandSpawn
FLGB A 1 BRIGHT; // A_FlagStandCheck
Wait;
}
}
class SVEBlueChalice : Inventory
{
Default
{
+DROPPED
+FLOORCLIP
+INVENTORY.INVBAR
Radius 10;
Height 16;
Tag "$TAG_OFFERINGCHALICE";
Inventory.Icon "I_RELB";
Inventory.PickupMessage "$TXT_OFFERINGCHALICE";
}
States
{
Spawn:
RELB A -1 BRIGHT;
Stop;
}
}
class SVETalismanPowerup : Inventory
{
}
class SVETalismanRed : Inventory
{
Default
{
+DROPPED
+FLOORCLIP
+INVENTORY.INVBAR
Radius 10;
Height 16;
Inventory.MaxAmount 1;
Inventory.Icon "I_FLGR";
Tag "$TAG_TALISMANRED";
Inventory.PickupMessage "$MSG_TALISMANRED";
}
States
{
Spawn:
FLGR A -1 BRIGHT;
Stop;
}
override bool TryPickup (in out Actor toucher)
{
let useok = Super.TryPickup (toucher);
if (useok)
{
if (toucher.FindInventory("SVETalismanRed") &&
toucher.FindInventory("SVETalismanGreen") &&
toucher.FindInventory("SVETalismanBlue"))
{
toucher.A_Print("$MSG_TALISMANPOWER");
GiveInventoryType("SVETalismanPowerup");
}
}
return useok;
}
}
class SVETalismanBlue : SVETalismanRed
{
Default
{
+INVENTORY.INVBAR
Inventory.Icon "I_FLGB";
Tag "$TAG_TALISMANBLUE";
Inventory.PickupMessage "$MSG_TALISMANBLUE";
}
States
{
Spawn:
FLGB A -1 BRIGHT;
Stop;
}
}
class SVETalismanGreen : SVETalismanRed
{
Default
{
+INVENTORY.INVBAR
Inventory.Icon "I_FLGG";
Tag "$TAG_TALISMANGREEN";
Inventory.PickupMessage "$MSG_TALISMANGREEN";
}
States
{
Spawn:
FLGG A -1 BRIGHT;
Stop;
}
}
class SVEOreSpawner : Actor
{
Default
{
+NOSECTOR
}
States
{
Spawn:
TNT1 A 175 A_OreSpawner;
loop;
}
//
// A_OreSpawner
//
// [SVE] svillarreal
//
void A_OreSpawner()
{
if(deathmatch) return;
bool inrange = false;
for(int i = 0; i < MAXPLAYERS; i++)
{
if(!playeringame[i])
continue;
if(Distance2D(players[i].mo) < 2048)
{
inrange = true;
break;
}
}
if(!inrange) return;
let it = ThinkerIterator.Create("DegninOre");
Thinker ac;
int numores = 0;
while (ac = it.Next())
{
if (++numores == 3) return;
}
Spawn("DegninOre", Pos);
}
}
class SVEOpenDoor225 : DummyStrifeItem
{
override bool TryPickup (in out Actor toucher)
{
Door_Open(225, 16);
GoAwayAndDie ();
return true;
}
override bool SpecialDropAction (Actor dropper)
{
Door_Open(225, 16);
Destroy ();
return true;
}
}

View file

@ -40,14 +40,22 @@ class PunchDagger : StrifeWeapon
action void A_JabDagger () action void A_JabDagger ()
{ {
FTranslatedLineTarget t; FTranslatedLineTarget t;
int damage;
if (FindInventory("SVETalismanPowerup"))
{
damage = 1000;
}
else
{
int power = MIN(10, stamina / 10); int power = MIN(10, stamina / 10);
int damage = (random[JabDagger]() % (power + 8)) * (power + 2); damage = (random[JabDagger]() % (power + 8)) * (power + 2);
if (FindInventory("PowerStrength")) if (FindInventory("PowerStrength"))
{ {
damage *= 10; damage *= 10;
} }
}
double angle = angle + random2[JabDagger]() * (5.625 / 256); double angle = angle + random2[JabDagger]() * (5.625 / 256);
double pitch = AimLineAttack (angle, 80.); double pitch = AimLineAttack (angle, 80.);