src/hcode/btech/mech.update.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/file.h>
#include "mech.h"
#include "failures.h"
#include "mech.events.h"
#include "mech.ice.h"
#include "p.mech.ecm.h"
#include "p.mech.tag.h"
#include "p.mech.combat.h"
#include "p.mech.combat.misc.h"
#include "p.mech.damage.h"
#include "p.mech.fire.h"
#include "p.mech.startup.h"
#include "p.mech.utils.h"
#include "p.mech.update.h"
#include "p.btechstats.h"
#include "p.mech.physical.h"
#include "p.bsuit.h"
#include "p.mine.h"
#include "p.mech.lite.h"
#include "p.mech.pickup.h"

Include dependency graph for mech.update.c:

Go to the source code of this file.

Defines

#define FASA_TURN_MOD   3/2
#define DECREASE_HEAT(spd)   tempspeed *= (ceil((rint((maxspeed / 1.5) / MP1) - (spd/MP1) ) * 1.5) * MP1) / maxspeed
#define DECREASE_OLD(spd)   tempspeed *= (maxspeed - (spd)) / maxspeed
#define INCREASE_OLD(spd)   DECREASE_OLD(-(spd))
#define DECREASE_NEW(spd)   tempspeed *= MP1 / (MP1 + spd)
#define INCREASE_NEW(spd)   tempspeed *= (MP1 + spd/2) / MP1
#define DECREASE(s)   DECREASE_NEW(s)
#define INCREASE(s)   INCREASE_NEW(s)
#define MOVE_BACK

Enumerations

enum  {
  JUMP, WALK_WALL, WALK_DROP, HIT_UNDER_BRIDGE,
  WALK_BACK
}

Functions

int fiery_death (MECH *mech)
int bridge_w_elevation (MECH *mech)
void bridge_set_elevation (MECH *mech)
int DSOkToNotify (MECH *mech)
int collision_check (MECH *mech, int mode, int le, int lt)
void CheckNavalHeight (MECH *mech, int oz)
void move_mech (MECH *mech)
void CheckVTOLHeight (MECH *mech)
void UpdateHeading (MECH *mech)
float terrain_speed (MECH *mech, float tempspeed, float maxspeed, int terrain, int elev)
void UpdateSpeed (MECH *mech)
int OverheatMods (MECH *mech)
void ammo_explosion (MECH *attacker, MECH *mech, int ammoloc, int ammocritnum, int damage)
void HandleOverheat (MECH *mech)
static int EnableSomeHS (MECH *mech, int numsinks)
static int DisableSomeHS (MECH *mech, int numsinks)
void UpdateHeat (MECH *mech)
int recycle_weaponry (MECH *mech)
int SkidMod (float Speed)
void move_unit_back (MECH *mech, float deltax, float deltay, int lastelevation, int ot, int le)
void NewHexEntered (MECH *mech, MAP *mech_map, float deltax, float deltay, int last_z)
void CheckDamage (MECH *wounded)
void UpdatePilotSkillRolls (MECH *mech)
void updateAutoturnTurret (MECH *mech)
void mech_update (dbref key, void *data)

Variables

int arc_override


Define Documentation

#define DECREASE (  )     DECREASE_NEW(s)

Definition at line 931 of file mech.update.c.

Referenced by terrain_speed().

#define DECREASE_HEAT ( spd   )     tempspeed *= (ceil((rint((maxspeed / 1.5) / MP1) - (spd/MP1) ) * 1.5) * MP1) / maxspeed

Definition at line 919 of file mech.update.c.

Referenced by UpdateSpeed().

#define DECREASE_NEW ( spd   )     tempspeed *= MP1 / (MP1 + spd)

Definition at line 926 of file mech.update.c.

#define DECREASE_OLD ( spd   )     tempspeed *= (maxspeed - (spd)) / maxspeed

Definition at line 922 of file mech.update.c.

Referenced by UpdateSpeed().

#define FASA_TURN_MOD   3/2

Referenced by UpdateHeading().

#define INCREASE (  )     INCREASE_NEW(s)

Definition at line 932 of file mech.update.c.

#define INCREASE_NEW ( spd   )     tempspeed *= (MP1 + spd/2) / MP1

Definition at line 928 of file mech.update.c.

#define INCREASE_OLD ( spd   )     DECREASE_OLD(-(spd))

Definition at line 924 of file mech.update.c.

Referenced by terrain_speed().

#define MOVE_BACK

Value:

MechFX(mech) -= deltax;\
                MechFY(mech) -= deltay;\
                MechX(mech) = MechLastX(mech);\
                MechY(mech) = MechLastY(mech);\
                MechZ(mech) = lastelevation;\
                MechFZ(mech) = MechZ(mech) * ZSCALE;\
                MechTerrain(mech) = ot;\
                MechElev(mech) = le;


Enumeration Type Documentation

anonymous enum

Enumerator:
JUMP 
WALK_WALL 
WALK_DROP 
HIT_UNDER_BRIDGE 
WALK_BACK 

Definition at line 93 of file mech.update.c.

00093      {
00094         JUMP, WALK_WALL, WALK_DROP, HIT_UNDER_BRIDGE, WALK_BACK
00095 };


Function Documentation

void ammo_explosion ( MECH attacker,
MECH mech,
int  ammoloc,
int  ammocritnum,
int  damage 
)

Definition at line 1136 of file mech.update.c.

References confdata::btech_inferno_penalty, CLASS_BSUIT, CLASS_MW, DamageMech(), DestroyPart, GetPartAmmoMode, HasBoolAdvantage(), headhitmwdamage(), Inferno_Hit(), INFERNO_MODE, mech_notify(), MECHALL, MechLOSBroadcast(), MECHPILOT, MechPilot, MechType, MechWeapHeat, and mudconf.

Referenced by HandleMechCrit(), HandleOverheat(), and mech_explode_event().

01138 {
01139         if(MechType(mech) == CLASS_MW) {
01140                 mech_notify(mech, MECHALL, "Your weapon's ammo explodes!");
01141                 MechLOSBroadcast(mech, "'s weapon's ammo explodes!");
01142         } else {
01143                 mech_notify(mech, MECHALL, "Ammunition explosion!");
01144                 if(GetPartAmmoMode(mech, ammoloc, ammocritnum) & INFERNO_MODE)
01145                         MechLOSBroadcast(mech,
01146                                                          "is suddenly enveloped by a brilliant fireball!");
01147                 else
01148                         MechLOSBroadcast(mech, "has an internal ammo explosion!");
01149         }
01150         DestroyPart(mech, ammoloc, ammocritnum);
01151         if(!attacker)
01152                 return;
01153         if(GetPartAmmoMode(mech, ammoloc, ammocritnum) & INFERNO_MODE) {
01154                 Inferno_Hit(mech, mech, damage / 4, 0);
01155                 if(mudconf.btech_inferno_penalty)
01156                         MechWeapHeat(mech) += 30.0;
01157                 damage = damage / 2;
01158         }
01159         if(MechType(mech) == CLASS_BSUIT)
01160                 DamageMech(mech, attacker, 0, -1, ammoloc, 0, 0, damage, 0, -1, 0,
01161                                    -1, 0, 0);
01162         else
01163                 DamageMech(mech, attacker, 0, -1, ammoloc, 0, 0, -1, damage, -1, 0,
01164                                    -1, 0, 0);
01165 
01166         if(MechType(mech) != CLASS_BSUIT) {
01167                 mech_notify(mech, MECHPILOT,
01168                                         "You take personal injury from the ammunition explosion!");
01169                 if(HasBoolAdvantage(MechPilot(mech), "pain_resistance"))
01170                         headhitmwdamage(mech, mech, 1);
01171                 else
01172                         headhitmwdamage(mech, mech, 2);
01173         }
01174 }

void bridge_set_elevation ( MECH mech  ) 

Definition at line 71 of file mech.update.c.

References bridge_w_elevation(), MechUpperElevation, MechZ, MoveMod, and Overwater.

Referenced by DropSetElevation().

00072 {
00073         if(MechZ(mech) < (MechUpperElevation(mech) - MoveMod(mech))) {
00074                 if(Overwater(mech))
00075                         MechZ(mech) = 0;
00076                 else
00077                         MechZ(mech) = bridge_w_elevation(mech);
00078                 return;
00079         }
00080         MechZ(mech) = MechUpperElevation(mech);
00081 }

int bridge_w_elevation ( MECH mech  ) 

Definition at line 66 of file mech.update.c.

Referenced by bridge_set_elevation(), collision_check(), DropGetElevation(), and NewHexEntered().

00067 {
00068         return -1;
00069 }

void CheckDamage ( MECH wounded  ) 

Definition at line 2701 of file mech.update.c.

References AcceptableDegree(), confdata::btech_newstagger, CheckingStaggerDamage, CLASS_MECH, Fallen, IsDS, Jumping, LastStaggerNotify, MadePilotSkillRoll(), mech_notify(), MECHALL, MechFacing, MechFalls(), MechLOSBroadcast(), MechStaggeredLastTurn, MechStaggerStamp, MechTurnDamage, MechType, mudconf, muxevent_tick, MECH::mynum, OODing, Roll(), SendDebug, SetFacing, SetMechStaggerStamp, StaggerDamage, StaggerLevel, StartStaggerCheck, StopStaggerCheck, tprintf(), and TURN.

Referenced by UpdatePilotSkillRolls().

02702 {
02703         /* should be called from UpdatePilotSkillRolls */
02704         /* this is so that a roll will be made only when the mech takes damage */
02705         int now = muxevent_tick % TURN;
02706         int staggerLevel = 0;
02707         int headingChange = 0;
02708 
02709         if(mudconf.btech_newstagger) {
02710 
02711                 /* phase out post-stagger assistance - see check_stagger_event() */
02712                 if(StaggerDamage(wounded) < 0) {
02713                         StaggerDamage(wounded) += 1;
02714                         return;
02715                 }
02716                 if(StaggerDamage(wounded) == 0) {
02717                         return;
02718                 }
02719 
02720                 staggerLevel = StaggerLevel(wounded);
02721 
02722                 if(Fallen(wounded) || (MechType(wounded) != CLASS_MECH)) {
02723                         if(CheckingStaggerDamage(wounded) || (StaggerDamage(wounded) > 0))
02724                                 StopStaggerCheck(wounded);
02725 
02726                         return;
02727                 }
02728 
02729                 if(!CheckingStaggerDamage(wounded)) {
02730                         if((Jumping(wounded) && (staggerLevel < 1)) || !Jumping(wounded))
02731                                 StartStaggerCheck(wounded);
02732                 }
02733 
02734                 if(staggerLevel < 1) {
02735                         return;
02736                 }
02737 
02738                 SendDebug(tprintf("For %d. StaggerDamage: %d. StaggerLevel: %d.",
02739                                                   wounded->mynum, StaggerDamage(wounded),
02740                                                   StaggerLevel(wounded)));
02741 
02742                 if(LastStaggerNotify(wounded) < staggerLevel) {
02743                         LastStaggerNotify(wounded) = staggerLevel;
02744 
02745                         if(Jumping(wounded) || OODing(wounded)) {
02746                                 switch (staggerLevel) {
02747                                 case 1:
02748                                         mech_notify(wounded, MECHALL,
02749                                                                 "%cy%chThe damage causes you to spin a little in your flight path.%cn");
02750                                         headingChange = 15;
02751                                         break;
02752 
02753                                 case 2:
02754                                         mech_notify(wounded, MECHALL,
02755                                                                 "%crThe damage spins you but you maintain your flight!%cn");
02756                                         MechLOSBroadcast(wounded,
02757                                                                          "turns slightly from the damage!");
02758                                         headingChange = 45;
02759                                         break;
02760 
02761                                 default:
02762                                         mech_notify(wounded, MECHALL,
02763                                                                 "%cr%chThe damage causes you to spin completely around!%cn");
02764                                         MechLOSBroadcast(wounded,
02765                                                                          "spins around from the damage!");
02766                                         headingChange = 180;
02767                                         break;
02768                                 }
02769 
02770                                 SetFacing(wounded,
02771                                                   AcceptableDegree((MechFacing(wounded) +
02772                                                                                    headingChange) * (Roll() >=
02773                                                                                                                           6 ? 1 : -1)));
02774                         } else {
02775                                 switch (staggerLevel) {
02776                                 case 1:
02777                                         mech_notify(wounded, MECHALL,
02778                                                                 "%cy%chThe damage causes you to stagger a little.%cn");
02779                                         break;
02780 
02781                                 case 2:
02782                                         mech_notify(wounded, MECHALL,
02783                                                                 "%crThe damage causes you to stagger even more!%cn");
02784                                         MechLOSBroadcast(wounded,
02785                                                                          "starts to stagger from the damage!");
02786                                         break;
02787 
02788                                 default:
02789                                         mech_notify(wounded, MECHALL,
02790                                                                 "%cr%chThe damage causes you to stagger violently while attempting to keep your footing!%cn");
02791                                         MechLOSBroadcast(wounded,
02792                                                                          "staggers back and forth attempting to keep its footing!");
02793                                         break;
02794                                 }
02795                         }
02796                 }
02797         } else {
02798                 if(!IsDS(wounded) && MechTurnDamage(wounded) >= 20 &&
02799                    (!MechStaggeredLastTurn(wounded) ||
02800                         MechStaggerStamp(wounded) == now)) {
02801 
02802                         if(!Jumping(wounded) && !Fallen(wounded) && !OODing(wounded)) {
02803                                 mech_notify(wounded, MECHALL, "You stagger from the damage!");
02804                                 if(!MadePilotSkillRoll(wounded, 1)) {
02805                                         mech_notify(wounded, MECHALL,
02806                                                                 "You fall over from all the damage!");
02807                                         MechLOSBroadcast(wounded,
02808                                                                          "falls down, staggered by the damage!");
02809                                         MechFalls(wounded, 1, 0);
02810                                 }
02811                         }
02812                         MechTurnDamage(wounded) = 0;
02813                         SetMechStaggerStamp(wounded, now);
02814                         return;
02815                 }
02816                 if((MechStaggeredLastTurn(wounded) &&
02817                         MechStaggerStamp(wounded) == now) ||
02818                    (!MechStaggeredLastTurn(wounded) && !now)) {
02819                         MechTurnDamage(wounded) = 0;
02820                         SetMechStaggerStamp(wounded, -1);
02821                 }
02822         }
02823 }

void CheckNavalHeight ( MECH mech,
int  oz 
)

Definition at line 732 of file mech.update.c.

References BRIDGE, ICE, MarkForLOSUpdate(), mech_notify(), MECHALL, MechDesiredFacing, MechDesiredSpeed, MechElev, MechElevation, MechFZ, MechLOSBroadcast(), MechLowerElevation, MechMove, MechRTerrain, MechSpeed, MechTerrain, MechVerticalSpeed, MechX, MechY, MechZ, MIN, MOVE_SUB, SendError, SetFacing, tprintf(), WATER, and ZSCALE.

Referenced by move_mech().

00733 {
00734         if(MechRTerrain(mech) != WATER && MechRTerrain(mech) != ICE &&
00735            MechRTerrain(mech) != BRIDGE) {
00736                 MechSpeed(mech) = 0.0;
00737                 MechVerticalSpeed(mech) = 0;
00738                 MechDesiredSpeed(mech) = 0.0;
00739                 SetFacing(mech, 0);
00740                 MechDesiredFacing(mech) = 0;
00741                 return;
00742         }
00743         if(!oz && MechZ(mech) && MechElev(mech) > 1) {
00744                 MarkForLOSUpdate(mech);
00745                 MechZ(mech) = 0;
00746                 MechLOSBroadcast(mech, "dives!");
00747                 MechZ(mech) = -1;
00748         }
00749         if(MechFZ(mech) > 0.0) {
00750                 if(MechVerticalSpeed(mech) > 0 && !MechZ(mech) && oz < 0) {
00751                         mech_notify(mech, MECHALL,
00752                                                 "Your sub has reached surface and stops rising.");
00753                         MechLOSBroadcast(mech, tprintf("surfaces at %d,%d!",
00754                                                                                    MechX(mech), MechY(mech)));
00755                         /* Possible show-up message? */
00756                 }
00757                 MechZ(mech) = 0;
00758                 MechFZ(mech) = 0.0;
00759                 if(MechVerticalSpeed(mech) > 0)
00760                         MechVerticalSpeed(mech) = 0;
00761                 return;
00762         }
00763         if(MechZ(mech) <= (MechLowerElevation(mech))) {
00764                 MechZ(mech) = MIN(0, MechLowerElevation(mech) + 1);
00765                 if(MechElevation(mech) > 0)
00766                         SendError(tprintf
00767                                           ("Oddity: #%d managed to wind up on '%c' (%d elev.)",
00768                                            mech->mynum, MechTerrain(mech), MechElev(mech)));
00769                 MechFZ(mech) = ((5.0 * MechZ(mech) - 4) * ZSCALE) / 5.0;
00770                 if(MechMove(mech) == MOVE_SUB) {
00771                         if(MechVerticalSpeed(mech) < 0) {
00772                                 MechVerticalSpeed(mech) = 0;
00773                                 mech_notify(mech, MECHALL,
00774                                                         "The sub has reached bottom and stops diving.");
00775                         }
00776 #if 0
00777                         else
00778                                 mech_notify(mech, MECHALL, "The sub has reached bottom.");
00779 #endif
00780                 }
00781         }
00782 }

void CheckVTOLHeight ( MECH mech  ) 

Definition at line 784 of file mech.update.c.

References aero_land(), BRIDGE, DestroyMech(), InWater, is_aero, Landed, LANDED, mech_notify(), MECHALL, MechElevation, MechFalls(), MechFZ, MechLOSBroadcast(), MechPilot, MechRTerrain, MechSpeed, MechStatus, MechVerticalSpeed, MechZ, MP1, ORBIT_Z, and ZSCALE.

Referenced by move_mech().

00785 {
00786         if(InWater(mech) && MechZ(mech) <= 0) {
00787                 mech_notify(mech, MECHALL, "You crash your vehicle into the water!");
00788                 mech_notify(mech, MECHALL, "Water pours into the cockpit....glub glub!");
00789                 MechLOSBroadcast(mech, "splashes into the water!");
00790                 DestroyMech(mech, mech, 0);
00791                 return;
00792         }
00793 
00794         if((MechZ(mech) >= ORBIT_Z) && !is_aero(mech)) {
00795                 mech_notify(mech, MECHALL, "You cannot achieve orbit! Vertical movement halted!");
00796                 MechZ(mech) = ORBIT_Z - 1;
00797                 MechFZ(mech) = ZSCALE * MechZ(mech);
00798                 MechVerticalSpeed(mech) = 0.0;
00799                 return;
00800         }
00801 
00802         if(MechZ(mech) >= MechElevation(mech))
00803                 return;
00804         if(MechRTerrain(mech) == BRIDGE)
00805                 if(MechZ(mech) != (MechElevation(mech) - 1))
00806                         return;
00807         aero_land(MechPilot(mech), mech, "");
00808         if(Landed(mech))
00809                 return;
00810         mech_notify(mech, MECHALL,
00811                                 "CRASH! You smash your toy into the ground!");
00812         MechLOSBroadcast(mech, "crashes into the ground!");
00813         MechFalls(mech, 1 + fabs(MechVerticalSpeed(mech) / MP1), 0);
00814 
00815 /*   mech_notify (mech, MECHALL, "Your vehicle is inoperable."); */
00816         MechZ(mech) = MechElevation(mech);
00817         MechFZ(mech) = ZSCALE * MechZ(mech);
00818         MechSpeed(mech) = 0.0;
00819         MechVerticalSpeed(mech) = 0.0;
00820         MechStatus(mech) |= LANDED;
00821 
00822 /*   DestroyMech (mech, mech); */
00823 }

int collision_check ( MECH mech,
int  mode,
int  le,
int  lt 
)

Definition at line 97 of file mech.update.c.

References BRIDGE, bridge_w_elevation(), CLASS_VTOL, Elevation, getMap(), HIT_UNDER_BRIDGE, ICE, JUMP, MECH::mapindex, MechElevation, MechLastX, MechLastY, MechMove, MechRTerrain, MechSpeed, MechType, MechUpperElevation, MechX, MechY, MechZ, MOVE_HOVER, MOVE_TRACK, MoveMod, Overwater, WALK_BACK, WALK_DROP, WALK_WALL, and WATER.

Referenced by move_mech(), and NewHexEntered().

00098 {
00099         int e;
00100         MAP *mech_map = getMap(mech->mapindex);
00101 
00102         if(Overwater(mech) && le < 0)
00103                 le = 0;
00104         e = MechElevation(mech);
00105         if(MechRTerrain(mech) == ICE)
00106                 if(le >= 0)
00107                         e = 0;
00108         if(le < (MechUpperElevation(mech) - MoveMod(mech)) && lt == BRIDGE) {
00109                 if(Overwater(mech))
00110                         le = 0;
00111                 else
00112                         le = bridge_w_elevation(mech);
00113         }
00114         if(e < 0 && Overwater(mech))
00115                 e = 0;
00116         switch (mode) {
00117         case JUMP:
00118                 if(MechRTerrain(mech) == BRIDGE) {
00119                         if(MechZ(mech) < 0)
00120                                 return 1;
00121                         if(MechZ(mech) == (e - 1))
00122                                 return 1;
00123                         return 0;
00124                 } else
00125                         return (MechZ(mech) < e);
00126         case WALK_DROP:
00127                 return (le - e) > MoveMod(mech);
00128         case WALK_WALL:
00129                 if((MechMove(mech) == MOVE_HOVER) &&
00130                    (MechRTerrain(mech) == BRIDGE) && (((lt == ICE) ||
00131                                                                                            (lt == WATER)) || ((le == 0)
00132                                                                                                                                   && (lt ==
00133                                                                                                                                           BRIDGE))))
00134                 {
00135                         return 0;
00136                 } else {
00137                         return (e - le) > MoveMod(mech);
00138                 }
00139         case WALK_BACK:
00140                 if(MechMove(mech) != MOVE_TRACK && MechType(mech) != CLASS_VTOL)
00141                         return (MechSpeed(mech) < 0 ? abs((le - e)) : 0);
00142         case HIT_UNDER_BRIDGE:          /* Hovers only... tho it should be fixed for foils and hulls too */
00143                 if((lt == BRIDGE) && (MechRTerrain(mech) == BRIDGE) && (le == 0)
00144                    && (Elevation(mech_map, MechLastX(mech), MechLastY(mech)) != 0)
00145                    && (Elevation(mech_map, MechX(mech), MechY(mech)) == 1))
00146                         return 1;
00147                 else
00148                         return 0;
00149         }
00150         return 0;
00151 }

static int DisableSomeHS ( MECH mech,
int  numsinks 
) [static]

Definition at line 1336 of file mech.update.c.

References CLAN_TECH, DOUBLE_HEAT_TECH, mech_printf(), MechActiveNumsinks, MECHALL, MechDisabledHS, MechMinusHeat, MechSpecials, and MIN.

Referenced by UpdateHeat().

01337 {
01338 
01339         numsinks = MIN(numsinks,
01340                                    (MechSpecials(mech) & (DOUBLE_HEAT_TECH | CLAN_TECH)) ? 4 :
01341                                    2);
01342         numsinks = MIN(numsinks, MechActiveNumsinks(mech));
01343 
01344         if(!numsinks)
01345                 return 0;
01346 
01347         MechDisabledHS(mech) += numsinks;
01348         MechMinusHeat(mech) -= numsinks;        /* Submerged heatsinks silently 
01349                                                                                    still dissipate some heat */
01350 #ifdef HEATCUTOFF_DEBUG
01351         mech_printf(mech, MECHALL,
01352                                 "%%cy%d heatsink%s hum%s into silence.%%c", numsinks,
01353                                 numsinks == 1 ? "" : "s", numsinks == 1 ? "s" : "");
01354 #endif
01355 
01356         return numsinks;
01357 }

int DSOkToNotify ( MECH mech  ) 

Definition at line 83 of file mech.update.c.

References DS_SPAM_TIME, DSLastMsg, and muxevent_tick.

Referenced by move_mech().

00084 {
00085         if(DSLastMsg(mech) > muxevent_tick ||
00086            (muxevent_tick - DSLastMsg(mech)) >= DS_SPAM_TIME) {
00087                 DSLastMsg(mech) = muxevent_tick;
00088                 return 1;
00089         }
00090         return 0;
00091 }

static int EnableSomeHS ( MECH mech,
int  numsinks 
) [static]

Definition at line 1313 of file mech.update.c.

References CLAN_TECH, DOUBLE_HEAT_TECH, mech_printf(), MECHALL, MechDisabledHS, MechMinusHeat, MechSpecials, and MIN.

Referenced by UpdateHeat().

01314 {
01315 
01316         numsinks = MIN(numsinks,
01317                                    (MechSpecials(mech) & (DOUBLE_HEAT_TECH | CLAN_TECH)) ? 4 :
01318                                    2);
01319         numsinks = MIN(numsinks, MechDisabledHS(mech));
01320 
01321         if(!numsinks)
01322                 return 0;
01323 
01324         MechDisabledHS(mech) -= numsinks;
01325         MechMinusHeat(mech) += numsinks;        /* We dont check for water and 
01326                                                                                    such after enabling them, only the next tic. */
01327 #ifdef HEATCUTOFF_DEBUG
01328         mech_printf(mech, MECHALL,
01329                                 "%%cg%d heatsink%s kick%s into action.%%c", numsinks,
01330                                 numsinks == 1 ? "" : "s", numsinks == 1 ? "s" : "");
01331 #endif
01332 
01333         return numsinks;
01334 }

int fiery_death ( MECH mech  ) 

Definition at line 38 of file mech.update.c.

References CLASS_MW, Destroyed, DestroyMech(), FIRE, heat_effect(), is_aero, mech_notify(), MECHALL, MechMove, MechTerrain, MechType, and MOVE_VTOL.

Referenced by move_mech().

00039 {
00040         if(MechTerrain(mech) == FIRE) {
00041                 if(is_aero(mech))
00042                         return 0;
00043                 if(MechMove(mech) == MOVE_VTOL)
00044                         return 0;
00045                 if(Destroyed(mech))
00046                         return 0;
00047 
00048                 /* Cause various things */
00049                 /* MWs _die_ */
00050                 if(MechType(mech) == CLASS_MW) {
00051                         mech_notify(mech, MECHALL, "You feel a tad bit too warm..");
00052                         mech_notify(mech, MECHALL, "You faint.");
00053                         DestroyMech(mech, mech, 0);
00054                         return 1;
00055                 }
00056 
00057                 /* Tanks may die */
00058                 return 0;                               /* Dumb idea */
00059                 heat_effect(NULL, mech, 0, 0);
00060                 if(Destroyed(mech))
00061                         return 1;
00062         }
00063         return 0;
00064 }

void HandleOverheat ( MECH mech  ) 

Definition at line 1176 of file mech.update.c.

References AccumulateComputerXP(), ammo_explosion(), confdata::btech_inferno_penalty, char_getskillsuccess(), domino_space(), Fallen, FindDestructiveAmmo(), FindInfernoAmmo(), getMap(), is_aero, isPlayer, Jumping, JumpSpeedMP, Landed, MadePilotSkillRoll(), mech_notify(), MECHALL, MechCritStatus, MechFalls(), MechHeat, MechHeatLast, MechLOSBroadcast(), MechPilot, MechSpeed, MechStatus, MechStatus2, MP1, mudconf, muxevent_tick, OODing, Roll(), Shutdown, SLITE_LIT, SLITE_ON, Started, STARTED, StopMoving, StopStand, and TURN.

Referenced by UpdateHeat().

01177 {
01178         int avoided = 0, hasinferno = 0;
01179         MAP *mech_map;
01180         int ammoloc, ammocritnum, damage = 0;
01181 
01182         if(MechHeat(mech) < 10.)
01183                 return;
01184         /* Has it been a TURN already ? */
01185         if((MechHeatLast(mech) + TURN) > muxevent_tick)
01186                 return;
01187         MechHeatLast(mech) = muxevent_tick;
01188 
01189         /* Ammo - done first so infernobooms shut you down */
01190         if(MechHeat(mech) >= 10.) {
01191                 if(mudconf.btech_inferno_penalty)
01192                         hasinferno = FindInfernoAmmo(mech, &ammoloc, &ammocritnum);
01193                 if(MechHeat(mech) >= 28.) {
01194                         /* Ammo explosion (Avoid 8+, infernos 12+) */
01195                         if(hasinferno) {
01196                                 if(Roll() >= 12)
01197                                         avoided = 1;
01198                         } else {
01199                                 if(Roll() >= 8)
01200                                         avoided = 1;
01201                         }
01202                 } else if(MechHeat(mech) >= 23.) {
01203                         /* Ammo explosion (Avoid 6+, infernos 10+) */
01204                         if(hasinferno) {
01205                                 if(Roll() >= 10)
01206                                         avoided = 1;
01207                         } else {
01208                                 if(Roll() >= 6)
01209                                         avoided = 1;
01210                         }
01211                 } else if(MechHeat(mech) >= 19.) {
01212                         /* Ammo explosion (Avoid 4+, infernos 8+) */
01213                         if(hasinferno) {
01214                                 if(Roll() >= 8)
01215                                         avoided = 1;
01216                         } else {
01217                                 if(Roll() >= 4)
01218                                         avoided = 1;
01219                         }
01220 
01221                 } else if((MechHeat(mech) >= 14.) && (hasinferno)) {
01222                         if(Roll() >= 6)
01223                                 avoided = 1;
01224                 } else if((MechHeat(mech) >= 10.) && (hasinferno)) {
01225                         if(Roll() >= 4)
01226                                 avoided = 1;
01227                 } else if((MechHeat(mech) < 19.) && (!hasinferno)) {
01228                         avoided = 1;
01229                 }
01230 
01231                 if(!(avoided)) {
01232                         if(!hasinferno)
01233                                 damage = FindDestructiveAmmo(mech, &ammoloc, &ammocritnum);
01234                         else
01235                                 damage = hasinferno;
01236                         if(damage) {
01237                                 /* BOOM! */
01238                                 /* That's going to hurt... */
01239                                 ammo_explosion(mech, mech, ammoloc, ammocritnum, damage);
01240                         } else
01241                                 mech_notify(mech, MECHALL,
01242                                                         "You have no ammunition, lucky you!");
01243                 }
01244         }
01245 
01246         avoided = 0;
01247 #ifdef BT_EXILE_MW3STATS
01248         if(!isPlayer(MechPilot(mech))) {
01249 #endif
01250                 if(MechHeat(mech) >= 30.) {
01251                         /* Shutdown */
01252                 } else if(MechHeat(mech) >= 26.) {
01253                         /* Shutdown avoid on 10+ */
01254                         if(Roll() >= 10)
01255                                 avoided = 1;
01256                 } else if(MechHeat(mech) >= 22.) {
01257                         /* Shutdown avoid on 8+ */
01258                         if(Roll() >= 8)
01259                                 avoided = 1;
01260                 } else if(MechHeat(mech) >= 18.) {
01261                         /* Shutdown avoid on 6+ */
01262                         if(Roll() >= 6)
01263                                 avoided = 1;
01264                 } else if(MechHeat(mech) >= 14.) {
01265                         /* Shutdown avoid on 4+ */
01266                         if(Roll() >= 4)
01267                                 avoided = 1;
01268                 }
01269 #ifdef BT_EXILE_MW3STATS
01270         } else {
01271                 avoided = 1;
01272                 if(MechHeat(mech) >= 14.) {
01273                         mech_notify(mech, MECHALL,
01274                                                 "You frantically attempt to override the shutdown process!");
01275                         avoided =
01276                                 char_getskillsuccess(MechPilot(mech), "computer",
01277                                                                          (MechHeat(mech) >=
01278                                                                           30. ? 8 : MechHeat(mech) >=
01279                                                                           26. ? 6 : MechHeat(mech) >=
01280                                                                           22. ? 4 : MechHeat(mech) >=
01281                                                                           18. ? 2 : 0), 1);
01282                         if(avoided)
01283                                 AccumulateComputerXP(MechPilot(mech), mech, 1);
01284                 }
01285         }
01286 #endif
01287         if(!(avoided) && Started(mech)) {
01288                 if(MechStatus(mech) & STARTED)
01289                         mech_notify(mech, MECHALL, "%ci%crReactor shutting down...%c");
01290                 if(MechStatus2(mech) & SLITE_ON) {
01291                         mech_notify(mech, MECHALL, "Your searchlight shuts off.");
01292                         MechStatus2(mech) &= ~SLITE_ON;
01293                         MechCritStatus(mech) &= ~SLITE_LIT;
01294                 }
01295                 if(Jumping(mech) || OODing(mech) || (is_aero(mech) && !Landed(mech))) {
01296                         mech_notify(mech, MECHALL, "%chYou fall from the sky!%c");
01297                         MechLOSBroadcast(mech, "falls from the sky!");
01298                         mech_map = getMap(mech->mapindex);
01299                         MechFalls(mech, JumpSpeedMP(mech, mech_map), 0);
01300                         domino_space(mech, 2);
01301                 } else {
01302                         MechLOSBroadcast(mech, "stops in mid-motion!");
01303                         if((fabs(MechSpeed(mech) > MP1)) && !Fallen(mech) &&
01304                            (!MadePilotSkillRoll(mech, 3)))
01305                                 MechFalls(mech, 0, 1);
01306                 }
01307                 Shutdown(mech);
01308                 StopMoving(mech);
01309                 StopStand(mech);
01310         }
01311 }

void mech_update ( dbref  key,
void *  data 
)

Definition at line 2935 of file mech.update.c.

References aero_update(), AUTOTURN_TURRET, BOUNDED(), checkECM(), checkTAG(), end_lite_check(), FIRED, is_aero, MechPlusHeat, MechStatus, MechStatus2, MechVisMod, Number, Started, Uncon, updateAutoturnTurret(), UpdateHeat(), and UpdatePilotSkillRolls().

02936 {
02937         MECH *mech = (MECH *) data;
02938 
02939         if(!mech)
02940                 return;
02941         MechStatus(mech) &= ~FIRED;
02942         if(is_aero(mech)) {
02943                 aero_update(mech);
02944                 return;
02945         }
02946         if(Started(mech) || Uncon(mech))
02947                 UpdatePilotSkillRolls(mech);
02948         if(Started(mech) || MechPlusHeat(mech) > 0.1)
02949                 UpdateHeat(mech);
02950         if(Started(mech))
02951                 MechVisMod(mech) =
02952                         BOUNDED(0, MechVisMod(mech) + Number(-40, 40), 100);
02953         checkECM(mech);
02954         checkTAG(mech);
02955         end_lite_check(mech);
02956 
02957         if(MechStatus2(mech) & AUTOTURN_TURRET)
02958                 updateAutoturnTurret(mech);
02959 }

void move_mech ( MECH mech  ) 

Definition at line 155 of file mech.update.c.

References AccumulatePilXP(), break_thru_ice(), BRIDGE, BSuitMirrorSwarmedTarget(), confdata::btech_newcharge, CHARGE_DIST_TRIGGER, CHARGE_TIMER_LIMIT, ChargeMech(), CheckEdgeOfMap(), CheckNavalHeight(), CheckVTOLHeight(), CLASS_MECH, CLASS_VEH_NAVAL, collision_check(), domino_space(), drop_thru_ice(), DropSetElevation(), DS_LandWarning(), DSOkToNotify(), FaMechRange, fiery_death(), FindComponents(), GetElev, getMap(), getMech(), GetTerrain, HEXLEVEL, HIDDEN, ICE, In_Character, is_aero, IsDS, JUMP, Jumping, JumpSpeed, JumpSpeedMP, Landed, LandMech(), length_hypotenuse(), MAP::map_height, MAP::map_width, MapCoordToRealCoord(), MECH::mapindex, MAPMOVEMOD, MarkForLOSUpdate(), MBUF_SIZE, mech_land(), mech_notify(), mech_shutdown(), MECHALL, MechCarrying, MechChargeDistance, MechChargeTarget, MechChargeTimer, MechCocoon, MechCritStatus, MechDesiredAngle, MechElev, MechEndFZ, MechFacing, MechFalls(), MechFloods(), MechFX, MechFY, MechFZ, MechGoingX, MechGoingY, MechHexes, MechJumpHeading, MechJumpLength, MechJumpTop, MechLastX, MechLastY, MechLateral, MechLOSBroadcast(), MechMove, MechPilot, MECHPILOT, MechRFacing, MechRTerrain, MechSpeed, MechStartFX, MechStartFY, MechStartFZ, MechTerrain, MechType, MechVerticalSpeed, MechX, MechY, MechZ, MirrorPosition, MOVE_BIPED, MOVE_FLY, MOVE_FOIL, MOVE_HOVER, MOVE_HULL, MOVE_MOD, MOVE_QUAD, MOVE_SUB, MOVE_TRACK, MOVE_VTOL, MOVE_WHEEL, mudconf, NewHexEntered(), PIL_XP_EVERY_N_STEPS, possibly_drop_thru_ice(), RealCoordToMapCoord(), RGotPilot, SCALEMAP, SendDebug, SendError, SetRFacing, steppable_base_check(), StopHiding, ValidMap(), water_extinguish_inferno(), x, y, YSCALE2, and ZSCALE.

Referenced by aero_move_event(), mech_jump_event(), and mech_move_event().

00156 {
00157         float newx = 0.0, newy = 0.0, dax, day;
00158         float xy_charge_dist, xscale;
00159         float jump_pos;
00160 
00161 #ifdef ODDJUMP
00162         float rjump_pos, midmod;
00163 #endif
00164         int x, y, upd_z = 0;
00165         int last_z = 0;
00166         MECH *target;
00167         MAP *mech_map;
00168         int oi, oz;
00169         int iced = 0;
00170 
00171         /* Buffer for printing messages so we don't use the tprintf
00172          * function anymore */
00173         char message_buffer[MBUF_SIZE];
00174 
00175         oz = MechZ(mech);
00176         mech_map = getMap(mech->mapindex);
00177 
00178         if(!mech_map && MechPilot(mech) >= 0)
00179                 mech_map = ValidMap(MechPilot(mech), mech->mapindex);
00180 
00181         /* Unit is not on a map so don't need to move it - instead
00182          * reset its values and shut it down */
00183         if(!mech_map) {
00184 
00185                 mech_notify(mech, MECHALL,
00186                                         "You are on an invalid map! Map index reset!");
00187                 MechCocoon(mech) = 0;
00188 
00189                 if(Jumping(mech))
00190                         mech_land(MechPilot(mech), (void *) mech, "");
00191 
00192                 mech_shutdown(MechPilot(mech), (void *) mech, "");
00193 
00194                 snprintf(message_buffer, MBUF_SIZE,
00195                                  "move_mech:invalid map:Mech: %d Index: %d", mech->mynum,
00196                                  mech->mapindex);
00197                 SendError(message_buffer);
00198                 mech->mapindex = -1;
00199                 return;
00200         }
00201 
00202         /* Is the unit on a valid spot on the map */
00203         if(MechX(mech) < 0 || MechX(mech) >= mech_map->map_width ||
00204            MechLastX(mech) < 0 || MechLastX(mech) >= mech_map->map_width ||
00205            MechY(mech) < 0 || MechY(mech) >= mech_map->map_height ||
00206            MechLastY(mech) < 0 || MechLastY(mech) >= mech_map->map_height) {
00207 
00208                 mech_notify(mech, MECHALL,
00209                                         "You are at an invalid map location! Map index reset!");
00210                 MechCocoon(mech) = 0;
00211 
00212                 if(Jumping(mech))
00213                         mech_land(MechPilot(mech), (void *) mech, "");
00214 
00215                 mech_shutdown(MechPilot(mech), (void *) mech, "");
00216 
00217                 snprintf(message_buffer, MBUF_SIZE,
00218                                  "move_mech:invalid map:Mech: %d Index: %d", mech->mynum,
00219                                  mech->mapindex);
00220                 SendError(message_buffer);
00221 
00222                 mech->mapindex = -1;
00223                 return;
00224         }
00225 
00226         /* Is the unit charging - and if so have they been charging to long */
00227         if(mudconf.btech_newcharge && MechChargeTarget(mech) > 0) {
00228                 if(MechChargeTimer(mech)++ > CHARGE_TIMER_LIMIT) {
00229                         mech_notify(mech, MECHALL, "Charge timed out, charge reset.");
00230                         MechChargeTarget(mech) = -1;
00231                         MechChargeTimer(mech) = 0;
00232                         MechChargeDistance(mech) = 0;
00233                 }
00234         }
00235 
00239         /* Check the move type of the unit */
00240         switch (MechMove(mech)) {
00241         case MOVE_BIPED:
00242         case MOVE_QUAD:
00243 
00244                 /* Biped/Quad Jumping */
00245                 if(Jumping(mech)) {
00246                         MarkForLOSUpdate(mech);
00247                         FindComponents(JumpSpeed(mech, mech_map) * MOVE_MOD *
00248                                                    MAPMOVEMOD(mech_map), MechJumpHeading(mech), &newx,
00249                                                    &newy);
00250                         MechFX(mech) += newx;
00251                         MechFY(mech) += newy;
00252                         jump_pos = length_hypotenuse((MechFX(mech) - MechStartFX(mech)),
00253                                                                                  (MechFY(mech) - MechStartFY(mech)));
00254 
00257 #ifndef ODDJUMP
00258                         MechFZ(mech) = ((4 * JumpSpeedMP(mech, mech_map) * ZSCALE)
00259                                                         / (MechJumpLength(mech) * MechJumpLength(mech))) *
00260                                 jump_pos * (MechJumpLength(mech) - jump_pos) +
00261                                 MechStartFZ(mech) + jump_pos * (MechEndFZ(mech)
00262                                                                                                 -
00263                                                                                                 MechStartFZ(mech)) /
00264                                 (MechJumpLength(mech) * HEXLEVEL);
00265 #else
00266                         rjump_pos = MechJumpLength(mech) - jump_pos;
00267                         if(rjump_pos < 0.0)
00268                                 rjump_pos = 0.0;
00269 
00270                         /* New flight path: Make a direct line from the origin to
00271                            destination, and imagine a 1-x^4 in relation to the 0 as
00272                            the line. y=1 = JumpTop offset, x=0 = middle of path,
00273                            x=-1 = beginning, x=1 = end */
00274                         midmod = jump_pos / MechJumpLength(mech);
00275                         midmod = (midmod - 0.5) * 2;
00276                         if(MechJumpTop(mech) >= (1 + JumpSpeedMP(mech, mech_map))) {
00277                                 midmod = (1.0 - (midmod * midmod)) * MechJumpTop(mech);
00278                         } else {
00279                                 midmod = (1.0 - (midmod * midmod * midmod * midmod)) *
00280                                         MechJumpTop(mech);
00281                         }
00282 
00283                         MechFZ(mech) = (rjump_pos * MechStartFZ(mech) +
00284                                                         jump_pos * MechEndFZ(mech)) /
00285                                 MechJumpLength(mech) + midmod * ZSCALE;
00286 #endif
00287 
00288                         MechZ(mech) = (int) (MechFZ(mech) / ZSCALE + 0.5);
00289 
00290 #ifdef JUMPDEBUG
00291                         snprintf(message_buffer, MBUF_SIZE,
00292                                          "#%d: %d, %d, %d (%d, %d, %d)",
00293                                          mech->mynum, MechX(mech), MechY(mech), MechZ(mech),
00294                                          (int) MechFX(mech), (int) MechFY(mech),
00295                                          (int) MechFZ(mech));
00296                         SendDebug(message_buffer);
00297 #endif
00298 
00299                         /* The famous jumping on bridge collision code */
00302                         if(MechRTerrain(mech) == BRIDGE &&
00303                            collision_check(mech, JUMP, 0, 0) && MechZ(mech) > 0) {
00304 
00305                                 mech_notify(mech, MECHALL,
00306                                                         "CRASH! You crash into the bridge!");
00307                                 MechLOSBroadcast(mech, "crashes into the bridge!");
00308                                 MechFalls(mech, 1, 0);
00309                                 return;
00310                         }
00311 
00312                         /* Is the jumping unit in its target hex */
00313                         if((MechX(mech) == MechGoingX(mech)) &&
00314                            (MechY(mech) == MechGoingY(mech))) {
00315 
00316                                 /*Ok.. in the hex. but no instant landings anymore, laddie */
00317                                 /*Range to point of origin is larger than whole jump's length */
00318                                 MapCoordToRealCoord(MechX(mech), MechY(mech), &dax, &day);
00319 
00321                                 /* Basicly checking to see if the unit is in the hex,
00322                                  * the ODDJUMP code looks for the exact center */
00323 #ifdef ODDJUMP
00324                                 if(length_hypotenuse(dax - MechStartFX(mech),
00325                                                                          day - MechStartFY(mech)) <=
00326                                    length_hypotenuse(MechFX(mech) - MechStartFX(mech),
00327                                                                          MechFY(mech) - MechStartFY(mech))) {
00328 
00329                                         LandMech(mech);
00330                                         MechFX(mech) = (float) dax;
00331                                         MechFY(mech) = (float) day;
00332                                 }
00333 #else
00334                                 LandMech(mech);
00335                                 MechFX(mech) = (float) dax;
00336                                 MechFY(mech) = (float) day;
00337 #endif
00338                         }
00339 
00340                         /* Are we landing on ice */
00341                         if(MechRTerrain(mech) == ICE) {
00342                                 if(oz < -1 && MechZ(mech) >= -1)
00343                                         break_thru_ice(mech);
00344                                 else if(oz >= -1 && MechZ(mech) < -1)
00345                                         drop_thru_ice(mech);
00346                         }
00347 
00348                 } else if(fabs(MechSpeed(mech)) > 0.0) {
00349 
00350                         /* Ok not jumping but we're moving */
00351                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00352                                                    MAPMOVEMOD(mech_map),
00353                                                    MechLateral(mech) + MechFacing(mech), &newx,
00354                                                    &newy);
00355                         MechFX(mech) += newx;
00356                         MechFY(mech) += newy;
00357 
00358                         upd_z = 1;
00359 
00360                         /* If we're charging record distance traveled */
00361                         if(MechChargeTarget(mech) > 0 && mudconf.btech_newcharge) {
00362                                 xscale = 1.0 / SCALEMAP;
00363                                 xscale = xscale * xscale;
00364                                 xy_charge_dist =
00365                                         sqrt(xscale * newx * newx + YSCALE2 * newy * newy);
00366                                 MechChargeDistance(mech) += xy_charge_dist;
00367                         }
00368 
00369                 } else {
00370 
00371                         /* Ok not moving or jumping so don't need to calc a new x,y,z */
00372                         return;
00373                 }
00374                 break;
00375 
00376         case MOVE_TRACK:
00377         case MOVE_WHEEL:
00378 
00381                 /* Is the tank moving? */
00382                 if(fabs(MechSpeed(mech)) > 0.0) {
00383 
00386 #ifndef BT_MOVEMENT_MODES
00387                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00388                                                    MAPMOVEMOD(mech_map), MechFacing(mech), &newx,
00389                                                    &newy);
00390 #else
00391                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00392                                                    MAPMOVEMOD(mech_map),
00393                                                    MechLateral(mech) + MechFacing(mech), &newx,
00394                                                    &newy);
00395 #endif
00396                         MechFX(mech) += newx;
00397                         MechFY(mech) += newy;
00398                         upd_z = 1;
00399 
00400                         /* If we're charging record the distance traveled */
00401                         if(MechChargeTarget(mech) > 0 && mudconf.btech_newcharge) {
00402                                 xscale = 1.0 / SCALEMAP;
00403                                 xscale = xscale * xscale;
00404                                 xy_charge_dist =
00405                                         sqrt(xscale * newx * newx + YSCALE2 * newy * newy);
00406                                 MechChargeDistance(mech) += xy_charge_dist;
00407                         }
00408 
00409                 } else {
00410 
00411                         /* Ok not moving or jumping so don't need to calc a new x,y,z */
00412                         return;
00413                 }
00414                 break;
00415 
00416         case MOVE_HOVER:
00417 
00418                 /* If we're moving update position */
00419                 if(fabs(MechSpeed(mech)) > 0.0) {
00420 
00422 #ifndef BT_MOVEMENT_MODES
00423                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00424                                                    MAPMOVEMOD(mech_map), MechFacing(mech), &newx,
00425                                                    &newy);
00426 #else
00427                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00428                                                    MAPMOVEMOD(mech_map),
00429                                                    MechLateral(mech) + MechFacing(mech), &newx,
00430                                                    &newy);
00431 #endif
00432                         MechFX(mech) += newx;
00433                         MechFY(mech) += newy;
00434                         upd_z = 1;
00435 
00436                         /* Record the charge distance */
00437                         if(MechChargeTarget(mech) > 0 && mudconf.btech_newcharge) {
00438                                 xscale = 1.0 / SCALEMAP;
00439                                 xscale = xscale * xscale;
00440                                 xy_charge_dist =
00441                                         sqrt(xscale * newx * newx + YSCALE2 * newy * newy);
00442                                 MechChargeDistance(mech) += xy_charge_dist;
00443                         }
00444 
00445                 } else {
00446 
00447                         /* Ok not moving or jumping so don't need to calc a new x,y,z */
00448                         return;
00449                 }
00450                 break;
00451 
00452         case MOVE_VTOL:
00453 
00454                 /* If we're landed we're not moving */
00455                 if(Landed(mech))
00456                         return;
00457 
00458                 /* Use the same code as subs below */
00461         case MOVE_SUB:
00462 
00463                 MarkForLOSUpdate(mech);
00464                 FindComponents(MechSpeed(mech) * MOVE_MOD * MAPMOVEMOD(mech_map),
00465                                            MechFacing(mech), &newx, &newy);
00466                 MechFX(mech) += newx;
00467                 MechFY(mech) += newy;
00468                 MechFZ(mech) += MechVerticalSpeed(mech) * MOVE_MOD;
00469                 MechZ(mech) = MechFZ(mech) / ZSCALE;
00470                 break;
00471 
00472         case MOVE_FLY:
00473 
00474                 /* Ok we're in the air */
00475                 if(!Landed(mech)) {
00476 
00477                         MarkForLOSUpdate(mech);
00478                         MechFZ(mech) += MechStartFZ(mech) * MOVE_MOD;
00479                         MechZ(mech) = MechFZ(mech) / ZSCALE;
00480                         MechFX(mech) += MechStartFX(mech) * MOVE_MOD;
00481                         MechFY(mech) += MechStartFY(mech) * MOVE_MOD;                   
00482 
00486                         if(IsDS(mech)) {
00487 
00488                                 /* Fun messages to emit to the pilot */
00489                                 if(MechZ(mech) < 10 && oz >= 10)
00490                                         DS_LandWarning(mech, 1);
00491                                 else if(MechZ(mech) < 50 && oz >= 50)
00492                                         DS_LandWarning(mech, 0);
00493                                 else if(MechZ(mech) < 100 && oz >= 100) {
00494 
00495                                         if(abs(MechDesiredAngle(mech)) != 90) {
00496                                                 if(DSOkToNotify(mech)) {
00497                                                         mech_notify(mech, MECHALL, "As the craft enters "
00498                                                                                 "the lower atmosphere, its nose rises up "
00499                                                                                 "for a clean landing..");
00500                                                         snprintf(message_buffer, MBUF_SIZE,
00501                                                                          "starts descending towards %d, %d..",
00502                                                                          MechX(mech), MechY(mech));
00503                                                         MechLOSBroadcast(mech, message_buffer);
00504                                                 } else {
00505                                                         mech_notify(mech, MECHALL, "Due to low altitude, "
00506                                                                                 "climbing angle set to 90 degrees.");
00507                                                 }
00508                                                 MechDesiredAngle(mech) = 90;
00509                                         }
00510                                         MechStartFX(mech) = 0.0;
00511                                         MechStartFY(mech) = 0.0;
00512                                         DS_LandWarning(mech, -1);
00513                                 }
00514                         }
00515 
00516                 } else {
00517 
00518                         /* Ok we're rolling around on the ground */
00519                         if(!(fabs(MechSpeed(mech)) > 0.0))
00520                                 return;
00521 
00522                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00523                                                    MAPMOVEMOD(mech_map), MechFacing(mech), &newx,
00524                                                    &newy);
00525                         MechFX(mech) += newx;
00526                         MechFY(mech) += newy;
00527                         upd_z = 1;
00528                 }
00529                 break;
00530 
00531         case MOVE_HULL:
00532         case MOVE_FOIL:
00533 
00534                 if(fabs(MechSpeed(mech)) > 0.0) {
00535 
00536                         FindComponents(MechSpeed(mech) * MOVE_MOD *
00537                                                    MAPMOVEMOD(mech_map), MechFacing(mech), &newx,
00538                                                    &newy);
00539                         MechFX(mech) += newx;
00540                         MechFY(mech) += newy;
00541                         MechZ(mech) = 0;
00542                         MechFZ(mech) = 0.0;
00543 
00544                 } else {
00545 
00546                         /* Not moving so no need to update x,y,z and other stuff */
00547                         return;
00548                 }
00549                 break;
00550         }
00551 
00552         /* We've already updated the floating x,y values, now to update the hex
00553          * x,y values + both the Z values */
00554         MechLastX(mech) = MechX(mech);
00555         MechLastY(mech) = MechY(mech);
00556         last_z = MechZ(mech);
00557 
00558         RealCoordToMapCoord(&MechX(mech), &MechY(mech), MechFX(mech),
00559                                                 MechFY(mech));
00560 
00562         /* Checking to make sure we didn't jump PAST our target hex */
00563 #ifdef ODDJUMP
00564         if(Jumping(mech) && MechLastX(mech) == MechGoingX(mech) &&
00565            MechLastY(mech) == MechGoingY(mech) &&
00566            (MechX(mech) != MechLastX(mech) || MechY(mech) != MechLastY(mech))) {
00567 
00568                 LandMech(mech);
00569                 MechFX(mech) -= newx;
00570                 MechFY(mech) -= newy;
00571                 MechFZ(mech) = MechEndFZ(mech);
00572                 MechX(mech) = MechGoingX(mech);
00573                 MechY(mech) = MechGoingY(mech);
00574                 MapCoordToRealCoord(MechX(mech), MechY(mech), &MechFX(mech),
00575                                                         &MechFY(mech));
00576                 MechZ(mech) = MechFZ(mech) / ZSCALE;
00577         }
00578 #endif
00579 
00580         /* Store the current map index */
00581         oi = mech->mapindex;
00582 
00583         /* Did we hit mapedge? */
00584         CheckEdgeOfMap(mech);
00585 
00586         /* Did our mapindex change? - like did we run out a hangar? */
00587         if(mech->mapindex != oi)
00588                 mech_map = getMap(mech->mapindex);
00589 
00590         /* We left a hangar and/or moved to a new hex */
00591         if(oi != mech->mapindex || MechLastX(mech) != MechX(mech) ||
00592            MechLastY(mech) != MechY(mech)) {
00593 
00594                 /* Either the mech or the map is bad */
00595                 if(!mech || !mech_map) {
00596 
00597                         snprintf(message_buffer, MBUF_SIZE,
00598                                          "Invalide pointer (%s) in move_mech()",
00599                                          (!mech ? "mech" : !mech_map ? "mech_map" : "weird...."));
00600                         SendError(message_buffer);
00601 
00602                         if(mech) {
00603 
00604                                 /* Bad Map */
00605                                 mech_notify(mech, MECHALL,
00606                                                         "You are on an invalid map! Map index reset!");
00607                                 MechCocoon(mech) = 0;
00608 
00609                                 if(Jumping(mech))
00610                                         mech_land(MechPilot(mech), (void *) mech, "");
00611 
00612                                 mech_shutdown(MechPilot(mech), (void *) mech, "");
00613                                 snprintf(message_buffer, MBUF_SIZE,
00614                                                  "move_mech:invalid map:Mech: %d Index: %d",
00615                                                  mech->mynum, mech->mapindex);
00616                                 SendError(message_buffer);
00617                                 mech->mapindex = -1;
00618                         }
00619                         return;
00620                 }
00621 
00622                 /* We've moved from our hex so break our cover */
00623                 if(MechCritStatus(mech) & HIDDEN) {
00624                         mech_notify(mech, MECHALL,
00625                                                 "You move too much and break your cover!");
00626                         MechLOSBroadcast(mech, "breaks from its cover.");
00627                         MechCritStatus(mech) &= ~(HIDDEN);
00628                 }
00629 
00630                 StopHiding(mech);
00631 
00632                 x = MechX(mech);
00633                 y = MechY(mech);
00634                 MechTerrain(mech) = GetTerrain(mech_map, x, y);
00635                 MechElev(mech) = GetElev(mech_map, x, y);
00636 
00637                 /* Update our Z values */
00638                 if(upd_z) {
00639 
00640                         /* Chance of breaking through ICE */
00641                         if(MechRTerrain(mech) == ICE) {
00642                                 if(oz < -1 && MechZ(mech) >= -1)
00643                                         break_thru_ice(mech);
00644                                 else if(MechZ(mech) == 0)
00645                                         if(possibly_drop_thru_ice(mech))
00646                                                 iced = 1;
00647                         }
00648 
00649                         /* Check for bridges and basic elevation changes */
00650                         DropSetElevation(mech, 0);
00651 
00652                         /* To fix certain slide-under-ice-effect for _mechs_ */
00653                         if(MechType(mech) == CLASS_MECH && MechRTerrain(mech) == ICE
00654                            && oz == -1 && MechZ(mech) == -1) {
00655 
00656                                 MechZ(mech) = 0;
00657                                 MechFZ(mech) = MechZ(mech) * ZSCALE;
00658                         }
00659                 }
00660 
00661                 if(!iced)
00662                         NewHexEntered(mech, mech_map, newx, newy, last_z);
00663 
00664                 if(MechX(mech) == x && MechY(mech) == y) {
00665 
00666                         MarkForLOSUpdate(mech);
00667                         MechFloods(mech);
00668                         water_extinguish_inferno(mech);
00669                         steppable_base_check(mech, x, y);
00670 
00671                         /* Pilot XP */
00672                         if(In_Character(mech->mynum)) {
00673                                 MechHexes(mech)++;
00674                                 if(!(MechHexes(mech) % PIL_XP_EVERY_N_STEPS))
00675                                         if(RGotPilot(mech))
00676                                                 AccumulatePilXP(MechPilot(mech), mech, 1, 0);
00677                         }
00678 
00679                         /* Check for stacking */
00680                         domino_space(mech, 0);
00681                 }
00682         }
00683 
00684         /* If aero/vtol make sure we're not rubbing against the ground or trees */
00685         if((MechMove(mech) == MOVE_VTOL || is_aero(mech)) && !Landed(mech))
00686                 CheckVTOLHeight(mech);
00687 
00688         /* If we're a boat make sure we've not run a ground */
00689         if(MechType(mech) == CLASS_VEH_NAVAL)
00690                 CheckNavalHeight(mech, oz);
00691 
00692         /* We're charging lets do some damage */
00693         if(MechChargeTarget(mech) != -1) {
00694 
00695                 /* Valid target? */
00696                 target = getMech(MechChargeTarget(mech));
00697                 if(target) {
00698 
00699                         if(FaMechRange(mech, target) < CHARGE_DIST_TRIGGER) {
00700                                 ChargeMech(mech, target);
00701                                 MechChargeTarget(mech) = -1;
00702                                 MechChargeTimer(mech) = 0;
00703                                 MechChargeDistance(mech) = 0;
00704                         }
00705 
00706                 } else {
00707                         mech_notify(mech, MECHPILOT, "Invalid CHARGE target!");
00708                         MechChargeTarget(mech) = -1;
00709                         MechChargeDistance(mech) = 0;
00710                         MechChargeTimer(mech) = 0;
00711                 }
00712         }
00713 
00714         /* If we're towing something update its position with us */
00715         if(MechCarrying(mech) > 0) {
00716                 target = getMech(MechCarrying(mech));
00717                 if(target && target->mapindex == mech->mapindex) {
00718                         MirrorPosition(mech, target, 0);
00719                         SetRFacing(target, MechRFacing(mech));
00720                 }
00721         }
00722 
00723         /* If a bsuit has swarmed a target update its
00724          * position in relation to its target */
00725         BSuitMirrorSwarmedTarget(mech_map, mech);
00726 
00727         /* This is really for killing MechWarriors 
00728          * actual heat code is checked with UpdateHeat */
00729         fiery_death(mech);
00730 }

void move_unit_back ( MECH mech,
float  deltax,
float  deltay,
int  lastelevation,
int  ot,
int  le 
)

Definition at line 1638 of file mech.update.c.

References MechElev, MechFX, MechFY, MechFZ, MechLastX, MechLastY, MechTerrain, MechX, MechY, MechZ, and ZSCALE.

Referenced by NewHexEntered().

01640 {
01641 
01642         MechFX(mech) -= deltax;
01643         MechFY(mech) -= deltay;
01644         MechX(mech) = MechLastX(mech);
01645         MechY(mech) = MechLastY(mech);
01646         MechZ(mech) = lastelevation;
01647         MechFZ(mech) = MechZ(mech) * ZSCALE;
01648         MechTerrain(mech) = ot;
01649         MechElev(mech) = le;
01650 
01651 }

void NewHexEntered ( MECH mech,
MAP mech_map,
float  deltax,
float  deltay,
int  last_z 
)

Definition at line 1656 of file mech.update.c.

References BRIDGE, bridge_w_elevation(), confdata::btech_fasaadvvhlfire, confdata::btech_newterrain, confdata::btech_roll_on_backwalk, confdata::btech_skidcliff, BUILDING, ChannelEmitKill(), checkVehicleInFire(), CLASS_BSUIT, CLASS_MW, CLASS_VEH_GROUND, collision_check(), Destroy, domino_space(), ed, Elevation, EVENT_MOVEMODE, FIRE, GetTerrain, GRASSLAND, HEAVY_FOREST, HIGHWATER, HIT_UNDER_BRIDGE, ICE, IsForest, IsRunning, JUMP, Jumping, Landed, LANDED, LandMech(), LIGHT_FOREST, MadePilotSkillRoll(), MadePilotSkillRoll_NoXP(), MAX, mech_notify(), mech_printf(), MECHALL, MechAutoFall, MechDesiredSpeed, MechElev, MechElevation, MECHEVENT, MechFalls(), MechFloods(), MechFX, MechFY, MechFZ, MechLastX, MechLastY, MechLOSBroadcast(), MechMove, MechPilot, MECHPILOT, MechRTerrain, MechsElevation, MechSpecials2, MechSpeed, MechStatus, MechStatus2, MechTerrain, MechType, MechVerticalSpeed, MechX, MechY, MechZ, MIN, MINE_STEP, MMaxSpeed, MODE_OFF, MODE_SPRINT, MOVE_BIPED, MOVE_FLY, MOVE_FOIL, MOVE_HOVER, MOVE_HULL, MOVE_QUAD, MOVE_SUB, MOVE_TRACK, move_unit_back(), MOVE_VTOL, MOVE_WHEEL, MoveModeChange, MP1, MP2, MP3, MP_PER_KPH, mudconf, possible_mine_poof(), RGotPilot, ROAD, ROUGH, SkidMod(), SPRINTING, tprintf(), TURN, WALK_BACK, WALK_DROP, WALK_WALL, WalkingSpeed, WATER, WATERPROOF_TECH, and ZSCALE.

Referenced by move_mech().

01658 {
01659         int elevation, lastelevation;
01660         int oldterrain;
01661         int ot, le, ed, done = 0, tt, avoidbth;
01662         int isunder = 0;
01663         float f;
01664 
01665         /* Recording the old elevation and terrain */
01667         ot = oldterrain = GetTerrain(mech_map, MechLastX(mech), MechLastY(mech));
01668 
01669         if((MechMove(mech) == MOVE_HOVER) &&
01670            (oldterrain == WATER || oldterrain == ICE ||
01671                 ((oldterrain == BRIDGE) && (last_z == 0)))) {
01672 
01673                 le = lastelevation = elevation = 0;
01674 
01675         } else {
01676 
01677                 le = lastelevation =
01678                         Elevation(mech_map, MechLastX(mech), MechLastY(mech));
01679                 elevation = MechElevation(mech);
01680 
01681                 if(MechMove(mech) == MOVE_HOVER && elevation < 0)
01682                         elevation = 0;
01683 
01684                 if(ot == ICE && MechZ(mech) >= 0) {
01685                         le = lastelevation = 0;
01686                 }
01687 
01688         /*      if(MechZ(mech) < le)
01689                         le = MechZ(mech);
01690         */
01691         }
01692 
01693         switch (MechMove(mech)) {
01694         case MOVE_BIPED:
01695         case MOVE_QUAD:
01696 
01697                 if(Jumping(mech)) {
01698 
01699                         if(MechRTerrain(mech) == WATER)
01700                                 return;
01701 
01702 #define MOVE_BACK \
01703                 MechFX(mech) -= deltax;\
01704                 MechFY(mech) -= deltay;\
01705                 MechX(mech) = MechLastX(mech);\
01706                 MechY(mech) = MechLastY(mech);\
01707                 MechZ(mech) = lastelevation;\
01708                 MechFZ(mech) = MechZ(mech) * ZSCALE;\
01709                 MechTerrain(mech) = ot;\
01710                 MechElev(mech) = le;
01711 
01712                         /* Did we hit something while jumping */
01713                         if(collision_check(mech, JUMP, 0, 0)) {
01714 
01715                                 ed = MAX(1, 1 + MechZ(mech) - Elevation(mech_map,
01716                                                                                                                 MechX(mech),
01717                                                                                                                 MechY(mech)));
01718                                 move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
01719                                 mech_notify(mech, MECHALL,
01720                                                         "%chYou attempt to jump over elevation that is too high!%c");
01721                                 if(RGotPilot(mech) &&
01722                                    MadePilotSkillRoll(mech,
01723                                                                           (int) (MechFZ(mech)) / ZSCALE / 3)) {
01724 
01725                                         mech_notify(mech, MECHALL, "%chYou land safely.%c");
01726                                         LandMech(mech);
01727 
01728                                 } else {
01729 
01730                                         mech_notify(mech, MECHALL,
01731                                                                 "%chYou crash into the obstacle and fall from the sky!%c");
01732                                         MechLOSBroadcast(mech,
01733                                                                          "crashes into an obstacle and falls from the sky!");
01734                                         MechFalls(mech, ed, 0);
01735                                         domino_space(mech, 2);
01736                                 }
01737                         }
01738                         return;
01739                 }
01740 
01741                 /* Walked into a wall silly */
01742                 if(collision_check(mech, WALK_WALL, lastelevation, oldterrain)) {
01743 
01744                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
01745                         mech_notify(mech, MECHALL,
01746                                                 "You attempt to climb a hill too steep for you.");
01747 
01748                         if(MechPilot(mech) == -1 || (!mudconf.btech_skidcliff &&
01749                         MadePilotSkillRoll_NoXP(mech,
01750                             (int) (fabs((MechSpeed (mech)) + MP1) / MP1) / 3, 1))
01751                            || (mudconf.btech_skidcliff &&
01752                     MadePilotSkillRoll_NoXP(mech, 
01753                         SkidMod(fabs(MechSpeed(mech)) / MP1), 1))) {
01754 
01755                                 mech_notify(mech, MECHALL,
01756                                                         "You manage to stop before crashing.");
01757                                 MechLOSBroadcast(mech, "stops suddenly to avoid a cliff!");
01758 
01759                         } else {
01760 
01761                                 mech_notify(mech, MECHALL,
01762                                                         "You run headlong into the cliff and fall down!");
01763                                 MechLOSBroadcast(mech,
01764                                                                  "runs headlong into a cliff and falls down!");
01765                                 if(!mudconf.btech_skidcliff)
01766                                         MechFalls(mech,
01767                                                           (int) (1 + (MechSpeed(mech)) * MP_PER_KPH) / 4,
01768                                                           0);
01769                                 else
01770                                         MechFalls(mech, 1, 0);
01771                         }
01772                         MechDesiredSpeed(mech) = 0;
01773                         MechSpeed(mech) = 0;
01774                         MechZ(mech) = lastelevation;
01775                         return;
01776 
01777                 } else if(collision_check(mech, WALK_DROP, lastelevation, oldterrain)) {
01778 
01779                         /* Walked off a cliff ... */
01780                         mech_notify(mech, MECHALL,
01781                                                 "You notice a large drop in front of you");
01782                         avoidbth = mudconf.btech_skidcliff ?
01783                                 SkidMod(fabs(MechSpeed(mech)) / MP1) :
01784                                 ((fabs((MechSpeed(mech)) + MP1) / MP1) / 3);
01785 
01786                         if(MechPilot(mech) == -1 || (!MechAutoFall(mech) &&
01787                                                                                  MadePilotSkillRoll_NoXP(mech,
01788                                                                                                                         avoidbth,1))) {
01789 
01790                                 mech_notify(mech, MECHALL,
01791                                                         "You manage to stop before falling off.");
01792                                 MechLOSBroadcast(mech,
01793                                                                  "stops suddenly to avoid falling off a cliff!");
01794                                 move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
01795 
01796                         } else {
01797 
01798                                 mech_notify(mech, MECHALL,
01799                                                         "You run off the cliff and fall to the ground below.");
01800                                 MechLOSBroadcast(mech,
01801                                                                  "runs off a cliff and falls to the ground below!");
01802                                 MechFalls(mech, lastelevation - elevation, 0);
01803                                 MechDesiredSpeed(mech) = 0;
01804                                 MechSpeed(mech) = 0;
01805                         }
01806                         MechDesiredSpeed(mech) = 0;
01807                         MechSpeed(mech) = 0;
01808                         return;
01809 
01810                 } else if(mudconf.btech_roll_on_backwalk &&
01811                                   (MechSpeed(mech) < 0) &&
01812                                   (collision_check
01813                                    (mech, WALK_BACK, lastelevation, oldterrain))) {
01814 
01815                         mech_printf(mech, MECHALL, "You notice a %s behind you!",
01816                                                 (elevation >
01817                                                  lastelevation ? "small incline" : "small drop"));
01818 
01819                         if(MechPilot(mech) == -1
01820                            || (MadePilotSkillRoll(mech,
01821                                                                           collision_check(mech, WALK_BACK,
01822                                                                                                           lastelevation,
01823                                                                                                           oldterrain)
01824                                                                           - 1))) {
01825 
01826                                 mech_notify(mech, MECHALL,
01827                                                         "You manage to overcome the obstacle.");
01828 
01829                         } else {
01830 
01831                                 mech_printf(mech, MECHALL, "%s",
01832                                                         (elevation > lastelevation ?
01833                                                          "You stumble on your rear and fall down." :
01834                                                          "You fall on your rear off the small incline."));
01835 
01837                                 MechLOSBroadcast(mech,
01838                                                                  tprintf("%s",
01839                                                                                  (elevation >
01840                                                                                   lastelevation ?
01841                                                                                   "falls on its back walking up an incline."
01842                                                                                   :
01843                                                                                   "falls off the back of a small incline.")));
01844                                 MechFalls(mech, abs(lastelevation - elevation), 1);
01845                                 MechDesiredSpeed(mech) = 0;
01846                                 MechSpeed(mech) = 0;
01847                                 if(elevation > lastelevation) {
01848                                         move_unit_back(mech, deltax, deltay, lastelevation, ot,
01849                                                                    le);
01850                                 }
01851                         }
01852                         return;
01853                 }
01854 
01855                 /* Slow the unit if its made an elevation change */
01856                 le = elevation - lastelevation;
01857                 le = (le < 0) ? -le : le;
01858                 if(MechZ(mech) != elevation)
01859                         le = 0;
01860                 if(le > 0) {
01861                         deltax = (le == 1) ? MP1 : MP2;
01862                         if(MechSpeed(mech) > 0) {
01863                                 MechSpeed(mech) -= deltax;
01864                                 if(MechSpeed(mech) < 0)
01865                                         MechSpeed(mech) = 0;
01866                         } else if(MechSpeed(mech) < 0) {
01867                                 MechSpeed(mech) += deltax;
01868                                 if(MechSpeed(mech) > 0)
01869                                         MechSpeed(mech) = 0;
01870                         }
01871                 }
01872 
01873                 if(MechType(mech) == CLASS_BSUIT) {
01874 
01875                         /* Are they in water, also make sure it affects them */
01876                         if(!(MechSpecials2(mech) & WATERPROOF_TECH) &&
01877                            (MechRTerrain(mech) == WATER ||
01878                                 (MechRTerrain(mech) == BRIDGE &&
01879                                  (lastelevation < (elevation - 1)))) && elevation < 0) {
01880 
01881                                 mech_notify(mech, MECHALL,
01882                                                         "You notice a body of water in front of you");
01883 
01884                                 if(MechPilot(mech) == -1 ||
01885                                    MadePilotSkillRoll(mech,
01886                                                                           (int) (fabs((MechSpeed(mech)) + MP1) /
01887                                                                                          MP1) / 3)) {
01888 
01889                                         mech_notify(mech, MECHALL,
01890                                                                 "You manage to stop before falling in.");
01891                                         MechLOSBroadcast(mech,
01892                                                                          "stops suddenly to avoid going for a swim!");
01893                                 } else {
01894 
01895                                         mech_notify(mech, MECHALL,
01896                                                                 "You trip at the edge of the water and plunge in...");
01897                                         MechFloods(mech);
01898                                         return;
01899                                 }
01900                                 move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
01901                                 MechDesiredSpeed(mech) = 0;
01902                                 MechSpeed(mech) = 0;
01903                                 return;
01904                         }
01905 
01906                 } else if(!(MechSpecials2(mech) & WATERPROOF_TECH) &&
01907                                   ((MechRTerrain(mech) == WATER && MechZ(mech) < 0) ||
01908                                    (MechRTerrain(mech) == BRIDGE && MechZ(mech) < 0) ||
01909                                    (MechRTerrain(mech) == ICE && MechZ(mech) < 0) ||
01910                                    MechRTerrain(mech) == HIGHWATER) &&
01911                                   MechType(mech) != CLASS_MW) {
01912 
01913                         int skillmod, dammod;
01914                         MechDesiredSpeed(mech) = MIN(MechDesiredSpeed(mech),
01915                                                                                  WalkingSpeed(MMaxSpeed(mech)));
01916 #ifdef BT_MOVEMENT_MODES
01917                         if(MechStatus2(mech) & SPRINTING) {
01918                                 MechLOSBroadcast(mech,
01919                                                                  "breaks out of its sprint as it enters water!");
01920                                 mech_notify(mech, MECHALL,
01921                                                         "You lose your sprinting momentum as you "
01922                                                         "enter water!");
01923                                 if(!MoveModeChange(mech))
01924                                         MECHEVENT(mech, EVENT_MOVEMODE, mech_movemode_event, TURN,
01925                                                   MODE_OFF | MODE_SPRINT);
01926                         }
01927 #endif
01928                         if(IsRunning(MechSpeed(mech), MMaxSpeed(mech))) {
01929                                 mech_notify(mech, MECHPILOT,
01930                                                         "You struggle to keep control as you run into the water!");
01931                                 skillmod = 2;
01932                                 dammod = 2;
01933                         } else {
01934                                 mech_notify(mech, MECHPILOT, "You use your piloting skill "
01935                                                         "to maneuver through the water.");
01936                                 skillmod = 0;
01937                                 dammod = 0;
01938                         }
01939                         skillmod += (MechRTerrain(mech) == HIGHWATER ? -2 :
01940                                                  MechRTerrain(mech) ==
01941                                                  BRIDGE ? bridge_w_elevation(mech) : MechElev(mech) >
01942                                                  3 ? 1 : (MechElev(mech) - 2));
01943 
01944                         if(!MadePilotSkillRoll(mech, skillmod)) {
01945                                 mech_notify(mech, MECHALL,
01946                                                         "You slip in the water and fall down");
01947                                 MechLOSBroadcast(mech, "slips in the water and falls down!");
01948                                 MechFalls(mech, 1, dammod);
01949                                 done = 1;
01950                         }
01951                 }
01952                 break;
01953 
01954         case MOVE_TRACK:
01955 
01956                 if(collision_check(mech, WALK_WALL, lastelevation, oldterrain)) {
01957                         mech_notify(mech, MECHALL,
01958                                                 "You attempt to climb a hill too steep for you.");
01959 
01960                         if(MechPilot(mech) == -1 || (!mudconf.btech_skidcliff &&
01961                         MadePilotSkillRoll_NoXP(mech,
01962                             (int) (fabs((MechSpeed (mech)) + MP1) / MP1) / 3, 1))
01963                            || (mudconf.btech_skidcliff &&
01964                     MadePilotSkillRoll_NoXP(mech, 
01965                         SkidMod(fabs(MechSpeed(mech)) / MP1), 1))) {
01966 
01967                                 mech_notify(mech, MECHALL,
01968                                                         "You manage to stop before crashing.");
01969                                 MechLOSBroadcast(mech, "stops suddenly to avoid a cliff!");
01970 
01971                         } else {
01972 
01973                                 if(!mudconf.btech_skidcliff) {
01974                                         mech_notify(mech, MECHALL, "You smash into a cliff!");
01975                                         MechLOSBroadcast(mech, "crashes to a cliff!");
01976                                         MechFalls(mech, (int) (MechSpeed(mech) * MP_PER_KPH / 4),
01977                                                           0);
01978                                 } else {
01979                                         mech_notify(mech, MECHALL,
01980                                                                 "You skid to a violent halt!");
01981                                         MechLOSBroadcast(mech, "goes into a skid!");
01982                                         MechFalls(mech, 0, 0);
01983                                 }
01984                         }
01985                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
01986                         MechDesiredSpeed(mech) = 0;
01987                         MechSpeed(mech) = 0;
01988                         return;
01989 
01990                 } else if(collision_check(mech, WALK_DROP, lastelevation, oldterrain)) {
01991 
01992                         mech_notify(mech, MECHALL,
01993                                                 "You notice a large drop in front of you");
01994                         avoidbth = mudconf.btech_skidcliff ?
01995                                 SkidMod(fabs(MechSpeed(mech)) / MP1) :
01996                                 ((fabs((MechSpeed(mech)) + MP1) / MP1) / 3);
01997                         if(MechPilot(mech) == -1 || (!MechAutoFall(mech) &&
01998                                                                                  MadePilotSkillRoll_NoXP(mech,
01999                                                                                                                         avoidbth,1))) {
02000                                 mech_notify(mech, MECHALL,
02001                                                         "You manage to stop before falling off.");
02002                                 MechLOSBroadcast(mech,
02003                                                                  "stops suddenly to avoid falling off a cliff!");
02004                         } else {
02005                                 mech_notify(mech, MECHALL,
02006                                                         "You drive off the cliff and fall to the ground below.");
02007                                 MechLOSBroadcast(mech,
02008                                                                  "drives off a cliff and falls to the ground below.");
02009                                 MechFalls(mech, lastelevation - elevation, 0);
02010                                 domino_space(mech, 2);
02011 
02012                                 if(MechRTerrain(mech) == WATER &&
02013                                    !(MechSpecials2(mech) & WATERPROOF_TECH)) {
02014 
02015                                         mech_notify(mech, MECHALL,
02016                                                                 "You drive into the water and your vehicle becomes inoperable.");
02017                                         Destroy(mech);
02018                                         ChannelEmitKill(mech, mech);
02019                                 }
02020 
02021                                 return;
02022                         }
02023                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02024                         MechDesiredSpeed(mech) = 0;
02025                         MechSpeed(mech) = 0;
02026                         return;
02027 
02028                 } else if(mudconf.btech_roll_on_backwalk && (MechSpeed(mech) < 0) &&
02029                                   (collision_check
02030                                    (mech, WALK_BACK, lastelevation, oldterrain))) {
02031 
02032                         mech_printf(mech, MECHALL, "You notice a %s behind you!",
02033                                                 (elevation >
02034                                                  lastelevation ? "small incline" : "small drop"));
02035 
02036                         if(MechPilot(mech) == -1 || (MadePilotSkillRoll(mech,
02037                                                                                                                         collision_check
02038                                                                                                                         (mech, WALK_BACK,
02039                                                                                                                          lastelevation,
02040                                                                                                                          oldterrain)
02041                                                                                                                         - 1))) {
02042 
02043                                 mech_notify(mech, MECHALL,
02044                                                         "You manage to overcome the obstacle.");
02045                         } else {
02046                                 mech_printf(mech, MECHALL, "%s",
02047                                                         (elevation > lastelevation ?
02048                                                          "You stumble on your rear and fall down." :
02049                                                          "You fall on your rear off the small incline."));
02050                                 MechLOSBroadcast(mech,
02051                                                                  tprintf("%s",
02052                                                                                  (elevation >
02053                                                                                   lastelevation ?
02054                                                                                   "falls on its back walking up an incline."
02055                                                                                   :
02056                                                                                   "falls off the back of a small incline.")));
02057                                 MechFalls(mech, abs(lastelevation - elevation), 1);
02058                                 MechDesiredSpeed(mech) = 0;
02059                                 MechSpeed(mech) = 0;
02060                                 if(elevation > lastelevation) {
02061                                         move_unit_back(mech, deltax, deltay, lastelevation, ot,
02062                                                                    le);
02063                                 }
02064                         }
02065                         return;
02066                 }
02067 
02068                 if(!(MechSpecials2(mech) & WATERPROOF_TECH) &&
02069                    (MechRTerrain(mech) == WATER ||
02070                         (MechRTerrain(mech) == BRIDGE
02071                          && (lastelevation < (elevation - 1)))) && elevation < 0) {
02072 
02073                         mech_notify(mech, MECHALL,
02074                                                 "You notice a body of water in front of you");
02075                         if(MechPilot(mech) == -1 ||
02076                            MadePilotSkillRoll(mech,
02077                                                                   (int) (fabs((MechSpeed(mech)) + MP1) /
02078                                                                                  MP1) / 3)) {
02079                                 mech_notify(mech, MECHALL,
02080                                                         "You manage to stop before falling in.");
02081                                 MechLOSBroadcast(mech,
02082                                                                  "stops suddenly to avoid driving into the water!");
02083                         } else {
02084                                 mech_notify(mech, MECHALL,
02085                                                         "You drive into the water and your vehicle becomes inoperable.");
02086                                 Destroy(mech);
02087                                 ChannelEmitKill(mech, mech);
02088                                 return;
02089                         }
02090                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02091                         MechDesiredSpeed(mech) = 0;
02092                         MechSpeed(mech) = 0;
02093                         return;
02094                 }
02095 
02096                 /* New terrain restrictions */
02097                 if(mudconf.btech_newterrain) {
02098                         tt = MechRTerrain(mech);
02099                         if((tt == HEAVY_FOREST) && fabs(MechSpeed(mech)) > MP1) {
02100 
02101 #if 0
02102                                 mech_notify(mech, MECHALL, "You cruise at a bunch of trees!");
02103 #endif
02104                                 mech_notify(mech, MECHALL,
02105                                                         "You try to dodge the larger trees..");
02106 
02107                                 if(MechPilot(mech) == -1 || MadePilotSkillRoll(mech,
02108                                                                                                                            (int) (fabs
02109                                                                                                                                           (MechSpeed
02110                                                                                                                                            (mech))
02111                                                                                                                                           / MP1 /
02112                                                                                                                                           6))) {
02113 
02114                                         mech_notify(mech, MECHALL, "You manage to dodge 'em!");
02115                                 } else {
02116                                         mech_notify(mech, MECHALL,
02117                                                                 "You swerve, but not enough! This'll hurt!");
02118                                         MechLOSBroadcast(mech, "cruises headlong at a tree!");
02119                                         f = fabs(MechSpeed(mech));
02120                                         MechSpeed(mech) = MechSpeed(mech) / 2.0;
02121                                         MechFalls(mech, MAX(1, (int) sqrt(f / MP1 / 2)), 0);
02122                                 }
02123                         }
02124                 }
02125 
02126                 /* Slow them if they made an elevation change */
02127                 le = elevation - lastelevation;
02128                 le = (le < 0) ? -le : le;
02129                 if(le > 0) {
02130                         deltax = (le == 1) ? MP2 : MP3;
02131                         if(MechSpeed(mech) > 0) {
02132                                 MechSpeed(mech) -= deltax;
02133                                 if(MechSpeed(mech) < 0)
02134                                         MechSpeed(mech) = 0;
02135                         } else if(MechSpeed(mech) < 0) {
02136                                 MechSpeed(mech) += deltax;
02137                                 if(MechSpeed(mech) > 0)
02138                                         MechSpeed(mech) = 0;
02139                         }
02140                 }
02141                 break;
02142 
02143         case MOVE_WHEEL:
02144 
02145                 /* Cliff ! */
02146                 if(collision_check(mech, WALK_WALL, lastelevation, oldterrain)) {
02147 
02148                         mech_notify(mech, MECHALL,
02149                                                 "You attempt to climb a hill too steep for you.");
02150 
02151                         if(MechPilot(mech) == -1 || (!mudconf.btech_skidcliff &&
02152                         MadePilotSkillRoll_NoXP(mech,
02153                             (int) (fabs((MechSpeed (mech)) + MP1) / MP1) / 3, 1))
02154                            || (mudconf.btech_skidcliff &&
02155                     MadePilotSkillRoll_NoXP(mech, 
02156                         SkidMod(fabs(MechSpeed(mech)) / MP1), 1))) {
02157 
02158                                 mech_notify(mech, MECHALL,
02159                                                         "You manage to stop before crashing.");
02160                                 MechLOSBroadcast(mech, "stops suddenly to avoid a cliff!");
02161 
02162                         } else {
02163 
02164                                 if(!mudconf.btech_skidcliff) {
02165                                         mech_notify(mech, MECHALL, "You smash into a cliff!");
02166                                         MechLOSBroadcast(mech, "crashes to a cliff!");
02167                                         MechFalls(mech, (int) (MechSpeed(mech) * MP_PER_KPH / 4),
02168                                                           0);
02169                                 } else {
02170                                         mech_notify(mech, MECHALL, "You skid to a violent halt!");
02171                                         MechLOSBroadcast(mech, "skids to a halt!");
02172                                         MechFalls(mech, 0, 0);
02173                                 }
02174                         }
02175 
02176                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02177                         MechDesiredSpeed(mech) = 0;
02178                         MechSpeed(mech) = 0;
02179                         return;
02180 
02181                 } else if(collision_check(mech, WALK_DROP, lastelevation, oldterrain)) {
02182 
02183                         mech_notify(mech, MECHALL,
02184                                                 "You notice a large drop in front of you");
02185                         avoidbth = mudconf.btech_skidcliff ?
02186                                 SkidMod(fabs(MechSpeed(mech)) / MP1) :
02187                                 ((fabs((MechSpeed(mech)) + MP1) / MP1) / 3);
02188 
02189                         if(MechPilot(mech) == -1 || (!MechAutoFall(mech) &&
02190                                                                                  MadePilotSkillRoll_NoXP(mech,
02191                                                                                                                         avoidbth,1))) {
02192 
02193                                 mech_notify(mech, MECHALL,
02194                                                         "You manage to stop before falling off.");
02195                                 MechLOSBroadcast(mech,
02196                                                                  "stops suddenly to avoid driving off a cliff!");
02197                         } else {
02198                                 mech_notify(mech, MECHALL,
02199                                                         "You drive off the cliff and fall to the ground below.");
02200                                 MechLOSBroadcast(mech,
02201                                                                  "drives off a cliff and falls to the ground below.");
02202                                 MechFalls(mech, lastelevation - elevation, 0);
02203                                 domino_space(mech, 2);
02204 
02205                                 if(MechRTerrain(mech) == WATER &&
02206                                    !(MechSpecials2(mech) & WATERPROOF_TECH)) {
02207 
02208                                         mech_notify(mech, MECHALL,
02209                                                                 "You drive into the water and your vehicle becomes inoperable.");
02210                                         Destroy(mech);
02211                                         ChannelEmitKill(mech, mech);
02212                                 }
02213 
02214                                 return;
02215                         }
02216                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02217                         MechDesiredSpeed(mech) = 0;
02218                         MechSpeed(mech) = 0;
02219                         return;
02220 
02221                 } else if(mudconf.btech_roll_on_backwalk &&
02222                                   (MechSpeed(mech) < 0) &&
02223                                   (collision_check
02224                                    (mech, WALK_BACK, lastelevation, oldterrain))) {
02225 
02226                         mech_printf(mech, MECHALL, "You notice a %s behind you!",
02227                                                 (elevation >
02228                                                  lastelevation ? "small incline" : "small drop"));
02229 
02230                         if(MechPilot(mech) == -1 || (MadePilotSkillRoll(mech,
02231                                                                                                                         collision_check
02232                                                                                                                         (mech, WALK_BACK,
02233                                                                                                                          lastelevation,
02234                                                                                                                          oldterrain)
02235                                                                                                                         - 1))) {
02236                                 mech_notify(mech, MECHALL,
02237                                                         "You manage to overcome the obstacle.");
02238                         } else {
02239                                 mech_printf(mech, MECHALL, "%s",
02240                                                         (elevation > lastelevation ?
02241                                                          "You stumble on your rear and fall down." :
02242                                                          "You fall on your rear off the small incline."));
02243                                 MechLOSBroadcast(mech,
02244                                                                  tprintf("%s", (elevation > lastelevation ?
02245                                                                                                 "falls on its back walking up an incline."
02246                                                                                                 :
02247                                                                                                 "falls off the back of a small incline.")));
02248                                 MechFalls(mech, abs(lastelevation - elevation), 1);
02249                                 MechDesiredSpeed(mech) = 0;
02250                                 MechSpeed(mech) = 0;
02251                                 if(elevation > lastelevation) {
02252                                         move_unit_back(mech, deltax, deltay, lastelevation, ot,
02253                                                                    le);
02254                                 }
02255                         }
02256                         return;
02257                 }
02258 
02259                 if(!(MechSpecials2(mech) & WATERPROOF_TECH) &&
02260                    (MechRTerrain(mech) == WATER ||
02261                         (MechRTerrain(mech) == BRIDGE
02262                          && (lastelevation < (elevation - 1)))) && elevation < 0) {
02263 
02264                         mech_notify(mech, MECHALL,
02265                                                 "You notice a body of water in front of you");
02266 
02267                         if(MechPilot(mech) == -1 ||
02268                            MadePilotSkillRoll(mech,
02269                                                                   (int) (fabs((MechSpeed(mech)) + MP1) /
02270                                                                                  MP1) / 3)) {
02271 
02272                                 mech_notify(mech, MECHALL,
02273                                                         "You manage to stop before falling in.");
02274                                 MechLOSBroadcast(mech,
02275                                                                  "stops suddenly to driving into the water!");
02276                         } else {
02277                                 mech_notify(mech, MECHALL,
02278                                                         "You drive into the water and your vehicle becomes inoperable.");
02279                                 Destroy(mech);
02280                                 ChannelEmitKill(mech, mech);
02281                                 return;
02282                         }
02283                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02284                         MechDesiredSpeed(mech) = 0;
02285                         MechSpeed(mech) = 0;
02286                         return;
02287                 }
02288 
02289                 /* New terrain restrictions */
02290                 if(mudconf.btech_newterrain) {
02291                         tt = MechRTerrain(mech);
02292                         if((tt == HEAVY_FOREST || tt == LIGHT_FOREST) &&
02293                            fabs(MechSpeed(mech)) > MP1) {
02294 
02295 #if 0
02296                                 mech_notify(mech, MECHALL, "You cruise at a bunch of trees!");
02297 #endif
02298                                 mech_notify(mech, MECHALL,
02299                                                         "You try to dodge the larger trees..");
02300                                 if(MechPilot(mech) == -1 ||
02301                                    MadePilotSkillRoll(mech,
02302                                                                           (tt == HEAVY_FOREST ? 3 : 0) +
02303                                                                           (fabs(MechSpeed(mech)) / MP1 / 6))) {
02304 
02305                                         mech_notify(mech, MECHALL, "You manage to dodge 'em!");
02306 
02307                                 } else {
02308                                         mech_notify(mech, MECHALL,
02309                                                                 "You swerve, but not enough! This'll hurt!");
02310                                         MechLOSBroadcast(mech, "cruises headlong at a tree!");
02311                                         f = fabs(MechSpeed(mech));
02312                                         MechSpeed(mech) = MechSpeed(mech) / 2.0;
02313                                         MechFalls(mech, MAX(1, (int) sqrt(f / MP1 / 2)), 0);
02314                                 }
02315 
02316                         } else if((tt == ROUGH) && fabs(MechSpeed(mech)) > MP1) {
02317 #if 0
02318                                 mech_notify(mech, MECHALL,
02319                                                         "You cruise at some rough terrain!");
02320 #endif
02321                                 mech_notify(mech, MECHALL, "You try to avoid the rocks..");
02322                                 if(MechPilot(mech) == -1 || MadePilotSkillRoll(mech,
02323                                                                                                                            (int) (fabs
02324                                                                                                                                           (MechSpeed
02325                                                                                                                                            (mech))
02326                                                                                                                                           / MP1 /
02327                                                                                                                                           6))) {
02328                                         mech_notify(mech, MECHALL, "You manage to dodge 'em!");
02329                                 } else {
02330                                         mech_notify(mech, MECHALL,
02331                                                                 "You swerve, but not enough! This'll hurt!");
02332                                         MechLOSBroadcast(mech, "cruises headlong at a rock!");
02333                                         f = fabs(MechSpeed(mech));
02334                                         MechSpeed(mech) = MechSpeed(mech) / 2.0;
02335                                         MechFalls(mech, MAX(1, (int) sqrt(f / MP1 / 2)), 0);
02336                                 }
02337                         }
02338                 }
02339 
02340                 /* Slow them down if they change elevations */
02341                 le = elevation - lastelevation;
02342                 le = (le < 0) ? -le : le;
02343                 if(le > 0) {
02344                         deltax = (le == 1) ? MP2 : MP3;
02345                         if(MechSpeed(mech) > 0) {
02346                                 MechSpeed(mech) -= deltax;
02347                                 if(MechSpeed(mech) < 0)
02348                                         MechSpeed(mech) = 0;
02349                         } else if(MechSpeed(mech) < 0) {
02350                                 MechSpeed(mech) += deltax;
02351                                 if(MechSpeed(mech) > 0)
02352                                         MechSpeed(mech) = 0;
02353                         }
02354                 }
02355                 break;
02356 
02357         case MOVE_HULL:
02358         case MOVE_FOIL:
02359         case MOVE_SUB:
02360 
02361                 if((MechRTerrain(mech) != WATER && MechRTerrain(mech) != BRIDGE)
02362                    || abs(MechElev(mech)) < (abs(MechZ(mech)) + (MechMove(mech) ==
02363                                                                                                                  MOVE_FOIL ? -1 : 0)))
02364                 {
02365                         /* Run aground */
02366                         MechElev(mech) = le;
02367                         MechTerrain(mech) = ot;
02368                         mech_notify(mech, MECHALL,
02369                                                 "You attempt to get too close with ground!");
02370                         if(MechPilot(mech) == -1 ||
02371                            MadePilotSkillRoll(mech,
02372                                                                   (int) (fabs((MechSpeed(mech)) + MP1) /
02373                                                                                  MP1) / 3)) {
02374                                 mech_notify(mech, MECHALL,
02375                                                         "You manage to stop before crashing.");
02376                                 MechLOSBroadcast(mech,
02377                                                                  "stops suddenly to avoid running aground!");
02378                                 move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02379                         } else {
02380                                 mech_notify(mech, MECHALL, "You smash into the ground!");
02381                                 MechLOSBroadcast(mech, "smashes aground!");
02382                                 MechFalls(mech, (int) (MechSpeed(mech) * MP_PER_KPH / 4), 0);
02383                         }
02384                         MechSpeed(mech) = 0;
02385                         MechDesiredSpeed(mech) = 0;
02386                         MechVerticalSpeed(mech) = 0;
02387                         return;
02388                 }
02389                 if(elevation > 0)
02390                         elevation = 0;
02391                 break;
02392 
02393         case MOVE_HOVER:
02394 
02395                 if(collision_check(mech, WALK_WALL, lastelevation, oldterrain)) {
02396                         MechElev(mech) = le;
02397                         MechTerrain(mech) = ot;
02398                         mech_notify(mech, MECHALL,
02399                                                 "You attempt to climb a hill too steep for you.");
02400                         if(MechPilot(mech) == -1 || (!mudconf.btech_skidcliff &&
02401                         MadePilotSkillRoll_NoXP(mech,
02402                             (int) (fabs((MechSpeed (mech)) + MP1) / MP1) / 3, 1))
02403                            || (mudconf.btech_skidcliff &&
02404                     MadePilotSkillRoll_NoXP(mech, 
02405                         SkidMod(fabs(MechSpeed(mech)) / MP1), 1))) {
02406 
02407                                 mech_notify(mech, MECHALL,
02408                                                         "You manage to stop before crashing.");
02409                                 MechLOSBroadcast(mech, "stops suddenly to avoid a cliff!");
02410 
02411                         } else {
02412 
02413                                 if(!mudconf.btech_skidcliff) {
02414                                         mech_notify(mech, MECHALL, "You smash into a cliff!");
02415                                         MechLOSBroadcast(mech, "smashes into a cliff!");
02416                                         MechFalls(mech,
02417                                                           (int) (MechSpeed(mech) * MP_PER_KPH / 4), 0);
02418                                 } else {
02419                                         mech_notify(mech, MECHALL, "You skid to a violent halt!");
02420                                         MechLOSBroadcast(mech, "skids to a halt!");
02421                                         MechFalls(mech, 0, 0);
02422                                 }
02423                         }
02424                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02425                         MechDesiredSpeed(mech) = 0;
02426                         MechSpeed(mech) = 0;
02427                         return;
02428 
02429                 } else if(collision_check(mech, WALK_DROP, lastelevation, oldterrain)) {
02430 
02431                         mech_notify(mech, MECHALL,
02432                                                 "You notice a large drop in front of you");
02433 
02434                         avoidbth = mudconf.btech_skidcliff ?
02435                                 SkidMod(fabs(MechSpeed(mech)) / MP1) :
02436                                 ((fabs((MechSpeed(mech)) + MP1) / MP1) / 3);
02437 
02438                         if(MechPilot(mech) == -1 || (!MechAutoFall(mech) &&
02439                                                                                  MadePilotSkillRoll_NoXP(mech,
02440                                                                                                                         avoidbth,1))) {
02441 
02442                                 mech_notify(mech, MECHALL,
02443                                                         "You manage to stop before falling off.");
02444                                 MechLOSBroadcast(mech,
02445                                                                  "stops suddenly to avoid falling off a cliff!");
02446 
02447                         } else {
02448 
02449                                 mech_notify(mech, MECHALL,
02450                                                         "You drive off the cliff and fall to the ground below.");
02451                                 MechLOSBroadcast(mech,
02452                                                                  "drives off a cliff and falls to the ground below.");
02453                                 MechFalls(mech, lastelevation - elevation, 0);
02454                                 return;
02455                         }
02456 
02457                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02458                         MechDesiredSpeed(mech) = 0;
02459                         MechSpeed(mech) = 0;
02460                         return;
02461 
02462                 } else if(collision_check(mech, HIT_UNDER_BRIDGE, lastelevation,
02463                                                                   oldterrain)) {
02464 
02465                         mech_notify(mech, MECHALL,
02466                                                 "You notice the underside of the bridge in front of you!");
02467 
02468                         if(MechPilot(mech) == -1 || (!mudconf.btech_skidcliff &&
02469                                                                                  MadePilotSkillRoll(mech,
02470                                                                                                                         (int) (fabs
02471                                                                                                                                    ((MechSpeed
02472                                                                                                                                          (mech)) +
02473                                                                                                                                         MP1) /
02474                                                                                                                                    MP1) / 3))
02475                            || (mudconf.btech_skidcliff
02476                                    && MadePilotSkillRoll(mech,
02477                                                                                  SkidMod(fabs(MechSpeed(mech)) /
02478                                                                                                  MP1)))) {
02479 
02480                                 mech_notify(mech, MECHALL,
02481                                                         "You manage to stop before slamming into the bridge.");
02482                                 MechLOSBroadcast(mech,
02483                                                                  "stops suddenly to avoid slamming into the bridge!");
02484                         } else {
02485                                 mech_notify(mech, MECHALL,
02486                                                         "You drive right into the underside of the bridge.");
02487                                 MechLOSBroadcast(mech,
02488                                                                  "drives right into the underside of the bridge.");
02489                                 MechFalls(mech, 1, 0);
02490                         }
02491                         move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02492                         MechDesiredSpeed(mech) = 0;
02493                         MechSpeed(mech) = 0;
02494                         return;
02495 
02496                 } else if(mudconf.btech_roll_on_backwalk &&
02497                                   (MechSpeed(mech) < 0) &&
02498                                   (collision_check
02499                                    (mech, WALK_BACK, lastelevation, oldterrain))
02500                                   && !isunder) {
02501 
02502                         mech_printf(mech, MECHALL, "You notice a %s behind you!",
02503                                                 (elevation >
02504                                                  lastelevation ? "small incline" : "small drop"));
02505 
02506                         if(MechPilot(mech) == -1 || (MadePilotSkillRoll(mech,
02507                                                                                                                         collision_check
02508                                                                                                                         (mech, WALK_BACK,
02509                                                                                                                          lastelevation,
02510                                                                                                                          oldterrain)
02511                                                                                                                         - 1))) {
02512 
02513                                 mech_notify(mech, MECHALL,
02514                                                         "You manage to overcome the obstacle.");
02515 
02516                         } else {
02517 
02518                                 mech_printf(mech, MECHALL, "%s",
02519                                                         (elevation > lastelevation ?
02520                                                          "You stumble on your rear and fall down." :
02521                                                          "You fall on your rear off the small incline."));
02522                                 MechLOSBroadcast(mech,
02523                                                                  tprintf("%s", (elevation > lastelevation ?
02524                                                                                                 "falls on its back walking up an incline."
02525                                                                                                 :
02526                                                                                                 "falls off the back of a small incline.")));
02527                                 MechFalls(mech, abs(lastelevation - elevation), 1);
02528                                 MechDesiredSpeed(mech) = 0;
02529                                 MechSpeed(mech) = 0;
02530                                 if(elevation > lastelevation) {
02531                                         move_unit_back(mech, deltax, deltay, lastelevation, ot,
02532                                                                    le);
02533                                 }
02534                         }
02535                         return;
02536                 }
02537 
02538                 tt = MechRTerrain(mech);
02539                 if((tt == HEAVY_FOREST || tt == LIGHT_FOREST) &&
02540                    fabs(MechSpeed(mech)) > MP1) {
02541 #if 0
02542                         mech_notify(mech, MECHALL, "You cruise at a bunch of trees!");
02543 #endif
02544                         mech_notify(mech, MECHALL, "You try to dodge the larger trees..");
02545 
02546                         if(MechPilot(mech) == -1 ||
02547                            MadePilotSkillRoll(mech,
02548                                                                   (tt == HEAVY_FOREST ? 3 : 0) +
02549                                                                   (fabs(MechSpeed(mech)) / MP1 / 6))) {
02550 
02551                                 mech_notify(mech, MECHALL, "You manage to dodge 'em!");
02552 
02553                         } else {
02554                                 mech_notify(mech, MECHALL,
02555                                                         "You swerve, but not enough! This'll hurt!");
02556                                 MechLOSBroadcast(mech, "cruises headlong at a tree!");
02557                                 f = fabs(MechSpeed(mech));
02558                                 MechSpeed(mech) = MechSpeed(mech) / 2.0;
02559                                 MechFalls(mech, MAX(1, (int) sqrt(f / MP1 / 2)), 0);
02560                         }
02561                 }
02562 
02563                 /* Slow the unit down if its made an elevation change */
02564                 le = elevation - lastelevation;
02565                 le = (le < 0) ? -le : le;
02566                 if(le > 0) {
02567                         deltax = (le == 1) ? MP2 : MP3;
02568                         if(MechSpeed(mech) > 0) {
02569                                 MechSpeed(mech) -= deltax;
02570                                 if(MechSpeed(mech) < 0)
02571                                         MechSpeed(mech) = 0;
02572                         } else if(MechSpeed(mech) < 0) {
02573                                 MechSpeed(mech) += deltax;
02574                                 if(MechSpeed(mech) > 0)
02575                                         MechSpeed(mech) = 0;
02576                         }
02577                 }
02578                 break;
02579 
02580         case MOVE_VTOL:
02581         case MOVE_FLY:
02582                 
02583                 if((Landed(mech) && MechRTerrain(mech) != ROAD &&
02584                    MechRTerrain(mech) != BRIDGE && MechRTerrain(mech) != GRASSLAND
02585                    && MechRTerrain(mech) != BUILDING) ||
02586                    (IsForest(MechRTerrain(mech)) && MechZ(mech) < (MechElevation(mech)+2))) {
02587 
02588                         mech_notify(mech, MECHALL,
02589                                                 "You go where no flying thing has ever gone before..");
02590                         if(RGotPilot(mech) && MadePilotSkillRoll(mech, 5)) {
02591                                 mech_notify(mech, MECHALL, "You stop in time!");
02592                                 move_unit_back(mech, deltax, deltay, lastelevation, ot, le);
02593                         } else {
02594                                 mech_notify(mech, MECHALL,
02595                                                         "Eww.. You've a bad feeling about this.");
02596                                 MechLOSBroadcast(mech, "crashes!");
02597                                 MechFalls(mech, 1, 0);
02598                         }
02599                         MechDesiredSpeed(mech) = 0;
02600                         MechSpeed(mech) = 0;
02601                         return;
02602 
02603                 } else if(Landed(mech) && mudconf.btech_roll_on_backwalk &&
02604                                   (MechSpeed(mech) < 0) &&
02605                                   (collision_check
02606                                    (mech, WALK_BACK, lastelevation, oldterrain))) {
02607 
02608                         mech_printf(mech, MECHALL, "You notice a %s behind you!",
02609                                                 (elevation >
02610                                                  lastelevation ? "small incline" : "small drop"));
02611 
02612                         if(MechPilot(mech) == -1 || (MadePilotSkillRoll(mech,
02613                                                                                                                         collision_check
02614                                                                                                                         (mech, WALK_BACK,
02615                                                                                                                          lastelevation,
02616                                                                                                                          oldterrain)
02617                                                                                                                         - 1))) {
02618 
02619                                 mech_notify(mech, MECHALL,
02620                                                         "You manage to overcome the obstacle.");
02621 
02622                         } else {
02623 
02624                                 mech_printf(mech, MECHALL, "%s", (elevation > lastelevation ?
02625                                                                                                   "You stumble on your rear and fall down."
02626                                                                                                   :
02627                                                                                                   "You fall on your rear off the small incline."));
02628                                 MechLOSBroadcast(mech,
02629                                                                  tprintf("%s",
02630                                                                                  (elevation >
02631                                                                                   lastelevation ?
02632                                                                                   "falls on its back walking up an incline."
02633                                                                                   :
02634                                                                                   "falls off the back of a small incline.")));
02635                                 MechFalls(mech, (abs(lastelevation - elevation) + 1000), 1);
02636                                 MechDesiredSpeed(mech) = 0;
02637                                 MechSpeed(mech) = 0;
02638                                 if(elevation > lastelevation) {
02639                                         move_unit_back(mech, deltax, deltay, lastelevation, ot,
02640                                                                    le);
02641                                 }
02642                         }
02643                         return;
02644                 }
02645 
02646                 if(MechRTerrain(mech) == WATER)
02647                         return;
02648 
02649                 if(MechRTerrain(mech) == LIGHT_FOREST ||
02650                    MechRTerrain(mech) == HEAVY_FOREST)
02651                         elevation = MechElevation(mech) + 2;
02652                 else
02653                         elevation = MechElevation(mech);
02654 
02655                 if(collision_check(mech, JUMP, 0, 0)) {
02656                         MechFX(mech) -= deltax;
02657                         MechFY(mech) -= deltay;
02658                         MechX(mech) = MechLastX(mech);
02659                         MechY(mech) = MechLastY(mech);
02660                         MechZ(mech) = lastelevation;
02661                         MechFZ(mech) = MechZ(mech) * ZSCALE;
02662                         MechElev(mech) = le;
02663                         MechTerrain(mech) = ot;
02664                         mech_notify(mech, MECHALL,
02665                                                 "You attempt to fly over elevation that is too high!");
02666 
02667                         if(MechPilot(mech) == -1 || (MadePilotSkillRoll(mech,
02668                                                                                                                         (int) (MechFZ
02669                                                                                                                                    (mech) /
02670                                                                                                                                    ZSCALE /
02671                                                                                                                                    3))
02672                                                                                  && (ot == GRASSLAND || ot == ROAD
02673                                                                                          || ot == BUILDING))) {
02674 
02675                                 mech_notify(mech, MECHALL, "You land safely.");
02676                                 MechStatus(mech) |= LANDED;
02677                                 MechSpeed(mech) = 0.0;
02678                                 MechVerticalSpeed(mech) = 0.0;
02679 
02680                         } else {
02681                                 mech_notify(mech, MECHALL,
02682                                                         "You crash into the obstacle and fall from the sky!");
02683                                 MechLOSBroadcast(mech,
02684                                                                  "crashes into an obstacle and falls from the sky!");
02685                                 MechFalls(mech, MechsElevation(mech) + 1, 0);
02686                                 domino_space(mech, 2);
02687                         }
02688                 }
02689                 break;
02690         }
02691 
02692         if(!done) {
02693                 possible_mine_poof(mech, MINE_STEP);
02694                 if(mudconf.btech_fasaadvvhlfire &&
02695                    (MechType(mech) == CLASS_VEH_GROUND) &&
02696                    (MechTerrain(mech) == FIRE))
02697                         checkVehicleInFire(mech, 1);
02698         }
02699 }

int OverheatMods ( MECH mech  ) 

Definition at line 1114 of file mech.update.c.

References MechHeat.

Referenced by FindNormalBTH().

01115 {
01116         int returnValue;
01117 
01118         if(MechHeat(mech) >= 24.) {
01119                 /* +4 to fire... */
01120                 returnValue = 4;
01121         } else if(MechHeat(mech) >= 17.) {
01122                 /* +3 to fire... */
01123                 returnValue = 3;
01124         } else if(MechHeat(mech) >= 13.) {
01125                 /* +2 to fire... */
01126                 returnValue = 2;
01127         } else if(MechHeat(mech) >= 8.) {
01128                 /* +1 to fire... */
01129                 returnValue = 1;
01130         } else {
01131                 returnValue = 0;
01132         }
01133         return (returnValue);
01134 }

int recycle_weaponry ( MECH mech  ) 

Definition at line 1529 of file mech.update.c.

References arc_override, ArmorStringFromIndex(), CLASS_BSUIT, CLASS_MECH, CLASS_MW, CLASS_VEH_GROUND, CLASS_VTOL, Destroyed, FAIL_DESTROYED, FindWeapons, GetPartData, GetPartFireMode, MAX_WEAPS_SECTION, mech_printf(), MechLWRT, MechMove, MechSections, MECHSTARTED, MechType, MechWeapons, muxevent_tick, name, NUM_SECTIONS, PartTempNuke, ROCKET_FIRED, SectIsDestroyed, SetPartTempNuke, Started, and WpnIsRecycling.

Referenced by PrintEnemyWeaponStatus().

01530 {
01531 
01532         int loop;
01533         int count, i;
01534         int crit[MAX_WEAPS_SECTION];
01535         unsigned char weaptype[MAX_WEAPS_SECTION];
01536         unsigned char weapdata[MAX_WEAPS_SECTION];
01537         char location[20];
01538 
01539         int diff = (muxevent_tick - MechLWRT(mech));
01540         int lowest = 0;
01541 
01542         if(diff < 1) {
01543                 if(diff < 0)
01544                         MechLWRT(mech) = muxevent_tick;
01545                 return 1;
01546         }
01547         MechLWRT(mech) = muxevent_tick;
01548 
01549         if(!Started(mech) || Destroyed(mech))
01550                 return 0;
01551 
01552         arc_override = 1;
01553         for(loop = 0; loop < NUM_SECTIONS; loop++) {
01554                 count = FindWeapons(mech, loop, weaptype, weapdata, crit);
01555                 for(i = 0; i < count; i++) {
01556                         if(WpnIsRecycling(mech, loop, crit[i])) {
01557                                 /* Immediate recycle if its destroyed */
01558                                 if(PartTempNuke(mech, loop, crit[i]) == FAIL_DESTROYED)
01559                                         GetPartData(mech, loop, crit[i]) = 0;
01560                                 if(diff >= GetPartData(mech, loop, crit[i])) {
01561                                         GetPartData(mech, loop, crit[i]) = 0;
01562                                         mech_printf(mech, MECHSTARTED,
01563                                                                 MechType(mech) ==
01564                                                                 CLASS_MW ?
01565                                                                 "%%cgYou are ready to attack again with %s.%%c"
01566                                                                 : PartTempNuke(mech, loop,
01567                                                                                            crit[i]) !=
01568                                                                 0 ? "%%cg%s is operational again.%%c" :
01569                                                                 (GetPartFireMode(mech, loop,
01570                                                                                                  crit[i]) & ROCKET_FIRED) ? ""
01571                                                                 : "%%cg%s finished recycling.%%c",
01572                                                                 &MechWeapons[weaptype[i]].name[3]);
01573                                         SetPartTempNuke(mech, loop, crit[i], 0);
01574                                 } else {
01575                                         if(PartTempNuke(mech, loop, crit[i]) != FAIL_DESTROYED) {
01576                                                 GetPartData(mech, loop, crit[i]) -= diff;
01577                                                 if(GetPartData(mech, loop, crit[i]) < lowest ||
01578                                                    !lowest)
01579                                                         lowest = GetPartData(mech, loop, crit[i]);
01580                                         }
01581                                 }
01582                         }
01583                 }
01584 
01585                 /* Cycle a section */
01586                 if(MechSections(mech)[loop].recycle && ((MechType(mech) == CLASS_MECH)
01587                                                                                                 || (MechType(mech) ==
01588                                                                                                         CLASS_BSUIT)
01589                                                                                                 || (MechType(mech) ==
01590                                                                                                         CLASS_VEH_GROUND)
01591                                                                                                 || (MechType(mech) ==
01592                                                                                                         CLASS_VTOL))) {
01593 
01594                         /* Is the section finished cycling or do we deincrement it */
01595                         if(diff >= MechSections(mech)[loop].recycle &&
01596                            !SectIsDestroyed(mech, loop)) {
01597 
01598                                 MechSections(mech)[loop].recycle = 0;
01599                                 ArmorStringFromIndex(loop, location, MechType(mech),
01600                                                                          MechMove(mech));
01601 
01602                                 mech_printf(mech, MECHSTARTED,
01603                                                         "%%cg%s%s has finished its previous action.%%c",
01604                                                         MechType(mech) == CLASS_BSUIT ? "" : "Your ",
01605                                                         location);
01606 
01607                         } else {
01608 
01609                                 MechSections(mech)[loop].recycle -= diff;
01610                                 if(MechSections(mech)[loop].recycle < lowest || !lowest)
01611                                         lowest = MechSections(mech)[loop].recycle;
01612 
01613                         }
01614 
01615                 }
01616 
01617         }
01618         arc_override = 0;
01619         return lowest;
01620 }

int SkidMod ( float  Speed  ) 

Definition at line 1622 of file mech.update.c.

Referenced by NewHexEntered().

01623 {
01624         if(Speed < 2.1)
01625                 return -1;
01626         if(Speed < 4.1)
01627                 return 0;
01628         if(Speed < 7.1)
01629                 return 1;
01630         if(Speed < 10.1)
01631                 return 2;
01632         return 4;
01633 }

float terrain_speed ( MECH mech,
float  tempspeed,
float  maxspeed,
int  terrain,
int  elev 
)

Definition at line 936 of file mech.update.c.

References BRIDGE, CLASS_BSUIT, DECREASE, HEAVY_FOREST, ICE, INCREASE_OLD, LIGHT_FOREST, MechIsBiped, MechIsQuad, MechMove, MechStatus2, MechType, MechZ, MOUNTAINS, MOVE_TRACK, MOVE_WHEEL, MP1, MP2, MP3, ROAD, ROUGH, SNOW, SPRINTING, and WATER.

00938 {
00939         switch (terrain) {
00940         case SNOW:
00941         case ROUGH:
00942                 DECREASE(MP1);
00943                 break;
00944         case MOUNTAINS:
00945                 DECREASE(MP2);
00946                 break;
00947         case LIGHT_FOREST:
00948                 if(MechType(mech) != CLASS_BSUIT)
00949                         DECREASE(MP1);
00950                 break;
00951         case HEAVY_FOREST:
00952                 if(MechType(mech) != CLASS_BSUIT)
00953                         DECREASE(MP2);
00954                 break;
00955         case BRIDGE:
00956         case ROAD:
00957                 /* Ground units (wheeled and tracked) get +1 MP moving on paved surface */
00958 #ifndef BT_MOVEMENT_MODES
00959                 if(MechMove(mech) == MOVE_TRACK || MechMove(mech) == MOVE_WHEEL)
00960 #else
00961                 if(!(MechStatus2(mech) & SPRINTING) &&
00962                    (MechMove(mech) == MOVE_TRACK || MechMove(mech) == MOVE_WHEEL))
00963 #endif
00964                         INCREASE_OLD(MP1);
00965         case ICE:
00966                 if(MechZ(mech) >= 0)
00967                         break;
00968                 /* FALLTHRU */
00969                 /* if he's under the ice/bridge, treat as water. */
00970         case WATER:
00971                 if(MechIsBiped(mech) || MechIsQuad(mech)) {
00972                         if(elev <= -2)
00973                                 DECREASE(MP3);
00974                         else if(elev == -1)
00975                                 DECREASE(MP1);
00976                 }
00977                 break;
00978         }
00979         return tempspeed;
00980 }

void updateAutoturnTurret ( MECH mech  ) 

Definition at line 2899 of file mech.update.c.

References AcceptableDegree(), Blinded, FindBearing(), getMech(), GetSectInt, MapCoordToRealCoord(), MarkForLOSUpdate(), MechFacing, MechFX, MechFY, MechTankCritStatus, MechTarget, MechTargX, MechTargY, MechTurretFacing, Started, TURRET, TURRET_JAMMED, TURRET_LOCKED, and Uncon.

Referenced by mech_update().

02900 {
02901         MECH *target;
02902         int bearing;
02903         float fx, fy;
02904 
02905         if(!Started(mech) || Uncon(mech) || Blinded(mech))
02906                 return;
02907 
02908         if((MechTankCritStatus(mech) & TURRET_JAMMED) ||
02909            (MechTankCritStatus(mech) & TURRET_LOCKED))
02910                 return;
02911 
02912         if(!GetSectInt(mech, TURRET))
02913                 return;
02914 
02915         if(MechTarget(mech) == -1 && (MechTargY(mech) == -1 ||
02916                                                                   MechTargX(mech) == -1))
02917                 return;
02918 
02919         if(MechTarget(mech) != -1) {
02920                 target = getMech(MechTarget(mech));
02921                 fx = MechFX(target);
02922                 fy = MechFY(target);
02923         } else {
02924                 MapCoordToRealCoord(MechTargX(mech), MechTargY(mech), &fx, &fy);
02925         }
02926 
02927         bearing =
02928                 AcceptableDegree(FindBearing(MechFX(mech), MechFY(mech), fx,
02929                                                                          fy) - MechFacing(mech));
02930         MechTurretFacing(mech) = bearing;
02931         MarkForLOSUpdate(mech);
02932 }

void UpdateHeading ( MECH mech  ) 

Definition at line 825 of file mech.update.c.

References ACCEL_MOD, AddFacing, AddRFacing, confdata::btech_fasaturn, CHEAD, CLASS_BSUIT, CLASS_MW, EVADING, FASA_TURN_MOD, FindObjectsData(), GetTurnMode, HasBoolAdvantage(), is_aero, IsDS, IsRunning, Jumping, JumpSpeedMP, MECH::mapindex, MarkForLOSUpdate(), MechCritStatus, MechDesiredFacing, MechFacing, MechHeat, MechIsQuad, MechPilot, MechRFacing, MechSpecials, MechSpeed, MechStatus2, MechType, MMaxSpeed, MOVE_MOD, MP1, MP_PER_KPH, mudconf, SetRFacing, SHO2FSIM, SPRINTING, and TRIPLE_MYOMER_TECH.

Referenced by aero_move_event(), aero_UpdateHeading(), and mech_move_event().

00826 {
00827         int offset;
00828         int normangle;
00829         int mw_mod = 1;
00830         float maxspeed, omaxspeed;
00831         MAP *mech_map;
00832 
00833         if(MechFacing(mech) == MechDesiredFacing(mech))
00834                 return;
00835         maxspeed = MMaxSpeed(mech);
00836         if(is_aero(mech))
00837                 maxspeed = maxspeed * ACCEL_MOD;
00838         if((MechHeat(mech) >= 9.) && (MechSpecials(mech) & TRIPLE_MYOMER_TECH))
00839                 maxspeed += 1.5 * MP1;
00840         omaxspeed = maxspeed;
00841         normangle = MechRFacing(mech) - SHO2FSIM(MechDesiredFacing(mech));
00842         if(MechType(mech) == CLASS_MW || MechType(mech) == CLASS_BSUIT)
00843                 mw_mod = 60;
00844         else if(MechIsQuad(mech))
00845                 mw_mod = 2;
00846         if(mudconf.btech_fasaturn) {
00847 #define FASA_TURN_MOD 3/2
00848                 if(Jumping(mech))
00849                         offset = 2 * SHO2FSIM(1) * 2 * 360 * FASA_TURN_MOD / 60;
00850                 else {
00851                         float ts = MechSpeed(mech);
00852 
00853                         if(ts < 0) {
00854                                 maxspeed = maxspeed * 2.0 / 3.0;
00855                                 ts = -ts;
00856                         }
00857                         if(ts > maxspeed || maxspeed < 0.1)     /* kludge */
00858                                 offset = 0;
00859                         else {
00860                                 offset = SHO2FSIM(1) * 2 * 360 * FASA_TURN_MOD / 60 * (maxspeed - ts) * (omaxspeed / maxspeed) * mw_mod * MP_PER_KPH / 6;       /* hmm. */
00861                         }
00862                 }
00863         } else {
00864                 if(Jumping(mech)) {
00865                         mech_map = FindObjectsData(mech->mapindex);
00866                         offset = SHO2FSIM(1) * 6 * JumpSpeedMP(mech, mech_map) * mw_mod;
00867                 } else if(fabs(MechSpeed(mech)) < 1.0)
00868                         offset = SHO2FSIM(1) * 3 * maxspeed * MP_PER_KPH * mw_mod;
00869                 else {
00870                         offset = SHO2FSIM(1) * 2 * maxspeed * MP_PER_KPH * mw_mod;
00871                         if((SHO2FSIM(abs(normangle)) > offset) &&
00872                            IsRunning(MechSpeed(mech), maxspeed)) {
00873                                 if(MechSpeed(mech) > maxspeed)
00874                                         offset -= offset / 2 * maxspeed / MechSpeed(mech);
00875                                 else
00876                                         offset -=
00877                                                 offset / 2 * (3.0 * MechSpeed(mech) / maxspeed - 2.0);
00878                         }
00879                 }
00880         }
00881         /*   offset = offset * 2 * MOVE_MOD; - Twice as fast as this;dunno why - */
00882         offset = offset * MOVE_MOD;
00883 #ifdef BT_MOVEMENT_MODES
00884         if(GetTurnMode(mech)
00885            && HasBoolAdvantage(MechPilot(mech), "maneuvering_ace"))
00886                 offset = (offset * 3) / 2;
00887         if(MechStatus2(mech) & (SPRINTING | EVADING)
00888            && !HasBoolAdvantage(MechPilot(mech), "maneuvering_ace")) {
00889                 if(HasBoolAdvantage(MechPilot(mech), "speed_demon"))
00890                         offset = (offset * 2) / 3;
00891                 else
00892                         offset = (offset / 2);
00893         }
00894 #endif
00895         if(normangle < 0)
00896                 normangle += SHO2FSIM(360);
00897         if(IsDS(mech) && offset >= SHO2FSIM(10))
00898                 offset = SHO2FSIM(10);
00899         if(normangle > SHO2FSIM(180)) {
00900                 AddRFacing(mech, offset);
00901                 if(MechFacing(mech) >= 360)
00902                         AddFacing(mech, -360);
00903                 normangle += offset;
00904                 if(normangle >= SHO2FSIM(360))
00905                         SetRFacing(mech, SHO2FSIM(MechDesiredFacing(mech)));
00906         } else {
00907                 AddRFacing(mech, -offset);
00908                 if(MechRFacing(mech) < 0)
00909                         AddFacing(mech, 360);
00910                 normangle -= offset;
00911                 if(normangle < 0)
00912                         SetRFacing(mech, SHO2FSIM(MechDesiredFacing(mech)));
00913         }
00914         MechCritStatus(mech) |= CHEAD;
00915         MarkForLOSUpdate(mech);
00916 }

void UpdateHeat ( MECH mech  ) 

Definition at line 1361 of file mech.update.c.

References CLASS_MECH, DisableSomeHS(), EnableSomeHS(), Evading, Fallen, FindLegHeatSinks(), FindObjectsData(), FIRE, HandleOverheat(), headhitmwdamage(), Heatcutoff, InSpecial, InWater, IsRunning, Jellied, Jumping, LIFE_SUPPORT_DESTROYED, MapTemperature, MapUnderSpecialRules, mech_notify(), MechActiveNumsinks, MECHALL, MechCritStatus, MechDesiredSpeed, MechDisabledHS, MechEngineHeat, MechHasHeat, MechHeat, MechJumpSpeed, MechMinusHeat, MECHPILOT, MechPlusHeat, MechSpecials, MechSpeed, MechTerrain, MechType, MechWeapHeat, MechZ, MIN, MMaxSpeed, MP1, MP_PER_KPH, muxevent_tick, NullSigSysActive, Number, Sprinting, Started, StealthArmorActive, TRIPLE_MYOMER_TECH, TURN, and WEAPON_RECYCLE_TIME.

Referenced by aero_update(), and mech_update().

01362 {
01363 
01364         int legsinks;
01365         float maxspeed;
01366         float intheat;
01367         float inheat;
01368         MAP *map;
01369 
01370         // These guys don't get heat updates.
01371         if(!MechHasHeat(mech)) 
01372                 return;
01373 
01374         inheat = MechHeat(mech);
01375         maxspeed = MMaxSpeed(mech);
01376         MechPlusHeat(mech) = 0.;
01377 
01378         if(MechTerrain(mech) == FIRE && MechType(mech) == CLASS_MECH)
01379                 MechPlusHeat(mech) += 5.;
01380 
01381         /* We do a trick here.  We look at the previous heat level to determine
01382          * if TSM is/was on.  If it is/was, we recalc what running and walk speeds are
01383          * to better set how much heat the unit is putting out */
01384         if(MechSpecials(mech) & TRIPLE_MYOMER_TECH) {
01385                 if(inheat >= 9.)
01386                         maxspeed =
01387                                 ceil((rint((MMaxSpeed(mech) / 1.5) / MP1) + 1) * 1.5) * MP1;
01388         }
01389 
01390         if(fabs(MechSpeed(mech)) > 0.0) {
01391 #ifndef BT_MOVEMENT_MODES
01392                 if(IsRunning(MechDesiredSpeed(mech), maxspeed))
01393                         MechPlusHeat(mech) += 2.;
01394 #else
01395                 if(Sprinting(mech) || Evading(mech))
01396                         MechPlusHeat(mech) += 3.;
01397                 else if(IsRunning(MechDesiredSpeed(mech), maxspeed))
01398                         MechPlusHeat(mech) += 2.;
01399 #endif
01400                 else
01401                         MechPlusHeat(mech) += 1.;
01402         }
01403 
01404         if(Jumping(mech))
01405                 MechPlusHeat(mech) += (MechJumpSpeed(mech) * MP_PER_KPH > 3.) ?
01406                         MechJumpSpeed(mech) * MP_PER_KPH : 3.;
01407 
01408         if(Started(mech))
01409                 MechPlusHeat(mech) += (float) MechEngineHeat(mech);
01410 
01411         if(StealthArmorActive(mech))
01412                 MechPlusHeat(mech) += 10;
01413 
01414         if(NullSigSysActive(mech))
01415                 MechPlusHeat(mech) += 10;
01416 
01417         intheat = MechPlusHeat(mech);
01418 
01419         MechPlusHeat(mech) += MechWeapHeat(mech);
01420 
01421         /* ADD Water effects here */
01422         if(InWater(mech) && MechZ(mech) <= -1) {
01423                 legsinks = FindLegHeatSinks(mech);
01424                 legsinks = (legsinks > 4) ? 4 : legsinks;
01425                 if(MechZ(mech) == -1 && !Fallen(mech)) {
01426                         MechMinusHeat(mech) = MIN(2 * MechActiveNumsinks(mech),
01427                                                                           legsinks + MechActiveNumsinks(mech));
01428                 } else {
01429                         MechMinusHeat(mech) = MIN(2 * MechActiveNumsinks(mech),
01430                                                                           6 + MechActiveNumsinks(mech));
01431                 }
01432         } else {
01433                 MechMinusHeat(mech) = (float) (MechActiveNumsinks(mech));
01434         }
01435 
01436         /* Infernoed */
01437         if(Jellied(mech)) {
01438                 MechMinusHeat(mech) = MechMinusHeat(mech) - 6;
01439                 if(MechMinusHeat(mech) < 0)
01440                         MechMinusHeat(mech) = 0;
01441         }
01442 
01443         if(InSpecial(mech))
01444                 if((map = FindObjectsData(mech->mapindex)))
01445                         if(MapUnderSpecialRules(map))
01446                                 if(MapTemperature(map) < -30 || MapTemperature(map) > 50) {
01447                                         if(MapTemperature(map) < -30)
01448                                                 MechMinusHeat(mech) +=
01449                                                         (-30 - MapTemperature(map) + 9) / 10;
01450                                         else
01451                                                 MechMinusHeat(mech) -=
01452                                                         (MapTemperature(map) - 50 + 9) / 10;
01453                                 }
01454 
01455         /* Handle heat cutoff now */
01456         /* En/DisableSomeHS() take care of MechMinusHeat also. */
01457         /* Re-Written to use Exile's code - Dany 12/05 */
01458         if(Heatcutoff(mech)) {
01459                 float overheat = MechPlusHeat(mech) - MechMinusHeat(mech);
01460 
01461                 if(overheat >= 10.)
01462                         EnableSomeHS(mech, floor(overheat - 10.) + 1);
01463                 else if(overheat < 9.)
01464                         DisableSomeHS(mech, floor(9. - overheat) + 1);
01465 
01466         } else if(MechDisabledHS(mech)) {
01467                 EnableSomeHS(mech, 100);
01468         }
01469 
01470         MechHeat(mech) = MechPlusHeat(mech) - MechMinusHeat(mech);
01471 
01472         /* No lowering of heat if heat is under 9 */
01473         MechWeapHeat(mech) -=
01474                 (MechMinusHeat(mech) - intheat) / WEAPON_RECYCLE_TIME;
01475 
01476         if(MechWeapHeat(mech) < 0.0)
01477                 MechWeapHeat(mech) = 0.0;
01478 
01479         if(MechHeat(mech) < 0.0)
01480                 MechHeat(mech) = 0.0;
01481 
01482         if((muxevent_tick % TURN) == 0)
01483                 if(MechCritStatus(mech) & LIFE_SUPPORT_DESTROYED ||
01484                    (MechHeat(mech) > 30. && Number(0, 1) == 0)) {
01485                         if(MechHeat(mech) > 25.) {
01486                                 mech_notify(mech, MECHPILOT,
01487                                                         "You take personal injury from heat!");
01488                                 headhitmwdamage(mech, mech,
01489                                                                 MechCritStatus(mech) & LIFE_SUPPORT_DESTROYED
01490                                                                 ? 2 : 1);
01491                         } else if(MechHeat(mech) >= 15.) {
01492                                 mech_notify(mech, MECHPILOT,
01493                                                         "You take personal injury from heat!");
01494                                 headhitmwdamage(mech, mech, 1);
01495                         }
01496                 }
01497 
01498         if(MechHeat(mech) >= 19) {
01499                 if(inheat < 19) {
01500                         mech_notify(mech, MECHALL,
01501                                                 "%ch%cr=====================================");
01502                         mech_notify(mech, MECHALL,
01503                                                 "Your Excess Heat indicator turns RED!");
01504                         mech_notify(mech, MECHALL,
01505                                                 "=====================================%c");
01506                 }
01507         } else if(MechHeat(mech) >= 14) {
01508                 if(inheat >= 19 || inheat < 14) {
01509                         mech_notify(mech, MECHALL,
01510                                                 "%ch%cy=======================================");
01511                         mech_notify(mech, MECHALL,
01512                                                 "Your Excess Heat indicator turns YELLOW");
01513                         mech_notify(mech, MECHALL,
01514                                                 "=======================================%c");
01515                 }
01516         } else {
01517                 if(inheat >= 14) {
01518                         mech_notify(mech, MECHALL,
01519                                                 "%cg======================================");
01520                         mech_notify(mech, MECHALL,
01521                                                 "Your Excess Heat indicator turns GREEN");
01522                         mech_notify(mech, MECHALL,
01523                                                 "======================================%c");
01524                 }
01525         }
01526         HandleOverheat(mech);
01527 }

void UpdatePilotSkillRolls ( MECH mech  ) 

Definition at line 2825 of file mech.update.c.

References CheckDamage(), CheckGenericFail(), CLASS_MECH, DamageMech(), Fallen, GYRO_DAMAGED, HIP_DAMAGED, InGravity, InSpecial, IsRunning, Jumping, LARM, LLEG, MadePilotSkillRoll(), mech_notify(), MECHALL, MechCritStatus, MechFalls(), MechHeat, MechIsQuad, MechLOSBroadcast(), MechMaxSpeed, MechMove, MechSpecials, MechSpeed, MechTurnDamage, MechType, MMaxSpeed, MOVE_NONE, MoveModeChange, MP1, muxevent_tick, OODing, RARM, RLEG, SectIsDestroyed, Started, TRIPLE_MYOMER_TECH, and TURN.

Referenced by aero_update(), and mech_update().

02826 {
02827         int makeroll = 0, grav = 0;
02828         float maxspeed;
02829 
02830         if(((muxevent_tick % TURN) == 0) && !Fallen(mech) && !Jumping(mech) &&
02831            !OODing(mech))
02832                 /* do this once a turn (30 secs), only if mech is standing */
02833         {
02834                 maxspeed = MMaxSpeed(mech);
02835 
02836                 if(!Started(mech))
02837                         makeroll = 4;
02838 
02839                 if((MechHeat(mech) >= 9.) &&
02840                    (MechSpecials(mech) & TRIPLE_MYOMER_TECH))
02841                         maxspeed =
02842                                 ceil((rint((MMaxSpeed(mech) / 1.5) / MP1) + 1) * 1.5) * MP1;
02843                 /* maxspeed += 1.5 * MP1; */
02844 #ifndef BT_MOVEMENT_MODES
02845                 if(InSpecial(mech) && InGravity(mech))
02846 #else
02847                 if(InSpecial(mech) && InGravity(mech) && !MoveModeChange(mech))
02848 #endif
02849                         if(MechSpeed(mech) > MechMaxSpeed(mech) &&
02850                            MechType(mech) == CLASS_MECH) {
02851                                 grav = 1;
02852                                 makeroll = 1;
02853                         }
02854                 if(IsRunning(MechSpeed(mech), maxspeed) &&
02855                    ((MechCritStatus(mech) & GYRO_DAMAGED) ||
02856                         (MechCritStatus(mech) & HIP_DAMAGED)))
02857                         makeroll = 1;
02858 
02859                 if(makeroll) {
02860                         if(!MadePilotSkillRoll(mech, (makeroll - 1))) {
02861                                 if(grav) {
02862                                         int dam =
02863                                                 (MechSpeed(mech) - MechMaxSpeed(mech)) / MP1 + 1;
02864                                         mech_notify(mech, MECHALL, "Your legs take some damage!");
02865                                         if(MechIsQuad(mech)) {
02866                                                 if(!SectIsDestroyed(mech, LARM))
02867                                                         DamageMech(mech, mech, 0, -1, LARM, 0, 0, 0,
02868                                                                            dam, 0, 0, -1, 0, 1);
02869                                                 if(!SectIsDestroyed(mech, RARM))
02870                                                         DamageMech(mech, mech, 0, -1, RARM, 0, 0, 0,
02871                                                                            dam, 0, 0, -1, 0, 1);
02872 
02873                                         }
02874                                         if(!SectIsDestroyed(mech, LLEG))
02875                                                 DamageMech(mech, mech, 0, -1, LLEG, 0, 0, 0,
02876                                                                    dam, 0, 0, -1, 0, 1);
02877                                         if(!SectIsDestroyed(mech, RLEG))
02878                                                 DamageMech(mech, mech, 0, -1, RLEG, 0, 0, 0,
02879                                                                    dam, 0, 0, -1, 0, 1);
02880                                 } else {
02881                                         mech_notify(mech, MECHALL,
02882                                                                 "Your damaged mech falls as you try to run!");
02883                                         MechLOSBroadcast(mech, "falls down.");
02884                                         MechFalls(mech, 1, 0);
02885                                 }
02886                         }
02887                 }
02888         }
02889         if(MechType(mech) == CLASS_MECH)
02890                 CheckDamage(mech);
02891         else
02892                 MechTurnDamage(mech) = 0;
02893         if((muxevent_tick % TURN) == 0) {
02894                 if(Started(mech) && MechMove(mech) != MOVE_NONE)
02895                         CheckGenericFail(mech, -1, NULL, NULL);
02896         }
02897 }

void UpdateSpeed ( MECH mech  ) 

Definition at line 982 of file mech.update.c.

References confdata::btech_slowdown, CHEAD, CLASS_MW, DECREASE_HEAT, DECREASE_OLD, Evading, Fallen, getMech(), HasBoolAdvantage(), Jumping, Landed, MASC_ENABLED, MechCarrying, MechCritStatus, MechDesiredFacing, MechDesiredSpeed, MechElevation, MechFacing, MechHeat, MechIsQuad, MechLateral, MechMaxSpeed, MechMove, MechPilot, MechRTerrain, MechSpecials, MechSpeed, MechStatus, MechType, MMaxSpeed, MOVE_FLY, MOVE_VTOL, MP1, MP2, MP3, MP4, MP5, mudconf, SCHARGE_ENABLED, Sprinting, terrain_speed(), and TRIPLE_MYOMER_TECH.

Referenced by aero_move_event(), and mech_move_event().

00983 {
00984         float acc, tempspeed, maxspeed;
00985         MECH *target;
00986 
00987         if(!(!Fallen(mech) && !Jumping(mech) && (MechMaxSpeed(mech) > 0.0)))
00988                 return;
00989         tempspeed = fabs(MechDesiredSpeed(mech));
00990         maxspeed = MMaxSpeed(mech);
00991         if(maxspeed < 0.0)
00992                 maxspeed = 0.0;
00993 
00994         if((MechStatus(mech) & MASC_ENABLED) &&
00995            (MechStatus(mech) & SCHARGE_ENABLED))
00996                 maxspeed = ceil((rint(maxspeed / 1.5) / MP1) * 2.5) * MP1;
00997         else if(MechStatus(mech) & MASC_ENABLED)
00998                 maxspeed = (4. / 3.) * maxspeed;
00999         else if(MechStatus(mech) & SCHARGE_ENABLED)
01000                 maxspeed = (4. / 3.) * maxspeed;
01001 
01002         if(MechSpecials(mech) & TRIPLE_MYOMER_TECH) {
01003                 if(MechHeat(mech) >= 9.)
01004                         maxspeed =
01005                                 ceil((rint((MMaxSpeed(mech) / 1.5) / MP1) + 1) * 1.5) * MP1;
01006                 /* maxspeed *= ((maxspeed + 1.5 * MP1) / maxspeed); */
01007                 if(MechDesiredSpeed(mech) >= maxspeed)
01008                         MechDesiredSpeed(mech) = maxspeed;
01009         }
01010 
01011         if(MechHeat(mech) >= 5.) {
01012 
01013 /*  if ((MechHeat(mech) >= 9.) && (MechSpecials(mech) & TRIPLE_MYOMER_TECH)) {
01014       tempspeed *= ((maxspeed + 1.5 * MP1) / maxspeed);
01015   }
01016 */
01017                 if(MechHeat(mech) >= 25.)
01018                         DECREASE_HEAT(MP5);
01019                 else if(MechHeat(mech) >= 20.)
01020                         DECREASE_HEAT(MP4);
01021                 else if(MechHeat(mech) >= 15.)
01022                         DECREASE_HEAT(MP3);
01023                 else if(MechHeat(mech) >= 10.)
01024                         DECREASE_HEAT(MP2);
01025                 else if(!((MechSpecials(mech) & TRIPLE_MYOMER_TECH) &&
01026                                   MechHeat(mech) >= 9))
01027                         DECREASE_HEAT(MP1);
01028         }
01029         if(MechType(mech) != CLASS_MW && MechMove(mech) != MOVE_VTOL &&
01030            (MechMove(mech) != MOVE_FLY || Landed(mech)))
01031                 tempspeed =
01032                         terrain_speed(mech, tempspeed, maxspeed, MechRTerrain(mech),
01033                                                   MechElevation(mech));
01034         if(MechCritStatus(mech) & CHEAD) {
01035                 if(mudconf.btech_slowdown == 2) {
01036                         /* _New_ slowdown based on facing vs desired difference */
01037                         int dif = MechFacing(mech) - MechDesiredFacing(mech);
01038 
01039                         if(dif < 0)
01040                                 dif = -dif;
01041                         if(dif > 180)
01042                                 dif = 360 - dif;
01043                         if(dif) {
01044                                 dif = (dif - 1) / 30;
01045                                 dif = (dif + 2);        /* whee */
01046                                 /* dif = 2 to 7 */
01047                                 tempspeed = tempspeed * (10 - dif) / 10;
01048                         }
01049                 } else if(mudconf.btech_slowdown == 1) {
01050                         if(MechFacing(mech) != MechDesiredFacing(mech))
01051                                 tempspeed = tempspeed * 2.0 / 3.0;
01052                         else
01053                                 tempspeed = tempspeed * 3.0 / 4.0;
01054                 }
01055 #ifdef BT_MOVEMENT_MODES
01056                 if((Sprinting(mech) || Evading(mech))
01057                    && !(HasBoolAdvantage(MechPilot(mech), "speed_demon")
01058                                 || HasBoolAdvantage(MechPilot(mech), "maneuvering_ace")))
01059                         tempspeed = (tempspeed * 2) / 3;
01060 #endif
01061                 MechCritStatus(mech) &= ~CHEAD;
01062         }
01063         if(MechIsQuad(mech) && MechLateral(mech))
01064                 DECREASE_OLD(MP1);              /* In truth 1 MP */
01065 #ifdef BT_MOVEMENT_MODES
01066         else if(MechLateral(mech)) {
01067                 if(HasBoolAdvantage(MechPilot(mech), "maneuvering_ace"))
01068                         DECREASE_OLD(MP2);
01069                 else
01070                         DECREASE_OLD(MP3);
01071         }
01072 #endif
01073         if(tempspeed <= 0.0)
01074                 tempspeed = 0.0;
01075         if(MechDesiredSpeed(mech) < 0.)
01076                 tempspeed = -tempspeed;
01077 
01078 /*    if (MechSpecials(mech) & TRIPLE_MYOMER_TECH)
01079         {
01080         if (MechHeat(mech) >= 9.)
01081             maxspeed *= ((maxspeed + 1.5 * MP1) / maxspeed);
01082   if (MechDesiredSpeed(mech) >= maxspeed)
01083     MechDesiredSpeed(mech) = maxspeed;
01084         }
01085 */
01086 
01087         if(tempspeed != MechSpeed(mech)) {
01088                 if(MechIsQuad(mech))
01089                         acc = maxspeed / 10.;
01090                 else
01091                         acc = maxspeed / 20.;
01092                 if(HasBoolAdvantage(MechPilot(mech), "speed_demon"))
01093                         acc *= 1.25;
01094 
01095                 if(tempspeed < MechSpeed(mech)) {
01096                         /* Decelerating */
01097                         MechSpeed(mech) -= acc;
01098                         if(tempspeed > MechSpeed(mech))
01099                                 MechSpeed(mech) = tempspeed;
01100                 } else {
01101                         /* Accelerating */
01102                         MechSpeed(mech) += acc;
01103                         if(tempspeed < MechSpeed(mech))
01104                                 MechSpeed(mech) = tempspeed;
01105                 }
01106         }
01107         if(MechCarrying(mech) > 0) {
01108                 target = getMech(MechCarrying(mech));
01109                 if(target)
01110                         MechSpeed(target) = MechSpeed(mech);
01111         }
01112 }


Variable Documentation

int arc_override

Definition at line 21 of file ds.turret.c.


Generated on Mon May 28 04:25:38 2007 for BattletechMUX by  doxygen 1.4.7