/
codebase/
codebase/area/
codebase/doc/
codebase/etc/
codebase/src/net/sourceforge/pain/data/trigger/
codebase/src/net/sourceforge/pain/logic/
codebase/src/net/sourceforge/pain/logic/affect/
codebase/src/net/sourceforge/pain/logic/event/
codebase/src/net/sourceforge/pain/logic/event/deploy/
codebase/src/net/sourceforge/pain/logic/event/guitool/
codebase/src/net/sourceforge/pain/logic/event/guitool/event/
codebase/src/net/sourceforge/pain/logic/fn/util/
codebase/src/net/sourceforge/pain/logic/trigger/
codebase/src/net/sourceforge/pain/logic/trigger/impl/
codebase/src/net/sourceforge/pain/network/console/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/plugin/command/
codebase/src/net/sourceforge/pain/plugin/reset/
codebase/src/net/sourceforge/pain/plugin/shutdown/
codebase/src/net/sourceforge/pain/plugin/social/
codebase/src/net/sourceforge/pain/util/
db/doc/javadoc/resources/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.fn;

import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.logic.trigger.*;
import net.sourceforge.pain.util.*;

import java.util.*;

public class MoveFn {
    public static final int ERR_MOVE_NO_EXITS_FOUND = 1;
    public static final int ERR_MOVE_NOT_ENOUGH_MOVE_POINTS = 2;
    public static final int ERR_MOVE_ILLEGAL_MOB_STATE = 3;//for future

	public static void move(Mobile mob, int direction, boolean affectMoves) {
        Located mobLocated = mob.asLocated();
        Room fromSpace = (Room) mobLocated.getLocation().getRole(Room.class);
        if (fromSpace == null) { // not Room -> can't move
            throw new LogicException(ERR_MOVE_NO_EXITS_FOUND, "Not a linked space");
        }
        Exit exit = fromSpace.getExit(direction);
        if (exit == null) { // no exit found by direction
            throw new LogicException(ERR_MOVE_NO_EXITS_FOUND, "Exit not found");
        }
        // place to call onBeforeMoveDone triggers
        if (affectMoves) {
            int moveCost = exit.getMoveCost();
            int movesPoints = mob.getMoves();
            if (moveCost > movesPoints) {
                throw new LogicException(ERR_MOVE_NOT_ENOUGH_MOVE_POINTS, "Not enough move points");
            }
            mob.setMoves(movesPoints - moveCost);
        }
        final Room toSpace = exit.getTargetRoom();
        RelocateFn.relocate(mobLocated, toSpace.asSpace());
		// place to call onAfterMoveDone triggers
        triggerMovedIn(mob, fromSpace, toSpace);
	}

    private static void triggerMovedIn(Mobile mob, Room srcSpace, Room dstSpace) {
        for (Iterator it = dstSpace.getTriggersByEventType(TriggerType.TRIGGER_AFTER_MOVED_IN); it.hasNext();) {
            try {
                AfterMovedInTrigger t = (AfterMovedInTrigger )TriggerFactory.provideTrigger((TriggerData) it.next());
                t.onAfterMoveIn(mob, srcSpace);
            } catch (Exception e) {
                Log.error(e);
            }
        }
    }

}