#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
CHAR_DATA *
findmob (void)
{
CHAR_DATA *cd;
for (cd = char_list; cd != NULL; cd = cd->next)
{
if (IS_MOB (cd))
return cd;
}
return char_list;
}
char *
itoa (int n)
{
static char t[50];
sprintf (t, "%d", n);
return t;
}
void
createobject (CHAR_DATA * ch, int vnum)
{
OBJ_PROTOTYPE *oid;
SINGLE_OBJECT *obj;
if ((oid = get_obj_index (vnum)) == NULL)
return;
obj = create_object (oid, 1);
obj_to (obj, ch);
return;
}
void
do_destroy (CHAR_DATA * mob, int i)
{
SINGLE_OBJECT *oo;
for (oo = mob->carrying; oo != NULL; oo = oo->next_content)
{
if (oo->pIndexData->vnum == i)
{
free_it (oo);
break;
}
}
return;
}
void
do_scriptr (CHAR_DATA * ch, char *argy)
{
char arg1[500];
char arg2[500];
char arg3[500];
int vnum;
MOB_PROTOTYPE *mid;
DEFINE_COMMAND ("rscript", do_scriptr, POSITION_DEAD, 110, LOG_NORMAL, "Format is rscript <vnum> reload.")
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
argy = one_argy (argy, arg3);
if ((mid = get_mob_index (vnum = atoi (arg1))) == NULL)
{
send_to_char ("Invalid mob vnum specified.\n\r", ch);
return;
}
if (!mid->script_fn)
{
send_to_char ("This mob has no scriptfile.\n\r", ch);
return;
}
if (!str_prefix ("reload", arg2))
{
load_scripts_2 (mid->script_fn, mid);
send_to_char ("Script reloaded.\n\r", ch);
}
return;
}
void
do_list_done_quests (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *victim;
int i;
bool all_flag = FALSE;
bool list_flag = FALSE;
bool clear_flag = FALSE;
DEFINE_COMMAND ("oldquests", do_list_done_quests, POSITION_DEAD, 0, LOG_NORMAL, "Shows you completed quests, etc...")
hugebuf_o[0] = '\0';
if (IS_MOB (ch))
return;
if (!str_prefix ("clear", argy) && ch->pcdata->level >= 110)
{
clear_flag = TRUE;
argy += 5;
send_to_char ("Cleared.\n\r", ch);
}
if (!str_prefix ("all", argy) && ch->pcdata->level >= 110)
{
all_flag = TRUE;
argy += 3;
}
if (!str_prefix ("list", argy) && ch->pcdata->level >= 110)
{
list_flag = TRUE;
argy += 4;
}
if (*argy == ' ')
argy++;
victim = ch;
if (ch->pcdata->level >= 110 && strlen (argy) > 2)
{
if ((victim = get_char_world (ch, argy)) == NULL)
{
victim = ch;
}
}
for (i = 0; i < 1000; i++)
{
if (clear_flag)
{
victim->pcdata->complete[i] = FALSE;
continue;
}
if ((list_flag || victim->pcdata->complete[i]) && questname[i] != NULL)
{
if (!list_flag && *questname[i] == '*' && !all_flag)
continue;
if (victim->pcdata->complete[i])
sprintf (hugebuf_o + strlen (hugebuf_o), "[%3d] '%s' - Complete.\n\r", i, questname[i]);
else
sprintf (hugebuf_o + strlen (hugebuf_o), "[%3d] '%s' - Incomplete.\n\r", i, questname[i]);
}
}
page_to_char (hugebuf_o, ch);
return;
}
char *
cscr (char *txt, CHAR_DATA * mob, char *player, SINGLE_OBJECT * obj)
{
static char strr[2048];
char lastword[256];
char *runthru;
int posi_w = 0;
strr[0] = '\0';
for (runthru = txt; *runthru != '\0'; runthru++)
{
lastword[posi_w] = *runthru;
posi_w++;
if (*runthru == ' ')
{
lastword[posi_w] = '\0';
if (!str_cmp (lastword, "@mobn "))
{
strcat (strr, NAME (mob));
}
else if (!str_cmp (lastword, "@playern "))
{
strcat (strr, player);
}
else if (!str_cmp (lastword, "@objn ") && obj)
{
strcat (strr, obj->pIndexData->short_descr);
}
else
strcat (strr, lastword);
posi_w = 0;
}
}
lastword[posi_w] = '\0';
strcat (strr, lastword);
return strr;
}
int
grab_num (char *arg)
{
int cur_num = 0;
char *look;
for (look = arg; *look != '\0'; look++)
{
if ((*look) < '0' || (*look) > '9')
continue;
cur_num *= 10;
cur_num += ((*look) - '0');
}
return cur_num;
}
int
evaluate_random (char *arg)
{
int num1 = 0;
int num2 = 0;
char *look;
int cur_num = 0;
bool on_one = TRUE;
bool fsp = FALSE;
for (look = arg; *look != '\0'; look++)
{
if (!fsp && ((*look) < '0' || (*look) > '9'))
continue;
if (!fsp)
{
on_one = TRUE;
fsp = TRUE;
}
if (*look == ' ' || *look == ',')
{
num1 = cur_num;
cur_num = 0;
on_one = FALSE;
continue;
}
if ((*look) < '0' || (*look) > '9')
continue;
cur_num *= 10;
cur_num += ((*look) - '0');
}
num2 = cur_num;
return number_range (num1, num2);
}
CHAR_DATA *
find_player (char *pname)
{
DESCRIPTOR_DATA *d;
for (d = descriptor_list; d != NULL; d = d->next)
{
if (d->character)
if (!str_cmp (d->character->pcdata->name, pname))
return d->character;
}
return NULL;
}
void
do_scriptline (CHAR_DATA * mob, CHAR_DATA * player, SINGLE_OBJECT * obj)
{
SCRIPT_DAT *sdat;
TRIGGY_DATA *trig;
char plr[500];
if (IS_PLAYER (mob))
return;
check_ced (mob);
if (player)
{
check_ced (player);
}
mob->ced->wait_type = 0;
if (player)
{
strcpy (plr, NAME (player));
}
for (;;)
{
if (mob->ced->scr_wait != 0)
{
goto done;
}
/* A waitstate has been induced */
mob->ced->cur_line++; /* Get ready to read the next line */
/* Find the next line */
for (trig = mob->pIndexData->trig_list; trig != NULL; trig = trig->next)
{
for (sdat = trig->head; sdat != NULL; sdat = sdat->next)
{
if (sdat->label == mob->ced->cur_line)
goto found_it;
}
}
mob->ced->cur_line = 0;
return; /*Scriptline not found, return */
found_it: /*Found the script line! Begin execution... */
if (!player && sdat->player != NULL)
{
strcpy (plr, sdat->player);
free_m (sdat->player);
sdat->player = NULL;
}
/*INTERPRETTING THE SCRIPT BELOW */
{
char argy[2048];
char arg1[200];
char arg2[200];
char arg3[200];
char arg4[200];
char arg5[200];
char arg6[200];
char arg7[200];
char arg8[200];
char arg9[200];
char arg10[200];
char *argie = argy;
strcpy (argy, sdat->to_do);
argie = one_argy (argie, arg1);
argie = one_argy (argie, arg2);
argie = one_argy (argie, arg3);
argie = one_argy (argie, arg4);
argie = one_argy (argie, arg5);
argie = one_argy (argie, arg6);
argie = one_argy (argie, arg7);
argie = one_argy (argie, arg8);
argie = one_argy (argie, arg9);
argie = one_argy (argie, arg10);
if (!str_cmp (arg1, "donetrig"))
goto done;
if (!str_prefix ("if", arg1))
{
int left_side;
int right_side;
char comparison = 0;
int num_if;
bool result = FALSE;
num_if = grab_num (arg1);
if (!str_prefix ("temp", arg2))
{
int i;
i = atoi (arg3);
if (i >= 0 && i < 1000)
{
CHAR_DATA *tch;
if ((tch = find_player (plr)) != NULL)
{
if (tch->pcdata->temp_flag[i])
goto fnn;
}
}
goto res_failed;
}
if (!str_cmp (arg2, "complete"))
{
int i;
if ((i = lookup_questname (arg3)) >= 0)
{
CHAR_DATA *tch;
if ((tch = find_player (plr)) != NULL)
{
if (tch->pcdata->complete[i])
goto fnn;
if (!tch->pcdata->complete[i])
goto res_failed;
}
}
i = atoi (arg3);
if (i >= 0 && i < 1000)
{
CHAR_DATA *tch;
if ((tch = find_player (plr)) != NULL)
{
if (tch->pcdata->complete[i])
goto fnn;
if (tch->pcdata->complete[i])
goto res_failed;
}
}
goto res_failed;
}
if (!str_cmp (arg2, "in_progress"))
{
int i;
i = atoi (arg3);
if (i >= 0 && i < 1000)
{
CHAR_DATA *tch;
if ((tch = find_player (plr)) != NULL)
{
if (tch->pcdata->in_progress[i])
goto fnn;
}
}
goto res_failed;
}
if (!str_cmp (arg2, "=") || !str_prefix ("equal", arg2))
comparison = 1;
else if (!str_cmp (arg2, "<") || !str_prefix ("less", arg2))
comparison = 2;
else if (!str_cmp (arg2, ">") || !str_prefix ("great", arg2))
comparison = 3;
if (!str_prefix ("rand", arg3) || !str_prefix ("'rand", arg3))
left_side = evaluate_random (arg3);
else
left_side = atoi (arg3);
if (!str_prefix ("rand", arg4) || !str_prefix ("'rand", arg4))
right_side = evaluate_random (arg4);
else
right_side = atoi (arg4);
if (comparison == 1 && left_side == right_side)
result = TRUE;
else if (comparison == 2 && left_side < right_side)
result = TRUE;
else if (comparison == 3 && left_side > right_side)
result = TRUE;
res_failed:
if (!result)
{
/* Result failed.. find otherwise# */
SCRIPT_DAT *st;
for (st = trig->head; st != NULL; st = st->next)
{
if ((!str_prefix ("otherwise", st->to_do) || !str_prefix ("else", st->to_do))
&& grab_num (st->to_do) == num_if)
{
mob->ced->cur_line = st->label;
goto fnn;
}
}
}
fnn:
continue;
}
else if (!str_prefix ("jump", arg1))
{
SCRIPT_DAT *st;
for (st = trig->head; st != NULL; st = st->next)
{
if (!str_prefix (arg2, st->to_do))
{
mob->ced->cur_line = st->label;
goto fnnt;
}
}
fnnt:
if (mob) {};
}
else if (!str_prefix ("otherwise", arg1) || !str_prefix ("else", arg1))
continue;
if (!str_cmp (arg1, "do"))
{
interpret (mob, cscr (sdat->to_do + 3, mob, plr, obj));
}
else if (!str_cmp (arg1, "pset"))
{
do_pset (mob, cscr (sdat->to_do + 4, mob, plr, obj));
}
else if (!str_cmp (arg1, "award"))
{
char tmp[500];
sprintf (tmp, "%s %s %s", arg2, arg3, arg4);
do_award_skill (mob, tmp);
}
else if (!str_cmp (arg1, "createobj"))
{
OBJ_PROTOTYPE *oid;
SINGLE_OBJECT *obj;
int vnum;
vnum = atoi (arg2);
if (vnum > 1)
{
if ((oid = get_obj_index (vnum)) != NULL)
{
obj = create_object (oid, 5);
if (!CAN_WEAR (obj, ITEM_TAKE))
{
obj_to (obj, mob->in_room);
}
else
obj_to (obj, mob);
}
}
}
else if (!str_prefix ("destroy", arg1))
{
SINGLE_OBJECT *oo;
int i;
i = atoi (arg2);
for (oo = mob->carrying; oo != NULL; oo = oo->next_content)
{
if (oo->pIndexData->vnum == i)
{
free_it (oo);
goto kdj;
}
}
kdj:
continue;
}
else if (!str_cmp (arg1, "createmob"))
{
MOB_PROTOTYPE *mid;
CHAR_DATA *new_mob;
int vnum;
vnum = atoi (arg2);
if (vnum > 1)
{
if ((mid = get_mob_index (vnum)) != NULL)
{
new_mob = create_mobile (mid);
char_to_room (new_mob, mob->in_room);
}
}
}
else if (!str_cmp (arg1, "wait"))
{
mob->ced->scr_wait = UMAX (0, (atoi (arg2)));
if (!str_cmp (arg3, "char_tick"))
mob->ced->wait_type = WAIT_TYPE_CHAR_TICK;
else if (!str_cmp (arg3, "combat_tick"))
mob->ced->wait_type = WAIT_TYPE_COMBAT_TICK;
else if (!str_cmp (arg3, "small_tick"))
mob->ced->wait_type = WAIT_TYPE_SMALL_TICK;
else if (!str_cmp (arg3, "quick"))
mob->ced->wait_type = WAIT_TYPE_PULSE;
else
mob->ced->wait_type = 0;
for (trig = mob->pIndexData->trig_list; trig != NULL; trig = trig->next)
{
for (sdat = trig->head; sdat != NULL; sdat = sdat->next)
{
if (sdat->label == mob->ced->cur_line + 1)
{
if (sdat->player != NULL)
{
free_m (sdat->player);
}
sdat->player = (char *) mem_alloc (strlen (plr) + 1);
strcpy (sdat->player, plr);
goto brk;
}
}
}
brk:
return;
}
else if (!str_cmp (arg1, "disable"))
{
trig->active = FALSE;
goto done;
}
}
/*END SCRIPT INTERPRETATION */
}
done:
mob->ced->cur_line = 0;
return;
}