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