Annotation of doom/ct_chat.c, revision 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.