g_spawn.c

来自「著名物理引擎Hawk的源代码」· C语言 代码 · 共 414 行

C
414
字号
/* G_spawn.c, HAWK game engine
 *
 * Copyright 1997-1998 by Phil Frisbie, Jr.
 * for Hawk Software
 *
 */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "G_main.h"
#include "M_player.h"

typedef struct
{
	char	*name;
	void	(*spawn)(entity_t *entity);
} spawn_t;

void SP_item_health(entity_t *entity);
void SP_item_health_small(entity_t *entity);
void SP_item_health_large(entity_t *entity);
void SP_item_health_mega(entity_t *entity);

void SP_info_player_start(entity_t *entity);
void SP_info_player_deathmatch(entity_t *entity);
void SP_info_player_coop(entity_t *entity);
void SP_info_player_intermission(entity_t *entity);

void SP_func_plat(entity_t *entity);
void SP_func_rotating(entity_t *entity);
void SP_func_button(entity_t *entity);
void SP_func_door(entity_t *entity);
void SP_func_door_secret(entity_t *entity);
void SP_func_door_rotating(entity_t *entity);
void SP_func_water(entity_t *entity);
void SP_func_train(entity_t *entity);
void SP_func_conveyor(entity_t *entity);
void SP_func_wall(entity_t *entity);
void SP_func_object(entity_t *entity);
void SP_func_explosive(entity_t *entity);
void SP_func_timer(entity_t *entity);
void SP_func_areaportal(entity_t *entity);
void SP_func_clock(entity_t *entity);
void SP_func_killbox(entity_t *entity);

void SP_trigger_always(entity_t *entity);
void SP_trigger_once(entity_t *entity);
void SP_trigger_multiple(entity_t *entity);
void SP_trigger_relay(entity_t *entity);
void SP_trigger_push(entity_t *entity);
void SP_trigger_hurt(entity_t *entity);
void SP_trigger_key(entity_t *entity);
void SP_trigger_counter(entity_t *entity);
void SP_trigger_elevator(entity_t *entity);
void SP_trigger_gravity(entity_t *entity);
void SP_trigger_monsterjump(entity_t *entity);

void SP_target_temp_entity(entity_t *entity);
void SP_target_speaker(entity_t *entity);
void SP_target_explosion(entity_t *entity);
void SP_target_changelevel(entity_t *entity);
void SP_target_secret(entity_t *entity);
void SP_target_goal(entity_t *entity);
void SP_target_splash(entity_t *entity);
void SP_target_spawner(entity_t *entity);
void SP_target_blaster(entity_t *entity);
void SP_target_crosslevel_trigger(entity_t *entity);
void SP_target_crosslevel_target(entity_t *entity);
void SP_target_laser(entity_t *entity);
void SP_target_help(entity_t *entity);
void SP_target_actor(entity_t *entity);
void SP_target_lightramp(entity_t *entity);
void SP_target_earthquake(entity_t *entity);
void SP_target_character(entity_t *entity);
void SP_target_string(entity_t *entity);

void SP_worldspawn(entity_t *entity);
void SP_viewthing(entity_t *entity);

void SP_light(entity_t *entity);
void SP_light_mine1(entity_t *entity);
void SP_light_mine2(entity_t *entity);
void SP_info_null(entity_t *entity);
void SP_info_notnull(entity_t *entity);
void SP_path_corner(entity_t *entity);
void SP_point_combat(entity_t *entity);

void SP_misc_explobox(entity_t *entity);
void SP_misc_banner(entity_t *entity);
void SP_misc_satellite_dish(entity_t *entity);
void SP_misc_actor(entity_t *entity);
void SP_misc_gib_arm(entity_t *entity);
void SP_misc_gib_leg(entity_t *entity);
void SP_misc_gib_head(entity_t *entity);
void SP_misc_insane(entity_t *entity);
void SP_misc_deadsoldier(entity_t *entity);
void SP_misc_viper(entity_t *entity);
void SP_misc_viper_bomb(entity_t *entity);
void SP_misc_bigviper(entity_t *entity);
void SP_misc_strogg_ship(entity_t *entity);
void SP_misc_teleporter(entity_t *entity);
void SP_misc_teleporter_dest(entity_t *entity);
void SP_misc_blackhole(entity_t *entity);
void SP_misc_eastertank(entity_t *entity);
void SP_misc_easterchick(entity_t *entity);
void SP_misc_easterchick2(entity_t *entity);

void SP_monster_berserk(entity_t *entity);
void SP_monster_gladiator(entity_t *entity);
void SP_monster_gunner(entity_t *entity);
void SP_monster_infantry(entity_t *entity);
void SP_monster_soldier_light(entity_t *entity);
void SP_monster_soldier(entity_t *entity);
void SP_monster_soldier_ss(entity_t *entity);
void SP_monster_tank(entity_t *entity);
void SP_monster_medic(entity_t *entity);
void SP_monster_flipper(entity_t *entity);
void SP_monster_chick(entity_t *entity);
void SP_monster_parasite(entity_t *entity);
void SP_monster_flyer(entity_t *entity);
void SP_monster_brain(entity_t *entity);
void SP_monster_floater(entity_t *entity);
void SP_monster_hover(entity_t *entity);
void SP_monster_mutant(entity_t *entity);
void SP_monster_supertank(entity_t *entity);
void SP_monster_boss2(entity_t *entity);
void SP_monster_jorg(entity_t *entity);
void SP_monster_boss3_stand(entity_t *entity);

void SP_monster_commander_body(entity_t *entity);

void SP_turret_breach(entity_t *entity);
void SP_turret_base(entity_t *entity);
void SP_turret_driver(entity_t *entity);

void SP_item_armor_body(entity_t *entity);
void SP_item_armor_combat(entity_t *entity);
void SP_item_armor_jacket(entity_t *entity);
void SP_item_armor_shard(entity_t *entity);
void SP_item_power_screen(entity_t *entity);
void SP_item_power_shield(entity_t *entity);
void SP_item_quad(entity_t *entity);
void SP_item_invulnerability(entity_t *entity);
void SP_item_silencer(entity_t *entity);
void SP_item_breather(entity_t *entity);
void SP_item_enviro(entity_t *entity);
void SP_item_ancient_head(entity_t *entity);
void SP_item_adrenaline(entity_t *entity);
void SP_item_bandolier(entity_t *entity);
void SP_item_pack(entity_t *entity);

void SP_key_data_cd(entity_t *entity);
void SP_key_power_cube(entity_t *entity);
void SP_key_pyramid(entity_t *entity);
void SP_key_data_spinner(entity_t *entity);
void SP_key_pass(entity_t *entity);
void SP_key_blue_key(entity_t *entity);
void SP_key_red_key(entity_t *entity);
void SP_key_commander_head(entity_t *entity);
void SP_key_airstrike_target(entity_t *entity);

void SP_weapon_blaster(entity_t *entity);
void SP_weapon_shotgun(entity_t *entity);
void SP_weapon_supershotgun(entity_t *entity);
void SP_weapon_machinegun(entity_t *entity);
void SP_weapon_chaingun(entity_t *entity);
void SP_weapon_grenadelauncher(entity_t *entity);
void SP_weapon_rocketlauncher(entity_t *entity);
void SP_weapon_hyperblaster(entity_t *entity);
void SP_weapon_railgun(entity_t *entity);
void SP_weapon_bfg(entity_t *entity);

void SP_ammo_shells(entity_t *entity);
void SP_ammo_bullets(entity_t *entity);
void SP_ammo_cells(entity_t *entity);
void SP_ammo_grenades(entity_t *entity);
void SP_ammo_rockets(entity_t *entity);
void SP_ammo_slugs(entity_t *entity);

spawn_t	spawns[] = {
	{"item_health", SP_item_health},
	{"item_health_small", SP_item_health_small},
	{"item_health_large", SP_item_health_large},
	{"item_health_mega", SP_item_health_mega},

	{"info_player_start", SP_info_player_start},
	{"info_player_deathmatch", SP_info_player_deathmatch},
	{"info_player_coop", SP_info_player_coop},
	{"info_player_intermission", SP_info_player_intermission},

	{"func_plat", SP_func_plat},
	{"func_button", SP_func_button},
	{"func_door", SP_func_door},
	{"func_door_secret", SP_func_door_secret},
	{"func_door_rotating", SP_func_door_rotating},
	{"func_rotating", SP_func_rotating},
	{"func_train", SP_func_train},
	{"func_water", SP_func_water},
	{"func_conveyor", SP_func_conveyor},
	{"func_areaportal", SP_func_areaportal},
	{"func_clock", SP_func_clock},
	{"func_wall", SP_func_wall},
	{"func_object", SP_func_object},
	{"func_timer", SP_func_timer},
	{"func_explosive", SP_func_explosive},
	{"func_killbox", SP_func_killbox},

	{"trigger_always", SP_trigger_always},
	{"trigger_once", SP_trigger_once},
	{"trigger_multiple", SP_trigger_multiple},
	{"trigger_relay", SP_trigger_relay},
	{"trigger_push", SP_trigger_push},
	{"trigger_hurt", SP_trigger_hurt},
	{"trigger_key", SP_trigger_key},
	{"trigger_counter", SP_trigger_counter},
	{"trigger_elevator", SP_trigger_elevator},
	{"trigger_gravity", SP_trigger_gravity},
	{"trigger_monsterjump", SP_trigger_monsterjump},

	{"target_temp_entity", SP_target_temp_entity},
	{"target_speaker", SP_target_speaker},
	{"target_explosion", SP_target_explosion},
	{"target_changelevel", SP_target_changelevel},
	{"target_secret", SP_target_secret},
	{"target_goal", SP_target_goal},
	{"target_splash", SP_target_splash},
	{"target_spawner", SP_target_spawner},
	{"target_blaster", SP_target_blaster},
	{"target_crosslevel_trigger", SP_target_crosslevel_trigger},
	{"target_crosslevel_target", SP_target_crosslevel_target},
	{"target_laser", SP_target_laser},
	{"target_help", SP_target_help},
	{"target_actor", SP_target_actor},
	{"target_lightramp", SP_target_lightramp},
	{"target_earthquake", SP_target_earthquake},
	{"target_character", SP_target_character},
	{"target_string", SP_target_string},

	{"worldspawn", SP_worldspawn},
	{"viewthing", SP_viewthing},

	{"light", SP_light},
	{"light_mine1", SP_light_mine1},
	{"light_mine2", SP_light_mine2},
	{"info_null", SP_info_null},
	{"func_group", SP_info_null},
	{"info_notnull", SP_info_notnull},
	{"path_corner", SP_path_corner},
	{"point_combat", SP_point_combat},

	{"misc_explobox", SP_misc_explobox},
	{"misc_banner", SP_misc_banner},
	{"misc_satellite_dish", SP_misc_satellite_dish},
	{"misc_actor", SP_misc_actor},
	{"misc_gib_arm", SP_misc_gib_arm},
	{"misc_gib_leg", SP_misc_gib_leg},
	{"misc_gib_head", SP_misc_gib_head},
	{"misc_insane", SP_misc_insane},
	{"misc_deadsoldier", SP_misc_deadsoldier},
	{"misc_viper", SP_misc_viper},
	{"misc_viper_bomb", SP_misc_viper_bomb},
	{"misc_bigviper", SP_misc_bigviper},
	{"misc_strogg_ship", SP_misc_strogg_ship},
	{"misc_teleporter", SP_misc_teleporter},
	{"misc_teleporter_dest", SP_misc_teleporter_dest},
	{"misc_blackhole", SP_misc_blackhole},
	{"misc_eastertank", SP_misc_eastertank},
	{"misc_easterchick", SP_misc_easterchick},
	{"misc_easterchick2", SP_misc_easterchick2},

	{"monster_berserk", SP_monster_berserk},
	{"monster_gladiator", SP_monster_gladiator},
	{"monster_gunner", SP_monster_gunner},
	{"monster_infantry", SP_monster_infantry},
	{"monster_soldier_light", SP_monster_soldier_light},
	{"monster_soldier", SP_monster_soldier},
	{"monster_soldier_ss", SP_monster_soldier_ss},
	{"monster_tank", SP_monster_tank},
	{"monster_tank_commander", SP_monster_tank},
	{"monster_medic", SP_monster_medic},
	{"monster_flipper", SP_monster_flipper},
	{"monster_chick", SP_monster_chick},
	{"monster_parasite", SP_monster_parasite},
	{"monster_flyer", SP_monster_flyer},
	{"monster_brain", SP_monster_brain},
	{"monster_floater", SP_monster_floater},
	{"monster_hover", SP_monster_hover},
	{"monster_mutant", SP_monster_mutant},
	{"monster_supertank", SP_monster_supertank},
	{"monster_boss2", SP_monster_boss2},
	{"monster_boss3_stand", SP_monster_boss3_stand},
	{"monster_jorg", SP_monster_jorg},

	{"monster_commander_body", SP_monster_commander_body},

	{"turret_breach", SP_turret_breach},
	{"turret_base", SP_turret_base},
	{"turret_driver", SP_turret_driver},

/* all the rest are items, and are in G_items.c */
	{"item_armor_body", SP_item_armor_body},
	{"item_armor_combat", SP_item_armor_combat},
	{"item_armor_jacket", SP_item_armor_jacket},
	{"item_armor_shard", SP_item_armor_shard},
	{"item_power_screen", SP_item_power_screen},
	{"item_power_shield", SP_item_power_shield},
	{"item_quad", SP_item_quad},
	{"item_invulnerability", SP_item_invulnerability},
	{"item_silencer", SP_item_silencer},
	{"item_breather", SP_item_breather},
	{"item_enviro", SP_item_enviro},
	{"item_ancient_head", SP_item_ancient_head},
	{"item_adrenaline", SP_item_adrenaline},
	{"item_bandolier", SP_item_bandolier},
	{"item_pack", SP_item_pack},

	{"key_data_cd", SP_key_data_cd},
	{"key_power_cube", SP_key_power_cube},
	{"key_pyramid", SP_key_pyramid},
	{"key_data_spinner", SP_key_data_spinner},
	{"key_pass", SP_key_pass},
	{"key_blue_key", SP_key_blue_key},
	{"key_red_key", SP_key_red_key},
	{"key_commander_head", SP_key_commander_head},
	{"key_airstrike_target", SP_key_airstrike_target},

	{"weapon_blaster", SP_weapon_blaster},
	{"weapon_shotgun", SP_weapon_shotgun},
	{"weapon_supershotgun", SP_weapon_supershotgun},
	{"weapon_machinegun", SP_weapon_machinegun},
	{"weapon_chaingun", SP_weapon_chaingun},
	{"weapon_grenadelauncher", SP_weapon_grenadelauncher},
	{"weapon_rocketlauncher", SP_weapon_rocketlauncher},
	{"weapon_hyperblaster", SP_weapon_hyperblaster},
	{"weapon_railgun", SP_weapon_railgun},
	{"weapon_bfg", SP_weapon_bfg},

	{"ammo_shells", SP_ammo_shells},
	{"ammo_bullets", SP_ammo_bullets},
	{"ammo_cells", SP_ammo_cells},
	{"ammo_grenades", SP_ammo_grenades},
	{"ammo_rockets", SP_ammo_rockets},
	{"ammo_slugs", SP_ammo_slugs},


	{NULL, NULL}
};

void G_spwnObject(int e)
{
	char		*classname;
	spawn_t		*s;
	entity_t	*entity;

	entity = GetEntity(e);
	classname = ValueForKey(entity, "classname");
	if(!classname)
		return;
	for (s=spawns ; s->name ; s++)
	{
		if (!strcmp(s->name, classname))
		{
			logf("Spawning %s\n", classname);
			s->spawn(entity);
			return;
		}
	}
}

char *default_sky = "env/unit1_";
char *default_map = "map/base1.bsp";

void SP_worldspawn (entity_t *entity)
{
	char	*temp;
	int		len;

	temp = ValueForKey(entity, "message");
	len = strlen(temp);

	Level->message = gi.TagMalloc(len+1, TAG_LEVEL);
	strcpy(Level->message, temp);

	temp = ValueForKey(entity, "sky");
	if(!(temp && temp[0]))
		Level->sky = default_sky;
	else
	{
		len = strlen(temp);

		Level->sky = gi.TagMalloc(len+5, TAG_LEVEL);
		strcpy(Level->sky, "env/");
		strcat(Level->sky, temp);
	}

	Level->skyrotate = FloatForKey(entity, "skyrotate");
	GetVectorForKey(entity, "skyaxis", Level->skyaxis);

	temp = ValueForKey(entity, "nextmap");
	if(!temp)
		Level->sky = default_map;
	else
	{
		len = strlen(temp);

		Level->nextmap = gi.TagMalloc(len+9, TAG_LEVEL);
		strcpy(Level->nextmap, "map/");
		strcat(Level->nextmap, temp);
		strcat(Level->nextmap, ".bsp");
	}

	Level->cdtrack = (int)FloatForKey(entity, "sounds");
}

⌨️ 快捷键说明

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