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

Iskhodnyy_kod_Doom

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

#include

"s_sound.h"

#include

"doomstat.h"

// Data.

 

#include

"dstrings.h"

#include

"sounds.h"

//

 

// Locally used constants, shortcuts.

//

 

 

#define HU_TITLE

(mapnames[(gameepisode-1)*9+gamemap-1])

#define HU_TITLE2

(mapnames2[gamemap-1])

#define HU_TITLEP

(mapnamesp[gamemap-1])

#define HU_TITLET

(mapnamest[gamemap-1])

#define HU_TITLEHEIGHT

1

#define HU_TITLEX

0

#define HU_TITLEY

(167 - SHORT(hu_font[0]->height))

#define HU_INPUTTOGGLE

’t’

#define HU_INPUTX

HU_MSGX

#define HU_INPUTY

(HU_MSGY + HU_MSGHEIGHT*(SHORT(hu_font[0]->height) +1))

#define HU_INPUTWIDTH

64

#define HU_INPUTHEIGHT

1

char*

chat_macros[] =

{

 

 

HUSTR_CHATMACRO0,

HUSTR_CHATMACRO1,

HUSTR_CHATMACRO2,

HUSTR_CHATMACRO3,

HUSTR_CHATMACRO4,

HUSTR_CHATMACRO5,

HUSTR_CHATMACRO6,

HUSTR_CHATMACRO7,

HUSTR_CHATMACRO8,

HUSTR_CHATMACRO9

};

char*

player_names[] =

{

 

 

HUSTR_PLRGREEN,

 

HUSTR_PLRINDIGO,

 

HUSTR_PLRBROWN,

 

HUSTR_PLRRED

 

};

 

 

char

 

chat_char; // remove later.

static player_t*

plr;

patch_t*

 

hu_font[HU_FONTSIZE];

static hu_textline_t

w_title;

boolean

 

chat_on;

static hu_itext_t

w_chat;

static boolean

always_off = false;

static char

 

chat_dest[MAXPLAYERS];

static hu_itext_t w_inputbuffer[MAXPLAYERS];

static boolean

message_on;

boolean

 

message_dontfuckwithme;

static boolean

message_nottobefuckedwith;

static hu_stext_t

w_message;

161

static int

message_counter;

extern int

showMessages;

extern

boolean

automapactive;

static

boolean

headsupactive = false;

//

//Builtin map names.

//The actual names can be found in DStrings.h.

char*

mapnames[] =

{

 

HUSTR_E1M1,

HUSTR_E1M2,

HUSTR_E1M3,

HUSTR_E1M4,

HUSTR_E1M5,

HUSTR_E1M6,

HUSTR_E1M7,

HUSTR_E1M8,

HUSTR_E1M9,

HUSTR_E2M1,

HUSTR_E2M2,

HUSTR_E2M3,

HUSTR_E2M4,

HUSTR_E2M5,

HUSTR_E2M6,

HUSTR_E2M7,

HUSTR_E2M8,

HUSTR_E2M9,

HUSTR_E3M1,

HUSTR_E3M2,

HUSTR_E3M3,

HUSTR_E3M4,

HUSTR_E3M5,

HUSTR_E3M6,

HUSTR_E3M7,

HUSTR_E3M8,

HUSTR_E3M9,

HUSTR_E4M1,

HUSTR_E4M2,

HUSTR_E4M3,

HUSTR_E4M4,

HUSTR_E4M5,

HUSTR_E4M6,

HUSTR_E4M7,

HUSTR_E4M8,

HUSTR_E4M9,

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL",

"NEWLEVEL"

};

// DOOM shareware/registered/retail (Ultimate) names.

162

char*

mapnames2[] =

{

 

HUSTR_1,

HUSTR_2,

HUSTR_3,

HUSTR_4,

HUSTR_5,

HUSTR_6,

HUSTR_7,

HUSTR_8,

HUSTR_9,

HUSTR_10,

HUSTR_11,

HUSTR_12,

HUSTR_13,

HUSTR_14,

HUSTR_15,

HUSTR_16,

HUSTR_17,

HUSTR_18,

HUSTR_19,

HUSTR_20,

HUSTR_21,

HUSTR_22,

HUSTR_23,

HUSTR_24,

HUSTR_25,

HUSTR_26,

HUSTR_27,

HUSTR_28,

HUSTR_29,

HUSTR_30,

HUSTR_31,

HUSTR_32

};

char*

mapnamesp[] =

{

 

PHUSTR_1,

PHUSTR_2,

PHUSTR_3,

PHUSTR_4,

PHUSTR_5,

PHUSTR_6,

PHUSTR_7,

PHUSTR_8,

PHUSTR_9,

PHUSTR_10,

PHUSTR_11,

PHUSTR_12,

PHUSTR_13,

PHUSTR_14,

PHUSTR_15,

PHUSTR_16,

PHUSTR_17,

PHUSTR_18,

PHUSTR_19,

PHUSTR_20,

PHUSTR_21,

// DOOM 2 map names.

// Plutonia WAD map names.

163

PHUSTR_22,

PHUSTR_23,

PHUSTR_24,

PHUSTR_25,

PHUSTR_26,

PHUSTR_27,

PHUSTR_28,

PHUSTR_29,

PHUSTR_30,

PHUSTR_31,

PHUSTR_32

};

char *mapnamest[] =

{

THUSTR_1,

THUSTR_2,

THUSTR_3,

THUSTR_4,

THUSTR_5,

THUSTR_6,

THUSTR_7,

THUSTR_8,

THUSTR_9,

THUSTR_10,

THUSTR_11,

THUSTR_12,

THUSTR_13,

THUSTR_14,

THUSTR_15,

THUSTR_16,

THUSTR_17,

THUSTR_18,

THUSTR_19,

THUSTR_20,

THUSTR_21,

THUSTR_22,

THUSTR_23,

THUSTR_24,

THUSTR_25,

THUSTR_26,

THUSTR_27,

THUSTR_28,

THUSTR_29,

THUSTR_30,

THUSTR_31,

THUSTR_32

};

// TNT WAD map names.

const char*

 

 

shiftxform;

 

const char french_shiftxform[] =

{

 

 

 

 

 

 

 

 

0,

 

 

 

 

 

 

 

 

1,

2, 3,

4,

5,

6,

7, 8,

9,

10,

11,

12,

13,

14,

15,

16,

17,

18, 19, 20,

21,

22,

23,

24,

25,

26,

27,

28, 29, 30,

31,

 

 

 

 

 

 

 

 

’ ’, ’!’, ’"’,

’#’,

’$’, ’%’, ’&’,

’"’, //

shift-’

 

 

 

 

 

’(’, ’)’, ’*’,

’+’,

 

 

 

164

’?’, // shift-, ’_’, // shift-- ’>’, // shift-. ’?’, // shift-/ ’0’, // shift-0 ’1’, // shift-1 ’2’, // shift-2 ’3’, // shift-3 ’4’, // shift-4 ’5’, // shift-5 ’6’, // shift-6 ’7’, // shift-7 ’8’, // shift-8 ’9’, // shift-9 ’/’,

’.’, // shift-; ’<’,

’+’, // shift-= ’>’, ’?’, ’@’,

’A’, ’B’, ’C’, ’D’, ’E’, ’F’, ’G’, ’H’, ’I’, ’J’, ’K’, ’L’, ’M’, ’N’, ’O’, ’P’, ’Q’, ’R’, ’S’, ’T’, ’U’, ’V’, ’W’, ’X’, ’Y’, ’Z’,

’[’, // shift-[

’!’, // shift-backslash - OH MY GOD DOES WATCOM SUCK ’]’, // shift-]

’"’, ’_’,

’\’’, // shift-‘

’A’, ’B’, ’C’, ’D’, ’E’, ’F’, ’G’, ’H’, ’I’, ’J’, ’K’, ’L’, ’M’, ’N’, ’O’, ’P’, ’Q’, ’R’, ’S’, ’T’, ’U’, ’V’, ’W’, ’X’, ’Y’, ’Z’,

’{’, ’|’, ’}’, ’~’, 127

};

const char english_shiftxform[] =

{

0,

 

 

 

 

 

 

 

 

1,

2, 3,

4,

5,

6,

7, 8,

9,

10,

11,

12,

13,

14,

15,

16,

17,

18, 19, 20,

21,

22,

23,

24,

25,

26,

27,

28, 29, 30,

31,

 

 

 

 

 

 

 

 

’ ’, ’!’, ’"’, ’#’, ’$’, ’%’, ’&’,

’"’, //

shift-’

 

 

 

 

 

’(’, ’)’, ’*’, ’+’,

 

 

 

’<’, //

shift-,

 

 

 

 

 

’_’, //

shift--

 

 

 

 

 

’>’, //

shift-.

 

 

 

 

 

’?’, //

shift-/

 

 

 

 

 

’)’, //

shift-0

 

 

 

 

 

’!’, //

shift-1

 

 

 

 

 

’@’, //

shift-2

 

 

 

 

 

’#’, //

shift-3

 

 

 

 

 

’$’, //

shift-4

 

 

 

 

 

’%’, //

shift-5

 

 

 

 

 

’^’, //

shift-6

 

 

 

 

 

’&’, //

shift-7

 

 

 

 

 

’*’, //

shift-8

 

 

 

 

 

’(’, //

shift-9

 

 

 

 

 

’:’,

 

 

 

 

 

 

 

’:’, //

shift-;

 

 

 

 

 

’<’,

 

 

 

 

 

 

 

’+’, //

shift-=

 

 

 

 

 

’>’, ’?’, ’@’,

’A’, ’B’, ’C’, ’D’, ’E’, ’F’, ’G’, ’H’, ’I’, ’J’, ’K’, ’L’, ’M’, ’N’, ’O’, ’P’, ’Q’, ’R’, ’S’, ’T’, ’U’, ’V’, ’W’, ’X’, ’Y’, ’Z’,

’[’, // shift-[

165

’!’, // shift-backslash - OH MY GOD DOES WATCOM SUCK ’]’, // shift-]

’"’, ’_’,

’\’’, // shift-‘

’A’, ’B’, ’C’, ’D’, ’E’, ’F’, ’G’, ’H’, ’I’, ’J’, ’K’, ’L’, ’M’, ’N’, ’O’, ’P’, ’Q’, ’R’, ’S’, ’T’, ’U’, ’V’, ’W’, ’X’, ’Y’, ’Z’,

’{’, ’|’, ’}’, ’~’, 127

};

char frenchKeyMap[128]=

{

0,

1,2,3,4,5,6,7,8,9,10,

11,12,13,14,15,16,17,18,19,20,

21,22,23,24,25,26,27,28,29,30,

31, ’ ’,’!’,’"’,’#’,’$’,’%’,’&’,’%’,’(’,’)’,’*’,’+’,’;’,’-’,’:’,’!’,

’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’:’,’M’,’<’,’=’,’>’,’?’,

’@’,’Q’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,’L’,’,’,’N’,’O’, ’P’,’A’,’R’,’S’,’T’,’U’,’V’,’Z’,’X’,’Y’,’W’,’^’,’\\’,’$’,’^’,’_’, ’@’,’Q’,’B’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’J’,’K’,’L’,’,’,’N’,’O’, ’P’,’A’,’R’,’S’,’T’,’U’,’V’,’Z’,’X’,’Y’,’W’,’^’,’\\’,’$’,’^’,127

};

char ForeignTranslation(unsigned char ch)

{

return ch < 128 ? frenchKeyMap[ch] : ch;

}

void HU_Init(void)

{

int

i;

int

j;

char

buffer[9];

if (french)

shiftxform = french_shiftxform;

else

shiftxform = english_shiftxform;

// load the heads-up font j = HU_FONTSTART;

for (i=0;i<HU_FONTSIZE;i++)

{

sprintf(buffer, "STCFN%.3d", j++);

hu_font[i] = (patch_t *) W_CacheLumpName(buffer, PU_STATIC);

}

}

void HU_Stop(void)

{

headsupactive = false;

}

void HU_Start(void)

{

int

i;

char*

s;

if (headsupactive) HU_Stop();

166

plr = &players[consoleplayer]; message_on = false; message_dontfuckwithme = false; message_nottobefuckedwith = false; chat_on = false;

// create the message widget HUlib_initSText(&w_message,

HU_MSGX, HU_MSGY, HU_MSGHEIGHT, hu_font,

HU_FONTSTART, &message_on);

// create the map title widget HUlib_initTextLine(&w_title,

HU_TITLEX, HU_TITLEY, hu_font, HU_FONTSTART);

switch ( gamemode )

{

case shareware: case registered: case retail:

s = HU_TITLE; break;

/* FIXME

case pack_plut: s = HU_TITLEP; break;

case pack_tnt: s = HU_TITLET; break;

*/

case commercial: default:

s = HU_TITLE2; break;

}

while (*s)

HUlib_addCharToTextLine(&w_title, *(s++));

// create the chat widget HUlib_initIText(&w_chat,

HU_INPUTX, HU_INPUTY, hu_font,

HU_FONTSTART, &chat_on);

// create the inputbuffer widgets for (i=0 ; i<MAXPLAYERS ; i++)

HUlib_initIText(&w_inputbuffer[i], 0, 0, 0, 0, &always_off);

headsupactive = true;

}

void HU_Drawer(void)

{

HUlib_drawSText(&w_message);

HUlib_drawIText(&w_chat);

if (automapactive) HUlib_drawTextLine(&w_title, false);

167

}

void HU_Erase(void)

{

HUlib_eraseSText(&w_message);

HUlib_eraseIText(&w_chat);

HUlib_eraseTextLine(&w_title);

}

void HU_Ticker(void)

{

int i, rc; char c;

// tick down message counter if message is up if (message_counter && !--message_counter)

{

message_on = false; message_nottobefuckedwith = false;

}

if (showMessages || message_dontfuckwithme)

{

// display message if necessary

if ((plr->message && !message_nottobefuckedwith) || (plr->message && message_dontfuckwithme))

{

HUlib_addMessageToSText(&w_message, 0, plr->message); plr->message = 0;

message_on = true; message_counter = HU_MSGTIMEOUT;

message_nottobefuckedwith = message_dontfuckwithme; message_dontfuckwithme = 0;

}

} // else message_on = false;

// check for incoming chat characters if (netgame)

{

for (i=0 ; i<MAXPLAYERS; i++)

{

if (!playeringame[i]) continue;

if (i != consoleplayer

&& (c = players[i].cmd.chatchar))

{

if (c <= HU_BROADCAST) chat_dest[i] = c;

else

{

if (c >= ’a’ && c <= ’z’)

c = (char) shiftxform[(unsigned char) c]; rc = HUlib_keyInIText(&w_inputbuffer[i], c); if (rc && c == KEY_ENTER)

{

if (w_inputbuffer[i].l.len

&&(chat_dest[i] == consoleplayer+1

||chat_dest[i] == HU_BROADCAST))

{

168

HUlib_addMessageToSText(&w_message,

 

player_names[i],

 

w_inputbuffer[i].l.l);

 

message_nottobefuckedwith = true;

 

message_on = true;

 

message_counter = HU_MSGTIMEOUT;

 

if ( gamemode == commercial )

 

S_StartSound(0, sfx_radio);

 

else

 

S_StartSound(0, sfx_tink);

 

}

 

HUlib_resetIText(&w_inputbuffer[i]);

 

}

}

 

players[i].cmd.chatchar = 0;

}

 

}

 

}

 

}

 

#define QUEUESIZE

128

static char

chatchars[QUEUESIZE];

static int

head = 0;

static int

tail = 0;

void HU_queueChatChar(char c)

{

if (((head + 1) & (QUEUESIZE-1)) == tail)

{

plr->message = HUSTR_MSGU;

}

else

{

chatchars[head] = c;

head = (head + 1) & (QUEUESIZE-1);

}

}

char HU_dequeueChatChar(void)

{

char c;

if (head != tail)

{

c = chatchars[tail];

tail = (tail + 1) & (QUEUESIZE-1);

}

else

{

c = 0;

}

return c;

}

boolean HU_Responder(event_t *ev)

{

static char

lastmessage[HU_MAXLINELENGTH+1];

char*

macromessage;

boolean

eatkey = false;

169

static boolean

shiftdown = false;

static boolean

altdown = false;

unsigned char

c;

int

i;

int

numplayers;

static char

destination_keys[MAXPLAYERS] =

{

 

HUSTR_KEYGREEN,

 

HUSTR_KEYINDIGO,

 

HUSTR_KEYBROWN,

 

HUSTR_KEYRED

 

};

 

static int

num_nobrainers = 0;

numplayers = 0;

for (i=0 ; i<MAXPLAYERS ; i++) numplayers += playeringame[i];

if (ev->data1 == KEY_RSHIFT)

{

shiftdown = ev->type == ev_keydown; return false;

}

else if (ev->data1 == KEY_RALT || ev->data1 == KEY_LALT)

{

altdown = ev->type == ev_keydown; return false;

}

if (ev->type != ev_keydown) return false;

if (!chat_on)

{

if (ev->data1 == HU_MSGREFRESH)

{

message_on = true; message_counter = HU_MSGTIMEOUT; eatkey = true;

}

else if (netgame && ev->data1 == HU_INPUTTOGGLE)

{

eatkey = chat_on = true; HUlib_resetIText(&w_chat); HU_queueChatChar(HU_BROADCAST);

}

else if (netgame && numplayers > 2)

{

for (i=0; i<MAXPLAYERS ; i++)

{

if (ev->data1 == destination_keys[i])

{

if (playeringame[i] && i!=consoleplayer)

{

eatkey = chat_on = true; HUlib_resetIText(&w_chat); HU_queueChatChar(i+1); break;

}

else if (i == consoleplayer)

{

num_nobrainers++;

if (num_nobrainers < 3)

170

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