btmux/autom4te.cache/
btmux/doc/.svn/
btmux/event/.svn/
btmux/game/.svn/
btmux/game/bin/.svn/
btmux/game/data/.svn/
btmux/game/logs/.svn/
btmux/game/maps/
btmux/game/maps/.svn/
btmux/game/maps/.svn/prop-base/
btmux/game/maps/.svn/props/
btmux/game/maps/.svn/text-base/
btmux/game/maps/.svn/wcprops/
btmux/game/mechs/
btmux/game/mechs/.svn/
btmux/game/mechs/.svn/prop-base/
btmux/game/mechs/.svn/props/
btmux/game/mechs/.svn/text-base/
btmux/game/mechs/.svn/wcprops/
btmux/game/text/.svn/
btmux/include/.svn/
btmux/misc/
btmux/misc/.svn/
btmux/misc/.svn/prop-base/
btmux/misc/.svn/props/
btmux/misc/.svn/text-base/
btmux/misc/.svn/wcprops/
btmux/python/
btmux/python/.svn/
btmux/python/.svn/prop-base/
btmux/python/.svn/props/
btmux/python/.svn/text-base/
btmux/python/.svn/wcprops/
btmux/src/.svn/prop-base/
btmux/src/.svn/props/
btmux/src/.svn/text-base/
btmux/src/.svn/wcprops/
btmux/src/hcode/.svn/
btmux/src/hcode/btech/
btmux/src/hcode/btech/.svn/
btmux/src/hcode/btech/.svn/prop-base/
btmux/src/hcode/btech/.svn/props/
btmux/src/hcode/btech/.svn/text-base/
btmux/src/hcode/btech/.svn/wcprops/
btmux/src/hcode/include/.svn/
/*
 * $Id: glue.h,v 1.4 2005/08/08 09:43:10 murrayma Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1996 Markus Stenberg
 *  Copyright (c) 1999-2005 Kevin Stevens
 *       All rights reserved
 *
 * Created: Thu Sep 19 22:02:48 1996 fingon
 * Last modified: Thu Dec 10 21:45:10 1998 fingon
 *
 */

/*
  Header for special command rooms...
  Based on the original by MUSE folks
*/

#include "config.h"

/* Parameter to the save/load function */
#ifndef _GLUE_H
#define _GLUE_H

#define VERIFY 0
#define SAVE 1
#define LOAD 2

#define XCODE_VERSION 2

#define SPECIAL_FREE 0
#define SPECIAL_ALLOC 1

#define GFLAG_ALL 0
#define GFLAG_MECH 1
#define GFLAG_GROUNDVEH 2
#define GFLAG_AERO 4
#define GFLAG_DS 8
#define GFLAG_VTOL 16
#define GFLAG_NAVAL 32
#define GFLAG_BSUIT 64
#define GFLAG_MW 128

#include "glue_types.h"

#define Have_MechPower(a,b) (((Powers2((Owner(a))) & (b)) || Wizard(Owner(a))) && Inherits((a)))

typedef struct CommandsStruct {
    int flag;
    char *name;
    char *helpmsg;
    void (*func) ();
} CommandsStruct;

typedef struct SpecialObjectStruct {
    char *type;			/* Type of the object */
    CommandsStruct *commands;	/* Commands array */
    long datasize;		/* Size of private buffer */
    void (*allocfreefunc) ();
    int updateTime;		/* Amount of time between updates */
    /* (secs) */
    void (*updatefunc) ();	/* called for every */
    /* object at every */
    /* update */
    int power_needed;		/* WHat power is needed to do */
    /* restricted commands */
} SpecialObjectStruct;

#ifdef _GLUE_C

#include "p.mech.move.h"
#include "p.debug.h"
#include "turret.h"
#include "p.aero.move.h"
#include "p.mech.maps.h"
#include "p.ds.bay.h"
#include "p.mech.notify.h"
#include "p.mech.utils.h"
#include "p.mech.combat.h"
#include "p.mech.update.h"
#include "p.mechrep.h"
#include "p.mech.restrict.h"
#include "p.mech.advanced.h"
#include "p.mech.tic.h"
#include "p.ds.turret.h"
#include "p.mech.contacts.h"
#include "p.mech.status.h"
#include "p.mech.scan.h"
#include "p.mech.sensor.h"
#include "p.map.h"
#include "p.mech.pickup.h"
#include "p.eject.h"
#include "p.mech.c3.h"
#include "p.bsuit.h"
#include "p.mech.startup.h"
#include "p.mech.consistency.h"
#include "p.mech.physical.h"
#include "mech.tech.h"
#include "p.mech.tech.repairs.h"
#include "p.glue.scode.h"
#include "mechrep.h"
#include "p.mine.h"
#include "mech.custom.h"
#include "p.mech.custom.h"
#include "scen.h"
#include "p.btechstats.h"
#include "autopilot.h"
#include "p.events.h"
#include "p.mech.tag.h"
#include "p.mech.c3i.h"
#include "p.mech.fire.h"
#include "p.mech.enhanced.criticals.h"
#include "p.mech.spot.h"
#include "p.mech.ammodump.h"
#include "p.mech.damage.h"

void newturret(dbref, void **, int);
void newfreemech(dbref, void **, int);

ECMD(f_mapblock_set);
ECMD(f_mapblock_setxy);
ECMD(ListForms);
ECMD(initiate_ood);
ECMD(mech_Raddstuff);
ECMD(mech_Rfixstuff);
ECMD(mech_Rremovestuff);
ECMD(mech_Rresetstuff);
ECMD(mech_bomb);
ECMD(mech_loadcargo);
ECMD(mech_losemit);
ECMD(mech_manifest);
ECMD(mech_stores);
ECMD(mech_domystuff);
ECMD(mech_unloadcargo);
ECMD(tech_magic);
ECMD(mech_inferno);
ECMD(mech_swarm);
ECMD(mech_swarm1);
ECMD(mech_dig);
ECMD(mech_vector);

ECMD(f_map_loadmap);

ECMD(f_draw);
ECMD(f_sheath);
ECMD(f_hold);
ECMD(f_put);

ECMD(f_shout);
ECMD(f_emote);
ECMD(f_say);
ECMD(f_whisper);

/* Flag: 0 = all, 1=mech, 2=groundveh, 4=aero, 8=ds, 16=vtol */

/* Categories:
   - Movement
   - Radio
   - Weapons
   - Physical
   - Status
   - Navigation
   - Repairing
   - Special
   - Information
   - TICs
   */


#define SHEADER(a,b) \
{ a, b, b, NULL }
#define HEADER(a) SHEADER(0,a)

#ifdef BT_ENABLED

CommandsStruct mechcommands[] = {
    /* Movement */
    HEADER("Movement"),

    {0, "HEADING [num]",
	    "Shows/Changes your heading to <NUM> (<NUM> in degrees)",
	mech_heading},
    {0, "SPEED [num | walk | run | stop | back | flank | cruise]",
	    "Without arguments shows your present speed, otherwise changes your speed to <NUM> or the specified speed (run/cruise = 1x maxspeed, walk/flank = 2/3x maxspeed, stop = 0, back = -2/3x maxspeed)",
	mech_speed},
    {48, "VERTICAL [num]", "Shows/Changes your vertical speed to <NUM>.",
	mech_vertical},

    {12, "CLIMB [angle]", "Shows/Changes the climbing angle to <NUM>.",
	aero_climb},
    {12, "DIVE [angle]", "Shows/Changes the diving angle to <NUM>.",
	aero_dive},
    {12, "THRUST [num]", "Shows/Changes the thrust to <NUM>.",
	aero_thrust},
    {1, "LATERAL [fl|fr|rl|rr|-]",
	    "Change your lateral movement mode (quad only). fl/fr/rl/rr = Directions, - = Disable lateral movement.",
	mech_lateral},
    {129, "STAND", "Stand up after a fall or dropping prone.", mech_stand},
    {1, "PRONE", "Force your 'mech to drop prone where it is.", mech_drop},
    {1, "THRASH", "Thrash around and try to kill nearby battle suits.",
	mech_thrash},
    {65, "JUMP [<TARGET-ID> | <BEARING> <RANGE>]",
	    "Jump on default target / given target / bearing + range.",
	mech_jump},
    {1, "HULLDOWN [- | STOP]",
	    "ALlows a QUAD to go hull down behind a hill to gain better protection.",
	mech_hulldown},
    {0, "ENTERBASE [N|W|S|E]",
	    "Enters base/hangar/whatnever from selected dir.",
	mech_enterbase},

    {0, "ENTERBAY [REF]",
	    "Enters bay of a moving(?) hangar (DropShip for example). Ref is target ref, and it is optional.",
	mech_enterbay},
    {1, "BOOTLEGGER [R|L]",
	    "Performs a bootlegger turn. This will turn you instantly 90 degrees in the desired direction, but requires a pilot roll. Roll BTH is based on tonnage and speed. Legs must not be recycling.",
	mech_bootlegger},
#ifdef BT_MOVEMENT_MODES
    {195, "SPRINT",
	    "Toggles sprinting mode. While sprinting you are easier to hit, cannot attack, but can move 2xWalkSpeed.",
	mech_sprint},
    {195, "EVADE",
	    "Toggles evasion mode. While evading you are harder to hit, but cannot attack.",
	mech_evade},
    {1, "DODGE",
	    "Toggles dodge mode on. You must have Dodge_Maneuver advantage. While dodging you can counter physical attack rolls. One per turn.",
	mech_dodge},
#endif
    /* Radio */
    HEADER("Radio"),
    {0, "LISTCHANNELS", "Lists set frequencies + comtitles for them.",
	mech_list_freqs},
    {0, "SENDCHANNEL <LETTER> = <STRING>",
	"Sends <string> on channel <letter>'s freq.", mech_sendchannel},
    {0, "RADIO <ID> = <STRING>",
	"Radioes (LOS) <ID> with <STRING>", mech_radio},
    {0, "SETCHANNELFREQ <LETTER> = <NUMBER>",
	    "Sets channel <letter> to frequency <number>.",
	mech_set_channelfreq},
    {0, "SETCHANNELMODE <LETTER> = <STRING>",
	    "Sets channel <letter> mode <string> (available letters: DIUES, color codes).",
	mech_set_channelmode},
    {0, "SETCHANNELTITLE <LETTER> = <STRING>",
	    "Sets channel <letter> comtitle to <string>.",
	mech_set_channeltitle},

    /* Weapons */
    HEADER("Weapons"),
    {0, "LOCK [<TARGET-ID> | <X> <Y> | <X> <Y> <B|H|I|C> | -]",
	    "Sets the target to the (3rd argument :  B = building, C = clear, I = ignite, H = hex (clear/ignite/break ice/destroy bridge)) /, - = Clears present lock.",
	mech_settarget},
    {0, "SIGHT <WEAPNUM> [<TARGET-ID> | <X> <Y>]",
	"Computes base-to-hit for given weapon and target.", mech_sight},
    {0, "FIRE <WEAPNUM> [<TARGET-ID> | <X> <Y>]",
	    "Fires weapon <weapnum> at def. target or specified target.",
	mech_fireweapon},
    {0, "TARGET <SECTION | ->",
	    "Sets your aimed shot target / Disables targetting.",
	mech_target},
    {0, "TAG [ID|-]",
	    "Lights an enemy unit with your TAG / Disables current TAG.",
	mech_tag},
    /* Weapon mode funcs */

    {0, "AMS <weapnum>", "Toggles Anti-Missile System on and off.",
	mech_ams},
    {0, "AP <weapnum>",
	    "Sets/Unsets the autocannon to fire armor piercing rounds.",
	mech_armorpiercing},
    {0, "ARTEMIS <weapnum>", "Sets Weapon to and from ARTEMIS Mode.",
	mech_artemis},
    {0, "EXPLOSIVE <weapnum>", "Toggles between explosive/normal rounds",
	mech_explosive},
    {0, "FIRECLUSTER <weapnum>",
	    "Sets/unsets artillery weapon to fire cluster rounds.",
	mech_cluster},
    {0, "FIREMINE <weapnum>",
	"Sets/unsets artillery weapon to fire mine rounds.", mech_mine},
    {0, "FIRESMOKE <weapnum>",
	    "Sets/unsets artillery weapon to fire smoke rounds.",
	mech_smoke},
    {0, "FIRESWARM <weapnum>",
	    "Sets/Unsets the LRM launcher to shoot swarm missiles",
	mech_swarm},
    {0, "FIRESWARM1 <weapnum>",
	    "Sets/Unsets the LRM launcher to shoot swarm missiles",
	mech_swarm1},
    {0, "FLECHETTE <weapnum>",
	    "Sets/Unsets the autocannon to fire flechette rounds.",
	mech_flechette},
    {0, "GATTLING <weapnum>",
	    "Sets weapon to and from Gattling Mode (machineguns only).",
	mech_gattling},
    {0, "HEAT <weapnum>", "Sets a flamer to and from heat mode`.",
	mech_flamerheat},
    {0, "HOTLOAD <weapnum>",
	    "Sets/Unsets the LRM launcher to hotload missiles, removing short-range penalties, but adding to chance of jamming.",
	mech_hotload},

    {0, "INARC <weapnum> <-|X|Y|E>",
	    "Sets the type of ammo to fire from your iNarc weapon. '-': standard Homing, 'X': Explosive, 'Y': Haywire, 'E': ECM",
	mech_inarc_ammo_toggle},
    {0, "INCENDIARY <weapnum>",
	    "Sets/Unsets the autocannon to fire incendiary rounds.",
	mech_incendiary},
    {0, "INFERNO <weapnum>",
	    "Sets/Unsets the SRM launcher to shoot inferno missiles",
	mech_inferno},
    {0, "LBX <weapnum>", "Sets weapon to and from LBX Mode.", mech_lbx},
    {0, "NARC <weapnum>", "Sets weapon to and from NARC Mode.", mech_narc},
    {0, "STINGER <weaponum", "Sets weapon to and from Stinger Mode.", 
        mech_stinger},
    {0, "PRECISION <weapnum>",
	    "Sets/Unsets the autocannon to fire precision rounds.",
	mech_precision},
    {0, "RAC <weapnum> <-/2/4/6>",
	    "Sets the Rotary AutoCannon to fire either 1, 2, 4 or 6 shots at a time.",
	mech_rac},
    {0, "RAPIDFIRE <weapnum>",
	    "Sets weapon to and from Rapid Fire Mode (std and light ACs only).",
	mech_rapidfire},
    {0, "ULTRA <weapnum>", "Sets weapon to and from Ultra Mode.",
	mech_ultra},
    {0, "DISABLE <weapnum>", "Disables the weapon (Gauss only).",
	mech_disableweap},
    {0, "UNJAM <weapnum>", "Fixes ammo loader jams.",
	mech_unjamammo},
    {0, "USEBIN <weapnum> <location>",
	    "Draw ammo from <location> first for <weapnum>.",
	mech_usebin},

    /* TIC Support */
    {0, "ADDTIC  <NUM> <WEAPNUM | LOWNUM-HIGHNUM>",
	    "Adds weapon <weapnum>, or weapons from <lownum> to <highnum> to TIC <num>.",
	mech_addtic},
    {0, "CLEARTIC <NUM>", "Clears the TIC <num>.", mech_cleartic},

    {0, "DELTIC <NUM> <WEAPNUM>",
	    "Deletes weapon number <weapnum> from TIC <num>.",
	mech_deltic},

    {0, "FIRETIC <NUM> [<TARGET> or <X Y>]",
	    "Fires the weapons in TIC <num>.",
	mech_firetic},
    {0, "LISTTIC <NUM>", "Lists weapons in the TIC <num>.", mech_listtic},

    /* Information */
    HEADER("Information"),

    {0, "BRIEF [<LTR> <VAL>]",
	    "Shows brief status / Sets brief for <ltr> to <val>.",
	mech_brief},
    {0, "CONTACTS [<Prefix> | <TARGET-ID>]", "List all current contacts",
	mech_contacts},

    {0, "CRITSTATUS <SECTION>", "Shows the Critical hits status",
	mech_critstatus},
    {0, "REPORT [<TARGET-ID> | <X Y>]",
	"Information on default target, num, or x,y", mech_report},
    {0, "SCAN [<TARGET-ID> | <X Y> | <X Y> <B|H>]",
	    "Scans the default target, chosen target, or hex",
	mech_scan},

    {0, "SENSOR [LONG | [<V|L|I|E|S> <V|L|I|E|S>]]",
	    "Shows/Changes your sensor mode (1 argument: Long, otherwise Short description about sensor mode)",
	mech_sensor},

    {0, "STATUS [A(rmor) | I(nfo)] | W(eapons)]",
	    "Prints the mech's status",
	mech_status},
    {0, "VIEW [<TARGET-ID>]", "View the war painting on the target",
	mech_view},
    {0, "WEAPONSPECS", "Shows the specifications for your weapons",
	mech_weaponspecs},
    {0, "WEAPONSTATUS", "Shows the status of all your weapons",
	mech_weaponstatus},

    /* Navigation */
    HEADER("Navigation"),
    {0, "BEARING [<X Y>] [<X Y>]", "Same format as range.", mech_bearing},

    {0, "ETA [<X> <Y>]", "Estimates time to target (/default target)",
	mech_eta},
    {0, "FINDCENTER", "Shows distance/bearing to center of hex.",
	mech_findcenter},
    {0, "NAVIGATE", "Shows the hex and surroundings graphically",
	mech_navigate},
    {0, "RANGE [<X Y>] [<X Y>]",
	    "Range to def. target / range to x y / range to x,y from x,y",
	mech_range},
    {0,
	    "LRS <M|T|E|L|S|H|C> [<BEARING> <RANGE> | <TARGET-ID>]",
	"Shows the (Mech/Terrain/Elevation/LOS/Sensors/Height/Combined) long range map", mech_lrsmap},
    {0, "TACTICAL [C | T | L] [<BEARING> <RANGE> | <TARGET-ID>]",
	    "Shows the tactical map at the mech's location / at bearing and range / around chosen target",
	mech_tacmap},
    {0, "VECTOR [<X Y> <X Y>]", "Same format as range.",mech_vector},

    /* Special */
    HEADER("Special"),

    {12, "CHECKLZ", "Checks if the landing-zone is good for a landing",
	aero_checklz},
    {0, "@OOD <X> <Y> [Z]",
	    "@Initiates OOD drop at the orbit altitude to <X> <Y> (optional Z altitude to start from)",
	initiate_ood},
    {0, "@LOSEMIT <MESSAGE>",
	    "@Sends message to everyone seeing the 'mech right now",
	mech_losemit},
    {0, "@DAMAGE <NUM> <CLUSTERSIZE> <ISREAR> <ISCRITICAL>",
	    "@Causes <NUM> pt of damage to be done to 'mech in <CLUSTERSIZE> point clusters (if <ISREAR> is 1, damage is done to rear arc ; if <ISCRITICAL> is 1, damage does crit-thru-armor)",
	mech_damage},
    {0, "@WEIGHT", "@Checks the weight allocated in the mech",
	mech_weight},
    {4, "BOMB [list | drop <num> | aim]",
	    "Lists bombs / drops bomb <num> / aims where a bomb would fall.",
	mech_bomb},
    {2, "DIG", "Starts burrowing for cover [non-hovers only].", mech_dig},

    {2, "FIXTURRET",
	    "Starts to fix a turret. Only works on jammed turrets, not locked turrets.",
	mech_fixturret},

    {0, "EXPLODE <AMMO|REACTOR|STOP>",
	    "<AMMO|REACTOR> specifies which to ignite ; ammo causes all ammo on your mech to go *bang* (in no particular order), reactor disables control systems. Do note that neither are instant. STOP allows you to stop existing countdown.",
	mech_explode},
    {0, "SAFETY [ON|OFF]",
	    "Enable/Disable Safeties against killing MechWarriors.",
	mech_safety},
    {0, "MECHPREFS [SETTING [ON|OFF]]", "Toggle the mechpref setting of SETTING",
    	mech_mechprefs},
    {51, "TURNMODE [TIGHT | NORMAL]", "Sets turnmode.", mech_turnmode},

    /* Vengy's pickup/dropoff */
    {0, "DROPOFF", "Drops the mech you are carrying.", mech_dropoff},
    {0, "PICKUP [ID]", "Picks up [ID].", mech_pickup},
    {128, "ATTACHCABLES <ID1> <ID2>",
	    "Attaches tow cables so that [ID1] can tow [ID2].",
	    mech_attachcables},
    {128, "DETACHCABLES <ID>", "Detaches the tow cables from [ID].",
	    mech_detachcables},


    {0, "DUMP <WEAPNUM|LOCATION|ALL|STOP> [<CRIT>]",
	    "Dumps the ammunition for the weapon / in the location [ crit ] / all ammunition in the 'mech / stops all dumping in progress.",
	mech_dump},
    {1, "FLIPARMS",
	    "Flips the arms to and from the rear arcs, if possible.",
	mech_fliparms},

    {0, "ECM",
	    "Toggles the ECM status of your Guardian ECM suite (only applicable if you have one)",
	mech_ecm},
    {0, "ECCM",
	    "Toggles the ECCM status of your Guardian ECM suite (only applicable if you have one)",
	mech_eccm},
    {0, "ANGELECM",
	    "Toggles the ECM status of your Angel ECM suite (only applicable if you have one)",
	mech_angelecm},
    {0, "ANGELECCM",
	    "Toggles the ECCM status of your Angel ECM suite (only applicable if you have one)",
	mech_angeleccm},

    {0, "PERECM",
	    "Toggles the ECM status of your Personal ECM suite (only applicable if you have one)",
	mech_perecm},
    {0, "PERECCM",
	    "Toggles the ECCM status of your Personal ECM suite (only applicable if you have one)",
	mech_pereccm},

    {0, "STEALTH",
	    "Toggles status of Stealth Armor for those mechs equipped with it.",
	mech_stealtharmor},
    {0, "NSS",
	    "Toggles status of the Null Signature System for those mechs equipped with it.",
	mech_nullsig},
    /* Ejection */

    {0, "DISEMBARK", "Gets the hell out of the 'mech / vehicle.",
	mech_disembark},
    {0, "UDISEMBARK", "Get the unit out of it's carrier.", mech_udisembark},
    {0, "EMBARK", "Climb into a 'mech / vehicle", mech_embark},
    {1, "MASC", "Toggles MASC on and off", mech_masc},
    {0, "SCHARGE", "Toggles Supercharger on and off", mech_scharge},
    /* DS / VTOL */
    {-2, "LAND", "Terminate your jump or land a VTOL/Aero/DS", mech_land},
    {-35, "TAKEOFF", "VTOL/Aero take off command", aero_takeoff},
    {1, "ROTTORSO <L(eft) | R(ight) | C(enter)>",
	"Rotates the torso 60 degrees right or left.", mech_rotatetorso},
    /* Nim's IDF things */
    {0, "SLITE", "Turns your searchlight on/off", mech_slite},

    {0, "SPOT [ID|-|OWNID]",
	    "Sets someone as your spotter / makes you stop spotting / sets you as a spotter.",
	mech_spot},
    {0, "STARTUP [OVERRIDE]", "Commences startup cycle.", mech_startup},
    {0, "SHUTDOWN", "Shuts down the mech.", mech_shutdown},
    {34, "TURRET", "Set the turret facing.", mech_turret},
    {34, "AUTOTURRET",
	    "Forces your turret to stay facing the locked target.",
	mech_auto_turret},
    {18, "EXTINGUISH",
	    "Puts out the fires on your vehicle. You must be shut down to do this.",
	vehicle_extinquish_fire},

#ifdef C3_SUPPORT
    /* C3 */

    {0, "C3 [ID|-]",
	    "Joins/Leaves a C3 network which the target mech is in. You will be assigned to a master computer within the network.",
	mech_c3_join_leave},
    {0, "C3MESSAGE <MSG>",
	    "Sends a message to all others in your C3 network",
	mech_c3_message},
    {0, "C3TARGETS", "Shows available C3 targeting information",
	mech_c3_targets},
    {0, "C3NETWORK", "Displays information about your C3 network",
	mech_c3_network},

    {0, "C3I [ID|-]",
	    "Joins/Leaves the C3i network connected to the target",
	mech_c3i_join_leave},
    {0, "C3IMESSAGE <MSG>",
	    "Sends a message to all others in your C3i network",
	mech_c3i_message},
    {0, "C3ITARGETS", "Shows available C3i targeting information",
	mech_c3i_targets},
    {0, "C3INETWORK", "Displays information about your C3i network",
	mech_c3i_network},
#endif

/* Heat stuff */

    {0, "HEATCUTOFF",
	    "Sets your heat dissipation so that you wont go under 9 heat for TSM",
	heat_cutoff},
    {0, "PODS",
	    "Shows the location of NARC and iNARC pods that attached to you",
	show_narc_pods},
    {1, "REMOVEPOD <LOCATION> <TYPE>",
	    "Remove one of the pods from the selected location. Possible types are: 'H' - Homing, 'Y' - Haywire, 'E' - ECM",
	remove_inarc_pods_mech},
    {18, "REMOVEPODS",
	    "Removes all iNARC pods from the unit.",
	remove_inarc_pods_tank},

    /* Physical */
    SHEADER(1, "Physical"),
    {1, "AXE [R | L | B] [<TARGET-ID>]", "Axes a target", mech_axe},

    {3, "CHARGE [<TARGET-ID> | - ]",
	"Charges a target. '-' removes charge command.", mech_charge},
    {1, "CHOP [R | L | B] [<TARGET-ID>]", "Chops target with a sword",
	mech_sword},
    {1, "CLUB [<TARGET-ID>]", "Clubs a target with a tree", mech_club},
    {1, "KICK [R | L] [<TARGET-ID>]", "Kicks a target", mech_kick},
    {1, "PUNCH [R | L | B] [<TARGET-ID>]", "Punches a target", mech_punch},
    {1, "GRABCLUB [R | L | -]",
	"Grabs a tree and carries it around as a club", mech_grabclub},

    {64, "ATTACKLEG [<TARGET-ID>]",
	"Attacks legs of the target battlemech", bsuit_attackleg},
    {0, "HIDE",
	    "Attempts to hide your team ; doesn't work if any hostiles have their eyeballs on you",
	bsuit_hide},
    {64, "SWARM [<TARGET-ID> | -]",
	"Swarms the target / drop off target (-)", bsuit_swarm},
    {64, "JETTISON",
	"Jettison your backpack", JettisonPacks},

    /* Repairing */
    HEADER("Repair"),
    {0, "CHECKSTATUS", "Checks mech's techstatus", tech_checkstatus},
    {0, "DAMAGES", "Shows the mech's damages",
	show_mechs_damage},
    {0, "FIX [<NUM> | <LOW-HI>]", "Fixes entry <NUM> from mech's damages",
	tech_fix},
    {0, "FIXARMOR <LOC>", "Repairs armor in <loc>", tech_fixarmor},
    {0, "FIXINTERNAL <LOC>", "Repairs internals in <loc>",
	tech_fixinternal},
    {0, "REATTACH <LOC>", "Reattaches the limb",
	tech_reattach},
    {64, "REPLACESUIT <SUIT>", "Replaces the missing suit",
	tech_replacesuit},
    {0, "RESEAL <LOC>", "Reseals the limb",
	tech_reseal},

    {0, "RELOAD <LOC> <POS> [TYPE]",
	    "Reloads the ammo compartment in <loc>/<pos> (optionally with [type])",
	tech_reload},
    {0, "TOGGLETYPE <loc> <pos> <type>",
	    "Set the type of ammo in ammobin <loc>/<pos> to type <type>",
	tech_toggletype},
    {0, "REMOVEGUN <NUM>", "Removes the gun", tech_removegun},
    {0, "REMOVEPART <LOC> <POS>", "Removes the part", tech_removepart},
    {0, "REMOVESECTION <LOC>", "Removes the section", tech_removesection},


    {0, "REPLACEGUN [<NUM> | <LOC> <POS>] [ITEM]",
	    "Replaces the gun in the position (optionally with [ITEM], like Martell.MediumLaser)",
	tech_replacegun},

    {0, "REPAIRGUN [<NUM> | <LOC> <POS>]",
	    "Repairs the gun in the position",
	tech_repairgun},
    {0, "REPLACEPART <LOC> <POS>", "Replaces the part in the position",
	tech_replacepart},
    {0, "REPAIRPART <LOC> <POS>", "Repairs the part in the position",
	tech_repairpart},
    {0, "REPAIRS", "Shows repairs/scrapping in progress", tech_repairs},
    {0, "UNLOAD <LOC> <POS>",
	    "Unloads the ammo compartment in <loc>/<pos>",
	tech_unload},

    {0, "@MAGIC", "@Fixes the unfixable - skirt crits etc (wiz-only)",
	tech_magic},

    /* Cargo */
    HEADER("Cargo"),

    {0, "LOADCARGO <NAME> <COUNT>",
	    "Loads up <COUNT> <NAME>s from the bay.",
	mech_loadcargo},
    {0, "MANIFEST", "Lists stuff carried by mech.", mech_manifest},
    {0, "STORES", "Lists stuff in the bay.", mech_stores},
    {0, "UNLOADCARGO <NAME> <COUNT>",
	    "Unloads <COUNT> <NAME>s to the bay.",
	mech_unloadcargo},

    /* Restricted commands */
    HEADER("@Restricted"),
    {0, "@CREATEBAYS [.. list of DBrefs, seperated by space]",
	"@Creates / Disables bays on a DS", mech_createbays},
    {0, "@SETMECH <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@SETXCODE <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@VIEWXCODE", "@Views xcode values on object", list_xcodestuff},

    {0, "SNIPE <ID> <WEAPON>",
	    "@Lets you 'snipe' (=shoot artillery weapons with movement prediction)",
	mech_snipe},
    {0, "ADDSTUFF <NAME> <COUNT>",
	    "@Adds <COUNT> <NAME> to mech's inventory",
	mech_Raddstuff},

    {0, "FIXSTUFF", "@Fixes consistency errors in econ data",
	mech_Rfixstuff},
    {0, "CLEARSTUFF", "@Removes all stuff from 'mech", mech_Rresetstuff},

    {0, "REMOVESTUFF <NAME> <COUNT>",
	    "@Removes <COUNT> <NAME> from mech's inventory",
	mech_Rremovestuff},
    {0, "SETMAPINDX <NUM>", "@Sets the mech's map index to num.",
	mech_Rsetmapindex},
    {0, "SETTEAM <NUM>", "@Sets the teams.", mech_Rsetteam},
    {0, "SETXY <X> <Y>", "@Sets the x & y value of the mech.",
	mech_Rsetxy},
    {0, NULL, NULL, NULL}
};

ECMD(map_addice);
ECMD(map_delice);
ECMD(map_setconditions);

CommandsStruct mapcommands[] = {
    {0, "@VIEWXCODE", "@Views xcode values on object", list_xcodestuff},
    {0, "@SETXCODE <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@SETMAP <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},

    {0, "ADDICE <NUMBER>",
	    "@Adds ice (<NUMBER> percent chance for each watery hex connected to land/ice)",
	map_addice},
    {0, "DELICE <NUMBER>",
	"@Deletes first-melting ices at <NUMBER> chance", map_delice},
    {0, "PATHFIND <X1> <Y1> <X2> <Y2> [OPTFACT]",
	    "@Finds shortest path from x1,y1 to x2,y2 using A* approx algorithm (using optfact optimization factor, 0-100, smaller = slower, more accurate)",
	map_pathfind},
    {0, "SETCOND <GRAV> <TEMP> [CLOUDBASE [VACUUM]]",
	    "@Sets the map attributes (gravity: in 1/100'ths of Earth gravity, temperature: in Celsius, vacuum: optional, number (0 or 1)",
	map_setconditions},
    {0, "VIEW <X> <Y>", "@Shows the map centered at X,Y", map_view},

    {0, "ADDBLOCK <X> <Y> <DIST> [TEAM#_TO_ALLOW]",
	    "@Adds no-landings zone of DIST hexes to X Y",
	map_add_block},
    {0, "ADDMINE <X> <Y> <TYPE> <STRENGTH> [OPT]", "@Adds mine to X,Y",
	map_add_mine},
    {0, "ADDHEX <X> <Y> <TERRAIN> <ELEV>",
	    "@Changes the terrain and elevation of the given hex",
	map_addhex},
    {0, "SETLINKED", "@Sets the map linked", map_setlinked},
    {0, "@MAPEMIT <MESSAGE>", "@Emits stuff to the map", map_mapemit},
    {0, "FIXMAP", "@Fixes inconsistencies in map", debug_fixmap},
    {0, "LOADMAP <NAME>", "@Loads the named map", map_loadmap},
    {0, "SAVEMAP <NAME>", "@Saves the map as name", map_savemap},
    {0, "SETMAPSIZE <X> <Y>", "@Sets x and y size of map", map_setmapsize},

    {0, "LIST [MECHS | OBJS]", "@Lists mechs/objects on the map",
	map_listmechs},
    {0, "CLEARMECHS [DBNUM]", "@Clears mechs from the map",
	map_clearmechs},
    {0, "ADDFIRE [X] [Y] [DURATION]",
	"@Adds fire that lasts <duration> secs", map_addfire},
    {0, "ADDSMOKE [X] [Y] [DURATION]",
	"@Adds smoke that lasts <duration> secs", map_addsmoke},
    {0, "DELOBJ [[TYPE] | [X] [Y] | [TYPE] [X] [Y]]",
	"@Deletes objects of either type or at x/y", map_delobj},
    {0, "UPDATELINKS",
	    "@Updates CodeLinks from the database objs (recursive)",
	map_updatelinks},

    /* Cargo things */
    {0, "STORES", "Lists stuff in the hangar.", mech_manifest},
    {0, "ADDSTUFF <NAME> <COUNT>", "@Adds <COUNT> <NAME> to map",
	mech_Raddstuff},

    {0, "FIXSTUFF", "@Fixes consistency errors in econ data",
	mech_Rfixstuff},
    {0, "REMOVESTUFF <NAME> <COUNT>", "@Removes <COUNT> <NAME> from map",
	mech_Rremovestuff},
    {0, "CLEARSTUFF", "@Removes all stuff from map", mech_Rresetstuff},
    {0, NULL, NULL, NULL}
};


CommandsStruct mechrepcommands[] = {
    {0, "SETTARGET <NUM>", "@Sets the mech to be repaired/built to num",
	mechrep_Rsettarget},

    {0, "LOADNEW <TYPENAME>", "@Loads a new mech template.",
	mechrep_Rloadnew},
    {0, "RESTORE", "@Completely repairs and reloads mech. ",
	mechrep_Rrestore},

/* {0,"SAVENEW <TYPENAME>","@Saves the mech as a template.", mechrep_Rsavetemp}, */
    {0, "SAVENEW <TYPENAME>", "@Saves the mech as a new-type template.",
	mechrep_Rsavetemp2},
    {0, "SETARMOR <LOC> <AVAL> <IVAL> <RVAL>",
	    "@Sets the armor, int. armor, and rear armor.",
	mechrep_Rsetarmor},
    {0, "ADDWEAP <NAME> <LOC> <CRIT SECS> [R|T|O]",
	    "@Adds weapon to the mech, using given loc, crits, and flags.",
	mechrep_Raddweap},

    {0, "RESETCRITS", "@Resets criticals of the toy to base of type.",
	mechrep_Rresetcrits},
    {0, "REPAIR <LOC> <TYPE> <[VAL | SUBSECT]>", "@Repairs the mech.",
	mechrep_Rrepair},
    {0, "RELOAD <NAME> <LOC> <SUBSECT> [L|A|N(|C|M|S)]",
	    "@Reloads weapon in location and critical subsection.",
	mechrep_Rreload},
    {0, "ADDSP <ITEM> <LOC> <SUBSECT> [<DATA>]",
	    "@Adds a special item in location & critical subsection.",
	mechrep_Raddspecial},
    {0, "DISPLAY <LOC>", "@Displays all the items in the location.",
	mechrep_Rdisplaysection},
    {0, "SHOWTECH", "@Shows the advanced technology of the mech.",
	mechrep_Rshowtech},
    {0, "ADDTECH <TYPE>",
	"@Adds the advanced technology to the mech.", mechrep_Raddtech},
    {0, "DELTECH <ALL or [<TECH>]>",
	    "@Deletes all or one advanced technologies on the mech.",
	mechrep_Rdeltech},
    {0, "ADDINFTECH <TYPE>",
	    "@Adds the advanced infantry technology to the mech.",
	mechrep_Raddinftech},
    {0, "DELINFTECH",
	    "@Deletes the advanced infantry technology of the mech.",
	mechrep_Rdelinftech},
    {0, "SETTONS <NUM>", "@Sets the mech tonnage", mechrep_Rsettons},
    {0, "SETTYPE <MECH | GROUND | VTOL | NAVAL | AERO | DS | SPHEROIDDS | BSUIT >",
	"@Sets the mech type", mechrep_Rsettype},
    {0, "SETMOVE <TRACK | WHEEL | HOVER | VTOL | HULL | FOIL | FLY>",
	"@Sets the mech movement type", mechrep_Rsetmove},
    {0, "SETMAXSPEED <NUM>", "@Sets the max speed of the mech.",
	mechrep_Rsetspeed},
    {0, "SETHEATSINKS <NUM>", "@Sets the number of heat sinks.",
	mechrep_Rsetheatsinks},
    {0, "SETJUMPSPEED <NUM>", "@Sets the jump speed of the mech.",
	mechrep_Rsetjumpspeed},
    {0, "SETLRSRANGE <NUM>", "@Sets the lrs range of the mech.",
	mechrep_Rsetlrsrange},
    {0, "SETTACRANGE <NUM>", "@Sets the tactical range of the mech.",
	mechrep_Rsettacrange},
    {0, "SETSCANRANGE <NUM>", "@Sets the scan range of the mech.",
	mechrep_Rsetscanrange},
    {0, "SETRADIORANGE <NUM>", "@Sets the radio range of the mech.",
	mechrep_Rsetradiorange},
    {0, "SETCARGOSPACE <VAL> <MAXTON>",
	"Sets cargospace and max cargo tonnage", mechrep_setcargospace},
    {0, NULL, NULL, NULL}
};

#ifdef MENU_CUSTOMIZE
#include "coolmenu_interface.h"
ECOMMANDSET(cu);
#endif

CommandsStruct customcommands[] = {
#ifdef MENU_CUSTOMIZE
    GCOMMANDSET(cu) {0, "@SETXCODE <NAME> <VALUE|DATA>",
	    "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@VIEWXCODE", "@Views xcode values on object", list_xcodestuff},

    {0, "@WEIGHT", "@Checks the weight allocated in the new mech",
	custom_weight1},
    {0, "@WEIGHTO", "@Checks the weight allocated in the old mech",
	custom_weight2},
    {0, "EDIT <ref>", "Alters <ref>", custom_edit},
    {0, "FINISH", "Quit editing mode", custom_finish},
    {0, "Z", "Back", custom_back},
    {0, "L", "Shows menu", custom_look},
    {0, "LO", "Shows menu", custom_look},
    {0, "LOO", "Shows menu", custom_look},
    {0, "LOOK", "Shows menu", custom_look},
    {0, "HELP", "Shows help for customization", custom_help},

    {0, "CRITSTATUS <SECTION>", "Shows the Critical hits status",
	custom_critstatus},
    {0, "STATUS [A(rmor) | I(nfo)] | W(eapons)]",
	    "Prints the mech's status",
	custom_status},
    {0, "WEAPONSPECS", "Shows the specifications for your weapons",
	custom_weaponspecs},
    {0, NULL, NULL, NULL}
#endif
};

#ifdef MENU_CHARGEN
#include "coolmenu_interface.h"
ECOMMANDSET(cm);
#endif

CommandsStruct chargencommands[] = {
#ifdef MENU_CHARGEN
    GCOMMANDSET(cm) {0, "DONE", "Finishes your chargen (permanent)",
	chargen_done},
    {0, "BEGIN", "Starts chargen", chargen_begin},
    {0, "NEXT", "Goes to next stage of chargen", chargen_next},
    {0, "PREV", "Goes to previous stage of chargen", chargen_prev},

    {0, "APPLY",
	    "Applies the values to your character (fixes them, only reset/done can be done after)",
	chargen_apply},
    {0, "RESET", "Resets your stats and lets you begin again",
	chargen_reset},
    {0, "L", "Shows menu", chargen_look},
    {0, "LO", "Shows menu", chargen_look},
    {0, "LOO", "Shows menu", chargen_look},
    {0, "LOOK", "Shows menu", chargen_look},
    {0, "STATUS", "Shows menu", chargen_look},
    {0, "HELP", "Shows help for chargen", chargen_help},
#endif
    {0, NULL, NULL, NULL}
};

CommandsStruct autopilotcommands[] = {
    {0, "ENGAGE", "Engages the autopilot", auto_engage},
    {0, "DISENGAGE", "Disengages the autopilot", auto_disengage},

    {0, "ADDCOMMAND <NAME> [ARGS]", "Adds a command to queue",
	auto_addcommand},
    {0, "DELCOMMAND <NUM>", "Removes command <NUM> from queue (-1 = all)",
	auto_delcommand},
    {0, "LISTCOMMANDS", "Lists whole command queue of the autopilot",
	auto_listcommands},
    {0, "JUMP <NUM>", "Sets current instruction to <NUM>", auto_jump},
    {0, "EVENTSTATS", "Lists current events for this AI", auto_eventstats},
    {0, NULL, NULL, NULL}
};

CommandsStruct turretcommands[] = {
    {0, "@SETTURRET <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@SETXCODE <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@VIEWXCODE", "@Views xcode values on object", list_xcodestuff},
    {0, "DEINITIALIZE", "De-initializes you as gunner",
	turret_deinitialize},
    {0, "INITIALIZE", "Sets you as the gunner", turret_initialize},

    {0, "ADDTIC  <NUM> <WEAPNUM | LOWNUM-HIGHNUM>",
	"Adds weapnum, or lownum-highnum to given TIC", turret_addtic},
    {0, "BEARING [<X Y>] [<X Y>]", "Same format as range.",
	turret_bearing},
    {0, "CLEARTIC <NUM>", "Clears the TIC number given ", turret_cleartic},
    {0, "CONTACTS [<Prefix> | <TARGET-ID>]", "List all current contacts",
	turret_contacts},

    {0, "CRITSTATUS <SECTION>", "Shows the Critical hits status",
	turret_critstatus},
    {0, "DELTIC <NUM> <WEAPNUM>", "Deletes weapnum from given TIC",
	turret_deltic},
    {0, "ETA [<X> <Y>]", "Estimates time to target (/default target)",
	turret_eta},
    {0, "FINDCENTER", "Shows distance/bearing to center of hex.",
	turret_findcenter},
    {0, "FIRE <WEAPNUM> [<TARGET-ID> | <X> <Y>]",
	    "Fires Weap at loc at def. target or specified target.",
	turret_fireweapon},
    {0, "FIRETIC <NUM> [<TARGET> or <X Y>]", "Fires the given TIC",
	turret_firetic},
    {0, "LISTTIC <NUM>", "Lists weapons in the given TIC", turret_listtic},

    {0, "LOCK [<TARGET-ID> | <X> <Y> | <X> <Y> <B|H> | -]",
	    "Sets the target to the arg (in 3rd, B = building, H = hex (clear/ignite)) / Clears lock (-)",
	turret_settarget},
    {0,
	    "LRS <M(ech) | T(errain) | E(lev)> [<BEARING> <RANGE> | <TARGET-ID>]",
	"Shows the long range map", turret_lrsmap},
    {0, "NAVIGATE", "Shows the hex and surroundings graphically",
	turret_navigate},
    {0, "RANGE [<X Y>] [<X Y>]",
	    "Range to def. target / range to x y / range to x,y from x,y",
	turret_range},
    {0, "REPORT [<TARGET-ID> | <X Y>]",
	"Information on default target, num, or x,y", turret_report},
    {0, "SCAN [<TARGET-ID> | <X Y> | <X Y> <B|H>]",
	    "Scans the default target, chosen target, or hex",
	turret_scan},

    {0, "SIGHT <WEAPNUM> [<TARGET-ID> | <X> <Y>]",
	    "Computes base-to-hit for given weapon and target.",
	turret_sight},
    {0, "STATUS [A(rmor)|I(nfo)]|W(eapons)|S(hort)]",
	    "Prints the mech's status",
	turret_status},

    {0, "TACTICAL [<BEARING> <RANGE> | <TARGET-ID>]",
	    "Shows the tactical map at the mech's location / at bearing and range / around chosen target",
	turret_tacmap},
    {0, "WEAPONSPECS", "Shows the specifications for your weapons",
	turret_weaponspecs},
    {0, NULL, NULL, NULL}
};

CommandsStruct scencommands[] = {
    {0, "@SETXCODE <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@VIEWXCODE", "@Views xcode values on object", list_xcodestuff},
    {0, "ENGAGE", "Starts the scenario", scen_start},
    {0, "END", "Ends the scenario", scen_end},

    {0, "STATUS [SIDE]",
	"Reports status of the scenario [/for one side]", scen_status},
    {0, NULL, NULL, NULL}
};

#else

#define mechcommands sscommands
#define mapcommands sscommands
#define mechrepcommands sscommands
#define customcommands sscommands
#define chargencommands sscommands
#define autopilotcommands sscommands
#define turretcommands sscommands
#define scencommands sscommands
#define newfreemech NULL
#define newfreemechrep NULL
#define newfreemap NULL
#define auto_newautopilot NULL
#define newturret NULL
#define mech_update NULL
#define map_update NULL

#endif


ECMD(debug_makemechs);
ECMD(debug_memory);
ECMD(debug_setvrt);
ECMD(debug_setxplevel);

CommandsStruct debugcommands[] = {
    {0, "EVENTSTATS", "@Shows event statistics", debug_EventTypes},
    {0, "MEMSTATS [LONG]",
	    "@Shows memory statistics (optionally in long form)",
	debug_memory},
    {0, "SAVEDB", "@Saves the SpecialObject DB", debug_savedb},

#ifdef BT_ENABLED

    {0,
	    "MAKEMECHS <FACTION> <TONS> [<TYPES> [<OPT_TONNAGE> [<MAX_VARIATION>]]]",
	    "@Makes list of 'mechs of <faction> with max tonnage of <tons>, and optimum tonnage for each mech <opt_tonnage> (optional)",
	debug_makemechs},
    {0, "LISTFORMS", "@Shows forms", ListForms},

    {0, "SETVRT <WEAPON> <NUM>",
	    "@Sets the VariableRecycleTime for weapon <WEAPON> to <NUM>",
	debug_setvrt},
    {0, "SETXPLEVEL <SKILL> <NUM>",
	    "@Sets the XP threshold for skill <skill> to <num>",
	debug_setxplevel},
    {0, "SHUTDOWN <MAP#>", "@Shutdown all mechs on the map and clear it.",
	debug_shutdown},

    {0, "XPTOP <SKILL>", "@Shows list of people champ in the <SKILL>",
	debug_xptop},
#endif
    {0, NULL, NULL, NULL}
};

CommandsStruct sscommands[] = {
    {0, "@SETXCODE <NAME> <VALUE|DATA>", "@Sets xcode value on object",
	set_xcodestuff},
    {0, "@VIEWXCODE", "@Views xcode values on object", list_xcodestuff},
    {0, NULL, NULL, NULL}
};

#define LINEB(txt,cmd,str,func,upd,updfunc,power) \
{ txt, cmd, str, func, upd, updfunc, power }
#define LINE(txt,cmd,str,func,upd,updfunc,power) \
LINEB(txt,cmd,sizeof(str),func,upd,updfunc,power)

/* Own init func, no update func */
#define LINE_NU(txt,cmd,str,fu,power) \
LINE(txt,cmd,str,fu,0,NULL,power)

/* No data, no update */
#define LINE_ND(txt,cmd,power) \
LINEB(txt,cmd,0,NULL,0,NULL,power)

/* Just data, no special init, no update func */
#define LINE_NFS(txt,cmd,t,power) \
LINEB(txt,cmd,sizeof(t),NULL,0,NULL,power)

SpecialObjectStruct SpecialObjects[] = {
    LINE("MECH", mechcommands, MECH, newfreemech, HEAT_TICK, mech_update, POW_MECH),
    LINE_ND("DEBUG", debugcommands, POW_SECURITY),
    LINE_NU("MECHREP", mechrepcommands, struct mechrep_data, newfreemechrep, POW_MECHREP),
    LINE("MAP", mapcommands, MAP, newfreemap, LOS_TICK, map_update, POW_MAP),
    LINE_ND("CHARGEN", chargencommands, POW_SECURITY),
    LINE_NU("AUTOPILOT", autopilotcommands, AUTO, auto_newautopilot, POW_SECURITY),
    LINE_NU("TURRET", turretcommands, TURRET_T, newturret, POW_SECURITY),
    LINE_NU("CUSTOM", customcommands, struct custom_struct, newfreecustom, POW_MECHREP),
    LINE_NFS("SCEN", scencommands, SCEN, POW_SECURITY),
    LINE_NFS("SSIDE", sscommands, SSIDE, POW_SECURITY),
    LINE_NFS("SSOBJ", sscommands, SSOBJ, POW_SECURITY),
    LINE_NFS("SSINS", sscommands, SSINS, POW_SECURITY),
    LINE_NFS("SSEXT", sscommands, SSEXT, POW_SECURITY)
};

#define NUM_SPECIAL_OBJECTS \
   ((sizeof(SpecialObjects))/(sizeof(struct SpecialObjectStruct)))

#undef HEADER


#endif

/* Something about [new] Linux gcc is braindead.. I just don't know
   what, but this allows the code to link [bleah] */
#ifdef memcpy
#undef memcpy
#endif

void send_channel(char *, const char *, ...);

#endif