btmux-0.6-rc4/doc/
btmux-0.6-rc4/event/
btmux-0.6-rc4/game/
btmux-0.6-rc4/game/maps/
btmux-0.6-rc4/game/mechs/
btmux-0.6-rc4/game/text/help/
btmux-0.6-rc4/game/text/help/cat_faction/
btmux-0.6-rc4/game/text/help/cat_inform/
btmux-0.6-rc4/game/text/help/cat_misc/
btmux-0.6-rc4/game/text/help/cat_mux/
btmux-0.6-rc4/game/text/help/cat_mux/cat_commands/
btmux-0.6-rc4/game/text/help/cat_mux/cat_functions/
btmux-0.6-rc4/game/text/help/cat_templates/
btmux-0.6-rc4/game/text/wizhelp/
btmux-0.6-rc4/include/
btmux-0.6-rc4/misc/
btmux-0.6-rc4/python/
btmux-0.6-rc4/src/hcode/btech/
btmux-0.6-rc4/tree/
/*
 * $Id: mech.lite.c,v 1.1.1.1 2005/01/11 21:18:17 kstevens Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1998 Markus Stenberg
 *  Copyright (c) 1998-2002 Thomas Wouters
 *  Copyright (c) 2000-2002 Cord Awtry
 *       All rights reserved
 *
 * Created: Wed Mar 18 22:33:16 1998 fingon
 * Last modified: Thu Dec 10 21:47:06 1998 fingon
 *
 */

#include "mech.h"
#include "p.mech.utils.h"

/* If the target is in the front arc, and Line of Sight is not blocked
 * (by terrain, water hexes or more than 2 'points' of wood) and in
 * range, the target is lit.
 */
static int mech_lites_target(MECH * mech, MECH * target)
{
	MAP *map = getMap(mech->mapindex);
	int losflag = MechToMech_LOSFlag(map, mech, target);

	if(!MechLites(mech))
		return 0;
	if(FaMechRange(mech, target) > LITE_RANGE)
		return 0;
	if(!(InWeaponArc(mech, MechFX(target), MechFY(target)) & FORWARDARC))
		return 0;
	if((losflag & MECHLOSFLAG_BLOCK) ||
	   MechLOSFlag_WoodCount(losflag) > 2 ||
	   MechLOSFlag_WaterCount(losflag) != 0)
		return 0;
	return 1;
}

void cause_lite(MECH * mech, MECH * tempMech)
{
	if(MechLit(tempMech))
		return;
	if(mech_lites_target(mech, tempMech)) {
		MechCritStatus(tempMech) |= SLITE_LIT;
		if(MechSLWarn(tempMech))
			mech_notify(tempMech, MECHALL, "You are being illuminated!");
	}
}

void end_lite_check(MECH * mech)
{
	MAP *map = getMap(mech->mapindex);
	MECH *t;
	int i;

	if(!MechLit(mech))
		return;
	if(!map)
		return;
	for(i = 0; i < map->first_free; i++) {
		if(i == mech->mapnumber)
			continue;
		if(!(t = FindObjectsData(map->mechsOnMap[i])))
			continue;
		if(mech_lites_target(t, mech))
			return;
	}
	MechCritStatus(mech) &= ~SLITE_LIT;
	if(MechSLWarn(mech))
		mech_notify(mech, MECHALL, "You are no longer being illuminated.");
}