--- deliantra/server/common/object.C 2007/07/01 05:00:17 1.163 +++ deliantra/server/common/object.C 2007/07/26 00:27:07 1.168 @@ -301,14 +301,14 @@ return 0; } - //TODO: generate an event or call into perl for additional checks if (ob1->self || ob2->self) { ob1->optimise (); ob2->optimise (); if (ob1->self || ob2->self) - return 0; + if (!cfperl_can_merge (ob1, ob2)) + return 0; } /* Everything passes, must be OK. */ @@ -1377,7 +1377,6 @@ top = last->below; } } /* If objects on this space */ - if (flag & INS_MAP_LOAD) top = ms.top; @@ -2642,13 +2641,10 @@ const materialtype_t * object::dominant_material () const { - if (materialtype_t *mat = name_to_material (materialname)) - return mat; + if (materialtype_t *mt = name_to_material (materialname)) + return mt; - // omfg this is slow, this has to be temporary :) - shstr unknown ("unknown"); - - return name_to_material (unknown); + return name_to_material (shstr_unknown); } void @@ -2702,4 +2698,41 @@ } } +object * +object::force_find (const shstr name) +{ + /* cycle through his inventory to look for the MARK we want to + * place + */ + for (object *tmp = inv; tmp; tmp = tmp->below) + if (tmp->type == FORCE && tmp->slaying == name) + return splay (tmp); + + return 0; +} + +void +object::force_add (const shstr name, int duration) +{ + if (object *force = force_find (name)) + force->destroy (); + + object *force = get_archetype (FORCE_NAME); + force->slaying = name; + force->stats.food = 1; + force->speed_left = -1.f; + + force->set_speed (duration ? 1.f / duration : 0.f); + force->flag [FLAG_IS_USED_UP] = true; + force->flag [FLAG_APPLIED] = true; + + insert (force); +} + +void +object::play_sound (faceidx sound) const +{ + if (map) + map->play_sound (sound, x, y); +}