You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bomberclone/src/chat.c

259 lines
6.2 KiB

/*
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, KEYBI_text, 255);
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) {
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, COLOR_white);
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, COLOR_white);
}
};