muddy/
muddy/CVS/
muddy/area/
muddy/area/CVS/
muddy/clans/CVS/
muddy/classes/CVS/
muddy/doc/
muddy/doc/CVS/
muddy/etc/CVS/
muddy/etc/i3/
muddy/etc/i3/CVS/
muddy/imc/CVS/
muddy/lang/CVS/
muddy/licenses/CVS/
muddy/msgdb/CVS/
muddy/new/CVS/
muddy/notes/
muddy/player/
muddy/races/CVS/
muddy/religions/CVS/
muddy/src/CVS/
muddy/src/comm/CVS/
muddy/src/db/CVS/
muddy/src/intermud/
muddy/src/intermud/CVS/
muddy/src/irc/CVS/
muddy/src/olc/CVS/
 /* $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;

}