/* $Id: olc_ritual.c,v 1.666 2004/09/20 10:50:30 shrike Exp $ */
/************************************************************************************
* Copyright 2004 Astrum Metaphora consortium *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"
#include "olc.h"
#define EDIT_RITUAL(ch, ritual) (ritual = (ritual_t*) ch->desc->pEdit)
extern varr rituals;
extern void save_ritual (CHAR_DATA *ch);
DECLARE_OLC_FUN(ritualed_create );
DECLARE_OLC_FUN(ritualed_edit );
DECLARE_OLC_FUN(ritualed_touch );
DECLARE_OLC_FUN(ritualed_show );
DECLARE_OLC_FUN(ritualed_list );
DECLARE_OLC_FUN(ritualed_name );
DECLARE_OLC_FUN(ritualed_components );
DECLARE_OLC_FUN(ritualed_sector );
DECLARE_OLC_FUN(ritualed_time );
DECLARE_OLC_FUN(ritualed_extra );
DECLARE_OLC_FUN(ritualed_minskill );
DECLARE_OLC_FUN(ritualed_duration );
static DECLARE_VALIDATE_FUN(validate_name);
olc_cmd_t olc_cmds_ritual[] =
{
{ "create", ritualed_create, 5 },
{ "edit", ritualed_edit, 5 },
{ "touch", olced_dummy, 5 },
{ "show", ritualed_show, 0 },
{ "list", ritualed_list, 0 },
{ "name", ritualed_name, 5, validate_name },
{ "components", ritualed_components, 0 },
{ "sector", ritualed_sector, 0, sector_flag_types },
{ "period", ritualed_time, 0, time_flag_types },
{ "extra", ritualed_extra, 0, ritual_extra_flags },
{ "minskill", ritualed_minskill, 0 },
{ "duration", ritualed_duration, 0 },
{ "commands", show_commands, 0 },
{ NULL}
};
OLC_FUN(ritualed_create)
{
int tn;
ritual_t * ritual;
if (argument[0] == '\0')
{
do_help(ch, "'OLC RITUAL'");
return FALSE;
}
if ((tn = ritualnumber_lookup(argument)) >= 0)
{
char_printf(ch, "ritualEd: %s ritual already exists.\n", RITUAL(tn)->name);
return FALSE;
}
ritual = ritual_new();
ritual->name = str_dup(argument);
ch->desc->pEdit = (void *)ritual;
OLCED(ch) = olced_lookup(ED_RITUAL);
char_puts("Ritual created.\n",ch);
return FALSE;
}
OLC_FUN(ritualed_edit)
{
int tn;
char arg[MAX_STRING_LENGTH];
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0')
{
do_help(ch, "'OLC RITUAL'");
return FALSE;
}
tn = -1;
if (is_number(arg))
{
if (!str_cmp(ritual_name(atoi(arg)),"None"))
{
char_printf(ch, "ritualEd: %s: No such ritual.\n", arg);
return FALSE;
}
else
ch->desc->pEdit = RITUAL(atoi(arg));
}
else
{
if ((tn = ritualnumber_lookup(arg)) < 0)
{
char_printf(ch, "ritualEd: %s: No such ritual.\n", argument);
return FALSE;
}
else
ch->desc->pEdit = RITUAL(tn);
}
OLCED(ch) = olced_lookup(ED_RITUAL);
return FALSE;
}
OLC_FUN(ritualed_list)
{
int i;
for (i = 0; i < rituals.nused; i++)
char_printf(ch, "[%d] %s\n", i, RITUAL(i)->name);
return FALSE;
}
OLC_FUN(ritualed_name)
{
ritual_t *ritual;
EDIT_RITUAL(ch, ritual);
return olced_str(ch, argument, cmd, &ritual->name);
}
OLC_FUN(ritualed_minskill)
{
ritual_t * ritual;
EDIT_RITUAL(ch, ritual);
return olced_number(ch, argument, cmd, &ritual->min_skill);
}
OLC_FUN(ritualed_duration)
{
ritual_t * ritual;
EDIT_RITUAL(ch, ritual);
return olced_number(ch, argument, cmd, &ritual->duration);
}
OLC_FUN(ritualed_time)
{
ritual_t * ritual;
EDIT_RITUAL(ch, ritual);
return olced_flag32(ch, argument, cmd, &ritual->time);
}
OLC_FUN(ritualed_extra)
{
ritual_t * ritual;
EDIT_RITUAL(ch, ritual);
return olced_flag32(ch, argument, cmd, &ritual->extra);
}
OLC_FUN(ritualed_sector)
{
ritual_t * ritual;
EDIT_RITUAL(ch, ritual);
return olced_flag32(ch, argument, cmd, &ritual->sector);
}
OLC_FUN(ritualed_components)
{
ritual_t * ritual;
char arg[MAX_STRING_LENGTH];
int num, vnum;
EDIT_RITUAL(ch, ritual);
// number
argument = one_argument (argument, arg, sizeof(arg));
num = atoi (arg);
if (num < 1 || num > MAX_RITUAL_COMP)
{
char_act ("Syntax: comp_paint <num> <vnum>", ch);
char_printf (ch, "Num must be between 1 and %d.\n", MAX_RITUAL_COMP);
return FALSE;
}
// vnum
argument = one_argument (argument, arg, sizeof(arg));
vnum = atoi (arg);
vnum = UMAX (0, vnum);
// validate vnum
if (vnum != 0 && get_obj_index (vnum) == NULL)
{
char_printf (ch, "Obj vnum %d does not exist.\n", vnum);
return FALSE;
}
// fill the array
ritual->components[num - 1] = vnum;
char_act ("Ok.", ch);
return TRUE;
}
OLC_FUN(ritualed_show)
{
char arg[MAX_STRING_LENGTH];
int i;
BUFFER * output;
ritual_t * ritual;
bool found;
OBJ_INDEX_DATA * obj;
if (rituals.nused == 0)
{
char_act ("No rituals at all.", ch);
return FALSE;
}
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0')
{
if (IS_EDIT(ch, ED_RITUAL))
EDIT_RITUAL(ch, ritual);
else
{
do_help(ch, "'OLC ASHOW'");
return FALSE;
}
}
else
{
if (is_number(arg))
{
if (!str_cmp(ritual_name(atoi(arg)),"None"))
{
char_printf(ch, "RitualEd: %s: No such ritual.\n", arg);
return FALSE;
}
else
ritual = RITUAL(atoi(arg));
}
else
{
i = ritualnumber_lookup(argument);
if ( i < 0 )
{
char_printf(ch, "RitualEd: Must specify ritual name.\n");
return FALSE;
}
ritual = RITUAL(i);
}
}
output = buf_new(ch->lang);
buf_printf (output, "Name: [%s]\n", ritual->name);
buf_printf (output, "Duration: [%d]\n", ritual->duration);
buf_printf (output, "Min. skill percent: [%d]\n", ritual->min_skill);
buf_printf (output, "Sector: [%s]\n", flag_string(sector_flag_types, ritual->sector));
buf_printf (output, "Time period: [%s]\n", flag_string(time_flag_types, ritual->time));
buf_printf (output, "Extra flags: [%s]\n", flag_string(ritual_extra_flags, ritual->extra));
found = FALSE;
buf_add (output, "Components: {x");
for (i = 0; i < MAX_RITUAL_COMP; ++i)
{
if (ritual->components[i] != 0)
{
obj = get_obj_index (ritual->components[i]);
buf_printf (output, "\n{G%2d{x. [%7d] %s",
i + 1,
ritual->components[i],
obj == NULL ? "non-existent object" : mlstr_cval (obj->short_descr, ch));
found = TRUE;
}
}
if (found)
buf_add (output, "\n");
else
buf_add (output, " [none]\n");
page_to_char (buf_string (output), ch);
buf_free (output);
return FALSE;
}
static VALIDATE_FUN(validate_name)
{
int tn;
ritual_t * ritual;
EDIT_RITUAL(ch, ritual);
if ((tn = ritualnumber_lookup(arg)) >= 0)
{
char_printf(ch, "RitualEd: %s: already exists.\n", RITUAL(tn)->name);
return FALSE;
}
return TRUE;
}
bool delete_ritual (CHAR_DATA *ch, const char *argument)
{
ritual_t * ritual;
int tnumber;
char name[MAX_INPUT_LENGTH];
if (IS_NULLSTR(argument))
{
do_help (ch, "'OLC RITUAL'");
return FALSE;
}
one_argument(argument, name, sizeof(name));
tnumber = ritualnumber_lookup(name);
if (tnumber < 0)
{
char_printf(ch, "Ritual %s not in database", name);
return FALSE;
}
ritual = RITUAL(tnumber);
if (ritual != NULL)
{
varr_del(&rituals, (void*)ritual);
char_printf (ch, "Ex-ritual %s deleted from database", name);
save_ritual(ch);
return TRUE;
}
else
log_printf("** BUG ** olc_ritual:delete_ritual: ritual = NULL");
return FALSE;
}