00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "config.h"
00013
00014
00015 #include <math.h>
00016 #include "mech.h"
00017 #include "mech.events.h"
00018 #include "p.btechstats.h"
00019 #include "p.mechrep.h"
00020 #include "p.mech.restrict.h"
00021 #include "p.mech.update.h"
00022 #include "p.bsuit.h"
00023 #include "autopilot.h"
00024 #include "p.mech.combat.h"
00025 #include "p.mech.combat.misc.h"
00026 #include "p.mech.utils.h"
00027 #include "p.btechstats.h"
00028 #include "p.econ_cmds.h"
00029 #include "p.mech.los.h"
00030 #include "p.mech.ood.h"
00031 #include "p.mech.pickup.h"
00032 #include "p.bsuit.h"
00033 #include "p.mech.tag.h"
00034 #include "p.crit.h"
00035 #include "p.mech.tech.h"
00036 #include "p.mech.tech.commands.h"
00037
00038 int tele_contents(dbref from, dbref to, int flag)
00039 {
00040 dbref i, tmpnext;
00041 int count = 0;
00042
00043 SAFE_DOLIST(i, tmpnext, Contents(from))
00044 if((flag & TELE_ALL) || !Wiz(i)) {
00045 if((flag & TELE_SLAVE) && !Wiz(i)) {
00046 s_Slave(i);
00047 silly_atr_set(i, A_LOCK, "");
00048 }
00049 if(flag & TELE_XP && !Wiz(i))
00050 lower_xp(i, mudconf.btech_xploss);
00051 if(flag & TELE_LOUD)
00052 loud_teleport(i, to);
00053 else
00054 hush_teleport(i, to);
00055 count++;
00056 }
00057 return count;
00058 }
00059
00060
00061 static void mech_discard_event(MUXEVENT * e)
00062 {
00063 MECH *mech = (MECH *) e->data;
00064 dbref i = mech->mynum;
00065
00066 c_Hardcode(i);
00067 handle_xcode(GOD, i, 1, 0);
00068 s_Going(i);
00069 s_Dark(i);
00070 s_Zombie(i);
00071 hush_teleport(i, USED_MW_STORE);
00072 }
00073
00074 void discard_mw(MECH * mech)
00075 {
00076 if(In_Character(mech->mynum))
00077 MECHEVENT(mech, EVENT_NUKEMECH, mech_discard_event, 10, 0);
00078 }
00079
00080 void enter_mw_bay(MECH * mech, dbref bay)
00081 {
00082 tele_contents(mech->mynum, bay, TELE_ALL);
00083 discard_mw(mech);
00084 }
00085
00086 void pickup_mw(MECH * mech, MECH * target)
00087 {
00088 dbref mw;
00089
00090 mw = Contents(target->mynum);
00091 DOCHECKMA((MechType(mech) != CLASS_MECH) &&
00092 (MechType(mech) != CLASS_VEH_GROUND) &&
00093 (MechType(mech) != CLASS_VTOL) &&
00094 !(MechSpecials(mech) & SALVAGE_TECH),
00095 "You can't pick up, period.") if(mw > 0)
00096 notify_printf(mw,
00097 "%s scoops you up and brings you into the cockpit.",
00098 GetMechToMechID(target, mech));
00099
00100 MechLOSBroadcast(mech, tprintf("picks up %s.", GetMechID(target)));
00101 mech_printf(mech, MECHALL,
00102 "You pick up the stray mechwarrior from the field.");
00103 if(MechTeam(target) != MechTeam(mech))
00104 tele_contents(target->mynum, mech->mynum, TELE_ALL | TELE_SLAVE);
00105 else
00106 tele_contents(target->mynum, mech->mynum, TELE_ALL);
00107 discard_mw(target);
00108 }
00109
00110 static void char_eject(dbref player, MECH * mech)
00111 {
00112 MECH *m;
00113 dbref suit;
00114 char *d;
00115
00116 suit = create_object(tprintf("MechWarrior - %s", Name(player)));
00117 silly_atr_set(suit, A_XTYPE, "MECH");
00118 s_Hardcode(suit);
00119 handle_xcode(GOD, suit, 0, 1);
00120 d = silly_atr_get(player, A_MWTEMPLATE);
00121 if(!(m = getMech(suit))) {
00122 SendError(tprintf
00123 ("Unable to create special obj for #%d's ejection.",
00124 player));
00125 destroy_object(suit);
00126 notify(player,
00127 "Sorry, something serious went wrong, contact a Wizard (can't create RS object)");
00128 return;
00129 }
00130 if(!mech_loadnew(GOD, m, (!d || !*d ||
00131 !strcmp(d, "#-1")) ? "MechWarrior" : d)) {
00132 SendError(tprintf
00133 ("Unable to load mechwarrior template for #%d's ejection. (%s)",
00134 player, (!d || !*d) ? "Default template" : d));
00135 destroy_object(suit);
00136 notify(player,
00137 "Sorry, something serious went wrong, contact a Wizard (can't load MWTemplate)");
00138 return;
00139 }
00140 silly_atr_set(suit, A_MECHNAME, "MechWarrior");
00141 MechTeam(m) = MechTeam(mech);
00142 mech_Rsetmapindex(GOD, (void *) m, tprintf("%d", mech->mapindex));
00143 mech_Rsetxy(GOD, (void *) m, tprintf("%d %d", MechX(mech), MechY(mech)));
00144 mech_Rsetteam(GOD, (void *) m, tprintf("%d", MechTeam(mech)));
00145 hush_teleport(suit, mech->mapindex);
00146 hush_teleport(player, suit);
00147 MechLOSBroadcast(m, tprintf("ejected from %s!", GetMechID(mech)));
00148 s_In_Character(suit);
00149 initialize_pc(player, m);
00150 MechPilot(m) = player;
00151 MechTeam(m) = MechTeam(mech);
00152 #ifdef COPY_CHANS_ON_EJECT
00153 memcpy(m->freq, mech->freq, FREQS * sizeof(m->freq[0]));
00154 memcpy(m->freqmodes, mech->freqmodes, FREQS * sizeof(m->freqmodes[0]));
00155 #else
00156 #ifdef RANDOM_CHAN_ON_EJECT
00157 m->freq[0] = random() % 1000000;
00158 notify_printf(player, "Emergency radio channel set to %d.", m->freq[0]);
00159 #endif
00160 #endif
00161 notify(player, "You eject from the unit!");
00162 if(MechType(mech) == CLASS_MECH) {
00163 DestroyPart(mech, HEAD, 2);
00164 }
00165 if(!Destroyed(mech)) {
00166 DestroyMech(mech, mech, 0);
00167 }
00168 }
00169
00170 void mech_eject(dbref player, void *data, char *buffer)
00171 {
00172 MECH *mech = (MECH *) data;
00173
00174 cch(MECH_USUALS);
00175 DOCHECK(IsDS(mech), "Dropships do not support ejection.");
00176 DOCHECK(!((MechType(mech) == CLASS_MECH) ||
00177 (MechType(mech) == CLASS_VTOL) ||
00178 (MechType(mech) == CLASS_VEH_GROUND)),
00179 "This unit has no ejection seat!");
00180 DOCHECK(FlyingT(mech) &&
00181 !Landed(mech),
00182 "Regrettably, right now you can only eject when landed, sorry - no parachute :P");
00183 DOCHECK(!In_Character(mech->mynum), "This unit isn't in character!");
00184 DOCHECK(!mudconf.btech_ic, "This MUX isn't in character!");
00185 DOCHECK(!In_Character(Location(mech->mynum)),
00186 "Your location isn't in character!");
00187 DOCHECK(Started(mech) &&
00188 MechPilot(mech) != player,
00189 "You aren't in da pilot's seat - no ejection for you!");
00190 if(!Started(mech)) {
00191 DOCHECK((char_lookupplayer(GOD, GOD, 0, silly_atr_get(mech->mynum,
00192 A_PILOTNUM))) !=
00193 player,
00194 "You aren't the official pilot of this thing. Try 'disembark'");
00195 }
00196 if(MechType(mech) == CLASS_MECH)
00197 DOCHECK(PartIsNonfunctional(mech, HEAD, 2),
00198 "The parts of cockpit that control ejection are already used. Try 'disembark'");
00199
00200 char_eject(player, mech);
00201 }
00202
00203 static void char_disembark(dbref player, MECH * mech)
00204 {
00205 MECH *m;
00206 dbref suit;
00207 char *d;
00208 MAP *mymap;
00209 int initial_speed;
00210
00211 suit = create_object(tprintf("MechWarrior - %s", Name(player)));
00212 silly_atr_set(suit, A_XTYPE, "MECH");
00213 s_Hardcode(suit);
00214 handle_xcode(GOD, suit, 0, 1);
00215 d = silly_atr_get(player, A_MWTEMPLATE);
00216 if(!(m = getMech(suit))) {
00217 SendError(tprintf
00218 ("Unable to create special obj for #%d's disembarkation.",
00219 player));
00220 destroy_object(suit);
00221 notify(player,
00222 "Sorry, something serious went wrong, contact a Wizard (can't create RS object)");
00223 return;
00224 }
00225 if(!mech_loadnew(GOD, m, (!d || !*d ||
00226 !strcmp(d, "#-1")) ? "MechWarrior" : d)) {
00227 SendError(tprintf
00228 ("Unable to load mechwarrior template for #%d's disembarkation. (%s)",
00229 player, (!d || !*d) ? "Default template" : d));
00230 destroy_object(suit);
00231 notify(player,
00232 "Sorry, something serious went wrong, contact a Wizard (can't load MWTemplate)");
00233 return;
00234 }
00235 silly_atr_set(suit, A_MECHNAME, "MechWarrior");
00236 MechTeam(m) = MechTeam(mech);
00237 mech_Rsetmapindex(GOD, (void *) m, tprintf("%d", mech->mapindex));
00238 mech_Rsetxy(GOD, (void *) m, tprintf("%d %d", MechX(mech), MechY(mech)));
00239 MechZ(m) = MechZ(mech);
00240 mech_Rsetteam(GOD, (void *) m, tprintf("%d", MechTeam(mech)));
00241 hush_teleport(suit, mech->mapindex);
00242 hush_teleport(player, suit);
00243 s_In_Character(suit);
00244 initialize_pc(player, m);
00245 MechPilot(m) = player;
00246 MechTeam(m) = MechTeam(mech);
00247 #ifdef COPY_CHANS_ON_EJECT
00248 memcpy(m->freq, mech->freq, FREQS * sizeof(m->freq[0]));
00249 memcpy(m->freqmodes, mech->freqmodes, FREQS * sizeof(m->freqmodes[0]));
00250 #else
00251 #ifdef RANDOM_CHAN_ON_EJECT
00252 m->freq[0] = random() % 1000000;
00253 notify_printf(player, "Emergency radio channel set to %d.", m->freq[0]);
00254 #endif
00255 #endif
00256 mymap = getMap(m->mapindex);
00257 if((MechZ(m) > (Elevation(mymap, MechX(m), MechY(m)) + 1)) &&
00258 (MechZ(m) > 0)) {
00259 notify(player,
00260 "You open the hatch and climb out of the unit. Maybe you should have done this while the thing was closer to the ground...");
00261 MechLOSBroadcast(m, tprintf("jumps out of %s... in mid air !",
00262 GetMechID(mech)));
00263 initial_speed =
00264 ((MechSpeed(mech) + MechVerticalSpeed(mech)) / MP1) / 2 + 4;
00265 MECHEVENT(m, EVENT_FALL, mech_fall_event, FALL_TICK, -initial_speed);
00266 } else {
00267 MechLOSBroadcast(m, tprintf("climbs out of %s!", GetMechID(mech)));
00268 notify(player, "You climb out of the unit.");
00269 }
00270 }
00271
00275 void mech_disembark(dbref player, void *data, char *buffer)
00276 {
00277 MECH *mech = (MECH *) data;
00278
00279 cch(MECH_USUALS);
00280 DOCHECK(!((MechType(mech) == CLASS_MECH) ||
00281 (MechType(mech) == CLASS_VTOL) ||
00282 (MechType(mech) == CLASS_VEH_GROUND)),
00283 "The door ! The door ? The Door ?!? Where's the exit in this damned thing ?");
00284
00285
00286 DOCHECK(!In_Character(mech->mynum), "This unit isn't in character!");
00287 DOCHECK(!mudconf.btech_ic, "This MUX isn't in character!");
00288 DOCHECK(!In_Character(Location(mech->mynum)),
00289 "Your location isn't in character!");
00290 DOCHECK(Started(mech) && (MechPilot(mech) == player),
00291 "While it's running!? Don't be daft.");
00292 DOCHECK(fabs(MechSpeed(mech)) > 25.,
00293 "Are you suicidal ? That thing is moving too fast !");
00294
00295 char_disembark(player, mech);
00296 }
00297
00301 void mech_udisembark(dbref player, void *data, char *buffer)
00302 {
00303
00304 MECH *mech = (MECH *) data;
00305 MECH *target;
00306 int newmech;
00307 MAP *mymap;
00308 int under_repairs;
00309 int i;
00310
00311
00312
00313
00314 DOCHECK(In_Character(mech->mynum) && !Wiz(player) &&
00315 (char_lookupplayer(GOD, GOD, 0,
00316 silly_atr_get(mech->mynum,
00317 A_PILOTNUM)) != player),
00318 "This isn't your mech!");
00319
00320
00321 newmech = Location(mech->mynum);
00322 DOCHECK(!(Good_obj(newmech) &&
00323 Hardcode(newmech)), "You're not being carried!");
00324 DOCHECK(!(target = getMech(newmech)), "Not being carried!");
00325 DOCHECK(target->mapindex == -1, "You are not on a map.");
00326
00327
00328 under_repairs = figure_latest_tech_event(mech);
00329 DOCHECK(under_repairs,
00330 "This 'Mech is still under repairs (see checkstatus for more info)");
00331
00332 DOCHECK(abs(MechSpeed(target)) > WalkingSpeed(MMaxSpeed(target)),
00333 "You cannot leave while the carrier is moving faster than walk speed!");
00334
00335
00336 mech_Rsetmapindex(GOD, (void *) mech, tprintf("%d",
00337 (int) target->mapindex));
00338 mech_Rsetxy(GOD, (void *) mech, tprintf("%d %d", MechX(target),
00339 MechY(target)));
00340 MechZ(mech) = MechZ(target);
00341 MechFZ(mech) = ZSCALE * MechZ(mech);
00342 mymap = getMap(mech->mapindex);
00343 DOCHECK(!mymap,
00344 "Major map error possible. Prolly should contact a wizard.");
00345
00346
00347 loud_teleport(mech->mynum, mech->mapindex);
00348
00349
00350 if(!Destroyed(mech) && Location(player) == mech->mynum) {
00351 MechPilot(mech) = player;
00352 Startup(mech);
00353 }
00354
00355 MarkForLOSUpdate(mech);
00356 SetCargoWeight(mech);
00357 UnSetMechPKiller(mech);
00358 MechLOSBroadcast(mech, "powers up!");
00359 EvalBit(MechSpecials(mech), SS_ABILITY, ((MechPilot(mech) > 0 &&
00360 isPlayer(MechPilot(mech))) ?
00361 char_getvalue(MechPilot(mech),
00362 "Sixth_Sense") :
00363 0));
00364 MechComm(mech) = DEFAULT_COMM;
00365
00366 if(isPlayer(MechPilot(mech)) && !Quiet(mech->mynum)) {
00367 MechComm(mech) =
00368 char_getskilltarget(MechPilot(mech), "Comm-Conventional", 0);
00369 MechPer(mech) = char_getskilltarget(MechPilot(mech), "Perception", 0);
00370 } else {
00371 MechComm(mech) = 6;
00372 MechPer(mech) = 6;
00373 }
00374 MechCommLast(mech) = 0;
00375 UnZombifyMech(mech);
00376 CargoSpace(target) += (MechTons(mech) * 100);
00377 MarkForLOSUpdate(target);
00378
00379
00380 if(MechCritStatus(target) & HIDDEN) {
00381 MechCritStatus(target) &= ~HIDDEN;
00382 MechLOSBroadcast(target,
00383 "becomes visible as it is disembarked from.");
00384 }
00385
00386
00387 if(!FlyingT(mech) &&
00388 MechZ(mech) > Elevation(mymap, MechX(mech), MechY(mech)) &&
00389 MechZ(mech) > 0) {
00390
00391 notify(player, "You open the hatch and drop out of the unit....");
00392 MechLOSBroadcast(mech,
00393 tprintf
00394 ("drops out of %s and begins falling to the ground.",
00395 GetMechID(target)));
00396 initiate_ood(player, mech,
00397 tprintf("%d %d %d", MechX(mech), MechY(mech),
00398 MechZ(mech)));
00399 } else {
00400 if(MechType(mech) == CLASS_BSUIT) {
00401 MechLOSBroadcast(mech,
00402 tprintf("climbs out of %s!", GetMechID(target)));
00403 notify(player, "You climb out of the unit.");
00404 } else {
00405
00406 if(Destroyed(target) || !Started(target)) {
00407 MechLOSBroadcast(mech,
00408 tprintf
00409 ("smashes open the ramp door and emerges from %s!",
00410 GetMechID(target)));
00411 notify(player, "You smash open the door and break out.");
00412 MechFalls(mech, 4, 0);
00413 } else {
00414
00415 MechLOSBroadcast(mech,
00416 tprintf("emerges from the ramp out of %s!",
00417 GetMechID(target)));
00418 notify(player, "You emerge from the unit loading ramp.");
00419 if(Landed(mech)
00420 && MechZ(mech) > Elevation(mymap, MechX(mech), MechY(mech))
00421 && FlyingT(mech))
00422 MechStatus(mech) &= ~LANDED;
00423 }
00424 }
00425 }
00426
00427
00428 if(MechType(mech) == CLASS_BSUIT) {
00429 StartBSuitRecycle(mech, 20);
00430 } else if(MechType(mech) == CLASS_MECH || MechType(mech) == CLASS_MW) {
00431 for(i = 0; i < NUM_SECTIONS; i++)
00432 SetRecycleLimb(mech, i, PHYSICAL_RECYCLE_TIME);
00433 } else if(MechType(mech) == CLASS_VEH_GROUND
00434 || MechType(mech) == CLASS_VTOL) {
00435 for(i = 0; i < NUM_SECTIONS; i++)
00436 if(i == ROTOR)
00437 continue;
00438 else
00439 SetRecycleLimb(mech, i, PHYSICAL_RECYCLE_TIME);
00440 }
00441
00442 fix_pilotdamage(mech, MechPilot(mech));
00443 correct_speed(target);
00444 }
00445
00446 void mech_embark(dbref player, void *data, char *buffer)
00447 {
00448
00449 MECH *mech = (MECH *) data;
00450 MECH *target, *towee = NULL;
00451 int tmp;
00452 dbref target_num;
00453 MAP *newmap;
00454 int argc;
00455 char *args[4];
00456 char fail_mesg[SBUF_SIZE];
00457 char enter_lock[LBUF_SIZE];
00458 int i, j;
00459
00460 if(player != GOD)
00461 cch(MECH_USUAL);
00462 if(MechType(mech) == CLASS_MW) {
00463 argc = mech_parseattributes(buffer, args, 1);
00464 DOCHECK(argc != 1, "Invalid number of arguements.");
00465 target_num = FindTargetDBREFFromMapNumber(mech, args[0]);
00466 DOCHECK(target_num == -1,
00467 "That target is not in your line of sight.");
00468 target = getMech(target_num);
00469 DOCHECK(!target ||
00470 !InLineOfSight(mech, target, MechX(target), MechY(target),
00471 FaMechRange(mech, target)),
00472 "That target is not in your line of sight.");
00473 DOCHECK(OODing(target), "You should wait for your target to land first");
00474 DOCHECK(MechZ(mech) > (MechZ(target) + 1),
00475 "You are too high above the target.");
00476 DOCHECK(MechZ(mech) < (MechZ(target) - 1),
00477 "You can't reach that high !");
00478 DOCHECK(MechX(mech) != MechX(target) ||
00479 MechY(mech) != MechY(target),
00480 "You need to be in the same hex!");
00481 DOCHECK((!In_Character(mech->mynum))
00482 || (!In_Character(target->mynum)),
00483 "You don't really see a way to get in there.");
00484 DOCHECK((MechType(target) == CLASS_VEH_GROUND
00485 || MechType(target) == CLASS_VTOL)
00486 && !unit_is_fixable(target),
00487 "You can't find and entrance amid the mass of twisted metal.");
00488
00489 if(!can_pass_lock(mech->mynum, target->mynum, A_LENTER)) {
00490
00491
00492 memset(fail_mesg, 0, sizeof(fail_mesg));
00493 snprintf(fail_mesg, LBUF_SIZE,
00494 "That unit's bay doors are locked.");
00495
00496 did_it(player, target->mynum, A_FAIL, fail_mesg, 0, NULL, A_AFAIL,
00497 (char **) NULL, 0);
00498
00499 return;
00500 }
00501
00502
00503 memset(enter_lock, 0, sizeof(enter_lock));
00504 atr_get_str(enter_lock, target->mynum, A_LENTER, &i, &j);
00505 if(*enter_lock == '\0') {
00506
00507
00508 DOCHECK(MechTeam(mech) != MechTeam(target), "Locked. Damn !");
00509 }
00510
00511 DOCHECK(fabs(MechSpeed(target)) > 15.,
00512 "Are you suicidal ? That thing is moving too fast !");
00513
00514 if(MechType(target) == CLASS_MECH) {
00515 DOCHECK(!GetSectInt(target, HEAD),
00516 "Okay, just climb up to-- Wait... where did the head go??");
00517 DOCHECK(PartIsDestroyed(target, HEAD, 2),
00518 "Okay, just climb up and open-- "
00519 "WTF ? Someone stole the cockpit!");
00520 DOCHECK(PartIsNonfunctional(target, HEAD, 2),
00521 "Okay, just climb up and open-- hey, this door won't budge!");
00522 }
00523 mech_notify(mech, MECHALL, tprintf("You climb into %s.",
00524 GetMechID(target)));
00525 MechLOSBroadcast(mech, tprintf("climbs into %s.", GetMechID(target)));
00526 tele_contents(mech->mynum, target->mynum, TELE_ALL);
00527 discard_mw(mech);
00528 return;
00529 }
00530
00531
00532 argc = mech_parseattributes(buffer, args, 1);
00533 DOCHECK(argc != 1, "Invalid number of arguements.");
00534 target_num = FindTargetDBREFFromMapNumber(mech, args[0]);
00535 DOCHECK(target_num == -1, "That target is not in your line of sight.");
00536 target = getMech(target_num);
00537 DOCHECK(!target ||
00538 !InLineOfSight(mech, target, MechX(target), MechY(target),
00539 FaMechRange(mech, target)),
00540 "That target is not in your line of sight.");
00541 DOCHECK(MechCarrying(mech) == target_num,
00542 "You cannot embark what your towing!");
00543 DOCHECK(Fallen(mech)
00544 || Standing(mech), "Help! I've fallen and I can't get up!");
00545 DOCHECK(!Started(mech) || Destroyed(mech), "Ha Ha Ha.");
00546 DOCHECK(Jumping(mech), "You cannot do that while jumping!");
00547 DOCHECK(Jumping(target), "You cannot do that while it is jumping!");
00548 DOCHECK(MechSpecials2(mech) & CARRIER_TECH
00549 && (IsDS(target) ? IsDS(mech) : 1),
00550 "You're a bit bulky to do that yourself.");
00551 DOCHECK(MechCritStatus(mech) & HIDDEN, "You cannot embark while hidden.");
00552 DOCHECK(MechTons(mech) > CarMaxTon(target),
00553 "You are too large for that class of carrier.");
00554 DOCHECK(MechType(mech) != CLASS_BSUIT
00555 && !(MechSpecials2(target) & CARRIER_TECH),
00556 "This unit can't handle your mass.");
00557 DOCHECK(MMaxSpeed(mech) < MP1, "You are to overloaded to enter.");
00558 DOCHECK(MechZ(mech) > (MechZ(target) + 1),
00559 "You are too high above the target.");
00560 DOCHECK(MechZ(mech) < (MechZ(target) - 1), "You can't reach that high !");
00561 DOCHECK(MechX(mech) != MechX(target) ||
00562 MechY(mech) != MechY(target), "You need to be in the same hex!");
00563
00564 if(!can_pass_lock(mech->mynum, target->mynum, A_LENTER)) {
00565
00566
00567 memset(fail_mesg, 0, sizeof(fail_mesg));
00568 snprintf(fail_mesg, LBUF_SIZE, "That unit's bay doors are locked.");
00569
00570 did_it(player, target->mynum, A_FAIL, fail_mesg, 0, NULL, A_AFAIL,
00571 (char **) NULL, 0);
00572
00573 return;
00574 }
00575
00576
00577 memset(enter_lock, 0, sizeof(enter_lock));
00578 atr_get_str(enter_lock, target->mynum, A_LENTER, &i, &j);
00579 if(*enter_lock == '\0') {
00580
00581
00582 DOCHECK(MechTeam(mech) != MechTeam(target), "Locked. Damn !");
00583 }
00584
00585 DOCHECK(fabs(MechSpeed(target)) > 0,
00586 "Are you suicidal ? That thing is moving too fast !");
00587 DOCHECK(!In_Character(mech->mynum) || !In_Character(target->mynum),
00588 "You don't really see a way to get in there.");
00589
00590
00591
00592 if((tmp = MechFullNoRecycle(mech, CHECK_BOTH))) {
00593
00594 if(tmp == 1) {
00595 notify(player, "You have weapons recycling!");
00596 } else if(tmp == 2) {
00597 notify(player,
00598 "You are still recovering from your previous action!");
00599 } else {
00600 notify(player, "error");
00601 }
00602 return;
00603 }
00604
00605 DOCHECK((MechTons(mech) * 100) > CargoSpace(target),
00606 "Not enough cargospace for you!");
00607 if(MechCarrying(mech) > 0) {
00608 DOCHECK(!(towee = getMech(MechCarrying(mech))),
00609 "Internal error caused by towed unit! Contact a wizard!");
00610 DOCHECK(MechTons(towee) > CarMaxTon(target),
00611 "Your towed unit is too large for that class of carrier.");
00612 DOCHECK(((MechTons(mech) + MechTons(towee)) * 100) >
00613 CargoSpace(target),
00614 "Not enough cargospace for you and your towed unit!");
00615 }
00616 newmap = getMap(mech->mapindex);
00617 if(MechType(mech) == CLASS_BSUIT) {
00618 mech_notify(mech, MECHALL,
00619 tprintf("You climb into %s.", GetMechID(target)));
00620 MechLOSBroadcast(mech, tprintf("climbs into %s.", GetMechID(target)));
00621 } else {
00622 mech_notify(mech, MECHALL,
00623 tprintf("You climb up the entry ramp into %s.",
00624 GetMechID(target)));
00625 MechLOSBroadcast(mech,
00626 tprintf("climbs up the entry ramp into %s.",
00627 GetMechID(target)));
00628 if(towee && MechCarrying(mech) > 0) {
00629 mech_notify(towee, MECHALL,
00630 tprintf("You are drug up the entry ramp into %s.",
00631 GetMechID(target)));
00632 MechLOSBroadcast(towee,
00633 tprintf("is drug up the entry ramp into %s.",
00634 GetMechID(target)));
00635 }
00636 }
00637 MarkForLOSUpdate(mech);
00638 MarkForLOSUpdate(target);
00639
00640 if(MechCritStatus(target) & HIDDEN) {
00641 MechCritStatus(target) &= ~HIDDEN;
00642 MechLOSBroadcast(target, "becomes visible as it is embarked into.");
00643 }
00644
00645
00646
00647
00648 if(towee && MechCarrying(mech) > 0) {
00649 MarkForLOSUpdate(towee);
00650 mech_Rsetmapindex(GOD, (void *) towee, tprintf("%d", (int) -1));
00651 mech_Rsetxy(GOD, (void *) towee, tprintf("%d %d", 0, 0));
00652 loud_teleport(towee->mynum, target->mynum);
00653 CargoSpace(target) -= (MechTons(towee) * 100);
00654 Shutdown(towee);
00655 SetCarrying(mech, -1);
00656 MechStatus(towee) &= ~TOWED;
00657 }
00658
00659
00660 mech_Rsetmapindex(GOD, (void *) mech, tprintf("%d", (int) -1));
00661 mech_Rsetxy(GOD, (void *) mech, tprintf("%d %d", 0, 0));
00662 loud_teleport(mech->mynum, target->mynum);
00663 CargoSpace(target) -= (MechTons(mech) * 100);
00664 Shutdown(mech);
00665
00666 correct_speed(target);
00667 }
00668
00669 void autoeject(dbref player, MECH * mech, int tIsBSuit)
00670 {
00671 MECH *m;
00672 dbref suit;
00673 char *d;
00674
00675
00676 if(!player || !In_Character(mech->mynum) || !mudconf.btech_ic ||
00677 !In_Character(Location(mech->mynum)))
00678 return;
00679
00680
00681 suit = create_object(tprintf("MechWarrior - %s", Name(player)));
00682 silly_atr_set(suit, A_XTYPE, "MECH");
00683 s_Hardcode(suit);
00684 handle_xcode(GOD, suit, 0, 1);
00685 d = silly_atr_get(player, A_MWTEMPLATE);
00686 if(!(m = getMech(suit))) {
00687 SendError(tprintf
00688 ("Unable to create special obj for #%d's ejection.",
00689 player));
00690 destroy_object(suit);
00691 notify(player,
00692 "Sorry, something serious went wrong, contact a Wizard (can't create RS object)");
00693 return;
00694 }
00695 if(!mech_loadnew(GOD, m, (!d || !*d ||
00696 !strcmp(d, "#-1")) ? "MechWarrior" : d)) {
00697 SendError(tprintf
00698 ("Unable to load mechwarrior template for #%d's ejection. (%s)",
00699 player, (!d || !*d) ? "Default template" : d));
00700 destroy_object(suit);
00701 notify(player,
00702 "Sorry, something serious went wrong, contact a Wizard (can't load MWTemplate)");
00703 return;
00704 }
00705 silly_atr_set(suit, A_MECHNAME, "MechWarrior");
00706 MechTeam(m) = MechTeam(mech);
00707 mech_Rsetmapindex(GOD, (void *) m, tprintf("%d", mech->mapindex));
00708 mech_Rsetxy(GOD, (void *) m, tprintf("%d %d", MechX(mech), MechY(mech)));
00709 mech_Rsetteam(GOD, (void *) m, tprintf("%d", MechTeam(mech)));
00710
00711
00712 hush_teleport(suit, mech->mapindex);
00713 hush_teleport(player, suit);
00714
00715
00716 s_In_Character(suit);
00717 initialize_pc(player, m);
00718 MechPilot(m) = player;
00719 MechTeam(m) = MechTeam(mech);
00720 #ifdef COPY_CHANS_ON_EJECT
00721 memcpy(m->freq, mech->freq, FREQS * sizeof(m->freq[0]));
00722 memcpy(m->freqmodes, mech->freqmodes, FREQS * sizeof(m->freqmodes[0]));
00723 #else
00724 #ifdef RANDOM_CHAN_ON_EJECT
00725 m->freq[0] = random() % 1000000;
00726 notify(player, tprintf("Emergency radio channel set to %d.", m->freq[0]));
00727 #endif
00728 #endif
00729
00730 if(tIsBSuit) {
00731 MechLOSBroadcast(m, "climbs out of one of the destroyed suits!");
00732 notify(player, "You climb out of the unit!");
00733 } else {
00734 MechLOSBroadcast(m, tprintf("ejected from %s!", GetMechID(mech)));
00735 initiate_ood(player, m, tprintf("%d %d %d", MechX(m), MechY(m), 150));
00736 notify(player, "You eject from the unit!");
00737 }
00738 }