fteqw/plugins/namemaker/namemaker.c

199 lines
4.2 KiB
C

#include "../plugin.h"
int K_UPARROW;
int K_DOWNARROW;
int K_LEFTARROW;
int K_RIGHTARROW;
int K_ESCAPE;
int K_MOUSE1;
int K_MOUSE2;
int K_HOME;
int K_SHIFT;
int K_MWHEELDOWN;
int K_MWHEELUP;
int K_PAGEUP;
int K_PAGEDOWN;
int K_BACKSPACE;
qhandle_t con_chars;
qhandle_t pic_cursor;
float drawscalex;
float drawscaley;
unsigned char namebuffer[256];
int insertpos;
unsigned int currenttime;
void LoadPics(void)
{
char buffer[256];
//main bar (add cvars later)
con_chars = Draw_LoadImage("conchars", false);
Cvar_GetString("cl_cursor", buffer, sizeof(buffer));
if (*buffer)
pic_cursor = Draw_LoadImage(buffer, false);
else
pic_cursor = NULL;
}
void DrawChar(unsigned int c, int x, int y)
{
static float size = 1.0f/16.0f;
float s1 = size * (c&15);
float t1 = size * (c>>4);
Draw_Image((float)x*drawscalex, y*drawscaley, 16*drawscalex, 16*drawscaley, s1, t1, s1+size, t1+size, con_chars);
}
void InsertChar(int newchar)
{
int oldlen;
oldlen = strlen(namebuffer);
if (oldlen + 1 == sizeof(namebuffer))
return;
namebuffer[oldlen+1] = 0;
for (; oldlen > insertpos; oldlen--)
namebuffer[oldlen] = namebuffer[oldlen-1];
namebuffer[insertpos++] = newchar;
}
void KeyPress(int key, int mx, int my)
{
int newchar;
int oldlen;
if (key == K_ESCAPE)
{
Menu_Control(0);
Cvar_SetString("name", (char*)namebuffer);
}
else if (key == K_MOUSE1)
{
mx -= ((640 - (480-16))/2);
my -= 16;
mx /= (480-16)/16;
my /= (480-16)/16;
newchar = (int)mx + (int)my * 16;
InsertChar(newchar);
}
else if (key == K_MOUSE2 || key == K_BACKSPACE)
{
if (insertpos > 0)
insertpos--;
for (oldlen = insertpos; namebuffer[oldlen]; oldlen++)
namebuffer[oldlen] = namebuffer[oldlen+1];
}
else if (key == K_LEFTARROW)
{
insertpos--;
if (insertpos < 0)
insertpos = 0;
}
else if (key == K_RIGHTARROW)
{
insertpos++;
if (insertpos > strlen(namebuffer))
insertpos = strlen(namebuffer);
}
else if (key == K_SHIFT)
return;
else if (key > 0 && key < 255)
InsertChar(key);
}
int Plug_MenuEvent(int *args)
{
int i;
float cbias;
drawscalex = vid.width/640.0f;
drawscaley = vid.height/480.0f;
args[2]=(int)(args[2]/drawscalex);
args[3]=(int)(args[3]/drawscaley);
switch(args[0])
{
case 0: //draw
Draw_Colour4f(1,1,1,1);
Draw_Image(((640 - (480-16))/2)*drawscalex, 16*drawscaley, (480-16)*drawscalex, (480-16)*drawscaley, 0, 0, 1, 1, con_chars);
for (i = 0; namebuffer[i]; i++)
DrawChar(namebuffer[i], i*16, 0);
DrawChar(10 + (((currenttime/250)&1)==1), insertpos*16, 0);
cbias = Cvar_GetFloat("cl_cursorbias");
if (!pic_cursor || Draw_Image((float)(args[2]-cbias)*drawscalex, (float)(args[3]-cbias)*drawscaley, (float)32*drawscalex, (float)32*drawscaley, 0, 0, 1, 1, pic_cursor) <= 0)
DrawChar('+', args[2]-4, args[3]-4);
break;
case 1: //keydown
KeyPress(args[1], args[2], args[3]);
break;
case 2: //keyup
break;
case 3: //menu closed (this is called even if we change it).
break;
case 4: //mousemove
break;
}
return 0;
}
int Plug_Tick(int *args)
{
currenttime = args[0];
return true;
}
int Plug_ExecuteCommand(int *args)
{
char cmd[256];
Cmd_Argv(0, cmd, sizeof(cmd));
if (!strcmp("namemaker", cmd))
{
Menu_Control(1);
Cvar_GetString("name", (char*)namebuffer, sizeof(namebuffer));
insertpos = strlen(namebuffer);
return 1;
}
return 0;
}
int Plug_Init(int *args)
{
if (Plug_Export("Tick", Plug_Tick) &&
// Plug_Export("SbarBase", UI_StatusBar) &&
// Plug_Export("SbarOverlay", UI_ScoreBoard) &&
Plug_Export("ExecuteCommand", Plug_ExecuteCommand) &&
Plug_Export("MenuEvent", Plug_MenuEvent))
{
K_UPARROW = Key_GetKeyCode("uparrow");
K_DOWNARROW = Key_GetKeyCode("downarrow");
K_LEFTARROW = Key_GetKeyCode("leftarrow");
K_RIGHTARROW = Key_GetKeyCode("rightarrow");
K_ESCAPE = Key_GetKeyCode("escape");
K_HOME = Key_GetKeyCode("home");
K_MOUSE1 = Key_GetKeyCode("mouse1");
K_MOUSE2 = Key_GetKeyCode("mouse2");
K_MWHEELDOWN = Key_GetKeyCode("mwheeldown");
K_MWHEELUP = Key_GetKeyCode("mwheelup");
K_SHIFT = Key_GetKeyCode("shift");
K_PAGEUP = Key_GetKeyCode("pgup");
K_PAGEDOWN = Key_GetKeyCode("pgdn");
K_BACKSPACE = Key_GetKeyCode("backspace");
Cmd_AddCommand("namemaker");
LoadPics();
return 1;
}
return 0;
}