--- deliantra/server/common/loader.C 2007/01/15 21:06:18 1.46 +++ deliantra/server/common/loader.C 2007/02/01 17:29:16 1.51 @@ -26,11 +26,198 @@ sub/add_weight will transcend the environment updating the carrying variable. */ - #include #include #include +// resource loader pure base class +struct loader_base +{ + const char *filename; + virtual const char *type () const = 0; + + virtual archetype *get_arch (const char *name); + virtual void put_arch (archetype *arch); + + virtual object *get_object (const char *name); + virtual void put_object (object *op); + + virtual player *get_player (); + virtual void put_player (player *pl); + + virtual region *get_region (const char *name); + virtual void put_region (region *region); + + virtual facetile *get_face (const char *name); + virtual void put_face (facetile *face); + + virtual treasurelist *get_treasure (const char *name, bool one = false); + virtual void put_treasure (treasurelist *treasure); + + virtual animation *get_animation (const char *name); + virtual void put_animation (animation *anim); +}; + +// pure base class for default archetype loader +struct loader_arch : virtual loader_base { + archetype *get_arch (const char *name); + void put_arch (archetype *arch); +}; + +// pure base class for default object loader +struct loader_object : virtual loader_base { + object *get_object (const char *name); + void put_object (object *op); +}; + +// pure base class for default player loader +struct loader_player : virtual loader_base { + virtual player *get_player (); + virtual void put_player (player *pl); +}; + +// pure base class for default region loader +struct loader_region : virtual loader_base { + region *get_region (); + void put_region (region *region); +}; + +// pure base class for default face loader +struct loader_face : virtual loader_base { + facetile *get_face (const char *name); + void put_face (facetile *face); +}; + +// pure base class for default treasure loader +struct loader_treasure : virtual loader_base { + treasurelist *get_treasure (const char *name, bool one = false); + void put_treasure (treasurelist *treasure); +}; + +// pure base class for default animation loader +struct loader_animation : virtual loader_base { + animation *get_animation (const char *name); + void put_animation (animation *anim); +}; + +// future generic resource loader +// handles generic stuff valid in most files, such as +// animations, treasures, faces and so on +struct loader_generic +: virtual loader_base, + loader_object, loader_player, + loader_region, loader_face, + loader_treasure, loader_animation +{ + const char *type () const = 0; +}; + +// the base class warns about and skips everything +archetype * +loader_base::get_arch (const char *name) +{ + LOG (llevError, "%s: found archetype definition '%s', which is not allowed in files of type %s.\n", + filename, name, type ()); + + return new archetype; +} + +object * +loader_base::get_object (const char *name) +{ + LOG (llevError, "%s: found object definition '%s', which is not allowed in files of type %s.\n", + filename, name, type ()); + + return object::create (); +} + +player * +loader_base::get_player () +{ + LOG (llevError, "%s: found player definition, which is not allowed in files of type %s.\n", + filename, type ()); + + return player::create (); +} + +region * +loader_base::get_region (const char *name) +{ + LOG (llevError, "%s: found region definition '%s', which is not allowed in files of type %s.\n", + filename, name, type ()); + + return new region; +} + +facetile * +loader_base::get_face (const char *name) +{ + LOG (llevError, "%s: found face definition '%s', which is not allowed in files of type %s.\n", + filename, name, type ()); + + return new facetile; +} + +treasurelist * +loader_base::get_treasure (const char *name, bool one) +{ + LOG (llevError, "%s: found treasure definition '%s', which is not allowed in files of type %s.\n", + filename, name, type ()); + + return new treasurelist;//D +} + +animation * +loader_base::get_animation (const char *name) +{ + LOG (llevError, "%s: found animation definition '%s', which is not allowed in files of type %s.\n", + filename, name, type ()); + + return new animation; +} + +void +loader_base::put_arch (archetype *arch) +{ + delete arch; +} + +void +loader_base::put_object (object *op) +{ + op->destroy (); +} + +void +loader_base::put_player (player *pl) +{ + delete pl; +} + +void +loader_base::put_region (region *region) +{ + delete region; +} + +void +loader_base::put_face (facetile *face) +{ + delete face; +} + +void +loader_base::put_treasure (treasurelist *treasure) +{ + delete treasure; +} + +void +loader_base::put_animation (animation *anim) +{ + delete anim; +} + /* Maps the MOVE_* values to names */ static const char *const move_name[] = { "walk", "fly_low", "fly_high", "swim", "boat", NULL }; @@ -376,7 +563,10 @@ if (QUERY_FLAG (op, FLAG_MONSTER)) { if (op->stats.hp > op->stats.maxhp) - LOG (llevDebug, "Monster %s has hp set higher than maxhp (%d>%d)\n", op->debug_desc (), op->stats.hp, op->stats.maxhp); + { + LOG (llevDebug, "Monster %s has hp set higher than maxhp (%d>%d)\n", op->debug_desc (), op->stats.hp, op->stats.maxhp); + op->stats.maxhp = op->stats.hp; + } /* The archs just need to be updated for this */ if (op->move_type == 0) @@ -650,7 +840,7 @@ //TODO: maybe do in check_object // removed check for style maps if (op->speed < 0) - op->speed_left = op->speed_left - RANDOM () % 100 / 100.0; + op->speed_left = op->speed_left - rndm (); break;