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: mech.status.c,v 1.5 2005/06/24 04:39:08 av1-op Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1996 Markus Stenberg
 *  Copyright (c) 1998-2002 Thomas Wouters
 *  Copyright (c) 2000-2002 Cord Awtry
 *  Copyright (c) 1999-2005 Kevin Stevens
 *       All rights reserved
 *
 * Last modified: Thu Jul  9 02:10:43 1998 fingon
 *
 */

#include "config.h"

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/file.h>

#include "mech.h"
#include "mech.events.h"
#include "failures.h"
#include "coolmenu.h"
#include "create.h"
#include "mycool.h"
#include "mech.partnames.h"
#include "p.mech.los.h"
#include "p.mech.utils.h"
#include "p.mech.scan.h"
#include "p.mech.status.h"
#include "p.mech.build.h"
#include "p.mech.update.h"
#include "p.mech.tech.commands.h"
#include "p.bsuit.h"
#include "p.mech.tech.do.h"
#include "p.mech.combat.h"
#include "p.mech.tag.h"
#include "p.mech.enhanced.criticals.h"
#include "p.mech.contacts.h"
#include "p.btechstats.h"
#include "p.mech.notify.h"
#include "mech.tech.h"

static int doweird = 0;
static char *weirdbuf;

#define PHY_AXE		1
#define PHY_SWORD 2
#define PHY_MACE  3

void DisplayTarget(dbref player, MECH * mech)
{
    int arc;
    MECH *tempMech = NULL;
    char location[50];
    char buff[100], buff1[100];

    if (MechTarget(mech) != -1) {
	tempMech = getMech(MechTarget(mech));
	if (tempMech) {
	    if (InLineOfSight(mech, tempMech, MechX(tempMech),
		    MechY(tempMech), FaMechRange(mech, tempMech))) {
		sprintf(buff,
		    "\nTarget: %s\t   Range: %.1f hexes   Bearing: %d deg",
		    GetMechToMechID(mech, tempMech), FaMechRange(mech,
			tempMech), FindBearing(MechFX(mech), MechFY(mech),
			MechFX(tempMech), MechFY(tempMech)));
		notify(player, buff);
		arc = InWeaponArc(mech, MechFX(tempMech), MechFY(tempMech));
		strcpy(buff, tprintf("Target in %s Weapons Arc",
		       (arc & TURRETARC) ? "Turret" : GetArcID(mech, arc)));
		if (MechAim(mech) == NUM_SECTIONS ||
		    MechAimType(mech) != MechType(tempMech))
		    strcpy(location, "None");
		else
		    ArmorStringFromIndex(MechAim(mech), location,
		    	MechType(tempMech), MechMove(tempMech));
		sprintf(buff1, "\t   Aimed Shot Location: %s", location);
		strcat(buff, buff1);
	    } else
		sprintf(buff, "\nTarget: NOT in line of sight!");
	}
	notify(player, buff);
    } else if (MechTargX(mech) != -1 && MechTargY(mech) != -1) {
	if (MechStatus(mech) & LOCK_BUILDING)
	    notify(player, tprintf("\nTarget: Building at %d %d",
		    MechTargX(mech), MechTargY(mech)));
	else if (MechStatus(mech) & LOCK_HEX)
	    notify(player, tprintf("\nTarget: Hex %d %d", MechTargX(mech),
		    MechTargY(mech)));
	else
	    notify(player, tprintf("\nTarget: %d %d", MechTargX(mech),
		    MechTargY(mech)));

    }
    if (MechPKiller(mech))
	notify(player, "\nWeapon Safeties are %ch%crOFF%cn.");
    if (GotPilot(mech) && HasBoolAdvantage(MechPilot(mech), "maneuvering_ace"))
        notify(player, tprintf("Turn Mode: %s", GetTurnMode(mech) ? "TIGHT" : "NORMAL"));        
    if (MechChargeTarget(mech) > 0 && mudconf.btech_newcharge) {
	tempMech = getMech(MechChargeTarget(mech));
	if (!tempMech)
	    return;
	if (InLineOfSight(mech, tempMech, MechX(tempMech), MechY(tempMech),
		FaMechRange(mech, tempMech))) {
	    notify(player, tprintf("\nChargeTarget: %s\t  ChargeTimer: %d",
		    GetMechToMechID(mech, tempMech),
		    MechChargeTimer(mech) / 2));
	} else {
	    notify(player,
		tprintf
		("\nChargeTarget: NOT in line of sight!\t Timer: %d",
		    MechChargeTimer(mech) / 2));
	}
    }
}

void show_miscbrands(MECH * mech, dbref player)
{
/*   notify(player, tprintf("Radio: %s (%3d range)     Computer: %s (%d Scan / %d LRS / %d Tac)", brands[BOUNDED(1, MechRadio(mech), 5)+RADIO_INDEX].name, (int) MechRadioRange(mech), brands[BOUNDED(1, MechComputer(mech), 5)+COMPUTER_INDEX].name, (int) MechScanRange(mech), (int) MechLRSRange(mech), (int) MechTacRange(mech))); */
}

void PrintGenericStatus(dbref player, MECH * mech, int own, int usex)
{
    MECH *tempMech = NULL;
    MAP *map = FindObjectsData(mech->mapindex);
    char buff[100];
    char mech_name[100];
    char mech_ref[100];
    char move_type[50];

    strcpy(mech_name, usex ? MechType_Name(mech) : silly_atr_get(mech->mynum, A_MECHNAME));
    strcpy(mech_ref, usex ? MechType_Ref(mech) : silly_atr_get(mech->mynum, A_MECHREF));

    switch (MechType(mech)) {
    case CLASS_MW:
	notify(player, tprintf("MechWarrior: %-18.18s ID:[%s]",
		Name(player), MechIDS(mech, 0)));
	notify(player, tprintf("MaxSpeed: %3d", (int) MMaxSpeed(mech)));
	break;
    case CLASS_BSUIT:
	sprintf(buff, "%s Name: %-18.18s  ID:[%s]   %s Reference: %s",
	    GetBSuitName(mech), mech_name, MechIDS(mech, 0),
	    GetBSuitName(mech), mech_ref);
	notify(player, buff);
	notify(player,
	    tprintf("MaxSpeed: %3d                  JumpRange: %d",
		(int) MMaxSpeed(mech), JumpSpeedMP(mech, map)));
	show_miscbrands(mech, player);
	if (MechPilot(mech) == -1)
	    notify(player, "Leader: NONE");
	else {
	    sprintf(buff, "%s Leader Name: %-16.16s %s Leader injury: %d",
		GetBSuitName(mech), Name(MechPilot(mech)),
		GetBSuitName(mech), MechPilotStatus(mech));
	    notify(player, buff);
	}

	sprintf(buff, "Max Suits: %d", MechMaxSuits(mech));
	notify(player, buff);

	Mech_ShowFlags(player, mech, 0, 0);

	if (Jumping(mech)) {
	    sprintf(buff, "JUMPING --> %3d,%3d", MechGoingX(mech),
		MechGoingY(mech));
	    if ((MechStatus(mech) & DFA_ATTACK) &&
		MechDFATarget(mech) != -1) {
		tempMech = getMech(MechDFATarget(mech));
		sprintf(buff + strlen(buff),
		    "  Death From Above Target: %s",
		    GetMechToMechID(mech, tempMech));
	    }
	    notify(player, buff);
	}
	break;
    case CLASS_MECH:
	sprintf(buff, "Mech Name: %-18.18s  ID:[%s]   Mech Reference: %s",
	    mech_name, MechIDS(mech, 0), mech_ref);
	notify(player, buff);
	notify(player,
	    tprintf("Tonnage:   %3d     MaxSpeed: %3d       JumpRange: %d",
		MechTons(mech), (int) MMaxSpeed(mech), JumpSpeedMP(mech,
		    map)));
	show_miscbrands(mech, player);
	if (MechPilot(mech) == -1)
	    notify(player, "Pilot: NONE");
	else {
	    sprintf(buff, "Pilot Name: %-28.28s Pilot Injury: %d",
		Name(MechPilot(mech)), MechPilotStatus(mech));
	    notify(player, buff);
	}
	Mech_ShowFlags(player, mech, 0, 0);
	if (!Jumping(mech) && !Fallen(mech) && Started(mech) &&
	    (MechChargeTarget(mech) != -1)) {
	    tempMech = getMech(MechChargeTarget(mech));
	    if (tempMech) {
		sprintf(buff, "CHARGING --> %s", GetMechToMechID(mech,
			tempMech));
		notify(player, buff);
	    }
	}
	if (Jumping(mech)) {
	    sprintf(buff, "JUMPING --> %3d,%3d", MechGoingX(mech),
		MechGoingY(mech));
	    if ((MechStatus(mech) & DFA_ATTACK) &&
		MechDFATarget(mech) != -1) {
		tempMech = getMech(MechDFATarget(mech));
		sprintf(buff + strlen(buff),
		    "  Death From Above Target: %s",
		    GetMechToMechID(mech, tempMech));
	    }
	    notify(player, buff);
	}
	break;
    case CLASS_VTOL:
    case CLASS_VEH_GROUND:
    case CLASS_VEH_NAVAL:
    case CLASS_AERO:
    case CLASS_DS:
    case CLASS_SPHEROID_DS:
	switch (MechMove(mech)) {
	case MOVE_TRACK:
	    strcpy(move_type, "Tracked");
	    break;
	case MOVE_WHEEL:
	    strcpy(move_type, "Wheeled");
	    break;
	case MOVE_HOVER:
	    strcpy(move_type, "Hover");
	    break;
	case MOVE_VTOL:
	    strcpy(move_type, "VTOL");
	    break;
	case MOVE_FLY:
	    strcpy(move_type, "Flight");
	    break;
	case MOVE_HULL:
	    strcpy(move_type, "Displacement Hull");
	    break;
	case MOVE_SUB:
	    strcpy(move_type, "Submarine");
	    break;
	case MOVE_FOIL:
	    strcpy(move_type, "Hydrofoil");
	    break;
	default:
	    strcpy(move_type, "Magic");
	    break;
	}
	if (MechMove(mech) != MOVE_NONE) {
	    sprintf(buff,
		"Vehicle Name: %-15.15s  ID:[%s]   Vehicle Reference: %s",
		mech_name, MechIDS(mech, 0), mech_ref);
	    notify(player, buff);
	    sprintf(buff,
		"Tonnage:   %3d      %s: %3d       Movement Type: %s",
		MechTons(mech),
		is_aero(mech) ? "Max thrust" : "FlankSpeed",
		(int) MMaxSpeed(mech), move_type);
	    notify(player, buff);
	    show_miscbrands(mech, player);
	    if (MechPilot(mech) == -1)
		notify(player, "Pilot: NONE");
	    else {
		sprintf(buff, "Pilot Name: %-28.28s Pilot Injury: %d",
		    Name(MechPilot(mech)), MechPilotStatus(mech));
		notify(player, buff);
	    }
	} else {
	    sprintf(buff, "Name: %-15.15s  ID:[%s]   Reference: %s",
		mech_name, MechIDS(mech, 0), mech_ref);
	    notify(player, buff);
	}
	if (MechType(mech) != CLASS_VTOL && !is_aero(mech))
	    if (GetSectInt(mech, TURRET)) {
		if (MechTankCritStatus(mech) & TURRET_JAMMED)
		    notify(player, "     TURRET JAMMED");
		else if (MechTankCritStatus(mech) & TURRET_LOCKED)
		    notify(player, "     TURRET LOCKED");
	    }
	if (FlyingT(mech) && Landed(mech))
	    notify(player, "LANDED");
	Mech_ShowFlags(player, mech, 0, 0);
    }
}

void PrintShortInfo(dbref player, MECH * mech)
{
    char buff[100];
    char typespecific[50];

    switch (MechType(mech)) {
    case CLASS_VTOL:
	sprintf(typespecific, " VSPD: %3.1f ", MechVerticalSpeed(mech));
	break;
    case CLASS_MECH:
	sprintf(typespecific, " HT: %3d/%3d ",
	    (int) (10. * MechPlusHeat(mech)),
	    (int) (10. * MechActiveNumsinks(mech)));
	break;
    case CLASS_AERO:
    case CLASS_DS:
    case CLASS_SPHEROID_DS:
	sprintf(typespecific, " VSPD: %3.1f  ANG: %2d  HT: %3d/%3d ",
	    MechVerticalSpeed(mech), MechDesiredAngle(mech),
	    (int) (10 * MechPlusHeat(mech)),
	    (int) (10 * MechActiveNumsinks(mech)));
	break;
    case CLASS_VEH_NAVAL:
	if (MechMove(mech) == MOVE_FOIL)
	    sprintf(typespecific, " VSPD: %3.1f ", MechVerticalSpeed(mech));
        /* FALLTHROUGH */
    case CLASS_VEH_GROUND:
        /* XXX This won't work for subs with turrets.. are they possible ? */
	if (GetSectOInt(mech, TURRET)) {
	    sprintf(typespecific, " TUR: %3d ",
		AcceptableDegree(MechTurretFacing(mech) +
		    MechFacing(mech)));
	    break;
	}
	/* FALLTHROUGH */
    default:
	typespecific[0] = '\0';
	break;
    }

    snprintf(buff, 100,
	"LOC: %3d,%3d,%3d  HD: %3d/%3d  SP: %3.1f/%3.1f %s ST:%s",
	MechX(mech), MechY(mech), MechZ(mech), MechFacing(mech),
	MechDesiredFacing(mech), MechSpeed(mech), MechDesiredSpeed(mech),
	typespecific, getStatusString(mech, 2));
    buff[99] = '\0';
    notify(player, buff);
    DisplayTarget(player, mech);
}


#define HEAT_LEVEL_LGREEN 0
#define HEAT_LEVEL_BGREEN 7
#define HEAT_LEVEL_LYELLOW 13
#define HEAT_LEVEL_BYELLOW 16
#define HEAT_LEVEL_LRED 18
#define HEAT_LEVEL_BRED 24
#define HEAT_LEVEL_TOP 40

#define HEAT_LEVEL_NONE 27

static char *MakeHeatScaleInfo(MECH * mech, char *fillchar)
{
    static char heatstr[128];
    int counter = 0, heat = MechPlusHeat(mech), minheat =
	MechMinusHeat(mech), start = 0;
    char state = 1;

    memset(heatstr, 0, sizeof(char) * 128);

    strcat(heatstr, "%cx%ch");

    if (minheat > HEAT_LEVEL_NONE)
	start = minheat - HEAT_LEVEL_NONE;

    if (heat <= start) {
	heat = 0;
	state = 0;
    } else
	heat -= start;

    if (start)
	strcat(heatstr, "<%cx%ch");
    else
	strcat(heatstr, " %cx%ch");

    for (counter = start; counter < minheat; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    if (state)
	state++;

    strcat(heatstr, "%cg%ch|%c%cg");
    for (; counter < minheat + HEAT_LEVEL_BGREEN; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    if (state)
	state++;

    strcat(heatstr, "%ch");
    for (; counter < minheat + HEAT_LEVEL_LYELLOW; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    if (state)
	state++;

    strcat(heatstr, "%c%cy%ch|%c%cy");
    for (; counter < minheat + HEAT_LEVEL_BYELLOW; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    if (state)
	state++;

    strcat(heatstr, "%ch");
    for (; counter < minheat + HEAT_LEVEL_LRED; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    if (state)
	state++;

    strcat(heatstr, "%c%cr%ch|%c%cr");
    for (; counter < minheat + HEAT_LEVEL_BRED; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    if (state)
	state++;

    strcat(heatstr, "%ch");
    for (; counter < minheat + HEAT_LEVEL_TOP; counter++) {
	strncat(heatstr, &fillchar[(short) state], 1);
	if (heat && !--heat)
	    state = 0;
    }
    strcat(heatstr, "%cw%ch|%c");
    return heatstr;
}

void PrintInfoStatus(dbref player, MECH * mech, int own)
{
    char buff[256];
    char heatstr[9] = ".:::::::";
    MECH *tempMech;
    int f;
    char *tmpstr;

    switch (MechType(mech)) {
    case CLASS_MECH:
	sprintf(buff,
	    "X, Y, Z:%3d,%3d,%3d  Excess Heat:  %3d deg C.  Heat Production:  %3d deg C.",
	    MechX(mech), MechY(mech), MechZ(mech),
	    (int) (10. * MechHeat(mech)),
	    (int) (10. * MechPlusHeat(mech)));
	notify(player, buff);
	sprintf(buff,
	    "Speed:      %%ch%%cg%3d%%cn KPH  Heading:      %%ch%%cg%3d%%cn deg     Heat Sinks:       %3d",
	    (int) (MechSpeed(mech)), MechFacing(mech),
	    MechActiveNumsinks(mech));
	notify(player, buff);
	sprintf(buff,
	    "Des. Speed: %3d KPH  Des. Heading: %3d deg     Heat Dissipation: %3d deg C.",
	    (int) MechDesiredSpeed(mech), MechDesiredFacing(mech),
	    (int) (10. * MechMinusHeat(mech)));
	notify(player, buff);
	tmpstr = silly_atr_get(player, A_HEATCHARS);
	if (!tmpstr || !strlen(tmpstr) ||
	    sscanf(tmpstr, "[%c%c%c%c%c%c%c%c]", &heatstr[0], &heatstr[1],
		&heatstr[2], &heatstr[3], &heatstr[4], &heatstr[5],
		&heatstr[6], &heatstr[7]) == 8) {
	    sprintf(buff, "Temp:%s", MakeHeatScaleInfo(mech, heatstr));
	    notify(player, buff);
	}
	if (MechLateral(mech))
	    notify(player, tprintf("You are moving laterally %s",
		    LateralDesc(mech)));
	break;
    case CLASS_VEH_GROUND:
    case CLASS_VEH_NAVAL:
    case CLASS_VTOL:
    case CLASS_AERO:
    case CLASS_DS:
    case CLASS_SPHEROID_DS:
	sprintf(buff,
	    "X, Y, Z:%3d,%3d,%3d  Heat Sinks:          %3d       %s",
	    MechX(mech), MechY(mech), MechZ(mech),
	    MechActiveNumsinks(mech),
	    is_aero(mech) ? tprintf("%s angle: %%ch%%cg%d%%cn",
		MechDesiredAngle(mech) >= 0 ? "Climbing" : "Diving",
		abs(MechDesiredAngle(mech))
	    ) : "");
	notify(player, buff);
	if (FlyingT(mech) || MechMove(mech) == MOVE_SUB) {
	    sprintf(buff,
		"Speed:      %%ch%%cg%3d%%cn KPH  Vertical Speed:      %%ch%%cg%3d%%cn KPH   Des. Speed %3d KPH",
		(int) (MechSpeed(mech)), (int) (MechVerticalSpeed(mech)),
		(int) (MechDesiredSpeed(mech)));
	    notify(player, buff);
	    f = MAX(0, AeroFuel(mech));
	    if (MechMove(mech) == MOVE_SUB) {
		sprintf(buff, "Heading: %3d KPH  Des. Heading: %3d deg",
		    (int) MechFacing(mech), MechDesiredFacing(mech));
	    } else if (AeroFreeFuel(mech)) {
		sprintf(buff,
		    "Heading:    %%ch%%cg%3d%%cn deg  Des. Heading:        %3d deg   Fuel: Unlimited",
		    MechFacing(mech), MechDesiredFacing(mech));
	    } else {
		sprintf(buff,
		    "Heading:    %%ch%%cg%3d%%cn deg  Des. Heading:        %3d deg   Fuel: %d (%.2f %%)",
		    MechFacing(mech), MechDesiredFacing(mech), f,
		    100.0 * f / AeroFuelOrig(mech));
	    }

	    notify(player, buff);
	} else if (MechMove(mech) != MOVE_NONE) {
	    sprintf(buff,
		"Speed:      %%ch%%cg%3d%%cn KPH  Heading:      %%ch%%cg%3d%%cn deg",
		(int) (MechSpeed(mech)), MechFacing(mech));
	    notify(player, buff);
	    sprintf(buff, "Des. Speed: %3d KPH  Des. Heading: %3d deg",
		(int) MechDesiredSpeed(mech), MechDesiredFacing(mech));
	    notify(player, buff);

	}
	ShowTurretFacing(player, 0, mech);
	break;
    case CLASS_MW:
    case CLASS_BSUIT:
	sprintf(buff,
	    "X, Y, Z:%3d,%3d,%3d  Speed:      %%ch%%cg%3d%%cn KPH  Heading:      %%ch%%cg%3d%%cn deg",
	    MechX(mech), MechY(mech), MechZ(mech), (int) (MechSpeed(mech)),
	    MechFacing(mech));
	notify(player, buff);
	sprintf(buff,
	    "                     Des. Speed: %3d KPH  Des. Heading: %3d deg",
	    (int) MechDesiredSpeed(mech), MechDesiredFacing(mech));
	notify(player, buff);
	break;
    }
    DisplayTarget(player, mech);
    if (MechCarrying(mech) > 0)
	if ((tempMech = getMech(MechCarrying(mech))))
	    notify(player, tprintf("Towing %s.", GetMechToMechID(mech,
			tempMech)));
}

/* Status commands! */
void mech_status(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;
    int doweap = 0, doinfo = 0, doarmor = 0, doshort = 0, doheat = 0, loop;
    int i;
    int usex = 0;
    char buf[LBUF_SIZE];

    doweird = 0;
    cch(MECH_USUALSM);
    if (!buffer || !strlen(buffer))
	doweap = doinfo = doarmor = 1;
    else {
	for (loop = 0; buffer[loop]; loop++) {
	    switch (toupper(buffer[loop])) {
	    case 'R':
		doweap = doinfo = doarmor = usex = 1;
		break;
	    case 'A':
		if (toupper(buffer[loop + 1]) == 'R')
		    while (buffer[loop + 1] && buffer[loop + 1] != ' ')
			loop++;
		doarmor = 1;
		break;
	    case 'I':
		doinfo = 1;
		if (toupper(buffer[loop + 1]) == 'N')
		    while (buffer[loop + 1] && buffer[loop + 1] != ' ')
			loop++;
		break;
	    case 'W':
		doweap = 1;
		if (toupper(buffer[loop + 1]) == 'E')
		    while (buffer[loop + 1] && buffer[loop + 1] != ' ')
			loop++;
		break;
	    case 'N':
		doweird = 1;
		break;
	    case 'S':
		doshort = 1;
		break;
	    case 'H':
		doheat = 1;
		break;
	    }
	}
    }
    if (doshort) {
	PrintShortInfo(player, mech);
	return;
    }
    if (doweird) {
	sprintf(buf, "%s %s %d %d/%d/%d %d ", MechType_Ref(mech),
	    MechType_Name(mech), MechTons(mech),
	    (int) (MechMaxSpeed(mech) / MP1) * 2 / 3,
	    (int) (MechMaxSpeed(mech) / MP1),
	    (int) (MechJumpSpeed(mech) / MP1), MechActiveNumsinks(mech));
	weirdbuf = buf;
    } else if (!doheat || (doarmor | doinfo | doweap))
	PrintGenericStatus(player, mech, 1, usex);
    if (doarmor) {
	if (!doweird) {
	    PrintArmorStatus(player, mech, 1);
	    notify(player, " ");
	} else {
	    for (i = 0; i < NUM_SECTIONS; i++)
		if (GetSectOArmor(mech, i)) {
		    if (GetSectORArmor(mech, i))
			sprintf(buf + strlen(buf), "%d|%d|%d ",
			    GetSectOArmor(mech, i), GetSectOInt(mech, i),
			    GetSectORArmor(mech, i));
		    else
			sprintf(buf + strlen(buf), "%d|%d ",
			    GetSectOArmor(mech, i), GetSectOInt(mech, i));
		}
	}
    }
    if (doinfo && !doweird) {
	PrintInfoStatus(player, mech, 1);
	notify(player, " ");
    }
    if (doheat && !doinfo && MechType(mech) == CLASS_MECH) {
	char *tmpstr, heatstr[9] = ".:::::::";

	tmpstr = silly_atr_get(player, A_HEATCHARS);
	if (!tmpstr || !strlen(tmpstr) ||
	    sscanf(tmpstr, "[%c%c%c%c%c%c%c%c]", &heatstr[0], &heatstr[1],
		&heatstr[2], &heatstr[3], &heatstr[4], &heatstr[5],
		&heatstr[6], &heatstr[7]) == 8) {
	    sprintf(buf, "Temp:%s", MakeHeatScaleInfo(mech, heatstr));
	    notify(player, buf);
	}
    }

    if (doweap)
	PrintWeaponStatus(mech, player);
    if (doweird)
	notify(player, buf);
}

void mech_critstatus(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;
    char *args[1];
    int index;

    cch(MECH_USUALSM);
    if (!CheckData(player, mech))
	return;
    DOCHECK(MechType(mech) == CLASS_MW, "Huh?");
    DOCHECK(mech_parseattributes(buffer, args, 1) != 1,
	"You must specify a section to list the criticals for!");
    index =
	ArmorSectionFromString(MechType(mech), MechMove(mech), args[0]);
    DOCHECK(index == -1, "Invalid section!");
    DOCHECK(!GetSectOInt(mech, index), "Invalid section!");
    CriticalStatus(player, mech, index);
}

static int wspec_weaps[MAX_WEAPONS_PER_MECH];
static int wspec_weapcount;

char *part_name(int type, int brand)
{
    char *c;
    static char buffer[SBUF_SIZE];

    if (type == EMPTY)
	return "Empty";
    c = get_parts_long_name(type, brand);
    if (!c)
	return NULL;
    strcpy(buffer, c);
    if (!strcmp(c, "LifeSupport"))
	strcpy(buffer, "Life Support");
    else if (!strcmp(c, "TripleStrengthMyomer"))
	strcpy(buffer, "Triple Strength Myomer");
    else
	strcpy(buffer, c);
    if ((c = strstr(buffer, "Actuator")))
	if (c != buffer)
	    strcpy(c, " Actuator");
    while ((c = strchr(buffer, '_')))
	*c = ' ';
    while ((c = strchr(buffer, '.')))
	*c = ' ';
    return buffer;
}

char *part_name_long(int type, int brand)
{
    char *c;
    static char buffer[SBUF_SIZE];

    if (type == EMPTY)
	return "Empty";
    c = get_parts_vlong_name(type, brand);
    if (!c)
	return NULL;
    strcpy(buffer, c);
    if (!strcmp(c, "LifeSupport"))
	strcpy(buffer, "Life Support");
    else if (!strcmp(c, "TripleStrengthMyomer"))
	strcpy(buffer, "Triple Strength Myomer");
    else
	strcpy(buffer, c);
    if ((c = strstr(buffer, "Actuator")))
	if (c != buffer)
	    strcpy(c, " Actuator");
    while ((c = strchr(buffer, '_')))
	*c = ' ';
    while ((c = strchr(buffer, '.')))
	*c = ' ';
    return buffer;
}

char *pos_part_name(MECH * mech, int index, int loop)
{
    int t, b;
    char *c;

    if (index < 0 || index >= NUM_SECTIONS || loop < 0 ||
	loop >= NUM_CRITICALS) {
	SendError(tprintf("INVALID: For mech #%d, %d/%d was requested.",
		mech->mynum, index, loop));
	return "--?LocationBug?--";
    }
    t = GetPartType(mech, index, loop);
    b = GetPartBrand(mech, index, loop);
    if (t == Special(HAND_OR_FOOT_ACTUATOR)) {
	if (index == LLEG || index == RLEG || MechIsQuad(mech))
	    return "Foot Actuator";
	return "Hand Actuator";
    }
    if (t == Special(SHOULDER_OR_HIP)) {
	if (index == LLEG || index == RLEG || MechIsQuad(mech))
	    return "Hip";
	return "Shoulder";
    }
    if (!(c = part_name(t, b)))
	return "--?ErrorInTemplate?--";
    return c;

}

static char *wspec_fun(int i)
{
    static char buf[MBUF_SIZE];
    int j;

    buf[0] = 0;
    if (!i)
	if (mudconf.btech_erange)
	    sprintf(buf, WSDUMP_MASKS_ER);
	else
	    sprintf(buf, WSDUMP_MASKS_NOER);
    else {
	i--;
	j = wspec_weaps[i];
	if (mudconf.btech_erange)
	    sprintf(buf, WSDUMP_MASK_ER, MechWeapons[j].name,
		MechWeapons[j].heat, MechWeapons[j].damage,
		MechWeapons[j].min, MechWeapons[j].shortrange,
		MechWeapons[j].medrange, GunRange(j), EGunRange(j),
		MechWeapons[j].vrt);
	else
	    sprintf(buf, WSDUMP_MASK_NOER, MechWeapons[j].name,
		MechWeapons[j].heat, MechWeapons[j].damage,
		MechWeapons[j].min, MechWeapons[j].shortrange,
		MechWeapons[j].medrange, GunRange(j), MechWeapons[j].vrt);
    }
    return buf;
}

void mech_weaponspecs(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;
    int loop;
    unsigned char weaparray[MAX_WEAPS_SECTION];
    unsigned char weapdata[MAX_WEAPS_SECTION];
    int critical[MAX_WEAPS_SECTION];

/*   unsigned char weaps[8 * MAX_WEAPS_SECTION]; */
    int num_weaps;
    int index;
    int duplicate, ii;
    coolmenu *c;

    wspec_weapcount = 0;
    if (!CheckData(player, mech))
	return;
    for (loop = 0; loop < NUM_SECTIONS; loop++) {
	num_weaps = FindWeapons(mech, loop, weaparray, weapdata, critical);
	for (index = 0; index < num_weaps; index++) {
	    duplicate = 0;
	    for (ii = 0; ii < wspec_weapcount; ii++)
		if (weaparray[index] == wspec_weaps[ii])
		    duplicate = 1;
	    if (!duplicate && wspec_weapcount < MAX_WEAPONS_PER_MECH)
		wspec_weaps[wspec_weapcount++] = weaparray[index];
	}
    }
    DOCHECK(!wspec_weapcount, "You have no weapons!");
    if (strcmp(MechType_Name(mech), MechType_Ref(mech)))
	c = SelCol_FunStringMenuK(1,
	    tprintf("Weapons statistics for %s: %s", MechType_Name(mech),
		MechType_Ref(mech)), wspec_fun, wspec_weapcount + 1);
    else
	c = SelCol_FunStringMenuK(1, tprintf("Weapons statistics for %s",
		MechType_Ref(mech)), wspec_fun, wspec_weapcount + 1);
    ShowCoolMenu(player, c);
    KillCoolMenu(c);
}

char *critstatus_func(MECH * mech, char *arg)
{
    static char buffer[MBUF_SIZE];
    char *tmp;
    int index, i, max_crits;
    int type;

    if (!arg || !*arg)
	return "#-1 INVALID SECTION";

    index = ArmorSectionFromString(MechType(mech), MechMove(mech), arg);
    if (index == -1 || !GetSectOInt(mech, index))
	return "#-1 INVALID SECTION";

    buffer[0] = '\0';
    max_crits = CritsInLoc(mech, index);
    for (i = 0; i < max_crits; i++) {
	if (buffer[0])
	    sprintf(buffer, "%s,", buffer);
	sprintf(buffer, "%s%d|", buffer, i + 1);
	type = GetPartType(mech, index, i);
	if (IsAmmo(type))
	    type = FindAmmoType(mech, index, i);
	tmp = get_parts_long_name(type, GetPartBrand(mech, index, i));
	sprintf(buffer, "%s|%s", buffer, tmp ? tmp : "Empty");
	sprintf(buffer, "%s|%d", buffer, (PartIsNonfunctional(mech, index,
		    i) && type != EMPTY && (!IsCrap(type) ||
		    SectIsDestroyed(mech,
			index))) ? -1 : PartTempNuke(mech, index, i));
	sprintf(buffer, "%s|%d", buffer,
	    IsWeapon(type) ? 1 : IsAmmo(type) ? 2 : IsActuator(type) ? 3 :
	    IsCargo(type) ? 4 : (IsCrap(type) || type == EMPTY) ? 5 : 0);
    }
    return buffer;
}

char *armorstatus_func(MECH * mech, char *arg)
{
    static char buffer[MBUF_SIZE];
    int index;

    if (!arg || !*arg)
	return "#-1 INVALID SECTION";

    index = ArmorSectionFromString(MechType(mech), MechMove(mech), arg);
    if (index == -1 || !GetSectOInt(mech, index))
	return "#-1 INVALID SECTION";

    buffer[0] = '\0';
    sprintf(buffer, "%d/%d|%d/%d|%d/%d", GetSectArmor(mech, index),
	GetSectOArmor(mech, index), GetSectInt(mech, index),
	GetSectOInt(mech, index), GetSectRArmor(mech, index),
	GetSectORArmor(mech, index));
    return buffer;
}

/* weaponstatus_func. Returns a string containing:
   
   <weapon number> | <weapon (long) name> | <number of crits> |
   	<part quality> | <weapon recycle time> | <recycle time left> |
   	<weapon type> | <weapon status>
   [ , <next weapon> ]
   	
   Weapon number is the number of the weapon in this particular 'mech.
   Long weapon name is 'agra.mediumlaser' and such.
   Weapon type is as defined in mech.h:
	   #define TBEAM      0
	   #define TMISSILE   1
	   #define TARTILLERY 2
	   #define TAMMO      3
	   #define THAND      4
   Weapon status is:
   	0 - weapon operational
   	1 - weapon (temporarily) glitched
   	2 - weapon destroyed/flooded
*/

char *weaponstatus_func(MECH * mech, char *arg)
{
    static char buffer[MBUF_SIZE];
    int count, sect, loopsect, i, type, totalcount = 0;
    unsigned char weaparray[MAX_WEAPS_SECTION];
    unsigned char weapdata[MAX_WEAPS_SECTION];
    int criticals[MAX_WEAPS_SECTION];

    if (!arg)
	sect = -1;
    else if (!*arg)
	return "#-1 INVALID SECTION";
    else if ((sect = ArmorSectionFromString(MechType(mech),
		MechMove(mech), arg)) == -1 || !GetSectOInt(mech, sect))
	return "#-1 INVALID SECTION";

    buffer[0] = '\0';
    for ((sect == -1) ? (loopsect = 0) : (loopsect = sect);
	(sect == -1) ? (loopsect < NUM_SECTIONS) : (loopsect < sect + 1);
	loopsect++) {
	count =
	    FindWeapons(mech, loopsect, weaparray, weapdata, criticals);
	for (i = 0; i < count; i++, totalcount++) {
	    if (buffer[0])
		sprintf(buffer, "%s,", buffer);
	    type = Weapon2I(GetPartType(mech, loopsect, criticals[i]));
	    sprintf(buffer, "%s%d|%s|%d|%d|%d|%d|%d|%d", buffer,
		totalcount, get_parts_long_name(I2Weapon(type),
		    GetPartBrand(mech, loopsect, criticals[i])),
		GetWeaponCrits(mech, type), GetPartBrand(mech, loopsect,
		    criticals[i]), MechWeapons[type].vrt, weapdata[i],
		MechWeapons[type].type, PartIsNonfunctional(mech, loopsect,
		    criticals[i]) ? 2 : PartTempNuke(mech, loopsect,
		    criticals[i]) ? 1 : 0);
	}
    }
    return buffer;
}

char *critslot_func(MECH * mech, char *buf_section, char *buf_critnum, char *buf_flag)
{
    int index, crit, flag, type;
    static char buffer[MBUF_SIZE];

    index = ArmorSectionFromString(MechType(mech), MechMove(mech), buf_section);
    if (index == -1)
        return "#-1 INVALID SECTION";
    if (!GetSectOInt(mech, index))
        return "#-1 INVALID SECTION";
    crit = atoi(buf_critnum);
    if (crit < 1 || crit > CritsInLoc(mech, index))
        return "#-1 INVALID CRITICAL";
    crit--;
    if (!buf_flag)
        flag = 0;
    else if (strcasecmp(buf_flag, "NAME") == 0)
        flag = 0;
    else if (strcasecmp(buf_flag, "STATUS") == 0)
        flag = 1;
    else if (strcasecmp(buf_flag, "DATA") == 0)
        flag = 2;
    else if (strcasecmp(buf_flag, "MAXAMMO") == 0)
        flag = 3;
    else if (strcasecmp(buf_flag, "AMMOTYPE") == 0)
        flag = 4;
    else if (strcasecmp(buf_flag, "MODE") == 0)
        flag = 5;
    else
        flag = 0;

    type = GetPartType(mech, index, crit);

    if (flag == 1) {
        if (PartIsDisabled(mech, index, crit))
            return "Disabled";
        if (PartIsDestroyed(mech, index, crit))
            return "Destroyed";
        return "Operational";
    }  else if (flag == 2) {
        snprintf(buffer, MBUF_SIZE, "%d", GetPartData(mech, index, crit));
        return buffer;
    } else if (flag == 3) {
        if (!IsAmmo(type))
            return "#-1 NOT AMMO";
        snprintf(buffer, MBUF_SIZE, "%d", FullAmmo(mech, index, crit));
        return buffer;
    } else if (flag == 4) {
        if (!IsAmmo(type))
            return "#-1 NOT AMMO";
        type = FindAmmoType(mech, index, crit);
    } else if (flag == 5) {
        int weapindex;
        if (!IsWeapon(type))
            return "#-1 NOT AMMO OR WEAPON";
	else {
	    weapindex = Weapon2I(type);
	    snprintf(buffer, MBUF_SIZE, "%c%c",
		GetWeaponFireModeLetter_Model_Mode(weapindex, GetPartFireMode(mech, index, crit)),
		GetWeaponAmmoModeLetter_Model_Mode(weapindex, GetPartAmmoMode(mech, index, crit)));
		return buffer;
	}
    }

    if (type == EMPTY || IsCrap(type))
        return "Empty";
    if (flag == 0)
#ifndef BT_COMPLEXREPAIRS
        type = alias_part(mech, type);
#else
        type = alias_part(mech, type, index);
#endif
    snprintf(buffer, MBUF_SIZE, "%s", get_parts_vlong_name(type, GetPartBrand(mech, index, crit)));
    return buffer;
}

void CriticalStatus(dbref player, MECH * mech, int index)
{
    int loop, i;
    char buffer[MBUF_SIZE];
    int type, data, wFireMode;
    int max_crits = CritsInLoc(mech, index);
    char **foo;
    int count = 0;
    coolmenu *cm;

    Create(foo, char *, NUM_CRITICALS + 1);

    for (i = 0; i < max_crits; i++) {
	loop = ((i % 2) ? (max_crits / 2) : 0) + i / 2;
	sprintf(buffer, "%2d ", loop + 1);
	type = GetPartType(mech, index, loop);
	data = GetPartData(mech, index, loop);
	wFireMode = GetPartFireMode(mech, index, loop);
	if (IsAmmo(type)) {
	    char trash[50];

	    strcat(buffer, &MechWeapons[Ammo2WeaponI(type)].name[3]);
	    strcat(buffer, GetAmmoDesc_Model_Mode(Ammo2WeaponI(type),
		    GetPartAmmoMode(mech, index, loop)));
	    strcat(buffer, " Ammo");

	    if (!PartIsNonfunctional(mech, index, loop)) {
		sprintf(trash, " (%d)", data);
		strcat(buffer, trash);
	    }

	} else {
	    if (IsWeapon(type) && (wFireMode & OS_MODE))
		strcat(buffer, "OS ");
	    strcat(buffer, pos_part_name(mech, index, loop));
	    if (IsWeapon(type) && (((wFireMode & OS_MODE) &&
			(wFireMode & OS_USED)) ||
		    (wFireMode & ROCKET_FIRED)))
		strcat(buffer, " (Empty)");
	}

	if (PartIsBroken(mech, index, loop) && type != EMPTY &&
	    (!IsCrap(type) || SectIsDestroyed(mech, index)))
	    strcat(buffer, PartIsDestroyed(mech, index, loop) ?
		" (Destroyed)" : " (Broken)");
	else if (PartIsDisabled(mech, index, loop) && type != EMPTY)
	    strcat(buffer, " (Disabled)");
	else if (PartIsDamaged(mech, index, loop) && type != EMPTY)
	    strcat(buffer, " (Damaged)");

	foo[count++] = strdup(buffer);
    }

    ArmorStringFromIndex(index, buffer, MechType(mech), MechMove(mech));
    strcat(buffer, " Criticals");
    cm = SelCol_StringMenu(2, buffer, foo);
    ShowCoolMenu(player, cm);
    KillCoolMenu(cm);
    KillText(foo);
}

char *evaluate_ammo_amount(int now, int max)
{
    int f = (now * 100) / max;

    if (f >= 50)
	return "%ch%cg";
    if (f >= 25)
	return "%ch%cy";
    return "%ch%cr";
}

void PrintWeaponStatus(MECH * mech, dbref player)
{
    unsigned char weaparray[MAX_WEAPS_SECTION];
    unsigned char weapdata[MAX_WEAPS_SECTION];
    int critical[MAX_WEAPS_SECTION];
    unsigned char ammoweap[8 * MAX_WEAPS_SECTION];
    unsigned short ammo[8 * MAX_WEAPS_SECTION];
    unsigned short ammomax[8 * MAX_WEAPS_SECTION];
    unsigned int modearray[8 * MAX_WEAPS_SECTION];
    char tmpbuf[MBUF_SIZE];
    int count, ammoweapcount;
    int loop;
    int ii, i = 0;
    char weapname[80], *tmpc;
    char weapbuff[120];
    char tempbuff[160];
    char location[80];
    char astrAmmoSpacer[52];
    int running_sum = 0;
    short ammo_mode;

    if ((MechSpecials(mech) & ECM_TECH) ||
	(MechSpecials2(mech) & STEALTH_ARMOR_TECH) ||
	(MechSpecials2(mech) & NULLSIGSYS_TECH) ||
	(MechSpecials(mech) & SLITE_TECH) ||
	HasC3(mech) ||
	HasC3i(mech) ||
	(MechSpecials(mech) & MASC_TECH) ||
	(MechSpecials2(mech) & SUPERCHARGER_TECH) ||
	(MechSpecials(mech) & TRIPLE_MYOMER_TECH) ||
	(MechSpecials2(mech) & ANGEL_ECM_TECH) || HasTAG(mech) ||
	(MechInfantrySpecials(mech) & FC_INFILTRATORII_STEALTH_TECH)) {
	strcpy(tempbuff, "AdvTech: ");

	if (MechSpecials(mech) & ECM_TECH) {
	    sprintf(tempbuff + strlen(tempbuff), "ECM(%s)  ",
		(MechStatus2(mech) & ECM_DESTROYED) ? "%ch%crXX%cn"
		: ECMEnabled(mech) ? (ECMActive(mech) ? "%ch%cgECM%cn" :
		    "%ch%crECM%cn") : ECCMEnabled(mech) ? "%ch%cgECCM%cn" :
		ECMCountered(mech) ? "%crOff%cn" : "%cgOff%cn");

	}

	if (MechSpecials2(mech) & ANGEL_ECM_TECH) {
	    sprintf(tempbuff + strlen(tempbuff), "AngelECM(%s)  ",
		(!HasWorkingAngelECMSuite(mech)) ? "%ch%crXX%cn"
		: AngelECMEnabled(mech) ? (AngelECMActive(mech) ?
		    "%ch%cgECM%cn" : "%ch%crECM%cn") :
		AngelECCMEnabled(mech) ? "%ch%cgECCM%cn" :
		ECMCountered(mech) ? "%crOff%cn" : "%cgOff%cn");

	}

	if (MechInfantrySpecials(mech) & FC_INFILTRATORII_STEALTH_TECH) {
	    sprintf(tempbuff + strlen(tempbuff), "PersonalECM(%s)  ",
		PerECMEnabled(mech) ? (PerECMActive(mech) ?
		    "%ch%cgECM%cn" : "%ch%crECM%cn") :
		PerECCMEnabled(mech) ? "%ch%cgECCM%cn" :
		ECMCountered(mech) ? "%crOff%cn" : "%cgOff%cn");

	}

	if (MechSpecials2(mech) & STEALTH_ARMOR_TECH) {
	    sprintf(tempbuff + strlen(tempbuff), "SthArmor(%s)  ",
		(MechStatus2(mech) & ECM_DESTROYED) ? "%ch%crXX%cn"
		: StealthArmorActive(mech) ? "%ch%cgOn%cn" : "%cgRdy%cn");
	}

	if (MechSpecials2(mech) & NULLSIGSYS_TECH) {
	    sprintf(tempbuff + strlen(tempbuff), "NullSigSys(%s)  ",
		NullSigSysDest(mech) ? "%ch%crXX%cn" :
		NullSigSysActive(mech) ? "%ch%cgOn%cn" : "%cgRdy%cn");
	}

	if (MechSpecials(mech) & SLITE_TECH) {
	    sprintf(tempbuff + strlen(tempbuff), "SLITE(%s)  ",
		(MechCritStatus(mech) & SLITE_DEST) ? "%cr%chXX%cn"
		: (MechStatus2(mech) & SLITE_ON) ? "%ch%cgOn%cn" :
		"%cgOff%cn");
	}

	if (HasC3m(mech))
	    sprintf(tempbuff + strlen(tempbuff), "%sC3M%%cn  ",
		C3Destroyed(mech) ? "%cr" :
		AnyECMDisturbed(mech) ? "%cy" :
		MechC3NetworkSize(mech) > 0 ? "%cg%ch" : "%cg");

	if (HasC3s(mech))
	    sprintf(tempbuff + strlen(tempbuff), "%sC3S%%cn  ",
		C3Destroyed(mech) ? "%cr" :
		AnyECMDisturbed(mech) ? "%cy" :
		MechC3NetworkSize(mech) > 0 ? "%cg%ch" : "%cg");

	if (HasC3i(mech))
	    sprintf(tempbuff + strlen(tempbuff), "%sC3i%%cn  ",
		C3iDestroyed(mech) ? "%cr" :
		AnyECMDisturbed(mech) ? "%cy" :
		MechC3iNetworkSize(mech) > 0 ? "%cg%ch" : "%cg");

	if (MechSpecials(mech) & TRIPLE_MYOMER_TECH)
	    sprintf(tempbuff + strlen(tempbuff), "TSM(%s)  ",
		((MechHeat(mech) >= 9.0) ? "%ch%cgOn%cn" : "%cgOff%cn"));

	if (HasTAG(mech)) {
	    sprintf(tempbuff + strlen(tempbuff), "TAG(%s)  ",
		isTAGDestroyed(mech) ? "%cr%chXX%cn" :
		((getMech(TAGTarget(mech)) <= 0) ||
		    (TaggedBy(getMech(TAGTarget(mech))) !=
			mech->mynum)) ? (TagRecycling(mech) ?
		    "%cy%chNot Rdy%cn" : "%cgRdy%cn") : tprintf("%s%s%%cn",
		    (TagRecycling(mech) ? "%cy%ch" : "%ch"),
		    GetMechToMechID(mech, getMech(TAGTarget(mech)))));
	}

	if (MechSpecials2(mech) & SUPERCHARGER_TECH)
	    sprintf(tempbuff + strlen(tempbuff), "SCHARGE: %s%d%%cn (%s)",
		MechSChargeCounter(mech) >
		3 ? "%ch%cr" : MechSChargeCounter(mech) >
		0 ? "%ch%cy" : "%cg", MechSChargeCounter(mech),
		MechStatus(mech) & SCHARGE_ENABLED ? "On" : "Off");

	if (MechSpecials(mech) & MASC_TECH)
	    sprintf(tempbuff + strlen(tempbuff), "MASC: %s%d%%cn (%s)",
		MechMASCCounter(mech) >
		3 ? "%ch%cr" : MechMASCCounter(mech) >
		0 ? "%ch%cy" : "%cg", MechMASCCounter(mech),
		MechStatus(mech) & MASC_ENABLED ? "On" : "Off");

	notify(player, tempbuff);
	tempbuff[0] = 0;
    }

    if ((MechSpecials(mech) & AA_TECH) ||
	(MechSpecials(mech) & BEAGLE_PROBE_TECH) ||
	(MechSpecials2(mech) & BLOODHOUND_PROBE_TECH)) {

	strcpy(tempbuff, "AdvSensors:");

	if (MechSpecials(mech) & AA_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " Radar");

	if (MechSpecials(mech) & BEAGLE_PROBE_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " BeagleProbe");

	if (MechSpecials2(mech) & BLOODHOUND_PROBE_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " BloodhoundProbe");

	notify(player, tempbuff);
	tempbuff[0] = 0;
    }

    if ((MechInfantrySpecials(mech) & CS_PURIFIER_STEALTH_TECH) ||
	(MechInfantrySpecials(mech) & DC_KAGE_STEALTH_TECH) ||
	(MechInfantrySpecials(mech) & FWL_ACHILEUS_STEALTH_TECH) ||
	(MechInfantrySpecials(mech) & FC_INFILTRATOR_STEALTH_TECH) ||
	(MechInfantrySpecials(mech) & FC_INFILTRATORII_STEALTH_TECH)) {

	strcpy(tempbuff, "AdvItems:");

	if (MechInfantrySpecials(mech) & CS_PURIFIER_STEALTH_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " PurifierStealth");

	if (MechInfantrySpecials(mech) & DC_KAGE_STEALTH_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " KageStealth");

	if (MechInfantrySpecials(mech) & FWL_ACHILEUS_STEALTH_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " AchileusStealth");

	if (MechInfantrySpecials(mech) & FC_INFILTRATOR_STEALTH_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " InfiltratorStealth");

	if (MechInfantrySpecials(mech) & FC_INFILTRATORII_STEALTH_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " InfiltratorIIStealth");

	notify(player, tempbuff);
	tempbuff[0] = 0;
    }

    if ((MechInfantrySpecials(mech) & INF_SWARM_TECH) ||
	(MechInfantrySpecials(mech) & INF_MOUNT_TECH) ||
	(MechInfantrySpecials(mech) & INF_ANTILEG_TECH) ||
	(MechInfantrySpecials(mech) & CAN_JETTISON_TECH)) {

	strcpy(tempbuff, "Special Actions:");

	if (MechInfantrySpecials(mech) & INF_MOUNT_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " MountFriends");

	if (MechInfantrySpecials(mech) & INF_SWARM_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " SwarmAttack");

	if (MechInfantrySpecials(mech) & INF_ANTILEG_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " AntiLegAttack");

	if (MechInfantrySpecials(mech) & CAN_JETTISON_TECH)
	    sprintf(tempbuff + strlen(tempbuff), " BackPackJettison");

	notify(player, tempbuff);
	tempbuff[0] = 0;
    }

    if (MechInfantrySpecials(mech) & MUST_JETTISON_TECH) {
	strcpy(tempbuff,
	    "Requirements: Must jettison backpack before using special abilities or jumping");
	notify(player, tempbuff);
	tempbuff[0] = 0;
    }
#define SHOWSECTSTAT(a) \
	 (SectIsDestroyed(mech, a) ? "%ch%cx*****%c" : \
	 (MechSections(mech)[(a)].recycle > 0) ? \
	 tprintf("%-5d", (MechSections(mech)[(a)].recycle / WEAPON_TICK) \
         + (MechSections(mech)[(a)].recycle%WEAPON_TICK)) : "%cgReady%c")

    UpdateRecycling(mech);
    if (MechType(mech) == CLASS_MECH && !doweird) {
	tempbuff[0] = 0;

#define SHOWPHYSTATUS(a,b) \
	 (!canUsePhysical(mech,a,b) ? "%ch%crXX%c" : \
	 (MechSections(mech)[(a)].recycle > 0) ? \
		tprintf("%-3d", (MechSections(mech)[(a)].recycle / WEAPON_TICK) + \
        + (MechSections(mech)[(a)].recycle%WEAPON_TICK)) : "%cgRdy%c")

#define SHOW(part,loc) \
		sprintf(tempbuff + strlen(tempbuff), "%s: %s  ", part, loc)

	SHOW(MechIsQuad(mech) ? "FLLEG" : "LARM", SHOWSECTSTAT(LARM));
	SHOW(MechIsQuad(mech) ? "FRLEG" : "RARM", SHOWSECTSTAT(RARM));
	SHOW(MechIsQuad(mech) ? "RLLEG" : "LLEG", SHOWSECTSTAT(LLEG));
	SHOW(MechIsQuad(mech) ? "RRLEG" : "RLEG", SHOWSECTSTAT(RLEG));

	if (hasPhysical(mech, LARM, PHY_AXE))
	    SHOW("Axe[LA]", SHOWPHYSTATUS(LARM, PHY_AXE));

	if (hasPhysical(mech, RARM, PHY_AXE))
	    SHOW("Axe[RA]", SHOWPHYSTATUS(RARM, PHY_AXE));

	if (hasPhysical(mech, LARM, PHY_SWORD))
	    SHOW("Sword[LA]", SHOWPHYSTATUS(LARM, PHY_SWORD));

	if (hasPhysical(mech, RARM, PHY_SWORD))
	    SHOW("Sword[RA]", SHOWPHYSTATUS(RARM, PHY_SWORD));

	if (hasPhysical(mech, LARM, PHY_MACE))
	    SHOW("Mace[LA]", SHOWPHYSTATUS(LARM, PHY_MACE));

	if (hasPhysical(mech, RARM, PHY_MACE))
	    SHOW("Mace[RA]", SHOWPHYSTATUS(RARM, PHY_MACE));

	notify(player, tempbuff);

	if (MechStatus(mech) & FLIPPED_ARMS)
	    notify(player,
		"*** Mech arms are flipped into the rear arc ***");
    } else if (MechType(mech) == CLASS_BSUIT && !doweird) {
	for (i = 0; i < NUM_BSUIT_MEMBERS; i++)
	    if (GetSectInt(mech, i))
		break;
	if (i < NUM_BSUIT_MEMBERS) {
	    sprintf(tempbuff, "Team status (special attacks): %s",
		SHOWSECTSTAT(i));
	    notify(player, tempbuff);
	}

    } else if (((MechType(mech) == CLASS_VEH_GROUND) ||
            (MechType(mech) == CLASS_VTOL)) && !doweird) {

        *tempbuff = 0;

        if (MechSections(mech)[FSIDE].recycle) {
            sprintf(tempbuff + strlen(tempbuff),
                    "Vehicle status (charge): %s", SHOWSECTSTAT(FSIDE));
        }

        if (*tempbuff)
            notify(player, tempbuff);
    }

    ammoweapcount =
	FindAmmunition(mech, ammoweap, ammo, ammomax, modearray);
    if (!doweird) {
	notify(player,
	    "==================WEAPON SYSTEMS===========================AMMUNITION========");
	if (MechType(mech) == CLASS_BSUIT)
	    notify(player,
		"------ Weapon --------- [##] Holder ------ Status ||--- Ammo Type ---- Rounds");
	else
	    notify(player,
		"------ Weapon --------- [##] Location ---- Status ||--- Ammo Type ---- Rounds");
    }
    for (loop = 0; loop < NUM_SECTIONS; loop++) {
	count = FindWeapons(mech, loop, weaparray, weapdata, critical);
	if (count <= 0)
	    continue;
	ArmorStringFromIndex(loop, tempbuff, MechType(mech),
	    MechMove(mech));
	sprintf(location, "%-14.14s", tempbuff);
	if (doweird) {
	    strcpy(location, tempbuff);
	    if ((tmpc = strchr(location, ' ')))
		*tmpc = '_';
	}
	for (ii = 0; ii < count; ii++) {
	    if (IsAMS(weaparray[ii]))
		sprintf(weapbuff, " %-16.16s %c%c%c%c%c [%2d] ",
		    &MechWeapons[weaparray[ii]].name[3],
		    ' ',
		    (MechStatus(mech) & AMS_ENABLED) ? ' ' : 'O',
		    (MechStatus(mech) & AMS_ENABLED) ? 'O' : 'F',
		    (MechStatus(mech) & AMS_ENABLED) ? 'N' : 'F',
		    ' ', running_sum + ii);
	    else {
		if (GetPartFireMode(mech, loop, critical[ii]) & OS_MODE)
		    strcpy(tmpbuf, "OS ");
		else
		    tmpbuf[0] = 0;
		strcat(tmpbuf, &MechWeapons[weaparray[ii]].name[3]);
		sprintf(weapbuff, " %-16.16s %c%c%c%c%c [%2d] ", tmpbuf,
		    (GetPartFireMode(mech, loop,
			    critical[ii]) & REAR_MOUNT) ? 'R' : ' ',
		    (((GetPartFireMode(mech, loop,
				    critical[ii]) & OS_USED) ||
			    (GetPartFireMode(mech, loop,
				    critical[ii]) & ROCKET_FIRED)) ? '-'
			: (GetPartFireMode(mech, loop,
				critical[ii]) & OS_MODE) ? 'O' : ' '),
		    GetWeaponAmmoModeLetter(mech, loop, critical[ii]),
		    GetWeaponFireModeLetter(mech, loop, critical[ii]),
		    ((GetPartFireMode(mech, loop, critical[ii]) & ON_TC) &&
			(!(MechCritStatus(mech) & TC_DESTROYED))) ? 'T'
		    : (GetPartFireMode(mech, loop,
			    critical[ii]) & IS_JETTISONED_MODE) ? 'J'
		    : (GetPartFireMode(mech, loop,
			    critical[ii]) & WILL_JETTISON_MODE) ? 'P' :
		    ' ', running_sum + ii);
	    }
	    if (doweird)
		sprintf(weirdbuf + strlen(weirdbuf), "%s|%s",
		    &MechWeapons[weaparray[ii]].name[3], location);
	    strcat(weapbuff, location);

	    if (PartIsBroken(mech, loop, critical[ii]) ||
		PartTempNuke(mech, loop, critical[ii]) == FAIL_DESTROYED)
		strcat(weapbuff, "%ch%cx*****%c  || ");
	    else if (PartIsDisabled(mech, loop, critical[ii]))
		strcat(weapbuff, "%crDISABLE%c|| ");
	    else if (PartTempNuke(mech, loop, critical[ii])) {
		switch (PartTempNuke(mech, loop, critical[ii])) {
		case FAIL_JAMMED:
		    strcat(weapbuff, "%crJAMMED%c || ");
		    break;
		case FAIL_SHORTED:
		    strcat(weapbuff, "%crSHORTED%c|| ");
		    break;
		case FAIL_EMPTY:
		    strcat(weapbuff, " %crEMPTY%c || ");
		    break;
		case FAIL_DUD:
		    strcat(weapbuff, "%crDUD%c    || ");
		    break;
		case FAIL_AMMOJAMMED:
		    strcat(weapbuff, "%crAMMOJAM%c|| ");
		    break;
		}
	    } else if (GetPartFireMode(mech, loop,
	    	critical[ii]) & ROCKET_FIRED)
		strcat(weapbuff, "%ch%cxEmpty%c  || ");
	    else if (weapdata[ii])
		strcat(weapbuff, tprintf(" %2d    || ", weapdata[ii]/WEAPON_TICK+(weapdata[ii]%WEAPON_TICK?1:0)));
	    else if (countDamagedSlotsFromCrit(mech, loop, critical[ii]))
		strcat(weapbuff, "%crDAMAGED%c|| ");
	    else
		strcat(weapbuff, "%cgReady%c  || ");

	    if ((ii + running_sum) < ammoweapcount) {
		ammo_mode =
		    GetWeaponAmmoModeLetter_Model_Mode(ammoweap[ii +
			running_sum], modearray[ii + running_sum]);
		sprintf(weapname, "%-16.16s %c",
		    &MechWeapons[ammoweap[ii + running_sum]].name[3],
		    ammo_mode);
		sprintf(tempbuff, "  %s%3d%s",
		    evaluate_ammo_amount(ammo[ii + running_sum],
			ammomax[ii + running_sum]), ammo[ii + running_sum],
		    "%cn");
		strcat(weapname, tempbuff);
		if (doweird) {
		    if (ammo_mode && ammo_mode != ' ')
			sprintf(weirdbuf + strlen(weirdbuf), "|%s|%d|%c ",
			    &MechWeapons[ammoweap[ii +
				    running_sum]].name[3],
			    ammo[ii + running_sum], ammo_mode);
		    else
			sprintf(weirdbuf + strlen(weirdbuf), "|%s|%d ",
			    &MechWeapons[ammoweap[ii +
				    running_sum]].name[3],
			    ammo[ii + running_sum]);
		}
	    } else {
		if (doweird)
		    strcat(weirdbuf, " ");
		sprintf(weapname, "   ");
	    }
	    strcat(weapbuff, weapname);
	    if (!doweird)
		notify(player, weapbuff);
	}
	running_sum += count;
    }

    if (running_sum < ammoweapcount) {
	while (running_sum < ammoweapcount) {
	    strcpy(astrAmmoSpacer,
		"                                                 || ");
	    ammo_mode =
		GetWeaponAmmoModeLetter_Model_Mode(ammoweap[running_sum],
		modearray[running_sum]);
	    sprintf(weapname, "%-16.16s %c",
		&MechWeapons[ammoweap[running_sum]].name[3], ammo_mode);
	    sprintf(tempbuff, "  %s%3d%s",
		evaluate_ammo_amount(ammo[running_sum],
		    ammomax[running_sum]), ammo[running_sum], "%cn");
	    strcat(astrAmmoSpacer, weapname);
	    strcat(astrAmmoSpacer, tempbuff);

	    notify(player, astrAmmoSpacer);

	    /*
	       if (doweird) {
	       if (ammo_mode && ammo_mode != ' ')
	       sprintf(weirdbuf + strlen(weirdbuf), "|%s|%d|%c ",
	       &MechWeapons[ammoweap[running_sum]].name[3], ammo[running_sum], ammo_mode);
	       else
	       sprintf(weirdbuf + strlen(weirdbuf), "|%s|%d ",
	       &MechWeapons[ammoweap[running_sum]].name[3], ammo[running_sum]);
	       }
	     */
	    running_sum++;
	}
    }
}

int ArmorEvaluateSerious(MECH * mech, int loc, int flag, int *opt)
{
    int a, b, c = -1;

    if (flag & 2) {
	if (SectIntsRepair(mech, loc))
	    c = 5;		/* Blue */
	a = (((b = GetSectInt(mech, loc)) + 1) * 100) / (GetSectOInt(mech,
		loc) + 1);
    } else if (flag & 4) {
	if (SectRArmorRepair(mech, loc))
	    c = 5;		/* Blue */
	a = ((1 + (b =
		    GetSectRArmor(mech,
			loc))) * 100) / (GetSectORArmor(mech, loc) + 1);
    } else {
	if (SectArmorRepair(mech, loc))
	    c = 5;		/* Blue */
	a = ((1 + (b =
		    GetSectArmor(mech, loc))) * 100) / (GetSectOArmor(mech,
		loc) + 1);
    }
    *opt = b;
    if (c > 0)
	return c;
    if (!b)
	return 4;
    if (a > 90)
	return 0;
    if (a > 70)
	return 1;
    if (a > 45)
	return 2;
    return 3;
}

/* bright green, dark green, bright yellow, dark red, black */

static char *armordamcolorstr[] = { "%ch%cg", "%cg", "%ch%cy",
    "%cr", "%ch%cx", "%ch%cb"
};				/* last on is for armor being repaired */
static char *armordamltrstr = "OoxX*?";

char *PrintArmorDamageColor(MECH * mech, int loc, int flag)
{
    int a;

    return armordamcolorstr[ArmorEvaluateSerious(mech, loc, flag, &a)];
}

char *PrintArmorDamageString(MECH * mech, int loc, int flag)
{
    int a;
    static char foo[6];

    for (a = 0; a < 4; a++)
	foo[a] = 0;
    foo[0] = armordamltrstr[ArmorEvaluateSerious(mech, loc, flag, &a)];
    if (flag & 1) {
	if (flag & 8)
	    sprintf(foo, "%1d", (flag & 32) ? ((a + 9) / 10) : a);
	else if (flag & 128)
	    sprintf(foo, "%3d", a);
	else
	    sprintf(foo, "%2d", a);
	if ((flag & 16) && foo[0] == ' ')
	    foo[0] = '0';
    } else
	foo[1] = (flag & 8 ? 0 : foo[0]);
    return foo;
}

char *ArmorKeyInfo(dbref player, int keyn, int owner)
{
    static char str[20];

    if (owner) {
	str[0] = 0;
	return str;
    }
    if (keyn == 1) {
	strcpy(str, "Key");
	return str;
    }
    if (keyn > 6) {
	strcpy(str, "   ");
	return str;
    }
    sprintf(str, "%s%c%c%%c ", armordamcolorstr[6 - keyn],
	armordamltrstr[6 - keyn], armordamltrstr[6 - keyn]);
    return str;
}

/* Params: a = location, b = flag (0/1=owner, 2 = internal, 4 = rear, 8 = minifield), 16 = zero-padding, 32 = MW, 64 = show spaces if destroyed loc */

char *show_armor(MECH * mech, int loc, int flag)
{
    static char foo[32];

    if (!GetSectInt(mech, loc) && !(flag & 64))
	sprintf(foo, (flag & 32) ? " " : (flag & 128) ? "   " : "  ");
    else
	sprintf(foo, "%s%s%%c", PrintArmorDamageColor(mech, loc, flag),
	    PrintArmorDamageString(mech, loc, flag));
    return foo;
}

/* Don't indent the entire next section -- it contains ASCII graphics */
/* *INDENT-OFF* */

/* Fancy idea.. :-) */

/* Just get da desc from string, strtok'ed with \ns. */

/* 1-6 at beginning of line = key */

/* &+num = armor */

/* &-num = rear armor  */

/* && = & */

/* &:num = internal */

/* &(stuff = len 1 column */

/* &)stuff = len 3 column (DSs) */

/* @<num><char> Shown only if loc <num> is intact */

/* !<num><num2><char> Shown only if loc <num> or loc <num2> is intact */

/* 0 on empty line ends the script */


#ifdef WEIGHTVARIABLE_STATUS

/*
 Light Bipedal BattleMech:
          __                   __                    __
       __( 9)__             __(**)__              __( 9)__
      /99|99|99\           /99|99|99\            /99|99|99\
     (99/-\/-\99)         (    \/    )          (99/-\/-\99)
       / /  \ \               /  \                / /  \ \
      (99|  |99)             /    \              (99|  |99)
*/

char *lightmechdesc =
    "7         FRONT                REAR                INTERNAL\n"
    "1          @7_@7_                   @7_@7_                    @7_@7_\n"
    "2       @2_@2_@7(&+7@7)@3_@3_             @2_@2_@7(@7*@7*@7)@3_@3_              @2_@2_@7(&:7@7)@3_@3_\n"
    "3      @2/&+2!24|&+4!43|&+3@3\\           @2/&-2!24|&-4!34|&-3@3\\            @2/&:2!24|&:4!34|&:3@3\\\n"
    "4     @0(&+0!05/@2-@4\\@4/@3-!16\\&+1@1)         @0(    @4\\@4/    @1)          @0(&:0!05/@2-@4\\@4/@3-!16\\&:1@1)\n"
    "5       @5/ @5/  @6\\ @6\\               @5/  @6\\                @5/ @5/  @6\\ @6\\\n"
    "6      @5(&+5@5|  @6|&+6@6)             @5/    @6\\              @5(&:5@5|  @6|&:6@6)\n0";

/*
 Heavy Bipedal Battlemech
          __                   __                    __
       __( 9)__             __(**)__              __( 9)__
      /99|99|99\           /99|99|99\            /99|99|99\
     (99/|==|\99)         (   |==|   )          (99/|==|\99)
       /  /\  \               /  \                /  /\  \
      (99/  \99)             /    \              (99/  \99)

*/

char *heavymechdesc =
    "7         FRONT                REAR                INTERNAL\n"
    "1          @7_@7_                   @7_@7_                    @7_@7_\n"
    "2       @2_@2_@7(&+7@7)@3_@3_             @2_@2_@7(@7*@7*@7)@3_@3_              @2_@2_@7(&:7@7)@3_@3_\n"
    "3      @2/&+2!24|&+4!43|&+3@3\\           @2/&-2!24|&-4!34|&-3@3\\            @2/&:2!24|&:4!34|&:3@3\\\n"
    "4     @0(&+0!05/@4|@4=@4=@4|!16\\&+1@1)         @0(   !54|@4=@4=!64|   @1)          @0(&:0!05/@4|@4=@4=@4|!16\\&:1@1)\n"
    "5       @5/  @5/@6\\  @6\\               @5/  @6\\                @5/  @5/@6\\  @6\\\n"
    "6      @5(&+5@5/  @6\\&+6@6)             @5/    @6\\              @5(&:5@5/  @6\\&:6@6)\n0";

/*
 Medium Bipedal Battlemech
          __                   __                    __
       __( 9)__               (**)                  ( 9)
      /99|99|99\           /99|99|99\            /99|99|99\
     (99/\__/\99)         (   \__/   )          (99/\__/\99)
       / /  \ \               /  \                / /  \ \
      (99|  |99)             /    \              (99|  |99)

*/
char *mediummechdesc =

    "7         FRONT                REAR                INTERNAL\n"
    "1          @7_@7_                   @7_@7_                    @7_@7_\n"
    "2       @2_@2_@7(&+7@7)@3_@3_             @2_@2_@7(@7*@7*@7)@3_@3_              @2_@2_@7(&:7@7)@3_@3_\n"
    "3      @2/&+2!24|&+4!43|&+3@3\\           @2/&-2!24|&-4!34|&-3@3\\            @2/&:2!24|&:4!34|&:3@3\\\n"
    "4     @0(&+0!05/@4\\@4_@4_@4/!16\\&+1@1)         @0(   @4\\@4_@4_@4/   @1)          @0(&:0!05/@4\\@4_@4_@4/!16\\&:1@1)\n"
    "5       @5/ @5/  @6\\ @6\\               @5/  @6\\                @5/ @5/  @6\\ @6\\\n"
    "6      @5(&+5@5|  @6|&+6@6)             @5/    @6\\              @5(&:5@5|  @6|&:6@6)\n0";

/*
 Assault Bipedal Battlemech
          __                   __                    __
       __[ 9]__             __[**]__              __[ 9]__
      /99|99|99\           /99|99|99\            /99|99|99\
     (99||==||99)         (   ||||   )          (99||==||99)
       / \||/ \               \||/                / \||/ \
      (99/  \99)             /    \              (99/  \99)

*/

char *assaultmechdesc =
    "7         FRONT                REAR                INTERNAL\n"
    "1          @7_@7_                   @7_@7_                    @7_@7_\n"
    "2       @2_@2_@7[&+7@7]@3_@3_             @2_@2_@7[@7*@7*@7]@3_@3_              @2_@2_@7[&:7@7]@3_@3_\n"
    "3      @2/&+2!24|&+4!43|&+3@3\\           @2/&-2!24|&-4!34|&-3@3\\            @2/&:2!24|&:4!34|&:3@3\\\n"
    "4     @0(&+0@2|@4|@4=@4=@4|@3|&+1@1)         @0(   @4|@4|@4|@4|   @1)          @0(&:0@2|@4|@4=@4=@4|@3|&:1@1)\n"
    "5       @5/ @4\\@4|@4|@4/ @6\\               @4\\@4|@4|@4/                @5/ @4\\@4|@4|@4/ @6\\\n"
    "6      @5(&+5@5/  @6\\&+6@6)             @5/    @6\\              @5(&:5@5/  @6\\&:6@6)\n0";


#else /* WEIGHTVARIABLE_STATUS */

/* 
  Bipedal BattleMech:
         ( 9)                 (**)                  ( 9)
      /99|99|99\           /99|99|99\            /99|99|99\
     (99/ || \99)         (   |  |   )          (99/ || \99)
       /  /\  \               /  \                /  /\  \
      (99/  \99)             /    \              (99/  \99)
*/

char *mechdesc =
    "1         FRONT                REAR                INTERNAL\n"
    "2         @7(&+7@7)                 @7(@7*@7*@7)                  @7(&:7@7)\n"
    "3      @2/&+2!24|&+4!43|&+3@3\\           @2/&-2!24|&-4!34|&-3@3\\            @2/&:2!24|&:4!34|&:3@3\\\n"
    "4     @0(&+0!05/ !54|!64| !16\\&+1@1)         @0(   !54|  !64|   @1)          @0(&:0!05/ !54|!64| !16\\&:1@1)\n"
    "5       @5/  @5/@6\\  @6\\               @5/  @6\\                @5/  @5/@6\\  @6\\\n"
    "6      @5(&+5@5/  @6\\&+6@6)             @5/    @6\\              @5(&:5@5/  @6\\&:6@6)\n0";

#endif /* WEIGHTVARIABLE_STATUS */

/*
  Quadruped BattleMech:
         FRONT                REAR                INTERNAL
           ___                                      ___
   ___  __/ 9 \_  ___                       ___  __/ 9 \_  ___
  ( 99\(99|99|99)/99 )     (99|99|99)      ( 99\(99|99|99)/99 )
   \ \(99/    \99)/ /                       \ \(99/    \99)/ /
    \ \||      ||/ /                         \ \||      ||/ /
    /_/__\    /__\_\                         /_/__\    /__\_\
*/

char *quaddesc =
    "7         FRONT                REAR                INTERNAL\n"
    "1           @7_@7_@7_                                      @7_@7_@7_\n"
    "2   @5_@5_@5_  @2_@2_@7/&+7 @7\\@3_  @6_@6_@6_                       @5_@5_@5_  @2_@2_@7/&:7 @7\\@3_  @6_@6_@6_\n"
    "3  @5( &+5@5\\@2(&+2!24|&+4!43|&+3@3)@6/&+6 @6)     @2(&-2!24|&-4!43|&-3@3)      @5( &:5@5\\@2(&:2!24|&:4!43|&:3@3)@6/&:6 @6)\n"
    "4   @5\\ @5\\!05(&+0@0/    @1\\&+1!16)@6/ @6/                       @5\\ @5\\!05(&:0@0/    @1\\&:1!16)@6/ @6/\n"
    "5    @5\\ @5\\@0|@0|      @1|@1|@6/ @6/                         @5\\ @5\\@0|@0|      @1|@1|@6/ @6/\n"
    "6    @5/@5_!05/@0_@0_@0\\    @1/@1_@1_!16\\@6_@6\\                         @5/@5_!05/@0_@0_@0\\    @1/@1_@1_!16\\@6_@6\\\n0";

/*
  MechWarrior
                       (9)
                     /9|9|9\
                    (9/ _ \9)
                     (9/ \9)
*/

char *mwdesc =
    "1                       @7(&:7@7)\n"
    "2                     @2/&:2@4|&:4@4|&:3@3\\\n"
    "6                    @0(&:0@0/ @4_ @1\\&:1@1)\n"
    "7                     @5(&:5@5/ @6\\&:6@6)\n0";


/*
  Naval vehicle

         FRONT                    INTERNAL
         ./99\.                    ./99\. 
        |'.--.`|                  |'.--.`|
        |`|99|'|                  |`|99|'|
        |\`--'/|                  |\`--'/|  
        |99><99|                  |99><99|  
        |./||\.|                  |./||\.|  
        || 99 ||                  || 99 ||  
         `~~~~'                    `~~~~' 
*/

char *shipdesc =
    "7         FRONT                    INTERNAL\n"
    "1         @2.@2/&+2@2\\@2.                    @2.@2/&:2@2\\@2. \n"
    "2        @2|@2'@4.@4-@4-@4.@2`@2|                  @2|@2'@4.@4-@4-@4.@2`@2|\n"
    "3        @2|@2`@4|&+4@4|@2'@2|                  @2|@2`@4|&:4@4|@2'@2|\n"
    "4        !20|!04\\@4`@4-@4-@4'!14/!12|                  !20|!04\\@4`@4-@4-@4'!14/!12|  \n"
    "5        @0|&+0@0>@1<&+1@1|                  @0|&:0@0>@1<&:1@1|  \n"
    "7        @0|!03.!03/!03|!13|!13\\!13.@1|                  @0|!03.!03/!03|!13|!13\\!13.@1|  \n"
    "7        @0|@3| &+3 @3|@1|                  @0|@3| &:3 @3|@1|  \n"
    "7         !03`@3~@3~@3~@3~!13'                    !03`@3~@3~@3~@3~!13' \n"
    "0";

/*
  Hydrofoil vehicle:
         FRONT                    INTERNAL
         ./\.                       ./\.
      ___|99|___                 ___|99|___
      ---|><|---                 ---|><|---
        ||99||                     ||99|| 
     __|99::99|__               __|99::99|__
     --_|'99`|_--               --_|'99`|_--
        `~~~~'                     `~~~~'
*/

char *foildesc =
    "7         FRONT                    INTERNAL\n"
    "7         @2.@2/@2\\@2.                       @2.@2/@2\\@2.\n"
    "1      @2_@2_@2_@2|&+2@2|@2_@2_@2_                 @2_@2_@2_@2|&:2@2|@2_@2_@2_\n"
    "2      @2-@2-@2-@2|!24>!24<@2|@2-@2-@2-                 @2-@2-@2-@2|!24>!24<@2|@2-@2-@2-\n"
    "3        !04|@4|&+4@4|!14|                     !04|@4|&:4@4|!14| \n"
    "4     @0_@0_@0|&+0!01:!01:&+1@1|@1_@1_               @0_@0_@0|&:0!01:!01:&:1@1|@1_@1_\n"
    "5     @0-@0-@0_@0|!03'&+3!13`@1|@1_@1-@1-               @0-@0-@0_@0|!03'&:3!13`@1|@1_@1-@1-\n"
    "7        !03`@3~@3~@3~@3~!13'                     !03`@3~@3~@3~@3~!13'\n"
    "0";

/*
  Submarine vehicle:

        FRONT                     INTERNAL
         --                         --      
       =|99|=                     =|99|=    
       |\__/|                     |\__/|    
      | |99| |                   | |99| |   
      |99||99|                   |99||99|   
       \|--|/                     \|--|/    
       =|99|=                     =|99|=    
*/

char *subdesc =
    "7        FRONT                     INTERNAL\n"
    "1         @2-@2-                         @2-@2-      \n"
    "1       @2=@2|&+2@2|@2=                     @2=@2|&:2@2|@2=    \n"
    "1       !02|!24\\@4_@4_!24/!12|                     !02|!24\\@4_@4_!24/!12|    \n"
    "1      @0| @4|&+4@4| @1|                   @0| @4|&:4@4| @1|   \n"
    "1      @0|&+0@0|@1|&+1@1|                   @0|&:0@0|@1|&:1@1|   \n"
    "1       @0\\!03|@3-@3-!13|@1/                     @0\\!03|@3-@3-!13|@1/    \n"
    "1       !03=@3|&+3@3|!13=                     !03=@3|&:3@3|!13=    \n"
    "0";

/*
  Aero
            /^^\
          /|`99'|\
   |     |_|.--.|_|     |
   |      /||99||\      |
   |    /'.-|--|-.`\    |
   |---'99| |99| |99`---|
   `--_____\||||/_____--'
           `=99='
 */

char *aerodesc =
    "7              @0/@0^@0^@0\\\n"
    "1            @1/@1|@0`&+0@0'@2|@2\\\n"
    "2     @1|     @1|@1_@1|@4.@4-@4-@4.@2|@2_@2|     @2|\n"
    "3     @1|      @1/@1|@4|&+4|@4|@2\\      @2|\n"
    "4     @1|    @1/@1'@1.@1-@3|@3-@3-@3|@2-@2.@2`@2\\    @2|\n"
    "5     @1|@1-@1-@1-'&+1@1| @3|&+3@3| @2|&+2`---@2|\n"
    "6     @1`@1-@1-@1_@1_@1_@1_@1_!15\\@5|@5|@5|@5|!25/@2_@2_@2_@2_@2_@2-@2-'\n"
    "7             @1`@5=&+5@5=@2'\n0";

/*
  Spheroid Dropship
          FRONT
          _______
         /`.999,'\
        |999|~|999|
        |  |   |  |
        |999|_|999|
         \,'999`./
          ~~~~~~~
*/

char *spher_ds_desc =
    "7          FRONT\n"
    "1          @1_@1_@1_@1_@1_@1_@1_\n"
    "2         @1/!15`!15.&)+5!05,!05'@0\\\n"
    "3        @1|&)+1@1|@1~@0|&)+0@0|\n"
    "4        !12|  !12|   !03|  !03|\n"
    "5        @2|&)+2@2|@4_@3|&)+3@3|\n"
    "6         @2\\!24,!24'&)+4!34`!34.@3/\n"
    "7          @4~@4~@4~@4~@4~@4~@4~\n0";

/*
  Aerodine Dropship
       .--.     
     ,`.99.'.   
     |.|__|.|   
    | | 99 | |  
    | |:  :| |  
   |'99|--|99`| 
   |  .'99`.  | 
   `|`_\~~/_`|' 
*/

char *aerod_ds_desc =
    "7           .--.\n"
    "1         ,`.&+5.'.\n"
    "2         |.|__|.|\n"
    "3        | | ?? | |\n"
    "4        | |:  :| |\n"
    "5       |'&+1|--|&+0`|\n"
    "6       |  .'&+4`.  |\n"
    "7       `|`_\\~~/_`|'\n0";

/*
  Vehicle (with turret):
          FRONT                                INTERNAL
         ,`.99,'.                              ,`.99,'.
        |  |__|  |                            |  |__|  |
        |  |99|  |                            |  |99|  |
        |99|~~|99|                            |99|~~|99|
         \,'99`./                              \,'99`./
          ~~~~~~                                ~~~~~~
*/

char *vehdesc =
    "1          FRONT                                INTERNAL\n"
    "2         @0,@0`!02.&+2!12,@1'@1.                              @0,@0`!02.&:2!12,@1'@1.\n"
    "3        @0|  !02|@4_@4_!12|  @1|                            @0|  !02|@4_@4_!12|  @1|\n"
    "4        @0|  @4|&+4@4|  @1|                            @0|  @4|&:4@4|  @1|\n"
    "5        @0|&+0@4|@4~@4~@4|&+1@1|                            @0|&:0@4|@4~@4~@4|&:1@1|\n"
    "6         @0\\!03,!03'&+3!13`!13.@1/                              @0\\!03,!03'&:3!13`!13.@1/\n"
    "7          @3~@3~@3~@3~@3~@3~                                @3~@3~@3~@3~@3~@3~\n0";

/*
  Vehicle (no turret, by design)
          FRONT                                INTERNAL
         ,`.99,'.                              ,`.99,'.
        |  |__|  |                            |  |__|  |
        |  |  |  |                            |  |  |  |
        |99|~~|99|                            |99|~~|99|
         \,'99`./                              \,'99`./
          ~~~~~~                                ~~~~~~
*/

char *veh_not_desc =
    "1          FRONT                                INTERNAL\n"
    "2         @0,@0`!02.&+2!12,@1'@1.                              @0,@0`!02.&:2!12,@1'@1.\n"
    "3        @0|  !02|@2_@2_!12|  @1|                            @0|  !02|@2_@2_!12|  @1|\n"
    "4        @0|  @0|  @1|  @1|                            @0|  @0|  @1|  @1|\n"
    "5        @0|&+0@0|!01~!01~@1|&+1@1|                            @0|&:0@0|!01~!01~@1|&:1@1|\n"
    "6         @0\\!03,!03'&+3!13`!13.@1/                              @0\\!03,!03'&:3!13`!13.@1/\n"
    "7          @3~@3~@3~@3~@3~@3~                                @3~@3~@3~@3~@3~@3~\n0";

/*
  VTOL
        FRONT                               INTERNAL
     .   ..   .                            .   ..   .   
     \\ `__` //                            \\ `__` //   
      \\.99.//                              \\.99.//    
     __\\  //__                            __\\  //__   
    (99|(99)|99)                          (99|(99)|99)  
    *--|// \\--*                          *--|// \\--*  
       //99 \\                               //99 \\    
      //\__/ \\                             //\__/ \\   
      ~       ~                             ~       ~   
*/


char *vtoldesc =
    "7        FRONT                               INTERNAL\n"
    "7     @5.   @2.@2.   @5.                            @5.   @2.@2.   @5.   \n"
    "1     @5\\@5\\ @2`@2_@2_@2` @5/@5/                            @5\\@5\\ @2`@2_@2_@2` @5/@5/   \n"
    "2      @5\\@5\\@2.&+2@2.@5/@5/                              @5\\@5\\@2.&:2@2.@5/@5/    \n"
    "3     @0_@0_@5\\@5\\  @5/@5/@1_@1_                            @0_@0_@5\\@5\\  @5/@5/@1_@1_   \n"
    "4    @0(&+0!05|@5(&+5@5)!15|&+1@1)                          @0(&:0!05|@5(&:5@5)!15|&:1@1)  \n"
    "5    @0*@0-@0-@0|@5/@5/ @5\\@5\\@1-@1-@1*                          @0*@0-@0-@0|@5/@5/ @5\\@5\\@1-@1-@1*  \n"
    "6       @5/@5/&+3 @5\\@5\\                               @5/@5/&:3 @5\\@5\\    \n"
    "7      @5/@5/@3\\@3_@3_@3/ @5\\@5\\                             @5/@5/@3\\@3_@3_@3/ @5\\@5\\   \n"
    "7      @5~       @5~                             @5~       @5~   \n0";

/* 
 Battlesuit

 SQUAD STATUS
  Member#      1  2  3  4  5
   Health      99 99 99 99 99
   Armor       99 99 99 99 99

*/


char *bsuitdesc =
    "7 SQUAD STATUS\n"
    "7  Member#      @01  @12  @23  @34  @45  @56  @67  @78\n"
    "7   Health      &:0 &:1 &:2 &:3 &:4 &:5 &:6 &:7\n"
    "7   Armor       &+0 &+1 &+2 &+3 &+4 &+5 &+6 &+7\n"
    "7\n0";

/* *INDENT-ON* */


/* See if the 'mech has a 'custom' template (@mechstatus attr)
 * if so, exec() it to evaluate color/newlines.
 */
static int get_statustemplate_attr(dbref player, MECH * mech, char *result)
{
    char *buf, *bufc, *statattr = silly_atr_get(mech->mynum, A_MECHSTATUS);

    if (!statattr || !*statattr)
	return 0;
    buf = bufc = alloc_lbuf("mech status");
    exec(buf, &bufc, 0, player, mech->mynum,
	EV_STRIP_AROUND | EV_NO_COMPRESS | EV_NO_LOCATION | EV_NOFCHECK |
	EV_NOTRACE | EV_FIGNORE, &statattr, NULL, 0);
    /* this is safe because tmpbuf is larger than LBUF_SIZE */
    strcpy(result, buf);
    strcat(result, "\n0");
    free_lbuf(buf);
    return 1;
}

void PrintArmorStatus(dbref player, MECH * mech, int owner)
{
    char tmpbuf[8192];
    char *p, *q, *r;
    char destbuf[8192];
    int flag;
    int gflag = 0;
    int odd = 0;

    /* All we need is proper source for stuff */
    if (!get_statustemplate_attr(player, mech, tmpbuf)) {
	switch (MechType(mech)) {
	case CLASS_MW:
	    strcpy(tmpbuf, mwdesc);
	    gflag |= 8 | 32;
	    break;
	case CLASS_MECH:
	    if (MechIsQuad(mech))
		strcpy(tmpbuf, quaddesc);
#ifdef WEIGHTVARIABLE_STATUS
	    else {
		if (MechTons(mech) <= 35)
		    strcpy(tmpbuf, lightmechdesc);
		else if (MechTons(mech) > 35 && MechTons(mech) <= 55)
		    strcpy(tmpbuf, mediummechdesc);
		else if (MechTons(mech) > 55 && MechTons(mech) <= 75)
		    strcpy(tmpbuf, heavymechdesc);
		else if (MechTons(mech) > 75)
		    strcpy(tmpbuf, assaultmechdesc);
		else
		    strcpy(tmpbuf, heavymechdesc);
	    }
#else /* WEIGHTVARIABLE_STATUS */
	    else
		strcpy(tmpbuf, mechdesc);
#endif /* WEIGHTVARIABLE_STATUS */
	    break;
	case CLASS_BSUIT:
	    strcpy(tmpbuf, bsuitdesc);
	    break;
	case CLASS_VTOL:
	    strcpy(tmpbuf, vtoldesc);
	    break;
	case CLASS_AERO:
	    gflag |= 16;
	    strcpy(tmpbuf, aerodesc);
	    break;
	case CLASS_DS:
	    strcpy(tmpbuf, aerod_ds_desc);
	    gflag |= 64;
	    break;
	case CLASS_SPHEROID_DS:
	    strcpy(tmpbuf, spher_ds_desc);
	    break;
	case CLASS_VEH_GROUND:
	    if (GetSectOInt(mech, TURRET))
		strcpy(tmpbuf, vehdesc);
	    else
		strcpy(tmpbuf, veh_not_desc);
	    break;
	case CLASS_VEH_NAVAL:
	    if (MechMove(mech) == MOVE_FOIL)
		strcpy(tmpbuf, foildesc);
	    else if (MechMove(mech) == MOVE_HULL)
		strcpy(tmpbuf, shipdesc);
	    else
		strcpy(tmpbuf, subdesc);
	    break;
	default:
	    strcpy(tmpbuf,
		" This 'toy' is of unknown type to me. It has yet to be templated\n for status.\n0");
	    break;
	}
    }
    p = strtok(tmpbuf, "\n");
    while (p && *p != '0') {
	if (*p >= '1' && *p <= '7')
	    strcpy(destbuf, ArmorKeyInfo(player, (int) *p - '0', owner));
	else
	    destbuf[0] = 0;
	r = &destbuf[strlen(destbuf)];
	for (q = p + 1; *q; q++)
	    if (*q == '@' && isdigit(*(q + 1))) {
		q++;
		if (GetSectInt(mech, (int) (*q - '0')))
		    *r++ = *(q + 1);
		else
		    *r++ = ' ';
		q++;
	    } else if (*q == '!' && isdigit(*(q + 1)) && isdigit(*(q + 2))) {
		q++;
		if (GetSectInt(mech, (int) (*q - '0')) ||
		    GetSectInt(mech, (int) (*(q + 1) - '0')))
		    *r++ = *(q + 2);
		else
		    *r++ = ' ';
		q++;
		q++;
	    } else if (*q == '&' && (*(q + 1) == '+' || *(q + 1) == '-' ||
		    *(q + 1) == ':' || *(q + 1) == '(' ||
		    *(q + 1) == ')')) {
		if (*(q + 1) == '(') {
		    gflag |= 8;
		    q++;
		    odd = 1;
		}
		if (*(q + 1) == ')') {
		    gflag |= 128;
		    q++;
		    odd = 1;
		}
		/* Geez, we got armor token to distribute here. */
		flag = owner;
		q++;
		switch (*q) {
		case '-':
		    flag += 2;
		case ':':
		    flag += 2;
		    break;
		}
		strcpy(r, show_armor(mech, (int) (*(q + 1) - '0'),
			flag | gflag));
		r += strlen(r);
		if (odd) {
		    gflag = 0;
		    odd = 0;
		}
		q++;
	    } else
		*r++ = *q;
	*r = 0;
	notify(player, destbuf);
	p = strtok(NULL, "\n");
    }
}

int hasPhysical(MECH * objMech, int wLoc, int wPhysType)
{
    int wType;
    int wSize;

    switch (wPhysType) {
    case PHY_AXE:
	wType = AXE;
	wSize = MechTons(objMech) / 15;
	break;

    case PHY_SWORD:
	wType = SWORD;
	wSize = MechTons(objMech) / 15;
	break;

    case PHY_MACE:
	wType = MACE;
	wSize = MechTons(objMech) / 15;
	break;

    default:
	return 0;
    }

    return FindObjWithDest(objMech, wLoc, I2Special(wType)) >= wSize;
}

int canUsePhysical(MECH * objMech, int wLoc, int wPhysType)
{
    int tRet = 1;

    switch (wPhysType) {
    case PHY_AXE:
    case PHY_SWORD:
	if (SectIsDestroyed(objMech, wLoc))
	    tRet = 0;
	else if (!OkayCritSectS2(objMech, wLoc, 0, SHOULDER_OR_HIP))
	    tRet = 0;
	else if (!OkayCritSectS2(objMech, wLoc, 3, HAND_OR_FOOT_ACTUATOR))
	    tRet = 0;
	break;

    case PHY_MACE:
	if (SectIsDestroyed(objMech, LARM) ||
	    SectIsDestroyed(objMech, RARM))
	    tRet = 0;
	else if ((!OkayCritSectS2(objMech, LARM, 0, SHOULDER_OR_HIP)) ||
	    (!OkayCritSectS2(objMech, RARM, 0, SHOULDER_OR_HIP)))
	    tRet = 0;
	else if ((!OkayCritSectS2(objMech, LARM, 3, HAND_OR_FOOT_ACTUATOR))
	    || (!OkayCritSectS2(objMech, RARM, 3, HAND_OR_FOOT_ACTUATOR)))
	    tRet = 0;
	break;

    default:
	tRet = 0;
    }

    return tRet;
}