Annotation of doom/ct_chat.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.