--- deliantra/server/common/arch.C 2009/10/27 01:38:39 1.91 +++ deliantra/server/common/arch.C 2016/11/18 04:44:13 1.113 @@ -1,40 +1,39 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. - * - * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team - * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team - * Copyright (©) 1992,2007 Frank Tore Johansen - * + * + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2002 Mark Wedel & Crossfire Development Team + * Copyright (©) 1992 Frank Tore Johansen + * * Deliantra is free software: you can redistribute it and/or modify it under * the terms of the Affero GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the Affero GNU General Public License * and the GNU General Public License along with this program. If not, see * . - * + * * The authors can be reached via e-mail to */ #include #include -#include #include -#include +#include archetype *loading_arch; // ugly flag to object loader etc. to suppress/request special processing arch_ptr archetype::empty; // the hashtable -typedef std::tr1::unordered_map +typedef std::unordered_map < const char *, arch_ptr, @@ -53,6 +52,28 @@ // the vector of loaded but not yet committed archetypes static std::vector postponed_arch; +//+GPL + +/* + * Creates an object. This function is called by archetype::get () + * if it fails to find the appropriate archetype. + * Thus archetype::get() will be guaranteed to always return + * an object, and never NULL. + */ +static object * +create_singularity (const char *name) +{ + LOG (llevError | logBacktrace, "FATAL: creating singularity for '%s'.\n", name); + + if (!strcmp (name, "bug")) + abort (); + + object *op = archetype::get (shstr_bug); + op->name = op->name_pl = format ("bug, please report (missing archetype %s)", name); + + return op; +} + /** * GROS - This function retrieves an archetype given the name that appears * during the game (for example, "writing pen" instead of "stylus"). @@ -193,13 +214,13 @@ return 1; /* unpaid is a little more specific */ - if (!strcmp (cp, "unpaid") && QUERY_FLAG (op, FLAG_UNPAID)) + if (!strcmp (cp, "unpaid") && op->flag [FLAG_UNPAID]) return 2; - if (!strcmp (cp, "cursed") && QUERY_FLAG (op, FLAG_KNOWN_CURSED) && (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED))) + if (!strcmp (cp, "cursed") && op->flag [FLAG_KNOWN_CURSED] && (op->flag [FLAG_CURSED] || op->flag [FLAG_DAMNED])) return 2; - if (!strcmp (cp, "unlocked") && !QUERY_FLAG (op, FLAG_INV_LOCKED)) + if (!strcmp (cp, "unlocked") && !op->flag [FLAG_INV_LOCKED]) return 2; /* Allow for things like '100 arrows' */ @@ -278,6 +299,14 @@ return 0; } +//-GPL + +void +archetype::do_delete () +{ + delete this; +} + archetype::archetype (const char *name) { arch = this; @@ -327,6 +356,17 @@ return i->second; } +void +archetype::post_load_check () +{ + assert (("obj_original MUST NOT be set for archetypes", !flag [FLAG_OBJ_ORIGINAL])); + + if (type == SKILL) + add_skill_archetype (this); + + object::post_load_check (); +} + archetype * archetype::read (object_thawer &f) { @@ -345,7 +385,7 @@ #if 0 // implementing it here in the server does neither allow multiple inheritence // nor does it cleanly "just override". it would allow use in map files, though, - // and other resource files dynamically laoded (as opposed to being preprocessed). + // and other resource files dynamically loaded (as opposed to being preprocessed). // not that any of this is relevant as of yet... if (f.kw == KW_inherit) { @@ -412,8 +452,7 @@ } // assemble new chain - new_head->min_x = new_head->max_x = new_head->x; - new_head->min_y = new_head->max_y = new_head->y; + new_head->max_x = new_head->x; archetype *less = new_head; for (auto (p, parts.begin () + 1); p != parts.end (); ++p) @@ -428,10 +467,7 @@ at->flag [FLAG_MONSTER] = new_head->flag [FLAG_MONSTER]; at->flag [FLAG_IS_FLOOR] = new_head->flag [FLAG_IS_FLOOR]; - new_head->min_x = min (new_head->min_x, at->x); - new_head->min_y = min (new_head->min_y, at->y); new_head->max_x = max (new_head->max_x, at->x); - new_head->max_y = max (new_head->max_y, at->y); at->head = new_head; less->more = at; @@ -496,7 +532,7 @@ void archetype::gc () { - int cnt = max (1, min (allarch.size () / 128, dirtycnt)); + int cnt = max (1, min (allarch.size () / 128, dirtycnt)); dirtycnt = max (0, dirtycnt - cnt); do @@ -515,7 +551,7 @@ ++idx; else { - LOG (llevDebug, "garbage collect arch %s", &at->archname); + //LOG (llevDebug, "garbage collect arch %s", &at->archname); assert (at->arch == at); // verify that refcnt == 1 is truly valid allarch.erase (idx); @@ -543,37 +579,13 @@ return op; } -/* - * Creates an object. This function is called by get_archetype() - * if it fails to find the appropriate archetype. - * Thus get_archetype() will be guaranteed to always return - * an object, and never NULL. - */ -object * -create_singularity (const char *name) -{ - LOG (llevError | logBacktrace, "FATAL: creating singularity for '%s'.\n", name); - - if (!strcmp (name, "bug")) - abort (); - - object *op = archetype::get (shstr_bug); - op->name = op->name_pl = format ("bug, please report (missing archetype %s)", name); - - return op; -} +//+GPL /* * Finds which archetype matches the given name, and returns a new * object containing a copy of the archetype. */ object * -get_archetype (const char *name) -{ - return archetype::get (name); -} - -object * archetype::get (const char *name) { archetype *at = find (name); @@ -588,7 +600,7 @@ * Returns the first archetype using the given type. * Used in treasure-generation. */ -archetype * +static archetype * type_to_archetype (int type) { for_all_archetypes (at) @@ -645,3 +657,5 @@ return head; } +//-GPL +