#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "structs.h" #include "awake.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "house.h" #include "transport.h" #include "constants.h" void die_follower(struct char_data *ch); void roll_individual_initiative(struct char_data *ch); void order_list(struct char_data *start); int find_first_step(vnum_t src, vnum_t target); int move_vehicle(struct char_data *ch, int dir); ACMD(do_return); #define VEH ch->in_veh int get_maneuver(struct veh_data *veh) { int score = -2; struct char_data *ch = NULL; int i = 0, x = 0, skill; switch (veh->type) { case VEH_BIKE: score += 5; break; case VEH_TRUCK: score -= 5; break; case VEH_CAR: if (veh->speed >= 200) score +=5; break; } if (veh->cspeed > SPEED_IDLE) score += (int)(get_speed(veh) / 10); if (veh->rigger) ch = veh->rigger; else for (ch = veh->people; ch; ch = ch->next_in_veh) if (AFF_FLAGGED(ch, AFF_PILOT)) break; if (ch) { for (skill = veh_skill(ch, veh);skill > 0; skill--) { i = srdice(); if (i > x) x = i; } score += x; } return score; } int modify_veh(struct veh_data *veh) { struct char_data *ch; struct obj_data *cyber; int mod = 0; if (!(ch = veh->rigger)) for (ch = veh->people; ch; ch = ch->next_in_veh) if (AFF_FLAGGED(ch, AFF_PILOT)) break; if (veh->cspeed > SPEED_IDLE && ch) { for (cyber = ch->cyberware; cyber; cyber = cyber->next_content) if (GET_OBJ_VAL(cyber, 2) == 32) { mod -= GET_OBJ_VAL(cyber, 0); break; } if (mod == 0 && AFF_FLAGGED(ch, AFF_RIG)) mod--; if (get_speed(veh) > (int)(GET_REA(ch) * 20)) if (get_speed(veh) > (int)(GET_REA(ch) * 40)) mod += 3; else if (get_speed(veh) < (int)(GET_REA(ch) * 40) && get_speed(veh) > (int)(GET_REA(ch) * 30)) mod += 2; else mod++; } switch (veh->damage) { case 1: case 2: mod += 1; break; case 3: case 4: case 5: mod += 2; break; case 6: case 7: case 8: case 9: mod += 3; break; } if (weather_info.sky >= SKY_RAINING) mod++; return mod; } void stop_chase(struct veh_data *veh) { struct veh_follow *k, *j; if (!veh->following) return; if (veh == veh->following->followers->follower) { k = veh->following->followers; veh->following->followers = k->next; delete k; } else { for (k = veh->following->followers; k->next->follower != veh; k = k->next) ; j = k->next; k->next = j->next; delete j; } veh->following = NULL; } void crash_test(struct char_data *ch) { int target = 0, skill = 0; int power, attack_resist = 0, damage_total = SERIOUS; struct veh_data *veh; struct char_data *tch, *next; RIG_VEH(ch, veh); target = veh->handling + modify_veh(veh) + modify_target(ch); power = (int)(ceilf(get_speed(veh) / 10)); sprintf(buf, "%s begins to lose control!\r\n", veh->short_description); send_to_room(buf, veh->in_room); send_to_char("You begin to lose control!\r\n", ch); skill = veh_skill(ch, veh) + veh->autonav; if (success_test(skill, target)) { send_to_char("You get your ride under control.\r\n", ch); return; } send_to_veh("You careen off the road!\r\n", veh, NULL, TRUE); sprintf(buf, "A %s careens off the road!\r\n", veh->short_description); send_to_room(buf, veh->in_room); attack_resist = success_test(veh->body, power) * -1; int staged_damage = stage(attack_resist, damage_total); damage_total = convert_damage(staged_damage); veh->damage += damage_total; stop_chase(veh); if (veh->type == VEH_BIKE && veh->people) { power = (int)(get_speed(veh) / 10); for (tch = veh->people; tch; tch = next) { next = tch->next_in_veh; char_from_room(tch); char_to_room(tch, veh->in_room); veh->seating++; damage_total = convert_damage(stage(0 - success_test(GET_BOD(tch), power), MODERATE)); damage(tch, tch, damage_total, TYPE_CRASH, PHYSICAL); AFF_FLAGS(tch).RemoveBits(AFF_PILOT, AFF_RIG, ENDBIT); send_to_char("You are thrown from the bike!\r\n", tch); } veh->cspeed = SPEED_OFF; } } ACMD(do_drive) { struct char_data *temp; if (!VEH) { send_to_char("You have to be in a vehicle to do that.\r\n", ch); return; } if (AFF_FLAGGED(ch, AFF_RIG)) { send_to_char("You are already rigging the vehicle.\r\n", ch); return; } if(GET_SKILL(ch, SKILL_PILOT_CAR) == 0 && GET_SKILL(ch, SKILL_PILOT_BIKE) == 0 && GET_SKILL(ch, SKILL_PILOT_TRUCK) == 0) { send_to_char("You have no idea how to do that.\r\n", ch); return; } if (VEH->damage >= 10) { send_to_char("This vehicle is too much of a wreck to move!\r\n", ch); return; } if (VEH->rigger || VEH->dest) { send_to_char("You can't seem to take control!\r\n", ch); return; } for(temp = VEH->people; temp; temp= temp->next_in_veh) if(ch != temp && AFF_FLAGGED(temp, AFF_PILOT)) { send_to_char("Someone is already in charge!\r\n", ch); return; } if (VEH->type == VEH_BIKE && VEH->locked && GET_IDNUM(ch) != VEH->owner) { send_to_char("You can't seem to start it.\r\n", ch); return; } if (VEH->cspeed == SPEED_OFF || VEH->dest) { AFF_FLAGS(ch).ToggleBit(AFF_PILOT); send_to_char("The wheel is in your hands.\r\n", ch); sprintf(buf1, "%s takes the wheel.\r\n", GET_NAME(ch)); VEH->cspeed = SPEED_IDLE; VEH->lastin[0] = VEH->in_room; send_to_veh(buf1, VEH, ch, FALSE); if (AFF_FLAGGED(ch, AFF_MANNING)) { struct obj_data *mount; for (mount = ch->in_veh->mount; mount; mount = mount->next_content) if (mount->worn_by == ch) break; mount->worn_by = NULL; AFF_FLAGS(ch).RemoveBit(AFF_MANNING); } } else { AFF_FLAGS(ch).ToggleBit(AFF_PILOT); send_to_char("You relinquish the driver's seat.\r\n", ch); sprintf(buf1, "%s relinquishes the driver's seat.\r\n", GET_NAME(ch)); stop_chase(VEH); if (!VEH->dest) VEH->cspeed = SPEED_OFF; send_to_veh(buf1, VEH, ch, FALSE); } return; } ACMD(do_rig) { struct char_data *temp; struct obj_data *cyber; int has_datajack = 0; if (!VEH) { send_to_char("You have to be in a vehicle to do that.\r\n", ch); return; } for (cyber = ch->cyberware; cyber; cyber = cyber->next_content) if (GET_OBJ_VAL(cyber, 2) == CYB_DATAJACK) has_datajack = TRUE; if (!has_datajack) { send_to_char("You need atleast a datajack to do that.\r\n", ch); return; } if (GET_EQ(ch, WEAR_HEAD) && GET_OBJ_VAL(GET_EQ(ch, WEAR_HEAD), 7) > 0) { send_to_char(ch, "Try removing your helmet first.\r\n"); return; } if (GET_SKILL(ch, SKILL_PILOT_CAR) == 0 && GET_SKILL(ch, SKILL_PILOT_BIKE) == 0 && GET_SKILL(ch, SKILL_PILOT_TRUCK) == 0) { send_to_char("You have no idea how to do that.\r\n", ch); return; } if (VEH->damage >= 10) { send_to_char("This vehicle is too much of a wreck to move!\r\n", ch); return; } if (VEH->rigger || VEH->dest) { send_to_char("The system is unresponsive!\r\n", ch); return; } for(temp = VEH->people; temp; temp= temp->next_in_veh) if(ch != temp && AFF_FLAGGED(temp, AFF_PILOT)) { send_to_char("Someone is already in charge!\r\n", ch); return; } if (VEH->type == VEH_BIKE && VEH->locked && GET_IDNUM(ch) != VEH->owner) { send_to_char("You jack in and nothing happens.\r\n", ch); return; } if(VEH->cspeed == SPEED_OFF || VEH->dest) { AFF_FLAGS(ch).ToggleBits(AFF_PILOT, AFF_RIG, ENDBIT); send_to_char("As you jack in, your perception shifts.\r\n", ch); sprintf(buf1, "%s jacks into the vehicle control system.\r\n", GET_NAME(ch)); VEH->cspeed = SPEED_IDLE; VEH->lastin[0] = VEH->in_room; send_to_veh(buf1, VEH, ch, TRUE); if (AFF_FLAGGED(ch, AFF_MANNING)) { struct obj_data *mount; for (mount = ch->in_veh->mount; mount; mount = mount->next_content) if (mount->worn_by == ch) break; mount->worn_by = NULL; AFF_FLAGS(ch).RemoveBit(AFF_MANNING); } } else { if (!AFF_FLAGGED(ch, AFF_RIG)) { send_to_char("But you're not rigging.\r\n", ch); return; } AFF_FLAGS(ch).ToggleBits(AFF_PILOT, AFF_RIG, ENDBIT); if (!VEH->dest) VEH->cspeed = SPEED_OFF; stop_chase(VEH); send_to_char("You return to your senses.\r\n", ch); sprintf(buf1, "%s returns to their senses.\r\n", GET_NAME(ch)); send_to_veh(buf1, VEH, ch, FALSE); stop_fighting(ch); } return; } ACMD(do_vemote) { struct veh_data *veh; if (!(AFF_FLAGGED(ch, AFF_PILOT) || PLR_FLAGGED(ch, PLR_REMOTE))) { send_to_char("You must be driving a vehicle to use that command.\r\n", ch); return; } if (!*argument) { send_to_char("Yes.. but what?\r\n", ch); return; } RIG_VEH(ch, veh) sprintf(buf, "%s%s.\r\n", veh->short_description, argument); send_to_room(buf, veh->in_room); sprintf(buf, "Your vehicle%s.\r\n", argument); send_to_veh(buf, veh, NULL, TRUE); return; } ACMD(do_ram) { struct veh_data *veh, *tveh = NULL; struct char_data *vict = NULL; int skill = 0, target = 0, tvehm = 0, vehm = 0; if (!(AFF_FLAGGED(ch, AFF_PILOT) || PLR_FLAGGED(ch, PLR_REMOTE))) { send_to_char("You need to be driving a vehicle to do that...\r\n", ch); return; } if (FIGHTING(ch) || FIGHTING_VEH(ch)) { send_to_char(ch, "You're in the middle of combat!\r\n"); return; } RIG_VEH(ch, veh); if (get_speed(veh) <= SPEED_IDLE) { send_to_char("You're moving far too slowly.\r\n", ch); return; } if (world[veh->in_room].peaceful) { send_to_char("This room just has a peaceful, easy feeling...\r\n", ch); return; } two_arguments(argument, arg, buf2); if (!*arg) { send_to_char("Ram what?", ch); return; } if (!(vict = get_char_room(arg, veh->in_room)) && !(tveh = get_veh_list(arg, world[veh->in_room].vehicles))) { send_to_char("You can't seem to find the target you're looking for.\r\n", ch); return; } if (vict && !INVIS_OK(ch, vict)) { send_to_char("You can't seem to find the target you're looking for.\r\n", ch); return; } if (vict && !IS_NPC(vict) && !(PRF_FLAGGED(ch, PRF_PKER) && PRF_FLAGGED(vict, PRF_PKER))) { send_to_char(ch, "You have to be flagged PK to attack another player.\r\n"); return; } skill = veh_skill(ch, veh); if (tveh) { target = modify_veh(veh) + veh->handling + modify_target(ch); vehm = get_maneuver(veh); tvehm = get_maneuver(tveh); if (vehm > (tvehm + 10)) target -= 4; else if (vehm > tvehm) target -= 2; else if (vehm < (tvehm - 10)) target += 4; else if (vehm < tvehm) target += 2; sprintf(buf, "%s heads straight towards your ride.\r\n", veh->short_description); sprintf(buf1, "%s heads straight towards %s.\r\n", veh->short_description, tveh->short_description); sprintf(buf2, "You attempt to ram %s.\r\n", tveh->short_description); send_to_veh(buf, tveh, 0, TRUE); send_to_room(buf1, veh->in_room); send_to_char(buf2, ch); } else { target = modify_veh(veh) + veh->handling + modify_target(ch); sprintf(buf, "%s heads straight towards you.", veh->short_description); sprintf(buf1, "%s heads straight towards $n.", veh->short_description); act(buf, FALSE, vict, 0, 0, TO_CHAR); act(buf1, FALSE, vict, 0, 0, TO_ROOM); act("You head straight towards $N.", FALSE, ch, 0, vict, TO_CHAR); if (success_test(GET_REA(vict), 4)) { send_to_char(ch, "You quickly let out an attack at it!\r\n"); act("$n quickly lets an attack fly.", FALSE, vict, 0, 0, TO_ROOM); act("$N suddenly attacks!", FALSE, ch, 0, vict, TO_CHAR); AFF_FLAGS(vict).SetBit(AFF_COUNTER_ATT); vcombat(vict, veh); AFF_FLAGS(vict).RemoveBit(AFF_COUNTER_ATT); if (veh->damage > 9) return; } } if (success_test(skill, target)) if (vict) vram(veh, vict, NULL); else vram(veh, NULL, tveh); else { crash_test(ch); chkdmg(veh); } } ACMD(do_upgrade) { struct veh_data *veh; struct obj_data *mod, *obj, *shop = NULL; int j = 0, skill = 0, target = 6, kit = 0; half_chop(argument, buf1, buf2); if (!*buf1) { send_to_char("What do you want to upgrade?\r\n", ch); return; } if (ch->in_veh) { send_to_char("You have to be outside what you want to upgrade.\r\n", ch); return; } if (!(veh = get_veh_list(buf1, world[ch->in_room].vehicles))) { send_to_char("You can't seem to find that vehicle here.\r\n", ch); return; } if (!*buf2) { send_to_char("You have to upgrade it with something!\r\n", ch); return; } else if (!(mod = get_obj_in_list_vis(ch, buf2, ch->carrying))) { send_to_char("You don't seem to have that item.\r\n", ch); return; } if (GET_OBJ_TYPE(mod) != ITEM_MOD) { send_to_char(ch, "That is not a vehicle modification.\r\n"); return; } if (!IS_NPC(ch)) { switch(veh->type) { case VEH_DRONE: skill = GET_SKILL(ch, SKILL_BR_DRONE); if (!skill) skill = GET_SKILL(ch, SKILL_BR_BIKE) / 3; if (!skill) skill = GET_SKILL(ch, SKILL_BR_CAR) / 4; if (!skill) skill = GET_SKILL(ch, SKILL_BR_TRUCK) / 4; break; case VEH_BIKE: skill = GET_SKILL(ch, SKILL_BR_BIKE); if (!skill) skill = GET_SKILL(ch, SKILL_BR_CAR) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_DRONE) / 3; if (!skill) skill = GET_SKILL(ch, SKILL_BR_TRUCK) / 4; break; case VEH_CAR: skill = GET_SKILL(ch, SKILL_BR_CAR); if (!skill) skill = GET_SKILL(ch, SKILL_BR_TRUCK) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_BIKE) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_DRONE) / 4; break; case VEH_TRUCK: skill = GET_SKILL(ch, SKILL_BR_TRUCK); if (!skill) skill = GET_SKILL(ch, SKILL_BR_CAR) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_BIKE) / 4; if (!skill) skill = GET_SKILL(ch, SKILL_BR_DRONE) / 4; break; } if (!skill) { send_to_char(ch, "You have no idea what you are doing...\r\n"); return; } target += modify_target(ch); for (obj = ch->carrying; obj && !kit; obj = obj->next_content) if (GET_OBJ_TYPE(obj) == ITEM_WORKING_GEAR && GET_OBJ_VAL(obj, 0) == 4) kit = GET_OBJ_VAL(obj, 1); for (int i = 0; !kit && i < (NUM_WEARS - 1); i++) if ((obj = GET_EQ(ch, i)) && GET_OBJ_TYPE(obj) == ITEM_WORKING_GEAR && GET_OBJ_VAL(obj, 0) == 4) kit = GET_OBJ_VAL(obj, 1); for (obj = world[ch->in_room].contents; obj && !shop; obj = obj->next_content) if (GET_OBJ_TYPE(obj) == ITEM_WORKSHOP && GET_OBJ_VAL(obj, 0) == 4 && GET_OBJ_VAL(obj, 1)) shop = obj; if (!shop) target += 2; switch (kit) { case 0: target += 4; break; case 1: target += 2; break; case 3: target -= 2; break; } if ((skill = success_test(skill, target)) == -1) { sprintf(buf, "You botch up the upgrade completely, destroying %s.\r\n", GET_OBJ_NAME(mod)); send_to_char(buf, ch); extract_obj(mod); return; } else if (skill < 1) { send_to_char(ch, "You can't figure out how to install it. \r\n"); return; } } if ((veh->type == VEH_DRONE && GET_OBJ_VAL(mod, 4) < 1) || (veh->type != VEH_DRONE && GET_OBJ_VAL(mod, 4) == 1)) { send_to_char(ch, "That part won't fit on.\r\n"); return; } if (veh->type == VEH_DRONE) { switch(GET_OBJ_VAL(mod, 0)) { case 0: case 1: case 2: case 3: case 4: case 7: case 10: case 11: case 12: send_to_char(ch, "You can't upgrade that on a drone.\r\n"); return; } } if (GET_OBJ_VAL(mod, 0) == MOD_MOUNT) { skill = 0; for (obj = veh->mount; obj; obj = obj->next_content) switch (GET_OBJ_VAL(obj, 1)) { case 0: case 1: j++; break; case 2: case 3: case 5: j += 2; break; case 4: j += 4; break; } switch (GET_OBJ_VAL(mod, 1)) { case 1: skill = 1; case 0: j++; target = 10; break; case 3: skill = 1; case 2: j += 2; target = 10; break; case 4: skill = 1; j += 4; target = 100; break; case 5: skill = 1; j += 2; target = 25; break; } if (j > veh->body || (veh->load - target) < 0) { send_to_char("Try as you might, you just can't fit it on.\r\n", ch); return; } veh->load -= target; veh->sig -= skill; obj_from_char(mod); if (veh->mount) mod->next_content = veh->mount; veh->mount = mod; } else { if (GET_OBJ_VAL(mod, 0) != MOD_SEAT && GET_MOD(veh, GET_OBJ_VAL(mod, 0))) { send_to_char(ch, "There is already a mod of that type installed.\r\n"); return; } if (veh->load < GET_OBJ_VAL(mod, 1)) { send_to_char(ch, "Try as you might, you just can't fit it in.\r\n"); return; } obj_from_char(mod); veh->load -= GET_OBJ_VAL(mod, 1); for (j = 0; j < MAX_OBJ_AFFECT; j++) affect_veh(veh, mod->affected[j].location, mod->affected[j].modifier); if (GET_OBJ_VAL(mod, 0) == MOD_SEAT && GET_MOD(veh, GET_OBJ_VAL(mod, 0))) { GET_MOD(veh, GET_OBJ_VAL(mod, 0))->affected[0].modifier++; extract_obj(mod); } else GET_MOD(veh, GET_OBJ_VAL(mod, 0)) = mod; } sprintf(buf, "$n goes to work on %s.\r\n", veh->short_description); act(buf, TRUE, ch, 0, 0, TO_ROOM); sprintf(buf, "You go to work on %s.\r\n", veh->short_description); send_to_char(buf, ch); } void disp_mod(struct veh_data *veh, struct char_data *ch, int i) { send_to_char(ch, "\r\nMounts:\r\n"); for (struct obj_data *mount = veh->mount; mount; mount = mount->next_content) if (GET_OBJ_VAL(mount, 1) != 0 && GET_OBJ_VAL(mount, 1) != 2 && mount->contains) send_to_char(ch, "%s mounted on %s.\r\n", CAP(GET_OBJ_NAME(mount->contains)), GET_OBJ_NAME(mount)); send_to_char(ch, "Modifications:\r\n"); if (GET_MOD(veh, 13)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 13))); if (GET_MOD(veh, 5)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 5))); if (i <= 1) return; if (i >= 2) { if (i >= 3) { if (GET_MOD(veh, 3)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 3))); if (GET_MOD(veh, 12)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 12))); if (GET_MOD(veh, 1)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 1))); if (i >= 4) { if (GET_MOD(veh, 0)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 0))); if (GET_MOD(veh, 4)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 4))); if (i >= 5) { if (GET_MOD(veh, 2)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 2))); if (GET_MOD(veh, 8)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 8))); if (GET_MOD(veh, 9)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 9))); if (i >= 6) { if (GET_MOD(veh, 11)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 11))); if (GET_MOD(veh, 7)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 7))); if (i >= 7) { if (GET_MOD(veh, 6)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 6))); if (GET_MOD(veh, 10)) send_to_char(ch, "%s\r\n", GET_OBJ_NAME(GET_MOD(veh, 10))); } } } } } } } ACMD(do_control) { struct obj_data *cyber; struct veh_data *veh; struct char_data *temp; bool has_rig = FALSE, has_jack = FALSE; int i; for (cyber = ch->cyberware; cyber; cyber = cyber->next_content) if (GET_OBJ_VAL(cyber, 2) == 32) has_rig = TRUE; else if (GET_OBJ_VAL(cyber, 2) == CYB_DATAJACK) has_jack = TRUE; if (AFF_FLAGS(ch).AreAnySet(AFF_PILOT, AFF_PROGRAM, AFF_DESIGN, ENDBIT)) { send_to_char("Now that would be a neat trick.\r\n", ch); return; } if (!has_jack) { send_to_char("You need a datajack to do that.\r\n", ch); return; } if (!has_rig) { send_to_char("You need a vehicle control rig to do that.\r\n", ch); return; } if (GET_EQ(ch, WEAR_HEAD) && GET_OBJ_VAL(GET_EQ(ch, WEAR_HEAD), 7) > 0) { send_to_char(ch, "Try removing your helmet first.\r\n"); return; } if (ch->in_veh) { send_to_char(ch, "You can't control a vehicle from inside one.\r\n"); return; } has_rig = FALSE; for (cyber = ch->carrying; cyber; cyber = cyber->next_content) if (GET_OBJ_TYPE(cyber) == ITEM_RCDECK) has_rig = TRUE; if (!has_rig) for (int x = 0; x < NUM_WEARS; x++) if (GET_EQ(ch, x)) if (GET_OBJ_TYPE(GET_EQ(ch, x)) == ITEM_RCDECK) has_rig = TRUE; if (!has_rig) { send_to_char("You need a Remote Control Deck to do that.\r\n", ch); return; } if ((i = atoi(argument)) < 0) { send_to_char("Which position on your subscriber list?\r\n", ch); return; } for (veh = ch->char_specials.subscribe; veh; veh = veh->next_sub) if (--i < 0) break; if (!veh) { send_to_char("Your subscriber list isn't that big.\r\n", ch); return; } if (PLR_FLAGGED(ch, PLR_REMOTE)) do_return(ch, NULL, 0, 0); ch->char_specials.rigging = veh; veh->rigger = ch; for(temp = veh->people; temp; temp = temp->next_in_veh) if (AFF_FLAGGED(temp, AFF_RIG)) { send_to_char("You are forced out of the system!\r\n", temp); AFF_FLAGS(temp).ToggleBits(AFF_RIG, AFF_PILOT, ENDBIT); } else if (AFF_FLAGGED(temp, AFF_PILOT)) { send_to_char("The controls stop responding!\r\n", temp); AFF_FLAGS(temp).ToggleBit(AFF_PILOT); } else send_to_char("The vehicle begins to move.\r\n", temp); GET_POS(ch) = POS_SITTING; act("$n jacks into $s deck.", TRUE, ch, NULL, NULL, TO_ROOM); PLR_FLAGS(ch).ToggleBit(PLR_REMOTE); sprintf(buf, "You take control of %s.\r\n", veh->short_description); send_to_char(buf, ch); } ACMD(do_subscribe) { struct veh_data *veh, *temp; struct obj_data *obj; bool has_deck = FALSE; int i = 0, num; for (obj = ch->carrying; obj; obj = obj->next_content) if (GET_OBJ_TYPE(obj) == ITEM_RCDECK) has_deck = TRUE; if (!has_deck) for (int x = 0; x < NUM_WEARS; x++) if (GET_EQ(ch, x)) if (GET_OBJ_TYPE(GET_EQ(ch, x)) == ITEM_RCDECK) has_deck = TRUE; if (!has_deck) { send_to_char("You need a Remote Control Deck to do that.\r\n", ch); return; } if (subcmd == SCMD_UNSUB) { if (!*argument) { send_to_char("You need to supply a number.\r\n", ch); return; } num = atoi(argument); for (veh = ch->char_specials.subscribe; veh; veh = veh->next_sub) if (--num < 0) break; if (!veh) { send_to_char("Your subscriber list isn't that big.\r\n", ch); return; } REMOVE_FROM_LIST(veh, ch->char_specials.subscribe, next_sub); veh->sub = FALSE; veh->next_sub = NULL; sprintf(buf, "You remove %s from your subscriber list.\r\n", veh->short_description); send_to_char(buf, ch); return; } if (!*argument) { if (ch->char_specials.subscribe) { send_to_char("Your subscriber list contains:\r\n", ch); for (veh = ch->char_specials.subscribe; veh; veh = veh->next_sub) { sprintf(buf, "%2d) %-30s (At %s) [%2d/10] Damage\r\n", i, veh->short_description, world[veh->in_room].name, veh->damage); send_to_char(buf, ch); i++; } } else send_to_char("Your subscriber list is empty.\r\n", ch); return; } one_argument(argument, buf); if (ch->in_veh) veh = get_veh_list(buf, world[ch->in_veh->in_room].vehicles); else veh = get_veh_list(buf, world[ch->in_room].vehicles); if (!veh) { send_to_char("You don't see that here.\r\n", ch); return; } if (veh->owner != GET_IDNUM(ch)) { send_to_char("That's not yours.\r\n", ch); return; } if (veh->sub) { send_to_char("That is already part of your subscriber list.\r\n", ch); return; } veh->sub = TRUE; veh->next_sub = ch->char_specials.subscribe; ch->char_specials.subscribe = veh; sprintf(buf, "You add %s to your subscriber list.\r\n", veh->short_description); send_to_char(buf, ch); } ACMD(do_repair) { struct obj_data *obj, *shop = NULL; ; struct veh_data *veh; int target = 4, skill = 0, success, mod = 0; one_argument(argument, buf1); if (!*buf1) { send_to_char("What do you want to repair?\r\n", ch); return; } if (ch->in_veh) { send_to_char("Well, you could probably polish the dash from in here.\r\n", ch); return; } if (!(veh = get_veh_list(buf1, world[ch->in_room].vehicles))) { send_to_char("You can't seem to find that vehicle here.\r\n", ch); return; } if (veh->damage == 0) { send_to_char(ch, "But it's not damaged!\r\n"); return; } switch(veh->type) { case VEH_DRONE: skill = GET_SKILL(ch, SKILL_BR_DRONE); if (!skill) skill = GET_SKILL(ch, SKILL_BR_BIKE) / 3; if (!skill) skill = GET_SKILL(ch, SKILL_BR_CAR) / 4; if (!skill) skill = GET_SKILL(ch, SKILL_BR_TRUCK) / 4; break; case VEH_BIKE: skill = GET_SKILL(ch, SKILL_BR_BIKE); if (!skill) skill = GET_SKILL(ch, SKILL_BR_CAR) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_DRONE) / 3; if (!skill) skill = GET_SKILL(ch, SKILL_BR_TRUCK) / 4; break; case VEH_CAR: skill = GET_SKILL(ch, SKILL_BR_CAR); if (!skill) skill = GET_SKILL(ch, SKILL_BR_TRUCK) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_BIKE) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_DRONE) / 4; break; case VEH_TRUCK: skill = GET_SKILL(ch, SKILL_BR_TRUCK); if (!skill) skill = GET_SKILL(ch, SKILL_BR_CAR) / 2; if (!skill) skill = GET_SKILL(ch, SKILL_BR_BIKE) / 4; if (!skill) skill = GET_SKILL(ch, SKILL_BR_DRONE) / 4; break; } if (!skill) { send_to_char(ch, "You have no idea what you are doing...\r\n"); return; } target += (veh->damage - 2) / 2; target += modify_target(ch); for (obj = ch->carrying; obj && !mod; obj = obj->next_content) if (GET_OBJ_TYPE(obj) == ITEM_WORKING_GEAR && GET_OBJ_VAL(obj, 0) == 4) mod = GET_OBJ_VAL(obj, 1); for (int i = 0; !mod && i < (NUM_WEARS - 1); i++) if ((obj = GET_EQ(ch, i)) && GET_OBJ_TYPE(obj) == ITEM_WORKING_GEAR && GET_OBJ_VAL(obj, 0) == 4) mod = GET_OBJ_VAL(obj, 1); for (obj = world[ch->in_room].contents; obj && !shop; obj = obj->next_content) if (GET_OBJ_TYPE(obj) == ITEM_WORKSHOP && GET_OBJ_VAL(obj, 0) == 4 && GET_OBJ_VAL(obj, 1)) shop = obj; if (!shop) target += 2; switch (mod) { case 0: target += 4; break; case 1: target += 2; break; case 3: target -= 2; break; } if ((success = success_test(skill, target)) < 1) { send_to_char(ch, "It seems to be beyond your skill.\r\n"); return; } veh->damage -= (success + 1) / 2; if (veh->damage <= 0) { send_to_char(ch, "You go to work on the vehicle and it looks as good as new.\r\n"); veh->damage = 0; } else send_to_char(ch, "You go to work and repair part of the damage.\r\n"); WAIT_STATE(ch, 2 * PULSE_VIOLENCE); } ACMD(do_driveby) { struct obj_data *wielded; struct char_data *vict, *pass, *list = NULL; int dir; if (!ch->in_veh) { send_to_char(ch, "You must be in a vehicle to do that.\r\n"); return; } if (!AFF_FLAGGED(ch, AFF_PILOT)) { if (PLR_FLAGGED(ch, PLR_DRIVEBY)) send_to_char(ch, "You will no longer perform a drive-by.\r\n"); else send_to_char(ch, "You will now perform a drive-by.\r\n"); PLR_FLAGS(ch).ToggleBit(PLR_DRIVEBY); return; } two_arguments(argument, arg, buf2); if (!*arg || !*buf2) { send_to_char(ch, "Syntax is driveby <character> <direction to leave>.\r\n"); return; } if (!(vict = get_char_room(arg, ch->in_veh->in_room))) { send_to_char(ch, "You don't see them there.\r\n"); return; } if ((dir = search_block(buf2, lookdirs, FALSE)) == -1) { send_to_char("What direction?\r\n", ch); return; } dir = convert_look[dir]; if (!EXIT(ch->in_veh, dir)) { send_to_char("That would just be crazy...\r\n", ch); return; } if (ch->in_veh->cspeed <= SPEED_IDLE) { send_to_char("How do you expect to driveby from a stationary vehicle?\r\n", ch); return; } if ((wielded = GET_EQ(ch, WEAR_WIELD))) { if (!(GET_OBJ_VAL(wielded, 4) == SKILL_PISTOLS || GET_OBJ_VAL(wielded, 4) == SKILL_SMG)) { send_to_char(ch, "You can only do a driveby with a pistol or SMG.\r\n"); return; } if (!IS_NPC(vict) && !PRF_FLAGGED(ch, PRF_PKER) && !PRF_FLAGGED(vict, PRF_PKER)) { send_to_char(ch, "You have to be flagged PK to attack another player.\r\n"); return; } sprintf(buf, "You point %s towards %s and open fire!\r\n", GET_OBJ_NAME(wielded), GET_NAME(vict)); send_to_char(ch, buf); sprintf(buf, "%s aims %s towards %s and opens fire!\r\n", GET_NAME(ch), GET_OBJ_NAME(wielded), GET_NAME(vict)); send_to_veh(buf, ch->in_veh, ch, FALSE); list = ch; roll_individual_initiative(ch); GET_INIT_ROLL(ch) += 20; } else { sprintf(buf, "You point towards %s and shout, \"Light 'em Up!\".\r\n", GET_NAME(vict)); send_to_char(ch, buf); sprintf(buf, "%s points towards %s and shouts, \"Light 'em Up!\".!\r\n", GET_NAME(ch), GET_NAME(vict)); send_to_veh(buf, ch->in_veh, ch, FALSE); } for (pass = ch->in_veh->people; pass; pass = pass->next_in_veh) { if (pass != ch && PLR_FLAGGED(pass, PLR_DRIVEBY) && AWAKE(pass) && GET_EQ(pass, WEAR_WIELD) && GET_OBJ_VAL(GET_EQ(pass, WEAR_WIELD),4) >= SKILL_FIREARMS) { if (!IS_NPC(vict) && !PRF_FLAGGED(pass, PRF_PKER) && !PRF_FLAGGED(vict, PRF_PKER)) continue; sprintf(buf, "You follow %s lead and take aim.\r\n", HSHR(ch)); send_to_char(pass, buf); PLR_FLAGS(pass).RemoveBit(PLR_DRIVEBY); pass->next_fighting = list; list = pass; roll_individual_initiative(pass); GET_INIT_ROLL(pass) += 20; } } if (!list) { send_to_char(ch, "But no one is in the car to hear you.\r\n"); return; } order_list(list); roll_individual_initiative(vict); if (GET_INIT_ROLL(vict) < 12) sprintf(buf, "You suddenly feel a cap busted in your ass as %s zooms past!\r\n", ch->in_veh->short_description); else sprintf(buf, "A hail of bullets flies from %s as it zooms past!\r\n", ch->in_veh->short_description); send_to_char(vict, buf); for (int i = 2; i > 0; i--) { for (pass = list; pass && vict->in_room == ch->in_veh->in_room; pass = pass->next_fighting) { if (GET_INIT_ROLL(pass) >= 0) { hit(pass, vict, TYPE_UNDEFINED); GET_INIT_ROLL(pass) -= 10; } } } for (;list ; list = pass) { pass = list->next_fighting; list->next_fighting = NULL; } if (GET_INIT_ROLL(vict) >= 12) { if (GET_EQ(vict, WEAR_WIELD) && GET_OBJ_VAL(GET_EQ(vict, WEAR_WIELD),4) >= SKILL_FIREARMS) { sprintf(buf, "You swing around and take aim at %s.\r\n", ch->in_veh->short_description); send_to_char(vict, buf); sprintf(buf, "%s swings around and takes aim at your ride.\r\n", GET_NAME(vict)); send_to_veh(buf, ch->in_veh, NULL, TRUE); vcombat(vict, ch->in_veh); } } if (ch->in_veh) move_vehicle(ch, dir); } ACMD(do_speed) { struct veh_data *veh; int i = 0; if (!(AFF_FLAGGED(ch, AFF_PILOT) || PLR_FLAGGED(ch, PLR_REMOTE))) { send_to_char("You must be driving a vehicle to do that.\r\n", ch); return; } one_argument(argument, buf); if (!*buf) { send_to_char("What speed?\r\n", ch); return; } switch (LOWER(*buf)) { case 'i': i = 1; break; case 'c': i = 2; break; case 's': i = 3; break; case 'm': i = 4; break; default: send_to_char("That is not a valid speed.\r\n", ch); return; break; } RIG_VEH(ch, veh); if (i < veh->cspeed) { if (i == 1) { send_to_char("You bring the vehicle to a halt.\r\n", ch); send_to_veh("The vehicle slows to a stop.\r\n", veh, ch, FALSE); } else { send_to_char("You put your foot on the brake.\r\n", ch); send_to_veh("You slow down.", veh, ch, FALSE); } } else if (i > veh->cspeed) { send_to_char("You put your foot on the accelerator.\r\n", ch); send_to_veh("You speed up.", veh, ch, FALSE); } else { send_to_char("But you're already travelling that fast!\r\n", ch); return; } veh->cspeed = i; } ACMD(do_chase) { struct veh_data *veh, *tveh; struct veh_follow *k; struct char_data *vict; if (!(AFF_FLAGGED(ch, AFF_PILOT) || PLR_FLAGGED(ch, PLR_REMOTE))) { send_to_char("You have to be controlling a vehicle to do that.\r\n", ch); return; } RIG_VEH(ch, veh); if (veh->following) { sprintf(buf, "You stop following a %s.\r\n", veh->following->short_description); stop_chase(veh); send_to_char(buf, ch); return; } else if (veh->followch) { sprintf(buf, "You stop following %s.\r\n", GET_NAME(veh->followch)); veh->followch = NULL; send_to_char(buf, ch); return; } two_arguments(argument, arg, buf2); if (!*arg) { send_to_char("Chase what?\r\n", ch); return; } if (!(tveh = get_veh_list(arg, world[veh->in_room].vehicles)) && !(vict = get_char_room(arg, veh->in_room))) { send_to_char("You don't see that here.\r\n", ch); return; } if (tveh == veh) { send_to_char(ch, "You cannot chase yourself.\r\n"); return; } if (tveh) { sprintf(buf, "You start chasing %s.\r\n", tveh->short_description); send_to_char(ch, buf); veh->following = tveh; veh->dest = NOWHERE; k = new veh_follow; k->follower = veh; if (tveh->followers) k->next = tveh->followers; tveh->followers = k; if (veh->cspeed == SPEED_IDLE) { send_to_char(ch, "You put your foot on the accelarator.\r\n"); send_to_veh("You speed up.\r\n", veh, ch, FALSE); veh->cspeed = SPEED_CRUISING; } } else if (vict) {} } ACMD(do_target) { struct char_data *vict = NULL; struct veh_data *veh, *tveh = NULL; struct obj_data *obj; bool modeall = FALSE; int j; RIG_VEH(ch, veh); if (!veh) { send_to_char("You must be in a vehicle to do that.\r\n", ch); return; } if (!veh->mount) { send_to_char("There is nothing to target.\r\n", ch); return; } two_arguments(argument, arg, buf2); if (!*arg) { send_to_char("Target what at who?\r\n", ch); return; } if (*arg && *buf2) { if (!(AFF_FLAGGED(ch, AFF_RIG) || PLR_FLAGGED(ch, PLR_REMOTE))) { send_to_char("But you aren't piloting this vehicle.\r\n", ch); return; } if ((j = atoi(arg)) < 0) { send_to_char("Target mount number what?\r\n", ch); return; } for (obj = veh->mount; obj; obj = obj->next_content) if (--j < 0) break; if (!obj) { send_to_char("There aren't that many mounts.\r\n", ch); return; } if (!obj->contains) { send_to_char("It has no weapon mounted.\r\n", ch); return; } strcpy(arg, buf2); } else { if (!(AFF_FLAGGED(ch, AFF_RIG) || PLR_FLAGGED(ch, PLR_REMOTE) || AFF_FLAGGED(ch, AFF_MANNING))) { send_to_char("You don't have control over any mounts.\r\n", ch); return; } if (AFF_FLAGGED(ch, AFF_MANNING)) { for (obj = veh->mount; obj; obj = obj->next_content) if (obj->worn_by == ch) break; } else { for (j = 0, obj = veh->mount; obj; obj = obj->next_content) if (obj->contains && !obj->worn_by) j++; if (!j) { send_to_char("You have nothing to target.\r\n", ch); return; } modeall = TRUE; } } if (!(vict = get_char_room(arg, veh->in_room)) && !(tveh = get_veh_list(arg, world[veh->in_room].vehicles))) { send_to_char(ch, "You don't see %s there.\r\n", arg); return; } if (tveh == veh) { send_to_char("Why would you want to target yourself?", ch); return; } if (FIGHTING(ch) || FIGHTING_VEH(ch)) stop_fighting(ch); if (modeall) { for (obj = veh->mount; obj; obj = obj->next_content) if (obj->contains && !obj->worn_by) if (vict) { set_fighting(ch, vict); if (obj->tveh) obj->tveh = NULL; obj->targ = vict; set_fighting(vict, veh); sprintf(buf, "You target %s towards %s.\r\n", GET_OBJ_NAME(obj->contains), PERS(vict, ch)); send_to_char(buf, ch); } else { set_fighting(ch, tveh); if (obj->targ) obj->targ = NULL; obj->tveh = tveh; sprintf(buf, "You target %s towards %s.\r\n", GET_OBJ_NAME(obj->contains), tveh->short_description); send_to_char(buf, ch); } return; } if (vict) { set_fighting(ch, vict); if (obj->tveh) obj->tveh = NULL; obj->targ = vict; set_fighting(vict, veh); act("You target $o towards $N.", FALSE, ch, obj->contains, vict, TO_CHAR); if (AFF_FLAGGED(ch, AFF_MANNING)) { sprintf(buf, "%s's %s swivels towards you.\r\n", ch->in_veh->short_description, GET_OBJ_NAME(obj)); send_to_char(buf, vict); } } else { set_fighting(ch, tveh); if (obj->targ) obj->targ = NULL; obj->tveh = tveh; sprintf(buf, "You target %s towards %s.\r\n", GET_OBJ_NAME(obj->contains), tveh->short_description); send_to_char(buf, ch); if (AFF_FLAGGED(ch, AFF_MANNING)) { sprintf(buf, "%s's %s swivels towards your ride.\r\n", ch->in_veh->short_description, GET_OBJ_NAME(obj)); send_to_veh(buf, tveh, 0, TRUE); } } } ACMD(do_mount) { int i = 0; struct veh_data *veh; struct obj_data *obj; RIG_VEH(ch, veh); if (!veh) { send_to_char("You must be in a vehicle to use that.\r\n", ch); return; } sprintf(buf, "%s is mounting the following:\r\n", CAP(veh->short_description)); send_to_char(buf, ch); for (obj = veh->mount; obj; obj = obj->next_content) { sprintf(buf, "%2d) %-20s (Mounting %s)", i, GET_OBJ_NAME(obj), (obj->contains ? GET_OBJ_NAME(obj->contains) : "Nothing")); if (obj->worn_by) sprintf(buf + strlen(buf), " (Manned by %s)", (found_mem(GET_MEMORY(ch), obj->worn_by) ? (found_mem(GET_MEMORY(ch), obj->worn_by))->mem : GET_NAME(obj->worn_by))); strcat(buf, "\r\n"); send_to_char(buf, ch); i++; } } ACMD(do_man) { struct obj_data *mount; int j; if (!ch->in_veh) { send_to_char("But you're not in a vehicle.\r\n", ch); return; } if (AFF_FLAGGED(ch, AFF_PILOT)) { send_to_char(ch, "You can't do that now!\r\n"); return; } if (!*argument && AFF_FLAGGED(ch, AFF_MANNING)) { for (mount = ch->in_veh->mount; mount; mount = mount->next_content) if (mount->worn_by == ch) break; mount->worn_by = NULL; AFF_FLAGS(ch).ToggleBit(AFF_MANNING); act("$n stops manning $o.", FALSE, ch, mount, 0, TO_ROOM); act("You stop manning $o.", FALSE, ch, mount, 0, TO_CHAR); return; } if ((j = atoi(argument)) < 0) { send_to_char("Which mount?", ch); return; } for (mount = ch->in_veh->mount; mount; mount = mount->next_content) if (--j < 0) break; if (!mount) { send_to_char("There are not that many mounts?\r\n", ch); return; } if (!mount->contains) { send_to_char("But there is no weapon mounted there.\r\n", ch); } if (mount->worn_by) { send_to_char("Someone is already manning it.\r\n", ch); return; } mount->worn_by = ch; act("$n mans $o.", FALSE, ch, mount, 0, TO_ROOM); act("You man $o.", FALSE, ch, mount, 0, TO_CHAR); AFF_FLAGS(ch).ToggleBit(AFF_MANNING); } ACMD(do_gridguide) { struct veh_data *veh; struct grid_data *grid = NULL; vnum_t x = 0, y = 0; RIG_VEH(ch, veh); if (!veh) { send_to_char("You have to be in a vehicle to do that.\r\n", ch); return; } if (!veh->autonav) { send_to_char("You need to have an autonav system installed.\r\n", ch); return; } argument = two_arguments(argument, arg, buf2); if (!*arg) { int i = 0; send_to_char("The following destinations are available:\r\n", ch); for (grid = veh->grid; grid; grid = grid->next) { i++; if (find_first_step(veh->in_room, real_room(grid->room)) < 0) sprintf(buf, "^r%-20s [%-6ld, %-6ld](Unavailable)\r\n", CAP(grid->name), grid->room - (grid->room * 3), grid->room + 100); else sprintf(buf, "^B%-20s [%-6ld, %-6ld](Available)\r\n", CAP(grid->name), grid->room - (grid->room * 3), grid->room + 100); send_to_char(buf, ch); } send_to_char(ch, "%d Entries remaining.\r\n", (veh->autonav * 5) - i); } else if (!*buf2) { if ((veh->cspeed > SPEED_IDLE && !AFF_FLAGGED(ch, AFF_PILOT)) || (veh->locked && GET_IDNUM(ch) != veh->owner) && !PLR_FLAGGED(ch, PLR_REMOTE)) { send_to_char("You don't have control over the vehicle.\r\n", ch); return; } for (grid = veh->grid; grid; grid = grid->next) if (is_abbrev(arg, grid->name)) break; if (!grid) send_to_char("That destination doesn't seem to be in the system.\r\n", ch); else if (find_first_step(veh->in_room, real_room(grid->room)) < 0) send_to_char("That destination is currently unavailable.\r\n", ch); else { veh->dest = real_room(grid->room); veh->cspeed = SPEED_CRUISING; if (AFF_FLAGGED(ch, AFF_PILOT)) AFF_FLAGS(ch).RemoveBits(AFF_PILOT, AFF_RIG, ENDBIT); send_to_veh("The autonav beeps and the vehicle starts to move towards its destination.\r\n", veh, 0, TRUE); } } else if (!str_cmp(arg, "del")) { struct grid_data *temp; for (grid = veh->grid; grid; grid = grid->next) if (!str_cmp(buf2, grid->name)) break; if (!grid) send_to_char("That destination doesn't seem to be in the system.\r\n", ch); else { REMOVE_FROM_LIST(grid, veh->grid, next); send_to_char("You remove the destination from the system.\r\n", ch); act("$n punches something into the autonav.", FALSE, ch, 0 , 0, TO_ROOM); } } else if (!str_cmp(arg, "stop")) { if ((veh->locked && GET_IDNUM(ch) != veh->owner) && !PLR_FLAGGED(ch, PLR_REMOTE)) { send_to_char("You don't have control over the vehicle.\r\n", ch); return; } veh->dest = 0; send_to_veh("The autonav disengages.\r\n", veh, 0, TRUE); if (!AFF_FLAGGED(ch, AFF_PILOT)) veh->cspeed = SPEED_OFF; } else if (!str_cmp(arg, "add")) { int i = 0; for (grid = veh->grid; grid; grid = grid->next) { if (!str_cmp(buf2, grid->name)) { send_to_char("That entry already exists.\r\n", ch); return; } i++; } if (i >= (veh->autonav * 5)) { send_to_char("The system seems to be full.\r\n", ch); return; } if (!*argument) { if (!(ROOM_FLAGGED(veh->in_room, ROOM_ROAD) || ROOM_FLAGGED(veh->in_room, ROOM_GARAGE)) || ROOM_FLAGGED(veh->in_room, ROOM_NOGRID)) { send_to_char("You currently aren't on the grid.\r\n", ch); return; } x = veh->in_room; } else { two_arguments(argument, arg, buf); if (!*buf) { send_to_char("You need a second co-ordinate.\r\n", ch); return; } if (!((x = atoi(arg)) && (y = atoi(buf)))) { send_to_char("Those co-ordinates seem invalid.\r\n", ch); return; } x = (x + ((y - 100) * 3)); if (!(x = real_room(x)) || !(ROOM_FLAGGED(x, ROOM_ROAD) || ROOM_FLAGGED(x, ROOM_GARAGE)) || ROOM_FLAGGED(x, ROOM_NOGRID)) { send_to_char("Those co-ordinates seem invalid.\r\n", ch); return; } } grid = new grid_data; grid->name = str_dup(buf2); grid->room = world[x].number; grid->next = veh->grid; veh->grid = grid; send_to_char("You add the destination into the system.\r\n", ch); act("$n punches something into the autonav.", FALSE, ch, 0 , 0, TO_ROOM); } } void process_autonav(void) { for (struct veh_data *veh = veh_list; veh; veh = veh->next) if (veh->dest && veh->cspeed > SPEED_IDLE && veh->damage < 10) { struct char_data *ch = NULL; if (!(ch = veh->rigger)) ch = veh->people; // Stop empty vehicles if (!ch) { veh->dest = 0; veh->cspeed = SPEED_OFF; } int dir = 0; for (int x = (int)get_speed(veh) / 10; x && dir >= 0 && veh->dest; x--) { dir = find_first_step(veh->in_room, veh->dest); if (dir >= 0) move_vehicle(ch, dir); } if (veh->in_room == veh->dest) { send_to_veh("Having reached its destination, the autonav shuts off.\r\n", veh, 0, TRUE); if (!(ch = veh->rigger)) for (ch = veh->people; ch; ch = ch->next_in_veh) if (AFF_FLAGGED(ch, AFF_PILOT)) break; if (!ch) veh->cspeed = SPEED_OFF; veh->dest = 0; } } }