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.fire.c,v 1.1.1.1 2005/01/11 21:18:15 kstevens Exp $
 *
 * Author: Cord Awtry <kipsta@mediaone.net>
 *
 *  Copyright (c) 2001-2002 Cord Awtry
 *       All rights reserved
 *
 */

#include "mech.h"
#include "mech.events.h"
#include "p.mech.fire.h"
#include "p.mech.combat.h"
#include "p.mech.damage.h"
#include "p.mech.hitloc.h"
#include "p.mech.utils.h"
#include "p.mech.build.h"

#define VEHICLEBURN_TICK 60
#define VEHICLE_EXTINGUISH_TICK 120

static void inferno_end_event(MUXEVENT * e)
{
    MECH *mech = (MECH *) e->data;

    MechCritStatus(mech) &= ~JELLIED;
    mech_notify(mech, MECHALL,
	"You feel suddenly far cooler as the fires finally die.");
}

void inferno_burn(MECH * mech, int time)
{
    int l;

    if (!(MechCritStatus(mech) & JELLIED)) {
	MechCritStatus(mech) |= JELLIED;
	MECHEVENT(mech, EVENT_BURN, inferno_end_event, time, 0);
	return;
    }

    l = muxevent_last_type_data(EVENT_BURN, (void *) mech) + time;
    muxevent_remove_type_data(EVENT_BURN, (void *) mech);
    MECHEVENT(mech, EVENT_BURN, inferno_end_event, l, 0);
}

static void vehicle_burn_event(MUXEVENT * objEvent)
{
    MECH *objMech = (MECH *) objEvent->data;	/* get the mech */
    int wLoc = (int) objEvent->data2;	/* and now the loc to damage */
    int wDamRoll = Number(1, 6);	/* do 1d6 damage */
    char strLocName[30];

    if (!objMech)
	return;

    ArmorStringFromIndex(wLoc, strLocName, MechType(objMech),
	MechMove(objMech));

    if (!GetSectInt(objMech, wLoc))	/* if our loc is gone, no damage to do */
	return;

    mech_notify(objMech, MECHALL,
	tprintf("%%cr%%chYour %s takes damage from the fire!%%cn",
	    strLocName));
    DamageMech(objMech, objMech, 0, -1, wLoc, 0, 0, wDamRoll, 0, 0, 0, -1,
	0, 1);

    /*
     * Only continue the event if the damage was greater than one
     */
    if ((wDamRoll > 1) && (GetSectInt(objMech, wLoc)))
	MECHEVENT(objMech, EVENT_VEHICLEBURN, vehicle_burn_event,
	    VEHICLEBURN_TICK, wLoc);
    else {
	if (GetSectInt(objMech, wLoc))
	    mech_notify(objMech, MECHALL,
		tprintf("The fire burning on your %s finally goes out.",
		    strLocName));
	if (!Burning(objMech))
	    MechLOSBroadcast(objMech, "is no longer engulfed in flames.");
    }
}

void vehicle_start_burn(MECH * objMech, MECH * objAttacker)
{
    int wIter;
    int wDamage = 0;
    char strLocName[30];

    if (!objAttacker)
	objAttacker = objMech;

    mech_notify(objMech, MECHALL, "You catch on fire!");
    MechLOSBroadcast(objMech, "catches on fire!");

    for (wIter = 0; wIter < NUM_SECTIONS; wIter++) {
	if (GetSectInt(objMech, wIter) && !BurningSide(objMech, wIter)) {
	    wDamage = Number(1, 6);
	    ArmorStringFromIndex(wIter, strLocName, MechType(objMech),
		MechMove(objMech));
	    mech_notify(objMech, MECHALL,
		tprintf("Your %s catches on fire!", strLocName));

	    DamageMech(objMech, objAttacker, 0, -1, wIter, 0, 0, wDamage,
		0, 0, 0, -1, 0, 1);
	    MECHEVENT(objMech, EVENT_VEHICLEBURN, vehicle_burn_event,
		VEHICLEBURN_TICK, wIter);
	}
    }
}

void vehicle_extinquish_fire_event(MUXEVENT * e)
{
    MECH *objMech = (MECH *) e->data;

    if (!objMech)
	return;

    if (!Burning(objMech))
	return;

    StopBurning(objMech);

    mech_notify(objMech, MECHALL, "You manage to dowse the fire.");
    MechLOSBroadcast(objMech, "is no longer engulfed in flames.");
}

void vehicle_extinquish_fire(dbref player, MECH * mech, char *buffer)
{
    cch(MECH_USUALS);


    DOCHECK(Started(mech),
	"Your tank is started! You can not extinguish the flames while your tank is started!");
    DOCHECK(!Burning(mech), "This unit is not on fire!");
    DOCHECK(Extinguishing(mech), "You're already trying to put out the fire!");

    mech_notify(mech, MECHALL, "You begin to exitinguish the fires!");

    MECHEVENT(mech, EVENT_VEHICLE_EXTINGUISH,
	vehicle_extinquish_fire_event, VEHICLE_EXTINGUISH_TICK, 0);
}

/* 
 *  Mechs entering level 2 water, or proning in level 1 water should
 *  extinguish any inferno currently burning.
 */
void water_extinguish_inferno(MECH * mech)
{
    int elev = MechElevation(mech);
    MAP * map = getMap(mech->mapindex);
    
    if (!InWater(mech) || MechType(mech) != CLASS_MECH ||
        !Jellied(mech) || (elev == -1 && !Fallen(mech)))
           return;

    muxevent_remove_type_data(EVENT_BURN, (void *) mech);
    MechCritStatus(mech) &= ~JELLIED;

    mech_notify(mech, MECHALL, "The flames extinguish in a roar of steam!");
    MechLOSBroadcast(mech, "is surrounded by a plume of steam as the flames extinguish.");

    /* According to FASA, the inferno jelly should keep on burning on the
     * water hex. We'll just add some steam (smoke) instead. */
    add_decoration(map, MechX(mech), MechY(mech), TYPE_SMOKE, SMOKE, 120);
}

void checkVehicleInFire(MECH * objMech, int fromHexFire)
{
    int wRoll = Roll();
    int wIter;
    int wDamage = 0;

    switch (MechMove(objMech)) {
    case MOVE_WHEEL:
    case MOVE_VTOL:
	wRoll += 2;
	break;
    case MOVE_HOVER:
	wRoll += 4;
	break;
    }

    if (wRoll < 8)		/* don't do jack if it's < 8 */
	return;

    if (fromHexFire)
	mech_notify(objMech, MECHALL,
	    "%cr%chYou drive through a wall of searing flames!%cn");
    else
	mech_notify(objMech, MECHALL,
	    "%cr%chThe fires surround your vehicle!%cn");

    switch (wRoll) {
    case 8:			/* roll once on the motive system chart */
    case 9:
	if (MechType(objMech) == CLASS_VTOL) {
	    /*
	       * VTOLs _should_ make a pskill or go up one level... not right now tho
	     */
	} else {
	    mech_notify(objMech, MECHALL,
		"%cr%chThe fire damages your motive system!%cn");
	    DoMotiveSystemHit(objMech, 0);
	}
	break;

    case 10:
    case 11:
	/*
	 * Do 1d6 damage to each loc
	 */
	mech_notify(objMech, MECHALL,
	    "%cr%chThe fire sweeps across your unit damaging it!%cn");

	for (wIter = 0; wIter < NUM_SECTIONS; wIter++) {
	    wDamage = Number(1, 6);

	    if (GetSectInt(objMech, wIter))
		DamageMech(objMech, objMech, 0, -1, wIter, 0, 0, wDamage,
		    0, 0, 0, -1, 0, 1);
	}
	break;

    default:
	vehicle_start_burn(objMech, objMech);
	break;
    }
}