亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? g_game.c

?? 游戲類程序源代碼---WinDoom 3D源程序.zip
?? C
?? 第 1 頁 / 共 4 頁
字號(hào):
// Emacs style mode select   -*- C++ -*- 
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// $Log:$
//
// DESCRIPTION:  none
//
//-----------------------------------------------------------------------------


static const char
rcsid[] = "$Id: g_game.c,v 1.8 1997/02/03 22:45:09 b1 Exp $";

#include <string.h>
#include <stdlib.h>

#include "doomdef.h" 
#include "doomstat.h"

#include "z_zone.h"
#include "f_finale.h"
#include "m_argv.h"
#include "m_misc.h"
#include "m_menu.h"
#include "m_random.h"
#include "i_system.h"

#include "p_setup.h"
#include "p_saveg.h"
#include "p_tick.h"

#include "d_main.h"

#include "wi_stuff.h"
#include "hu_stuff.h"
#include "st_stuff.h"
#include "am_map.h"

// Needs access to LFB.
#include "v_video.h"

#include "w_wad.h"

#include "p_local.h" 

#include "s_sound.h"

// Data.
#include "dstrings.h"
#include "sounds.h"

// SKY handling - still the wrong place.
#include "r_data.h"
#include "r_sky.h"



#include "g_game.h"


#define SAVEGAMESIZE	0x2c000
#define SAVESTRINGSIZE	24

void WriteDebug(char *);
char MsgText[256];

boolean	G_CheckDemoStatus (void); 
void	G_ReadDemoTiccmd (ticcmd_t* cmd); 
void	G_WriteDemoTiccmd (ticcmd_t* cmd); 
void	G_PlayerReborn (int player); 
void	G_InitNew (skill_t skill, int episode, int map); 
 
void	G_DoReborn (int playernum); 
 
void	G_DoLoadLevel (void); 
void	G_DoNewGame (void); 
void	G_DoLoadGame (void); 
void	G_DoPlayDemo (void); 
void	G_DoPlayDemo_II(void); 
void	G_DoCompleted (void); 
void	G_DoVictory (void); 
void	G_DoWorldDone (void); 
void	G_DoSaveGame (void); 
 
 
gameaction_t    gameaction; 
gamestate_t     gamestate; 
skill_t         gameskill; 
boolean		respawnmonsters;
int             gameepisode; 
int             gamemap; 
 
boolean         paused; 
boolean         sendpause;             	// send a pause event next tic 
boolean         sendsave;             	// send a save event next tic 
boolean         usergame;               // ok to save / end game 
 
boolean         timingdemo;             // if true, exit with report on completion 
boolean         nodrawers;              // for comparative timing purposes 
boolean         noblit;                 // for comparative timing purposes 
int             starttime;          	// for comparative timing purposes  	 
 
boolean         viewactive; 
 
boolean         deathmatch;           	// only if started as net death 
boolean         netgame;                // only true if packets are broadcast 
boolean         playeringame[MAXPLAYERS]; 
player_t        players[MAXPLAYERS]; 
 
int             consoleplayer;          // player taking events and displaying 
int             displayplayer;          // view being displayed 
int             gametic; 
int             levelstarttic;          // gametic at level start 
int             totalkills, totalitems, totalsecret;    // for intermission 
 
char            demoname[32]; 
int             demotype; 
boolean         demorecording; 
boolean         demoplayback; 
boolean		netdemo; 
byte*		demobuffer;
byte*		demo_p;
byte*		demoend; 
boolean         singledemo;            	// quit after playing a demo from cmdline 
 
boolean         precache = true;        // if true, load all graphics at start 
 
wbstartstruct_t wminfo;               	// parms for world map / intermission 
 
short		consistancy[MAXPLAYERS][BACKUPTICS]; 
 
byte*		savebuffer;
 
 
// 
// controls (have defaults) 
// 
int     key_right;
int		key_left;

int		key_up;
int		key_down; 
int     key_strafeleft;
int	    key_straferight; 
int     key_fire;
int		key_use;
int		key_strafe;
int     key_speed; 

int     key_mvert;
 
int     mousebfire; 
int     mousebstrafe; 
int     mousebforward; 
 
int     mouseb1;
int     mouseb2;
int     mouseb3;

int     joybfire; 
int     joybstrafe; 
int     joybuse; 
int     joybspeed; 

int     joyb1;
int     joyb2;
int     joyb3;
int     joyb4;
 
int     always_run;
int     swap_stereo;
int     mvert;
int     keylink;
int     link_alt;
 
#define MAXPLMOVE		(forwardmove[1]) 
 
#define TURBOTHRESHOLD	0x32

fixed_t		forwardmove[2] = {0x19, 0x32};
fixed_t		sidemove[2] = {0x18, 0x28}; 
fixed_t		angleturn[3] = {640, 1280, 320};	// + slow turn 

#define SLOWTURNTICS	6 
 
#define NUMKEYS		256 

boolean         gamekeydown[NUMKEYS]; 
int             turnheld;				// for accelerative turning 
 
boolean		mousearray[4]; 
boolean*	mousebuttons = &mousearray[1];		// allow [-1]

// mouse values are used once 
int             mousex;
int		mousey;         

int             dclicktime;
int		dclickstate;
int		dclicks; 
int             dclicktime2;
int		dclickstate2;
int		dclicks2;

// joystick values are repeated 
int             joyxmove;
int		joyymove;
boolean         joyarray[5]; 
boolean*	joybuttons = &joyarray[1];		// allow [-1] 
 
int		savegameslot; 
char		savedescription[32]; 
 
 
#define	BODYQUESIZE	32

mobj_t*		bodyque[BODYQUESIZE]; 
int		bodyqueslot; 
 
void*		statcopy;				// for statistics driver

// DQ start addition 
extern int gEyePixelOffset;
extern long ScreensYLookup[];
extern BUFFER gRenderBuffer;
// DQ end addition
 
 
int G_CmdChecksum (ticcmd_t* cmd) 
{ 
    int		i;
    int		sum = 0; 
	 
    for (i=0 ; i< sizeof(*cmd)/4 - 1 ; i++) 
	sum += ((int *)cmd)[i]; 
		 
    return sum; 
} 
 

//
// G_BuildTiccmd
// Builds a ticcmd from all of the available inputs
// or reads it from the demo buffer. 
// If recording a demo, write it out 
// 
void G_BuildTiccmd (ticcmd_t* cmd) 
   { 
    int       i; 
    boolean   strafe;
    boolean   bstrafe; 
    int       speed;
    int       tspeed; 
    int       forward;
    int       side;
    ticcmd_t *base;


    base = I_BaseTiccmd ();		// empty, or external driver
    memcpy (cmd,base,sizeof(*cmd)); 
	
    cmd->consistancy = consistancy[consoleplayer][maketic%BACKUPTICS]; 
 
    strafe = gamekeydown[key_strafe] || mousebuttons[mousebstrafe] || joybuttons[joybstrafe]; 
    if ((joybspeed == 31) || (always_run == TRUE))
       speed = 1;
    else
       speed = gamekeydown[key_speed] || joybuttons[joybspeed];
    
 
    forward = side = 0;
    
    // use two stage accelerative turning on the keyboard and joystick
    if (joyxmove < 0 || joyxmove > 0 || gamekeydown[key_right] || gamekeydown[key_left]) 
        turnheld += ticdup; 
    else 
        turnheld = 0; 

    if (turnheld < SLOWTURNTICS) 
        tspeed = 2;             // slow turn 
    else 
        tspeed = speed;
    
    // let movement keys cancel each other out
    if (strafe) 
       { 
        if (gamekeydown[key_right]) 
           {
            // fprintf(stderr, "strafe right\n");
            side += sidemove[speed]; 
           }
        if (gamekeydown[key_left]) 
           {
            // fprintf(stderr, "strafe left\n");
            side -= sidemove[speed]; 
           }
        if (joyxmove > 0) 
            side += sidemove[speed]; 
        if (joyxmove < 0) 
            side -= sidemove[speed]; 
       } 
    else 
       { 
        if (gamekeydown[key_right]) 
            cmd->angleturn -= angleturn[tspeed]; 
        if (gamekeydown[key_left]) 
            cmd->angleturn += angleturn[tspeed]; 
        if (joyxmove > 0) 
            cmd->angleturn -= angleturn[tspeed]; 
        if (joyxmove < 0) 
            cmd->angleturn += angleturn[tspeed]; 
       } 
 
    if (gamekeydown[key_up]) 
       {
        // fprintf(stderr, "up\n");
        forward += forwardmove[speed]; 
       }
    if (gamekeydown[key_down]) 
       {
        // fprintf(stderr, "down\n");
        forward -= forwardmove[speed]; 
       }
    if (joyymove < 0) 
        forward += forwardmove[speed]; 
    if (joyymove > 0) 
        forward -= forwardmove[speed]; 
    if (gamekeydown[key_straferight]) 
        side += sidemove[speed]; 
    if (gamekeydown[key_strafeleft]) 
        side -= sidemove[speed];
    
    // buttons
    cmd->chatchar = HU_dequeueChatChar(); 
 
    if (gamekeydown[key_fire] || mousebuttons[mousebfire] || joybuttons[joybfire]) 
       {
        cmd->buttons |= BT_ATTACK;
       }
 
    if (gamekeydown[key_use] || joybuttons[joybuse] ) 
       { 
        cmd->buttons |= BT_USE;
        // clear double clicks if hit use button 
        dclicks = 0;                   
       } 

    // chainsaw overrides 
    for (i = 0; i < NUMWEAPONS-1; i++)
        if (gamekeydown[KEY_1+i])
           { 
            cmd->buttons |= BT_CHANGE; 
            cmd->buttons |= i<<BT_WEAPONSHIFT; 
            break; 
           }
    
    // mouse
    if (mousebuttons[mousebforward]) 
        forward += forwardmove[speed];
    
    // forward double click
    if (mousebuttons[mousebforward] != dclickstate && dclicktime > 1 ) 
       { 
        dclickstate = mousebuttons[mousebforward]; 
        if (dclickstate) 
            dclicks++; 
        if (dclicks == 2) 
           { 
            cmd->buttons |= BT_USE; 
            dclicks = 0; 
           } 
        else 
            dclicktime = 0; 
       } 
    else 
       { 
        dclicktime += ticdup; 
        if (dclicktime > 20) 
           { 
            dclicks = 0; 
            dclickstate = 0; 
           } 
       }
    
    // strafe double click
    bstrafe = mousebuttons[mousebstrafe] || joybuttons[joybstrafe]; 
    if (bstrafe != dclickstate2 && dclicktime2 > 1 ) 
       { 
        dclickstate2 = bstrafe; 
        if (dclickstate2) 
            dclicks2++; 
        if (dclicks2 == 2) 
           { 
            cmd->buttons |= BT_USE; 
            dclicks2 = 0; 
           } 
        else 
           dclicktime2 = 0; 
       } 
    else 
       { 
        dclicktime2 += ticdup; 
        if (dclicktime2 > 20) 
           { 
            dclicks2 = 0; 
            dclickstate2 = 0; 
           } 
       } 
 
    forward += mousey; 
    if (strafe) 
        side += mousex*2; 
    else 
        cmd->angleturn -= mousex*0x8; 

    mousex = mousey = 0;
	 
    if (forward > MAXPLMOVE) 
        forward = MAXPLMOVE; 
    else
    if (forward < -MAXPLMOVE) 
        forward = -MAXPLMOVE; 
    if (side > MAXPLMOVE) 
        side = MAXPLMOVE; 
    else
    if (side < -MAXPLMOVE) 
        side = -MAXPLMOVE; 
 
    cmd->forwardmove += forward; 
    cmd->sidemove += side;
    
    // special buttons
    if (sendpause)
       { 
        sendpause = false; 
        cmd->buttons = BT_SPECIAL | BTS_PAUSE; 
       } 
 
    if (sendsave)
       { 
        sendsave = false; 
        cmd->buttons = BT_SPECIAL | BTS_SAVEGAME | (savegameslot << BTS_SAVESHIFT); 
       } 
   } 
 

//
// G_DoLoadLevel 
//
extern  gamestate_t     wipegamestate; 
 
void G_DoLoadLevel (void) 
{ 
    int             i; 
	 BUFFER			  TempBuffer;

    // Set the sky map.
    // First thing, we have a dummy sky texture name,
    //  a flat. The data is in the WAD only because
    //  we look for an actual index, instead of simply
    //  setting one.
    skyflatnum = R_FlatNumForName ( SKYFLATNAME );

    // DOOM determines the sky texture to be used
    // depending on the current episode, and the game version.
    if ( (gamemode == commercial) // Doom II
	 || ( gamemode == addon_tnt )
	 || ( gamemode == addon_plut ) )
    {
	skytexture = R_TextureNumForName ("SKY3");
	if (gamemap < 12)
	    skytexture = R_TextureNumForName ("SKY1");
	else
	    if (gamemap < 21)
		skytexture = R_TextureNumForName ("SKY2");
    //WriteDebug("Sky set...\n");
    }

    levelstarttic = gametic;        // for time calculation
    
    if (wipegamestate == GS_LEVEL) 
	wipegamestate = -1;             // force a wipe 

    gamestate = GS_LEVEL; 

    for (i=0 ; i<MAXPLAYERS ; i++) 
    { 
	if (playeringame[i] && players[i].playerstate == PST_DEAD) 
	    players[i].playerstate = PST_REBORN; 
	memset (players[i].frags,0,sizeof(players[i].frags)); 
    } 
		 
    //WriteDebug("P_SetupLevel\n");
    P_SetupLevel (gameepisode, gamemap, 0, gameskill);    
    displayplayer = consoleplayer;		// view the guy you are playing    
    starttime = I_GetTime (); 
    gameaction = ga_nothing; 
    //WriteDebug("Z_CheckHeap\n");
    Z_CheckHeap ();
    
    // clear cmd building stuff
    memset (gamekeydown, 0, sizeof(gamekeydown)); 
    joyxmove = joyymove = 0; 
    mousex = mousey = 0; 
    sendpause = sendsave = paused = false; 
    memset (mousebuttons, 0, sizeof(mousebuttons)); 
    memset (joybuttons, 0, sizeof(joybuttons)); 
    //WriteDebug("G_DoLoadLevel done\n");
	 TempBuffer.Buffer = screens[1]; // DQ - background screens
	 TempBuffer.YLookup = ScreensYLookup; // DQ
    R_FillBackScreen(&TempBuffer/*DQ*/);

} 
 
 
//
// G_Responder  
// Get info needed to make ticcmd_ts for the players.
// 
boolean G_Responder(event_t* ev) 
   { 
    // allow spy mode changes even during the demo
    if (gamestate == GS_LEVEL && ev->type == ev_keydown && ev->data1 == KEY_F12 && (singledemo || !deathmatch))
       {
        // spy mode 
        do 
           { 
            displayplayer++; 
            if (displayplayer == MAXPLAYERS) 
                displayplayer = 0; 
            }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天综合在线视频| 日韩一区二区中文字幕| 久久麻豆一区二区| 国产在线播精品第三| 久久综合久色欧美综合狠狠| 日韩av电影天堂| 精品日产卡一卡二卡麻豆| 国产又粗又猛又爽又黄91精品| 久久精品水蜜桃av综合天堂| 成人精品免费网站| 亚洲婷婷综合久久一本伊一区| 国v精品久久久网| 一区二区在线观看视频在线观看| 欧美久久一区二区| caoporm超碰国产精品| 欧美日韩国产天堂| a亚洲天堂av| 成人免费看视频| 日韩欧美亚洲一区二区| 色婷婷综合久久久中文一区二区 | 中文在线资源观看网站视频免费不卡| 91一区二区在线| 激情文学综合丁香| 免费国产亚洲视频| 午夜精品久久一牛影视| 亚洲男人的天堂在线观看| 中文字幕欧美激情一区| 欧美精品一区二区不卡| 欧美精选一区二区| 在线视频国产一区| 91婷婷韩国欧美一区二区| 国产黄色成人av| 国产麻豆9l精品三级站| 麻豆久久一区二区| 日本伊人色综合网| 性感美女极品91精品| 亚洲精品中文字幕在线观看| 中文字幕制服丝袜一区二区三区 | 精品福利一二区| 日韩一级黄色片| 91.麻豆视频| 欧美日韩亚洲国产综合| 欧美日本在线观看| 欧美日韩精品一二三区| 欧美日韩午夜精品| 欧美日韩日本视频| 欧美视频第二页| 欧美一区二区三区思思人| 在线成人av网站| 欧美一级爆毛片| 日韩免费一区二区三区在线播放| 日韩欧美在线网站| 精品乱码亚洲一区二区不卡| 久久色成人在线| 日本一区二区动态图| 中文字幕一区二区三区四区| 亚洲视频电影在线| 亚洲永久免费视频| 午夜精品影院在线观看| 蜜臀av一级做a爰片久久| 极品销魂美女一区二区三区| 国产美女一区二区三区| 成人av在线观| 欧美性生活大片视频| 91精品欧美福利在线观看| 欧美大肚乱孕交hd孕妇| 2023国产一二三区日本精品2022| 亚洲国产精品成人综合| 亚洲精品国产成人久久av盗摄| 日韩黄色免费电影| 国产又黄又大久久| 一本色道综合亚洲| 91精品在线观看入口| 国产午夜精品福利| 亚洲特级片在线| 日韩和欧美一区二区三区| 国产黄人亚洲片| 日本国产一区二区| 日韩三级av在线播放| 国产精品免费网站在线观看| 国产综合久久久久影院| 99久久精品国产观看| 7777精品久久久大香线蕉 | 日韩一级免费观看| 国产精品的网站| 蜜桃久久久久久久| 91尤物视频在线观看| 91麻豆精品国产91久久久久| 国产欧美日韩一区二区三区在线观看| 亚洲精品国产无天堂网2021| 国产一区二区三区av电影| 欧美午夜影院一区| 欧美经典一区二区| 午夜精品久久久久久久久久| 不卡视频在线观看| 欧美一区在线视频| 1000精品久久久久久久久| 麻豆freexxxx性91精品| 色素色在线综合| 久久天堂av综合合色蜜桃网| 亚洲图片欧美色图| zzijzzij亚洲日本少妇熟睡| 欧美一级欧美一级在线播放| 亚洲另类色综合网站| 国产很黄免费观看久久| 欧美一级电影网站| 一区二区三区在线视频免费| 国产成人av网站| 日韩精品一区二区三区在线播放| 亚洲午夜在线电影| 成人av小说网| 久久久影视传媒| 日韩精彩视频在线观看| 欧美日韩一二三| 亚洲乱码国产乱码精品精98午夜 | 波多野洁衣一区| 欧美精品一区二区蜜臀亚洲| 天天操天天色综合| 色偷偷88欧美精品久久久| 中文字幕亚洲综合久久菠萝蜜| 精品亚洲国产成人av制服丝袜| 欧美日韩国产色站一区二区三区| 亚洲人妖av一区二区| 成人免费视频一区二区| 精品国产一区二区三区不卡| 乱一区二区av| 91精品国产综合久久精品麻豆 | 精品久久久久香蕉网| 日日夜夜免费精品视频| 色视频欧美一区二区三区| 国产精品国产三级国产aⅴ入口| 国产综合久久久久影院| 2020国产精品自拍| 激情综合色综合久久综合| 日韩一区二区免费视频| 秋霞电影一区二区| 欧美一卡2卡3卡4卡| 日日摸夜夜添夜夜添精品视频| 欧美三级蜜桃2在线观看| 亚洲一区二区三区国产| 在线视频国内自拍亚洲视频| 一区二区日韩av| 欧美天堂亚洲电影院在线播放| 亚洲激情中文1区| 欧美日韩免费电影| 午夜精品久久久久久久99水蜜桃| 538在线一区二区精品国产| 日本成人在线不卡视频| 日韩一级高清毛片| 国产老女人精品毛片久久| 亚洲国产精品成人综合色在线婷婷 | 国产欧美日韩不卡| 激情综合一区二区三区| 国产日产欧美一区二区视频| 成人sese在线| 亚洲日本乱码在线观看| 欧美午夜精品久久久| 婷婷国产v国产偷v亚洲高清| 欧美一区二区私人影院日本| 国产永久精品大片wwwapp| 欧美国产精品v| 91极品美女在线| 免费观看在线综合| 国产午夜精品福利| 丰满少妇在线播放bd日韩电影| 中文字幕在线一区二区三区| 在线亚洲欧美专区二区| 日本vs亚洲vs韩国一区三区二区| 2020国产精品自拍| 99热国产精品| 日日夜夜一区二区| 国产欧美日韩精品一区| 91久久精品网| 国内精品伊人久久久久av一坑| 国产精品福利一区| 欧美日韩久久久| 国产 日韩 欧美大片| 亚洲一区二区三区四区在线| 精品国产三级电影在线观看| 成人黄页在线观看| 亚洲一级电影视频| 精品1区2区在线观看| 91丨九色丨国产丨porny| 日本不卡1234视频| 亚洲色图第一区| 日韩一级二级三级| 一本一道久久a久久精品 | 亚洲青青青在线视频| 91精品国产色综合久久不卡电影| 国产黑丝在线一区二区三区| 亚洲成av人影院在线观看网| 久久久久国色av免费看影院| 91免费看片在线观看| 精品在线一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 久久精品视频一区| 欧美狂野另类xxxxoooo| jvid福利写真一区二区三区| 久久精品国产色蜜蜜麻豆| 亚洲美女视频一区|