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