/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments 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.diku' as well the Merc *
* license in 'license.merc'. In particular, you may not remove either *
* of these copyright notices. *
* *
* 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. *
***************************************************************************/
/*
MurkMUD++ - A Windows compatible, C++ compatible Merc 2.2 Mud.
\author Jon A. Lambert
\date 08/30/2006
\version 1.4
\remarks
This source code copyright (C) 2005, 2006 by Jon A. Lambert
All rights reserved.
Use governed by the MurkMUD++ public license found in license.murk++
*/
#include "os.hpp"
#include "config.hpp"
#include "globals.hpp"
#include "io.hpp"
#include "utils.hpp"
#include "objproto.hpp"
#include "object.hpp"
int ObjectPrototype::top_obj = 0;
ObjectPrototype::ObjectPrototype() :
vnum(0), item_type(0),
extra_flags(0), wear_flags(0), count(0), weight(0), cost(0) {
memset(value, 0, sizeof value);
top_obj++;
}
/*
* Count occurrences of an obj in a list.
*/
int ObjectPrototype::count_obj_list (std::list<Object *> & list)
{
int nMatch = 0;
for (ObjIter o = list.begin(); o != list.end(); o++) {
if ((*o)->pIndexData == this)
nMatch++;
}
return nMatch;
}
/*
* Find some object with a given index data.
* Used by area-reset 'P' command.
*/
Object * ObjectPrototype::get_obj_type ()
{
for (ObjIter obj = object_list.begin(); obj != object_list.end(); obj++) {
if ((*obj)->pIndexData == this)
return *obj;
}
return NULL;
}
/*
* Create an instance of an object.
*/
Object * ObjectPrototype::create_object (int lvl)
{
Object *obj;
if (this == NULL) {
fatal_printf ("Create_object: NULL this.");
}
obj = new Object();
obj->pIndexData = this;
obj->in_room = NULL;
obj->level = lvl;
obj->wear_loc = -1;
obj->name = name;
obj->short_descr = short_descr;
obj->description = description;
obj->item_type = item_type;
obj->extra_flags = extra_flags;
obj->wear_flags = wear_flags;
obj->value[0] = value[0];
obj->value[1] = value[1];
obj->value[2] = value[2];
obj->value[3] = value[3];
obj->weight = weight;
obj->cost = number_fuzzy (10)
* number_fuzzy (lvl) * number_fuzzy (lvl);
/*
* Mess with object properties.
*/
switch (obj->item_type) {
default:
bug_printf ("Read_object: vnum %d bad type.", vnum);
break;
case ITEM_LIGHT:
case ITEM_DARKNESS:
case ITEM_TREASURE:
case ITEM_FURNITURE:
case ITEM_TRASH:
case ITEM_CONTAINER:
case ITEM_DRINK_CON:
case ITEM_KEY:
case ITEM_FOOD:
case ITEM_BOAT:
case ITEM_CORPSE_NPC:
case ITEM_CORPSE_PC:
case ITEM_FOUNTAIN:
break;
case ITEM_SCROLL:
obj->value[0] = number_fuzzy (obj->value[0]);
break;
case ITEM_WAND:
case ITEM_STAFF:
obj->value[0] = number_fuzzy (obj->value[0]);
obj->value[1] = number_fuzzy (obj->value[1]);
obj->value[2] = obj->value[1];
break;
case ITEM_WEAPON:
obj->value[1] = number_fuzzy (number_fuzzy (1 * lvl / 4 + 2));
obj->value[2] = number_fuzzy (number_fuzzy (3 * lvl / 4 + 6));
break;
case ITEM_ARMOR:
obj->value[0] = number_fuzzy (lvl / 4 + 2);
break;
case ITEM_POTION:
case ITEM_PILL:
obj->value[0] = number_fuzzy (number_fuzzy (obj->value[0]));
break;
case ITEM_MONEY:
obj->value[0] = obj->cost;
break;
}
object_list.push_back(obj);
count++;
return obj;
}