--- deliantra/server/common/loader.C 2007/01/19 17:50:10 1.48 +++ deliantra/server/common/loader.C 2007/02/01 17:29:16 1.51 @@ -26,14 +26,16 @@ sub/add_weight will transcend the environment updating the carrying variable. */ - #include #include #include -// future resource loader base class +// 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); @@ -43,7 +45,7 @@ virtual player *get_player (); virtual void put_player (player *pl); - virtual region *get_region (); + virtual region *get_region (const char *name); virtual void put_region (region *region); virtual facetile *get_face (const char *name); @@ -56,23 +58,165 @@ 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 : loader_base +struct loader_generic +: virtual loader_base, + loader_object, loader_player, + loader_region, loader_face, + loader_treasure, loader_animation { - virtual region *get_region (); - virtual void put_region (region *region); + const char *type () const = 0; +}; - virtual facetile *get_face (const char *name); - virtual void put_face (facetile *face); +// 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 ()); - virtual treasurelist *get_treasure (const char *name, bool one = false); - virtual void put_treasure (treasurelist *treasure); + return new archetype; +} - virtual animation *get_animation (const char *name); - virtual void put_animation (animation *anim); -}; +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 }; @@ -419,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)