⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sc_man.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
字号:
//**************************************************************************//**//** sc_man.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: sc_man.c,v $//** $Revision: 1.3 $//** $Date: 96/01/06 03:23:43 $//** $Author: bgokey $//**//**************************************************************************// HEADER FILES ------------------------------------------------------------#include <string.h>#include <stdlib.h>#include "h2def.h"// MACROS ------------------------------------------------------------------#define MAX_STRING_SIZE 64#define ASCII_COMMENT (';')#define ASCII_QUOTE (34)#define LUMP_SCRIPT 1#define FILE_ZONE_SCRIPT 2#define FILE_CLIB_SCRIPT 3// TYPES -------------------------------------------------------------------// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------static void CheckOpen(void);static void OpenScript(char *name, int type);// EXTERNAL DATA DECLARATIONS ----------------------------------------------// PUBLIC DATA DEFINITIONS -------------------------------------------------char *sc_String;int sc_Number;int sc_Line;boolean sc_End;boolean sc_Crossed;boolean sc_FileScripts = false;char *sc_ScriptsDir = "";// PRIVATE DATA DEFINITIONS ------------------------------------------------static char ScriptName[16];static char *ScriptBuffer;static char *ScriptPtr;static char *ScriptEndPtr;static char StringBuffer[MAX_STRING_SIZE];static boolean ScriptOpen = false;static boolean ScriptFreeCLib; // true = de-allocate using free()static int ScriptSize;static boolean AlreadyGot = false;// CODE --------------------------------------------------------------------//==========================================================================//// SC_Open////==========================================================================void SC_Open(char *name){	char fileName[128];	if(sc_FileScripts == true)	{		sprintf(fileName, "%s%s.txt", sc_ScriptsDir, name);		SC_OpenFile(fileName);	}	else	{		SC_OpenLump(name);	}}//==========================================================================//// SC_OpenLump//// Loads a script (from the WAD files) and prepares it for parsing.////==========================================================================void SC_OpenLump(char *name){	OpenScript(name, LUMP_SCRIPT);}//==========================================================================//// SC_OpenFile//// Loads a script (from a file) and prepares it for parsing.  Uses the// zone memory allocator for memory allocation and de-allocation.////==========================================================================void SC_OpenFile(char *name){	OpenScript(name, FILE_ZONE_SCRIPT);}//==========================================================================//// SC_OpenFileCLib//// Loads a script (from a file) and prepares it for parsing.  Uses C// library function calls for memory allocation and de-allocation.////==========================================================================void SC_OpenFileCLib(char *name){	OpenScript(name, FILE_CLIB_SCRIPT);}//==========================================================================//// OpenScript////==========================================================================static void OpenScript(char *name, int type){	SC_Close();	if(type == LUMP_SCRIPT)	{ // Lump script		ScriptBuffer = (char *)W_CacheLumpName(name, PU_STATIC);		ScriptSize = W_LumpLength(W_GetNumForName(name));		strcpy(ScriptName, name);		ScriptFreeCLib = false; // De-allocate using Z_Free()	}	else if(type == FILE_ZONE_SCRIPT)	{ // File script - zone		ScriptSize = M_ReadFile(name, (byte **)&ScriptBuffer);		M_ExtractFileBase(name, ScriptName);		ScriptFreeCLib = false; // De-allocate using Z_Free()	}	else	{ // File script - clib		ScriptSize = M_ReadFileCLib(name, (byte **)&ScriptBuffer);		M_ExtractFileBase(name, ScriptName);		ScriptFreeCLib = true; // De-allocate using free()	}	ScriptPtr = ScriptBuffer;	ScriptEndPtr = ScriptPtr+ScriptSize;	sc_Line = 1;	sc_End = false;	ScriptOpen = true;	sc_String = StringBuffer;	AlreadyGot = false;}//==========================================================================//// SC_Close////==========================================================================void SC_Close(void){	if(ScriptOpen)	{		if(ScriptFreeCLib == true)		{			free(ScriptBuffer);		}		else		{			Z_Free(ScriptBuffer);		}		ScriptOpen = false;	}}//==========================================================================//// SC_GetString////==========================================================================boolean SC_GetString(void){	char *text;	boolean foundToken;	CheckOpen();	if(AlreadyGot)	{		AlreadyGot = false;		return true;	}	foundToken = false;	sc_Crossed = false;	if(ScriptPtr >= ScriptEndPtr)	{		sc_End = true;		return false;	}	while(foundToken == false)	{		while(*ScriptPtr <= 32)		{			if(ScriptPtr >= ScriptEndPtr)			{				sc_End = true;				return false;			}			if(*ScriptPtr++ == '\n')			{				sc_Line++;				sc_Crossed = true;			}		}		if(ScriptPtr >= ScriptEndPtr)		{			sc_End = true;			return false;		}		if(*ScriptPtr != ASCII_COMMENT)		{ // Found a token			foundToken = true;		}		else		{ // Skip comment			while(*ScriptPtr++ != '\n')			{				if(ScriptPtr >= ScriptEndPtr)				{					sc_End = true;					return false;	
			}			}			sc_Line++;			sc_Crossed = true;		}	}	text = sc_String;	if(*ScriptPtr == ASCII_QUOTE)	{ // Quoted string		ScriptPtr++;		while(*ScriptPtr != ASCII_QUOTE)		{			*text++ = *ScriptPtr++;			if(ScriptPtr == ScriptEndPtr				|| text == &sc_String[MAX_STRING_SIZE-1])			{				break;			}		}		ScriptPtr++;	}	else	{ // Normal string		while((*ScriptPtr > 32) && (*ScriptPtr != ASCII_COMMENT))		{			*text++ = *ScriptPtr++;			if(ScriptPtr == ScriptEndPtr				|| text == &sc_String[MAX_STRING_SIZE-1])			{				break;			}		}	}	*text = 0;	return true;}//==========================================================================//// SC_MustGetString////==========================================================================void SC_MustGetString(void){	if(SC_GetString() == false)	{		SC_ScriptError("Missing string.");	}}//==========================================================================//// SC_MustGetStringName////==========================================================================void SC_MustGetStringName(char *name){	SC_MustGetString();	if(SC_Compare(name) == false)	{		SC_ScriptError(NULL);	}}//==========================================================================//// SC_GetNumber////==========================================================================boolean SC_GetNumber(void){	char *stopper;	CheckOpen();	if(SC_GetString())	{		sc_Number = strtol(sc_String, &stopper, 0);		if(*stopper != 0)		{			I_Error("SC_GetNumber: Bad numeric constant \"%s\".\n"				"Script %s, Line %d", sc_String, ScriptName, sc_Line);		}		return true;	}	else	{		return false;	}}//==========================================================================//// SC_MustGetNumber////==========================================================================void SC_MustGetNumber(void){	if(SC_GetNumber() == false)	{		SC_ScriptError("Missing integer.");	}}//==========================================================================//// SC_UnGet//// Assumes there is a valid string in sc_String.////==========================================================================void SC_UnGet(void){	AlreadyGot = true;}//==========================================================================//// SC_Check//// Returns true if another token is on the current line.////==========================================================================/*boolean SC_Check(void){	char *text;	CheckOpen();	text = ScriptPtr;	if(text >= ScriptEndPtr)	{		return false;	}	while(*text <= 32)	{		if(*text == '\n')		{			return false;		}		text++;		if(text == ScriptEndPtr)		{			return false;		}	}	if(*text == ASCII_COMMENT)	{		return false;	}	return true;}*///==========================================================================//// SC_MatchString//// Returns the index of the first match to sc_String from the passed// array of strings, or -1 if not found.////==========================================================================int SC_MatchString(char **strings){	int i;	for(i = 0; *strings != NULL; i++)	{		if(SC_Compare(*strings++))		{			return i;		}	}	return -1;}//==========================================================================//// SC_MustMatchString////==========================================================================int SC_MustMatchString(char **strings){	int i;	i = SC_MatchString(strings);	if(i == -1)	{		SC_ScriptError(NULL);	}	return i;}//==========================================================================//// SC_Compare////==========================================================================boolean SC_Compare(char *text){	if(strcasecmp(text, sc_String) == 0)	{		return true;	}	return false;}//==========================================================================//// SC_ScriptError////==========================================================================void SC_ScriptError(char *message){	if(message == NULL)	{		message = "Bad syntax.";	}	I_Error("Script error, \"%s\" line %d: %s", ScriptName,		sc_Line, message);}//==========================================================================//// CheckOpen////==========================================================================static void CheckOpen(void){	if(ScriptOpen == false)	{		I_Error("SC_ call before SC_Open().");	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -