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.tic.c,v 1.1.1.1 2005/01/11 21:18:26 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 Jun  6 22:24:40 1998 fingon
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/file.h>

#include "mech.h"
#include "coolmenu.h"
#include "p.mech.utils.h"
#include "p.mech.combat.h"
#include "p.mech.build.h"
#include "mech.events.h"

int ftflag = 0;

/*****************************************************************************/

/* TIC Routines                                                              */

/*****************************************************************************/

int cleartic_sub_func(MECH * mech, dbref player, int low, int high)
{
    int i, j;

    for (i = low; i <= high; i++) {
	for (j = 0; j < TICLONGS; j++)
	    mech->tic[i][j] = 0;
	notify(player, tprintf("TIC #%d cleared!", i));
    }
    return 0;
}

void cleartic_sub(dbref player, MECH * mech, char *buffer)
{
    int argc;
    char *args[3];

    DOCHECK((argc =
	    mech_parseattributes(buffer, args, 3)) != 1,
	"Invalid number of arguments to function");
    multi_weap_sel(mech, player, args[0], 2, cleartic_sub_func);
}

static int present_tic;


int addtic_sub_func(MECH * mech, dbref player, int low, int high)
{
    int i, j;

    for (i = low; i <= high; i++) {
	j = i / SINGLE_TICLONG_SIZE;
	mech->tic[present_tic][j] |= 1 << (i % SINGLE_TICLONG_SIZE);
    }
    if (low != high)
	notify(player, tprintf("Weapons #%d - #%d added to TIC %d!", low,
		high, present_tic));
    else
	notify(player, tprintf("Weapon #%d added to TIC %d!", low,
		present_tic));
    return 0;
}


void addtic_sub(dbref player, MECH * mech, char *buffer)
{
    int ticnum, argc;
    char *args[3];

    DOCHECK((argc =
	    mech_parseattributes(buffer, args, 3)) != 2,
	"Invalid number of arguments to function!");
    ticnum = atoi(args[0]);
    DOCHECK(!(ticnum >= 0 && ticnum < NUM_TICS), "Invalid tic number!");
    present_tic = ticnum;
    multi_weap_sel(mech, player, args[1], 0, addtic_sub_func);
}


int deltic_sub_func(MECH * mech, dbref player, int low, int high)
{
    int i, j;

    for (i = low; i <= high; i++) {
	j = i / SINGLE_TICLONG_SIZE;
	mech->tic[present_tic][j] &= ~(1 << (i % SINGLE_TICLONG_SIZE));
    }
    if (low != high)
	notify(player, tprintf("Weapons #%d - #%d removed from TIC %d!",
		low, high, present_tic));
    else
	notify(player, tprintf("Weapon #%d removed from TIC %d!", low,
		present_tic));
    return 0;
}


void deltic_sub(dbref player, MECH * mech, char *buffer)
{
    int ticnum, argc;
    char *args[3];

    argc = mech_parseattributes(buffer, args, 3);
    DOCHECK(argc < 1 ||
	argc > 2, "Invalid number of arguments to the function!");
    if (argc == 1) {
	cleartic_sub(player, mech, buffer);
	return;
    }
    ticnum = atoi(args[0]);
    DOCHECK(!(ticnum >= 0 && ticnum < NUM_TICS), "Invalid tic number!");
    present_tic = ticnum;
    multi_weap_sel(mech, player, args[1], 0, deltic_sub_func);
}

static char **temp_args;
static int temp_argc;

int firetic_sub_func(MECH * mech, dbref player, int low, int high)
{
    int i, j, k, count, weapnum;
    MAP *mech_map = FindObjectsData(mech->mapindex);
    int f = Fallen(mech);

    for (i = low; i <= high; i++) {
	notify(player, tprintf("Firing weapons in tic #%d!", i));
	count = 0;
	for (k = 0; k < TICLONGS; k++)
	    if (mech->tic[i][k])
		for (j = 0; j < SINGLE_TICLONG_SIZE; j++)
		    if (mech->tic[i][k] & (1 << j)) {
			weapnum = k * SINGLE_TICLONG_SIZE + j;
			FireWeaponNumber(player, mech, mech_map, weapnum,
			    temp_argc, temp_args, 0);
			if (f != (Fallen(mech))) {
			    if (Started(mech))
				mech_notify(mech, MECHALL,
				    "That fall causes you to stop your fire!");
			    return 1;
			} else if (!Started(mech))
			    return 1;
			count++;
		    }
	if (!count)
	    notify(player,
		tprintf("*Click* (the tic contained no weapons)"));
    }
    return 0;
}


void firetic_sub(dbref player, MECH * mech, char *buffer)
{
    MAP *mech_map;
    int ticnum, argc;
    char *args[5];
    unsigned long weaps;

    DOCHECK((argc =
	    mech_parseattributes(buffer, args, 5)) < 1,
	"Not enough arguments to function");
    mech_map = getMap(mech->mapindex);
    ticnum = atoi(args[0]);
    DOCHECK(!(ticnum >= 0 && ticnum < NUM_TICS), "TIC out of range!");

/*   notify (player, tprintf ("Firing all weapons in TIC #%d at default target!", ticnum)); */
    weaps = 1;
    ftflag = 1;
    temp_args = args;
    temp_argc = argc;
    multi_weap_sel(mech, player, args[0], 0, firetic_sub_func);
    ftflag = 0;
}

static MECH *present_mech;
static int present_count;

static char *listtic_fun(int i)
{
    int j, k, l, section, critical;
    static char buf[MBUF_SIZE];
    int count = 0;
    MECH *mech = present_mech;
    int rtar;

    if (!present_count) {
	strcpy(buf, "No weapons in tic.");
	return buf;
    }
    rtar = i / 2 + (i % 2 ? ((present_count + 1) / 2) : 0);
    for (j = 0; j < MAX_WEAPONS_PER_MECH; j++) {
	k = j / SINGLE_TICLONG_SIZE;
	l = j % SINGLE_TICLONG_SIZE;
	if (mech->tic[present_tic][k] & (1 << l)) {
	    if (count == rtar) {
		if ((FindWeaponNumberOnMech(mech, j, &section, &critical))
		    == -1) {
		    mech->tic[present_tic][k] &= ~(1 << l);
		    j = MAX_WEAPONS_PER_MECH;
		    continue;
		}
		sprintf(buf, "#%2d %3s %-16s %s", j,
		    ShortArmorSectionString(MechType(mech), MechMove(mech),
			section), &MechWeapons[Weapon2I(GetPartType(mech,
				section, critical))].name[3],
		    PartIsNonfunctional(mech, section,
			critical) ? "(*)" : "");
		return buf;
	    }
	    count++;
	}
    }
    strcpy(buf, "Unknown - error of some sort occured");
    return buf;
}

void listtic_sub(dbref player, MECH * mech, char *buffer)
{
    int ticnum, argc;
    char *args[2];
    int i, j, k, count = 0;
    coolmenu *c;

    DOCHECK((argc =
	    mech_parseattributes(buffer, args, 2)) != 1,
	"Invalid number of arguments!");
    ticnum = atoi(args[0]);
    DOCHECK(!(ticnum >= 0 && ticnum < NUM_TICS), "TIC out of range!");
    present_mech = mech;
    present_tic = ticnum;
    for (i = 0; i < MAX_WEAPONS_PER_MECH; i++) {
	j = i / SINGLE_TICLONG_SIZE;
	k = i % SINGLE_TICLONG_SIZE;
	if (mech->tic[ticnum][j] & (1 << k))
	    count++;
    }
    present_count = count;
    c = SelCol_FunStringMenuK(2, tprintf("TIC #%d listing for %s", ticnum,
	    GetMechID(mech)), listtic_fun, MAX(1, count));
    ShowCoolMenu(player, c);
    KillCoolMenu(c);
}

void mech_cleartic(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    cch(MECH_USUALSM);
    cleartic_sub(player, mech, buffer);
}

void mech_addtic(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    cch(MECH_USUALSM);
    addtic_sub(player, mech, buffer);
}

void mech_deltic(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    cch(MECH_USUALSM);
    deltic_sub(player, mech, buffer);
}

void mech_firetic(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    cch(MECH_USUALO);
    firetic_sub(player, mech, buffer);
}

void mech_listtic(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    cch(MECH_USUALSM);
    listtic_sub(player, mech, buffer);
}

void heat_cutoff_event(MUXEVENT * e)
{
    MECH *mech = (MECH *) e->data;

    if (e->data2) {
	mech_notify(mech, MECHALL,
	    "%cyHeat dissipation cutoff engaged!%c");
	MechCritStatus(mech) |= HEATCUTOFF;
    } else {
	mech_notify(mech, MECHALL,
	    "%cgHeat dissipation cutoff disengaged!%c");
	MechCritStatus(mech) &= ~(HEATCUTOFF);
    }
}

void heat_cutoff(dbref player, void *data, char *buffer)
{
    MECH *mech = (MECH *) data;

    cch(MECH_USUALSMO);
    if (HeatcutoffChanging(mech)) {
	notify(player,
	    "You are already toggling heat cutoff status. Please be patient.");
	return;
    }
    if (Heatcutoff(mech)) {
	notify(player, "Disengaging heat dissipation cutoff...");
	MECHEVENT(mech, EVENT_HEATCUTOFFCHANGING, heat_cutoff_event, 4, 0);
    } else {
	notify(player, "Engaging heat dissipation cutoff...");
	MECHEVENT(mech, EVENT_HEATCUTOFFCHANGING, heat_cutoff_event, 4, 1);
    }
}