📄 p_inter.c
字号:
// 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 + -