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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? d_net.c

?? 游戲類程序源代碼---WinDoom 3D源程序.zip
?? C
?? 第 1 頁 / 共 2 頁
字號:
// 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:
//	DOOM Network game communication and protocol,
//	all OS independend parts.
//
//-----------------------------------------------------------------------------


static const char rcsid[] = "$Id: d_net.c,v 1.3 1997/02/03 22:01:47 b1 Exp $";

#include <windows.h>

#include "m_menu.h"
#include "i_system.h"
#include "i_video.h"
#include "i_net.h"
#include "g_game.h"
#include "doomdef.h"
#include "doomstat.h"

#include "d_console.h"

void WriteDebug(char *);

#define	NCMD_EXIT		0x80000000
#define	NCMD_RETRANSMIT		0x40000000
#define	NCMD_SETUP		0x20000000
#define	NCMD_KILL		0x10000000	// kill game
#define	NCMD_CHECKSUM	 	0x0fffffff

 
doomcom_t*	doomcom;	
doomdata_t*	netbuffer;		// points inside doomcom

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

//
// NETWORKING
//
// gametic is the tic about to (or currently being) run
// maketic is the tick that hasn't had control made for it yet
// nettics[] has the maketics for all players 
//
// a gametic cannot be run until nettics[] > gametic for all players
//
#define	RESENDCOUNT	10
#define	PL_DRONE	0x80	// bit flag in doomdata->player

ticcmd_t	localcmds[BACKUPTICS];

ticcmd_t        netcmds[MAXPLAYERS][BACKUPTICS];
int         	nettics[MAXNETNODES];
boolean		nodeingame[MAXNETNODES];		// set false as nodes leave game
boolean		remoteresend[MAXNETNODES];		// set when local needs tics
int		resendto[MAXNETNODES];			// set when remote needs tics
int		resendcount[MAXNETNODES];

int		nodeforplayer[MAXPLAYERS];

int             maketic;
int		lastnettic;
int		skiptics;
int		ticdup;		
int		maxsend;	// BACKUPTICS/(2*ticdup)-1


void D_ProcessEvents (void); 
void G_BuildTiccmd (ticcmd_t *cmd); 
void D_DoAdvanceDemo (void);
 
boolean		reboundpacket;
doomdata_t	reboundstore;

// DQ start addition 
extern long ScreensYLookup[];
extern BUFFER gRenderBuffer;
extern byte *screens[5];
extern BOOL bInGame; 
// DQ end addition

void  HandleKeyboard(void);

//
//
//
int NetbufferSize (void)
{
    return (int)&(((doomdata_t *)0)->cmds[netbuffer->numtics]); 
}

//
// Checksum 
//
unsigned NetbufferChecksum (void)
{
    unsigned		c;
    int		i,l;

    c = 0x1234567;

    // FIXME -endianess?
#ifdef NORMALUNIX
    return 0;			// byte order problems
#endif

    l = (NetbufferSize () - (int)&(((doomdata_t *)0)->retransmitfrom))/4;
    for (i=0 ; i<l ; i++)
	c += ((unsigned *)&netbuffer->retransmitfrom)[i] * (i+1);

    return c & NCMD_CHECKSUM;
}

//
//
//
int ExpandTics (int low)
{
    int	delta;
	
    delta = low - (maketic&0xff);
	
    if (delta >= -64 && delta <= 64)
	return (maketic&~0xff) + low;
    if (delta > 64)
	return (maketic&~0xff) - 256 + low;
    if (delta < -64)
	return (maketic&~0xff) + 256 + low;
		
    I_Error ("ExpandTics: strange value %i at maketic %i",low,maketic);
    return 0;
}



//
// HSendPacket
//
void HSendPacket(int node, int flags )
   {
    netbuffer->checksum = NetbufferChecksum () | flags;

    if (!node)
       {
        reboundstore = *netbuffer;
        reboundpacket = true;
        return;
       }

    if (demoplayback)
        return;

    if (!netgame)
        I_Error ("Tried to transmit to another node");
		
    doomcom->command = CMD_SEND;
    doomcom->remotenode = node;
    doomcom->datalength = NetbufferSize ();
	
    if (debugfile)
    {
	int		i;
	int		realretrans;
	if (netbuffer->checksum & NCMD_RETRANSMIT)
	    realretrans = ExpandTics (netbuffer->retransmitfrom);
	else
	    realretrans = -1;

	sprintf (MsgText,"send (%i + %i, R %i) [%i] ",
		 ExpandTics(netbuffer->starttic),
		 netbuffer->numtics, realretrans, doomcom->datalength);
    WriteDebug(MsgText);
	
	for (i=0 ; i<doomcom->datalength ; i++)
       {
	    sprintf (MsgText,"%i ",((byte *)netbuffer)[i]);
        WriteDebug(MsgText);
       }

	sprintf (MsgText,"\n");
    WriteDebug(MsgText);
    }

    I_NetCmd ();
}

//
// HGetPacket
// Returns false if no packet is waiting
//
boolean HGetPacket (void)
{	
    if (reboundpacket)
    {
	*netbuffer = reboundstore;
	doomcom->remotenode = 0;
	reboundpacket = false;
	return true;
    }

    if (!netgame)
	return false;

    if (demoplayback)
	return false;
		
    doomcom->command = CMD_GET;
    I_NetCmd ();
    
    if (doomcom->remotenode == -1)
	return false;

    if (doomcom->datalength != NetbufferSize ())
    {
	if (debugfile)
	    fprintf (debugfile,"bad packet length %i\n",doomcom->datalength);
	return false;
    }
	
    if (NetbufferChecksum () != (netbuffer->checksum&NCMD_CHECKSUM) )
    {
	if (debugfile)
	    fprintf (debugfile,"bad packet checksum\n");
	return false;
    }

    if (debugfile)
    {
	int		realretrans;
	int	i;
			
	if (netbuffer->checksum & NCMD_SETUP)
	    fprintf (debugfile,"setup packet\n");
	else
	{
	    if (netbuffer->checksum & NCMD_RETRANSMIT)
		realretrans = ExpandTics (netbuffer->retransmitfrom);
	    else
		realretrans = -1;
	    
	    fprintf (debugfile,"get %i = (%i + %i, R %i)[%i] ",
		     doomcom->remotenode,
		     ExpandTics(netbuffer->starttic),
		     netbuffer->numtics, realretrans, doomcom->datalength);

	    for (i=0 ; i<doomcom->datalength ; i++)
		fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
	    fprintf (debugfile,"\n");
	}
    }
    return true;	
}


//
// GetPackets
//
char    exitmsg[80];

void GetPackets (void)
{
    int		netconsole;
    int		netnode;
    ticcmd_t	*src, *dest;
    int		realend;
    int		realstart;
				 
    while ( HGetPacket() )
    {
	if (netbuffer->checksum & NCMD_SETUP)
	    continue;		// extra setup packet
			
	netconsole = netbuffer->player & ~PL_DRONE;
	netnode = doomcom->remotenode;
	
	// to save bytes, only the low byte of tic numbers are sent
	// Figure out what the rest of the bytes are
	realstart = ExpandTics (netbuffer->starttic);		
	realend = (realstart+netbuffer->numtics);
	
	// check for exiting the game
	if (netbuffer->checksum & NCMD_EXIT)
	{
	    if (!nodeingame[netnode])
		continue;
	    nodeingame[netnode] = false;
	    playeringame[netconsole] = false;
	    strcpy (exitmsg, "Player 1 left the game");
	    exitmsg[7] += netconsole;
	    players[consoleplayer].message = exitmsg;
	    if (demorecording)
		G_CheckDemoStatus ();
	    continue;
	}
	
	// check for a remote game kill
	if (netbuffer->checksum & NCMD_KILL)
	    I_Error ("Killed by network driver");

	nodeforplayer[netconsole] = netnode;
	
	// check for retransmit request
	if ( resendcount[netnode] <= 0 
	     && (netbuffer->checksum & NCMD_RETRANSMIT) )
	{
	    resendto[netnode] = ExpandTics(netbuffer->retransmitfrom);
	    if (debugfile)
		fprintf (debugfile,"retransmit from %i\n", resendto[netnode]);
	    resendcount[netnode] = RESENDCOUNT;
	}
	else
	    resendcount[netnode]--;
	
	// check for out of order / duplicated packet		
	if (realend == nettics[netnode])
	    continue;
			
	if (realend < nettics[netnode])
	{
	    if (debugfile)
		fprintf (debugfile,
			 "out of order packet (%i + %i)\n" ,
			 realstart,netbuffer->numtics);
	    continue;
	}
	
	// check for a missed packet
	if (realstart > nettics[netnode])
	{
	    // stop processing until the other system resends the missed tics
	    if (debugfile)
		fprintf (debugfile,
			 "missed tics from %i (%i - %i)\n",
			 netnode, realstart, nettics[netnode]);
	    remoteresend[netnode] = true;
	    continue;
	}

	// update command store from the packet
        {
	    int		start;

	    remoteresend[netnode] = false;
		
	    start = nettics[netnode] - realstart;		
	    src = &netbuffer->cmds[start];

	    while (nettics[netnode] < realend)
	    {
		dest = &netcmds[netconsole][nettics[netnode]%BACKUPTICS];
		nettics[netnode]++;
		*dest = *src;
		src++;
	    }
	}
    }
}


//
// NetUpdate
// Builds ticcmds for console player,
// sends out a packet
//
int      gametime;

void NetUpdate (void)
{
    int             nowtime;
    int             newtics;
    int				i,j;
    int				realstart;
    int				gameticdiv;
    
    // check time
    nowtime = I_GetTime ()/ticdup;
    newtics = nowtime - gametime;
    gametime = nowtime;
	
    if (newtics <= 0) 	// nothing new to update
	goto listen; 

    if (skiptics <= newtics)
    {
	newtics -= skiptics;
	skiptics = 0;
    }
    else
    {
	skiptics -= newtics;
	newtics = 0;
    }
	
		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美另类变人与禽xxxxx| 日韩一区二区不卡| 日韩一区二区三区在线观看| 久久综合九色综合97婷婷| 亚洲三级免费观看| 精品在线亚洲视频| 欧美男同性恋视频网站| 国产精品黄色在线观看| 激情av综合网| 91麻豆精品国产91久久久更新时间| 欧美韩国日本不卡| 国产一区二区三区高清播放| 欧美日高清视频| 亚洲人成网站精品片在线观看| 国产一区二区日韩精品| 欧美男人的天堂一二区| 亚洲乱码中文字幕| 成人免费视频app| 久久精子c满五个校花| 秋霞电影网一区二区| 欧美日韩国产系列| 亚洲国产综合人成综合网站| 色先锋资源久久综合| 国产精品的网站| 成+人+亚洲+综合天堂| 久久精品亚洲乱码伦伦中文| 免费的国产精品| 日韩欧美aaaaaa| 另类欧美日韩国产在线| 日韩欧美国产午夜精品| 秋霞午夜av一区二区三区| 欧美久久久久免费| 亚洲va欧美va人人爽| 欧美日韩国产综合视频在线观看| 一区二区久久久| 欧美在线短视频| 性感美女极品91精品| 欧美电影在线免费观看| 日本中文在线一区| 精品国产免费一区二区三区四区| 美女视频黄久久| 精品国产免费视频| 高清视频一区二区| 日韩理论电影院| 欧美在线视频不卡| 日韩高清不卡一区| 日韩久久久精品| 成人美女视频在线观看18| 亚洲欧洲美洲综合色网| 欧美午夜精品一区| 美女国产一区二区三区| 久久久久久久久久久久电影| 不卡一区二区在线| 亚洲国产人成综合网站| 欧美变态口味重另类| 欧美一区欧美二区| 精品写真视频在线观看| 亚洲国产精品成人综合| 色婷婷综合五月| 全国精品久久少妇| 国产精品夫妻自拍| 欧美喷水一区二区| 国产成人av电影在线播放| 亚洲摸摸操操av| 欧美一区二区私人影院日本| 成人午夜激情片| 亚洲成av人片一区二区三区| 久久久久久久国产精品影院| 91亚洲国产成人精品一区二三| 午夜精品影院在线观看| 久久久久久电影| 91黄色激情网站| 国产一区二区在线观看免费| 亚洲欧洲综合另类| 欧美变态tickle挠乳网站| 色综合婷婷久久| 国产一区二区视频在线播放| 亚洲女与黑人做爰| 精品电影一区二区| 欧美亚洲自拍偷拍| 国产91精品精华液一区二区三区| 亚洲二区在线视频| 中文字幕免费一区| 日韩欧美视频一区| 欧洲视频一区二区| 成人妖精视频yjsp地址| 毛片av一区二区三区| 亚洲一区二区欧美日韩| 久久久久久久国产精品影院| 欧美浪妇xxxx高跟鞋交| 成人国产精品免费观看动漫| 蜜桃av噜噜一区| 亚洲午夜视频在线观看| 中文字幕中文字幕一区| 久久久久久久久久看片| 欧美一区二区在线不卡| 欧美日韩亚洲综合在线| 一本一道久久a久久精品| 成人小视频免费观看| 美腿丝袜亚洲三区| 日本va欧美va欧美va精品| 亚洲一区欧美一区| 亚洲欧美日韩国产中文在线| 国产精品色呦呦| 国产亚洲精品7777| 久久免费国产精品| 精品久久一区二区三区| 欧美大胆人体bbbb| 日韩欧美久久一区| 日韩亚洲欧美高清| 日韩欧美国产三级电影视频| 欧美一级理论性理论a| 777久久久精品| 日韩一区二区精品| 精品国精品自拍自在线| 日韩精品影音先锋| 久久影院午夜片一区| 2024国产精品| 久久久久久99久久久精品网站| 26uuu成人网一区二区三区| 亚洲精品在线三区| 国产欧美在线观看一区| 久久精品人人做人人综合 | 久久综合国产精品| 欧美大片拔萝卜| www国产成人免费观看视频 深夜成人网| 欧美一区二区三区免费| xvideos.蜜桃一区二区| 国产欧美日韩综合| 亚洲欧美日韩在线播放| 亚洲一区在线观看视频| 视频一区二区三区中文字幕| 日韩精品乱码免费| 韩日精品视频一区| 成人国产精品免费网站| 欧美最猛性xxxxx直播| 欧美一区二区三区四区在线观看| 精品福利在线导航| 国产精品青草久久| 亚洲一区二区三区四区五区黄| 亚洲第一福利一区| 久久国产剧场电影| 成人综合婷婷国产精品久久| 在线观看一区日韩| 91精品国产综合久久国产大片| 久久九九国产精品| 亚洲制服欧美中文字幕中文字幕| 日产国产高清一区二区三区| 成人久久久精品乱码一区二区三区| 色999日韩国产欧美一区二区| 欧美精品第1页| 久久精品人人做人人爽人人| 一区二区三区电影在线播| 麻豆视频一区二区| 不卡一二三区首页| 欧美一区二区网站| 亚洲欧美色图小说| 久久国产精品99久久人人澡| 色综合天天狠狠| 久久夜色精品国产欧美乱极品| 亚洲欧美日韩成人高清在线一区| 久久国产欧美日韩精品| 色噜噜狠狠色综合欧洲selulu| 欧美电影精品一区二区| 一区二区在线观看视频在线观看| 国产一区二区三区在线看麻豆| 91国产成人在线| 欧美国产日本视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 91社区在线播放| 久久亚洲综合av| 奇米色一区二区| 在线欧美日韩国产| 国产精品剧情在线亚洲| 久久99国产精品久久99| 在线观看成人小视频| 中文字幕亚洲一区二区va在线| 精品中文字幕一区二区小辣椒| 欧美午夜不卡在线观看免费| 国产精品久久久久永久免费观看| 久久精品国产精品青草| 欧美视频一区在线| 亚洲六月丁香色婷婷综合久久| 国产精品一区二区你懂的| 日韩一级片网站| 五月天激情小说综合| 91国产丝袜在线播放| 日韩理论片中文av| av不卡在线观看| 国产精品亲子乱子伦xxxx裸| 精品写真视频在线观看 | 亚洲va国产天堂va久久en| 91网上在线视频| 中文字幕日韩精品一区 | 91一区二区三区在线播放| 国产三级欧美三级日产三级99 | 一区二区三区高清在线| 91网站黄www| 亚洲精品自拍动漫在线| 色婷婷综合久久久中文字幕|