package net.sourceforge.pain.tinylib.logic.fn;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.logic.*;
import net.sourceforge.pain.tinylib.data.type.*;
import net.sourceforge.pain.tinylib.logic.trigger.*;
import net.sourceforge.pain.tinylib.logic.trigger.impl.*;
import net.sourceforge.pain.util.*;
import java.util.*;
public class MoveFn implements RelocatinErrors {
public static void move(Located located, int direction) {
checkCanMove(located, direction);
Room fromRoom = (Room) located.getLocation().getRole(Room.class);
Exit exit = fromRoom.getExit(direction);
final Room toRoom = exit.getTargetRoom();
callBeforeMovedOutTriggers(located, toRoom);
RelocateFn.relocate(located, toRoom.asSpace());
callAfterMovedInTriggers(located, fromRoom, toRoom);
}
private static void callBeforeMovedOutTriggers(Located located, Room dstRoom) {
for (Iterator it = dstRoom.getTriggersByEventType(TriggerType.TRIGGER_BEFORE_MOVED_OUT); it.hasNext();) {
try {
BeforeMovedOutTrigger t = (BeforeMovedOutTrigger) TriggersLogicFactory.provideTriggerImpl((TriggerData) it.next());
t.onBeforeMovedOut(located, dstRoom);
} catch (Exception e) {
Log.error(e);
}
}
}
private static void callAfterMovedInTriggers(Located located, Room srcRoom, Room dstRoom) {
for (Iterator it = dstRoom.getTriggersByEventType(TriggerType.TRIGGER_AFTER_MOVED_IN); it.hasNext();) {
try {
AfterMovedInInTrigger t = (AfterMovedInInTrigger) TriggersLogicFactory.provideTriggerImpl((TriggerData) it.next());
t.onAfterMovedIn(located, srcRoom);
} catch (Exception e) {
Log.error(e);
}
}
}
public static void checkCanMove(Located located, int direction) {
Room fromRoom = (Room) located.getLocation().getRole(Room.class);
if (fromRoom == null) { // not Room -> can't go
throw new LogicException(ERR_MOVE_NO_EXITS_FOUND, "Not a room");
}
Exit exit = fromRoom.getExit(direction);
if (exit == null) { // no exit found by direction
throw new LogicException(ERR_MOVE_NO_EXITS_FOUND, "Exit not found");
}
}
}