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