/*
* $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.");
}