package net.sourceforge.pain.logic.event.console.command.builder; import net.sourceforge.pain.network.console.*; import net.sourceforge.pain.data.type.*; import net.sourceforge.pain.data.*; import net.sourceforge.pain.logic.fn.*; import net.sourceforge.pain.logic.fn.util.*; import net.sourceforge.pain.*; import java.util.*; /** * PAiN Date: 05.06.2003 Time: 1:40:02 */ public final class BC_Link extends BuilderCommand { public void processBuilderCommand(BuilderShell p, String args) throws Exception { boolean failed = true; final Space space = p.player.asLocated().getLocation(); LinkedSpace link = (LinkedSpace) space.getRole(LinkedSpace.class); if (args != null) { StringTokenizer st = new StringTokenizer(args, " "); final String directionStr = st.nextToken(); if (directionStr.length() != 1) { MessageOutFn.outln(p.console, "ERROR:Illegal direction:" + directionStr); return; } final int dir; try { dir = Utils.exitCharToDir(directionStr.charAt(0)); } catch (Exception e) { MessageOutFn.outln(p.console, "ERROR:Illegal direction:" + directionStr); return; } Exit e = link == null ? null : link.getExit(dir); if (e != null) { MessageOutFn.outln(p.console, "ERROR:Direction is busy:" + e.getTargetSpace().getName()); return; } boolean single = false; if (st.hasMoreTokens()) { String uniqueName = null; String token = st.nextToken(); if ("SINGLE".equalsIgnoreCase(token)) { single = true; if (st.hasMoreTokens()) { uniqueName = st.nextToken("\n").trim(); } } else { uniqueName = token; } if (uniqueName != null) { IndexedSpace targetIndexedSpace = Core.getWorld().getIndexedSpacesRegistry().getSpace(uniqueName); if (targetIndexedSpace == null) { MessageOutFn.outln(p.console, "ERROR: no named space found with name:" + uniqueName); return; } LinkedSpace targetSixWayLink = single ? null : (LinkedSpace) targetIndexedSpace.getRole(LinkedSpace.class); int reverseDir = LinkedSpace.reverseDir[dir]; if (targetSixWayLink != null && targetSixWayLink.getExit(reverseDir) != null) { MessageOutFn.outln(p.console, "ERROR: reverse dir is used, use SINGLE option to create single way link"); return; } // ok, creating! failed = false; link(p.console, space, dir, targetIndexedSpace.asSpace()); if (!single) { link(p.console, targetIndexedSpace.asSpace(), reverseDir, space); } } } } if (failed) { showUsage(p.console); } } private static void link(Console console, Space space, int dir, Space targetSpace) throws Exception { MessageOutFn.outln(console, "Creating link from {Y" + space.getName() + "{x direction:{C" + LangUtil.exitName[dir] + "{x target space:{Y" + targetSpace.getName() + "{x"); LinkedSpace link = (LinkedSpace) space.getRole(LinkedSpace.class); if (link == null) { link = (LinkedSpace) space.addRole(LinkedSpace.class); } Exit e = (Exit) ObjectFactory.create(Exit.class); e.setTargetSpace(targetSpace); link.setExit(dir, e); } public void showUsage(Console console) { MessageOutFn.outln(console, "LINK:Command syntax <DIRECTION> [SINGLE] <UNIQUE_ROOM_ID>\n"); } public void showHelp(Console console) { MessageOutFn.outln(console, "Builder command LINK creates exit from current space to other."); MessageOutFn.outln(console, "Usage: link <DIRECTION> [SINGLE] <UNIQUE_ROOM_ID>"); MessageOutFn.outln(console, "{wDIRECTION{x is a letter from (N,E,S,W,U,D)"); MessageOutFn.outln(console, "{wSINGLE{x is optional param. Used when single way link should be created"); MessageOutFn.outln(console, "{wUNIQUE_ROOM_ID{x is unique name of the target space"); MessageOutFn.outln(console, "NOTE: LinkedSpace will be added to current or target space if needed"); } }