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.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);
    }
}