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

📄 pr_edict.c

📁 quake1 dos源代码最新版本
💻 C
📖 第 1 页 / 共 3 页
字号:
			break;
		if (com_token[0] != '{')
			Sys_Error ("ED_LoadFromFile: found %s when expecting {",com_token);

		if (!ent)
			ent = EDICT_NUM(0);
		else
			ent = ED_Alloc ();
		data = ED_ParseEdict (data, ent);

// remove things from different skill levels or deathmatch
		if (deathmatch->value)
		{
			if (((int)ent->v.spawnflags & SPAWNFLAG_NOT_DEATHMATCH))
			{
				ED_Free (ent);
				inhibit++;
				continue;
			}
		}
		else if ((current_skill == 0 && ((int)ent->v.spawnflags & SPAWNFLAG_NOT_EASY))
				|| (current_skill == 1 && ((int)ent->v.spawnflags & SPAWNFLAG_NOT_MEDIUM))
				|| (current_skill >= 2 && ((int)ent->v.spawnflags & SPAWNFLAG_NOT_HARD)) )
		{
			ED_Free (ent);
			inhibit++;
			continue;
		}

//
// immediately call spawn function
//
		if (!ent->v.classname)
		{
			Con_Printf ("No classname for:\n");
			ED_Print (ent);
			ED_Free (ent);
			continue;
		}

	// look for the spawn function
		func = ED_FindFunction ( pr_strings + ent->v.classname );

		if (!func)
		{
			Con_Printf ("No spawn function for:\n");
			ED_Print (ent);
			ED_Free (ent);
			continue;
		}

		pr_global_struct->self = EDICT_TO_PROG(ent);
		PR_ExecuteProgram (func - pr_functions);
	}

	Con_DPrintf ("%i entities inhibited\n", inhibit);
}

qboolean	keep_compatibility;	// 1999-10-28 Compatibilty check by Maddes

/*
===============
PR_LoadProgs
===============
*/
void PR_LoadProgs (void)
{
	int		i;
	dfunction_t	*f;	// 2000-01-02 EndFrame function by Maddes/FrikaC
	loadedfile_t	*fileinfo;	// 2001-09-12 Returning information about loaded file by Maddes
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  start
	int 	j;
	int		funcno;
	char	*funcname;
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  end
	etype_t	type;	// 2001-10-20 TIMESCALE extension by Tomaz/Maddes

// flush the non-C variable lookup cache
	for (i=0 ; i<GEFV_CACHESIZE ; i++)
		gefvCache[i].field[0] = 0;

	CRC_Init (&pr_crc);

// 2001-09-12 Returning information about loaded file by Maddes  start
/*
	progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat");
	if (!progs)
*/
	fileinfo = COM_LoadHunkFile ("progs.dat");
	if (!fileinfo)
// 2001-09-12 Returning information about loaded file by Maddes  end
		Sys_Error ("PR_LoadProgs: couldn't load progs.dat");
	progs = (dprograms_t *)fileinfo->data;	// 2001-09-12 Returning information about loaded file by Maddes
	Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024);

	for (i=0 ; i<com_filesize ; i++)
		CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]);

// byte swap the header
	for (i=0 ; i<sizeof(*progs)/4 ; i++)
		((int *)progs)[i] = LittleLong ( ((int *)progs)[i] );

	if (progs->version != PROG_VERSION)
		Sys_Error ("progs.dat has wrong version number (%i should be %i)", progs->version, PROG_VERSION);
// 1999-10-28 Compatibilty check by Maddes  start
//	if (progs->crc != PROGHEADER_CRC)
	if (progs->crc == PROGHEADER101_CRC)
	{
		keep_compatibility = true;
		Con_DPrintf ("Old progs.dat found, compatibility turned on.\n");
	}
	else if (progs->crc == PROGHEADER_CRC)
//		|| (progs->crc == PROGHEADER107_CRC)
	{
		keep_compatibility = false;
		Con_DPrintf ("Enhanced progs.dat found, CRC is %i.\n", progs->crc);
	}
	else
// 1999-10-28 Compatibilty check by Maddes  end
		Sys_Error ("progs.dat system vars have been modified, progdefs.h is out of date");

	pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions);
	pr_strings = (char *)progs + progs->ofs_strings;
	pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs);
	pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs);
	pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements);

	pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals);
	pr_globals = (float *)pr_global_struct;

	pr_edict_size = progs->entityfields * 4 + sizeof (edict_t) - sizeof(entvars_t);

// byte swap the lumps
	for (i=0 ; i<progs->numstatements ; i++)
	{
		pr_statements[i].op = LittleShort(pr_statements[i].op);
		pr_statements[i].a = LittleShort(pr_statements[i].a);
		pr_statements[i].b = LittleShort(pr_statements[i].b);
		pr_statements[i].c = LittleShort(pr_statements[i].c);
	}

// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  start
	// initialize function numbers for PROGS.DAT
	pr_numbuiltins = 0;
	pr_builtins = NULL;
	if (pr_builtin_remap->value)
	{
		// remove all previous assigned function numbers
		for ( j=1 ; j < pr_ebfs_numbuiltins; j++)
		{
			pr_ebfs_builtins[j].funcno = 0;
		}
	}
	else
	{
		// use default function numbers
		for ( j=1 ; j < pr_ebfs_numbuiltins; j++)
		{
			pr_ebfs_builtins[j].funcno = pr_ebfs_builtins[j].default_funcno;
			// determine highest builtin number (when NOT remapped)
			if (pr_ebfs_builtins[j].funcno > pr_numbuiltins)
			{
				pr_numbuiltins = pr_ebfs_builtins[j].funcno;
			}
		}
	}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  end

	for (i=0 ; i<progs->numfunctions; i++)
	{
	pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement);
	pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start);
	pr_functions[i].s_name = LittleLong (pr_functions[i].s_name);
	pr_functions[i].s_file = LittleLong (pr_functions[i].s_file);
	pr_functions[i].numparms = LittleLong (pr_functions[i].numparms);
	pr_functions[i].locals = LittleLong (pr_functions[i].locals);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  start
		if (pr_builtin_remap->value)
		{
			if (pr_functions[i].first_statement < 0)	// builtin function
			{
				funcno = -pr_functions[i].first_statement;
				funcname = pr_strings + pr_functions[i].s_name;

				// search function name
				for ( j=1 ; j < pr_ebfs_numbuiltins ; j++)
				{
					if (!(Q_strcasecmp(funcname, pr_ebfs_builtins[j].funcname)))
					{
						break;	// found
					}
				}

				if (j < pr_ebfs_numbuiltins)	// found
				{
					pr_ebfs_builtins[j].funcno = funcno;
				}
				else
				{
					Con_DPrintf("Can not assign builtin number #%i to %s - function unknown\n", funcno, funcname);
				}
			}
		}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  end
	}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  start
	if (pr_builtin_remap->value)
	{
		// check for unassigned functions and try to assign their default function number
		for ( i=1 ; i < pr_ebfs_numbuiltins; i++)
		{
			if ((!pr_ebfs_builtins[i].funcno) && (pr_ebfs_builtins[i].default_funcno))	// unassigned and has a default number
			{
				// check if default number is already assigned to another function
				for ( j=1 ; j < pr_ebfs_numbuiltins; j++)
				{
					if (pr_ebfs_builtins[j].funcno == pr_ebfs_builtins[i].default_funcno)
					{
						break;	// number already assigned to another builtin function
					}
				}

				if (j < pr_ebfs_numbuiltins)	// already assigned
				{
					Con_DPrintf("Can not assign default builtin number #%i to %s - number is already assigned to %s\n", pr_ebfs_builtins[i].default_funcno, pr_ebfs_builtins[i].funcname, pr_ebfs_builtins[j].funcname);
				}
				else
				{
					pr_ebfs_builtins[i].funcno = pr_ebfs_builtins[i].default_funcno;
				}
			}
			// determine highest builtin number (when remapped)
			if (pr_ebfs_builtins[i].funcno > pr_numbuiltins)
			{
				pr_numbuiltins = pr_ebfs_builtins[i].funcno;
			}
		}
	}
	pr_numbuiltins++;

	// allocate and initialize builtin list for execution time
	pr_builtins = Hunk_AllocName (pr_numbuiltins*sizeof(builtin_t), "builtins");
	for ( i=0 ; i < pr_numbuiltins ; i++)
	{
		pr_builtins[i] = pr_ebfs_builtins[0].function;
	}

	// create builtin list for execution time and set cvars accordingly
	Cvar_Set(pr_builtin_find, "0");
	Cvar_Set(pr_checkextension, "0");	// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)
	for ( j=1 ; j < pr_ebfs_numbuiltins ; j++)
	{
		if (pr_ebfs_builtins[j].funcno)	// only put assigned functions into builtin list
		{
			pr_builtins[pr_ebfs_builtins[j].funcno] = pr_ebfs_builtins[j].function;
		}

		if (pr_ebfs_builtins[j].default_funcno == PR_DEFAULT_FUNCNO_BUILTIN_FIND)
		{
			Cvar_SetValue(pr_builtin_find, pr_ebfs_builtins[j].funcno);
		}

// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)  start
		if (pr_ebfs_builtins[j].default_funcno == PR_DEFAULT_FUNCNO_EXTENSION_FIND)
		{
			Cvar_SetValue(pr_checkextension, pr_ebfs_builtins[j].funcno);
		}
// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)  end
	}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm  end

	for (i=0 ; i<progs->numglobaldefs ; i++)
	{
		pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type);
		pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs);
		pr_globaldefs[i].s_name = LittleLong (pr_globaldefs[i].s_name);
	}

	for (i=0 ; i<progs->numfielddefs ; i++)
	{
		pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type);
		if (pr_fielddefs[i].type & DEF_SAVEGLOBAL)
			Sys_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL");
		pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs);
		pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name);
	}

	for (i=0 ; i<progs->numglobals ; i++)
		((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]);

// 2000-04-30 NVS HANDSHAKE SRV<->CL/QC<->CL by Maddes  start
	// check if the QuakeC code wants to know the NVS versions of the server and clients
	pr_field_nvs_svc = ED_FindField("nvs_svc");
	if (pr_field_nvs_svc)
	{
		type = pr_field_nvs_svc->type;
		type &= ~DEF_SAVEGLOBAL;
		if (type != ev_float)
		{
			pr_field_nvs_svc = NULL;
		}
	}
// 2000-04-30 NVS HANDSHAKE SRV<->CL/QC<->CL by Maddes  ent

// 2001-11-15 Better GetEdictFieldValue performance by LordHavoc/Maddes  start
// search for the definition only once
	pr_field_ammo_shells1 = ED_FindField("ammo_shells1");
	pr_field_ammo_nails1 = ED_FindField("ammo_nails1");
	pr_field_ammo_lava_nails = ED_FindField("ammo_lava_nails");
	pr_field_ammo_rockets1 = ED_FindField("ammo_rockets1");
	pr_field_ammo_multi_rockets = ED_FindField("ammo_multi_rockets");
	pr_field_ammo_cells1 = ED_FindField("ammo_cells1");
	pr_field_ammo_plasma = ED_FindField("ammo_plasma");
	pr_field_idealpitch = ED_FindField("idealpitch");
	pr_field_pitch_speed = ED_FindField("pitch_speed");
	pr_field_items2 = ED_FindField("items2");
	pr_field_gravity = ED_FindField("gravity");
// 2001-11-15 Better GetEdictFieldValue performance by LordHavoc/Maddes  end

// 2000-01-02 EndFrame function by Maddes/FrikaC  start
	pr_func_endframe = 0;

	if ((f = ED_FindFunction ("EndFrame")) != NULL)
	{
		pr_func_endframe = (func_t)(f - pr_functions);
	}
// 2000-01-02 EndFrame function by Maddes/FrikaC  end

// 2001-10-20 TIMESCALE extension by Tomaz/Maddes  start
	pr_global_cpu_frametime = ED_FindGlobal ("cpu_frametime");
	if (pr_global_cpu_frametime)
	{
		type = pr_global_cpu_frametime->type;
		type &= ~DEF_SAVEGLOBAL;
		if (type != ev_float)
		{
			pr_global_cpu_frametime = NULL;
		}
	}

	pr_global_org_frametime = ED_FindGlobal ("org_frametime");
	if (pr_global_org_frametime)
	{
		type = pr_global_org_frametime->type;
		type &= ~DEF_SAVEGLOBAL;
		if (type != ev_float)
		{
			pr_global_org_frametime = NULL;
		}
	}
// 2001-10-20 TIMESCALE extension by Tomaz/Maddes  end
}

// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes  start
/*
=============
PR_BuiltInList_f

For debugging, prints all builtin functions with assigned and default number
=============
*/
void PR_BuiltInList_f (void)
{
	int		i;
	char	*partial;
	int		len;
	int		count;

	if (Cmd_Argc() > 1)
	{
		partial = Cmd_Argv (1);
		len = strlen(partial);
	}
	else
	{
		partial = NULL;
		len = 0;
	}

	count=0;
	for (i=1; i < pr_ebfs_numbuiltins; i++)
	{
		if (partial && Q_strncasecmp (partial, pr_ebfs_builtins[i].funcname, len))
		{
			continue;
		}
		count++;
		Con_Printf ("%i(%i): %s\n", pr_ebfs_builtins[i].funcno, pr_ebfs_builtins[i].default_funcno, pr_ebfs_builtins[i].funcname);
	}

	Con_Printf ("------------\n");
	if (partial)
	{
		Con_Printf ("%i beginning with \"%s\" out of ", count, partial);
	}
	Con_Printf ("%i builtin functions\n", i);
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes  end

// 2001-09-18 New cvar system by Maddes (Init)  start
/*
===============
PR_Init_Cvars
===============
*/
void PR_Init_Cvars (void)
{
	nomonsters = Cvar_Get ("nomonsters", "0", CVAR_ORIGINAL);
	gamecfg = Cvar_Get ("gamecfg", "0", CVAR_ORIGINAL);
	scratch1 = Cvar_Get ("scratch1", "0", CVAR_ORIGINAL);
	scratch2 = Cvar_Get ("scratch2", "0", CVAR_ORIGINAL);
	scratch3 = Cvar_Get ("scratch3", "0", CVAR_ORIGINAL);
	scratch4 = Cvar_Get ("scratch4", "0", CVAR_ORIGINAL);
	savedgamecfg = Cvar_Get ("savedgamecfg", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved1 = Cvar_Get ("saved1", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved2 = Cvar_Get ("saved2", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved3 = Cvar_Get ("saved3", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved4 = Cvar_Get ("saved4", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);

// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes  start
	pr_builtin_find = Cvar_Get ("pr_builtin_find", "0", CVAR_ROM);
	pr_builtin_remap = Cvar_Get ("pr_builtin_remap", "0", CVAR_NONE);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes  end

	pr_checkextension = Cvar_Get ("pr_checkextension", "0", CVAR_ROM);	// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)

// 2001-09-20 QuakeC string zone by Maddes  start
	pr_zone_min_strings = Cvar_Get ("pr_zone_min_strings", "64", CVAR_NONE);
	Cvar_SetRangecheck (pr_zone_min_strings, Cvar_RangecheckInt, 64, 8*1024);	// up to 8MB
	Cvar_SetDescription (pr_zone_min_strings, "States the size in KB of the zone for PROGS.DAT strings. Note that the PROGS.DAT may set this cvar itself.");
	Cvar_Set(pr_zone_min_strings, pr_zone_min_strings->string);	// do rangecheck
// 2001-09-20 QuakeC string zone by Maddes  end
}
// 2001-09-18 New cvar system by Maddes (Init)  end

/*
===============
PR_Init
===============
*/
void PR_Init (void)
{
	Cmd_AddCommand ("edict", ED_PrintEdict_f);
	Cmd_AddCommand ("edicts", ED_PrintEdicts);
	Cmd_AddCommand ("edictcount", ED_Count);
	Cmd_AddCommand ("profile", PR_Profile_f);
	Cmd_AddCommand ("builtinlist", PR_BuiltInList_f);	// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes
	Cmd_AddCommand ("extensionlist", PR_Extension_List_f);	// 2001-10-20 Extension System by LordHavoc/Maddes

// 2001-09-18 New cvar system by Maddes (Init)  start
/*
	nomonsters = Cvar_Get ("nomonsters", "0", CVAR_ORIGINAL);
	gamecfg = Cvar_Get ("gamecfg", "0", CVAR_ORIGINAL);
	scratch1 = Cvar_Get ("scratch1", "0", CVAR_ORIGINAL);
	scratch2 = Cvar_Get ("scratch2", "0", CVAR_ORIGINAL);
	scratch3 = Cvar_Get ("scratch3", "0", CVAR_ORIGINAL);
	scratch4 = Cvar_Get ("scratch4", "0", CVAR_ORIGINAL);
	savedgamecfg = Cvar_Get ("savedgamecfg", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved1 = Cvar_Get ("saved1", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved2 = Cvar_Get ("saved2", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved3 = Cvar_Get ("saved3", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
	saved4 = Cvar_Get ("saved4", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);

// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes  start
	pr_builtin_find = Cvar_Get ("pr_builtin_find", "0", CVAR_ROM);
	pr_builtin_remap = Cvar_Get ("pr_builtin_remap", "0", CVAR_NONE);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes  end

//	pr_checkextension = Cvar_Get ("pr_checkextension", "0", CVAR_ROM);	// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)
*/
// 2001-09-18 New cvar system by Maddes (Init)  end
}



edict_t *EDICT_NUM(int n)
{
	if (n < 0 || n >= sv.max_edicts)
		Sys_Error ("EDICT_NUM: bad number %i", n);
	return (edict_t *)((byte *)sv.edicts+ (n)*pr_edict_size);
}

int NUM_FOR_EDICT(edict_t *e)
{
	int		b;

	b = (byte *)e - (byte *)sv.edicts;
	b = b / pr_edict_size;

	if (b < 0 || b >= sv.num_edicts)
		Sys_Error ("NUM_FOR_EDICT: bad pointer");
	return b;
}

⌨️ 快捷键说明

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