|
|
1.1 root 1: //
2: // Chat mode
3: //
4:
5: #include <string.h>
6: #include <ctype.h>
7: #include "DoomDef.h"
8: #include "P_local.h"
9: #include "soundst.h"
10:
11: #define QUEUESIZE 128
12: #define MESSAGESIZE 128
13: #define MESSAGELEN 265
14:
15: #define CT_PLR_GREEN 1
16: #define CT_PLR_YELLOW 2
17: #define CT_PLR_RED 3
18: #define CT_PLR_BLUE 4
19: #define CT_PLR_ALL 5
20:
21: #define CT_KEY_GREEN 'g'
22: #define CT_KEY_YELLOW 'y'
23: #define CT_KEY_RED 'r'
24: #define CT_KEY_BLUE 'b'
25: #define CT_KEY_ALL 't'
26: #define CT_ESCAPE 6
27:
28: // Public data
29:
30: void CT_Init(void);
31: void CT_Drawer(void);
32: boolean CT_Responder(event_t *ev);
33: void CT_Ticker(void);
34: char CT_dequeueChatChar(void);
35:
36: boolean chatmodeon;
37:
38: // Private data
39:
40: void CT_queueChatChar(char ch);
41: void CT_ClearChatMessage(int player);
42: void CT_AddChar(int player, char c);
43: void CT_BackSpace(int player);
44:
45: int head;
46: int tail;
47: byte ChatQueue[QUEUESIZE];
48: int chat_dest[MAXPLAYERS];
49: char chat_msg[MAXPLAYERS][MESSAGESIZE];
50: char plr_lastmsg[MAXPLAYERS][MESSAGESIZE+9]; // add in the length of the pre-string
51: int msgptr[MAXPLAYERS];
52: int msglen[MAXPLAYERS];
53:
54: boolean cheated;
55:
56: static int FontABaseLump;
57:
58: char *CT_FromPlrText[MAXPLAYERS] =
59: {
60: "GREEN: ",
61: "YELLOW: ",
62: "RED: ",
63: "BLUE: "
64: };
65:
66: char *chat_macros[10];
67:
68: boolean altdown;
69: boolean shiftdown;
70:
71:
72: //===========================================================================
73: //
74: // CT_Init
75: //
76: // Initialize chat mode data
77: //===========================================================================
78:
79: void CT_Init(void)
80: {
81: int i;
82:
83: head = 0; //initialize the queue index
84: tail = 0;
85: chatmodeon = false;
86: memset(ChatQueue, 0, QUEUESIZE);
87: for(i = 0; i < MAXPLAYERS; i++)
88: {
89: chat_dest[i] = 0;
90: msgptr[i] = 0;
91: memset(plr_lastmsg[i], 0, MESSAGESIZE);
92: memset(chat_msg[i], 0, MESSAGESIZE);
93: }
94: FontABaseLump = W_GetNumForName("FONTA_S")+1;
95: return;
96: }
97:
98: //===========================================================================
99: //
100: // CT_Stop
101: //
102: //===========================================================================
103:
104: void CT_Stop(void)
105: {
106: chatmodeon = false;
107: return;
108: }
109:
110: //===========================================================================
111: //
112: // CT_Responder
113: //
114: //===========================================================================
115:
116: boolean CT_Responder(event_t *ev)
117: {
118: char *macro;
119:
120: int sendto;
121:
122: if(!netgame)
123: {
124: return false;
125: }
126: if(ev->data1 == KEY_LALT || ev->data2 == KEY_RALT)
127: {
128: altdown = (ev->type == ev_keydown);
129: return false;
130: }
131: if(ev->data1 == KEY_RSHIFT)
132: {
133: shiftdown = (ev->type == ev_keydown);
134: return false;
135: }
136: if(ev->type != ev_keydown)
137: {
138: return false;
139: }
140: if(!chatmodeon)
141: {
142: sendto = 0;
143: if(ev->data1 == CT_KEY_ALL)
144: {
145: sendto = CT_PLR_ALL;
146: }
147: else if(ev->data1 == CT_KEY_GREEN)
148: {
149: sendto = CT_PLR_GREEN;
150: }
151: else if(ev->data1 == CT_KEY_YELLOW)
152: {
153: sendto = CT_PLR_YELLOW;
154: }
155: else if(ev->data1 == CT_KEY_RED)
156: {
157: sendto = CT_PLR_RED;
158: }
159: else if(ev->data1 == CT_KEY_BLUE)
160: {
161: sendto = CT_PLR_BLUE;
162: }
163: if(sendto == 0 || (sendto != CT_PLR_ALL && !playeringame[sendto-1])
164: || sendto == consoleplayer+1)
165: {
166: return false;
167: }
168: CT_queueChatChar(sendto);
169: chatmodeon = true;
170: return true;
171: }
172: else
173: {
174: if(altdown)
175: {
176: if(ev->data1 >= '0' && ev->data1 <= '9')
177: {
178: if(ev->data1 == '0')
179: { // macro 0 comes after macro 9
180: ev->data1 = '9'+1;
181: }
182: macro = chat_macros[ev->data1-'1'];
183: CT_queueChatChar(KEY_ENTER); //send old message
184: CT_queueChatChar(chat_dest[consoleplayer]); // chose the dest.
185: while(*macro)
186: {
187: CT_queueChatChar(toupper(*macro++));
188: }
189: CT_queueChatChar(KEY_ENTER); //send it off...
190: CT_Stop();
191: return true;
192: }
193: }
194: if(ev->data1 == KEY_ENTER)
195: {
196: CT_queueChatChar(KEY_ENTER);
197: CT_Stop();
198: return true;
199: }
200: else if(ev->data1 == KEY_ESCAPE)
201: {
202: CT_queueChatChar(CT_ESCAPE);
203: CT_Stop();
204: return true;
205: }
206: else if(ev->data1 >= 'a' && ev->data1 <= 'z')
207: {
208: CT_queueChatChar(ev->data1-32);
209: return true;
210: }
211: else if(shiftdown)
212: {
213: if(ev->data1 == '1')
214: {
215: CT_queueChatChar('!');
216: return true;
217: }
218: else if(ev->data1 == '/')
219: {
220: CT_queueChatChar('?');
221: return true;
222: }
223: }
224: else
225: {
226: if(ev->data1 == ' ' || ev->data1 == ',' || ev->data1 == '.'
227: || (ev->data1 >= '0' && ev->data1 <= '9') || ev->data1 == '\''
228: || ev->data1 == KEY_BACKSPACE || ev->data1 == '-' || ev->data1 == '=')
229: {
230: CT_queueChatChar(ev->data1);
231: return true;
232: }
233: }
234: }
235: return false;
236: }
237:
238: //===========================================================================
239: //
240: // CT_Ticker
241: //
242: //===========================================================================
243:
244: void CT_Ticker(void)
245: {
246: int i;
247: int j;
248: char c;
249: int numplayers;
250:
251: for(i=0; i < MAXPLAYERS; i++)
252: {
253: if(!playeringame[i])
254: {
255: continue;
256: }
257: if((c = players[i].cmd.chatchar) != 0)
258: {
259: if(c <= 5)
260: {
261: chat_dest[i] = c;
262: continue;
263: }
264: else if(c == CT_ESCAPE)
265: {
266: CT_ClearChatMessage(i);
267: }
268: else if(c == KEY_ENTER)
269: {
270: numplayers = 0;
271: for(j = 0; j < MAXPLAYERS; j++)
272: {
273: numplayers += playeringame[j];
274: }
275: CT_AddChar(i, 0); // set the end of message character
276: if(numplayers > 2)
277: {
278: strcpy(plr_lastmsg[i], CT_FromPlrText[i]);
279: strcat(plr_lastmsg[i], chat_msg[i]);
280: }
281: else
282: {
283: strcpy(plr_lastmsg[i], chat_msg[i]);
284: }
285: if(i != consoleplayer && (chat_dest[i] == consoleplayer+1
286: || chat_dest[i] == CT_PLR_ALL) && *chat_msg[i])
287: {
288: P_SetMessage(&players[consoleplayer], plr_lastmsg[i],
289: true);
290: S_StartSound(NULL, sfx_chat);
291: }
292: else if(i == consoleplayer && (*chat_msg[i]))
293: {
294: if(numplayers > 1)
295: {
296: P_SetMessage(&players[consoleplayer], "-MESSAGE SENT-",
297: true);
298: S_StartSound(NULL, sfx_chat);
299: }
300: else
301: {
302: P_SetMessage(&players[consoleplayer],
303: "THERE ARE NO OTHER PLAYERS IN THE GAME!", true);
304: S_StartSound(NULL, sfx_chat);
305: }
306: }
307: CT_ClearChatMessage(i);
308: }
309: else if(c == KEY_BACKSPACE)
310: {
311: CT_BackSpace(i);
312: }
313: else
314: {
315: CT_AddChar(i, c);
316: }
317: }
318: }
319: return;
320: }
321:
322: //===========================================================================
323: //
324: // CT_Drawer
325: //
326: //===========================================================================
327:
328: void CT_Drawer(void)
329: {
330: int i;
331: int x;
332: patch_t *patch;
333:
334: if(chatmodeon)
335: {
336: x = 25;
337: for(i = 0; i < msgptr[consoleplayer]; i++)
338: {
339: if(chat_msg[consoleplayer][i] < 33)
340: {
341: x += 6;
342: }
343: else
344: {
345: patch=W_CacheLumpNum(FontABaseLump+
346: chat_msg[consoleplayer][i]-33, PU_CACHE);
347: V_DrawPatch(x, 10, patch);
348: x += patch->width;
349: }
350: }
351: V_DrawPatch(x, 10, W_CacheLumpName("FONTA59", PU_CACHE));
352: BorderTopRefresh = true;
353: UpdateState |= I_MESSAGES;
354: }
355: }
356:
357: //===========================================================================
358: //
359: // CT_queueChatChar
360: //
361: //===========================================================================
362:
363: void CT_queueChatChar(char ch)
364: {
365: if((tail+1)&(QUEUESIZE-1) == head)
366: { // the queue is full
367: return;
368: }
369: ChatQueue[tail] = ch;
370: tail = (tail+1)&(QUEUESIZE-1);
371: }
372:
373: //===========================================================================
374: //
375: // CT_dequeueChatChar
376: //
377: //===========================================================================
378:
379: char CT_dequeueChatChar(void)
380: {
381: byte temp;
382:
383: if(head == tail)
384: { // queue is empty
385: return 0;
386: }
387: temp = ChatQueue[head];
388: head = (head+1)&(QUEUESIZE-1);
389: return temp;
390: }
391:
392: //===========================================================================
393: //
394: // CT_AddChar
395: //
396: //===========================================================================
397:
398: void CT_AddChar(int player, char c)
399: {
400: patch_t *patch;
401:
402: if(msgptr[player]+1 >= MESSAGESIZE || msglen[player] >= MESSAGELEN)
403: { // full.
404: return;
405: }
406: chat_msg[player][msgptr[player]] = c;
407: msgptr[player]++;
408: if(c < 33)
409: {
410: msglen[player] += 6;
411: }
412: else
413: {
414: patch = W_CacheLumpNum(FontABaseLump+c-33, PU_CACHE);
415: msglen[player] += patch->width;
416: }
417: }
418:
419: //===========================================================================
420: //
421: // CT_BackSpace
422: //
423: // Backs up a space, when the user hits (obviously) backspace
424: //===========================================================================
425:
426: void CT_BackSpace(int player)
427: {
428: patch_t *patch;
429: char c;
430:
431: if(msgptr[player] == 0)
432: { // message is already blank
433: return;
434: }
435: msgptr[player]--;
436: c = chat_msg[player][msgptr[player]];
437: if(c < 33)
438: {
439: msglen[player] -= 6;
440: }
441: else
442: {
443: patch = W_CacheLumpNum(FontABaseLump+c-33, PU_CACHE);
444: msglen[player] -= patch->width;
445: }
446: chat_msg[player][msgptr[player]] = 0;
447: }
448:
449: //===========================================================================
450: //
451: // CT_ClearChatMessage
452: //
453: // Clears out the data for the chat message, but the player's message
454: // is still saved in plrmsg.
455: //===========================================================================
456:
457: void CT_ClearChatMessage(int player)
458: {
459: memset(chat_msg[player], 0, MESSAGESIZE);
460: msgptr[player] = 0;
461: msglen[player] = 0;
462: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.