📄 p_heretic.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_heretic.c,v 1.5 2001/03/30 17:12:50 bpereira Exp $//// Copyright (C) 1993-1996 by Raven Software, Corp.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.////// $Log: p_heretic.c,v $// Revision 1.5 2001/03/30 17:12:50 bpereira// no message//// Revision 1.4 2001/02/24 13:35:20 bpereira// no message//// Revision 1.3 2001/02/10 13:20:55 hurdler// update license//////// DESCRIPTION:////-----------------------------------------------------------------------------#include "doomdef.h"#include "g_game.h"#include "p_local.h"#include "r_main.h"#include "r_state.h"#include "s_sound.h"#include "m_random.h"#include "dstrings.h"#include "p_heretic.h"//---------------------------------------------------------------------------//// PROC A_ContMobjSound////---------------------------------------------------------------------------void A_ContMobjSound(mobj_t *actor){ switch(actor->type) { case MT_KNIGHTAXE: S_StartSound(actor, sfx_kgtatk); break; case MT_MUMMYFX1: S_StartSound(actor, sfx_mumhed); break; default: break; }}//----------------------------------------------------------------------------//// FUNC P_FaceMobj//// Returns 1 if 'source' needs to turn clockwise, or 0 if 'source' needs// to turn counter clockwise. 'delta' is set to the amount 'source'// needs to turn.////----------------------------------------------------------------------------int P_FaceMobj(mobj_t *source, mobj_t *target, angle_t *delta){ angle_t diff; angle_t angle1; angle_t angle2; angle1 = source->angle; angle2 = R_PointToAngle2(source->x, source->y, target->x, target->y); if(angle2 > angle1) { diff = angle2-angle1; if(diff > ANGLE_180) { *delta = ANGLE_MAX-diff; return(0); } else { *delta = diff; return(1); } } else { diff = angle1-angle2; if(diff > ANGLE_180) { *delta = ANGLE_MAX-diff; return(1); } else { *delta = diff; return(0); } }}//----------------------------------------------------------------------------//// FUNC P_SeekerMissile//// The missile special1 field must be mobj_t *target. Returns true if// target was tracked, false if not.////----------------------------------------------------------------------------boolean P_SeekerMissile(mobj_t *actor, angle_t thresh, angle_t turnMax){ int dir; int dist; angle_t delta; angle_t angle; mobj_t *target; target = (mobj_t *)actor->special1; if(target == NULL) { return(false); } if(!(target->flags&MF_SHOOTABLE)) { // Target died actor->special1 = 0; return(false); } dir = P_FaceMobj(actor, target, &delta); if(delta > thresh) { delta >>= 1; if(delta > turnMax) { delta = turnMax; } } if(dir) { // Turn clockwise actor->angle += delta; } else { // Turn counter clockwise actor->angle -= delta; } angle = actor->angle>>ANGLETOFINESHIFT; actor->momx = FixedMul(actor->info->speed, finecosine[angle]); actor->momy = FixedMul(actor->info->speed, finesine[angle]); if(actor->z+actor->height < target->z || target->z+target->height < actor->z) { // Need to seek vertically dist = P_AproxDistance(target->x-actor->x, target->y-actor->y); dist = dist/actor->info->speed; if(dist < 1) dist = 1; actor->momz = (target->z+(target->height>>1) -(actor->z+(actor->height>>1)))/dist; } return(true);}//---------------------------------------------------------------------------//// FUNC P_SpawnMissileAngle//// Returns NULL if the missile exploded immediately, otherwise returns// a mobj_t pointer to the missile.////---------------------------------------------------------------------------mobj_t *P_SpawnMissileAngle(mobj_t *source, mobjtype_t type, angle_t angle, fixed_t momz){ fixed_t z; mobj_t *mo; switch(type) { case MT_MNTRFX1: // Minotaur swing attack missile z = source->z+40*FRACUNIT; break; case MT_MNTRFX2: // Minotaur floor fire missile z = ONFLOORZ; break; case MT_SRCRFX1: // Sorcerer Demon fireball z = source->z+48*FRACUNIT; break; default: z = source->z+32*FRACUNIT; break; } if(source->flags2&MF2_FEETARECLIPPED) { z -= FOOTCLIPSIZE; } mo = P_SpawnMobj(source->x, source->y, z, type); if(mo->info->seesound) { S_StartSound(mo, mo->info->seesound); } mo->target = source; // Originator mo->angle = angle; angle >>= ANGLETOFINESHIFT; mo->momx = FixedMul(mo->info->speed, finecosine[angle]); mo->momy = FixedMul(mo->info->speed, finesine[angle]); mo->momz = momz; return(P_CheckMissileSpawn(mo) ? mo : NULL);}boolean inventory = false;extern int GetWeaponAmmo[];extern byte cheat_mus_seq[];extern byte cheat_choppers_seq[];extern byte cheat_god_seq[];extern byte cheat_ammo_seq[];extern byte cheat_ammonokey_seq[];extern byte cheat_noclip_seq[];extern byte cheat_commercial_noclip_seq[];extern byte cheat_powerup_seq[7][10];extern byte cheat_clev_seq[];extern byte cheat_mypos_seq[];extern byte cheat_amap_seq[];void HereticPatchEngine(void){ ceilmovesound = sfx_dormov; doorclosesound = sfx_doropn; inventory = true; // we can put such thinks in a dehacked lump, maybe for later S_sfx[sfx_oof].name = "plroof"; S_sfx[sfx_oof].priority = 32; text[PD_BLUEK_NUM] = "YOU NEED A BLUE KEY TO OPEN THIS DOOR"; text[PD_YELLOWK_NUM] = "YOU NEED A YELLOW KEY TO OPEN THIS DOOR"; text[PD_REDK_NUM] = "YOU NEED A GREEN KEY TO OPEN THIS DOOR"; S_sfx[sfx_swtchn].name = "switch"; S_sfx[sfx_swtchn].priority = 40; S_sfx[sfx_swtchx].name = "switch"; S_sfx[sfx_swtchx].priority = 40; S_sfx[sfx_telept].priority = 50; S_sfx[sfx_sawup].name = "gntact"; // gauntlets S_sfx[sfx_sawup].priority = 32; mobjinfo[MT_TFOG].spawnstate = S_HTFOG1; sprnames[SPR_BLUD] = "BLOD"; maxammo [am_goldwand ] = 100; maxammo [am_crossbow ] = 50; maxammo [am_blaster ] = 200; maxammo [am_skullrod ] = 200; maxammo [am_phoenixrod] = 20; maxammo [am_mace ] = 150; clipammo[am_goldwand ] = 5; // used in deathmatch 1 & 3 mul by 5 (P_GiveWeapon) clipammo[am_crossbow ] = 2; clipammo[am_blaster ] = 6; clipammo[am_skullrod ] = 10; clipammo[am_phoenixrod] = 1; clipammo[am_mace ] = 10; GetWeaponAmmo[wp_staff ] = 0; GetWeaponAmmo[wp_goldwand ] = 25; GetWeaponAmmo[wp_crossbow ] = 10; GetWeaponAmmo[wp_blaster ] = 30; GetWeaponAmmo[wp_skullrod ] = 50; GetWeaponAmmo[wp_phoenixrod] = 2; GetWeaponAmmo[wp_mace ] = 50; GetWeaponAmmo[wp_gauntlets ] = 0; GetWeaponAmmo[wp_beak ] = 0; text[GOTARMOR_NUM] = "SILVER SHIELD"; text[GOTMEGA_NUM ] = "ENCHANTED SHIELD"; text[GOTSTIM_NUM ] = "CRYSTAL VIAL"; text[GOTMAP_NUM ] = "MAP SCROLL"; text[GOTBLUECARD_NUM] = "BLUE KEY"; text[GOTYELWCARD_NUM] = "YELLOW KEY"; text[GOTREDCARD_NUM ] = "GREEN KEY"; S_sfx[sfx_pistol].name = "keyup"; // for the menu S_music[mus_inter].name = "MUS_INTR"; S_sfx[sfx_tink].name = "chat"; S_sfx[sfx_tink].priority = 100; S_sfx[sfx_itmbk].name = "respawn"; S_sfx[sfx_itmbk].priority = 10; // conflicting number for doomednum // so desable doom mobjs and enabled heretic's one mobjinfo[MT_SHOTGUY].doomednum = -1; mobjinfo[MT_MINOTAUR].doomednum = 9; mobjinfo[MT_VILE].doomednum = -1; mobjinfo[MT_HKNIGHT].doomednum = 64; mobjinfo[MT_CHAINGUY].doomednum = -1; mobjinfo[MT_KNIGHTGHOST].doomednum = 65; mobjinfo[MT_UNDEAD].doomednum = -1; mobjinfo[MT_IMP].doomednum = 66; mobjinfo[MT_KNIGHT].doomednum = -1; mobjinfo[MT_MUMMYGHOST].doomednum = 69; mobjinfo[MT_SPIDER].doomednum = -1; mobjinfo[MT_SORCERER1].doomednum = 7; mobjinfo[MT_BABY].doomednum = -1; mobjinfo[MT_MUMMY].doomednum = 68; mobjinfo[MT_CYBORG].doomednum = -1; mobjinfo[MT_AMMACEHEFTY].doomednum = 16; mobjinfo[MT_WOLFSS].doomednum = -1; mobjinfo[MT_ARTIINVULNERABILITY].doomednum = 84;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -