/*
* $Id: mech.restrict.c,v 1.1.1.1 2005/01/11 21:18:22 kstevens 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
*
* Last modified: Sat Jul 18 04:23:44 1998 fingon
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/file.h>
#include "mech.h"
#include "mech.events.h"
#include "create.h"
#include "autopilot.h"
#include "p.mech.build.h"
#include "p.mech.utils.h"
#include "p.mechrep.h"
#include "p.mech.c3.h"
#include "p.mech.c3i.h"
/* Selectors for new/free function */
#define SPECIAL_FREE 0
#define SPECIAL_ALLOC 1
void clear_mech_from_LOS(MECH * mech)
{
MAP *map;
int i;
MECH *mek;
/* if (mech->mapindex < 0)
return;
*/
if (!(map = FindObjectsData(mech->mapindex)))
return;
#ifdef SENSOR_DEBUG
SendSensor(tprintf("LOS info for #%d cleared.", mech->mynum));
#endif
for (i = 0; i < map->first_free; i++) {
map->LOSinfo[mech->mapnumber][i] = 0;
map->LOSinfo[i][mech->mapnumber] = 0;
if (map->mechsOnMap[i] >= 0 && i != mech->mapnumber) {
if (!(mek = getMech(map->mechsOnMap[i])))
continue;
if ((MechStatus(mek) & LOCK_TARGET) &&
MechTarget(mek) == mech->mynum) {
mech_notify(mek, MECHALL,
"Weapon system reports the lock has been lost.");
LoseLock(mek);
}
if ((map->LOSinfo[i][mech->mapnumber] & MECHLOSFLAG_SEEN) &&
MechTeam(mek) != MechTeam(mech))
MechNumSeen(mek) = MAX(0, MechNumSeen(mek) - 1);
}
}
if (MechStatus(mech) & LOCK_MODES) {
mech_notify(mech, MECHALL,
"Weapon system reports the lock has been lost.");
LoseLock(mech);
}
}
void mech_Rsetxy(dbref player, void *data, char *buffer)
{
MECH *mech = (MECH *) data;
MAP *mech_map = getMap(mech->mapindex);
char *args[3];
int x, y, z, argc;
if (!CheckData(player, mech))
return;
cch(MECH_MAP);
argc = mech_parseattributes(buffer, args, 3);
DOCHECK(argc != 2 &&
argc != 3, "Invalid number of arguments to SETXY!");
x = atoi(args[0]);
y = atoi(args[1]);
DOCHECK(x >= mech_map->map_width || y >= mech_map->map_height || x < 0
|| y < 0, "Invalid coordinates!");
MechX(mech) = x;
MechLastX(mech) = x;
MechY(mech) = y;
MechLastY(mech) = y;
MapCoordToRealCoord(MechX(mech), MechY(mech), &MechFX(mech),
&MechFY(mech));
MechTerrain(mech) = GetTerrain(mech_map, MechX(mech), MechY(mech));
MarkForLOSUpdate(mech);
if (argc == 2) {
MechElev(mech) = GetElev(mech_map, MechX(mech), MechY(mech));
MechZ(mech) = MechElev(mech) - 1;
DropSetElevation(mech, 0);
z = MechZ(mech);
if (!Landed(mech) && FlyingT(mech))
MechStatus(mech) |= LANDED;
} else {
z = atoi(args[2]);
MechZ(mech) = z;
}
clear_mech_from_LOS(mech);
notify(player, tprintf("Pos changed to %d,%d,%d", x, y, z));
SendLoc(tprintf("#%d set #%d's pos to %d,%d,%d.", player, mech->mynum,
x, y, z));
}
/* Team/Map commands */
void mech_Rsetmapindex(dbref player, void *data, char *buffer)
{
MECH *mech = (MECH *) data;
char *args[2], *tempstr;
int newindex, nargs, notdone = 0;
int loop;
MAP *newmap = NULL;
MAP *oldmap;
MECH *tempMech;
char targ[2];
if (!CheckData(player, mech))
return;
nargs = mech_parseattributes(buffer, args, 2);
DOCHECK(nargs < 1, "Invalid number of arguments to SETMAPINDX!");
newindex = atoi(args[0]);
DOCHECK(newindex < -1, "Invalid map index!");
if (newindex != -1) {
if (!(newmap = ValidMap(player, newindex)))
return;
}
/* Remove the mech from it's old map */
if (mech->mapindex != -1) {
if (!(oldmap = ValidMap(player, mech->mapindex)))
return;
remove_mech_from_map(oldmap, mech);
TAGTarget(mech) = -1;
clearC3iNetwork(mech, 1);
clearC3Network(mech, 1);
}
if (newindex == -1) {
notify(player, "Mech removed from map.");
SendLoc(tprintf("#%d removed #%d from map #%d.", player,
mech->mynum, oldmap->mynum));
return;
}
/* Just make it random */
/* Find a clear spot for this mech */
if (nargs > 1 && strlen(args[1]) > 1) {
targ[0] = args[1][0];
targ[1] = args[1][1];
} else if ((tempstr = silly_atr_get(mech->mynum, A_MECHPREFID))
&& strlen(tempstr) > 1) {
targ[0] = tempstr[0];
targ[1] = tempstr[1];
} else {
targ[0] = 65 + Number(0, 25);
targ[1] = 65 + Number(0, 25);
}
targ[0] = BOUNDED('A', toupper(targ[0]), 'Z');
targ[1] = BOUNDED('A', toupper(targ[1]), 'Z');
for (loop = 0; (loop < newmap->first_free && !notdone); loop++) {
if ((tempMech = (MECH *)
FindObjectsData(newmap->mechsOnMap[loop])))
if (MechID(tempMech)[0] == targ[0] &&
MechID(tempMech)[1] == targ[1])
notdone = 1;
}
while (notdone) {
targ[0] = 65 + Number(0, 25);
targ[1] = 65 + Number(0, 25);
notdone = 0;
for (loop = 0; (loop < newmap->first_free && !notdone); loop++) {
if ((tempMech = (MECH *)
FindObjectsData(newmap->mechsOnMap[loop])))
if (MechID(tempMech)[0] == targ[0] &&
MechID(tempMech)[1] == targ[1])
notdone = 1;
}
}
DOCHECK(loop == MAX_MECHS_PER_MAP,
"There are too many mechs on that map!");
add_mech_to_map(newmap, mech);
MechID(mech)[0] = targ[0];
MechID(mech)[1] = targ[1];
if (MechX(mech) > (newmap->map_width - 1) ||
MechY(mech) > (newmap->map_height - 1)) {
MechX(mech) = 0;
MechLastX(mech) = 0;
MechY(mech) = 0;
MechLastY(mech) = 0;
MapCoordToRealCoord(MechX(mech), MechY(mech), &MechFX(mech),
&MechFY(mech));
MechTerrain(mech) = GetTerrain(newmap, MechX(mech), MechY(mech));
MechElev(mech) = GetElev(newmap, MechX(mech), MechY(mech));
notify(player,
"You're current position is out of bounds, Pos changed to 0,0");
}
notify(player, tprintf("MapIndex changed to %d", newindex));
notify(player, tprintf("Your ID: %c%c", MechID(mech)[0],
MechID(mech)[1]));
SendLoc(tprintf("#%d set #%d's mapindex to #%d.", player, mech->mynum,
newindex));
UnZombifyMech(mech);
}
void mech_Rsetteam(dbref player, void *data, char *buffer)
{
MECH *mech = (MECH *) data;
char *args[1];
int team;
MAP *newmap;
if (!CheckData(player, mech))
return;
DOCHECK(mech->mapindex == -1, "Mech is not on a map: Can't set team");
newmap = ValidMap(player, mech->mapindex);
if (!newmap) {
notify(player, "Map index reset!");
mech->mapindex = -1;
return;
}
DOCHECK(mech_parseattributes(buffer, args, 1) != 1,
"Invalid number of arguments!");
team = atoi(args[0]);
if (team < 0)
team = 0;
MechTeam(mech) = team;
notify(player, tprintf("Team set to %d", team));
}
#define SPECIAL_FREE 0
#define SPECIAL_ALLOC 1
/* Alloc/free routine */
void newfreemech(dbref key, void **data, int selector)
{
MECH *new = *data;
MAP *map;
int i;
switch (selector) {
case SPECIAL_ALLOC:
new->mynum = key;
new->mapnumber = 1;
new->mapindex = -1;
MechID(new)[0] = ' ';
MechID(new)[1] = ' ';
clear_mech(new, 1);
for (i = 0; i < NUM_SECTIONS; i++)
FillDefaultCriticals(new, i);
break;
case SPECIAL_FREE:
if (new->mapindex != -1 && (map = getMap(new->mapindex)))
remove_mech_from_map(map, new);
}
}