void mech_fall_event(EVENT * e) { MECH *mech = (MECH *) e->data; int fallspeed = (int) e->data2; int fallen_elev; if (Started(mech) && fallspeed >= 0) return; if (fallspeed <= 0 && (!Started(mech) || !(FlyingT(mech)) || ((AeroFuel(mech) <= 0) && !AeroFreeFuel(mech)) || ((MechType(mech) == CLASS_VTOL) && (SectIsDestroyed(mech, ROTOR))))) fallspeed -= FALL_ACCEL; else fallspeed += FALL_ACCEL; MarkForLOSUpdate(mech); if (MechsElevation(mech) > abs(fallspeed)) { MechZ(mech) -= abs(fallspeed); MechFZ(mech) = MechZ(mech) * ZSCALE; MECHEVENT(mech, EVENT_FALL, mech_fall_event, FALL_TICK, fallspeed); return; } /* Time to hit da ground */ fallen_elev = factoral(abs(fallspeed)); mech_notify(mech, MECHALL, "You hit the ground!"); MechLOSBroadcast(mech, "hits the ground!"); MechFalls(mech, fallen_elev, 0); MechStatus(mech) &= ~JUMPING; }
float findC3RangeWithNetwork(MECH * mech, MECH * mechTarget, float realRange, dbref * myNetwork, int networkSize, dbref * c3Ref) { float c3Range = 0.0; float bestRange = 0.0; int i; int inLOS = 0; int mapX, mapY; float hexX, hexY, hexZ; MECH *otherMech; MAP *map; bestRange = realRange; *c3Ref = 0; if(networkSize == 0) return realRange; for(i = 0; i < networkSize; i++) { otherMech = getMechInTempNetwork(i, myNetwork, networkSize); if(!otherMech) continue; if(!Good_obj(otherMech->mynum)) continue; if(mechTarget) { if(otherMech == mechTarget) continue; debugC3(tprintf ("C3RANGE-NETWORK (mech): Finding range from %d to %d.", mech->mynum, mechTarget->mynum)); c3Range = FaMechRange(otherMech, mechTarget); inLOS = InLineOfSight(otherMech, mechTarget, MechX(mechTarget), MechY(mechTarget), c3Range); } else if((MechTargX(mech) > 0) && (MechTargY(mech) > 0)) { mapX = MechTargX(mech); mapY = MechTargY(mech); map = getMap(mech->mapindex); debugC3(tprintf ("C3RANGE-NETWORK (hex): Finding range from %d to %d %d.", mech->mynum, mapX, mapY)); MechTargZ(mech) = Elevation(map, mapX, mapY); hexZ = ZSCALE * MechTargZ(mech); MapCoordToRealCoord(mapX, mapY, &hexX, &hexY); c3Range = FindRange(MechFX(otherMech), MechFY(otherMech), MechFZ(otherMech), hexX, hexY, hexZ); inLOS = LOS_NB(otherMech, NULL, mapX, mapY, c3Range); } else { continue; } if(inLOS && (c3Range < bestRange)) { bestRange = c3Range; *c3Ref = otherMech->mynum; } } return bestRange; }