Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Iskhodnyy_kod_Doom

.pdf
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
1.01 Mб
Скачать

plr->message = HUSTR_TALKTOSELF1; else if (num_nobrainers < 6)

plr->message = HUSTR_TALKTOSELF2; else if (num_nobrainers < 9)

plr->message = HUSTR_TALKTOSELF3; else if (num_nobrainers < 32)

plr->message = HUSTR_TALKTOSELF4;

else

plr->message = HUSTR_TALKTOSELF5;

}

}

}

}

}

else

{

c = ev->data1; // send a macro if (altdown)

{

c = c - ’0’; if (c > 9)

return false;

//fprintf(stderr, "got here\n"); macromessage = chat_macros[c];

//kill last message with a ’\n’

HU_queueChatChar(KEY_ENTER); // DEBUG!!!

//send the macro message while (*macromessage)

HU_queueChatChar(*macromessage++); HU_queueChatChar(KEY_ENTER);

//leave chat mode and notify that it was sent chat_on = false;

strcpy(lastmessage, chat_macros[c]); plr->message = lastmessage;

eatkey = true;

}

else

{

if (french)

c = ForeignTranslation(c);

if (shiftdown || (c >= ’a’ && c <= ’z’)) c = shiftxform[c];

eatkey = HUlib_keyInIText(&w_chat, c); if (eatkey)

{

//static unsigned char buf[20]; // DEBUG HU_queueChatChar(c);

//sprintf(buf, "KEY: %d => %d", ev->data1, c);

//plr->message = buf;

}

if (c == KEY_ENTER)

{

chat_on = false; if (w_chat.l.len)

{

strcpy(lastmessage, w_chat.l.l); plr->message = lastmessage;

}

}

else if (c == KEY_ESCAPE)

171

chat_on = false;

}

}

return eatkey;

}

6.4hu stu .h

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//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.

//

// DESCRIPTION: Head up display

//

//-----------------------------------------------------------------------------

#ifndef __HU_STUFF_H__ #define __HU_STUFF_H__

#include "d_event.h"

//

 

 

// Globally visible constants.

 

//

 

 

#define HU_FONTSTART

’!’

// the first font characters

#define HU_FONTEND

’_’

// the last font characters

// Calculate # of glyphs in font.

 

#define HU_FONTSIZE

(HU_FONTEND - HU_FONTSTART + 1)

#define HU_BROADCAST

5

 

#define HU_MSGREFRESH

KEY_ENTER

#define HU_MSGX

0

 

#define HU_MSGY

0

 

#define HU_MSGWIDTH

64

// in characters

#define HU_MSGHEIGHT

1

// in lines

#define HU_MSGTIMEOUT

(4*TICRATE)

//

 

 

// HEADS UP TEXT

//

void HU_Init(void); void HU_Start(void);

boolean HU_Responder(event_t* ev);

172

void HU_Ticker(void); void HU_Drawer(void);

char HU_dequeueChatChar(void); void HU_Erase(void);

#endif //-----------------------------------------------------------------------------

//

// $Log:$

//

//-----------------------------------------------------------------------------

7 System-specific code

7.1 i main.c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//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:$

//DESCRIPTION:

//Main program, simply calls D_DoomMain high level loop.

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: i_main.c,v 1.4 1997/02/03 22:45:10 b1 Exp $";

#include "doomdef.h"

#include "m_argv.h" #include "d_main.h"

int

 

main

 

( int

argc,

char**

argv )

{

 

myargc = argc; myargv = argv;

D_DoomMain ();

return 0;

}

173

7.2 i net.c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//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:$

//DESCRIPTION:

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $";

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

#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <unistd.h> #include <netdb.h> #include <sys/ioctl.h>

#include "i_system.h" #include "d_event.h" #include "d_net.h"

#include "m_argv.h"

#include "doomstat.h"

#ifdef __GNUG__

#pragma implementation "i_net.h" #endif

#include "i_net.h"

// For some odd reason...

 

 

 

 

#define ntohl(x) \

 

 

 

 

 

((unsigned

long int)((((unsigned long int)(x) &

0x000000ffU)

<< 24)

| \

 

(((unsigned long int)(x) &

0x0000ff00U)

<<

8)

| \

 

(((unsigned long int)(x) &

0x00ff0000U)

>>

8)

| \

 

(((unsigned long int)(x) &

0xff000000U)

>> 24)))

#define ntohs(x) \

 

 

 

 

 

((unsigned

short int)((((unsigned short int)(x)

& 0x00ff) <<

8)

| \

 

 

(((unsigned short int)(x)

& 0xff00) >>

8))) \

 

174

#define htonl(x) ntohl(x) #define htons(x) ntohs(x)

void

NetSend (void);

 

boolean NetListen (void);

 

//

 

 

// NETWORKING

 

//

 

 

int

DOOMPORT =

(IPPORT_USERRESERVED +0x1d );

int

 

sendsocket;

int

 

insocket;

struct

sockaddr_in

sendaddress[MAXNETNODES];

void

(*netget) (void);

void

(*netsend) (void);

//

 

 

// UDPsocket

 

//

 

 

int UDPsocket (void)

 

{

 

 

int

s;

 

// allocate a socket

s = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s<0)

I_Error ("can’t create socket: %s",strerror(errno));

return s;

}

//

 

 

// BindToLocalPort

 

//

 

 

void

 

 

BindToLocalPort

 

( int

s,

 

int

port )

 

{

 

 

int

 

v;

struct sockaddr_in

address;

memset (&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = port;

v = bind (s, (void *)&address, sizeof(address)); if (v == -1)

I_Error ("BindToPort: bind: %s", strerror(errno));

}

//

// PacketSend

//

void PacketSend (void)

{

175

int

c;

doomdata_t

sw;

// byte swap

sw.checksum = htonl(netbuffer->checksum); sw.player = netbuffer->player; sw.retransmitfrom = netbuffer->retransmitfrom; sw.starttic = netbuffer->starttic;

sw.numtics = netbuffer->numtics;

for (c=0 ; c< netbuffer->numtics ; c++)

{

sw.cmds[c].forwardmove = netbuffer->cmds[c].forwardmove; sw.cmds[c].sidemove = netbuffer->cmds[c].sidemove; sw.cmds[c].angleturn = htons(netbuffer->cmds[c].angleturn); sw.cmds[c].consistancy = htons(netbuffer->cmds[c].consistancy); sw.cmds[c].chatchar = netbuffer->cmds[c].chatchar; sw.cmds[c].buttons = netbuffer->cmds[c].buttons;

}

//printf ("sending %i\n",gametic);

c = sendto (sendsocket , &sw, doomcom->datalength ,0,(void *)&sendaddress[doomcom->remotenode] ,sizeof(sendaddress[doomcom->remotenode]));

//if (c == -1)

//

I_Error ("SendPacket error: %s",strerror(errno));

}

 

//

 

// PacketGet

 

//

 

void PacketGet (void)

 

{

 

int

i;

int

c;

struct sockaddr_in

fromaddress;

int

fromlen;

doomdata_t

sw;

fromlen = sizeof(fromaddress);

c = recvfrom (insocket, &sw, sizeof(sw), 0

, (struct sockaddr *)&fromaddress, &fromlen );

if (c == -1 )

{

if (errno != EWOULDBLOCK)

I_Error ("GetPacket: %s",strerror(errno));

doomcom->remotenode = -1;

// no packet

return;

 

}

 

{

static int first=1; if (first)

printf("len=%d:p=[0x%x 0x%x] \n", c, *(int*)&sw, *((int*)&sw+1)); first = 0;

}

// find remote node number

for (i=0 ; i<doomcom->numnodes ; i++)

if ( fromaddress.sin_addr.s_addr == sendaddress[i].sin_addr.s_addr ) break;

if (i == doomcom->numnodes)

{

176

// packet is not from one of the players (new game broadcast) doomcom->remotenode = -1; // no packet

return;

}

 

 

doomcom->remotenode

= i;

// good packet from a game player

doomcom->datalength

= c;

 

// byte swap

 

 

netbuffer->checksum

= ntohl(sw.checksum);

 

netbuffer->player =

sw.player;

 

netbuffer->retransmitfrom = sw.retransmitfrom;

 

netbuffer->starttic

= sw.starttic;

 

netbuffer->numtics = sw.numtics;

 

for (c=0 ; c< netbuffer->numtics ; c++)

{

netbuffer->cmds[c].forwardmove = sw.cmds[c].forwardmove; netbuffer->cmds[c].sidemove = sw.cmds[c].sidemove; netbuffer->cmds[c].angleturn = ntohs(sw.cmds[c].angleturn); netbuffer->cmds[c].consistancy = ntohs(sw.cmds[c].consistancy); netbuffer->cmds[c].chatchar = sw.cmds[c].chatchar; netbuffer->cmds[c].buttons = sw.cmds[c].buttons;

}

}

int GetLocalAddress (void)

 

{

 

 

char

hostname[1024];

 

struct hostent*

hostentry;

// host information entry

int

v;

 

// get local address

v = gethostname (hostname, sizeof(hostname)); if (v == -1)

I_Error ("GetLocalAddress : gethostname: errno %d",errno);

hostentry = gethostbyname (hostname); if (!hostentry)

I_Error ("GetLocalAddress : gethostbyname: couldn’t get local host");

return *(int *)hostentry->h_addr_list[0];

}

 

 

//

 

 

// I_InitNetwork

 

 

//

 

 

void I_InitNetwork (void)

 

 

{

 

 

boolean

trueval = true;

 

int

i;

 

int

p;

 

struct hostent*

hostentry;

// host information entry

doomcom = malloc (sizeof (*doomcom) ); memset (doomcom, 0, sizeof(*doomcom) );

// set up for network

i = M_CheckParm ("-dup"); if (i && i< myargc-1)

{

doomcom->ticdup = myargv[i+1][0]-’0’;

177

if (doomcom->ticdup < 1) doomcom->ticdup = 1; if (doomcom->ticdup > 9) doomcom->ticdup = 9;

}

else

doomcom-> ticdup = 1;

if (M_CheckParm ("-extratic")) doomcom-> extratics = 1;

else

doomcom-> extratics = 0;

p = M_CheckParm ("-port"); if (p && p<myargc-1)

{

DOOMPORT = atoi (myargv[p+1]);

printf ("using alternate port %i\n",DOOMPORT);

}

//parse network game options,

//-net <consoleplayer> <host> <host> ...

i = M_CheckParm ("-net"); if (!i)

{

// single player game netgame = false; doomcom->id = DOOMCOM_ID;

doomcom->numplayers = doomcom->numnodes = 1; doomcom->deathmatch = false; doomcom->consoleplayer = 0;

return;

}

netsend = PacketSend; netget = PacketGet; netgame = true;

// parse player number and host list doomcom->consoleplayer = myargv[i+1][0]-’1’;

doomcom->numnodes = 1;

// this node for sure

i++;

while (++i < myargc && myargv[i][0] != ’-’)

{

sendaddress[doomcom->numnodes].sin_family = AF_INET; sendaddress[doomcom->numnodes].sin_port = htons(DOOMPORT); if (myargv[i][0] == ’.’)

{

sendaddress[doomcom->numnodes].sin_addr.s_addr = inet_addr (myargv[i]+1);

}

else

{

hostentry = gethostbyname (myargv[i]); if (!hostentry)

I_Error ("gethostbyname: couldn’t find %s", myargv[i]); sendaddress[doomcom->numnodes].sin_addr.s_addr

= *(int *)hostentry->h_addr_list[0];

}

doomcom->numnodes++;

}

doomcom->id = DOOMCOM_ID;

178

doomcom->numplayers = doomcom->numnodes;

// build message to receive insocket = UDPsocket ();

BindToLocalPort (insocket,htons(DOOMPORT)); ioctl (insocket, FIONBIO, &trueval);

sendsocket = UDPsocket ();

}

void I_NetCmd (void)

{

if (doomcom->command == CMD_SEND)

{

netsend ();

}

else if (doomcom->command == CMD_GET)

{

netget ();

}

else

I_Error ("Bad net cmd: %i\n",doomcom->command);

}

7.3i net.h

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//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.

//

//DESCRIPTION:

//System specific network interface stuff.

//-----------------------------------------------------------------------------

#ifndef __I_NET__ #define __I_NET__

#ifdef __GNUG__ #pragma interface #endif

// Called by D_DoomMain.

void I_InitNetwork (void);

179

void I_NetCmd (void);

#endif //-----------------------------------------------------------------------------

//

// $Log:$

//

//-----------------------------------------------------------------------------

7.4 i sound.c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//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:$

//DESCRIPTION:

//System interface for sound.

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: i_unix.c,v 1.5 1997/02/03 22:45:10 b1 Exp $";

#include <stdio.h> #include <stdlib.h> #include <stdarg.h>

#include <math.h>

#include <sys/time.h> #include <sys/types.h>

#ifndef LINUX #include <sys/filio.h> #endif

#include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h>

//Linux voxware output. #include <linux/soundcard.h>

//Timer stuff. Experimental. #include <time.h>

#include <signal.h>

#include "z_zone.h"

180

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]