Example #1
0
void P_PutMapSongLump(int map, VName lumpName)
{
	guard(P_PutMapSongLump);
	FMapSongInfo& ms = MapSongList.Alloc();
	ms.MapName = va("map%02d", map);
	ms.SongName = lumpName;
	unguard;
}
Example #2
0
void P_GetMusicLumpNames(TArray<FReplacedString>& List)
{
	guard(P_GetMusicLumpNames);
	for (int i = 0; i < MapInfo.Num(); i++)
	{
		const char* MName = *MapInfo[i].SongLump;
		if (MName[0] == 'd' && MName[1] == '_')
		{
			FReplacedString& R = List.Alloc();
			R.Index = i;
			R.Replaced = false;
			R.Old = MName + 2;
		}
	}
	unguard;
}
Example #3
0
static void ReadNet()
{
	char		Buffer[MAX_MSGLEN];

	//	Check if there's any packet waiting.
	if (recvfrom(AcceptSocket, Buffer, MAX_MSGLEN, MSG_PEEK, NULL, NULL) < 0)
	{
		return;
	}

	//	Read packet.
	sockaddr clientaddr;
	socklen_t addrlen = sizeof(sockaddr);
	int len = recvfrom(AcceptSocket, Buffer, MAX_MSGLEN, 0, &clientaddr, &addrlen);
	if (len < 1)
	{
		return;
	}

	switch (Buffer[0])
	{
	case MCREQ_JOIN:
		{
			for (int i = 0; i < SrvList.Num(); i++)
			{
				if (!AddrCompare(&SrvList[i].Addr, &clientaddr))
				{
					SrvList[i].Time = time(0);
					return;
				}
			}
			TSrvItem& I = SrvList.Alloc();
			I.Addr = clientaddr;
			I.Time = time(0);
		}
		break;

	case MCREQ_QUIT:
		for (int i = 0; i < SrvList.Num(); i++)
		{
			if (!AddrCompare(&SrvList[i].Addr, &clientaddr))
			{
				SrvList.RemoveIndex(i);
				break;
			}
		}
		break;

	case MCREQ_LIST:
		{
			Buffer[0] = MCREP_LIST;
			int Len = 1;
			for (int i = 0; i < SrvList.Num() && i < (MAX_MSGLEN - 1) / 6; i++)
			{
				memcpy(&Buffer[Len], SrvList[i].Addr.sa_data + 2, 4);
				memcpy(&Buffer[Len + 4], SrvList[i].Addr.sa_data, 2);
				Len += 6;
			}
			sendto(AcceptSocket, Buffer, Len, 0, &clientaddr, sizeof(sockaddr));
		}
		break;
	}
}
Example #4
0
static void RenameSprites()
{
	guard(RenameSprites);
	VStream* Strm = FL_OpenFileRead("sprite_rename.txt");
	if (!Strm)
	{
		return;
	}

	VScriptParser* sc = new VScriptParser("sprite_rename.txt", Strm);
	TArray<VSpriteRename> Renames;
	TArray<VSpriteRename> AlwaysRenames;
	TArray<VLumpRename> LumpRenames;
	TArray<VLumpRename> AlwaysLumpRenames;
	while (!sc->AtEnd())
	{
		bool Always = sc->Check("always");

		if (sc->Check("lump"))
		{
			sc->ExpectString();
			VStr Old = sc->String.ToLower();
			sc->ExpectString();
			VStr New = sc->String.ToLower();
			VLumpRename& R = Always ? AlwaysLumpRenames.Alloc() :
				LumpRenames.Alloc();
			R.Old = *Old;
			R.New = *New;
			continue;
		}

		sc->ExpectString();
		if (sc->String.Length() != 4)
		{
			sc->Error("Sprite name must be 4 chars long");
		}
		VStr Old = sc->String.ToLower();

		sc->ExpectString();
		if (sc->String.Length() != 4)
		{
			sc->Error("Sprite name must be 4 chars long");
		}
		VStr New = sc->String.ToLower();

		VSpriteRename& R = Always ? AlwaysRenames.Alloc() : Renames.Alloc();
		R.Old[0] = Old[0];
		R.Old[1] = Old[1];
		R.Old[2] = Old[2];
		R.Old[3] = Old[3];
		R.New[0] = New[0];
		R.New[1] = New[1];
		R.New[2] = New[2];
		R.New[3] = New[3];
	}
	delete sc;
	sc = NULL;

	bool RenameAll = !!GArgs.CheckParm("-oldsprites");
	for (int i = 0; i < SearchPaths.Num(); i++)
	{
		if (RenameAll || i == IWadIndex)
		{
			SearchPaths[i]->RenameSprites(Renames, LumpRenames);
		}
		SearchPaths[i]->RenameSprites(AlwaysRenames, AlwaysLumpRenames);
	}
	unguard;
}
Example #5
0
static void ParseBase(const VStr& name)
{
	guard(ParseBase);
	TArray<version_t>	games;
	bool				select_game;
	VStr				UseName;

	if (fl_savedir.IsNotEmpty() && Sys_FileExists(fl_savedir + "/" + name))
	{
		UseName = fl_savedir + "/" + name;
	}
	else if (Sys_FileExists(fl_basedir + "/" + name))
	{
		UseName = fl_basedir + "/" + name;
	}
	else
	{
		return;
	}

	select_game = false;
	VScriptParser* sc = new VScriptParser(UseName, FL_OpenSysFileRead(UseName));
	while (!sc->AtEnd())
	{
		version_t &dst = games.Alloc();
		dst.ParmFound = 0;
		dst.FixVoices = false;
		sc->Expect("game");
		sc->ExpectString();
		dst.GameDir = sc->String;
		if (sc->Check("iwad"))
		{
			sc->ExpectString();
			dst.MainWad = sc->String;
		}
		while (sc->Check("addfile"))
		{
			sc->ExpectString();
			dst.AddFiles.Append(sc->String);
		}
		if (sc->Check("param"))
		{
			sc->ExpectString();
			dst.ParmFound = GArgs.CheckParm(*sc->String);
			if (dst.ParmFound)
			{
				select_game = true;
			}
		}
		if (sc->Check("fixvoices"))
		{
			dst.FixVoices = true;
		}
		sc->Expect("end");
	}
	delete sc;
	sc = NULL;

	for (int gi = games.Num() - 1; gi >= 0; gi--)
	{
		version_t& G = games[gi];
		if (select_game && !G.ParmFound)
		{
			continue;
		}
		if (fl_mainwad.IsNotEmpty())
		{
			if (G.MainWad.IsEmpty() || G.MainWad == fl_mainwad || select_game)
			{
				if (!bIwadAdded)
				{
					IWadIndex = SearchPaths.Num();
					VStr MainWadPath = FindMainWad(fl_mainwad);
					W_AddFile(MainWadPath, fl_savedir, G.FixVoices);
					bIwadAdded = true;
				}
				for (int j = 0; j < G.AddFiles.Num(); j++)
				{
					W_AddFile(fl_basedir + "/" + G.AddFiles[j], fl_savedir,
						false);
				}
				SetupGameDir(G.GameDir);
				return;
			}
			continue;
		}
		if (G.MainWad.IsEmpty())
		{
			continue;
		}

		//	Look for the main wad file.
		VStr MainWadPath = FindMainWad(G.MainWad);
		if (MainWadPath.IsNotEmpty())
		{
			fl_mainwad = G.MainWad;
			if (!bIwadAdded)
			{
				IWadIndex = SearchPaths.Num();
				W_AddFile(MainWadPath, fl_savedir, G.FixVoices);
				bIwadAdded = true;
			}
			for (int j = 0; j < G.AddFiles.Num(); j++)
			{
				VStr FName = FindMainWad(G.AddFiles[j]);
				if (FName.IsEmpty())
				{
					Sys_Error("Required file %s not found", *G.AddFiles[j]);
				}
				W_AddFile(FName, fl_savedir, false);
			}
			SetupGameDir(G.GameDir);
			return;
		}
	}

	if (select_game)
		Sys_Error("Main wad file not found.");
	else
		Sys_Error("Game mode indeterminate.");
	unguard;
}
Example #6
0
static void ParseMap(VScriptParser* sc, bool& HexenMode, mapInfo_t& Default)
{
	guard(ParseMap);
	mapInfo_t* info = NULL;
	VName MapLumpName;
	if (sc->CheckNumber())
	{
		//	Map number, for Hexen compatibility
		HexenMode = true;
		if (sc->Number < 1 || sc->Number > 99)
		{
			sc->Error("Map number out or range");
		}
		MapLumpName = va("map%02d", sc->Number);
	}
	else
	{
		//	Map name
		sc->ExpectName8();
		MapLumpName = sc->Name8;
	}

	//	Check for replaced map info.
	for (int i = 0; i < MapInfo.Num(); i++)
	{
		if (MapLumpName == MapInfo[i].LumpName)
		{
			info = &MapInfo[i];
			break;
		}
	}
	if (!info)
	{
		info = &MapInfo.Alloc();
	}

	// Copy defaults to current map definition
	info->LumpName = MapLumpName;
	info->LevelNum = Default.LevelNum;
	info->Cluster = Default.Cluster;
	info->WarpTrans = Default.WarpTrans;
	info->NextMap = Default.NextMap;
	info->SecretMap = Default.SecretMap;
	info->SongLump = Default.SongLump;
	info->CDTrack = Default.CDTrack;
	info->Sky1Texture = Default.Sky1Texture;
	info->Sky2Texture = Default.Sky2Texture;
	info->Sky1ScrollDelta = Default.Sky1ScrollDelta;
	info->Sky2ScrollDelta = Default.Sky2ScrollDelta;
	info->SkyBox = Default.SkyBox;
	info->FadeTable = Default.FadeTable;
	info->Fade = Default.Fade;
	info->OutsideFog = Default.OutsideFog;
	info->Gravity = Default.Gravity;
	info->AirControl = Default.AirControl;
	info->Flags = Default.Flags;
	info->Flags2 = Default.Flags2;
	info->TitlePatch = Default.TitlePatch;
	info->ParTime = Default.ParTime;
	info->SuckTime = Default.SuckTime;
	info->HorizWallShade = Default.HorizWallShade;
	info->VertWallShade = Default.VertWallShade;
	info->Infighting = Default.Infighting;
	info->SpecialActions = Default.SpecialActions;
	info->RedirectType = Default.RedirectType;
	info->RedirectMap = Default.RedirectMap;
	info->ExitPic = Default.ExitPic;
	info->EnterPic = Default.EnterPic;
	info->InterMusic = Default.InterMusic;

	if (HexenMode)
	{
		info->Flags |= MAPINFOF_NoIntermission |
			MAPINFOF_FallingDamage |
			MAPINFOF_MonsterFallingDamage |
			MAPINFOF_NoAutoSndSeq |
			MAPINFOF_ActivateOwnSpecial |
			MAPINFOF_MissilesActivateImpact |
			MAPINFOF_InfiniteFlightPowerup;
	}

	// Map name must follow the number
	if (sc->Check("lookup"))
	{
		info->Flags |= MAPINFOF_LookupName;
		sc->ExpectString();
		info->Name = sc->String.ToLower();
	}
	else
	{
		info->Flags &= ~MAPINFOF_LookupName;
		sc->ExpectString();
		info->Name = sc->String;
	}

	//	Set song lump name from SNDINFO script
	for (int i = 0; i < MapSongList.Num(); i++)
	{
		if (MapSongList[i].MapName == info->LumpName)
		{
			info->SongLump = MapSongList[i].SongName;
		}
	}

	//	Set default levelnum for this map.
	const char* mn = *MapLumpName;
	if (mn[0] == 'm' && mn[1] == 'a' && mn[2] == 'p' && mn[5] == 0)
	{
		int num = atoi(mn + 3);
		if  (num >= 1 && num <= 99)
			info->LevelNum = num;
	}
	else if (mn[0] == 'e' && mn[1] >= '0' && mn[1] <= '9' &&
		mn[2] == 'm' && mn[3] >= '0' && mn[3] <= '9')
	{
		info->LevelNum = (mn[1] - '1') * 10 + (mn[3] - '0');
	}

	ParseMapCommon(sc, info, HexenMode);

	//	Avoid duplicate levelnums, later one takes precedance.
	for (int i = 0; i < MapInfo.Num(); i++)
	{
		if (MapInfo[i].LevelNum == info->LevelNum &&
			&MapInfo[i] != info)
		{
			MapInfo[i].LevelNum = 0;
		}
	}
	unguard;
}
Example #7
0
static void ParseMapCommon(VScriptParser* sc, mapInfo_t* info, bool& HexenMode)
{
	guard(ParseMapCommon);
	// Process optional tokens
	while (1)
	{
		if (sc->Check("levelnum"))
		{
			sc->ExpectNumber();
			info->LevelNum = sc->Number;
		}
		else if (sc->Check("cluster"))
		{
			sc->ExpectNumber();
			info->Cluster = sc->Number;
			if (P_GetClusterDef(info->Cluster) == &DefaultClusterDef)
			{
				//	Add empty cluster def if it doesn't exist yet.
				VClusterDef& C = ClusterDefs.Alloc();
				C.Cluster = info->Cluster;
				C.Flags = 0;
				C.EnterText = VStr();
				C.ExitText = VStr();
				C.Flat = NAME_None;
				C.Music = NAME_None;
				C.CDTrack = 0;
				C.CDId = 0;
				if (HexenMode)
				{
					C.Flags |= CLUSTERF_Hub;
				}
			}
		}
		else if (sc->Check("warptrans"))
		{
			sc->ExpectNumber();
			info->WarpTrans = sc->Number;
		}
		else if (sc->Check("next"))
		{
			info->NextMap = ParseNextMapName(sc, HexenMode);
		}
		else if (sc->Check("secret") || sc->Check("secretnext"))
		{
			info->SecretMap = ParseNextMapName(sc, HexenMode);
		}
		else if (sc->Check("sky1"))
		{
			sc->ExpectName8();
			info->Sky1Texture = GTextureManager.NumForName(
				sc->Name8, TEXTYPE_Wall, true, false);
			sc->ExpectFloat();
			if (HexenMode)
			{
				sc->Float /= 256.0;
			}
			info->Sky1ScrollDelta = sc->Float * 35.0;
		}
		else if (sc->Check("sky2"))
		{
			sc->ExpectName8();
			info->Sky2Texture = GTextureManager.NumForName(
				sc->Name8, TEXTYPE_Wall, true, false);
			sc->ExpectFloat();
			if (HexenMode)
			{
				sc->Float /= 256.0;
			}
			info->Sky2ScrollDelta = sc->Float * 35.0;
		}
		else if (sc->Check("skybox"))
		{
			sc->ExpectString();
			info->SkyBox = *sc->String;
		}
		else if (sc->Check("doublesky"))
		{
			info->Flags |= MAPINFOF_DoubleSky;
		}
		else if (sc->Check("lightning"))
		{
			info->Flags |= MAPINFOF_Lightning;
		}
		else if (sc->Check("forcenoskystretch"))
		{
			info->Flags |= MAPINFOF_ForceNoSkyStretch;
		}
		else if (sc->Check("fadetable"))
		{
			sc->ExpectName8();
			info->FadeTable = sc->Name8;
		}
		else if (sc->Check("fade"))
		{
			sc->ExpectString();
			info->Fade = M_ParseColour(sc->String);
		}
		else if (sc->Check("outsidefog"))
		{
			sc->ExpectString();
			info->OutsideFog = M_ParseColour(sc->String);
		}
		else if (sc->Check("music"))
		{
			sc->ExpectName8();
			info->SongLump = sc->Name8;
		}
		else if (sc->Check("cdtrack"))
		{
			sc->ExpectNumber();
			info->CDTrack = sc->Number;
		}
		else if (sc->Check("gravity"))
		{
			sc->ExpectNumber();
			info->Gravity = (float)sc->Number;
		}
		else if (sc->Check("aircontrol"))
		{
			sc->ExpectFloat();
			info->AirControl = sc->Float;
		}
		else if (sc->Check("map07special"))
		{
			info->Flags |= MAPINFOF_Map07Special;
		}
		else if (sc->Check("baronspecial"))
		{
			info->Flags |= MAPINFOF_BaronSpecial;
		}
		else if (sc->Check("cyberdemonspecial"))
		{
			info->Flags |= MAPINFOF_CyberDemonSpecial;
		}
		else if (sc->Check("spidermastermindspecial"))
		{
			info->Flags |= MAPINFOF_SpiderMastermindSpecial;
		}
		else if (sc->Check("minotaurspecial"))
		{
			info->Flags |= MAPINFOF_MinotaurSpecial;
		}
		else if (sc->Check("dsparilspecial"))
		{
			info->Flags |= MAPINFOF_DSparilSpecial;
		}
		else if (sc->Check("ironlichspecial"))
		{
			info->Flags |= MAPINFOF_IronLichSpecial;
		}
		else if (sc->Check("specialaction_exitlevel"))
		{
			info->Flags &= ~(MAPINFOF_SpecialActionOpenDoor |
				MAPINFOF_SpecialActionLowerFloor);
		}
		else if (sc->Check("specialaction_opendoor"))
		{
			info->Flags &= ~MAPINFOF_SpecialActionLowerFloor;
			info->Flags |= MAPINFOF_SpecialActionOpenDoor;
		}
		else if (sc->Check("specialaction_lowerfloor"))
		{
			info->Flags |= MAPINFOF_SpecialActionLowerFloor;
			info->Flags &= ~MAPINFOF_SpecialActionOpenDoor;
		}
		else if (sc->Check("specialaction_killmonsters"))
		{
			info->Flags |= MAPINFOF_SpecialActionKillMonsters;
		}
		else if (sc->Check("intermission"))
		{
			info->Flags &= ~MAPINFOF_NoIntermission;
		}
		else if (sc->Check("nointermission"))
		{
			info->Flags |= MAPINFOF_NoIntermission;
		}
		else if (sc->Check("titlepatch"))
		{
			sc->ExpectName8();
			info->TitlePatch = sc->Name8;
		}
		else if (sc->Check("par"))
		{
			sc->ExpectNumber();
			info->ParTime = sc->Number;
		}
		else if (sc->Check("sucktime"))
		{
			sc->ExpectNumber();
			info->SuckTime = sc->Number;
		}
		else if (sc->Check("nosoundclipping"))
		{
			//	Ignored
		}
		else if (sc->Check("allowmonstertelefrags"))
		{
			info->Flags |= MAPINFOF_AllowMonsterTelefrags;
		}
		else if (sc->Check("noallies"))
		{
			info->Flags |= MAPINFOF_NoAllies;
		}
		else if (sc->Check("fallingdamage"))
		{
			info->Flags &= ~(MAPINFOF_OldFallingDamage |
				MAPINFOF_StrifeFallingDamage);
			info->Flags |= MAPINFOF_FallingDamage;
		}
		else if (sc->Check("oldfallingdamage") ||
			sc->Check("forcefallingdamage"))
		{
			info->Flags &= ~(MAPINFOF_FallingDamage |
				MAPINFOF_StrifeFallingDamage);
			info->Flags |= MAPINFOF_OldFallingDamage;
		}
		else if (sc->Check("strifefallingdamage"))
		{
			info->Flags &= ~(MAPINFOF_OldFallingDamage |
				MAPINFOF_FallingDamage);
			info->Flags |= MAPINFOF_StrifeFallingDamage;
		}
		else if (sc->Check("nofallingdamage"))
		{
			info->Flags &= ~(MAPINFOF_OldFallingDamage |
				MAPINFOF_StrifeFallingDamage | MAPINFOF_FallingDamage);
		}
		else if (sc->Check("monsterfallingdamage"))
		{
			info->Flags |= MAPINFOF_MonsterFallingDamage;
		}
		else if (sc->Check("nomonsterfallingdamage"))
		{
			info->Flags &= ~MAPINFOF_MonsterFallingDamage;
		}
		else if (sc->Check("deathslideshow"))
		{
			info->Flags |= MAPINFOF_DeathSlideShow;
		}
		else if (sc->Check("allowfreelook"))
		{
			info->Flags &= ~MAPINFOF_NoFreelook;
		}
		else if (sc->Check("nofreelook"))
		{
			info->Flags |= MAPINFOF_NoFreelook;
		}
		else if (sc->Check("allowjump"))
		{
			info->Flags &= ~MAPINFOF_NoJump;
		}
		else if (sc->Check("nojump"))
		{
			info->Flags |= MAPINFOF_NoJump;
		}
		else if (sc->Check("noautosequences"))
		{
			info->Flags |= MAPINFOF_NoAutoSndSeq;
		}
		else if (sc->Check("activateowndeathspecials"))
		{
			info->Flags |= MAPINFOF_ActivateOwnSpecial;
		}
		else if (sc->Check("killeractivatesdeathspecials"))
		{
			info->Flags &= ~MAPINFOF_ActivateOwnSpecial;
		}
		else if (sc->Check("missilesactivateimpactlines"))
		{
			info->Flags |= MAPINFOF_MissilesActivateImpact;
		}
		else if (sc->Check("missileshootersactivetimpactlines"))
		{
			info->Flags &= ~MAPINFOF_MissilesActivateImpact;
		}
		else if (sc->Check("filterstarts"))
		{
			info->Flags |= MAPINFOF_FilterStarts;
		}
		else if (sc->Check("infiniteflightpowerup"))
		{
			info->Flags |= MAPINFOF_InfiniteFlightPowerup;
		}
		else if (sc->Check("noinfiniteflightpowerup"))
		{
			info->Flags &= ~MAPINFOF_InfiniteFlightPowerup;
		}
		else if (sc->Check("clipmidtextures"))
		{
			info->Flags |= MAPINFOF_ClipMidTex;
		}
		else if (sc->Check("wrapmidtextures"))
		{
			info->Flags |= MAPINFOF_WrapMidTex;
		}
		else if (sc->Check("keepfullinventory"))
		{
			info->Flags |= MAPINFOF_KeepFullInventory;
		}
		else if (sc->Check("compat_shorttex"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatShortTex);
		}
		else if (sc->Check("compat_stairs"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatStairs);
		}
		else if (sc->Check("compat_limitpain"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatLimitPain);
		}
		else if (sc->Check("compat_nopassover"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatNoPassOver);
		}
		else if (sc->Check("compat_notossdrops"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatNoTossDrops);
		}
		else if (sc->Check("compat_useblocking"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatUseBlocking);
		}
		else if (sc->Check("compat_nodoorlight"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatNoDoorLight);
		}
		else if (sc->Check("compat_ravenscroll"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatRavenScroll);
		}
		else if (sc->Check("compat_soundtarget"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatSoundTarget);
		}
		else if (sc->Check("compat_dehhealth"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatDehHealth);
		}
		else if (sc->Check("compat_trace"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatTrace);
		}
		else if (sc->Check("compat_dropoff"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatDropOff);
		}
		else if (sc->Check("compat_boomscroll") ||
			sc->Check("additive_scrollers"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatBoomScroll);
		}
		else if (sc->Check("compat_invisibility"))
		{
			DoCompatFlag(sc, info, MAPINFOF2_CompatInvisibility);
		}
		else if (sc->Check("evenlighting"))
		{
			info->HorizWallShade = 0;
			info->VertWallShade = 0;
		}
		else if (sc->Check("vertwallshade"))
		{
			sc->ExpectNumber();
			info->VertWallShade = MID(-128, sc->Number, 127);
		}
		else if (sc->Check("horizwallshade"))
		{
			sc->ExpectNumber();
			info->HorizWallShade = MID(-128, sc->Number, 127);
		}
		else if (sc->Check("noinfighting"))
		{
			info->Infighting = -1;
		}
		else if (sc->Check("normalinfighting"))
		{
			info->Infighting = 0;
		}
		else if (sc->Check("totalinfighting"))
		{
			info->Infighting = 1;
		}
		else if (sc->Check("specialaction"))
		{
			VMapSpecialAction& A = info->SpecialActions.Alloc();
			sc->SetCMode(true);
			sc->ExpectString();
			A.TypeName = *sc->String.ToLower();
			sc->Expect(",");
			sc->ExpectString();
			A.Special = 0;
			for (int i = 0; i < LineSpecialInfos.Num(); i++)
			{
				if (!LineSpecialInfos[i].Name.ICmp(sc->String))
				{
					A.Special = LineSpecialInfos[i].Number;
					break;
				}
			}
			if (!A.Special)
			{
				GCon->Logf("Unknown action special %s", *sc->String);
			}
			memset(A.Args, 0, sizeof(A.Args));
			for (int i = 0; i < 5 && sc->Check(","); i++)
			{
				sc->ExpectNumber();
				A.Args[i] = sc->Number;
			}
			sc->SetCMode(false);
		}
		else if (sc->Check("redirect"))
		{
			sc->ExpectString();
			info->RedirectType = *sc->String.ToLower();
			info->RedirectMap = ParseNextMapName(sc, HexenMode);
		}
		else if (sc->Check("strictmonsteractivation"))
		{
			info->Flags2 &= ~MAPINFOF2_LaxMonsterActivation;
			info->Flags2 |= MAPINFOF2_HaveMonsterActivation;
		}
		else if (sc->Check("laxmonsteractivation"))
		{
			info->Flags2 |= MAPINFOF2_LaxMonsterActivation;
			info->Flags2 |= MAPINFOF2_HaveMonsterActivation;
		}
		else if (sc->Check("interpic") || sc->Check("exitpic"))
		{
			sc->ExpectName8();
			info->ExitPic = *sc->String.ToLower();
		}
		else if (sc->Check("enterpic"))
		{
			sc->ExpectName8();
			info->EnterPic = *sc->String.ToLower();
		}
		else if (sc->Check("intermusic"))
		{
			sc->ExpectString();
			info->InterMusic = *sc->String.ToLower();
		}
		else if (sc->Check("cd_start_track"))
		{
			sc->ExpectNumber();
			cd_NonLevelTracks[CD_STARTTRACK] = sc->Number;
		}
		else if (sc->Check("cd_end1_track"))
		{
			sc->ExpectNumber();
			cd_NonLevelTracks[CD_END1TRACK] = sc->Number;
		}
		else if (sc->Check("cd_end2_track"))
		{
			sc->ExpectNumber();
			cd_NonLevelTracks[CD_END2TRACK] = sc->Number;
		}
		else if (sc->Check("cd_end3_track"))
		{
			sc->ExpectNumber();
			cd_NonLevelTracks[CD_END3TRACK] = sc->Number;
		}
		else if (sc->Check("cd_intermission_track"))
		{
			sc->ExpectNumber();
			cd_NonLevelTracks[CD_INTERTRACK] = sc->Number;
		}
		else if (sc->Check("cd_title_track"))
		{
			sc->ExpectNumber();
			cd_NonLevelTracks[CD_TITLETRACK] = sc->Number;
		}
		//	These are stubs for now.
		else if (sc->Check("cdid"))
		{
			GCon->Logf("Unimplemented MAPINFO comand cdid");
			sc->ExpectString();
		}
		else if (sc->Check("noinventorybar"))
		{
			GCon->Logf("Unimplemented MAPINFO comand noinventorybar");
		}
		else if (sc->Check("airsupply"))
		{
			GCon->Logf("Unimplemented MAPINFO comand airsupply");
			sc->ExpectNumber();
		}
		else if (sc->Check("sndseq"))
		{
			GCon->Logf("Unimplemented MAPINFO comand sndseq");
			sc->ExpectName8();
		}
		else if (sc->Check("sndinfo"))
		{
			GCon->Logf("Unimplemented MAPINFO comand sndinfo");
			sc->ExpectName8();
		}
		else if (sc->Check("soundinfo"))
		{
			GCon->Logf("Unimplemented MAPINFO comand soundinfo");
			sc->ExpectName8();
		}
		else if (sc->Check("allowcrouch"))
		{
			GCon->Logf("Unimplemented MAPINFO comand allowcrouch");
		}
		else if (sc->Check("nocrouch"))
		{
			GCon->Logf("Unimplemented MAPINFO comand nocrouch");
		}
		else if (sc->Check("pausemusicinmenus"))
		{
			GCon->Logf("Unimplemented MAPINFO comand pausemusicinmenus");
		}
		else if (sc->Check("bordertexture"))
		{
			GCon->Logf("Unimplemented MAPINFO comand bordertexture");
			sc->ExpectName8();
		}
		else if (sc->Check("f1"))
		{
			GCon->Logf("Unimplemented MAPINFO comand f1");
			sc->ExpectString();
		}
		else if (sc->Check("allowrespawn"))
		{
			GCon->Logf("Unimplemented MAPINFO comand allowrespawn");
		}
		else if (sc->Check("teamdamage"))
		{
			GCon->Logf("Unimplemented MAPINFO comand teamdamage");
			sc->ExpectFloat();
		}
		else if (sc->Check("fogdensity"))
		{
			GCon->Logf("Unimplemented MAPINFO comand fogdensity");
			sc->ExpectNumber();
		}
		else if (sc->Check("outsidefogdensity"))
		{
			GCon->Logf("Unimplemented MAPINFO comand outsidefogdensity");
			sc->ExpectNumber();
		}
		else if (sc->Check("skyfog"))
		{
			GCon->Logf("Unimplemented MAPINFO comand skyfog");
			sc->ExpectNumber();
		}
		else if (sc->Check("teamplayon"))
		{
			GCon->Logf("Unimplemented MAPINFO comand teamplayon");
		}
		else if (sc->Check("teamplayoff"))
		{
			GCon->Logf("Unimplemented MAPINFO comand teamplayoff");
		}
		else if (sc->Check("checkswitchrange"))
		{
			GCon->Logf("Unimplemented MAPINFO comand checkswitchrange");
		}
		else if (sc->Check("nocheckswitchrange"))
		{
			GCon->Logf("Unimplemented MAPINFO comand nocheckswitchrange");
		}
		else if (sc->Check("translator"))
		{
			GCon->Logf("Unimplemented MAPINFO comand translator");
			sc->ExpectString();
		}
		else if (sc->Check("unfreezesingleplayerconversations"))
		{
			GCon->Logf("Unimplemented MAPINFO comand unfreezesingleplayerconversations");
		}
		else
		{
			break;
		}
	}

	//	Second sky defaults to first sky
	if (info->Sky2Texture == GTextureManager.DefaultTexture)
	{
		info->Sky2Texture = info->Sky1Texture;
	}

	if (info->Flags & MAPINFOF_DoubleSky)
	{
		GTextureManager.SetFrontSkyLayer(info->Sky1Texture);
	}
	unguard;
}
Example #8
0
static void ParseSkillDef(VScriptParser* sc)
{
	guard(ParseSkillDef);
	VSkillDef* SDef = NULL;
	sc->ExpectString();

	//	Check for replaced skill.
	for (int i = 0; i < SkillDefs.Num(); i++)
	{
		if (!sc->String.ICmp(SkillDefs[i].Name))
		{
			SDef = &SkillDefs[i];
			break;
		}
	}
	if (!SDef)
	{
		SDef = &SkillDefs.Alloc();
		SDef->Name = sc->String;
	}

	//	Set defaults.
	SDef->AmmoFactor = 1.0;
	SDef->DoubleAmmoFactor = 2.0;
	SDef->DamageFactor = 1.0;
	SDef->RespawnTime = 0.0;
	SDef->RespawnLimit = 0;
	SDef->Aggressiveness = 1.0;
	SDef->SpawnFilter = 0;
	SDef->AcsReturn = SkillDefs.Num() - 1;
	SDef->MenuName.Clean();
	SDef->PlayerClassNames.Clear();
	SDef->ConfirmationText.Clean();
	SDef->Key.Clean();
	SDef->TextColour.Clean();
	SDef->Flags = 0;

	while (1)
	{
		if (sc->Check("AmmoFactor"))
		{
			sc->ExpectFloat();
			SDef->AmmoFactor = sc->Float;
		}
		else if (sc->Check("DoubleAmmoFactor"))
		{
			sc->ExpectFloat();
			SDef->DoubleAmmoFactor = sc->Float;
		}
		else if (sc->Check("DamageFactor"))
		{
			sc->ExpectFloat();
			SDef->DamageFactor = sc->Float;
		}
		else if (sc->Check("FastMonsters"))
		{
			SDef->Flags |= SKILLF_FastMonsters;
		}
		else if (sc->Check("DisableCheats"))
		{
			SDef->Flags |= SKILLF_DisableCheats;
		}
		else if (sc->Check("EasyBossBrain"))
		{
			SDef->Flags |= SKILLF_EasyBossBrain;
		}
		else if (sc->Check("AutoUseHealth"))
		{
			SDef->Flags |= SKILLF_AutoUseHealth;
		}
		else if (sc->Check("RespawnTime"))
		{
			sc->ExpectFloat();
			SDef->RespawnTime = sc->Float;
		}
		else if (sc->Check("RespawnLimit"))
		{
			sc->ExpectNumber();
			SDef->RespawnLimit = sc->Number;
		}
		else if (sc->Check("Aggressiveness"))
		{
			sc->ExpectFloat();
			SDef->Aggressiveness = 1.0 - MID(0.0, sc->Float, 1.0);
		}
		else if (sc->Check("SpawnFilter"))
		{
			if (sc->CheckNumber())
			{
				if (sc->Number > 0)
				{
					SDef->SpawnFilter = 1 << (sc->Number - 1);
				}
			}
			else
			{
				if (sc->Check("Baby"))
				{
					SDef->SpawnFilter = 1;
				}
				else if (sc->Check("Easy"))
				{
					SDef->SpawnFilter = 2;
				}
				else if (sc->Check("Normal"))
				{
					SDef->SpawnFilter = 4;
				}
				else if (sc->Check("Hard"))
				{
					SDef->SpawnFilter = 8;
				}
				else if (sc->Check("Nightmare"))
				{
					SDef->SpawnFilter = 16;
				}
				else
				{
					sc->ExpectString();
				}
			}
		}
		else if (sc->Check("ACSReturn"))
		{
			sc->ExpectNumber();
			SDef->AcsReturn = sc->Number;
		}
		else if (sc->Check("Name"))
		{
			sc->ExpectString();
			SDef->MenuName = sc->String;
			SDef->Flags &= ~SKILLF_MenuNameIsPic;
		}
		else if (sc->Check("PlayerClassName"))
		{
			VSkillPlayerClassName& CN = SDef->PlayerClassNames.Alloc();
			sc->ExpectString();
			CN.ClassName = sc->String;
			sc->ExpectString();
			CN.MenuName = sc->String;
		}
		else if (sc->Check("PicName"))
		{
			sc->ExpectString();
			SDef->MenuName = sc->String.ToLower();
			SDef->Flags |= SKILLF_MenuNameIsPic;
		}
		else if (sc->Check("MustConfirm"))
		{
			SDef->Flags |= SKILLF_MustConfirm;
			if (sc->CheckQuotedString())
			{
				SDef->ConfirmationText = sc->String;
			}
		}
		else if (sc->Check("Key"))
		{
			sc->ExpectString();
			SDef->Key = sc->String;
		}
		else if (sc->Check("TextColor"))
		{
			sc->ExpectString();
			SDef->TextColour = sc->String;
		}
		else
		{
			break;
		}
	}
	unguard;
}
Example #9
0
static void ParseEpisodeDef(VScriptParser* sc)
{
	guard(ParseEpisodeDef);
	VEpisodeDef* EDef = NULL;
	int EIdx = 0;
	sc->ExpectName8();

	//	Check for replaced episode.
	for (int i = 0; i < EpisodeDefs.Num(); i++)
	{
		if (sc->Name8 == EpisodeDefs[i].Name)
		{
			EDef = &EpisodeDefs[i];
			EIdx = i;
			break;
		}
	}
	if (!EDef)
	{
		EDef = &EpisodeDefs.Alloc();
		EIdx = EpisodeDefs.Num() - 1;
	}

	//	Check for removal of an episode.
	if (sc->Check("remove"))
	{
		EpisodeDefs.RemoveIndex(EIdx);
		return;
	}

	//	Set defaults.
	EDef->Name = sc->Name8;
	EDef->TeaserName = NAME_None;
	EDef->Text = VStr();
	EDef->PicName = NAME_None;
	EDef->Flags = 0;
	EDef->Key = VStr();

	if (sc->Check("teaser"))
	{
		sc->ExpectName8();
		EDef->TeaserName = sc->Name8;
	}

	while (1)
	{
		if (sc->Check("name"))
		{
			if (sc->Check("lookup"))
			{
				EDef->Flags |= EPISODEF_LookupText;
				sc->ExpectString();
				EDef->Text = sc->String.ToLower();
			}
			else
			{
				EDef->Flags &= ~EPISODEF_LookupText;
				sc->ExpectString();
				EDef->Text = sc->String;
			}
		}
		else if (sc->Check("picname"))
		{
			sc->ExpectName8();
			EDef->PicName = sc->Name8;
		}
		else if (sc->Check("key"))
		{
			sc->ExpectString();
			EDef->Key = sc->String.ToLower();
		}
		else if (sc->Check("noskillmenu"))
		{
			EDef->Flags |= EPISODEF_NoSkillMenu;
		}
		else if (sc->Check("optional"))
		{
			EDef->Flags |= EPISODEF_Optional;
		}
		else
		{
			break;
		}
	}
	unguard;
}
Example #10
0
static void ParseClusterDef(VScriptParser* sc)
{
	guard(ParseClusterDef);
	VClusterDef* CDef = NULL;
	sc->ExpectNumber();

	//	Check for replaced cluster def.
	for (int i = 0; i < ClusterDefs.Num(); i++)
	{
		if (sc->Number == ClusterDefs[i].Cluster)
		{
			CDef = &ClusterDefs[i];
			break;
		}
	}
	if (!CDef)
	{
		CDef = &ClusterDefs.Alloc();
	}

	//	Set defaults.
	CDef->Cluster = sc->Number;
	CDef->Flags = 0;
	CDef->EnterText = VStr();
	CDef->ExitText = VStr();
	CDef->Flat = NAME_None;
	CDef->Music = NAME_None;
	CDef->CDTrack = 0;
	CDef->CDId = 0;

	while (1)
	{
		if (sc->Check("hub"))
		{
			CDef->Flags |= CLUSTERF_Hub;
		}
		else if (sc->Check("entertext"))
		{
			if (sc->Check("lookup"))
			{
				CDef->Flags |= CLUSTERF_LookupEnterText;
				sc->ExpectString();
				CDef->EnterText = sc->String.ToLower();
			}
			else
			{
				CDef->Flags &= ~CLUSTERF_LookupEnterText;
				sc->ExpectString();
				CDef->EnterText = sc->String;
			}
		}
		else if (sc->Check("entertextislump"))
		{
			CDef->Flags |= CLUSTERF_EnterTextIsLump;
		}
		else if (sc->Check("exittext"))
		{
			if (sc->Check("lookup"))
			{
				CDef->Flags |= CLUSTERF_LookupExitText;
				sc->ExpectString();
				CDef->ExitText = sc->String.ToLower();
			}
			else
			{
				CDef->Flags &= ~CLUSTERF_LookupExitText;
				sc->ExpectString();
				CDef->ExitText = sc->String;
			}
		}
		else if (sc->Check("exittextislump"))
		{
			CDef->Flags |= CLUSTERF_ExitTextIsLump;
		}
		else if (sc->Check("flat"))
		{
			sc->ExpectName8();
			CDef->Flat = sc->Name8;
			CDef->Flags &= ~CLUSTERF_FinalePic;
		}
		else if (sc->Check("pic"))
		{
			sc->ExpectName8();
			CDef->Flat = sc->Name8;
			CDef->Flags |= CLUSTERF_FinalePic;
		}
		else if (sc->Check("music"))
		{
			sc->ExpectName8();
			CDef->Music = sc->Name8;
		}
		else if (sc->Check("cdtrack"))
		{
			sc->ExpectNumber();
			CDef->CDTrack = sc->Number;
		}
		else if (sc->Check("cdid"))
		{
			sc->ExpectNumber();
			CDef->CDId = sc->Number;
		}
		else if (sc->Check("name"))
		{
			sc->Check("lookup");
			sc->ExpectString();
			GCon->Logf("Unimplemented MAPINFO cluster comand name");
		}
		else
		{
			break;
		}
	}

	//	Make sure text lump names are in lower case.
	if (CDef->Flags & CLUSTERF_EnterTextIsLump)
	{
		CDef->EnterText = CDef->EnterText.ToLower();
	}
	if (CDef->Flags & CLUSTERF_ExitTextIsLump)
	{
		CDef->ExitText = CDef->ExitText.ToLower();
	}
	unguard;
}