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.tech.h,v 1.5 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: Fri Aug 30 15:22:08 1996 fingon
 * Last modified: Sat Jun  6 20:49:50 1998 fingon
 *
 */

#include "config.h"

#ifndef MECH_TECH_H
#define MECH_TECH_H

#include "mech.events.h"

/* In minutes */
#define MAX_TECHTIME 600
#if 1
#define TECH_TICK     60
#define TECH_UNIT "minute"
#else
#define TECH_TICK      1
#define TECH_UNIT "second"
#endif

/* Tech skill modifiers ; + = bad, - = good */
#define PARTTYPE_DIFFICULTY(a) (1)
#define WEAPTYPE_DIFFICULTY(a) ((int) (sqrt(MechWeapons[Weapon2I(a)].criticals)*1.5-1.1))
#define REPAIR_DIFFICULTY     0
#define REPLACE_DIFFICULTY     1
#define RELOAD_DIFFICULTY      1
#define FIXARMOR_DIFFICULTY    1
#define FIXINTERNAL_DIFFICULTY 2
#define REATTACH_DIFFICULTY    3
#define REMOVEG_DIFFICULTY     1
#define REMOVEP_DIFFICULTY     0
#define REMOVES_DIFFICULTY     2
#define RESEAL_DIFFICULTY    0	/* Added 8/4/99. Kipsta. */
#define REPLACESUIT_DIFFICULTY    3
#define ENHCRIT_DIFFICULTY    0

/* Times are in minutes */
#define MOUNT_BOMB_TIME  5
#define UMOUNT_BOMB_TIME 5
#define REPLACEGUN_TIME  60
#define REPLACEPART_TIME 45
#define REPAIRGUN_TIME   20
#define REPAIRENHCRIT_TIME  15
#define REPAIRPART_TIME  15
#define RELOAD_TIME      10
#define FIXARMOR_TIME    3
#define FIXINTERNAL_TIME 9
#define REATTACH_TIME    240
#define REMOVEP_TIME     40
#define REMOVEG_TIME     40
#define REMOVES_TIME     120
#define RESEAL_TIME    60	/* Added 8/4/99. Kipsta. */
#define REPLACESUIT_TIME    120

#define TECHCOMMANDH(a) \
   void a (dbref player, void * data, char * buffer)
#define TECHCOMMANDB \
 MECH *mech = (MECH *) data; \
 int loc, part, t, full, now, from, to, change, mod=2, isds=0; \
 char *c;


#define TECHCOMMANDC \
DOCHECK(!(Tech(player)),"Insufficient clearance to access the command."); \
DOCHECK(!mech, "Error has occured in techcommand ; please contact a wiz"); \
isds = DropShip(MechType(mech)); \
DOCHECK(Starting(mech) && !Wiz(player), "The mech's starting up! Please stop the sequence first."); \
DOCHECK(Started(mech) && !Wiz(player), "The mech's started up ; please shut it down first."); \
DOCHECK(!isds && !MechStall(mech) && !Wiz(player), "The 'mech isn't in a repair stall!");

#define TECHCOMMANDD \
DOCHECK(!(Tech(player)),"Insufficient clearance to access the command."); \
DOCHECK(!mech, "Error has occured in techcommand ; please contact a wiz"); \
isds = DropShip(MechType(mech)); \
DOCHECK(Starting(mech) && !Wiz(player), "The mech's starting up! Please stop the sequence first."); \
DOCHECK(Started(mech) && !Wiz(player), "The mech's started up ; please shut it down first."); \
DOCHECK(mudconf.btech_limitedrepairs && !isds && !MechStall(mech) && !Wiz(player), "The 'mech isn't in a repair stall!");

#define ETECHCOMMAND(a) \
 void a (dbref player, void *data, char *buffer)

#define LOCMAX 16
#define POSMAX 16
#define EXTMAX 256
#define PLAYERPOS (LOCMAX*POSMAX*EXTMAX)

#define TECHEVENT(a) \
   void a (MUXEVENT *e) \
     { MECH *mech = (MECH *) e->data;  \
       int earg = (int) (e->data2) % PLAYERPOS;

#define ETECHEVENT(a) \
   extern void a (MUXEVENT *e)

#define START(a) notify(player, a)
#ifndef BT_FREETECHTIME
#define FIXEVENT(time,d1,d2,fu,type) \
     muxevent_add(MAX(1, time), 0, type, fu, (void *) d1, (void *) ((d2) + player * PLAYERPOS))
#else
#define FIXEVENT(time,d1,d2,fu,type) \
    muxevent_add((mudconf.btech_freetechtime ? 2 : MAX(2, time)), 0, type, fu, (void *) d1, (void *) ((d2) + player * PLAYERPOS))
#endif
#define REPAIREVENT(time,d1,d2,fu,type) \
     FIXEVENT((time)*TECH_TICK,d1,d2,fu,type)
#define STARTREPAIR(time,d1,d2,fu,type) \
     FIXEVENT(tech_addtechtime(player, (time * mod) / 2),d1,d2,fu,type)
#define STARTIREPAIR(time,d1,d2,fu,type,amount) \
     FIXEVENT((tech_addtechtime(player, (time * mod) / 2) - (amount > 0 ? TECH_TICK * (time * (amount - 1) / (amount)) : 0)), d1, d2, fu, type)
#define FAKEREPAIR(time,type,d1,d2) \
     FIXEVENT(tech_addtechtime(player, (time * mod) / 2),d1,d2,very_fake_func,type)

/* replace gun/part, repair gun/part (loc/pos) */
#define DOTECH_LOCPOS(diff,flunkfunc,succfunc,resourcefunc,time,d1,d2,fu,type,msg,isgun)\
   if (resourcefunc(player,mech,loc,part)>=0) { START(msg); \
   if ((!isgun && tech_roll(player, mech, diff) < 0) || \
       (isgun && tech_weapon_roll(player, mech, diff) < 0)) { mod = 3;  \
   if (flunkfunc(player,mech,loc,part)<0) { FAKEREPAIR(time,type,d1,d2); return;}} \
    else \
     { if (succfunc(player,mech,loc,part)<0) return; } \
     STARTREPAIR(time,d1,d2,fu,type); }

/* reload (loc/pos/amount) */
#define DOTECH_LOCPOS_VAL(diff,flunkfunc,succfunc,resourcefunc,amo,time,d1,d2,fu,type,msg)\
   if (resourcefunc(player,mech,loc,part,amo)<0) return; \
   START(msg); \
   if (tech_roll(player, mech, diff) < 0) { mod = 3; \
   if (flunkfunc(player,mech,loc,part,amo)<0) {FAKEREPAIR(time,type,d1,d2);return;}}\
     else \
   { if (succfunc(player,mech,loc,part,amo)<0) return; } \
   STARTREPAIR(time,d1,d2,fu,type)


/* fixarmor/internal (loc/amount) */
#define DOTECH_LOC_VAL_S(diff,flunkfunc,succfunc,resourcefunc,amo,time,type,d1,d2,msg) \
   if (resourcefunc(player,mech,loc,amo)<0) return; \
   START(msg); \
   if (tech_roll(player, mech, diff) < 0) { mod = 3; \
   if (flunkfunc(player,mech,loc,amo)<0) { FAKEREPAIR(time,type,d1,d2); return; }} \
   else \
     { if (succfunc(player,mech,loc,amo)<0) return; }

#define DOTECH_LOC_VAL(diff,flunkfunc,succfunc,resourcefunc,amo,time,d1,d2,fu,type,msg) \
   if (resourcefunc(player,mech,loc,amo)<0) return; \
   START(msg); \
   if (tech_roll(player, mech, diff) < 0) { mod = 3; \
   if (flunkfunc(player,mech,loc,amo)<0) { FAKEREPAIR(time,type,d1,d2); return; }} \
   else \
     { if (succfunc(player,mech,loc,amo)<0) return; } \
   STARTREPAIR(time,d1,d2,fu,type)

/* reattach and reseal (loc) */
#define DOTECH_LOC(diff,flunkfunc,succfunc,resourcefunc,time,d1,d2,fu,type,msg) \
   if (resourcefunc(player,mech,loc)<0) return; \
   START(msg); \
   if (tech_roll(player, mech, diff) < 0) { mod = 3; \
   if (flunkfunc(player,mech,loc)<0) { FAKEREPAIR(time,type,d1,d2);return; }} \
    else \
   { if (succfunc(player,mech,loc)<0) return; } \
   STARTREPAIR(time,d1,d2,fu,type)

#define TFUNC_LOCPOS_VAL(name) \
int name (dbref player,MECH *mech,int loc,int part, int * val)
#define TFUNC_LOC_VAL(name) \
int name (dbref player, MECH *mech, int loc, int * val)
#define TFUNC_LOCPOS(name) \
int name (dbref player, MECH *mech, int loc, int part)
#define TFUNC_LOC(name) \
int name (dbref player, MECH *mech, int loc)
#define TFUNC_LOC_RESEAL(name) int name (dbref player, MECH *mech, int loc)
#define NFUNC(a) a { return 0; }



ETECHCOMMAND(tech_removegun);
ETECHCOMMAND(tech_removepart);
ETECHCOMMAND(tech_removesection);
ETECHCOMMAND(tech_replacegun);
ETECHCOMMAND(tech_repairgun);
ETECHCOMMAND(tech_fixenhcrit);
ETECHCOMMAND(tech_replacepart);
ETECHCOMMAND(tech_repairpart);
ETECHCOMMAND(tech_toggletype);
ETECHCOMMAND(tech_reload);
ETECHCOMMAND(tech_unload);
ETECHCOMMAND(tech_fixarmor);
ETECHCOMMAND(tech_fixinternal);
ETECHCOMMAND(tech_reattach);
ETECHCOMMAND(tech_checkstatus);
ETECHCOMMAND(tech_reseal);
ETECHCOMMAND(tech_replacesuit);
ECMD(show_mechs_damage);
ECMD(tech_fix);

#define PACK_LOCPOS(loc,pos)          ((loc) + (pos)*LOCMAX)
#define PACK_LOCPOS_E(loc,pos,extra)  ((loc) + (pos)*LOCMAX + (extra)*LOCMAX*POSMAX)

#define UNPACK_LOCPOS(var,loc,pos)  loc = (var % LOCMAX);pos = (var / LOCMAX) % POSMAX
#define UNPACK_LOCPOS_E(var,loc,pos,extra) UNPACK_LOCPOS(var,loc,pos);extra = var / (LOCMAX * POSMAX)

#ifndef BT_COMPLEXREPAIRS
#define ProperArmor(mech) \
(Cargo(\
       (MechSpecials(mech) & FF_TECH) ? FF_ARMOR : \
       (MechSpecials(mech) & HARDA_TECH) ? HD_ARMOR : \
       (MechSpecials2(mech) & STEALTH_ARMOR_TECH) ? STH_ARMOR : \
       (MechSpecials2(mech) & HVY_FF_ARMOR_TECH) ? HVY_FF_ARMOR : \
       (MechSpecials2(mech) & LT_FF_ARMOR_TECH) ? LT_FF_ARMOR : \
       (MechInfantrySpecials(mech) & CS_PURIFIER_STEALTH_TECH) ? PURIFIER_ARMOR : \
       S_ARMOR))

#define ProperInternal(mech) \
(Cargo(\
       (MechSpecials(mech) & ES_TECH) ? ES_INTERNAL : \
       (MechSpecials(mech) & REINFI_TECH) ? RE_INTERNAL : \
       (MechSpecials(mech) & COMPI_TECH) ? CO_INTERNAL : \
       S_INTERNAL))
#endif

#define GrabPartsM(m,a,b,c) econ_change_items(IsDS(m) ? AeroBay(m,0) : Location(m->mynum),a,b,0-c)
#define PartAvailM(m,a,b,c) (econ_find_items(IsDS(m) ? AeroBay(m,0) : Location(m->mynum),a,b)>=c)
#ifndef BT_COMPLEXREPAIRS
#define AddPartsM(m,a,b,c) econ_change_items(IsDS(m) ? AeroBay(m,0) : Location(m->mynum), alias_part(m, a) , b, c)
#else
#define AddPartsM(m,l,a,b,c) econ_change_items(IsDS(m) ? AeroBay(m,0) : Location(m->mynum), alias_part(m, a, l) , b, c)
#endif
#define AVCHECKM(m,a,b,c)    DOCHECK1(!PartAvailM(m,a,b,c), tprintf("Not enough %ss in store! You need to have atleast %d.",part_name(a,b),c));

#ifndef BT_COMPLEXREPAIRS
#define alias_part(m,t) \
  (IsActuator(t) ? Cargo(S_ACTUATOR) : \
   (t == Special(ENGINE) ? \
    ((MechSpecials(m) & XL_TECH) ? Cargo(XL_ENGINE) : \
     (MechSpecials(m) & ICE_TECH) ? Cargo(IC_ENGINE) : \
     (MechSpecials(m) & XXL_TECH) ? Cargo(XXL_ENGINE) : \
     (MechSpecials(m) & CE_TECH) ? Cargo(COMP_ENGINE) : \
     (MechSpecials(m) & LE_TECH) ? Cargo(LIGHT_ENGINE) : t) : \
   (t == Special(HEAT_SINK) && MechHasDHS(m) ? Cargo(DOUBLE_HEAT_SINK) : t)))
#endif

ETECHEVENT(muxevent_tickmech_reattach);
ETECHEVENT(muxevent_tickmech_reseal);
ETECHEVENT(muxevent_tickmech_reload);
ETECHEVENT(muxevent_tickmech_removegun);
ETECHEVENT(muxevent_tickmech_removepart);
ETECHEVENT(muxevent_tickmech_removesection);
ETECHEVENT(muxevent_tickmech_repairarmor);
ETECHEVENT(muxevent_tickmech_repairgun);
ETECHEVENT(muxevent_tickmech_repairenhcrit);
ETECHEVENT(muxevent_tickmech_repairinternal);
ETECHEVENT(muxevent_tickmech_repairpart);
ETECHEVENT(muxevent_tickmech_replacegun);
ETECHEVENT(muxevent_tickmech_mountbomb);
ETECHEVENT(muxevent_tickmech_umountbomb);
ETECHEVENT(muxevent_tickmech_replacesuit);
ETECHEVENT(very_fake_func);

void loadrepairs(FILE * f);
void saverepairs(FILE * f);
int valid_ammo_mode(MECH * mech, int loc, int part, int let);

#endif				/* MECH_TECH_H */