/***************************************************************************
* File: olc_act.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. *
* *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "utils.h"
#include "olc.h"
#include "tables.h"
#include "recycle.h"
#include "lookup.h"
OEDIT(oedit_show)
{
OBJ_INDEX_DATA *pObj;
char buf[MAX_STRING_LENGTH];
AFFECT_DATA *paf;
int cnt;
EDIT_OBJ(ch, pObj);
sprintf(buf, "Name: [%s]\n\rArea: [%5ld] %s\n\r",
pObj->name,
!pObj->area ? -1 : pObj->area->vnum,
!pObj->area ? "No Area" : pObj->area->name);
send_to_char(buf, ch);
sprintf(buf, "Vnum: [%5ld]\n\rType: [%s]\n\r",
pObj->vnum, flag_string(type_flags, pObj->item_type));
send_to_char(buf, ch);
sprintf(buf, "Level: [%5d]\n\r", pObj->level);
send_to_char(buf, ch);
sprintf(buf, "Wear flags: [%s]\n\r",
flag_string(wear_flags, pObj->wear_flags));
send_to_char(buf, ch);
sprintf(buf, "Extra flags: [%s]\n\r",
flag_string(extra_flags, pObj->extra_flags));
send_to_char(buf, ch);
sprintf(buf, "Material: [%s]\n\r", /* ROM */
pObj->material);
send_to_char(buf, ch);
sprintf(buf, "Condition: [%5d]\n\r", /* ROM */
pObj->condition);
send_to_char(buf, ch);
sprintf(buf, "Timer: [%5d]\n\r", /* ROM */
pObj->timer);
send_to_char(buf, ch);
sprintf(buf, "Weight: [%5d]\n\rCost: [%5d]\n\r",
pObj->weight, pObj->cost);
send_to_char(buf, ch);
if (pObj->extra_descr) {
EXTRA_DESCR_DATA *ed;
send_to_char("Ex desc kwd: ", ch);
for (ed = pObj->extra_descr; ed; ed = ed->next) {
send_to_char("[", ch);
send_to_char(ed->keyword, ch);
send_to_char("]", ch);
}
send_to_char("\n\r", ch);
}
sprintf(buf, "Short desc: %s\n\rLong desc:\n\r %s\n\r",
pObj->short_descr, pObj->description);
send_to_char(buf, ch);
for (cnt = 0, paf = pObj->affected; paf; paf = paf->next) {
if (cnt == 0) {
send_to_char("Number Modifier Affects\n\r", ch);
send_to_char("------ -------- -------\n\r", ch);
}
sprintf(buf, "[%4d] %-8d %s\n\r", cnt,
paf->modifier, flag_string(apply_flags, paf->location));
send_to_char(buf, ch);
cnt++;
}
show_obj_values(ch, pObj);
if (pObj->deleted) {
send_to_char
("{R THIS OBJECT IS MARKED FOR DELETION AND WILL NOT BE SAVED{X\r\n",
ch);
}
return FALSE;
}
/*
* Need to issue warning if flag isn't valid. -- does so now -- Hugin.
*/
OEDIT(oedit_addaffect)
{
int value;
OBJ_INDEX_DATA *pObj;
AFFECT_DATA *pAf;
char loc[MAX_STRING_LENGTH];
char mod[MAX_STRING_LENGTH];
EDIT_OBJ(ch, pObj);
argument = one_argument(argument, loc);
one_argument(argument, mod);
if (loc[0] == '\0' || mod[0] == '\0' || !is_number(mod)) {
send_to_char("Syntax: addaffect [location] [#mod]\n\r", ch);
return FALSE;
}
if ((value = flag_value(apply_flags, loc)) == NO_FLAG) { /* Hugin */
send_to_char("Valid affects are:\n\r", ch);
show_help(ch, "apply");
return FALSE;
}
pAf = new_affect();
pAf->location = value;
pAf->modifier = atoi(mod);
pAf->type = -1;
pAf->duration = -1;
pAf->bitvector = 0;
pAf->next = pObj->affected;
pObj->affected = pAf;
send_to_char("Affect added.\n\r", ch);
return TRUE;
}
/*
* My thanks to Hans Hvidsten Birkeland and Noam Krendel(Walker)
* for really teaching me how to manipulate pointers.
*/
OEDIT(oedit_delaffect)
{
OBJ_INDEX_DATA *pObj;
AFFECT_DATA *pAf;
AFFECT_DATA *pAf_next;
char affect[MAX_STRING_LENGTH];
int value;
int cnt = 0;
EDIT_OBJ(ch, pObj);
one_argument(argument, affect);
if (!is_number(affect) || affect[0] == '\0') {
send_to_char("Syntax: delaffect [#xaffect]\n\r", ch);
return FALSE;
}
value = atoi(affect);
if (value < 0) {
send_to_char("Only non-negative affect-numbers allowed.\n\r", ch);
return FALSE;
}
if (!(pAf = pObj->affected)) {
send_to_char("OEdit: Non-existant affect.\n\r", ch);
return FALSE;
}
if (value == 0) { /* First case: Remove first affect */
pAf = pObj->affected;
pObj->affected = pAf->next;
free_affect(pAf);
} else { /* Affect to remove is not the first */
while ((pAf_next = pAf->next) && (++cnt < value))
pAf = pAf_next;
if (pAf_next) { /* See if it's the next affect */
pAf->next = pAf_next->next;
free_affect(pAf_next);
} else { /* Doesn't exist */
send_to_char("No such affect.\n\r", ch);
return FALSE;
}
}
send_to_char("Affect removed.\n\r", ch);
return TRUE;
}
OEDIT(oedit_name)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0') {
send_to_char("Syntax: name [string]\n\r", ch);
return FALSE;
}
free_string(pObj->name);
pObj->name = str_dup(argument);
send_to_char("Name set.\n\r", ch);
return TRUE;
}
OEDIT(oedit_short)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0') {
send_to_char("Syntax: short [string]\n\r", ch);
return FALSE;
}
free_string(pObj->short_descr);
pObj->short_descr = str_dup(argument);
pObj->short_descr[0] = LOWER(pObj->short_descr[0]);
send_to_char("Short description set.\n\r", ch);
return TRUE;
}
OEDIT(oedit_long)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0') {
send_to_char("Syntax: long [string]\n\r", ch);
return FALSE;
}
free_string(pObj->description);
pObj->description = str_dup(argument);
pObj->description[0] = UPPER(pObj->description[0]);
send_to_char("Long description set.\n\r", ch);
return TRUE;
}
bool set_value(CHAR_DATA * ch, OBJ_INDEX_DATA * pObj, char *argument,
int value)
{
if (argument[0] == '\0') {
set_obj_values(ch, pObj, -1, ""); /* '\0' changed to "" -- Hugin */
return FALSE;
}
if (set_obj_values(ch, pObj, value, argument))
return TRUE;
return FALSE;
}
/*****************************************************************************
Name: oedit_values
Purpose: Finds the object and sets its value.
Called by: The four valueX functions below. (now five -- Hugin )
****************************************************************************/
bool oedit_values(CHAR_DATA * ch, char *argument, int value)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (set_value(ch, pObj, argument, value))
return TRUE;
return FALSE;
}
OEDIT(oedit_value0)
{
if (oedit_values(ch, argument, 0))
return TRUE;
return FALSE;
}
OEDIT(oedit_value1)
{
if (oedit_values(ch, argument, 1))
return TRUE;
return FALSE;
}
OEDIT(oedit_value2)
{
if (oedit_values(ch, argument, 2))
return TRUE;
return FALSE;
}
OEDIT(oedit_value3)
{
if (oedit_values(ch, argument, 3))
return TRUE;
return FALSE;
}
OEDIT(oedit_value4)
{
if (oedit_values(ch, argument, 4))
return TRUE;
return FALSE;
}
OEDIT(oedit_weight)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0' || !is_number(argument)) {
send_to_char("Syntax: weight [number]\n\r", ch);
return FALSE;
}
pObj->weight = atoi(argument);
send_to_char("Weight set.\n\r", ch);
return TRUE;
}
OEDIT(oedit_cost)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0' || !is_number(argument)) {
send_to_char("Syntax: cost [number]\n\r", ch);
return FALSE;
}
pObj->cost = atoi(argument);
send_to_char("Cost set.\n\r", ch);
return TRUE;
}
OEDIT(oedit_create)
{
OBJ_INDEX_DATA *pObj;
AREA_DATA *pArea;
int value;
int iHash;
value = atoi(argument);
if (argument[0] == '\0' || value == 0) {
if ((value = get_next_obj_vnum_area( ch->in_room->area )) == 0) {
send_to_char("This area is out of vnums for objs.\r\n", ch);
return FALSE;
}
}
pArea = get_vnum_area(value);
if (!pArea) {
send_to_char("OEdit: That vnum is not assigned an area.\n\r", ch);
return FALSE;
}
if (!IS_BUILDER(ch, pArea)) {
send_to_char("OEdit: Vnum in an area you cannot build in.\n\r",
ch);
return FALSE;
}
if (get_obj_index(value)) {
send_to_char("OEdit: Object vnum already exists.\n\r", ch);
return FALSE;
}
pObj = new_obj_index();
pObj->vnum = value;
pObj->area = pArea;
if (value > top_vnum_obj)
top_vnum_obj = value;
iHash = value % MAX_KEY_HASH;
pObj->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pObj;
ch->desc->pEdit = (void *) pObj;
send_to_char("Object Created.\n\r", ch);
return TRUE;
}
OEDIT(oedit_ed)
{
OBJ_INDEX_DATA *pObj;
EXTRA_DESCR_DATA *ed;
char command[MAX_INPUT_LENGTH];
char keyword[MAX_INPUT_LENGTH];
EDIT_OBJ(ch, pObj);
argument = one_argument(argument, command);
one_argument(argument, keyword);
if (command[0] == '\0') {
send_to_char("Syntax: ed add [keyword]\n\r", ch);
send_to_char(" ed delete [keyword]\n\r", ch);
send_to_char(" ed edit [keyword]\n\r", ch);
send_to_char(" ed format [keyword]\n\r", ch);
return FALSE;
}
if (!str_cmp(command, "add")) {
if (keyword[0] == '\0') {
send_to_char("Syntax: ed add [keyword]\n\r", ch);
return FALSE;
}
ed = new_extra_descr();
ed->keyword = str_dup(keyword);
ed->next = pObj->extra_descr;
pObj->extra_descr = ed;
string_append(ch, &ed->description);
return TRUE;
}
if (!str_cmp(command, "edit")) {
if (keyword[0] == '\0') {
send_to_char("Syntax: ed edit [keyword]\n\r", ch);
return FALSE;
}
for (ed = pObj->extra_descr; ed; ed = ed->next) {
if (is_name(keyword, ed->keyword))
break;
}
if (!ed) {
send_to_char
("OEdit: Extra description keyword not found.\n\r", ch);
return FALSE;
}
string_append(ch, &ed->description);
return TRUE;
}
if (!str_cmp(command, "delete")) {
EXTRA_DESCR_DATA *ped = NULL;
if (keyword[0] == '\0') {
send_to_char("Syntax: ed delete [keyword]\n\r", ch);
return FALSE;
}
for (ed = pObj->extra_descr; ed; ed = ed->next) {
if (is_name(keyword, ed->keyword))
break;
ped = ed;
}
if (!ed) {
send_to_char
("OEdit: Extra description keyword not found.\n\r", ch);
return FALSE;
}
if (!ped)
pObj->extra_descr = ed->next;
else
ped->next = ed->next;
free_extra_descr(ed);
send_to_char("Extra description deleted.\n\r", ch);
return TRUE;
}
if (!str_cmp(command, "format")) {
EXTRA_DESCR_DATA *ped = NULL;
if (keyword[0] == '\0') {
send_to_char("Syntax: ed format [keyword]\n\r", ch);
return FALSE;
}
for (ed = pObj->extra_descr; ed; ed = ed->next) {
if (is_name(keyword, ed->keyword))
break;
ped = ed;
}
if (!ed) {
send_to_char
("OEdit: Extra description keyword not found.\n\r", ch);
return FALSE;
}
ed->description = format_string(ed->description);
send_to_char("Extra description formatted.\n\r", ch);
return TRUE;
}
oedit_ed(ch, "");
return FALSE;
}
/* ROM object functions : */
OEDIT(oedit_extra)
{ /* Moved out of oedit() due to naming conflicts -- Hugin */
OBJ_INDEX_DATA *pObj;
int value;
if (argument[0] != '\0') {
EDIT_OBJ(ch, pObj);
if ((value = flag_value(extra_flags, argument)) != NO_FLAG) {
TOGGLE_BIT(pObj->extra_flags, value);
send_to_char("Extra flag toggled.\n\r", ch);
return TRUE;
}
}
send_to_char("Syntax: extra [flag]\n\r"
"Type '? extra' for a list of flags.\n\r", ch);
return FALSE;
}
OEDIT(oedit_wear)
{ /* Moved out of oedit() due to naming conflicts -- Hugin */
OBJ_INDEX_DATA *pObj;
int value;
if (argument[0] != '\0') {
EDIT_OBJ(ch, pObj);
if ((value = flag_value(wear_flags, argument)) != NO_FLAG) {
TOGGLE_BIT(pObj->wear_flags, value);
send_to_char("Wear flag toggled.\n\r", ch);
return TRUE;
}
}
send_to_char("Syntax: wear [flag]\n\r"
"Type '? wear' for a list of flags.\n\r", ch);
return FALSE;
}
OEDIT(oedit_type)
{ /* Moved out of oedit() due to naming conflicts -- Hugin */
OBJ_INDEX_DATA *pObj;
int value;
if (argument[0] != '\0') {
EDIT_OBJ(ch, pObj);
if ((value = flag_value(type_flags, argument)) != NO_FLAG) {
pObj->item_type = value;
send_to_char("Type set.\n\r", ch);
/*
* Clear the values.
*/
pObj->value[0] = 0;
pObj->value[1] = 0;
pObj->value[2] = 0;
pObj->value[3] = 0;
pObj->value[4] = 0; /* ROM */
return TRUE;
}
}
send_to_char("Syntax: type [flag]\n\r"
"Type '? type' for a list of flags.\n\r", ch);
return FALSE;
}
OEDIT(oedit_material)
{
OBJ_INDEX_DATA *pObj;
char arg[MAX_INPUT_LENGTH];
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0') {
send_to_char("Syntax: material [string]\n\r", ch);
return FALSE;
}
argument = one_argument(argument, arg);
free_string(pObj->material);
pObj->material = str_dup(arg);
send_to_char("Material set.\n\r", ch);
return TRUE;
}
OEDIT(oedit_level)
{
OBJ_INDEX_DATA *pObj;
EDIT_OBJ(ch, pObj);
if (argument[0] == '\0' || !is_number(argument)) {
send_to_char("Syntax: level [number]\n\r", ch);
return FALSE;
}
pObj->level = atoi(argument);
send_to_char("Level set.\n\r", ch);
return TRUE;
}
OEDIT(oedit_condition)
{
OBJ_INDEX_DATA *pObj;
int value;
if (argument[0] != '\0'
&& (value = atoi(argument)) >= 0 && (value <= 100)) {
EDIT_OBJ(ch, pObj);
pObj->condition = value;
send_to_char("Condition set.\n\r", ch);
return TRUE;
}
send_to_char("Syntax: condition [number]\n\r"
"Where number can range from 0 (ruined) to 100 (perfect).\n\r",
ch);
return FALSE;
}
OEDIT(oedit_timer)
{
OBJ_INDEX_DATA *pObj;
int value;
if (argument[0] != '\0' && (value = atoi(argument)) >= 0) {
EDIT_OBJ(ch, pObj);
pObj->timer = value;
send_to_char("Timer set.\n\r", ch);
return TRUE;
}
send_to_char("Syntax: timer [number]\n\r"
"Where timer is the number of ticks an object will last once a player\n\r"
"gets it..\n\r", ch);
return FALSE;
}