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