/*
* $Id: mech.tech.events.c,v 1.4 2005/06/24 04:39:08 av1-op 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: Sun Sep 1 16:06:19 1996 fingon
* Last modified: Sun Jun 14 16:45:08 1998 fingon
*
*/
#include "config.h"
#include "mech.h"
#include "muxevent.h"
#include "mech.events.h"
#include "mech.tech.h"
#include "failures.h"
#include "p.econ.h"
#include "p.mech.utils.h"
#include "p.mech.tech.do.h"
#include "p.mech.status.h"
#define VERBOSE_ENDS
static int completely_intact_int(MECH * mech)
{
int i;
for (i = 0; i < NUM_SECTIONS; i++)
if (!GetSectInt(mech, i) && GetSectOInt(mech, i))
return 0;
return 1;
}
void muxevent_tickmech_removesection(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
char buf[MBUF_SIZE];
int loc, pos, extra;
/* changed Special2I to Special on AddPartsM statements */
UNPACK_LOCPOS_E(earg, loc, pos, extra);
#ifndef BT_COMPLEXREPAIRS
AddPartsM(mech, ProperInternal(mech), 0, (2 * GetSectInt(mech,
loc)) / extra);
AddPartsM(mech, ProperArmor(mech), 0, (2 * GetSectArmor(mech,
loc)) / extra);
AddPartsM(mech, Cargo(S_ELECTRONIC), 0, (GetSectInt(mech,
loc)) / extra);
#else
AddPartsM(mech, loc, ProperInternal(mech), 0, (2 * GetSectInt(mech,
loc)) / extra);
AddPartsM(mech, loc, ProperArmor(mech), 0, (2 * GetSectArmor(mech,
loc)) / extra);
AddPartsM(mech, loc, Cargo(S_ELECTRONIC), 0, (GetSectInt(mech,
loc)) / extra);
#endif
mech_Detach(mech, loc);
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL, tprintf("%s has been removed.", buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
void muxevent_tickmech_removegun(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos, i, extra;
char buf[MBUF_SIZE];
UNPACK_LOCPOS_E(earg, loc, pos, extra);
for (i = pos;
i < (pos + GetWeaponCrits(mech, Weapon2I(GetPartType(mech, loc,
pos)))); i++)
DestroyPart(mech, loc, i);
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
if (extra == 2 && (e->function != very_fake_func)) {
#ifndef BT_COMPLEXREPAIRS
AddPartsM(mech, FindAmmoType(mech, loc, pos), GetPartBrand(mech,
loc, pos), 1);
#else
AddPartsM(mech, loc, FindAmmoType(mech, loc, pos), GetPartBrand(mech,
loc, pos), 1);
#endif
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s from %s has been removed.", pos_part_name(mech,
loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
} else {
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s from %s has been removed and scrapped.",
pos_part_name(mech, loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
}
void muxevent_tickmech_removepart(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos, extra;
char buf[MBUF_SIZE];
UNPACK_LOCPOS_E(earg, loc, pos, extra);
DestroyPart(mech, loc, pos);
if (MechType(mech) == CLASS_MECH)
do_magic(mech);
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
if (extra == 2 && (e->function != very_fake_func)) {
#ifndef BT_COMPLEXREPAIRS
AddPartsM(mech, FindAmmoType(mech, loc, pos), GetPartBrand(mech,
loc, pos), 1);
#else
AddPartsM(mech, loc, FindAmmoType(mech, loc, pos), GetPartBrand(mech,
loc, pos), 1);
#endif
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s from %s has been removed.", pos_part_name(mech,
loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
} else {
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s from %s has been removed and scrapped.",
pos_part_name(mech, loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
}
void muxevent_tickmech_repairarmor(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc = earg % 16;
int amount = (earg / 16) % 256;
int player = ((int) e->data2) / PLAYERPOS;
char buf[MBUF_SIZE];
if (loc >= 8) {
SetSectRArmor(mech, loc % 8, MIN(GetSectRArmor(mech, loc % 8) + 1,
GetSectORArmor(mech, loc % 8)));
} else {
SetSectArmor(mech, loc, MIN(GetSectArmor(mech, loc) + 1,
GetSectOArmor(mech, loc)));
}
amount--;
if (amount < 0)
return;
if (amount <= 0) {
ArmorStringFromIndex(loc % 8, buf, MechType(mech), MechMove(mech));
if (loc >= 8) {
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s's rear armor repairs have been finished.",
buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
} else {
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s's armor repairs have been finished.",
buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
if (MechType(mech) != CLASS_MECH && completely_intact_int(mech))
do_magic(mech);
return;
}
REPAIREVENT(FIXARMOR_TIME, mech, (amount * 16 + loc),
muxevent_tickmech_repairarmor, EVENT_REPAIR_FIX);
}
void muxevent_tickmech_repairinternal(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc = earg % 16;
int amount = (earg / 16) % 256;
int player = ((int) e->data2) / PLAYERPOS;
char buf[MBUF_SIZE];
SetSectInt(mech, loc, GetSectInt(mech, loc) + 1);
if (GetSectInt(mech, loc) > GetSectOInt(mech, loc))
SetSectInt(mech, loc, GetSectOInt(mech, loc));
amount--;
if (amount < 0)
return;
if (amount <= 0) {
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL,
tprintf("%s's internal repairs have been finished.", buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
if (MechType(mech) != CLASS_MECH && completely_intact_int(mech))
do_magic(mech);
return;
}
REPAIREVENT(FIXINTERNAL_TIME, mech, (amount * 16 + loc),
muxevent_tickmech_repairinternal, EVENT_REPAIR_FIXI);
}
void muxevent_tickmech_reattach(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
char buf[MBUF_SIZE];
/* Basically: Unset the limb destroyed, without doing a thing to
damaged parts */
mech_ReAttach(mech, earg);
ArmorStringFromIndex(earg, buf, MechType(mech), MechMove(mech));
if (completely_intact_int(mech))
do_magic(mech);
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL, tprintf("%s has been reattached.",
buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
void muxevent_tickmech_replacesuit(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
char buf[MBUF_SIZE];
ArmorStringFromIndex(earg, buf, MechType(mech), MechMove(mech));
mech_ReplaceSuit(mech, earg);
do_magic(mech);
mech_notify(mech, MECHALL, tprintf("%s has been replaced.", buf));
}
/*
* Added for new flood code by Kipsta
* 8/4/99
*/
void muxevent_tickmech_reseal(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
char buf[MBUF_SIZE];
mech_ReSeal(mech, earg);
ArmorStringFromIndex(earg, buf, MechType(mech), MechMove(mech));
mech_notify(mech, MECHALL, tprintf("%s has been resealed.", buf));
}
void muxevent_tickmech_replacegun(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos, i, brand;
char buf[MBUF_SIZE];
UNPACK_LOCPOS_E(earg, loc, pos, brand);
for (i = pos;
i < (pos + GetWeaponCrits(mech, Weapon2I(GetPartType(mech, loc,
pos)))); i++) {
mech_RepairPart(mech, loc, i);
ClearTempNuke(mech, loc, i);
if (brand) {
SetPartBrand(mech, loc, i, brand);
}
}
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~(DESTROYED);
mech_notify(mech, MECHALL, tprintf("%s on %s has been replaced.",
pos_part_name(mech, loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
void muxevent_tickmech_repairgun(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos, i;
char buf[MBUF_SIZE];
UNPACK_LOCPOS(earg, loc, pos);
for (i = pos;
i < (pos + GetWeaponCrits(mech, Weapon2I(GetPartType(mech, loc,
pos)))); i++) {
mech_RepairPart(mech, loc, i);
ClearTempNuke(mech, loc, i);
}
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL, tprintf("%s on %s has been repaired.",
pos_part_name(mech, loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
void muxevent_tickmech_repairenhcrit(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos;
char buf[MBUF_SIZE];
int wCritType, wWeapSize, wFirstCrit;
UNPACK_LOCPOS(earg, loc, pos);
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
mech_notify(mech, MECHALL, tprintf("%s on %s has been repaired.",
pos_part_name(mech, loc, pos), buf));
UnDamagePart(mech, loc, pos);
/* Get the crit type */
wCritType = GetPartType(mech, loc, pos);
/* Get the max number of crits for this weapon */
wWeapSize = GetWeaponCrits(mech, Weapon2I(wCritType));
/* Find the first crit */
wFirstCrit =
FindFirstWeaponCrit(mech, loc, pos, 0, wCritType, wWeapSize);
SetPartTempNuke(mech, loc, wFirstCrit, 0);
}
void muxevent_tickmech_repairpart(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos;
char buf[MBUF_SIZE];
UNPACK_LOCPOS(earg, loc, pos);
mech_RepairPart(mech, loc, pos);
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL, tprintf("%s on %s has been repaired.",
pos_part_name(mech, loc, pos), buf));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
void muxevent_tickmech_reload(MUXEVENT * e)
{
MECH *mech = (MECH *) e->data;
int earg = (int) (e->data2) % PLAYERPOS;
int loc, pos, extra;
char buf[MBUF_SIZE];
UNPACK_LOCPOS_E(earg, loc, pos, extra);
if (extra) {
SetPartData(mech, loc, pos, 0);
if (extra > 1)
#ifndef BT_COMPLEXREPAIRS
AddPartsM(mech, FindAmmoType(mech, loc, pos),
GetPartBrand(mech, loc, pos), 1);
#else
AddPartsM(mech, loc, FindAmmoType(mech, loc, pos),
GetPartBrand(mech, loc, pos), 1);
#endif
} else
mech_FillPartAmmo(mech, loc, pos);
ArmorStringFromIndex(loc, buf, MechType(mech), MechMove(mech));
do {
int i = 0;
if (Destroyed(mech))
i = 1;
MechStatus(mech) &= ~DESTROYED;
mech_notify(mech, MECHALL, tprintf("%s on %s has been %sloaded.",
pos_part_name(mech, loc, pos), buf, extra ? "un" : "re"));
if (i)
MechStatus(mech) |= DESTROYED;
} while (0);
}
void muxevent_tickmech_mountbomb(MUXEVENT * e)
{
/* MECH *mech = (MECH *) e->data; */
/* int earg = (int) (e->data2) % PLAYERPOS; */
}
void muxevent_tickmech_umountbomb(MUXEVENT * e)
{
/* MECH *mech = (MECH *) e->data; */
/* int earg = (int) (e->data2) % PLAYERPOS; */
}