/
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.event.console.command.builder;

import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.logic.fn.*;
import net.sourceforge.pain.logic.fn.util.*;
import net.sourceforge.pain.network.console.*;

import java.util.*;

/**
 * PAiN  Date: 05.06.2003  Time: 1:40:02
 */
public final class BC_Unlink extends BuilderCommand {

	public void processBuilderCommand(BuilderShell p, String args) throws Exception {
		boolean failed = true;
		final Space space = p.player.asLocated().getLocation();
		Room room = (Room) space.getRole(Room.class);
		if (room == null) {
			MessageOutFn.outln(p.console, "ERROR:No exists found");
			return;
		}
		if (args != null) {
			StringTokenizer st = new StringTokenizer(args, " ");
			final String directionStr = st.nextToken();
			if (directionStr.length() != 1) {
				MessageOutFn.outln(p.console, "Illegal direction:" + directionStr);
				return;
			}
			final int dir;
			try {
				dir = Utils.exitCharToDir(directionStr.charAt(0));
			} catch (Exception e) {
				MessageOutFn.outln(p.console, "Illegal direction:" + directionStr);
				return;
			}
			Exit e = room.getExit(dir);
			if (e == null) {
				MessageOutFn.outln(p.console, "ERROR:No exists found");
				return;
			}
			boolean single = false;
			if (!st.hasMoreTokens() || (single = "SINGLE".equals(st.nextToken()))) {
				failed = false;
				Room targetRoom = e.getTargetRoom();
				if (!single) {
						int reverseDir = Room.reverseDir[dir];
						Exit reverseExit = targetRoom.getExit(reverseDir);
						if (reverseExit != null) {
							unlink(p.console, targetRoom, reverseDir, room);
						}
				}
				unlink(p.console, room, dir, targetRoom);
			}
		}
		if (failed) {
			showUsage(p.console);
		}
	}

	void unlink(Console console, Room link, int dir, Room targetSpace) throws Exception {
		Space space = link.asSpace();
		MessageOutFn.outln(console, "Destroying path from {Y" + space.getName() + "{x direction:{C" + LangUtil.exitName[dir] + "{x to {Y" + targetSpace.asSpace().getName() + "{x");
		Exit e = link.getExit(dir);
		e.delete();
		boolean noExistsLeft = true;
		for (int i = Room.FIRST_DIR; i <= Room.LAST_DIR; i++) {
			if (link.getExit(dir) != null) {
				noExistsLeft = false;
				break;
			}
		}
		if (noExistsLeft) {
			space.removeRole(Room.class);
		}
	}

	public void showUsage(Console console) {
		MessageOutFn.outln(console, "UNLINK:Command syntax <DIRECTION> [SINGLE]\n");
	}

	public void showHelp(Console console) {
		MessageOutFn.outln(console, "Builder command UNPATH destroys exit from current space");
		MessageOutFn.outln(console, "Usage: unlink <DIRECTION> [SINGLE]");
		MessageOutFn.outln(console, "where {wDIRECTION{x is a letter from (N,E,S,W,U,D)");
		MessageOutFn.outln(console, "if {wSINGLE{x option is specified only single way link will be destroyed");
		MessageOutFn.outln(console, "NOTE: Room role will be removed from current or target space ");
		MessageOutFn.outln(console, "      if no other exits will found from space");
	}

}