//
#define SYNTAX  "ָʽ: dingyi x,y,z i(Χ)\n "

inherit F_CLEAN_UP;

int change_room(object room, int x, int y, int z, int i, int a, int b, int c);

int main(object me, string arg)
{
        int x,y,z,i,a,b,c;

        if(!arg) return notify_fail(SYNTAX);
        if(sscanf(arg,"%d,%d,%d %d",x,y,z,i) != 4)      
        return notify_fail(SYNTAX);
        a=x;
        b=y;
        c=z;
        write (a+","+b+","+c+" "+i+".\n");
        change_room(environment(me),x,y,z,i,a,b,c);
        return 1;
}

int change_room(object room, int x, int y, int z, int i, int a, int b, int c)
{
        
        mapping exits;
        string *directions;
        string dir;
        object nextroom;
        int j;

        if (room->query("coor")) {
                write("         ==>"+room->query("short")+"( "+base_name(room)+".c )Ѷ,Ϊ [ "+room->query("coor/x")+","+room->query("coor/y")+","+room->query("coor/z")+" ]\n" );
                return 1;}
        reset_eval_cost();

        room->set("coor/x", x);
        room->set("coor/y", y);
        room->set("coor/z", z);
        write("趨 :: "+room->query("short")+" :: ("+base_name(room)+".c ) Ϊ [ "+x+","+y+","+z+" ]\n");

        exits = room->query("exits");
        if(!mapp(exits) || !sizeof(exits)) {
                write(": "+room->query("short")+" ("+base_name(room)+".c ) ޳ڡ");
                return 1;}

        directions = keys(exits);
        for(j=0;j<sizeof(directions);j++)
        {
        x=(int) room->query("coor/x");
        y=(int) room->query("coor/y");
        z=(int) room->query("coor/z");
        dir = directions[j];
                if(!objectp(nextroom=find_object(exits[dir])))
                        nextroom=load_object(exits[dir]);
        switch(dir) {
        case "north" : y+=10;if (y-b<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "south" : y-=10;if (b-y<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "east" :  x+=10;if (x-a<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "west" :  x-=10;if (a-x<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "northup" : y+=10;z+=10;if (y-b<(i*10+10) && z-c<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "southup" : y-=10;z+=10;if (b-y<(i*10+10) && z-c<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "eastup" : x+=10;z+=10;if (x-a<(i*10+10) && z-c<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "westup" : x-=10;z+=10;if (a-x<(i*10+10) && z-c<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "northdown" : y+=10;z-=10;if (y-b<(i*10+10) && c-z<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "southdown" : y-=10;z-=10;if (b-y<(i*10+10) && c-z<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "eastdown":  x+=10;z-=10;if (x-a<(i*10+10) && c-z<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "westdown": x-=10;z-=10;if (a-x<(i*10+10) && c-z<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "northeast" : y+=10;x+=10;if (y-b<(i*10+10) && x-a<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "northwest" : y+=10;x-=10;if (y-b<(i*10+10) && a-x<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "southeast": y-=10;x+=10;if (b-y<(i*10+10) && x-a<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "southwest": y-=10;x-=10;if (b-y<(i*10+10) && a-x<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "up" : z+=10;if (z-c<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        case "down" : z-=10;if (c-z<(i*10+10)) {change_room(nextroom,x,y,z,i,a,b,c);break;} break;
        }
}
return 1;
}

