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.ecm.c,v 1.2 2005/06/23 18:31:42 av1-op Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1997 Markus Stenberg
 *  Copyright (c) 1998-2002 Thomas Wouters
 *  Copyright (c) 2000-2002 Cord Awtry
 *       All rights reserved
 *
 * Created: Fri Mar 21 15:13:06 1997 fingon
 * Last modified: Sat Oct 25 18:03:03 1997 fingon
 *
 */

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

    /*
     * This is a rewrite of the ECM code to support ECCM. I've redone everything
     * so that multiple ECM/ECCM units can operate and gain the advantage in numbers
     *
     * Mar.10.2001
     * Kipsta
     */

#define LOUD_ECM		/* No complete stealth */
#undef VERY_LOUD_ECM		/* But no spam, either */

void sendECMNotification(MECH * objMech, int wMsgType)
{
    switch (wMsgType) {
    case ECM_NOTIFY_DISTURBED:

#ifdef LOUD_ECM
	mech_notify(objMech, MECHALL,
	    "Half your screens are suddenly filled with static!");

#ifdef VERY_LOUD_ECM
	if (MechSpecials(objMech) & BEAGLE_PROBE_TECH &&
	    !(MechCritStatus(objMech) & BEAGLE_DESTROYED))
	    mech_notify(objMech, MECHALL,
		"Your Beagle Active Probe is inoperative!");
	if (MechSpecials2(objMech) & BLOODHOUND_PROBE_TECH &&
	    !(MechCritStatus(objMech) & BLOODHOUND_DESTROYED))
	    mech_notify(objMech, MECHALL,
		"Your Bloodhound Active Probe is inoperative!");
	if (IsC3(objMech))
	    mech_notify(objMech, MECHALL,
		"Your C3 network is inoperative!");
	if (IsC3i(objMech))
	    mech_notify(objMech, MECHALL,
		"Your C3i network is inoperative!");

#endif				/*  */
#endif				/*  */
	break;
    case ECM_NOTIFY_UNDISTURBED:

#ifdef LOUD_ECM
	mech_notify(objMech, MECHALL,
	    "All your systems are back to normal again!");

#ifdef VERY_LOUD_ECM
	if (MechSpecials(objMech) & BEAGLE_PROBE_TECH &&
	    !(MechCritStatus(objMech) & BEAGLE_DESTROYED))
	    mech_notify(objMech, MECHALL,
		"Your Beagle Active Probe is operational again!");
	if (MechSpecials2(objMech) & BLOODHOUND_PROBE_TECH &&
	    !(MechCritStatus(objMech) & BLOODHOUND_DESTROYED))
	    mech_notify(objMech, MECHALL,
		"Your Bloodhound Active Probe is operational again!");
	if (IsC3(objMech))
	    mech_notify(objMech, MECHALL,
		"Your C3 network is operational again!");
	if (IsC3i(objMech))
	    mech_notify(objMech, MECHALL,
		"Your C3i network is operational again!");

#endif				/*  */
#endif				/*  */
	break;
    case ECM_NOTIFY_COUNTERED:
	if (HasWorkingECMSuite(objMech))
	    mech_notify(objMech, MECHALL,
		"Your ECM suite's ready light turns red, countered by enemy ECCM!");
	break;
    case ECM_NOTIFY_UNCOUNTERED:
	if (HasWorkingECMSuite(objMech))
	    mech_notify(objMech, MECHALL,
		"Your ECM suite's ready light turns green, enemy ECCM is out of range.");
	break;
    }
}
void checkECM(MECH * objMech)
{
    MAP *objMapmap;
    MECH *objOtherMech;
    float range = 0.0;

    int wFriendlyECM = 0;
    int wFriendlyECCM = 0;
    int wUnFriendlyECM = 0;
    int wUnFriendlyECCM = 0;

    int wFriendlyAngelECM = 0;
    int wFriendlyAngelECCM = 0;
    int wUnFriendlyAngelECM = 0;
    int wUnFriendlyAngelECCM = 0;

    int wFriendlyECMDelta = 0;
    int wFriendlyECCMDelta = 0;

    int tCheckECM = 0;
    int tCheckECCM = 0;

    int wIter = 0;
    int tMark = 0;

    if (!(objMapmap = FindObjectsData(objMech->mapindex)))	/* get our map */
	return;

    for (wIter = 0; wIter < objMapmap->first_free; wIter++) {
	if (!(objOtherMech =
		FindObjectsData(objMapmap->mechsOnMap[wIter])))
	    continue;

	if ((range = FaMechRange(objOtherMech, objMech)) > ECM_RANGE)
	    continue;

	if (MechTeam(objOtherMech) == MechTeam(objMech)) {
	    if (ECMEnabled(objOtherMech))
		wFriendlyECM++;

	    if (ECCMEnabled(objOtherMech))
		wFriendlyECCM++;

	    if (AngelECMEnabled(objOtherMech))
		wFriendlyAngelECM++;

	    if (AngelECCMEnabled(objOtherMech))
		wFriendlyAngelECCM++;

	    if (range <= 0.5) {
		if (PerECMEnabled(objOtherMech))
		    wFriendlyECM++;

		if (PerECCMEnabled(objOtherMech))
		    wFriendlyECCM++;
	    }
	} else {
	    if (ECMEnabled(objOtherMech))
		wUnFriendlyECM++;

	    if (ECCMEnabled(objOtherMech))
		wUnFriendlyECCM++;

	    if (AngelECMEnabled(objOtherMech))
		wUnFriendlyAngelECM++;

	    if (AngelECCMEnabled(objOtherMech))
		wUnFriendlyAngelECCM++;

	    if (range <= 0.5) {
		if (PerECMEnabled(objOtherMech))
		    wUnFriendlyECM++;

		if (PerECCMEnabled(objOtherMech))
		    wUnFriendlyECCM++;
	    }
	}
    }

    if ((MechStatus2(objMech) & STH_ARMOR_ON) ||
	checkAllSections(objMech, INARC_ECM_ATTACHED))
	wUnFriendlyECM += 1000;

    /* Generate our deltas */
    wFriendlyECMDelta =
	wFriendlyECM + (2 * wFriendlyAngelECM) - wUnFriendlyECCM -
	(2 * wUnFriendlyAngelECCM);
    wFriendlyECCMDelta =
	wFriendlyECCM + (2 * wFriendlyAngelECCM) - wUnFriendlyECM -
	(2 * wUnFriendlyAngelECM);

    tCheckECM = ((wFriendlyECM != 0) || (wFriendlyAngelECM != 0) ||
	(wUnFriendlyECCM != 0) || (wUnFriendlyAngelECCM != 0));
    tCheckECCM = ((wFriendlyECCM != 0) || (wFriendlyAngelECCM != 0) ||
	(wUnFriendlyECM != 0) || (wUnFriendlyAngelECM != 0));

    /* SendDebug(tprintf("Checking unit %d. ECMDelta: %d. ECCMDelta: %d. CheckECM: %d. CheckECCM: %d",objMech->mynum,wFriendlyECMDelta,wFriendlyECCMDelta,tCheckECM,tCheckECCM)); */

    /* Now we do our checks... */
    /* Let's first see if we should just reset our flags... 'cause there's no ECM or ECCM around */
    if (!tCheckECM) {
	if (ECMCountered(objMech)) {
	    sendECMNotification(objMech, ECM_NOTIFY_UNCOUNTERED);
	    UnSetECMCountered(objMech);
	    tMark = 1;
	}

	if (ECMProtected(objMech) || AngelECMProtected(objMech)) {
	    UnSetECMProtected(objMech);
	    UnSetAngelECMProtected(objMech);
	    tMark = 1;
	}
    }

    if (!tCheckECCM) {
	if (AnyECMDisturbed(objMech)) {
	    sendECMNotification(objMech, ECM_NOTIFY_UNDISTURBED);
	    UnSetECMDisturbed(objMech);
	    UnSetAngelECMDisturbed(objMech);
	    tMark = 1;
	}
    }

    /* Sanity check so we don't bother to do all the other checks */
    if (!tCheckECM && !tCheckECCM) {
	if (tMark)
	    MarkForLOSUpdate(objMech);

	return;
    }

    /* Now we see if our ECM has been countered */
    if (tCheckECM) {
	if (wFriendlyECMDelta <= 0) {	/* They have the same or more ECCM than we have ECM */
	    if (!ECMCountered(objMech)) {
		sendECMNotification(objMech, ECM_NOTIFY_COUNTERED);
		SetECMCountered(objMech);
		UnSetECMProtected(objMech);
		UnSetAngelECMProtected(objMech);
	    }
	} else {
	    if (ECMCountered(objMech)) {
		sendECMNotification(objMech, ECM_NOTIFY_UNCOUNTERED);
		UnSetECMCountered(objMech);
	    }

	    if (wFriendlyECM > 0)
		SetECMProtected(objMech);
	    else
		UnSetECMProtected(objMech);

	    if (wFriendlyAngelECM > 0)
		SetAngelECMProtected(objMech);
	    else
		UnSetAngelECMProtected(objMech);
	}
    }

    /* Now we see if we're under an enemy ECM umbrella */
    if (tCheckECCM) {
	if (wFriendlyECCMDelta < 0) {	/* They have more ECM than we have ECCM */
	    if (!AnyECMDisturbed(objMech)) {
		sendECMNotification(objMech, ECM_NOTIFY_DISTURBED);

		if (wUnFriendlyECM > 0)
		    SetECMDisturbed(objMech);
		else
		    UnSetECMDisturbed(objMech);

		if (wUnFriendlyAngelECM > 0)
		    SetAngelECMDisturbed(objMech);
		else
		    UnSetAngelECMDisturbed(objMech);

		MarkForLOSUpdate(objMech);
	    }
	} else {
	    if (AnyECMDisturbed(objMech)) {
		sendECMNotification(objMech, ECM_NOTIFY_UNDISTURBED);

		UnSetECMDisturbed(objMech);
		UnSetAngelECMDisturbed(objMech);
		MarkForLOSUpdate(objMech);
	    }
	}
    }
}



/* mech_ecm moved to mech.advanced.c */