/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.event.console.command;

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


public final class Look extends CommandHandler {

	public boolean isAccessible() {
		return super.isAccessible() && player.asReceptive().canSee();
	}

	public void processNotAccessible() {
		MessageOutFn.outln(console, "You can't see anything!");
	}

	public void processCommand() throws Exception {
		Receptive receptive = player.asReceptive();
		String targetName = commandParams;
		if ("INVENTORY".equals(command.tag)) {
			lookInventory();
		} else if (targetName == null) {
			lookSpace();
		} else {
			targetName = targetName.trim().toLowerCase();
			if (targetName.length() > 3 && (targetName.startsWith("on ") || targetName.startsWith("at "))) {
				targetName = targetName.substring(3).trim();
			}
			Interactive actor = player.asInteractive();
			Interactive victim = SpaceFindFn.findByPrefix(actor.asLocated(), targetName);
			if (victim == null) {
				LinkedSpace lsp = (LinkedSpace) player.getLocation().getRole(LinkedSpace.class);
				int exitDir;
				if (lsp != null && (exitDir = Utils.exitNameToDir(targetName)) >= 0) {
					Exit ex = lsp.getExit(exitDir);
					if (ex == null || ex.getExitDesc() == null) {
						MessageOutFn.outln(console, "Nothing special there.");
					} else {
						MessageOutFn.outln(console, ex.getExitDesc());
					}
				} else {
					MessageOutFn.outln(console, "You don't see that here.");
				}
			} else {
				if (victim == actor) {
					MessageOutFn.outSpace(actor, "$n looks at $mself.", actor, actor);
				} else {
					MessageOutFn.outOne(victim, "$n looks at you.", actor, null);
					MessageOutFn.outSpaceNoVictim(actor, victim, "$n looks at $N.", actor, victim);
				}
				ShowFn.showObject(receptive, victim);
			}
		}
	}

	private void lookInventory() {
		Equipped eq = (Equipped) player.getRole(Equipped.class);
		if (eq == null) {
			ConsoleInputEvent.processFailedCommand(console);
			return;
		}
		ShowFn.showSpace(player.asReceptive(), eq.getInventory());
	}

	private void lookSpace() {
		ShowFn.showSpace(player.asReceptive(), player.getLocation());
	}

	public void showHelp() {
		MessageOutFn.outln(console, command.name + ":shows description of the place and interactive objects in it");
	}
}