#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
extern char dontecho[];
extern char doecho[];
extern char echo_off_str[];
extern char echo_on_str[];
extern char linemode_off[];
extern char linemode_on[];
void
position_cursor (CHAR_DATA * ch, int loc, char *strin)
{
int col;
int row;
int ctr;
char buf[500];
row = 1;
col = 1;
for (ctr = 0; strin[ctr] != '\0'; ctr++)
{
if (ctr == loc)
break;
if (strin[ctr] == '\n')
{
ctr++;
col++;
row = 1;
continue;
}
row++;
if (row > 80)
{
col++;
row = 1;
}
}
sprintf (buf, "\x1B[24;1f%d,%d [%d] ", row, col, ch->desc->location);
write_to_descriptor2 (ch->desc, buf, 0);
sprintf (buf, "\x1B[%d;%df", col, row);
write_to_descriptor2 (ch->desc, buf, 0);
return;
}
void
character_add (CHAR_DATA * ch, char *to_add)
{
char buf[1524];
int i;
if (!ch->desc->pString)
{
ch->desc->connected = CON_PLAYING;
return;
}
for (i = 0; i < 1524; i++)
buf[i] = '\0';
strcpy (buf, *ch->desc->pString);
if (!ch->desc)
return;
if (!ch->pcdata->name)
return;
if (*to_add == 1) /*All this to move up a line.. heh */
{
int ll;
int tpos;
int pos_from_beginning_of_line;
int loc_of_prev_line;
int ct1;
int ct2;
tpos = ch->desc->location;
ct1 = tpos;
for (pos_from_beginning_of_line = 0;; pos_from_beginning_of_line++)
{
if (ct1 < 1)
{
return;
}
if (buf[ct1] == '\r')
{
break;
}
ct1--;
}
for (ct2 = ct1 - 3;; ct2--)
{
if (ct2 < 1)
{
loc_of_prev_line = 0;
break;
}
if (buf[ct2] == '\n')
{
loc_of_prev_line = ct2 + 1;
break;
}
}
for (ll = loc_of_prev_line;; ll++)
{
if (pos_from_beginning_of_line == 0)
break;
pos_from_beginning_of_line--;
if (buf[ll] == '\n')
{
break;
}
}
if (loc_of_prev_line == 0 && ll - 1 >= 0)
ll--;
ch->desc->location = ll;
position_cursor (ch, ch->desc->location, *ch->desc->pString);
return;
}
if (*to_add == 2) /*Heh, all this just to move down a line */
{
int max;
int tpos;
int pos_from_prev_line;
int pos_of_next_line;
int chars_in_next_line;
int spl;
int snl;
int ppp;
max = strlen (buf);
tpos = ch->desc->location;
/*Find start previous line */
pos_from_prev_line = 0;
for (spl = ch->desc->location;; spl--)
{
if (spl <= 0)
{
spl = 0;
pos_from_prev_line++;
break;
}
if (buf[spl] == '\r')
{
spl++;
break;
}
pos_from_prev_line++;
}
/*Find next line, if any */
for (snl = ch->desc->location;; snl++)
{
if (snl > max)
return;
if (buf[snl] == '\n')
{
snl -= 3;
if (snl > max)
return;
break;
}
}
pos_of_next_line = snl;
ppp = snl;
for (chars_in_next_line = 0;; chars_in_next_line++)
{
if (ppp > max)
{
ppp = max;
break;
}
if (buf[ppp] == '\n')
{
break;
}
if (chars_in_next_line == pos_from_prev_line)
{
break;
}
ppp++;
}
if (ppp + 4 <= max)
ppp += 4;
ch->desc->location = ppp;
position_cursor (ch, ch->desc->location, *ch->desc->pString);
return;
}
if (*to_add == 3)
{
int max;
max = strlen (buf);
if (ch->desc->location + 1 <= max)
ch->desc->location++;
if (ch->desc->location > 1 && buf[ch->desc->location - 1] == '\n')
{
if (ch->desc->location + 1 <= max)
ch->desc->location += 1;
}
position_cursor (ch, ch->desc->location, *ch->desc->pString);
return;
}
if (*to_add == 4)
{
if (ch->desc->location - 1 >= 0)
ch->desc->location--;
if (buf[ch->desc->location] == '\r')
{
if (ch->desc->location - 1 >= 0)
ch->desc->location--;
}
position_cursor (ch, ch->desc->location, *ch->desc->pString);
return;
}
if (*to_add == 5)
{
free_string (*ch->desc->pString);
*ch->desc->pString = str_dup ("");
ch->desc->location = 0;
write_to_descriptor2 (ch->desc, "\x1B[2J", 0);
write_to_descriptor2 (ch->desc, "\x1B[24;15fCTRL-E = CLEAR @ = Save/Quit CTRL-R = Redraw CTRL-F = Format", 0);
write_to_descriptor2 (ch->desc, "\x1B[1;1f", 0);
return;
}
if (*to_add == 6) /*Format text */
{
*ch->desc->pString = format_string (*ch->desc->pString);
ch->desc->location = 0;
write_to_descriptor2 (ch->desc, "\x1B[2J", 0);
write_to_descriptor2 (ch->desc, "\x1B[1;1f", 0);
for (i = 0; i < 1524; i++)
buf[i] = '\0';
strcpy (buf, *ch->desc->pString);
write_to_descriptor2 (ch->desc, buf, 0);
write_to_descriptor2 (ch->desc, "\x1B[24;15fCTRL-E = CLEAR @ = Save/Quit CTRL-R = Redraw CTRL-F = Format", 0);
position_cursor (ch, ch->desc->location, buf);
return;
}
if (*to_add == 18) /*redraw request */
{
write_to_descriptor2 (ch->desc, "\x1B[2J\x1B[1;1f", 0);
write_to_descriptor2 (ch->desc, buf, 0);
write_to_descriptor2 (ch->desc, "\x1B[24;15fCTRL-E = CLEAR @ = Save/Quit CTRL-R = Redraw CTRL-F = Format", 0);
position_cursor (ch, ch->desc->location, buf);
return;
}
if (*to_add == 9) /*Backspace encountered */
{
int ct;
int ii;
int ctr;
char teol[1000];
int oldlen;
bool is_cr;
is_cr = FALSE;
if (ch->desc->location - 1 < 0)
return;
if (ch->desc->location - 1 >= 0 && buf[ch->desc->location - 1] == '\r')
is_cr = TRUE;
oldlen = strlen (buf);
for (ii = ch->desc->location - 1; ii < oldlen; ii++)
{
buf[ii] = buf[ii + 1];
}
buf[oldlen] = '\0';
ch->desc->location--;
if (is_cr)
{
oldlen = strlen (buf);
for (ii = ch->desc->location - 1; ii < oldlen; ii++)
{
buf[ii] = buf[ii + 1];
}
buf[oldlen] = '\0';
ch->desc->location--;
}
free_string (*ch->desc->pString);
*ch->desc->pString = str_dup (buf);
if (is_cr)
{
write_to_descriptor2 (ch->desc, "\x1B[2J", 0);
write_to_descriptor2 (ch->desc, "\x1B[1;1f", 0);
write_to_descriptor2 (ch->desc, buf, 0);
write_to_descriptor2 (ch->desc, "\x1B[24;15fCTRL-E = CLEAR @ = Save/Quit CTRL-R = Redraw CTRL-F = Format", 0);
position_cursor (ch, ch->desc->location, buf);
return;
}
for (i = 0; i < 1524; i++)
buf[i] = '\0';
strcpy (buf, *ch->desc->pString);
ct = 0;
for (ctr = ch->desc->location;; ctr++)
if (buf[ctr] != '\0' && buf[ctr] != '\n')
{
teol[ct] = buf[ctr];
ct++;
}
else
break;
teol[ct] = '\0';
position_cursor (ch, ch->desc->location, *ch->desc->pString);
write_to_descriptor2 (ch->desc, "\x1B[K", 0);
write_to_descriptor2 (ch->desc, teol, 0);
position_cursor (ch, ch->desc->location, *ch->desc->pString);
return;
}
if (*to_add == '~' || *to_add == '@')
{
ch->desc->pString = NULL;
ch->desc->location = 0;
ch->desc->connected = CON_PLAYING;
SET_BIT (ch->pcdata->act2, PLR_TELNET_GA);
write_to_descriptor2 (ch->desc, linemode_on, 0);
write_to_descriptor2 (ch->desc, echo_on_str, 0);
write_to_descriptor2 (ch->desc, "\x1B[24;1f\x1B[KText Saved. Press Enter. ", 0);
return;
}
if (strlen (buf) > 1500)
{
return;
}
if (!ch->desc->insert)
{
/*BAH, always insert mode... */
int i;
int tt;
int pteol;
int slb;
char ts[1500];
int ctr;
for (i = 0; i < strlen (to_add); i++)
{
if (buf[ch->desc->location] != '\0')
{
slb = strlen (buf);
position_cursor (ch, ch->desc->location, buf);
for (tt = slb; tt >= ch->desc->location; tt--)
buf[tt + 1] = buf[tt];
buf[ch->desc->location] = to_add[i];
ctr = 0;
for (pteol = ch->desc->location; pteol < slb; pteol++)
{
if (buf[pteol] == '\n')
{
ctr--;
break;
}
ts[ctr] = buf[pteol];
ctr++;
}
ts[ctr + 1] = '\0';
if (to_add[i] == '\r')
{
write_to_descriptor2 (ch->desc, "\x1B[2J", 0);
write_to_descriptor2 (ch->desc, "\x1B[1;1f", 0);
write_to_descriptor2 (ch->desc, buf, 0);
write_to_descriptor2 (ch->desc, "\x1B[24;15fCTRL-E = CLEAR @ = Save/Quit CTRL-R = Redraw CTRL-F = Format", 0);
}
else
{
write_to_descriptor2 (ch->desc, "\x1B[K", 0);
write_to_descriptor2 (ch->desc, ts, 0);
}
position_cursor (ch, ch->desc->location + 1, buf);
}
else
buf[ch->desc->location] = to_add[i];
ch->desc->location++;
}
}
position_cursor (ch, ch->desc->location, buf);
free_string (*ch->desc->pString);
*ch->desc->pString = str_dup (buf);
return;
}
char doiecho[] =
{255, 253, 1, '\0'};
char dontiecho[] =
{255, 254, 1, '\0'};
char iwillecho[] =
{255, 251, 1, '\0'};
char iwontecho[] =
{255, 252, 1, '\0'};
char dontlinemode[] =
{255, 254, 34, '\0'};
char dolinemode[] =
{255, 253, 34, '\0'};
void
fullscreen_editor (CHAR_DATA * ch, char **pString)
{
write_to_descriptor2 (ch->desc, dontecho, 0);
write_to_descriptor2 (ch->desc, echo_off_str, 0);
write_to_descriptor2 (ch->desc, linemode_off, 0);
write_to_descriptor2 (ch->desc, echo_off_str, 0);
write_to_descriptor2 (ch->desc, "\x1B[2J", 0);
/* @ saves the text */
REMOVE_BIT (ch->pcdata->act2, PLR_TELNET_GA);
if (*pString == NULL)
{
*pString = str_dup ("");
}
if (strlen (*pString) > 1450)
{
send_to_char ("You cannot edit this string with the fullscreen editor. Sorry.\n\r", ch);
return;
}
write_to_descriptor2 (ch->desc, "\x1B[1;1f", 0);
write_to_descriptor2 (ch->desc, *pString, 0);
write_to_descriptor2 (ch->desc, "\x1B[24;15fCTRL-E = CLEAR @ = Save/Quit CTRL-R = Redraw CTRL-F = Format", 0);
write_to_descriptor2 (ch->desc, "\x1B[1;1f", 0);
ch->desc->location = 0;
ch->desc->pString = pString;
ch->desc->connected = CON_FSEDITOR;
return;
}