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.startup.c,v 1.2 2005/06/23 18:31:42 av1-op Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1997 Markus Stenberg
 *  Copyright (c) 1998-2002 Thomas Wouters
 *  Copyright (c) 2000-2002 Cord Awtry
 *       All rights reserved
 *
 * Last modified: Thu Jul  9 06:59:34 1998 fingon
 *
 */

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

#include "mech.h"
#include "mech.events.h"
#include "autopilot.h"
#include "p.btechstats.h"
#include "p.mech.utils.h"
#include "p.econ_cmds.h"
#include "p.mech.tech.h"
#include "p.mech.build.h"
#include "p.mech.update.h"
#include "p.mech.pickup.h"
#include "p.mech.tag.h"
#include "p.bsuit.h"
#include "p.bsuit.h"
#include "p.mech.combat.misc.h"

/* NOTE: Number of boot messages for both types _MUST_ match */

#define BOOTCOUNT 6

char *bsuit_bootmsgs[BOOTCOUNT] = {
    "%%cg->         Initializing powerpack       <-%%c",
    "%%cg->          Powerpack operational       <-%%c",
    "%%cg->             Suit sealed              <-%%c",
    "%%cg->  Computer system is now operational  <-%%c",
    "%%cg->         Air pressure steady          <-%%c",
    "       %%cg- %%cr-=>%%ch%%cw All systems go!%%c %%cr<= %%cg-%%c"
};

char *aero_bootmsgs[BOOTCOUNT] = {
    "%%cg->       Main reactor is now online    <-%%c",
    "%%cg->            Thrusters online         <-%%c",
    "%%cg->  Main computer system is now online <-%%c",
    "%%cg->     Scanners are now operational    <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "       %%cg- %%cr-=>%%ch%%cw All systems go!%%c %%cr<= %%cg-%%c"
};

char *bootmsgs[BOOTCOUNT] = {
    "%%cg->       Main reactor is now online    <-%%c",
    "%%cg->         Gyros are now stable        <-%%c",
    "%%cg->  Main computer system is now online <-%%c",
    "%%cg->     Scanners are now operational    <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "   %%cg- %%cr-=>%%ch%%cw All systems operational!%%c %%cr<=- %%cg-%%c"
};

char *hover_bootmsgs[BOOTCOUNT] = {
    "%%cg->  Powerplant initialized and online  <-%%c",
    "%%cg->   Checking plenum chamber status    <-%%c",
    "%%cg->         Verifying fan status        <-%%c",
    "%%cg->     Scanners are now operational    <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "   %%cg- %%cr-=>%%ch%%cw All systems operational!%%c %%cr<=- %%cg-%%c"
};

char *track_bootmsgs[BOOTCOUNT] = {
    "%%cg->  Powerplant initialized and online  <-%%c",
    "%%cg->      Auto-aligning drive wheels     <-%%c",
    "%%cg->       Adjusting track tension       <-%%c",
    "%%cg->     Scanners are now operational    <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "   %%cg- %%cr-=>%%ch%%cw All systems operational!%%c %%cr<=- %%cg-%%c"
};

char *wheel_bootmsgs[BOOTCOUNT] = {
    "%%cg->  Powerplant initialized and online  <-%%c",
    "%%cg->  Performing steering system checks  <-%%c",
    "%%cg->        Checking wheel status        <-%%c",
    "%%cg->     Scanners are now operational    <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "   %%cg- %%cr-=>%%ch%%cw All systems operational!%%c %%cr<=- %%cg-%%c"
};

char *vtol_bootmsgs[BOOTCOUNT] = {
    "%%cg->     Initializing main powerplant    <-%%c",
    "%%cg-> Main turbine online and operational <-%%c",
    "%%cg->      Rotor transmission engaged     <-%%c",
    "%%cg->     Scanners are now operational    <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "   %%cg- %%cr-=>%%ch%%cw All systems operational!%%c %%cr<=- %%cg-%%c"
};

char *naval_bootmsgs[BOOTCOUNT] = {
    "%%cg->       Main reactor is now online    <-%%c",
    "%%cg->  Main computer system is now online <-%%c",
    "%%cg->   Hull integrity monitoring online  <-%%c",
    "%%cg-> Ballast and propulsion are nominal  <-%%c",
    "%%cg-> Targeting system is now operational <-%%c",
    "   %%cg- %%cr-=>%%ch%%cw All systems operational!%%c %%cr<=- %%cg-%%c"
};

#define SSLEN MechType(mech) == CLASS_BSUIT ? 1 : (STARTUP_TIME / BOOTCOUNT)

static void mech_startup_event(MUXEVENT * e)
{
    MECH *mech = (MECH *) e->data;
    int timer = (int) e->data2;
    MAP *mech_map;
    int i;

    if(is_aero(mech)) {
        mech_printf(mech, MECHALL, aero_bootmsgs[timer]);
    } else if(MechType(mech) == CLASS_BSUIT) {
        mech_printf(mech, MECHALL, bsuit_bootmsgs[timer]);
    } else switch(MechMove(mech)) {
        case MOVE_HOVER:
            mech_printf(mech, MECHALL, hover_bootmsgs[timer]);
            break;
        case MOVE_TRACK:
            mech_printf(mech, MECHALL, track_bootmsgs[timer]);
            break;
        case MOVE_WHEEL:
            mech_printf(mech, MECHALL, wheel_bootmsgs[timer]);
            break;
        case MOVE_VTOL:
            mech_printf(mech, MECHALL, vtol_bootmsgs[timer]);
            break;
        case MOVE_BIPED:
            mech_printf(mech, MECHALL, bootmsgs[timer]);
            break;
        case MOVE_HULL:
        case MOVE_FOIL:
        case MOVE_SUB:
            mech_printf(mech, MECHALL, naval_bootmsgs[timer]);
            break;
        default:
            mech_printf(mech, MECHALL, bootmsgs[timer]);
            break;
    }
    timer++;

    /* Check if the unit is in water and if it should die */
    /* Make sure it checks pretty early in the startup */
    if (timer>=2) {

        if (InWater(mech) && (MechType(mech) == CLASS_VEH_GROUND || 
                    MechType(mech) == CLASS_VTOL || 
                    MechType(mech) == CLASS_BSUIT ||
                    MechType(mech) == CLASS_AERO ||
                    MechType(mech) == CLASS_DS) &&
                !(MechSpecials2(mech) & WATERPROOF_TECH)) {

            mech_notify(mech, MECHALL, "Water floods your engine and your unit "
                    "becomes inoperable.");
            MechLOSBroadcast(mech, "emits some bubbles as its engines are flooded.");
            DestroyMech(mech, mech, 0);
            return;

        }
    }

    if (timer < BOOTCOUNT) {
        MECHEVENT(mech, EVENT_STARTUP, mech_startup_event, SSLEN, timer);
        return;
    }
    if ((mech_map = getMap(mech->mapindex)))
        for (i = 0; i < mech_map->first_free; i++)
            mech_map->LOSinfo[mech->mapnumber][i] = 0;
    initialize_pc(MechPilot(mech), mech);
    Startup(mech);
    MarkForLOSUpdate(mech);
    SetCargoWeight(mech);
    UnSetMechPKiller(mech);
    MechLOSBroadcast(mech, "powers up!");
    MechVerticalSpeed(mech) = 0;
    EvalBit(MechSpecials(mech), SS_ABILITY, ((MechPilot(mech) > 0 &&
                    isPlayer(MechPilot(mech))) ? char_getvalue(MechPilot(mech),
                    "Sixth_Sense") : 0));
    if (FlyingT(mech)) {
        if (MechZ(mech) <= MechElevation(mech))
            MechStatus(mech) |= LANDED;
    }
    MechComm(mech) = DEFAULT_COMM;
    if (isPlayer(MechPilot(mech)) && !Quiet(mech->mynum)) {
        MechComm(mech) =
            char_getskilltarget(MechPilot(mech), "Comm-Conventional", 0);
        MechPer(mech) =
            char_getskilltarget(MechPilot(mech), "Perception", 0);
    } else {
        MechComm(mech) = 6;
        MechPer(mech) = 6;
    }
    MechCommLast(mech) = 0;
    MechLastStartup(mech) = mudstate.now;
    if (is_aero(mech) && !Landed(mech)) {
        MechDesiredAngle(mech) = -90;
        MechStartFX(mech) = 0.0;
        MechStartFY(mech) = 0.0;
        MechStartFZ(mech) = 0.0;
        MechDesiredSpeed(mech) = MechMaxSpeed(mech);
        MaybeMove(mech);
    }
    UnZombifyMech(mech);
}

void mech_startup(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;
    int n;

    cch(MECH_CONSISTENT | MECH_MAP | MECH_PILOT_CON);
    skipws(buffer);
    DOCHECK(!(Good_obj(player) && (Alive(player) || isRobot(player) ||
		Hardcode(player))), "That is not a valid player!");
    DOCHECK(MechType(mech) == CLASS_MW &&
	Started(mech), "You're up and about already!");
    DOCHECK(Towed(mech),
	"You're being towed! Wait for drop-off before starting again!");
    DOCHECK(mech->mapindex < 0, "You are not on any map!");
    DOCHECK(Destroyed(mech), "This 'Mech is destroyed!");
    DOCHECK(Started(mech), "This 'Mech is already started!");
    DOCHECK(Starting(mech), "This 'Mech is already starting!");
    DOCHECK(Extinguishing(mech), "You're way too busy putting out fires!");
    n = figure_latest_tech_event(mech);
    DOCHECK(n,
	"This 'Mech is still under repairs (see checkstatus for more info)");
    DOCHECK(MechHeat(mech) > 30.,
	"This 'Mech is too hot to start back up!");
    DOCHECK(In_Character(mech->mynum) && !Wiz(player) &&
	(char_lookupplayer(GOD, GOD, 0, silly_atr_get(mech->mynum,
		    A_PILOTNUM)) != player), "This isn't your mech!");
    n = 0;
    if (*buffer && !strncasecmp(buffer, "override", strlen(buffer))) {
	DOCHECK(!WizP(player), "Insufficient access!");
	n = BOOTCOUNT - 1;
    }
    MechPilot(mech) = player;

/*   if (In_Character(mech->mynum)) */
    /* Initialize the PilotDamage from the new pilot */
    fix_pilotdamage(mech, player);
    mech_notify(mech, MECHALL, "Startup Cycle commencing...");
    MechSections(mech)[RLEG].recycle = 0;
    MechSections(mech)[LLEG].recycle = 0;
    MechSections(mech)[RARM].recycle = 0;
    MechSections(mech)[LARM].recycle = 0;
    MechSections(mech)[RTORSO].recycle = 0;
    MechSections(mech)[LTORSO].recycle = 0;
    MECHEVENT(mech, EVENT_STARTUP, mech_startup_event, (n ||
	    MechType(mech) == CLASS_MW) ? 1 : SSLEN,
	MechType(mech) == CLASS_MW ? BOOTCOUNT - 1 : n);
}

void mech_shutdown(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    if (!CheckData(player, mech))
        return;
    DOCHECK((!Started(mech) && !Starting(mech)), 
            "The 'mech hasn't been started yet!");
    DOCHECK(MechType(mech) == CLASS_MW,
            "You snore for a while.. and then _start_ yourself back up.");
    DOCHECK(IsDS(mech) && !Landed(mech) && !Wiz(player), 
            "No shutdowns in mid-air! Are you suicidal?");
    if (MechPilot(mech) == -1)
        return;
    if (Starting(mech)) {
        mech_notify(mech, MECHALL,
                "The startup sequence has been aborted.");
        StopStartup(mech);
        MechPilot(mech) = -1;
        return;
    }
    mech_printf(mech, MECHALL, "%s has been shutdown!",
                IsDS(mech) ? "Dropship" : is_aero(mech) ? "Fighter" :
                MechType(mech) == CLASS_BSUIT ? "Suit" : ((MechMove(mech) ==
                        MOVE_HOVER) || (MechMove(mech) == MOVE_TRACK) ||
                    (MechMove(mech) ==
                     MOVE_WHEEL)) ? "Vehicle" : MechMove(mech) ==
                MOVE_VTOL ? "VTOL" : "Mech");

    /*
     * Fixed by Kipsta so searchlights shutoff when the mech shuts down
     */

    if (MechStatus2(mech) & SLITE_ON) {
        mech_notify(mech, MECHALL, "Your searchlight shuts off.");
        MechStatus2(mech) &= ~SLITE_ON;
        MechCritStatus(mech) &= ~SLITE_LIT;
    }

    if (MechStatus(mech) & TORSO_RIGHT) {
        mech_notify(mech, MECHSTARTED,
                "Torso rotated back to center for shutdown");
        MechStatus(mech) &= ~TORSO_RIGHT;
    }
    if (MechStatus(mech) & TORSO_LEFT) {
        mech_notify(mech, MECHSTARTED,
                "Torso rotated back to center for shutdown");
        MechStatus(mech) &= ~TORSO_LEFT;
    }
    if (MechMove(mech) != MOVE_NONE && MechType(mech) != CLASS_VEH_NAVAL &&
        ((MechType(mech) == CLASS_MECH && Jumping(mech)) ||
	    (MechType(mech) != CLASS_MECH &&
	    MechZ(mech) > MechUpperElevation(mech) && MechZ(mech) < ORBIT_Z))) {
        mech_notify(mech, MECHALL,"You start free-fall.. Enjoy the ride!");
        MECHEVENT(mech, EVENT_FALL, mech_fall_event, FALL_TICK, -1);
    } else if (MechSpeed(mech) > MP1) {
        mech_notify(mech, MECHALL, "Your systems stop in mid-motion!");
        if (MechType(mech) == CLASS_MECH)
            MechLOSBroadcast(mech, "stops in mid-motion, and falls!");
        else {
            mech_notify(mech, MECHALL,
                    "You tumble end over end and come to a crashing halt!");
            MechLOSBroadcast(mech,
                    "tumbles end over end and comes to a crashing halt!");
        }
        MechFalls(mech, 1, 0);
        domino_space(mech, 2);
    }
    Shutdown(mech);
}