#include <message_class.h> #include <terrain_types.h> #include <position.h> #include <medium.h> #ifndef MAX_INVENTORY_SIZE #define MAX_INVENTORY_SIZE 2048 #endif private static object LastEnvironment = 0; varargs int eventPrint(string str, mixed args...); varargs void eventAnnounceCanonicalId(object env); object GetLastEnvironment(){ return LastEnvironment; } int eventMove(mixed dest){ object ob,me,furn,prev; int depth; me=this_object(); if( !me ){ return 0; } if( environment() ){ int x; x = (int)environment()->CanRelease(me); if( !x && !archp() ){ return 0; } } if( stringp(dest) ){ if( !(ob = find_object(dest)) ){ string str; if( str = catch(call_other(dest, "???")) ){ if( creatorp() ){ eventPrint(str, MSG_ERROR); } return 0; } ob = find_object(dest); } } else { ob = dest; } if( !ob || ob == me ){ return 0; } if( living(me) && living(ob) ){ if(!ob->GetMount()) return 0; } if( !ob->CanReceive(me) ){ return 0; } if(sizeof(deep_inventory(ob)) > MAX_INVENTORY_SIZE){ return 0; } if( objectp(me) && LastEnvironment = environment() ){ environment()->eventReleaseObject(me); if(!undefinedp(me->GetRecurseDepth()) && !undefinedp(environment()->GetRecurseDepth())){ depth = me->GetRecurseDepth(); depth += 1; if(depth) environment()->AddRecurseDepth(-depth); if(environment()->GetRecurseDepth() < 1) environment()->SetRecurseDepth(1); } } if(!objectp(me) ) return 0; prev = environment(ob); move_object(ob); ob->eventReceiveObject(me); if(environment() == prev) return 0; if( environment() ){ foreach(object peer in all_inventory(environment())){ if( peer != me ){ catch(peer->eventEncounter(me)); } } if(OBJECT_MATCHING){ object *prev_inv = ({}); eventAnnounceCanonicalId(); if(prev && sizeof(prev_inv = deep_inventory(prev))) prev_inv->ReceiveCanonicalId(ob->GetCanonicalId(), 1); } } if(living(me) && furn = me->GetProperty("furniture_object")) if(objectp(furn)) furn->eventReleaseStand(me); if(living(me) && !living(environment(me)) && furn = me->GetProperty("mount")) if(objectp(furn)){ me->RemoveProperty("mount"); furn->eventDismount(me); } if(environment()->GetMedium() == MEDIUM_AIR && me->GetPosition() != POSITION_FLYING){ if(!(me->CanFly())) call_out("eventFall", 1); else me->eventFly(); } if(environment()->GetMedium() == MEDIUM_LAND && (me->GetPosition() == POSITION_FLOATING || me->GetPosition() == POSITION_SWIMMING)){ call_out("eventCollapse", 1, 1); } else if((environment()->GetMedium() == MEDIUM_WATER || environment()->GetMedium() == MEDIUM_SURFACE) && me->GetPosition() != POSITION_SWIMMING && me->GetPosition() != POSITION_FLOATING){ if(living(me)){ if(!(me->GetPosition() == POSITION_FLYING && environment()->GetMedium() == MEDIUM_SURFACE)){ if(!(environment()->GetTerrainType() & (T_SEAFLOOR)) && me->CanSwim()){ if(me->GetPosition() != POSITION_FLOATING){ me->eventSwim(); } } else call_out("eventSink", 1); } } else { if(!me->GetProperty("buoyant")) call_out("eventSink", 1); } } return (LastEnvironment != environment()); }