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: ds.turret.c,v 1.1.1.1 2005/01/11 21:18:06 kstevens Exp $
 *
 * Author: Markus Stenberg <fingon@iki.fi>
 *
 *  Copyright (c) 1996 Markus Stenberg
 *  Copyright (c) 1998-2002 Thomas Wouters
 *  Copyright (c) 2000-2002 Cord Awtry
 *       All rights reserved
 *
 * Created: Fri Nov 22 16:51:09 1996 fingon
 * Last modified: Tue Apr 28 21:57:51 1998 fingon
 *
 */

#include "turret.h"
#include "mech.tic.h"
#include "create.h"
#include "p.mech.scan.h"
#include "p.mech.move.h"
#include "p.mech.maps.h"
#include "p.mech.combat.h"
#include "p.mech.contacts.h"
#include "p.mech.status.h"

int arc_override = 0;
dbref pilot_override = 0;

#define LOCK_FUDGE(mech,tur) \
if (tur->gunner > 0) pilot_override = tur->gunner; \
stored_status = MechStatus(mech); \
stored_target = MechTarget(mech); \
stored_targx  = MechTargX(mech); \
stored_targy  = MechTargY(mech); \
stored_targz  = MechTargZ(mech); \
MechStatus(mech) &= ~LOCK_MODES; \
MechStatus(mech) |= tur->lockmode; \
arc_override  = tur->arcs; \
MechTarget(mech) = tur->target; \
MechTargX(mech) = tur->targx; \
MechTargY(mech) = tur->targy; \
MechTargZ(mech) = tur->targz

#define LOCK_FUDGE_R(mech,tur) \
pilot_override = 0; \
tur->target = MechTarget(mech); \
tur->targx = MechTargX(mech); \
tur->targy = MechTargY(mech); \
tur->targz = MechTargZ(mech); \
tur->lockmode = (MechStatus(mech) & LOCK_MODES); \
MechStatus(mech) = stored_status; \
MechTarget(mech) = stored_target; \
MechTargX(mech) = stored_targx ; \
MechTargY(mech) = stored_targy ; \
MechTargZ(mech) = stored_targz ; \
arc_override    = 0;

#define LOCK_FUDGE_VARS \
short stored_targx, stored_targy, stored_targz; \
dbref stored_target; int stored_status; \

#define TUR_BASE \
TURRET_T *tur = (TURRET_T *) data; \
MECH *mech = FindObjectsData(tur->parent); \
DOCHECK(!IsMech(tur->parent), "Error: Turret's parentage is unknown.");

#define TUR_COMMON \
TUR_BASE \
DOCHECK(tur->gunner < 0, "The turret hasn't been initialized yet!"); \
DOCHECK(player!=tur->gunner, "You aren't the registered gunner! Go 'way!"); \
DOCHECK(player==MechPilot(mech), "You'll pilot and gun at once? Yah right :P");

#define TUR_GCOMMON \
LOCK_FUDGE_VARS \
TUR_COMMON \
LOCK_FUDGE(mech,tur)

void turret_addtic(dbref player, void *data, char *buffer)
{
#if 0
    TUR_COMMON;
    addtic_sub(player, tur->tic, mech, buffer);
#endif
}

void turret_deltic(dbref player, void *data, char *buffer)
{
#if 0
    TUR_COMMON;
    deltic_sub(player, tur->tic, mech, buffer);
#endif
}

void turret_listtic(dbref player, void *data, char *buffer)
{
#if 0
    TUR_COMMON;
    listtic_sub(player, tur->tic, mech, buffer);
#endif
}


void turret_cleartic(dbref player, void *data, char *buffer)
{
#if 0
    TUR_COMMON;
    cleartic_sub(player, tur->tic, buffer);
#endif
}

void turret_firetic(dbref player, void *data, char *buffer)
{
#if 0
    TUR_GCOMMON;
    firetic_sub(player, tur->tic, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
#endif
}

void turret_bearing(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_bearing(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_eta(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_eta(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_findcenter(dbref player, void *data, char *buffer)
{
    TUR_COMMON;
    mech_findcenter(player, mech, buffer);
}

void turret_fireweapon(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_fireweapon(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_settarget(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_settarget(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_lrsmap(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_lrsmap(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_navigate(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_navigate(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_range(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_range(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_sight(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_sight(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_tacmap(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_tacmap(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_contacts(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_contacts(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_critstatus(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_critstatus(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_report(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_report(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_scan(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_scan(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_status(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_status(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

void turret_weaponspecs(dbref player, void *data, char *buffer)
{
    TUR_GCOMMON;
    mech_weaponspecs(player, mech, buffer);
    LOCK_FUDGE_R(mech, tur);
}

#define SPECIAL_FREE 0
#define SPECIAL_ALLOC 1

/* Alloc/free routine */
void newturret(dbref key, void **data, int selector)
{
    TURRET_T *new = *data;

    switch (selector) {
    case SPECIAL_ALLOC:
	new->target = -1;
	new->targx = -1;
	new->targy = -1;
	new->mynum = key;
	break;
    }
}

void turret_initialize(dbref player, void *data, char *buffer)
{
    TUR_BASE;
    DOCHECK(player != tur->gunner && Connected(tur->gunner) &&
	Location(tur->gunner) == Location(player),
	tprintf("You need %s to leave or disconnect first.",
	    Name(tur->gunner)));
    DOCHECK(player == tur->gunner,
	"You grap firmer hold on the joystick..");
    notify_except(tur->mynum, NOTHING, tur->mynum,
	tprintf("%s initialized as gunner.", Name(player)));
    tur->gunner = player;
}

void turret_deinitialize(dbref player, void *data, char *buffer)
{
    TUR_BASE;
    DOCHECK(player != tur->gunner, "You aren't gunner!");
    notify_except(tur->mynum, NOTHING, tur->mynum,
	tprintf("%s deinitialized as gunner.", Name(player)));
    tur->gunner = -1;
}