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

📄 p_inter.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 5 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_inter.c,v 1.14 2001/04/19 05:51:47 metzgermeister Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// 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_inter.c,v $// Revision 1.14  2001/04/19 05:51:47  metzgermeister// fixed 10 shells instead of 4 - bug//// Revision 1.13  2001/03/30 17:12:50  bpereira// no message//// Revision 1.12  2001/02/24 13:35:20  bpereira// no message//// Revision 1.11  2001/01/25 22:15:43  bpereira// added heretic support//// Revision 1.10  2000/11/02 17:50:07  stroggonmeth// Big 3Dfloors & FraggleScript commit!!//// Revision 1.9  2000/10/02 18:25:45  bpereira// no message//// Revision 1.8  2000/10/01 10:18:17  bpereira// no message//// Revision 1.7  2000/09/28 20:57:16  bpereira// no message//// Revision 1.6  2000/08/31 14:30:55  bpereira// no message//// Revision 1.5  2000/04/16 18:38:07  bpereira// no message//// Revision 1.4  2000/04/04 00:32:46  stroggonmeth// Initial Boom compatability plus few misc changes all around.//// Revision 1.3  2000/02/27 00:42:10  hurdler// fix CR+LF problem//// Revision 1.2  2000/02/26 00:28:42  hurdler// Mostly bug fix (see borislog.txt 23-2-2000, 24-2-2000)////// DESCRIPTION://      Handling interactions (i.e., collisions).////-----------------------------------------------------------------------------#include "doomdef.h"#include "i_system.h"   //I_Tactile currently has no effect#include "am_map.h"#include "dstrings.h"#include "g_game.h"#include "m_random.h"#include "p_local.h"#include "p_inter.h"#include "s_sound.h"#include "r_main.h"#include "st_stuff.h"#define BONUSADD        6// a weapon is found with two clip loads,// a big item has five clip loadsint     maxammo[NUMAMMO] = {200, 50, 300, 50};int     clipammo[NUMAMMO] = {10, 4, 20, 1};// added 4-2-98 (Boris) for dehacked patch// (i don't like that but do you see another solution ?)int     MAXHEALTH= 100;//--------------------------------------------------------------------------//// PROC P_SetMessage////--------------------------------------------------------------------------boolean ultimatemsg;void P_SetMessage(player_t *player, char *message, boolean ultmsg){    if((ultimatemsg || !cv_showmessages.value) && !ultmsg)        return;        player->message = message;    //player->messageTics = MESSAGETICS;    //BorderTopRefresh = true;    if( ultmsg )        ultimatemsg = true;}//// GET STUFF//// added by Boris : preferred weapons ordervoid VerifFavoritWeapon (player_t *player){    int    actualprior,i;    if (player->pendingweapon != wp_nochange)        return;    actualprior=-1;    for (i=0; i<NUMWEAPONS; i++)    {        // skip super shotgun for non-Doom2        if (gamemode!=commercial && i==wp_supershotgun)            continue;        // skip plasma-bfg in sharware        if (gamemode==shareware && (i==wp_plasma || i==wp_bfg))            continue;        if ( player->weaponowned[i] &&             actualprior < player->favoritweapon[i] &&             player->ammo[player->weaponinfo[i].ammo] >= player->weaponinfo[i].ammopershoot )        {            player->pendingweapon = i;            actualprior = player->favoritweapon[i];        }    }    if (player->pendingweapon==player->readyweapon)        player->pendingweapon = wp_nochange;}static const weapontype_t GetAmmoChange[] ={        wp_goldwand,        wp_crossbow,        wp_blaster,        wp_skullrod,        wp_phoenixrod,        wp_mace};//// P_GiveAmmo// Num is the number of clip loads,// not the individual count (0= 1/2 clip).// Returns false if the ammo can't be picked up at all//boolean P_GiveAmmo ( player_t*     player,                     ammotype_t    ammo,                     int           count ){    int         oldammo;    if (ammo == am_noammo)        return false;    if (ammo < 0 || ammo > NUMAMMO)    {        CONS_Printf ("\2P_GiveAmmo: bad type %i", ammo);        return false;    }    if ( player->ammo[ammo] == player->maxammo[ammo]  )        return false;/*    if (num)        num *= clipammo[ammo];    else        num = clipammo[ammo]/2;*/    if (gameskill == sk_baby        || gameskill == sk_nightmare)    {        if( gamemode == heretic )            count += count>>1;        else            // give double ammo in trainer mode,            // you'll need in nightmare            count <<= 1;    }    oldammo = player->ammo[ammo];    player->ammo[ammo] += count;    if (player->ammo[ammo] > player->maxammo[ammo])        player->ammo[ammo] = player->maxammo[ammo];    // If non zero ammo,    // don't change up weapons,    // player was lower on purpose.    if (oldammo)        return true;    // We were down to zero,    // so select a new weapon.    // Preferences are not user selectable.    // Boris hack for preferred weapons order...    if(!player->originalweaponswitch)    {       if(player->ammo[player->weaponinfo[player->readyweapon].ammo]                     < player->weaponinfo[player->readyweapon].ammopershoot)         VerifFavoritWeapon(player);       return true;    }    else //eof Boris    if( gamemode == heretic )    {        if( ( player->readyweapon == wp_staff           || player->readyweapon == wp_gauntlets)            && player->weaponowned[GetAmmoChange[ammo]])             player->pendingweapon = GetAmmoChange[ammo];    }    else    switch (ammo)    {      case am_clip:        if (player->readyweapon == wp_fist)        {            if (player->weaponowned[wp_chaingun])                player->pendingweapon = wp_chaingun;            else                player->pendingweapon = wp_pistol;        }        break;      case am_shell:        if (player->readyweapon == wp_fist            || player->readyweapon == wp_pistol)        {            if (player->weaponowned[wp_shotgun])                player->pendingweapon = wp_shotgun;        }        break;      case am_cell:        if (player->readyweapon == wp_fist            || player->readyweapon == wp_pistol)        {            if (player->weaponowned[wp_plasma])                player->pendingweapon = wp_plasma;        }        break;      case am_misl:        if (player->readyweapon == wp_fist)        {            if (player->weaponowned[wp_missile])                player->pendingweapon = wp_missile;        }      default:        break;    }    return true;}// ammo get with the weaponint GetWeaponAmmo[NUMWEAPONS] ={    0,  // staff       fist   20,  // gold wand   pistol    8,  // crossbow    shotgun   20,  // blaster     chaingun    2,  // skull rod   missile       40,  // phoenix rod plasma        40,  // mace        bfg            0,  // gauntlets   chainsaw       8,  // beak        supershotgun};//// P_GiveWeapon// The weapon name may have a MF_DROPPED flag ored in.//boolean P_GiveWeapon ( player_t*     player,                       weapontype_t  weapon,                       boolean       dropped ){    boolean     gaveammo;    boolean     gaveweapon;    if (multiplayer && (cv_deathmatch.value!=2) && !dropped )    {        // leave placed weapons forever on net games        if (player->weaponowned[weapon])            return false;        player->bonuscount += BONUSADD;        player->weaponowned[weapon] = true;        if (cv_deathmatch.value)            P_GiveAmmo (player, player->weaponinfo[weapon].ammo, 5*clipammo[player->weaponinfo[weapon].ammo]);        else            P_GiveAmmo (player, player->weaponinfo[weapon].ammo, GetWeaponAmmo[weapon]);        // Boris hack preferred weapons order...        if(player->originalweaponswitch        || player->favoritweapon[weapon] > player->favoritweapon[player->readyweapon])            player->pendingweapon = weapon;     // do like Doom2 original        //added:16-01-98:changed consoleplayer to displayplayer        //               (hear the sounds from the viewpoint)        if (player == &players[displayplayer] || (cv_splitscreen.value && player==&players[secondarydisplayplayer]))            S_StartSound (NULL, sfx_wpnup);        return false;    }    if (player->weaponinfo[weapon].ammo != am_noammo)    {        // give one clip with a dropped weapon,        // two clips with a found weapon        if (dropped)            gaveammo = P_GiveAmmo (player, player->weaponinfo[weapon].ammo, clipammo[player->weaponinfo[weapon].ammo]);        else            gaveammo = P_GiveAmmo (player, player->weaponinfo[weapon].ammo, GetWeaponAmmo[weapon]);    }    else        gaveammo = false;    if (player->weaponowned[weapon])        gaveweapon = false;    else    {        gaveweapon = true;        player->weaponowned[weapon] = true;        if (player->originalweaponswitch        || player->favoritweapon[weapon] > player->favoritweapon[player->readyweapon])            player->pendingweapon = weapon;    // Doom2 original stuff    }    return (gaveweapon || gaveammo);}//// P_GiveBody// Returns false if the body isn't needed at all//boolean P_GiveBody ( player_t*     player,                     int           num ){    int max;        max = MAXHEALTH;    if(player->chickenTics)        max = MAXCHICKENHEALTH;    if (player->health >= max)        return false;    player->health += num;    if (player->health > max)        player->health = max;    player->mo->health = player->health;    return true;}//// P_GiveArmor// Returns false if the armor is worse// than the current armor.//boolean P_GiveArmor ( player_t*     player,                      int           armortype ){    int         hits;    hits = armortype*100;    if (player->armorpoints >= hits)        return false;   // don't pick up    player->armortype = armortype;    player->armorpoints = hits;    return true;}//// P_GiveCard//static boolean P_GiveCard ( player_t*     player,                            card_t        card ){    if (player->cards & card )        return false;    player->bonuscount = BONUSADD;    player->cards |= card;    return true;}//// P_GivePower//boolean P_GivePower ( player_t*     player,                      int /*powertype_t*/   power ){    if (power == pw_invulnerability)    {        // Already have it        if( inventory && player->powers[power] > BLINKTHRESHOLD )            return false;        player->powers[power] = INVULNTICS;        return true;    }    if(power == pw_weaponlevel2)    {        // Already have it        if( inventory && player->powers[power] > BLINKTHRESHOLD)            return false;        player->powers[power] = WPNLEV2TICS;        player->weaponinfo = wpnlev2info;        return true;    }    if (power == pw_invisibility)    {        // Already have it        if( inventory && player->powers[power] > BLINKTHRESHOLD)            return false;        player->powers[power] = INVISTICS;        player->mo->flags |= MF_SHADOW;        return true;    }    if(power == pw_flight)    {        // Already have it        if(player->powers[power] > BLINKTHRESHOLD)            return(false);        player->powers[power] = FLIGHTTICS;        player->mo->flags2 |= MF2_FLY;        player->mo->flags |= MF_NOGRAVITY;

⌨️ 快捷键说明

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