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.tag.c,v 1.1.1.1 2005/01/11 21:18:24 kstevens Exp $
 *
 * Author: Cord Awtry <kipsta@mediaone.net>
 *
 *  Copyright (c) 2001 Cord Awtry
 *       All rights reserved
 *
 */

#include "mech.h"
#include "mech.events.h"
#include "p.mech.tag.h"
#include "p.mech.los.h"
#include "p.mech.utils.h"

#define TAGRECYCLE_TICK 30
#define TAG_SHORT 5
#define TAG_MED   10
#define TAG_LONG  15

static void tag_recycle_event(MUXEVENT * e)
{
    MECH *mech = (MECH *) e->data;
    int data = (int) e->data2;
    MECH *target;

    if (isTAGDestroyed(mech))
	return;

    if (data == 0) {
	mech_notify(mech, MECHALL,
	    "%cgYour TAG system has finished recycling.%cn");
	return;
    }

    target = getMech(TAGTarget(mech));

    if (!target)
	return;

    if (TaggedBy(target) != mech->mynum)
	return;

    mech_notify(mech, MECHALL,
	"%cgYour TAG system has achieved a stable lock.%cn");
}

void mech_tag(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data, *target;
    MAP *objMap;
    char *args[2];
    dbref refTarget;
    int LOS = 1;
    float range = 0.0;

    cch(MECH_USUALO);

    DOCHECK(!HasTAG(mech), "This unit is not equipped with TAG!");
    DOCHECK(isTAGDestroyed(mech), "Your TAG system is destroyed!");
    DOCHECK(TagRecycling(mech), "Your TAG system is recycling!");
    DOCHECK(mech_parseattributes(buffer, args, 2) != 1,
	"Invalid number of arguments to function!");

    objMap = getMap(mech->mapindex);

    /* Clear our TAG */
    if (!strcmp(args[0], "-")) {
	refTarget = TAGTarget(mech);

	DOCHECK(refTarget <= 0, "You are not currently tagging anything!");

	stopTAG(mech);

	return;
    }

    /* TAG something... anything :) */
    refTarget = FindTargetDBREFFromMapNumber(mech, args[0]);
    target = getMech(refTarget);

    if (target) {
	range = FlMechRange(objMap, mech, target);

	LOS =
	    InLineOfSight_NB(mech, target, MechX(target), MechY(target),
	    range);
    } else
	refTarget = 0;

    DOCHECK(refTarget < 1 ||
	!LOS, "That is not a valid TAG targetID. Try again.");
    DOCHECK(MechTeam(mech) == MechTeam(target),
	"You can't TAG friendly units!");
    DOCHECK(mech == target, "You can't TAG yourself!");
    DOCHECK(range > TAG_LONG,
	tprintf("Out of range! TAG ranges are %d/%d/%d", TAG_SHORT,
	    TAG_MED, TAG_LONG));

    /*
     * This should actually make a roll...
     */

    /*
       if ( checkAllSections(mech,INARC_HAYWIRE_ATTACHED) )
       BTH += 1;
     */

    mech_notify(mech, MECHALL, tprintf("You light up %s with your TAG.",
	    GetMechToMechID(mech, target)));

    TaggedBy(target) = mech->mynum;
    TAGTarget(mech) = target->mynum;

    MECHEVENT(mech, EVENT_TAG_RECYCLE, tag_recycle_event, TAGRECYCLE_TICK,
	1);
}

int isTAGDestroyed(MECH * mech)
{
    if ((MechSpecials2(mech) & TAG_TECH) &&
	(MechCritStatus(mech) & TAG_DESTROYED))
	return 1;

    if (HasC3m(mech) && (MechCritStatus(mech) & C3_DESTROYED))
	return 1;

    return 0;
}

void stopTAG(MECH * mech)
{
    MECH *target;

    target = getMech(TAGTarget(mech));

    if (target)
	if (TaggedBy(target) == mech->mynum)
	    TaggedBy(target) = 0;

    if (TAGTarget(mech) > 0) {
	TAGTarget(mech) = 0;

	mech_notify(mech, MECHALL, "Your TAG connection as been broken.");

	MECHEVENT(mech, EVENT_TAG_RECYCLE, tag_recycle_event,
	    TAGRECYCLE_TICK, 0);
    }
}

void checkTAG(MECH * mech)
{
    MECH *target;
    dbref refTarget;
    float range;
    int LOS = 1;

    refTarget = TAGTarget(mech);

    if (refTarget <= 0)
	return;

    target = getMech(refTarget);

    if (!target) {
	stopTAG(mech);
	return;
    }

    if (TaggedBy(target) != mech->mynum) {
	stopTAG(mech);
	return;
    }

    range = FlMechRange(getMap(mech->mapindex), mech, target);
    LOS =
	InLineOfSight_NB(mech, target, MechX(target), MechY(target),
	range);

    if (!LOS || (range > TAG_LONG)) {
	stopTAG(mech);
	return;
    }
}