Iskhodnyy_kod_Doom
.pdfplr->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