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

📄 p_heretic.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 + -