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