--- deliantra/server/include/object.h 2007/06/04 13:04:00 1.130 +++ deliantra/server/include/object.h 2007/09/04 05:43:21 1.148 @@ -1,23 +1,22 @@ /* - * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. + * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. * * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * - * Crossfire TRT is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. + * Crossfire TRT is free software: you can redistribute it and/or modify + * it under the terms of the 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. + * 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 GNU General Public License along - * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * * The authors can be reached via e-mail to */ @@ -187,7 +186,9 @@ uint32 ACC (RW, weapontype); /* type of weapon */ uint32 ACC (RW, tooltype); /* type of tool or build facility */ body_slot slot [NUM_BODY_LOCATIONS]; - faceidx ACC (RW, face); /* Face with colors */ + faceidx ACC (RW, face); /* the graphical face */ + faceidx ACC (RW, sound); /* the sound face */ + faceidx ACC (RW, sound_destroy); /* played on destroy */ living ACC (RO, stats); /* Str, Con, Dex, etc */ /* See the pod/objects.pod for more info about body locations */ @@ -248,10 +249,10 @@ UUID ACC (RW, uuid); // Unique Identifier, survives saves etc. int ACC (RO, count); - int ACC (RO, index); // index into objects - int ACC (RO, active); // index into actives + object_vector_index ACC (RO, index); // index into objects + object_vector_index ACC (RO, active); // index into actives - player_ptr ACC (RW, contr); /* Pointer to the player which control this object */ + player_ptr ACC (RW, contr); /* Pointer to the player which control this object, ALWAYS set *iff* type == PLAYER */ object *ACC (RW, below); /* Pointer to the object stacked below this one */ object *ACC (RW, above); /* Pointer to the object stacked above this one */ @@ -271,12 +272,13 @@ key_value *key_values; /* Fields not explictly known by the loader. */ bool parse_kv (object_thawer &f); // parse kv pairs, (ab-)used by archetypes, which should not exist at all - void post_load_check (); // do some adjustments after parsing + MTH void post_load_check (); // do some adjustments after parsing static object *read (object_thawer &f, maptile *map = 0); // map argument due to toal design bogosity, must go. bool write (object_freezer &f); MTH int slottype () const; MTH static object *create (); + const mapxy &operator =(const mapxy &pos); object &operator =(const object &src); MTH void copy_to (object *dst); MTH object *clone (); // create + copy_to @@ -287,6 +289,8 @@ // recursively destroy all objects in inventory, optionally dropping them to the ground instead MTH void destroy_inv (bool drop_to_ground = false); MTH object *insert (object *item); // insert into inventory + MTH void play_sound (faceidx sound) const; + void do_remove (); MTH void remove () { @@ -294,6 +298,13 @@ do_remove (); } + void move_to (const mapxy &pos) + { + remove (); + *this = pos; + insert_at (this, this); + } + static bool can_merge_slow (object *op1, object *op2); // this is often used in time-critical code, so optimise @@ -315,6 +326,9 @@ open_container (0); } + MTH object *force_find (const shstr name); + MTH void force_add (const shstr name, int duration = 0); + // overwrite the attachable should_invoke function with a version that also checks ev_want_type bool should_invoke (event_type event) { @@ -379,7 +393,7 @@ // contr => is a player // head => only save head of a multitile object // owner => can not reference owner yet - MTH bool can_map_save () const { return !contr && !head && !owner && !flag [FLAG_NO_MAP_SAVE]; } + MTH bool can_map_save () const { return !head && (!owner || owner->contr) && !contr && !flag [FLAG_NO_MAP_SAVE]; } /* This return true if object has still randomitems which * could be expanded. @@ -423,6 +437,7 @@ // insert object at same map position as 'where' // handles both inventory and map "positions" MTH object *insert_at (object *where, object *originator = 0, int flags = 0); + MTH void drop_unpaid_items (); MTH void activate (); MTH void deactivate (); @@ -488,6 +503,12 @@ MTH struct region *region () const; + void statusmsg (const char *msg, int color = NDI_BLACK); + void failmsg (const char *msg, int color = NDI_RED); + + MTH const_octet_string ref () const; // creates and returns a consistent persistent object reference + static object *deref (const_octet_string ref); // returns the object from the generated refreence, if possible + protected: void link (); void unlink (); @@ -549,24 +570,27 @@ void gather_callbacks (AV *&callbacks, event_type event) const; static archetype *read (object_thawer &f); - static archetype *get (const char *name); // find or create - static archetype *find (const char *name); - void link (); - void unlink (); + MTH static archetype *get (const_utf8_string name); // find or create + MTH static archetype *find (const_utf8_string name); + + MTH void link (); + MTH void unlink (); - int ACC (RW, archid); // index in archvector + object_vector_index ACC (RW, archid); // index in archvector shstr ACC (RW, archname); /* More definite name, like "generate_kobold" */ bool ACC (RW, stub); // if true, this is an invalid archetype - struct archetype *ACC (RW, next); /* Next archetype in a linked list */ - struct archetype *ACC (RW, head); /* The main part of a linked object */ - struct archetype *ACC (RW, more); /* Next part of a linked object */ - uint32 ACC (RW, editable); /* editable flags (mainly for editor) */ sint8 ACC (RW, min_x), ACC (RW, min_y); /* extents, compared to the head (min_x, min_y should be zero, but aren't...) */ sint8 ACC (RW, max_x), ACC (RW, max_y); }; +inline void +object_freezer::put (keyword k, archetype *v) +{ + put (k, v ? &v->archname : (const char *)0); +} + typedef object_vector objectvec; typedef object_vector activevec; typedef object_vector archvec; @@ -629,10 +653,7 @@ #define INS_BELOW_ORIGINATOR 0x0010 #define INS_MAP_LOAD 0x0020 -#define ARCH_SINGULARITY "singularity" -#define ARCH_DETECT_MAGIC "detect_magic" #define ARCH_DEPLETION "depletion" -#define ARCH_SYMPTOM "symptom" #endif