| Command.java |
1 /*
2 * CVS: $Id: Command.java,v 1.1 2004/07/25 18:08:13 marcus Exp $
3 *
4 * This file is part of JZuul.
5 *
6 * JZuul is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * JZuul is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with Zuul; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 * Copyrigth 2004 by marcus, leh
21 *
22 */
23
24package org.jzuul.engine.commands;
25
26import java.text.MessageFormat;
27
28import org.jzuul.engine.Engine;
29import org.jzuul.engine.Player;
30import org.jzuul.engine.rooms.*;
31
32/**
33 * Die Klasse Command dient als Oberklase für alle Befehle, die verarbeitet werden können.
34 *
35 * Wenn ein neuer Befehl abgeleitet wird, müssen die Attribute name, arguments und desc gesetzt werden und
36 * die Methode action überschrieben werden.
37 *
38 *
39 * @version $Revision: 1.1 $
40 */
41public abstract class Command {
42 /**
43 * Normalerweise valiediert doAction die Anzahl der Argumente die in arguments definiert wurde
44 * wenn man arguments auf VARARG_COMMAND setzt, ist eine variable Anzahl von Argumenten möglich.
45 *
46 * Ein Beispiel ist {@link org.jzuul.engine.commands.Use}
47 *
48 */
49 public final static int VARARG_COMMAND = -1;
50
51 /**
52 * Die Anzahl der Argumente zu diesem Befehl.
53 * Default ist 0.
54 */
55 protected int arguments = 0;
56
57 /**
58 * Der Name des Befehls, sollte mit dem Klassennamen übereinstimmen
59 */
60 protected String name;
61
62 /**
63 * Enthällt die Argument, die dem Befehl übergeben wurden
64 */
65 protected String[] args;
66
67 /**
68 * Enthält das aktulle Playerobjekt
69 */
70 protected Player player;
71
72 /**
73 * Enthält den aktuellen Room des Players
74 */
75 protected Room currentRoom;
76
77 /**
78 * Die Beschreibung des Befhels, wird von help() verwendet.
79 */
80 protected String desc;
81
82 /**
83 * Legt fest ob es sich um eine GameAction, also eine Interaktion im Spiel (give,go) oder
84 * eine off Game action handelt (help,save aber auch inv oder look). Nach gameActions werden NPC Aktionen ausgeführt,
85 * nach off Game Actions nicht.
86 */
87 protected boolean gameAction;
88
89 /**
90 * Legt fest ob dieser Befehl auch in der Applet Sandbox ausgeführt werden kann.
91 */
92 protected boolean isAppletSave;
93
94 /**
95 * Sollte von einem Befehl der in der Form "befehl <objekt>" ist auf das eigentlich Objekt der Aktion gesetzt
96 * werden. Wird von dem Event System genutzt um dem Objekt das Event der Aktion mitzuteilen (z.B. Event.USE)
97 */
98 protected String objectName = null;
99
00 /**
01 * Konstruktor
02 * Default Werte:
03 * gameAction = true
04 * isAppletSave = true
05 */
06 public Command() {
07 this.gameAction = true;
08 isAppletSave = true;
09 }
10
11 /**
12 * Zugriff auf die Anzahl der Argumente
13 *
14 * @return die Anzahl der Argumente zu diesem Befehl
15 */
16 public int getNumArguments() {
17 return arguments;
18 }
19
20 /**
21 * Wird vom {@link org.jzuul.engine.Engine} aufgerufen, nachdem der Befehl identifiziert wurde.
22 *
23 * Übergabeparameter wie der Spieler und die Anzahl der Argumente werden validiert.
24 *
25 * @param player Der aktuelle Spieler
26 * @param args Die auf der Kommandozeile angegebenen
27 * @return true wenn der Befehl erfolgreich ausgeführt wurde, false otherwise
28 */
29 public final boolean doAction(Player player, String[] args) {
30 Object[] nameArray = { this.name };
31 if ( ( (args == null) && (arguments > 0) ) ||
32 ( (args != null ) && (args.length != arguments) && (arguments != VARARG_COMMAND) ) ) {
33 Engine.gui.println(MessageFormat.format(Messages.getString("COMMAND_ERROR_PARAMS"), nameArray)); //$NON-NLS-1$ //$NON-NLS-2$
34 this.help();
35 return false;
36 }
37 if (player == null ) {
38 Engine.gui.println(MessageFormat.format(Messages.getString("COMMAND_ERROR_PLAYER"), nameArray)); //$NON-NLS-1$ //$NON-NLS-2$
39 return false;
40 }
41 this.currentRoom = player.getCurrentRoom();
42 this.player = player;
43 this.args = args;
44
45 return this.action();
46 }
47
48 /**
49 * Diese Methode muss von jedem Befehl überschrieben werden und sollte
50 * die eigentlich Aktion implementieren
51 *
52 * @return true wenn der Befehl erfolgreich ausgeführt wurde
53 */
54 abstract protected boolean action();
55
56 /**
57 * Der help handler, der von dem Befehl help aufgerufen wird und bei einem
58 * Aufruf mit falschen Parametern.
59 * Kann überschrieben werden um eigen Hilfetexte auszugeben. Defaults to
60 * "Mit diesem Befehl" + this.desc
61 *
62 */
63 public void help() {
64 Object[] nameArray = { this.name };
65 if (this.desc != null) Engine.gui.println(Messages.getString("COMMAND_HELP_START") + this.desc); //$NON-NLS-1$
66 if (this.arguments == 0) {
67 Engine.gui.println(MessageFormat.format(Messages.getString("COMMAND_ERROR_ARGS"), nameArray)); //$NON-NLS-1$ //$NON-NLS-2$
68 }
69 }
70
71 /**
72 * Zugriff auf die Eigenschaft gameAction. Wird von dem Engine aufgerufen um festzustellen ob
73 * nach dem Ausführen NPC Aktionen durchgeführt werden sollen oder nicht.
74 *
75 * @return true if it is a gameAction, false otherwise
76 */
77 public boolean isGameAction() {
78 return this.gameAction;
79 }
80
81 /**
82 * Gibt den Namen des Objektes (im sprachlichen Sinne) des Befehls zurück
83 *
84 * @return ein GameObject Name
85 */
86 public String getObjectName() {
87 return this.objectName;
88 }
89
90 /**
91 * Ist der Behl in der Applet Sandbox ausführbar?
92 *
93 * @return true wenns so ist, false otherwise
94 */
95 public boolean isAppletSave() {
96 return this.isAppletSave;
97 }
98
99 /**
00 * Gibt den Name, also den eigentlichen Befehl des Commands zurück
01 *
02 * @return der Name des Befehls
03 */
04 public String getName() {
05 return this.name;
06 }
07
08}
09