/* chat.c - this file will do everything what have to do with the chat.. */ #include "bomberclone.h" #include "network.h" #include "packets.h" #include "gfx.h" #include "keybinput.h" #include "chat.h" _chat chat; /* find a free line or delete the oldest one */ int chat_findfreeline () { int i; i = chat.lastline; if (i >= CHAT_MAX_LINES) { memcpy (&chat.lines[0], &chat.lines[1], sizeof (chat.lines[1]) * (CHAT_MAX_LINES - 1)); i = CHAT_MAX_LINES - 1; } else chat.lastline++; chat.changed = 1; return i; } void chat_cleanup () { int i; for (i = 0; i < CHAT_MAX_LINES; i++) { if (chat.lines[i].status > 0) chat.lines[i].status = -1; } } void chat_addline (char *text) { int l; l = chat_findfreeline (); chat.lines[l].status = 0; strncpy (chat.lines[l].text, text, 255); chat.lineschanged = 1; } void chat_addstatusline (char *text) { int l; l = chat_findfreeline (); chat.lines[l].status = 1; strncpy (chat.lines[l].text, text, 255); chat.lineschanged = 1; } void chat_drawbox () { SDL_Rect src; int i; if (chat.visible == 0) chat.oldscreen = gfx_copyscreen (&chat.window); chat.visible = 1; if (gfx_locksurface (gfx.screen)) return; for (i = 0; i < 2; i++) { src.x = chat.window.x + i; src.w = src.x + chat.window.w - 2; src.y = chat.window.y + i; src.h = src.y + chat.window.h - 2; draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_BRIGHT); } gfx_unlocksurface (gfx.screen); src.x = chat.window.x + 2; src.y = chat.window.y + 2; src.w = src.x + chat.window.w - 4; src.h = src.y + chat.window.h - 4 - font[0].size.y; draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_DARK); src.x = chat.window.x + 2; src.y = chat.window.y + chat.window.h - 18; src.w = src.x + chat.window.w - 4; src.h = src.y + font[0].size.y; draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_DARK >> 1); gfx_blitupdaterectadd (&chat.window); }; void chat_deletebox () { SDL_Rect src, dest; src.x = 0; src.y = 0; src.w = dest.w = chat.oldscreen->w; src.h = dest.h = chat.oldscreen->h; dest.x = chat.window.x; dest.y = chat.window.y; SDL_BlitSurface (chat.oldscreen, &src, gfx.screen, &dest); gfx_blitupdaterectadd (&chat.window); chat.visible = 0; SDL_FreeSurface (chat.oldscreen); chat.oldscreen = NULL; }; void chat_show (int x1, int y1, int x2, int y2) { if (chat.visible != 0) chat_deletebox (); if (x1 == -1 || x2 == -1 || y1 == -1 || y2 == -1 || x2 <= x1 || y2 <= y1) chat.visible = 0; else { chat.window.x = x1; chat.window.y = y1; chat.window.w = x2 - x1; chat.window.h = y2 - y1; chat_drawbox (); chat.changed = 1; chat.lineschanged = 1; } }; void chat_clearscreen (signed char all) { SDL_Rect src, dest; if (all == 1) { dest.x = chat.window.x + 2; dest.y = chat.window.y + 2; dest.w = dest.x + chat.window.w - 4; dest.h = dest.y + chat.window.h - 4; src.x = 2; src.y = 2; src.w = chat.window.w - 4; src.h = chat.window.h - 4; } else { /* redraw only the textline of out input box */ dest.x = chat.window.x + 2; dest.y = chat.window.y + chat.window.h - 18; dest.w = src.w = chat.window.w - 4; dest.h = src.h = font[0].size.y; src.x = 2; src.y = chat.window.h - 18; } SDL_BlitSurface (chat.oldscreen, &src, gfx.screen, &dest); if (all == 1) { dest.w = dest.x + chat.window.w - 4; dest.h = dest.y + chat.window.h - 4 - font[0].size.y; draw_shadefield (gfx.screen, &dest, CHAT_BG_SHADE_DARK); } src.x = chat.window.x + 2; src.y = chat.window.y + chat.window.h - 18; src.w = src.x + chat.window.w - 4; src.h = src.y + font[0].size.y; draw_shadefield (gfx.screen, &src, CHAT_BG_SHADE_DARK >> 1); gfx_blitupdaterectadd (&chat.window); }; void chat_loop (SDL_Event * event) { int i, y, l, p1, p2, maxchar; char text[255]; i = keybinput_loop (&chat.input, event); if (i == 1 && chat.input.text[0] != 0) { sprintf (text, "%s: %s", bman.playername, chat.input.text); net_send_chat (text, 1); chat_addline (text); keybinput_new (&chat.input); i = 0; } if (((i == 0 && chat.input.changed == 1) || chat.changed == 1) && chat.visible == 1) { /* draw the new field */ chat_clearscreen (chat.lineschanged); p1 = p2 = 0; maxchar = (chat.window.w - 4) / font[0].size.x; if (chat.lineschanged) { font_setcolor (255, 255, 255, 0); y = chat.window.y + 4; l = chat.startline; while (y < (chat.window.y + chat.window.h - 32) && chat.lines[l].text[0] != 0) { if (chat.lines[l].status < 0) { l++; } else { for (p1 = 0; (p1 < maxchar && chat.lines[l].text[p2] != 0); p1++) text[p1] = chat.lines[l].text[p2++]; text[p1] = 0; font_draw (chat.window.x + 4, y, text, 0); if (chat.lines[l].text[p2] == 0) { // the end of the line l++; p2 = 0; } y = y + font[0].size.y; } } if (chat.lines[l].text[0] != 0) { chat.startline++; chat.changed = 1; chat.lineschanged = 1; } else { chat.changed = 0; chat.lineschanged = 0; } } if (chat.startline >= CHAT_MAX_LINES) chat.startline = CHAT_MAX_LINES - 5; /* draw the input line */ if (chat.input.len > maxchar) p2 = chat.input.len - maxchar; for (p1 = 0; (p1 < maxchar && chat.input.text[p2] != 0); p1++) text[p1] = chat.input.text[p2++]; text[p1] = 0; font_draw (chat.window.x + 4, (chat.window.y + chat.window.h) - 4 - font[0].size.y, text, 0); } };