/**************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefiting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************
* 1stMUD ROM Derivative (c) 2001-2003 by Ryan Jennings *
* http://1stmud.dlmud.com/ <r-jenn@shaw.ca> *
***************************************************************************/
/***************************************************************************
* File: olc.c *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
* *
* This code was freely distributed with the The Isles 1.1 source code, *
* and has been used here for OLC - OLC would not be what it is without *
* all the previous coders who released their source code. *
* *
***************************************************************************/
#include "merc.h"
#include "tables.h"
#include "olc.h"
#include "interp.h"
#include "lookup.h"
#include "recycle.h"
#include "music.h"
#include "tablesave.h"
MOB_INDEX_DATA xMob;
OBJ_INDEX_DATA xObj;
ROOM_INDEX_DATA xRoom;
AREA_DATA xArea;
PROG_CODE xMProg;
PROG_CODE xOProg;
PROG_CODE xRProg;
HELP_DATA xHelp;
SOCIAL_DATA xSoc;
CLAN_DATA xClan;
CMD_DATA xCmd;
SKILL_DATA xSkill;
GROUP_DATA xGroup;
RACE_DATA xRace;
CLASS_DATA xClass;
DEITY_DATA xDeity;
CHANNEL_DATA xChan;
MUD xMud;
SONG_DATA xSong;
const struct olc_ed_type olc_ed_table[ED_MAX] = {
{"AEdit", "area", ED_AREA, aedit_show, do_aedit, area_olc_comm_table},
{"REdit", "room", ED_ROOM, redit_show, do_redit, room_olc_comm_table},
{"OEdit", "object", ED_OBJECT, oedit_show, do_oedit, obj_olc_comm_table},
{"MEdit", "mobile", ED_MOBILE, medit_show, do_medit, mob_olc_comm_table},
{"HEdit", "help", ED_HELP, hedit_show, do_hedit, help_olc_comm_table},
{"MPEdit", "mobile program", ED_MPCODE, mpedit_show, do_mpedit,
mprog_olc_comm_table},
{"OPEdit", "object program", ED_OPCODE, opedit_show, do_opedit,
oprog_olc_comm_table},
{"RPEdit", "room program", ED_RPCODE, rpedit_show, do_rpedit,
rprog_olc_comm_table},
{"CEdit", "clan", ED_CLAN, cedit_show, do_cedit, clan_olc_comm_table},
{"RAEdit", "race", ED_RACE, raedit_show, do_raedit, race_olc_comm_table},
{"SEdit", "social", ED_SOCIAL, sedit_show, do_sedit, social_olc_comm_table},
{"SKEdit", "skill", ED_SKILL, skedit_show, do_skedit, skill_olc_comm_table},
{"MudEdit", "mud", ED_MUD, mudedit_show, do_mudedit, mud_olc_comm_table},
{"GREdit", "group", ED_GROUP, gredit_show, do_gredit, group_olc_comm_table},
{"DEdit", "deity", ED_DEITY, dedit_show, do_dedit, deity_olc_comm_table},
{"CmdEdit", "command", ED_CMD, cmdedit_show, do_cmdedit, cmd_olc_comm_table},
{"ClEdit", "class", ED_CLASS, cledit_show, do_cledit, class_olc_comm_table},
{"ChanEdit", "channel", ED_CHAN, chanedit_show, do_chanedit,
chan_olc_comm_table},
{"SongEdit", "song", ED_SONG, songedit_show, do_songedit,
song_olc_comm_table}
};
OLCED_DATA *olc_lookup(int ed)
{
int i;
if (ed == ED_NONE)
return NULL;
for (i = 0; i < ED_MAX; i++)
if (olc_ed_table[i].ed == ed)
return &olc_ed_table[i];
return NULL;
}
AREA_DATA *get_olc_area(DESCRIPTOR_DATA * d)
{
if (d->editor == ED_NONE || d->pEdit == NULL)
return NULL;
switch (d->editor)
{
case ED_AREA:
return (AREA_DATA *) d->pEdit;
case ED_ROOM:
return ((ROOM_INDEX_DATA *) d->pEdit)->area;
case ED_OBJECT:
return ((OBJ_INDEX_DATA *) d->pEdit)->area;
case ED_MOBILE:
return ((MOB_INDEX_DATA *) d->pEdit)->area;
case ED_MPCODE:
case ED_OPCODE:
case ED_RPCODE:
return ((PROG_CODE *) d->pEdit)->area;
default:
return NULL;
}
}
void olcedit(CHAR_DATA * ch, const char *argument, OLCED_DATA * table)
{
AREA_DATA *pArea;
pArea = get_olc_area(ch->desc);
if (pArea && !IS_BUILDER(ch, pArea))
{
chprintlnf(ch, "%s: Insufficient security to modify %s.", table->name,
table->longname);
edit_done(ch);
return;
}
if (!str_cmp(argument, "done"))
{
edit_done(ch);
return;
}
if (emptystring(argument))
{
if (table->show != NULL)
(*table->show) (ch, argument);
return;
}
if (!table->table || !process_olc_command(ch, argument, table->table))
interpret(ch, argument);
return;
}
bool run_olc_editor(DESCRIPTOR_DATA * d, char *incomm)
{
OLCED_DATA *ed;
if ((ed = olc_lookup(d->editor)) == NULL)
return FALSE;
olcedit(CH(d), incomm, ed);
return TRUE;
}
OLC_FUN *get_olc_show(int editor)
{
OLCED_DATA *ed;
if ((ed = olc_lookup(editor)) == NULL)
return NULL;
return ed->show;
}
const char *olc_ed_name(DESCRIPTOR_DATA * d)
{
OLCED_DATA *ed;
if (!d)
return &str_empty[0];
if ((ed = olc_lookup(d->editor)) == NULL)
return &str_empty[0];
return ed->name;
}
const char *olc_ed_name_long(CHAR_DATA * ch)
{
OLCED_DATA *ed;
if (!ch->desc)
return "Switched";
if (IS_NPC(ch))
return &str_empty[0];
if ((ed = olc_lookup(ch->desc->editor)) == NULL)
return &str_empty[0];
return ed->longname;
}
char *olc_ed_vnum(DESCRIPTOR_DATA * d)
{
AREA_DATA *pArea;
ROOM_INDEX_DATA *pRoom;
OBJ_INDEX_DATA *pObj;
MOB_INDEX_DATA *pMob;
PROG_CODE *pMprog;
PROG_CODE *pOprog;
PROG_CODE *pRprog;
HELP_DATA *pHelp;
CLAN_DATA *pClan;
SOCIAL_DATA *pSocial;
CMD_DATA *pCmd;
SKILL_DATA *pSkill;
GROUP_DATA *pGroup;
RACE_DATA *pRace;
CLASS_DATA *pClass;
DEITY_DATA *pDeity;
CHANNEL_DATA *pChan;
SONG_DATA *pSong;
static char buf[MIL];
buf[0] = '\0';
switch (d->editor)
{
case ED_AREA:
pArea = (AREA_DATA *) d->pEdit;
sprintf(buf, "%d", pArea ? pArea->vnum : 0);
break;
case ED_ROOM:
pRoom = CH(d)->in_room;
sprintf(buf, "%ld", pRoom ? pRoom->vnum : 0);
break;
case ED_OBJECT:
pObj = (OBJ_INDEX_DATA *) d->pEdit;
sprintf(buf, "%ld", pObj ? pObj->vnum : 0);
break;
case ED_MOBILE:
pMob = (MOB_INDEX_DATA *) d->pEdit;
sprintf(buf, "%ld", pMob ? pMob->vnum : 0);
break;
case ED_MPCODE:
pMprog = (PROG_CODE *) d->pEdit;
sprintf(buf, "%ld", pMprog ? pMprog->vnum : 0);
break;
case ED_OPCODE:
pOprog = (PROG_CODE *) d->pEdit;
sprintf(buf, "%ld", pOprog ? pOprog->vnum : 0);
break;
case ED_RPCODE:
pRprog = (PROG_CODE *) d->pEdit;
sprintf(buf, "%ld", pRprog ? pRprog->vnum : 0);
break;
case ED_HELP:
pHelp = (HELP_DATA *) d->pEdit;
sprintf(buf, "%s", pHelp ? pHelp->keyword : "");
break;
case ED_SOCIAL:
pSocial = (SOCIAL_DATA *) d->pEdit;
sprintf(buf, "%s", pSocial ? pSocial->name : "");
break;
case ED_CLAN:
pClan = (CLAN_DATA *) d->pEdit;
sprintf(buf, "%s", pClan ? pClan->name : "");
break;
case ED_CMD:
pCmd = (CMD_DATA *) d->pEdit;
sprintf(buf, "%s", pCmd ? pCmd->name : "");
break;
case ED_SKILL:
pSkill = (SKILL_DATA *) d->pEdit;
sprintf(buf, "%s", pSkill ? pSkill->name : "");
break;
case ED_GROUP:
pGroup = (GROUP_DATA *) d->pEdit;
sprintf(buf, "%s", pGroup ? pGroup->name : "");
break;
case ED_RACE:
pRace = (RACE_DATA *) d->pEdit;
sprintf(buf, "%s", pRace ? pRace->name : "");
break;
case ED_CLASS:
pClass = (CLASS_DATA *) d->pEdit;
sprintf(buf, "%s", pClass ? pClass->name : "");
break;
case ED_DEITY:
pDeity = (DEITY_DATA *) d->pEdit;
sprintf(buf, "%s", pDeity ? pDeity->name : "");
break;
case ED_CHAN:
pChan = (CHANNEL_DATA *) d->pEdit;
sprintf(buf, "%s", pChan ? pChan->name : "");
break;
case ED_SONG:
pSong = (SONG_DATA *) d->pEdit;
sprintf(buf, "%s", pSong ? pSong->name : "");
break;
case ED_MUD:
strcpy(buf, MUD_NAME);
break;
default:
sprintf(buf, " ");
break;
}
return buf;
}
void stop_editing(void *OLC)
{
DESCRIPTOR_DATA *d;
for (d = descriptor_first; d != NULL; d = d->next)
{
if (d->pEdit == NULL || d->character == NULL)
continue;
if (d->pEdit == (void *) OLC)
edit_done(d->character);
}
return;
}
/*****************************************************************************
Name: show_commands
Purpose: Display all olc commands.
Called by: olc interpreters.
****************************************************************************/
bool show_commands(CHAR_DATA * ch, char *argument)
{
char buf[MSL];
char buf1[MSL];
int cmd;
int col;
OLCED_DATA *ed;
buf1[0] = '\0';
col = 0;
if ((ed = olc_lookup(ch->desc->editor)) == NULL || ed->table == NULL)
{
bugf("table NULL, editor %d", ch->desc->editor);
return FALSE;
}
for (cmd = 0; ed->table[cmd].name != NULL; cmd++)
{
sprintf(buf, "%-15.15s", ed->table[cmd].name);
strcat(buf1, buf);
if (++col % 5 == 0)
strcat(buf1, "\n\r");
}
if (col % 5 != 0)
strcat(buf1, "\n\r");
chprint(ch, buf1);
return FALSE;
}
/*****************************************************************************
* Interpreter Tables. *
*****************************************************************************/
const struct olc_comm_type mob_olc_comm_table[] = {
{"name", (void *) &xMob.player_name, olced_str, NULL, NULL},
{"short", (void *) &xMob.short_descr, olced_str, NULL, NULL},
{"long", (void *) &xMob.long_descr, olced_str, (const void *) 1, NULL},
{"desc", (void *) &xMob.description, olced_desc, NULL, NULL},
{"level", (void *) &xMob.level, olced_number,
NULL, validate_level},
{"align", (void *) &xMob.alignment, olced_number,
NULL, validate_align},
{"group", (void *) &xMob.group, olced_olded, (const void *) medit_group,
NULL},
{"imm", (void *) &xMob.imm_flags, olced_flag, (const void *) imm_flags,
NULL},
{"res", (void *) &xMob.res_flags, olced_flag, (const void *) res_flags,
NULL},
{"vuln", (void *) &xMob.vuln_flags, olced_flag, (const void *) vuln_flags,
NULL},
{"act", (void *) &xMob.act, olced_flag, (const void *) act_flags, NULL},
{"affect", (void *) &xMob.affected_by, olced_flag,
(const void *) affect_flags, NULL},
{"off", (void *) &xMob.off_flags, olced_flag, (const void *) off_flags, NULL},
{"form", (void *) &xMob.form, olced_flag, (const void *) form_flags, NULL},
{"parts", (void *) &xMob.parts, olced_flag, (const void *) part_flags, NULL},
{"shop", (void *) &xMob, olced_shop, NULL, NULL},
{"create", NULL, olced_olded, (const void *) medit_create, NULL},
{"delete", NULL, olced_olded, (const void *) medit_delete, NULL},
{"material", (void *) &xMob.material, olced_str, NULL, NULL},
{"addprog", (void *) &xMob.first_mprog, olced_addprog,
(const void *) &xMob.last_mprog, NULL},
{"delprog", (void *) &xMob.first_mprog, olced_delprog,
(const void *) &xMob.last_mprog, NULL},
{"spec", (void *) &xMob.spec_fun, olced_spec, NULL, NULL},
{"sex", (void *) &xMob.sex, olced_flag, (const void *) sex_flags, NULL},
{"size", (void *) &xMob.size, olced_flag, (const void *) size_flags, NULL},
{"startpos", (void *) &xMob.start_pos, olced_flag,
(const void *) position_flags, NULL},
{"defaultpos", (void *) &xMob.default_pos, olced_flag,
(const void *) position_flags, NULL},
{"autoeasy", NULL, olced_olded, (const void *) medit_autoeasy, NULL},
{"autoset", NULL, olced_olded, (const void *) medit_autoset, NULL},
{"autohard", NULL, olced_olded, (const void *) medit_autohard, NULL},
{"damtype", (void *) &xMob.dam_type, olced_poslookup,
(const void *) attack_lookup, NULL},
{"race", (void *) &xMob, olced_race, NULL, NULL},
{"armor", (void *) &xMob, olced_ac, NULL, NULL},
{"hitdice", (void *) &xMob.hit[0], olced_dice, NULL, NULL},
{"manadice", (void *) &xMob.mana[0], olced_dice, NULL, NULL},
{"damdice", (void *) &xMob.damage[0], olced_dice, NULL, NULL},
{"hitroll", (void *) &xMob.hitroll, olced_number, NULL, NULL},
{"wealth", (void *) &xMob.wealth, olced_number_long, NULL, NULL},
{"show", NULL, olced_olded, (const void *) medit_show, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type obj_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) oedit_show, NULL},
{"create", NULL, olced_olded, (const void *) oedit_create, NULL},
{"name", (void *) &xObj.name, olced_str, NULL, NULL},
{"short", (void *) &xObj.short_descr, olced_str, NULL, NULL},
{"long", (void *) &xObj.description, olced_str, NULL, NULL},
{"addaffect", NULL, olced_olded, (const void *) oedit_addaffect, NULL},
{"addapply", NULL, olced_olded, (const void *) oedit_addapply, NULL},
{"delaffect", NULL, olced_olded, (const void *) oedit_delaffect, NULL},
{"autoweapon", NULL, olced_olded, (const void *) oedit_autoweapon, NULL},
{"autoarmor", NULL, olced_olded, (const void *) oedit_autoarmor, NULL},
{"v0", NULL, olced_value, (const void *) 0, NULL},
{"v1", NULL, olced_value, (const void *) 1, NULL},
{"v2", NULL, olced_value, (const void *) 2, NULL},
{"v3", NULL, olced_value, (const void *) 3, NULL},
{"v4", NULL, olced_value, (const void *) 4, NULL},
{"material", (void *) &xObj.material, olced_str, NULL, NULL},
{"weight", (void *) &xObj.weight, olced_number, NULL, NULL},
{"cost", (void *) &xObj.cost, olced_number_long, NULL, NULL},
{"ed", (void *) &xObj.first_extra_descr, olced_ed,
(const void *) &xObj.last_extra_descr, NULL},
{"delete", NULL, olced_olded, (const void *) oedit_delete, NULL},
{"extra", (void *) &xObj.extra_flags, olced_flag,
(const void *) extra_flags, NULL},
{"wear", (void *) &xObj.wear_flags, olced_flag,
(const void *) wear_flags, NULL},
{"type", (void *) &xObj.item_type, olced_flag,
(const void *) type_flags, NULL},
{"level", (void *) &xObj.level, olced_number, NULL,
validate_level},
{"addprog", (void *) &xObj.first_oprog, olced_addprog,
(const void *) &xObj.last_oprog, NULL},
{"delprog", (void *) &xObj.first_oprog, olced_delprog,
(const void *) &xObj.last_oprog, NULL},
{"condition", (void *) &xObj.condition, olced_number, NULL, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type room_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) redit_show, NULL},
{"create", NULL, olced_olded, (const void *) redit_create, NULL},
{"name", (void *) &xRoom.name, olced_str, NULL, NULL},
{"desc", (void *) &xRoom.description, olced_desc, NULL, NULL},
{"ed", (void *) &xRoom.first_extra_descr, olced_ed,
(const void *) &xRoom.last_extra_descr, NULL},
{"format", NULL, olced_olded, (const void *) redit_format, NULL},
{"north", NULL, olced_direction, (const void *) DIR_NORTH, NULL},
{"south", NULL, olced_direction, (const void *) DIR_SOUTH, NULL},
{"east", NULL, olced_direction, (const void *) DIR_EAST, NULL},
{"west", NULL, olced_direction, (const void *) DIR_WEST, NULL},
{"up", NULL, olced_direction, (const void *) DIR_UP, NULL},
{"down", NULL, olced_direction, (const void *) DIR_DOWN, NULL},
{"mreset", NULL, olced_olded, (const void *) redit_mreset, NULL},
{"oreset", NULL, olced_olded, (const void *) redit_oreset, NULL},
{"mshow", NULL, olced_olded, (const void *) redit_mshow, NULL},
{"oshow", NULL, olced_olded, (const void *) redit_oshow, NULL},
{"clan", NULL, olced_olded, (const void *) redit_clan, NULL},
{"purge", NULL, olced_docomm, (const void *) do_purge, NULL},
{"heal", (void *) &xRoom.heal_rate, olced_number, NULL, NULL},
{"mana", (void *) &xRoom.mana_rate, olced_number, NULL, NULL},
{"owner", (void *) &xRoom.owner, olced_str, NULL, NULL},
{"room", (void *) &xRoom.room_flags, olced_flag,
(const void *) room_flags, NULL},
{"olist", NULL, olced_olded, (const void *) redit_olist, NULL},
{"mlist", NULL, olced_olded, (const void *) redit_mlist, NULL},
{"rlist", NULL, olced_olded, (const void *) redit_rlist, NULL},
{"sector", (void *) &xRoom.sector_type, olced_flag,
(const void *) sector_flags, NULL},
{"addprog", (void *) &xRoom.first_rprog, olced_addprog,
(const void *) &xRoom.last_rprog, NULL},
{"delprog", (void *) &xRoom.first_rprog, olced_delprog,
(const void *) &xRoom.last_rprog, NULL},
{"delete", NULL, olced_olded, (const void *) redit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type area_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) aedit_show, NULL},
{"create", NULL, olced_olded, (const void *) aedit_create, NULL},
{"name", (void *) &xArea.name, olced_str, NULL, NULL},
{"file", NULL, olced_olded, (const void *) aedit_file, NULL},
{"age", (void *) &xArea.age, olced_number, NULL, NULL},
{"reset", NULL, olced_olded, (const void *) aedit_reset, NULL},
{"security", (void *) &xArea.security, olced_number, NULL, NULL},
{"lvlmsg", (void *) &xArea.lvl_comment, olced_str, NULL, NULL},
{"minlvl", (void *) &xArea.min_level, olced_number, NULL, NULL},
{"maxlvl", (void *) &xArea.max_level, olced_number, NULL, NULL},
{"builder", NULL, olced_olded, (const void *) aedit_builder, NULL},
{"vnum", NULL, olced_olded, (const void *) aedit_vnum, NULL},
{"lvnum", NULL, olced_olded, (const void *) aedit_lvnum, NULL},
{"uvnum", NULL, olced_olded, (const void *) aedit_uvnum, NULL},
{"credits", (void *) &xArea.credits, olced_str, NULL, NULL},
{"climate", NULL, olced_olded, (const void *) aedit_climate, NULL},
{"flag", (void *) &xArea.area_flags, olced_flag,
(const void *) area_flags, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type mprog_olc_comm_table[] = {
{"create", NULL, olced_olded, (const void *) mpedit_create, NULL},
{"code", (void *) &xMProg.code, olced_desc, NULL, NULL},
{"show", NULL, olced_olded, (const void *) mpedit_show, NULL},
{"list", NULL, olced_olded, (const void *) mpedit_list, NULL},
{"delete", NULL, olced_olded, (const void *) mpedit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type oprog_olc_comm_table[] = {
{"create", NULL, olced_olded, (const void *) opedit_create, NULL},
{"code", (void *) &xOProg.code, olced_desc, NULL, NULL},
{"show", NULL, olced_olded, (const void *) opedit_show, NULL},
{"list", NULL, olced_olded, (const void *) opedit_list, NULL},
{"delete", NULL, olced_olded, (const void *) opedit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type rprog_olc_comm_table[] = {
{"create", NULL, olced_olded, (const void *) rpedit_create, NULL},
{"code", (void *) &xRProg.code, olced_desc, NULL, NULL},
{"show", NULL, olced_olded, (const void *) rpedit_show, NULL},
{"list", NULL, olced_olded, (const void *) rpedit_list, NULL},
{"delete", NULL, olced_olded, (const void *) rpedit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type help_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) hedit_show, NULL},
{"make", NULL, olced_olded, (const void *) hedit_new, NULL},
{"text", (void *) &xHelp.text, olced_desc, NULL, NULL},
{"level", (void *) &xHelp.level, olced_number, NULL,
validate_level},
{"keywords", (void *) &xHelp.keyword, olced_str, NULL, NULL},
{"delete", NULL, olced_olded, (const void *) hedit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type clan_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) cedit_show, NULL},
{"name", (void *) &xClan.name, olced_str, NULL, NULL},
{"who", (void *) &xClan.who_name, olced_str, NULL, NULL},
{"independent", (void *) &xClan.independent, olced_bool, NULL, NULL},
{"hall", (void *) &xClan.hall, olced_number, NULL, NULL},
{"delete", NULL, olced_olded, (const void *) cedit_delete, NULL},
{"create", NULL, olced_olded, (const void *) cedit_create, NULL},
{"rank", NULL, olced_olded, (const void *) cedit_rank, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type social_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) sedit_show, NULL},
{"name", NULL, olced_olded, (const void *) sedit_name, NULL},
{"create", NULL, olced_olded, (const void *) sedit_create, NULL},
{"delete", NULL, olced_olded, (const void *) sedit_delete, NULL},
{"cnoarg", (void *) &xSoc.char_no_arg, olced_str, NULL, NULL},
{"onoarg", (void *) &xSoc.others_no_arg, olced_str, NULL, NULL},
{"cfound", (void *) &xSoc.char_found, olced_str, NULL, NULL},
{"ofound", (void *) &xSoc.others_found, olced_str, NULL, NULL},
{"vfound", (void *) &xSoc.vict_found, olced_str, NULL, NULL},
{"cself", (void *) &xSoc.char_auto, olced_str, NULL, NULL},
{"oself", (void *) &xSoc.others_auto, olced_str, NULL, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type cmd_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) cmdedit_show, NULL},
{"create", NULL, olced_olded, (const void *) cmdedit_create, NULL},
{"name", NULL, olced_olded, (const void *) cmdedit_name, NULL},
{"rearrange", NULL, olced_olded, (void *) cmdedit_rearrange, NULL},
{"level", (void *) &xCmd.level, olced_number, NULL,
validate_level},
{"position", (void *) &xCmd.position, olced_flag,
(const void *) position_flags, NULL},
{"log", (void *) &xCmd.log, olced_flag, (const void *) log_flags, NULL},
{"fShow", (void *) &xCmd.show, olced_bool, NULL, NULL},
{"dofun", NULL, olced_olded, (const void *) cmdedit_dofun, NULL},
{"delete", NULL, olced_olded, (const void *) cmdedit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type skill_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) skedit_show, NULL},
{"create", NULL, olced_olded, (const void *) skedit_create, NULL},
{"name", (void *) &xSkill.name, olced_str, NULL, NULL},
{"levels", NULL, olced_olded, (const void *) skedit_levels, NULL},
{"ratings", NULL, olced_olded, (const void *) skedit_ratings, NULL},
{"spellfun", NULL, olced_olded, (const void *) skedit_spellfun, NULL},
{"target", (void *) &xSkill.target, olced_flag,
(const void *) target_flags, NULL},
{"minpos", (void *) &xSkill.minimum_position, olced_flag,
(const void *) position_flags, NULL},
{"gsn", NULL, olced_olded, (const void *) skedit_gsn, NULL},
{"minmana", (void *) &xSkill.min_mana, olced_number, NULL, NULL},
{"beats", (void *) &xSkill.beats, olced_number, NULL, NULL},
{"damnoun", (void *) &xSkill.noun_damage, olced_str, NULL, NULL},
{"msgoff", (void *) &xSkill.msg_off, olced_str, NULL, NULL},
{"msgobj", (void *) &xSkill.msg_obj, olced_str, NULL, NULL},
{"delete", NULL, olced_olded, (const void *) skedit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type group_olc_comm_table[] = {
{"show", NULL, olced_olded, (const void *) gredit_show, NULL},
{"create", NULL, olced_olded, (const void *) gredit_create, NULL},
{"name", (void *) &xGroup.name, olced_str, NULL,
validate_groupname},
{"ratings", NULL, olced_olded, (const void *) gredit_ratings, NULL},
{"spells", NULL, olced_olded, (const void *) gredit_spells, NULL},
{"delete", NULL, olced_olded, (const void *) gredit_delete, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type race_olc_comm_table[] = {
{"create", NULL, olced_olded, (const void *) raedit_create, NULL},
{"delete", NULL, olced_olded, (const void *) raedit_delete, NULL},
{"show", NULL, olced_olded, (const void *) raedit_show, NULL},
{"name", NULL, olced_olded, (const void *) raedit_name, NULL},
{"act", (void *) &xRace.act, olced_flag, (const void *) act_flags, NULL},
{"aff", (void *) &xRace.aff, olced_flag, (const void *) affect_flags, NULL},
{"form", (void *) &xRace.form, olced_flag, (const void *) form_flags, NULL},
{"off", (void *) &xRace.off, olced_flag, (const void *) off_flags, NULL},
{"imm", (void *) &xRace.imm, olced_flag, (const void *) imm_flags, NULL},
{"res", (void *) &xRace.res, olced_flag, (const void *) res_flags, NULL},
{"vuln", (void *) &xRace.vuln, olced_flag, (const void *) vuln_flags, NULL},
{"parts", (void *) &xRace.parts, olced_flag, (const void *) part_flags, NULL},
{"pcrace", (void *) &xRace.pc_race, olced_bool, NULL, NULL},
{"points", (void *) &xRace.points, olced_number, NULL, NULL},
{"list", NULL, olced_olded, (const void *) raedit_list, NULL},
{"stats", NULL, olced_olded, (const void *) raedit_stats, NULL},
{"mstats", NULL, olced_olded, (const void *) raedit_mstats, NULL},
{"skills", NULL, olced_olded, (const void *) raedit_skills, NULL},
{"size", (void *) &xRace.size, olced_flag, (const void *) size_flags, NULL},
{"classx", NULL, olced_olded, (const void *) raedit_classx, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type class_olc_comm_table[] = {
{"create", NULL, olced_olded, (const void *) cledit_create, NULL},
{"delete", NULL, olced_olded, (const void *) cledit_delete, NULL},
{"show", NULL, olced_olded, (const void *) cledit_show, NULL},
{"name", (void *) &xClass.name, olced_str, NULL,
validate_classname},
{"prime", NULL, olced_olded, (const void *) cledit_prime, NULL},
{"weapon", (void *) &xClass.weapon, olced_vnum, NULL,
validate_weapon},
{"adept", (void *) &xClass.skill_adept, olced_number, NULL,
validate_adept},
{"thac0", (void *) &xClass.thac0_00, olced_number, NULL, NULL},
{"thac32", (void *) &xClass.thac0_32, olced_number, NULL, NULL},
{"hpmin", (void *) &xClass.hp_min, olced_number, NULL,
validate_hmv},
{"hpmax", (void *) &xClass.hp_max, olced_number, NULL,
validate_hmv},
{"fmana", (void *) &xClass.fMana, olced_bool, NULL, NULL},
{"guilds", NULL, olced_olded, (const void *) cledit_guilds, NULL},
{"basegroup", (void *) &xClass.base_group, olced_str, NULL,
validate_group},
{"default", (void *) &xClass.default_group, olced_str, NULL,
validate_group},
{"skill", NULL, olced_olded, (const void *) cledit_skill, NULL},
{"commands", NULL, olced_olded, (const void *) show_commands, NULL},
{"?", NULL, olced_olded, (const void *) show_help, NULL},
{"version", NULL, olced_olded, (const void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type deity_olc_comm_table[] = {
{"show", NULL, olced_olded, (void *) dedit_show, NULL},
{"create", NULL, olced_olded, (void *) dedit_create, NULL},
{"delete", NULL, olced_olded, (void *) dedit_delete, NULL},
{"list", NULL, olced_olded, (void *) dedit_list, NULL},
{"name", (void *) &xDeity.name, olced_str, NULL, NULL},
{"desc", (void *) &xDeity.desc, olced_str, NULL, NULL},
{"skill", (void *) &xDeity.skillname, olced_str, NULL, NULL},
{"commands", NULL, olced_olded, (void *) show_commands, NULL},
{"?", NULL, olced_olded, (void *) show_help, NULL},
{"version", NULL, olced_olded, (void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type chan_olc_comm_table[] = {
{"show", NULL, olced_olded, (void *) chanedit_show, NULL},
{"create", NULL, olced_olded, (void *) chanedit_create, NULL},
{"gcn", NULL, olced_olded, (void *) chanedit_gcn, NULL},
{"type", (void *) &xChan.spec_flag, olced_flag, (void *) chan_types, NULL},
{"bit", (void *) &xChan.bit, olced_flag, (void *) comm_flags, NULL},
{"format", (void *) &xChan.format, olced_str, NULL, NULL},
{"name", (void *) &xChan.name, olced_str, NULL, NULL},
{"description", (void *) &xChan.description, olced_str, NULL, NULL},
{"colour", NULL, olced_olded, (void *) chanedit_colour, NULL},
{"length", (void *) &xChan.page_length, olced_number, NULL, NULL},
{"delete", NULL, olced_olded, (void *) chanedit_delete, NULL},
{"list", NULL, olced_olded, (void *) chanedit_list, NULL},
{"commands", NULL, olced_olded, (void *) show_commands, NULL},
{"?", NULL, olced_olded, (void *) show_help, NULL},
{"version", NULL, olced_olded, (void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type mud_olc_comm_table[] = {
{"show", NULL, olced_olded, (void *) mudedit_show, NULL},
{"flags", (void *) &xMud.mud_flags, olced_flag, (void *) mud_flags, NULL},
{"pulsepersec", (void *) &xMud.pulsepersec, olced_number, NULL, NULL},
{"rand_factor", (void *) &xMud.rand_factor, olced_number, NULL, NULL},
{"weath_unit", (void *) &xMud.weath_unit, olced_number, NULL, NULL},
{"max_vector", (void *) &xMud.max_vector, olced_number, NULL, NULL},
{"climate_factor", (void *) &xMud.climate_factor, olced_number, NULL, NULL},
{"commands", NULL, olced_olded, (void *) show_commands, NULL},
{"?", NULL, olced_olded, (void *) show_help, NULL},
{"version", NULL, olced_olded, (void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
const struct olc_comm_type song_olc_comm_table[] = {
{"show", NULL, olced_olded, (void *) songedit_show, NULL},
{"group", (void *) &xSong.group, olced_str, NULL, NULL},
{"name", (void *) &xSong.name, olced_str, NULL, NULL},
{"lyrics", NULL, olced_olded, (void *) songedit_lyrics, NULL},
{"delete", NULL, olced_olded, (void *) songedit_delete, NULL},
{"create", NULL, olced_olded, (void *) songedit_create, NULL},
{"commands", NULL, olced_olded, (void *) show_commands, NULL},
{"?", NULL, olced_olded, (void *) show_help, NULL},
{"version", NULL, olced_olded, (void *) show_version, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
/*****************************************************************************
* End Interpreter Tables. *
*****************************************************************************/
/*****************************************************************************
Name: get_area_data
Purpose: Returns pointer to area with given vnum.
Called by: do_aedit(olc.c).
****************************************************************************/
AREA_DATA *get_area_data(int vnum)
{
AREA_DATA *pArea;
for (pArea = area_first; pArea; pArea = pArea->next)
{
if (pArea->vnum == vnum)
return pArea;
}
return 0;
}
/*****************************************************************************
Name: edit_done
Purpose: Resets builder information on completion.
Called by: aedit, redit, oedit, medit(olc.c)
****************************************************************************/
bool edit_done(CHAR_DATA * ch)
{
if (ch->desc->editor != ED_NONE)
{
act("$n stop using the $t editor.", ch, olc_ed_name_long(ch), NULL,
TO_ROOM);
act("You stop using the $t editor.", ch, olc_ed_name_long(ch), NULL,
TO_CHAR);
}
ch->desc->pEdit = NULL;
ch->desc->editor = ED_NONE;
return FALSE;
}
/*****************************************************************************
* Interpreters. *
*****************************************************************************/
bool process_olc_command(CHAR_DATA * ch, const char *argument,
const struct olc_comm_type * table)
{
char arg[MIL];
AREA_DATA *tArea, *pArea;
MOB_INDEX_DATA *pMob;
OBJ_INDEX_DATA *pObj;
ROOM_INDEX_DATA *pRoom;
PROG_CODE *pMProg;
PROG_CODE *pOProg;
PROG_CODE *pRProg;
HELP_DATA *pHelp;
SOCIAL_DATA *pSoc;
CLAN_DATA *pClan;
CMD_DATA *pCmd;
SKILL_DATA *pSkill;
GROUP_DATA *pGroup;
RACE_DATA *pRace;
CLASS_DATA *pClass;
DEITY_DATA *pDeity;
CHANNEL_DATA *pChan;
MUD *nMud;
SONG_DATA *pSong;
int temp;
void *puntero;
const char *logline = argument;
argument = one_argument(argument, arg);
for (temp = 0; table[temp].name; temp++)
{
if (LOWER(arg[0]) == LOWER(table[temp].name[0])
&& !str_prefix(arg, table[temp].name))
{
if ((!IS_NPC(ch) && IS_SET(ch->act, PLR_LOG))
|| IS_SET(mud_info.mud_flags, MUD_LOGALL))
{
sprintf(log_buf, "Log %s: %s", ch->name, logline);
log_string(log_buf);
}
if (ch->desc != NULL && ch->desc->snoop_by != NULL)
{
d_print(ch->desc->snoop_by, "% ", 2);
d_println(ch->desc->snoop_by, logline, 0);
}
switch (ch->desc->editor)
{
case ED_MOBILE:
EDIT_MOB(ch, pMob);
tArea = pMob->area;
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xMob + (int) pMob);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate) && tArea)
SET_BIT(tArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_OBJECT:
EDIT_OBJ(ch, pObj);
tArea = pObj->area;
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xObj + (int) pObj);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate)
&& tArea != NULL)
SET_BIT(tArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_ROOM:
EDIT_ROOM(ch, pRoom);
tArea = pRoom->area;
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xRoom + (int) pRoom);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate)
&& tArea != NULL)
SET_BIT(tArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_AREA:
EDIT_AREA(ch, pArea);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xArea + (int) pArea);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
SET_BIT(pArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_MPCODE:
EDIT_MPCODE(ch, pMProg);
tArea = pMProg->area;
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xMProg + (int) pMProg);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
SET_BIT(tArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_OPCODE:
EDIT_OPCODE(ch, pOProg);
tArea = pOProg->area;
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xOProg + (int) pOProg);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
SET_BIT(tArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_RPCODE:
EDIT_RPCODE(ch, pRProg);
tArea = pRProg->area;
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xRProg + (int) pRProg);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
SET_BIT(tArea->area_flags, AREA_CHANGED);
return TRUE;
break;
case ED_HELP:
EDIT_HELP(ch, pHelp);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xHelp + (int) pHelp);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
save_helps();
return TRUE;
break;
case ED_SOCIAL:
EDIT_SOCIAL(ch, pSoc);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xSoc + (int) pSoc);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_socials(action_write);
return TRUE;
break;
case ED_CLAN:
EDIT_CLAN(ch, pClan);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xClan + (int) pClan);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_clans(action_write);
return TRUE;
break;
case ED_DEITY:
EDIT_DEITY(ch, pDeity);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xDeity +
(int) pDeity);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_deities(action_write);
return TRUE;
break;
case ED_CMD:
EDIT_CMD(ch, pCmd);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument -
(int) &xCmd + (int) pCmd);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_commands(action_write);
return TRUE;
break;
case ED_SKILL:
EDIT_SKILL(ch, pSkill);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xSkill +
(int) pSkill);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_skills(action_write);
return TRUE;
break;
case ED_GROUP:
EDIT_GROUP(ch, pGroup);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xGroup +
(int) pGroup);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_groups(action_write);
return TRUE;
break;
case ED_RACE:
EDIT_RACE(ch, pRace);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xRace +
(int) pRace);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_races(action_write);
return TRUE;
break;
case ED_CLASS:
EDIT_CLASS(ch, pClass);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xClass +
(int) pClass);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_classes(action_write);
return TRUE;
break;
case ED_CHAN:
EDIT_CHAN(ch, pChan);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xChan +
(int) pChan);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_channels(action_write);
return TRUE;
break;
case ED_MUD:
EDIT_MUD(ch, nMud);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xMud +
(int) nMud);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_mud_data(action_write);
return TRUE;
break;
case ED_SONG:
EDIT_SONG(ch, pSong);
if (table[temp].argument)
puntero =
(void *) ((int) table[temp].argument - (int) &xSong +
(int) pSong);
else
puntero = NULL;
if ((*table[temp].function)
(table[temp].name, ch, argument, puntero,
table[temp].parameter, table[temp].validate))
rw_music(action_write);
return TRUE;
break;
}
}
}
return FALSE;
}
/* Entry point for all editors. */
CH_CMD(do_olc)
{
char command[MAX_INPUT_LENGTH];
int cmd;
if (IS_NPC(ch))
return;
argument = one_argument(argument, command);
if (IS_NULLSTR(command))
{
do_oldhelp(ch, "olc");
return;
}
/* Search Table and Dispatch Command. */
for (cmd = 0; cmd < ED_MAX; cmd++)
{
if (!str_prefix(command, olc_ed_table[cmd].name))
{
(*olc_ed_table[cmd].do_fun) (ch, argument);
return;
}
}
/* Invalid command, send help. */
do_oldhelp(ch, "olc");
return;
}
CHANNEL_DATA *get_chan_data(int chan)
{
if (chan >= 0 && chan < maxChannel)
return &channel_table[chan];
else
return NULL;
}
SONG_DATA *get_song_data(int song)
{
if (song >= 0 && song < maxSongs)
return &song_table[song];
else
return NULL;
}
SKILL_DATA *get_skill_data(int skill)
{
if (skill > -1 && skill < maxSkill)
return &skill_table[skill];
return &skill_table[0];
}
GROUP_DATA *get_group_data(int group)
{
if (group > -1 && group < maxGroup)
return &group_table[group];
return &group_table[0];
}
CLASS_DATA *get_class_data(int Class)
{
if (Class > -1 && Class < maxClass)
return &class_table[Class];
return &class_table[0];
}
void clean_area_links(AREA_DATA * target)
{
vnum_t vnum;
char buf[20];
for (vnum = target->min_vnum; vnum <= target->max_vnum; vnum++)
{
if (get_prog_index(vnum, PRG_MPROG) != NULL)
{
sprintf(buf, "%ld", vnum);
if (!mpedit_delete(NULL, buf))
bugf("Unable to delete Mprog %ld", vnum);
}
if (get_prog_index(vnum, PRG_OPROG) != NULL)
{
sprintf(buf, "%ld", vnum);
if (!opedit_delete(NULL, buf))
bugf("Unable to delete Oprog %ld", vnum);
}
if (get_prog_index(vnum, PRG_RPROG) != NULL)
{
sprintf(buf, "%ld", vnum);
if (!rpedit_delete(NULL, buf))
bugf("Unable to delete Rprog %ld", vnum);
}
if (get_room_index(vnum) != NULL)
{
sprintf(buf, "%ld", vnum);
if (!redit_delete(NULL, buf))
bugf("Unable to delete Room %ld", vnum);
}
if (get_obj_index(vnum) != NULL)
{
sprintf(buf, "%ld", vnum);
if (!oedit_delete(NULL, buf))
bugf("Unable to delete Object %ld", vnum);
}
if (get_mob_index(vnum) != NULL)
{
sprintf(buf, "%ld", vnum);
if (!medit_delete(NULL, buf))
bugf("Unable to delete Mobile %ld", vnum);
}
}
}
bool vnum_OK(vnum_t lnum, vnum_t hnum)
{
int i;
for (i = 0; vnum_table[i].vnum != -1; i++)
{
if (vnum_table[i].vnum >= lnum && vnum_table[i].vnum <= hnum)
return FALSE;
}
return TRUE;
}
/* Entry point for editing area_data. */
CH_CMD(do_aedit)
{
AREA_DATA *pArea;
int value;
char arg[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
pArea = ch->in_room->area;
argument = one_argument(argument, arg);
if (is_number(arg))
{
value = atoi(arg);
if (!(pArea = get_area_data(value)))
{
chprintln(ch, "That area vnum does not exist.");
return;
}
}
else if (!str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln(ch, "AEdit : Seguridad insuficiente para crear area.");
return;
}
aedit_create(ch, "");
ch->desc->editor = ED_AREA;
act("$n has entered the area editor.", ch, NULL, NULL, TO_ROOM);
return;
}
else if (!str_cmp(arg, "delete"))
{
char filename[512];
if (ch->pcdata->security < 9)
{
chprintln(ch, "AEdit : Seguridad insuficiente para delete area.");
return;
}
if (!is_number(argument) || !(pArea = get_area_data(atoi(argument))))
{
chprintln(ch, "That area vnum does not exist.");
return;
}
if (vnum_OK(pArea->min_vnum, pArea->max_vnum) == FALSE)
{
chprintln(ch,
"That area contains hard coded vnums and cannot be deleted.");
return;
}
clean_area_links(pArea);
sprintf(filename, "%s%s", AREA_DIR, pArea->file_name);
unlink(filename);
unlink_area(pArea);
free_area(pArea);
do_asave(NULL, "changed");
chprintln(ch, "Area deleted.");
return;
}
if (!IS_BUILDER(ch, pArea))
{
chprintln(ch, "Insuficiente seguridad para editar areas.");
return;
}
edit_start(ch, pArea, ED_AREA);
return;
}
/* Entry point for editing room_index_data. */
CH_CMD(do_redit)
{
ROOM_INDEX_DATA *pRoom;
char arg1[MAX_STRING_LENGTH];
if (IS_NPC(ch))
return;
argument = one_argument(argument, arg1);
pRoom = ch->in_room;
if (!str_cmp(arg1, "reset")) /* redit reset */
{
if (!IS_BUILDER(ch, pRoom->area))
{
chprintln(ch, "Insufficient security to modify cuartos.");
return;
}
reset_room(pRoom);
chprintln(ch, "Room reset.");
return;
}
else if (!str_cmp(arg1, "create")) /* redit create <vnum> */
{
if (IS_NULLSTR(argument) || atol(argument) == 0)
{
chprintln(ch, "Syntax: edit room create [vnum]");
return;
}
if (redit_create(ch, argument)) /* pEdit == nuevo cuarto */
{
ch->desc->editor = ED_ROOM;
act("$n has entered the room editor.", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, (ROOM_INDEX_DATA *) ch->desc->pEdit);
SET_BIT(((ROOM_INDEX_DATA *) ch->desc->pEdit)->area->area_flags,
AREA_CHANGED);
}
return;
}
else if (!str_cmp(arg1, "delete"))
{
redit_delete(ch, argument);
return;
}
else if (!IS_NULLSTR(arg1)) /* redit <vnum> */
{
pRoom = get_room_index(atol(arg1));
if (!pRoom)
{
chprintln(ch, "REdit : cuarto inexistente.");
return;
}
if (!IS_BUILDER(ch, pRoom->area))
{
chprintln(ch, "REdit : insuficiente seguridad para editar cuarto.");
return;
}
char_from_room(ch);
char_to_room(ch, pRoom);
}
if (!IS_BUILDER(ch, pRoom->area))
{
chprintln(ch, "REdit : Insuficiente seguridad para editar cuartos.");
return;
}
edit_start(ch, pRoom, ED_ROOM);
return;
}
/* Entry point for editing obj_index_data. */
CH_CMD(do_oedit)
{
OBJ_INDEX_DATA *pObj;
AREA_DATA *pArea;
char arg1[MAX_STRING_LENGTH];
vnum_t value;
if (IS_NPC(ch))
return;
argument = one_argument(argument, arg1);
if (is_number(arg1))
{
value = atol(arg1);
if (!(pObj = get_obj_index(value)))
{
chprintln(ch, "OEdit: That vnum does not exist.");
return;
}
if (!IS_BUILDER(ch, pObj->area))
{
chprintln(ch, "Insufficient security to modify objetos.");
return;
}
edit_start(ch, pObj, ED_OBJECT);
return;
}
else
{
if (!str_cmp(arg1, "create"))
{
value = atol(argument);
if (IS_NULLSTR(argument) || value == 0)
{
chprintln(ch, "Syntax: edit object create [vnum]");
return;
}
pArea = get_vnum_area(value);
if (!pArea)
{
chprintln(ch, "OEdit: That vnum is not assigned an area.");
return;
}
if (!IS_BUILDER(ch, pArea))
{
chprintln(ch, "Insufficient security to modify objetos.");
return;
}
if (oedit_create(ch, argument))
{
SET_BIT(pArea->area_flags, AREA_CHANGED);
ch->desc->editor = ED_OBJECT;
act("$n has entered the object editor.", ch,
NULL, NULL, TO_ROOM);
}
return;
}
else if (!str_cmp(arg1, "delete"))
{
oedit_delete(ch, argument);
return;
}
}
chprintln(ch, "OEdit: There is no default object to edit.");
return;
}
/* Entry point for editing mob_index_data. */
CH_CMD(do_medit)
{
MOB_INDEX_DATA *pMob;
AREA_DATA *pArea;
vnum_t value;
char arg1[MAX_STRING_LENGTH];
argument = one_argument(argument, arg1);
if (IS_NPC(ch))
return;
if (is_number(arg1))
{
value = atol(arg1);
if (!(pMob = get_mob_index(value)))
{
chprintln(ch, "MEdit: That vnum does not exist.");
return;
}
if (!IS_BUILDER(ch, pMob->area))
{
chprintln(ch, "Insufficient security to modify mobs.");
return;
}
edit_start(ch, pMob, ED_MOBILE);
return;
}
else
{
if (!str_cmp(arg1, "create"))
{
value = atol(argument);
if (IS_NULLSTR(arg1) || value == 0)
{
chprintln(ch, "Syntax: edit mobile create [vnum]");
return;
}
pArea = get_vnum_area(value);
if (!pArea)
{
chprintln(ch, "MEdit: That vnum is not assigned an area.");
return;
}
if (!IS_BUILDER(ch, pArea))
{
chprintln(ch, "Insufficient security to modify mobs.");
return;
}
if (medit_create(ch, argument))
{
SET_BIT(pArea->area_flags, AREA_CHANGED);
ch->desc->editor = ED_MOBILE;
act("$n has entered the mobile editor.", ch,
NULL, NULL, TO_ROOM);
}
return;
}
else if (!str_cmp(arg1, "delete"))
{
medit_delete(ch, argument);
return;
}
}
chprintln(ch, "MEdit: There is no default mobile to edit.");
return;
}
CH_CMD(do_cedit)
{
CLAN_DATA *pClan;
char arg[MSL];
if (IS_NPC(ch))
return;
pClan = clan_first;
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: cedit create\n\r cedit <clan name>");
return;
}
if (!str_cmp(arg, "save"))
{
rw_clans(action_write);
chprintln(ch, "Clan database saved.");
return;
}
else if (!str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln(ch, "cEdit : Insuffecient security to create new clans.");
return;
}
cedit_create(ch, argument);
return;
}
else if (!(pClan = clan_lookup(arg)) || IS_NULLSTR(pClan->name))
{
chprintln(ch, "That clan does not exist.");
return;
}
edit_start(ch, pClan, ED_CLAN);
return;
}
CH_CMD(do_cmdedit)
{
CMD_DATA *pCmd;
char arg[MSL];
if (IS_NPC(ch))
return;
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: cmdedit create\n\r"
" cmdedit <command name>");
return;
}
if (!str_cmp(arg, "save"))
{
rw_commands(action_write);
chprintln(ch, "Command database saved.");
return;
}
else if (!str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch, "cmdEdit : Insuffecient security to create new commands.");
return;
}
cmdedit_create(ch, argument);
return;
}
else if (!(pCmd = command_lookup(arg)) || IS_NULLSTR(pCmd->name))
{
chprintln(ch, "That command does not exist.");
return;
}
edit_start(ch, pCmd, ED_CMD);
return;
}
CH_CMD(do_skedit)
{
SKILL_DATA *pSkill;
int value;
char arg[MSL];
if (IS_NPC(ch))
return;
pSkill = &skill_table[0];
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: skedit make\n\r" " : skedit save\n\r"
" : skedit #/skill name");
return;
}
if (is_number(arg))
value = atoi(arg);
else
value = skill_lookup(arg);
if (value > -1)
{
pSkill = get_skill_data(value);
if (!pSkill || IS_NULLSTR(pSkill->name))
{
chprintln(ch, "That skill does not exist.");
return;
}
}
else if (!str_cmp(arg, "save"))
{
rw_skills(action_write);
chprintln(ch, "Skill database saved.");
return;
}
else if (!str_cmp(arg, "make") || !str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch, "skEdit : Insuffecient security to create new skills.");
return;
}
skedit_create(ch, argument);
return;
}
edit_start(ch, pSkill, ED_SKILL);
return;
}
CH_CMD(do_gredit)
{
GROUP_DATA *pGroup;
int value;
char arg[MSL];
if (IS_NPC(ch))
return;
pGroup = &group_table[0];
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: gredit create\n\r gredit #/skill name");
return;
}
if (is_number(arg))
value = atoi(arg);
else
value = group_lookup(arg);
if (value > -1)
{
pGroup = get_group_data(value);
if (!pGroup || IS_NULLSTR(pGroup->name))
{
chprintln(ch, "That skill does not exist.");
return;
}
}
else if (!str_cmp(arg, "save"))
{
rw_groups(action_write);
chprintln(ch, "Group database saved.");
return;
}
else if (!str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch, "grEdit : Insuffecient security to create new groups.");
return;
}
gredit_create(ch, argument);
return;
}
edit_start(ch, pGroup, ED_GROUP);
return;
}
CH_CMD(do_raedit)
{
RACE_DATA *pRace;
char arg[MSL];
if (IS_NPC(ch))
return;
pRace = race_first;
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: raedit create\n\r raedit <race name>");
return;
}
else if (!str_cmp(arg, "save"))
{
rw_races(action_write);
chprintln(ch, "Race database saved.");
return;
}
else if (!str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch, "raEdit : Insuffecient security to create new races.");
return;
}
raedit_create(ch, argument);
return;
}
else if ((pRace = race_lookup(arg)) == NULL)
{
chprintln(ch, "That race does not exist.");
return;
}
edit_start(ch, pRace, ED_RACE);
return;
}
CH_CMD(do_cledit)
{
CLASS_DATA *pClass;
int value;
char arg[MSL];
if (IS_NPC(ch))
return;
pClass = &class_table[0];
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: cledit create\n\r cledit #/class name");
return;
}
if (is_number(arg))
value = atoi(arg);
else
value = class_lookup(arg);
if (value > -1)
{
pClass = get_class_data(value);
if (!pClass || IS_NULLSTR(pClass->name))
{
chprintln(ch, "That class does not exist.");
return;
}
}
else if (!str_cmp(arg, "save"))
{
rw_classes(action_write);
chprintln(ch, "Class database saved.");
return;
}
else if (!str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch, "clEdit : Insuffecient security to create new class.");
return;
}
cledit_create(ch, argument);
return;
}
edit_start(ch, pClass, ED_CLASS);
return;
}
int channel_lookup(const char *arg)
{
int i;
for (i = 0; i < maxChannel; i++)
{
if (!str_prefix(arg, channel_table[i].name))
return i;
}
return -1;
}
CH_CMD(do_chanedit)
{
CHANNEL_DATA *pChan;
int value;
char arg[MSL];
if (IS_NPC(ch))
return;
pChan = &channel_table[0];
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: chanedit create\n\r" " : chanedit save\n\r"
" : chanedit <#|name>");
return;
}
if (is_number(arg))
value = atoi(arg);
else
value = channel_lookup(arg);
if (value > -1)
{
pChan = get_chan_data(value);
if (!pChan)
{
chprintln(ch, "That channel does not exist.");
return;
}
}
else if (!str_cmp(arg, "save"))
{
rw_channels(action_write);
chprintln(ch, "Channel database saved.");
return;
}
else if (!str_cmp(arg, "make") || !str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch,
"chanEdit : Insuffecient security to create new channels.");
return;
}
chanedit_create(ch, argument);
return;
}
edit_start(ch, pChan, ED_CHAN);
return;
}
CH_CMD(do_songedit)
{
SONG_DATA *pSong;
int value;
char arg[MSL];
if (IS_NPC(ch))
return;
pSong = &song_table[0];
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
chprintln(ch, "Syntax: songedit create\n\r" " : songedit save\n\r"
" : songedit <#|name>");
return;
}
if (is_number(arg))
value = atoi(arg);
else
value = song_lookup(arg);
if (value > -1)
{
pSong = get_song_data(value);
if (!pSong)
{
chprintln(ch, "That song does not exist.");
return;
}
}
else if (!str_cmp(arg, "save"))
{
rw_music(action_write);
chprintln(ch, "Song database saved.");
return;
}
else if (!str_cmp(arg, "make") || !str_cmp(arg, "create"))
{
if (ch->pcdata->security < 9)
{
chprintln
(ch, "SongEdit : Insuffecient security to create new songs.");
return;
}
songedit_create(ch, argument);
return;
}
edit_start(ch, pSong, ED_SONG);
return;
}
CH_CMD(do_mudedit)
{
if (IS_NPC(ch))
return;
if (get_trust(ch) < MAX_LEVEL - 1)
{
chprintln(ch, "Insufficient security to edit mud data.");
return;
}
edit_start(ch, &mud_info, ED_MUD);
return;
}
void display_resets(CHAR_DATA * ch)
{
ROOM_INDEX_DATA *pRoom;
RESET_DATA *pReset;
MOB_INDEX_DATA *pMob = NULL;
char buf[MAX_STRING_LENGTH];
char final[MAX_STRING_LENGTH];
int iReset = 0;
EDIT_ROOM(ch, pRoom);
final[0] = '\0';
chprintln(ch,
" No. Loads Description Location Vnum Mx Mn Description"
"\n\r"
"==== ======== ============= =================== ======== ===== ===========");
for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
{
OBJ_INDEX_DATA *pObj;
MOB_INDEX_DATA *pMobIndex;
OBJ_INDEX_DATA *pObjIndex;
OBJ_INDEX_DATA *pObjToIndex;
ROOM_INDEX_DATA *pRoomIndex;
final[0] = '\0';
sprintf(final, "[%2d] ", ++iReset);
switch (pReset->command)
{
default:
sprintf(buf, "Bad reset command: %c.", pReset->command);
strcat(final, buf);
break;
case 'M':
if (!(pMobIndex = get_mob_index(pReset->arg1)))
{
sprintf(buf, "Load Mobile - Bad Mob %ld\n\r", pReset->arg1);
strcat(final, buf);
continue;
}
if (!(pRoomIndex = get_room_index(pReset->arg3)))
{
sprintf(buf, "Load Mobile - Bad Room %ld\n\r", pReset->arg3);
strcat(final, buf);
continue;
}
pMob = pMobIndex;
sprintf(buf,
"M[%5ld] %-13.13s in room R[%5ld] %2d-%2d %-15.15s\n\r",
pReset->arg1, pMob->short_descr, pReset->arg3,
pReset->arg2, pReset->arg4, pRoomIndex->name);
strcat(final, buf);
/*
* Check for pet shop.
* -------------------
*/
{
ROOM_INDEX_DATA *pRoomIndexPrev;
pRoomIndexPrev = get_room_index(pRoomIndex->vnum - 1);
if (pRoomIndexPrev
&& IS_SET(pRoomIndexPrev->room_flags, ROOM_PET_SHOP))
final[5] = 'P';
}
break;
case 'O':
if (!(pObjIndex = get_obj_index(pReset->arg1)))
{
sprintf(buf, "Load Object - Bad Object %ld\n\r", pReset->arg1);
strcat(final, buf);
continue;
}
pObj = pObjIndex;
if (!(pRoomIndex = get_room_index(pReset->arg3)))
{
sprintf(buf, "Load Object - Bad Room %ld\n\r", pReset->arg3);
strcat(final, buf);
continue;
}
sprintf(buf,
"O[%5ld] %-13.13s in room "
"R[%5ld] %-15.15s\n\r", pReset->arg1,
pObj->short_descr, pReset->arg3, pRoomIndex->name);
strcat(final, buf);
break;
case 'P':
if (!(pObjIndex = get_obj_index(pReset->arg1)))
{
sprintf(buf, "Put Object - Bad Object %ld\n\r", pReset->arg1);
strcat(final, buf);
continue;
}
pObj = pObjIndex;
if (!(pObjToIndex = get_obj_index(pReset->arg3)))
{
sprintf(buf,
"Put Object - Bad To Object %ld\n\r", pReset->arg3);
strcat(final, buf);
continue;
}
sprintf(buf,
"O[%5ld] %-13.13s inside O[%5ld] %2d-%2d %-15.15s\n\r",
pReset->arg1, pObj->short_descr, pReset->arg3,
pReset->arg2, pReset->arg4, pObjToIndex->short_descr);
strcat(final, buf);
break;
case 'G':
case 'E':
if (!(pObjIndex = get_obj_index(pReset->arg1)))
{
sprintf(buf,
"Give/Equip Object - Bad Object %ld\n\r", pReset->arg1);
strcat(final, buf);
continue;
}
pObj = pObjIndex;
if (!pMob)
{
sprintf(buf, "Give/Equip Object - No Previous Mobile\n\r");
strcat(final, buf);
break;
}
if (pMob->pShop)
{
sprintf(buf,
"O[%5ld] %-13.13s in the inventory of S[%5ld] %-15.15s\n\r",
pReset->arg1, pObj->short_descr,
pMob->vnum, pMob->short_descr);
}
else
sprintf(buf,
"O[%5ld] %-13.13s %-19.19s M[%5ld] %-15.15s\n\r",
pReset->arg1, pObj->short_descr,
(pReset->command ==
'G') ? "in the inventory" :
flag_string(wear_loc_strings, pReset->arg3),
pMob->vnum, pMob->short_descr);
strcat(final, buf);
break;
/*
* Doors are set in rs_flags don't need to be displayed.
* If you want to display them then uncomment the new_reset
* line in the case 'D' in load_resets in db.c and here.
*/
case 'D':
pRoomIndex = get_room_index(pReset->arg1);
sprintf(buf,
"R[%5ld] %s door of %-19.19s reset to %s\n\r",
pReset->arg1,
capitalize(dir_name[pReset->arg2]),
pRoomIndex->name, flag_string(door_resets, pReset->arg3));
strcat(final, buf);
break;
/*
* End Doors Comment.
*/
case 'R':
if (!(pRoomIndex = get_room_index(pReset->arg1)))
{
sprintf(buf,
"Randomize Exits - Bad Room %ld\n\r", pReset->arg1);
strcat(final, buf);
continue;
}
sprintf(buf, "R[%5ld] Set to randomize %s %s.\n\r",
pReset->arg1,
pReset->arg3 == 0 ? "exits" : pReset->arg2 ==
0 ? "any available exit" : dir_name[pReset->arg2 - 1],
pReset->arg3 == 0 ? "in room" : pReset->arg3 ==
1 ? "to this area" : "to the world");
strcat(final, buf);
break;
}
chprint(ch, final);
}
return;
}
/*****************************************************************************
Name: add_reset
Purpose: Inserts a new reset in the given index slot.
Called by: do_resets(olc.c).
****************************************************************************/
void add_reset(ROOM_INDEX_DATA * room, RESET_DATA * pReset, int pIndex)
{
RESET_DATA *reset;
int iReset = 0;
if (!room->reset_first)
{
LINK(pReset, room->reset_first, room->reset_last, next, prev);
return;
}
for (reset = room->reset_first; reset; reset = reset->next)
{
if (++iReset == pIndex)
break;
}
if (reset)
INSERT(pReset, reset, room->reset_first, next, prev);
else
LINK(pReset, room->reset_first, room->reset_last, next, prev);
return;
}
CH_CMD(do_resets)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char arg4[MAX_INPUT_LENGTH];
char arg5[MAX_INPUT_LENGTH];
char arg6[MAX_INPUT_LENGTH];
char arg7[MAX_INPUT_LENGTH];
RESET_DATA *pReset = NULL;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
argument = one_argument(argument, arg3);
argument = one_argument(argument, arg4);
argument = one_argument(argument, arg5);
argument = one_argument(argument, arg6);
argument = one_argument(argument, arg7);
if (!IS_BUILDER(ch, ch->in_room->area))
{
chprintln(ch, "Resets: Invalid security for editing this area.");
return;
}
/*
* Display resets in current room.
* -------------------------------
*/
if (IS_NULLSTR(arg1))
{
if (ch->in_room->reset_first)
{
chprintln(ch, "Resets: M = mobile, R = room, O = object, "
"P = pet, S = shopkeeper");
display_resets(ch);
}
else
chprintln(ch, "No resets in this room.");
}
/*
* Take index number and search for commands.
* ------------------------------------------
*/
if (is_number(arg1))
{
ROOM_INDEX_DATA *pRoom = ch->in_room;
/*
* Delete a reset.
* ---------------
*/
if (!str_cmp(arg2, "delete"))
{
int insert_loc = atoi(arg1);
int iReset = -1;
if (!ch->in_room->reset_first)
{
chprintln(ch, "No resets in this area.");
return;
}
for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
{
if (++iReset == insert_loc - 1)
break;
}
if (!pReset)
{
chprintln(ch, "Reset not found.");
return;
}
UNLINK(pReset, pRoom->reset_first, pRoom->reset_last, next, prev);
free_reset_data(pReset);
chprintln(ch, "Reset deleted.");
SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
}
else
/*
* Add a reset.
* ------------
*/
if ((!str_cmp(arg2, "mob") && is_number(arg3)) ||
(!str_cmp(arg2, "obj") && is_number(arg3)))
{
/*
* Check for Mobile reset.
* -----------------------
*/
if (!str_cmp(arg2, "mob"))
{
if (get_mob_index(is_number(arg3) ? atol(arg3) : 1) == NULL)
{
chprintln(ch, "Mob no existe.");
return;
}
pReset = new_reset_data();
pReset->command = 'M';
pReset->arg1 = atol(arg3);
pReset->arg2 = is_number(arg4) ? atoi(arg4) : 1; /* Max # */
pReset->arg3 = ch->in_room->vnum;
pReset->arg4 = is_number(arg5) ? atoi(arg5) : 1; /* Min # */
}
else
/*
* Check for Object reset.
* -----------------------
*/
if (!str_cmp(arg2, "obj"))
{
pReset = new_reset_data();
pReset->arg1 = atol(arg3);
/*
* Inside another object.
* ----------------------
*/
if (!str_prefix(arg4, "inside"))
{
OBJ_INDEX_DATA *temp;
temp = get_obj_index(is_number(arg5) ? atol(arg5) : 1);
if ((temp->item_type != ITEM_CONTAINER)
&& (temp->item_type != ITEM_CORPSE_NPC))
{
chprintln(ch, "Objeto 2 no es container.");
return;
}
pReset->command = 'P';
pReset->arg2 = is_number(arg6) ? atoi(arg6) : 1;
pReset->arg3 = is_number(arg5) ? atol(arg5) : 1;
pReset->arg4 = is_number(arg7) ? atoi(arg7) : 1;
}
else
/*
* Inside the room.
* ----------------
*/
if (!str_cmp(arg4, "room"))
{
if (get_obj_index(atol(arg3)) == NULL)
{
chprintln(ch, "Vnum no existe.");
return;
}
pReset->command = 'O';
pReset->arg2 = 0;
pReset->arg3 = ch->in_room->vnum;
pReset->arg4 = 0;
}
else
/*
* Into a Mobile's inventory.
* --------------------------
*/
{
int wear;
if ((wear = flag_value(wear_loc_flags, arg4)) == NO_FLAG)
{
chprintln(ch, "Resets: '? wear-loc'");
return;
}
if (get_obj_index(atol(arg3)) == NULL)
{
chprintln(ch, "Vnum no existe.");
return;
}
pReset->arg1 = atol(arg3);
pReset->arg3 = wear;
if (pReset->arg3 == WEAR_NONE)
pReset->command = 'G';
else
pReset->command = 'E';
}
}
add_reset(ch->in_room, pReset, atol(arg1));
SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
chprintln(ch, "Reset added.");
}
else if (!str_cmp(arg2, "random"))
{
int door;
if (is_number(arg3))
{
door = atoi(arg3);
}
else
{
if ((door = get_direction(arg3)) != -1)
door++;
}
if (door < 0 || door > 6)
{
chprintln(ch, "Invalid argument.");
return;
}
if (door == 0
&& (IS_NULLSTR(arg4) || !is_exact_name(arg4, "area world")))
{
chprintln(ch, "Invalid or missing argument.");
return;
}
if (is_exact_name(arg4, "area world") && door > 0
&& ch->in_room->exit[door - 1] != NULL)
{
chprintln(ch, "There is already an exit in that direction.");
return;
}
pReset = new_reset_data();
pReset->command = 'R';
pReset->arg1 = ch->in_room->vnum;
pReset->arg2 = door;
pReset->arg3 =
!str_cmp(arg4, "area") ? 1 : !str_cmp(arg4, "world") ? 2 : 0;
add_reset(ch->in_room, pReset, atoi(arg1));
SET_BIT(ch->in_room->area->area_flags, AREA_CHANGED);
chprintln(ch, "Random exit reset added.");
}
else
{
chprintln(ch, "Syntax: RESET <number> OBJ <vnum> <wear_loc>");
chprintln(ch,
" RESET <number> OBJ <vnum> inside <vnum> [limit] [count]");
chprintln(ch, " RESET <number> OBJ <vnum> room");
chprintln(ch,
" RESET <number> MOB <vnum> [max #x area] [max #x room]");
chprintln(ch, " RESET <number> DELETE");
chprintln(ch, " RESET <number> RANDOM [#x exits]");
chprintln(ch, " RESET <number> RANDOM <exit|0> area|world");
}
}
return;
}
/*****************************************************************************
Name: do_alist
Purpose: Normal command to list areas and display area information.
Called by: interpreter(interp.c)
****************************************************************************/
CH_CMD(do_alist)
{
char buf[MAX_STRING_LENGTH];
char result[MAX_STRING_LENGTH * 2]; /* May need tweaking. */
AREA_DATA *pArea;
if (IS_NPC(ch))
return;
sprintf(result, "[%3s] [%-27s] (%-5s-%5s) [%-10s] %3s [%-10s]\n\r",
"Num", "Area Name", "lvnum", "uvnum", "Filename", "Sec",
"Builders");
for (pArea = area_first; pArea; pArea = pArea->next)
{
sprintf(buf,
"[%3d] %-29.29s (%-5ld-%5ld) %-12.12s [%d] [%-10.10s]\n\r",
pArea->vnum, pArea->name, pArea->min_vnum,
pArea->max_vnum, pArea->file_name, pArea->security,
pArea->builders);
strcat(result, buf);
}
chprint(ch, result);
return;
}
int calc_avedam(int num_dice, int dam_dice)
{
return ((1 + dam_dice) * num_dice / 2);
}
CH_CMD(do_avedam)
{
int i, j;
int k = 0;
int lookingfor;
if (IS_NULLSTR(argument))
{
chprintln(ch, "What average dam are you looking for?");
return;
}
lookingfor = atoi(argument);
chprintf(ch, "Possible dice combinations for ave dam: %d\n\r", lookingfor);
chprintln(ch, "T_Dice D_Dice T_Dice D_Dice");
chprintln(ch, "------ ------ ------ ------");
for (i = 1; i <= lookingfor; i++)
{
for (j = 1; j <= lookingfor; j++)
{
if (lookingfor == calc_avedam(i, j))
{
k++;
chprintf(ch, "%6d %6d ", i, j);
if (k % 2 == 0)
chprintln(ch, "");
}
}
}
chprintln(ch, "");
}
void edit_start(CHAR_DATA * ch, void *OLC, int Ed)
{
int old_ed;
OLC_FUN *olc_fun;
if (!ch || !ch->desc)
return;
old_ed = ch->desc->editor;
ch->desc->pEdit = OLC;
ch->desc->editor = Ed;
if (old_ed != Ed)
{
act("$n has entered the $t editor.", ch, olc_ed_name_long(ch), NULL,
TO_ROOM);
act("You are now entering the $t editor, type 'done' to finish.", ch,
olc_ed_name_long(ch), NULL, TO_CHAR);
}
if ((olc_fun = get_olc_show(ch->desc->editor)) != NULL)
(*olc_fun) (ch, "");
}
void autoset(MOB_INDEX_DATA * pMob)
{
double roll, size, bonus, avg;
double ac_n, ac_x;
int level;
if (!pMob || pMob->level < 1)
return;
level = pMob->level;
bonus = UMAX(1, (number_fuzzier(level) - 5));
ac_n =
80 - (level * (7.77 + (level / 90))) - ((level / 9) ^ 2) - (bonus * 2);
ac_x =
80 - (level * (6.67 + (level / 90))) - ((level / 9) ^ 2) - (bonus * 2);
pMob->ac[AC_PIERCE] = (int) ac_n;
pMob->ac[AC_BASH] = (int) ac_n;
pMob->ac[AC_SLASH] = (int) ac_n;
pMob->ac[AC_EXOTIC] = (int) ac_x;
pMob->mana[DICE_NUMBER] = number_fuzzier(level);
pMob->mana[DICE_TYPE] = number_fuzzier(10);
pMob->mana[DICE_BONUS] = number_fuzzier(85);
avg = (number_fuzzier(level) * .84);
roll = (number_fuzzier(level) / 9 + 1);
size = (number_fuzzier((int) roll) / 3);
for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);
pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .89);
bonus =
UMAX(1,
(level / 53 + 1) * ((level * 10) + (level / 10)) - UMIN(20,
(2 *
level))
+ 1);
size = number_fuzzier(level) * 1.2 - number_fuzzier(1);
roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);
pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);
pMob->hitroll = number_range(level * 6 / 10, level);
}
void autohard(MOB_INDEX_DATA * pMob)
{
double roll, size, bonus, avg;
double ac_n, ac_x;
int level;
if (!pMob || pMob->level < 1)
return;
level = pMob->level;
bonus = UMAX(1, (number_fuzzier(level) - 5));
ac_n =
70 - (level * (8.15 + (level / 90))) - ((level / 8) ^ 2) - (bonus * 2);
ac_x =
70 - (level * (7.12 + (level / 90))) - ((level / 8) ^ 2) - (bonus * 2);
pMob->ac[AC_PIERCE] = (int) ac_n;
pMob->ac[AC_BASH] = (int) ac_n;
pMob->ac[AC_SLASH] = (int) ac_n;
pMob->ac[AC_EXOTIC] = (int) ac_x;
pMob->mana[DICE_NUMBER] = number_fuzzier(level);
pMob->mana[DICE_TYPE] = number_fuzzier(12);
pMob->mana[DICE_BONUS] = number_fuzzier(95);
avg = (number_fuzzier(level) * .9);
roll = (number_fuzzier(level) / 9 + 1);
size = (number_fuzzier((int) roll) / 3);
for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);
pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .99);
bonus = (level / 53 + 1) * ((level * 10) + (level / 10)) + 1;
size = number_fuzzier(level) * 1.2 - number_fuzzier(1);
size++;
roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);
pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);
pMob->hitroll = number_range(level * 65 / 100, level);
}
void autoeasy(MOB_INDEX_DATA * pMob)
{
double roll, size, bonus, avg;
double ac_n, ac_x;
int level;
if (!pMob || pMob->level < 1)
return;
level = pMob->level;
bonus = UMAX(1, (number_fuzzier(level) - 5));
ac_n =
90 - (level * (7.47 + (level / 90))) - ((level / 10) ^ 2) - (bonus * 2);
ac_x =
90 - (level * (6.37 + (level / 90))) - ((level / 10) ^ 2) - (bonus * 2);
pMob->ac[AC_PIERCE] = (int) ac_n;
pMob->ac[AC_BASH] = (int) ac_n;
pMob->ac[AC_SLASH] = (int) ac_n;
pMob->ac[AC_EXOTIC] = (int) ac_x;
pMob->mana[DICE_NUMBER] = number_fuzzier(level);
pMob->mana[DICE_TYPE] = number_fuzzier(10);
pMob->mana[DICE_BONUS] = number_fuzzier(60);
avg = (number_fuzzier(level) * .76);
roll = (number_fuzzier(level) / 9 + 1);
size = (number_fuzzier((int) roll) / 3);
for (size = roll / 3; roll * (size + 2) / 2 < avg; size++);
pMob->damage[DICE_NUMBER] = (int) UMAX(1, roll);
pMob->damage[DICE_TYPE] = (int) UMAX(2, size);
pMob->damage[DICE_BONUS] = (int) UMAX(1, number_fuzzier(level) * .82);
bonus =
UMAX(1,
(level / 55 + 1) * ((level * 9) + (level / 10)) - UMIN(20,
(1.5 *
level))
+ 1);
size = number_fuzzier(level) * 1.2 - number_fuzzier(1);
roll = number_fuzzier(level) * 1.4 - number_fuzzier(2);
pMob->hit[DICE_NUMBER] = (int) UMAX(1, roll);
pMob->hit[DICE_TYPE] = (int) UMAX(2, size);
pMob->hit[DICE_BONUS] = (int) UMAX(10, bonus);
pMob->hitroll = number_range(level * 59 / 100, level);
}
void autoweapon(OBJ_INDEX_DATA * pObj)
{
AFFECT_DATA *pAf, *pObjAf;
bool bDamroll, bHitroll;
double pDice, size, bonus;
int level, mod;
if (!pObj || pObj->item_type != ITEM_WEAPON)
return;
if (pObj->level < 1 || IS_OBJ_STAT(pObj, ITEM_QUEST))
return;
level = pObj->level;
bonus = UMAX(1, number_fuzzier(level) / 9 - 1);
pDice = (number_fuzzier(level) * .22 + 2);
size = (number_fuzzier((int) pDice) / 2);
for (size = pDice / 2; pDice * (size + 2) / 2 < level; size++);
pDice = UMAX(2, pDice);
size = UMAX(3, size);
switch (pObj->value[0])
{
default:
case WEAPON_EXOTIC:
case WEAPON_SWORD:
break;
case WEAPON_DAGGER:
pDice = UMAX(2, pDice - 1);
size = UMAX(3, size - 1);
break;
case WEAPON_SPEAR:
case WEAPON_POLEARM:
size++;
break;
case WEAPON_MACE:
case WEAPON_AXE:
size = UMAX(3, size - 1);
break;
case WEAPON_FLAIL:
case WEAPON_WHIP:
pDice = UMAX(2, pDice - 1);
break;
}
pDice += 1;
size -= 1;
pDice = UMAX(2, number_fuzzier((int) pDice));
size = UMAX(3, number_fuzzier((int) size));
pObj->value[1] = (long) pDice;
pObj->value[2] = (long) size;
mod = UMAX(1, number_range(number_fuzzier((int) bonus) * 6 / 10,
number_fuzzier((int) bonus)));
if (mod > 0)
{
bDamroll = FALSE;
bHitroll = FALSE;
for (pObjAf = pObj->first_affect; pObjAf; pObjAf = pObjAf->next)
{
if (pObjAf->location == APPLY_DAMROLL)
{
pObjAf->level = level;
pObjAf->modifier = mod;
bDamroll = TRUE;
}
else if (pObjAf->location == APPLY_HITROLL)
{
pObjAf->level = level;
pObjAf->modifier = mod;
bHitroll = TRUE;
}
}
if (!bDamroll)
{
pAf = new_affect();
pAf->location = APPLY_DAMROLL;
pAf->modifier = mod;
pAf->where = TO_OBJECT;
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->level = level;
LINK(pAf, pObj->first_affect, pObj->last_affect, next, prev);
}
if (!bHitroll)
{
pAf = new_affect();
pAf->location = APPLY_HITROLL;
pAf->modifier = mod;
pAf->where = TO_OBJECT;
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->level = level;
LINK(pAf, pObj->first_affect, pObj->last_affect, next, prev);
}
}
}
void autoarmor(OBJ_INDEX_DATA * pObj)
{
int size;
int level;
if (!pObj || pObj->item_type != ITEM_ARMOR)
return;
if (pObj->level < 1 || IS_OBJ_STAT(pObj, ITEM_QUEST))
return;
level = pObj->level;
size = UMAX(1, number_fuzzier(level) / 2 + 1);
pObj->value[0] = size;
pObj->value[1] = size;
pObj->value[2] = size;
pObj->value[3] = (size - 1);
}
void area_set_auto(AREA_DATA * pArea)
{
OBJ_INDEX_DATA *pObjIndex;
MOB_INDEX_DATA *pMobIndex;
vnum_t vnum;
if (!pArea)
return;
for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
{
if ((pMobIndex = get_mob_index(vnum)) != NULL && pMobIndex->level >= 1)
{
if (pMobIndex->level < 9)
autoeasy(pMobIndex);
else if (pMobIndex->level < 30)
autoset(pMobIndex);
else
autohard(pMobIndex);
}
if ((pObjIndex = get_obj_index(vnum)) != NULL
&& !IS_OBJ_STAT(pObjIndex, ITEM_QUEST) && pObjIndex->level >= 1)
{
if (pObjIndex->item_type == ITEM_WEAPON)
autoweapon(pObjIndex);
else if (pObjIndex->item_type == ITEM_ARMOR)
autoarmor(pObjIndex);
}
}
}
CH_CMD(do_areaset)
{
AREA_DATA *pArea;
if (!str_cmp(argument, "world"))
{
for (pArea = area_first; pArea; pArea = pArea->next)
area_set_auto(pArea);
chprintln(ch, "World set to default values.");
}
else if (ch->in_room != NULL && (pArea = ch->in_room->area) != NULL)
{
area_set_auto(pArea);
chprintlnf(ch, "%s set to default values.", pArea->name);
}
else
chprintln(ch, "Syntax: afun set world - set the whole world.\n\r"
" : afun set - set your current area.");
return;
}