/* $Id: olc_material.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"
#include "material.h"
#define EDIT_MATERIAL(ch, material) (material = (material_t*) ch->desc->pEdit)
DECLARE_OLC_FUN(materialed_create );
DECLARE_OLC_FUN(materialed_edit );
DECLARE_OLC_FUN(materialed_touch );
DECLARE_OLC_FUN(materialed_show );
DECLARE_OLC_FUN(materialed_list );
DECLARE_OLC_FUN(materialed_ename );
DECLARE_OLC_FUN(materialed_rname );
DECLARE_OLC_FUN(materialed_flag );
DECLARE_OLC_FUN(materialed_rigidity );
DECLARE_OLC_FUN(materialed_fragility );
DECLARE_OLC_FUN(materialed_density );
DECLARE_OLC_FUN(materialed_race );
DECLARE_OLC_FUN(materialed_race_add );
DECLARE_OLC_FUN(materialed_race_del );
DECLARE_OLC_FUN(materialed_repairman );
DECLARE_OLC_FUN(materialed_repairman_add );
DECLARE_OLC_FUN(materialed_repairman_del );
olc_cmd_t olc_cmds_material[] =
{
{ "create", materialed_create, 5},
{ "edit", materialed_edit, 5},
{ "touch", olced_dummy, 5},
{ "show", materialed_show, 0},
{ "list", materialed_list, 0},
{ "ename", materialed_ename, 5},
{ "rname", materialed_rname, 5},
{ "flag", materialed_flag, 5, material_flags},
{ "rigidity", materialed_rigidity, 5},
{ "fragility", materialed_fragility, 5},
{ "density", materialed_density, 5},
{ "race", materialed_race, 5},
{ "repairman", materialed_repairman, 5},
{ "commands", show_commands, 0},
{ NULL}
};
OLC_FUN(materialed_create)
{
int mn;
material_t *material;
char arg[MAX_STRING_LENGTH];
if (!char_security(ch,"SECURITY_OLC_MATERIAL"))
{
char_puts("MaterialEd: Insufficient security for editing materials.\n", ch);
return FALSE;
}
first_arg(argument, arg, sizeof(arg), FALSE);
if (arg[0] == '\0')
{
do_help(ch, "'OLC CREATE'");
return FALSE;
}
if (is_number(arg))
{
char_printf(ch, "MaterialEd: Argument must be name.\n");
return FALSE;
}
if ((mn = material_n_lookup(arg) >= 0))
{
char_printf(ch, "MaterialEd: %s: already exists.\n", MATERIAL(mn)->ename);
return FALSE;
}
material = material_new();
material->ename = str_dup(arg);
ch->desc->pEdit = (void *)material;
OLCED(ch) = olced_lookup(ED_MATERIAL);
char_puts("Material created.\n",ch);
return FALSE;
}
OLC_FUN(materialed_edit)
{
int mn;
char arg[MAX_STRING_LENGTH];
if (!char_security(ch,"SECURITY_OLC_MATERIAL"))
{
char_puts("MaterialEd: Insufficient security.\n", ch);
return FALSE;
}
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0')
{
do_help(ch, "'OLC EDIT'");
return FALSE;
}
mn = -1;
if (is_number(arg))
{
if (atoi(arg) < 0 || atoi(arg) > materials.nused)
{
char_printf(ch, "MaterialEd: %s: No such material.\n", arg);
return FALSE;
}
else
ch->desc->pEdit = MATERIAL(atoi(arg));
}
else
{
if ((mn = material_n_lookup(arg)) < 0)
{
char_printf(ch, "MaterialEd: %s: No such material.\n", argument);
return FALSE;
}
else
ch->desc->pEdit = MATERIAL(mn);
}
OLCED(ch) = olced_lookup(ED_MATERIAL);
return FALSE;
}
OLC_FUN(materialed_list)
{
int i;
for (i = 0; i < materials.nused; i++)
char_printf(ch, "[%3d] %-15s %-15s\n", i, MATERIAL(i)->ename, MATERIAL(i)->rname);
return FALSE;
}
OLC_FUN(materialed_ename)
{
material_t *material;
EDIT_MATERIAL(ch, material);
return olced_str(ch, argument, cmd, &material->ename);
}
OLC_FUN(materialed_rname)
{
material_t *material;
EDIT_MATERIAL(ch, material);
return olced_str(ch, argument, cmd, &material->rname);
}
OLC_FUN(materialed_rigidity)
{
material_t *material;
EDIT_MATERIAL(ch, material);
return olced_number(ch, argument, cmd, &material->rigidity);
}
OLC_FUN(materialed_fragility)
{
material_t *material;
EDIT_MATERIAL(ch, material);
return olced_number(ch, argument, cmd, &material->fragility);
}
OLC_FUN(materialed_flag)
{
material_t *material;
EDIT_MATERIAL(ch, material);
return olced_flag64(ch, argument, cmd, &material->flag);
}
OLC_FUN(materialed_density)
{
material_t *material;
EDIT_MATERIAL(ch, material);
return olced_number(ch, argument, cmd, &material->density);
}
OLC_FUN(materialed_show)
{
char arg[MAX_STRING_LENGTH];
BUFFER *output;
material_t *material;
int i,j;
MOB_INDEX_DATA *pMobIndex;
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0')
{
if (IS_EDIT(ch, ED_MATERIAL))
EDIT_MATERIAL(ch, material);
else
{
do_help(ch, "'OLC ASHOW'");
return FALSE;
}
}
else
{
if (is_number(arg))
{
if (atoi(arg) < 0 || atoi(arg) > materials.nused)
{
char_printf(ch, "MaterialEd: %s: No such material.\n", arg);
return FALSE;
}
else
material = MATERIAL(atoi(arg));
}
else
{
if (material_n_lookup(arg) < 0)
{
char_printf(ch, "MaterialEd: Not such material %s.\n", arg);
return FALSE;
}
else
material = MATERIAL(material_n_lookup(arg));
}
}
output = buf_new(-1);
buf_printf(output, "English Name: [%s]\n", material->ename);
buf_printf(output, "Russian Name: [%s]\n", material->rname);
buf_printf(output, "Flags: [%s]\n", flag_string(material_flags, material->flag));
buf_printf(output, "Rigidity: [%d]\n", material->rigidity);
buf_printf(output, "Fragility: [%d]\n", material->fragility);
buf_printf(output, "Density: [%d]\n", material->density);
buf_printf(output, "Races: [");
j = 0;
for (i = 0; i < material->races.nused; i++)
{
mtrace_t *race = varr_get(&material->races, i);
if (race == NULL)
{
continue;
}
if (j > 0)
{
buf_printf(output, "\n %-8s %s ", race->name, flag_string(status_table, race->status));
}
else
buf_printf(output, " %-8s %s ", race->name, flag_string(material_wear_status, race->status));
j++;
}
buf_printf(output, "]\n");
buf_printf(output, "Repair: [");
j =0;
for (i = 0; i < material->repairer.nused; i++)
{
mrepair_t *repairer = varr_get(&material->repairer, i);
if (repairer == NULL)
{
continue;
}
pMobIndex = get_mob_index(repairer->vnum);
if (j > 0)
{
buf_printf(output, "\n %-6d Repair ratio: %4d - %s", repairer->vnum, repairer->repair_rate, pMobIndex != NULL ? mlstr_mval(pMobIndex->short_descr) : "= Unknown =");
}
else
buf_printf(output, " %-6d Repair ratio: %4d - %s ", repairer->vnum, repairer->repair_rate, pMobIndex != NULL ? mlstr_mval(pMobIndex->short_descr) : "= Unknown =");
j++;
}
buf_printf(output, "]\n\r\n");
page_to_char(buf_string(output), ch);
buf_free(output);
return FALSE;
}
OLC_FUN(materialed_race)
{
char arg[MAX_STRING_LENGTH];
argument = one_argument(argument, arg, sizeof(arg));
if (!str_prefix(arg, "add"))
return materialed_race_add(ch, argument, cmd);
else if (!str_prefix(arg, "delete"))
return materialed_race_del(ch, argument, cmd);
do_help(ch, "'OLC MATERIAL RACE'");
return FALSE;
}
OLC_FUN(materialed_race_add)
{
int race;
int status;
mtrace_t *mtrace;
char name[MAX_STRING_LENGTH];
const char *tmp;
material_t *material;
EDIT_MATERIAL(ch, material);
argument = one_argument(argument, name, sizeof(name));
if (IS_NULLSTR(name) || IS_NULLSTR(argument))
{
do_help(ch, "'OLC MATERIAL RACE'");
return FALSE;
}
if ((race = rn_lookup(name)) <= 0)
{
char_printf(ch, "MaterialEd: %s: unknown race.\n", name);
return FALSE;
}
if ((status = flag_value(material_wear_status, argument)) == 0)
{
char_printf(ch, "ReligionEd: %s: unknown flag.\n", argument);
return FALSE;
}
tmp = str_dup(race_name(race));
if ((mtrace = material_race_lookup (material, tmp)) != NULL)
{
char_printf(ch, "MaterialEd: %s: already there.\n", race_name(race));
free_string(tmp);
return FALSE;
}
free_string(tmp);
mtrace = varr_enew(&material->races);
mtrace->name = str_dup(race_name(race));
mtrace->status = status;
varr_qsort(&material->races, cmpstr);
return TRUE;
}
OLC_FUN(materialed_race_del)
{
const char *name;
material_t *material;
mtrace_t *mtrace;
int race;
EDIT_MATERIAL(ch, material);
if (IS_NULLSTR(argument))
{
do_help(ch, "'OLC MATERIAL RACE'");
return FALSE;
}
if ((race = rn_lookup(argument)) <= 0)
{
char_printf(ch, "MaterialEd: %s: unknown race.\n", name);
return FALSE;
}
name = str_dup(race_name(race));
if ((mtrace = material_race_lookup(material, name)) == NULL)
{
char_printf(ch, "MaterialEd: %s: it's currently deleted.\n", name);
return FALSE;
}
varr_del(&material->races, (void*)mtrace);
varr_qsort(&material->races, cmpstr);
return TRUE;
}
OLC_FUN(materialed_repairman)
{
char arg[MAX_STRING_LENGTH];
argument = one_argument(argument, arg, sizeof(arg));
if (!str_prefix(arg, "add"))
return materialed_repairman_add(ch, argument, cmd);
else if (!str_prefix(arg, "delete"))
return materialed_repairman_del(ch, argument, cmd);
do_help(ch, "'OLC MATERIAL REPAIR'");
return FALSE;
}
OLC_FUN(materialed_repairman_add)
{
char arg1[MAX_STRING_LENGTH];
material_t *material;
mrepair_t *repairer;
int vnum;
MOB_INDEX_DATA *pMobIndex;
EDIT_MATERIAL(ch, material);
argument = one_argument(argument, arg1, sizeof(arg1));
if (IS_NULLSTR(arg1) || IS_NULLSTR(argument) || !is_number(arg1) || !is_number(argument))
{
do_help(ch, "'OLC MATERIAL REPAIR'");
return FALSE;
}
vnum = atoi(arg1);
if ((pMobIndex = get_mob_index(vnum)) == NULL)
{
char_printf(ch, "MaterialEd: Not such mob %d.\n", vnum);
return FALSE;
}
if ((repairer = material_repair_lookup (material, vnum)) != NULL)
{
char_printf(ch, "MaterialEd: Mob %d: already there.\n", vnum);
return FALSE;
}
repairer = varr_enew(&material->repairer);
repairer->vnum = vnum;
repairer->repair_rate = atoi(argument);
varr_qsort(&material->repairer, cmpint);
return TRUE;
}
OLC_FUN(materialed_repairman_del)
{
int vnum;
material_t *material;
mrepair_t *repairer;
EDIT_MATERIAL(ch, material);
if (IS_NULLSTR(argument) || !is_number(argument))
{
do_help(ch, "'OLC MATERIAL REPAIR'");
return FALSE;
}
vnum = atoi(argument);
if ((repairer = material_repair_lookup(material, vnum)) == NULL)
{
char_printf(ch, "MaterialEd: %d: it's currently deleted.\n", vnum);
return FALSE;
}
varr_del(&material->repairer, (void*)repairer);
varr_qsort(&material->repairer, cmpint);
return TRUE;
}