From b169615080f383d8e748ebc6124bc2bb6ce4961b Mon Sep 17 00:00:00 2001 From: IK3I Date: Sat, 14 May 2016 19:50:07 -0500 Subject: [PATCH] Final changes of the refactor A couple bug fixes might be needed, but it /should/ be ready for live. --- .../computer/pod_tracking_console.dm | 11 +- code/game/machinery/portable_turret.dm | 2 +- code/game/machinery/turrets.dm | 16 +- .../living/simple_animal/hostile/hostile.dm | 4 +- .../hostile/retaliate/retaliate.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/spacepods/equipment.dm | 51 ++-- code/modules/spacepods/spacepod.dm | 265 ++++++++++-------- icons/vehicles/spacepod.dmi | Bin 3194 -> 4134 bytes 9 files changed, 194 insertions(+), 163 deletions(-) diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm index e759cc0357f..371c3af366d 100644 --- a/code/game/machinery/computer/pod_tracking_console.dm +++ b/code/game/machinery/computer/pod_tracking_console.dm @@ -22,13 +22,10 @@ if(my_pod && enabled) var/podname = capitalize(sanitize(my_pod.name)) var/list/chairs = list() - if(my_pod.occupants) - var/mob/pilot = my_pod.occupants[PILOT] - if(my_pod.occupants[PILOT]) - chairs += list("pilot" = pilot.name) - for(var/mob/M in my_pod.occupants) - if(M == pilot) - continue + if(my_pod.pilot || my_pod.passengers) + if(my_pod.pilot) + chairs += list("pilot" = my_pod.pilot.name) + for(var/mob/M in my_pod.passengers) chairs += list("passenger" = M.name) pods.Add(list(list("pod" = "\ref[my_pod]", "name" = podname) + chairs + list("x" = my_pod.x, "y" = my_pod.y, "z" = my_pod.z))) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index c5cd700abaf..eab12bb22d5 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -519,7 +519,7 @@ var/list/turret_icons assess_and_assign(ME.occupant, targets, secondarytargets) for(var/obj/spacepod/SP in view(7,src)) - assess_and_assign(SP.occupants[PILOT], targets, secondarytargets) + assess_and_assign(SP.pilot, targets, secondarytargets) for(var/obj/vehicle/T in view(7,src)) assess_and_assign(T.buckled_mob, targets, secondarytargets) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 022e0d2765e..82060d47bc2 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -21,7 +21,7 @@ turretTargets |= Mech else if( istype(O, /obj/spacepod) ) var/obj/spacepod/Pod = O - if( Pod.occupants ) + if( Pod.pilot ) turretTargets |= Pod else if(istype(O,/mob/living/simple_animal)) turretTargets |= O @@ -139,7 +139,7 @@ return 1 else if( istype(T, /obj/spacepod) ) var/obj/spacepod/SP = T - if( SP.occupants ) + if( SP.pilot ) return 1 else if(istype(T,/mob/living/simple_animal)) var/mob/living/simple_animal/A = T @@ -159,8 +159,8 @@ if(M.occupant) new_targets += M for(var/obj/spacepod/M in protected_area.turretTargets) - if(M.occupants[PILOT]) - new_targets += M.occupants[PILOT] + if(M.pilot) + new_targets += M.pilot for(var/mob/living/simple_animal/M in protected_area.turretTargets) if(!M.stat) new_targets += M @@ -488,7 +488,7 @@ return 1 else if(istype(target, /obj/spacepod)) var/obj/spacepod/S = target - if(S.occupants) + if(S.pilot) return 1 return 0 @@ -522,11 +522,11 @@ continue //Don't shoot at empty mechs. pos_targets += M for(var/obj/spacepod/M in oview(scan_range, src)) - if(M.occupants[PILOT]) - var/mob/P = M.occupants[PILOT] + if(M.pilot) + var/mob/P = M.pilot if(faction in P.faction) continue - if(!M.occupants) + if(!M.pilot) continue //Don't shoot at empty pods. pos_targets += M if(pos_targets.len) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 81a0828df14..6e34ff4b8b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -118,8 +118,8 @@ return 1 if(istype(the_target, /obj/spacepod)) var/obj/spacepod/S = the_target - if(S.occupants) //Just so we don't attack empty pods - for(var/mob/M in S.occupants) + if(S.pilot) //Just so we don't attack empty pods + for(var/mob/M in S.pilot) if(CanAttack(M)) return 1 if(isliving(the_target)) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index e6d373d7504..a58223acb04 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -14,7 +14,7 @@ return A else if(istype(A, /obj/spacepod)) var/obj/spacepod/M = A - if(M.occupants) + if(M.pilot) return A /mob/living/simple_animal/hostile/retaliate/ListTargets() @@ -47,9 +47,9 @@ enemies |= M.occupant else if(istype(A, /obj/spacepod)) var/obj/spacepod/M = A - if(M.occupants[PILOT]) + if(M.pilot) enemies |= M - enemies |= M.occupants[PILOT] + enemies |= M.pilot for(var/mob/living/simple_animal/hostile/retaliate/H in around) var/retaliate_faction_check = 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 09c82dbf1b2..45f2c6789c9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -529,7 +529,7 @@ return 0 if (istype(the_target,/obj/spacepod)) var/obj/spacepod/S = the_target - if (S.occupants) + if (S.pilot) return 0 return 1 diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm index 7ff052d1e6e..9b0655958c3 100644 --- a/code/modules/spacepods/equipment.dm +++ b/code/modules/spacepods/equipment.dm @@ -51,14 +51,19 @@ var/obj/item/device/spacepod_equipment/cargo/cargo_system // cargo system var/obj/item/device/spacepod_equipment/cargo/sec_cargo_system // secondary cargo system var/obj/item/device/spacepod_equipment/lock/lock_system // lock system - //var/obj/item/device/spacepod_equipment/engine/engine_system // engine system - //var/obj/item/device/spacepod_equipment/shield/shield_system // shielding system /datum/spacepod/equipment/New(var/obj/spacepod/SP) ..() if(istype(SP)) my_atom = SP +/datum/spacepod/equipment/proc/get_list() + var/list/stuff + for(var/obj/I in vars) + if(istype(I, /obj/item/device/spacepod_equipment)) + stuff += I + return stuff + /obj/item/device/spacepod_equipment name = "equipment" var/obj/spacepod/my_atom @@ -182,50 +187,36 @@ name = "pod cargo" desc = "You shouldn't be seeing this" icon = 'icons/vehicles/spacepod.dmi' - icon_state = "blank" + icon_state = "cargo_blank" + var/obj/storage = null /obj/item/device/spacepod_equipment/cargo/proc/passover(var/obj/item/I) return /obj/item/device/spacepod_equipment/cargo/proc/unload() // called by unload verb - return + if(storage) + storage.forceMove(get_turf(my_atom)) + storage = null +/obj/item/device/spacepod_equipment/cargo/removed(var/mob/user) // called when system removed + . = ..() + unload() // Ore System /obj/item/device/spacepod_equipment/cargo/ore name = "spacepod ore storage system" desc = "An ore storage system for spacepods. Scoops up any ore you drive over." icon_state = "cargo_ore" - var/obj/structure/ore_box/box /obj/item/device/spacepod_equipment/cargo/ore/passover(var/obj/item/I) - if(box && istype(I,/obj/item/weapon/ore)) - I.forceMove(box) - -/obj/item/device/spacepod_equipment/cargo/ore/unload() - if(box) - box.forceMove(get_turf(my_atom)) - box = null - -/obj/item/device/spacepod_equipment/cargo/ore/removed(var/mob/user) - . = ..() - unload() + if(storage && istype(I,/obj/item/weapon/ore)) + I.forceMove(storage) // Crate System /obj/item/device/spacepod_equipment/cargo/crate name = "spacepod crate storage system" desc = "A heavy duty storage system for spacepods. Holds one crate." - icon_state = "cargo_ore" - var/obj/structure/closet/crate/crate - -/obj/item/device/spacepod_equipment/cargo/crate/unload() - if(crate) - crate.forceMove(get_turf(my_atom)) - crate = null - -/obj/item/device/spacepod_equipment/cargo/crate/removed(var/mob/user) - . = ..() - unload() + icon_state = "cargo_crate" /* /////////////////////////////////////// @@ -233,8 +224,6 @@ /////////////////////////////////////// */ -//Storage system and inventory is handled in cargo_hold.dm - /obj/item/device/spacepod_equipment/sec_cargo name = "secondary cargo" desc = "you shouldn't be seeing this" @@ -245,14 +234,14 @@ /obj/item/device/spacepod_equipment/sec_cargo/chair name = "passanger seat" desc = "A passenger seat for a spacepod" - icon_state = "cargo_ore" + icon_state = "sec_cargo_chair" occupant_mod = 1 // Loot Box /obj/item/device/spacepod_equipment/sec_cargo/loot_box name = "loot box" desc = "A small compartment to store valuables" - icon_state = "cargo_ore" + icon_state = "sec_cargo_loot" storage_mod = list("slots" = 7, "w_class" = 14) /* diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 4fe925ac085..c1c4fc3def9 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -1,6 +1,5 @@ #define DAMAGE 1 #define FIRE 2 -#define PILOT "pilot" /obj/spacepod name = "\improper space pod" @@ -15,8 +14,9 @@ layer = 3.9 infra_luminosity = 15 - var/list/mob/occupants = list() //uses [PILOT] index for pilot and numerics for passangers - var/max_occupants = 1 + var/list/mob/pilot //There is only ever one pilot and he gets all the privledge + var/list/mob/passengers = list() //passengers can't do anything and are variable in number + var/max_passengers = 0 var/obj/item/weapon/storage/internal/cargo_hold var/datum/spacepod/equipment/equipment_system @@ -100,10 +100,10 @@ qdel(ion_trail) ion_trail = null occupant_sanity_check() - if(occupants) - for(var/mob/M in occupants) + if(passengers) + for(var/mob/M in passengers) M.forceMove(get_turf(src)) - occupants -= M + passengers -= M spacepods_list -= src return ..() @@ -113,7 +113,6 @@ else processing_objects.Remove(src) - /obj/spacepod/proc/update_icons() if(!pod_overlays) pod_overlays = new/list(2) @@ -162,28 +161,28 @@ health = max(0, health - damage) var/percentage = (health / initial(health)) * 100 occupant_sanity_check() - if(occupants && oldhealth > health && percentage <= 25 && percentage > 0) + if(passengers && oldhealth > health && percentage <= 25 && percentage > 0) var/sound/S = sound('sound/effects/engine_alert2.ogg') S.wait = 0 //No queue S.channel = 0 //Any channel S.volume = 50 - for(var/mob/M in occupants) + for(var/mob/M in passengers) to_chat(M, S) - if(occupants && oldhealth > health && !health) + if(passengers && oldhealth > health && !health) var/sound/S = sound('sound/effects/engine_alert1.ogg') S.wait = 0 S.channel = 0 S.volume = 50 - for(var/mob/M in occupants) + for(var/mob/M in passengers) to_chat(M, S) if(!health) spawn(0) - if(occupants) - for(var/mob/M in occupants) + if(passengers) + for(var/mob/M in passengers) to_chat(M, "Critical damage to the vessel detected, core explosion imminent!") for(var/i = 10, i >= 0; --i) - if(occupants) - for(var/mob/M in occupants) + if(passengers) + for(var/mob/M in passengers) to_chat(M, "[i]") if(i == 0) explosion(loc, 2, 4, 8) @@ -202,7 +201,7 @@ occupant_sanity_check() switch(severity) if(1) - for(var/mob/M in occupants) + for(var/mob/M in passengers) var/mob/living/carbon/human/H = M if(H) H.forceMove(get_turf(src)) @@ -221,9 +220,11 @@ cargo_hold.emp_act(severity) switch(severity) if(1) - if(occupants) - for(var/mob/M in occupants) - to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the occupants + if(pilot) + to_chat(pilot, "The pod console flashes 'Heavy EMP WAVE DETECTED'.") + if(passengers) + for(var/mob/M in passengers) + to_chat(M, "The pod console flashes 'Heavy EMP WAVE DETECTED'.")//warn the passengers if(battery) @@ -234,9 +235,11 @@ processing_objects.Add(src) if(2) - if(occupants) - for(var/mob/M in occupants) - to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the occupants + if(pilot) + to_chat(pilot, "The pod console flashes 'EMP WAVE DETECTED'.") + if(passengers) + for(var/mob/M in passengers) + to_chat(M, "The pod console flashes 'EMP WAVE DETECTED'.")//warn the passengers deal_damage(40) if(battery) @@ -332,12 +335,33 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment equipment_system.vars[slot] = SPE var/obj/item/device/spacepod_equipment/system = equipment_system.vars[slot] system.my_atom = src - max_occupants += SPE.occupant_mod + max_passengers += SPE.occupant_mod cargo_hold.storage_slots += SPE.storage_mod["slots"] cargo_hold.max_combined_w_class += SPE.storage_mod["w_class"] return /obj/spacepod/attack_hand(mob/user as mob) + if(user.a_intent == I_GRAB && unlocked) + var/mob/target + if(pilot) + target = pilot + else if(passengers.len > 0) + target = passengers[1] + + if(target && istype(target)) + src.visible_message("[user] is trying to rip the door open and pull [target] out of the [src]!", + "You see [user] outside the door trying to rip it open!") + if(do_after(user, 50, target = src)) + target.forceMove(get_turf(src)) + target.Stun(1) + passengers -= target + target.visible_message("[user] flings the door open and tears [target] out of the [src]", + "The door flies open and you are thrown out of the [src] and to the ground!") + else + target.visible_message("[user] was unable to get the door open!", + "You manage to keep [user] out of the [src]!") + return + if(!hatch_open) if(cargo_hold.storage_slots > 0) if(unlocked) @@ -346,7 +370,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment to_chat(user, "The storage compartment is locked") return ..() if(!equipment_system || !istype(equipment_system)) - to_chat(user, "The pod has no equpment datum, or is the wrong type, yell at pomf.") + to_chat(user, "The pod has no equpment datum, or is the wrong type, yell at IK3I.") return var/list/possible = list() if(battery) @@ -388,7 +412,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment /obj/spacepod/proc/remove_equipment(mob/user, var/obj/item/device/spacepod_equipment/SPE, var/slot) - if(occupants.len > max_occupants - SPE.occupant_mod) + if(passengers.len > max_passengers - SPE.occupant_mod) to_chat(user, "Someone is sitting in \the [SPE]!") return @@ -401,7 +425,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment if(user.put_in_any_hand_if_possible(SPE)) to_chat(user, "You remove \the [SPE] from the equipment system.") - max_occupants -= SPE.occupant_mod + max_passengers -= SPE.occupant_mod cargo_hold.storage_slots -= SPE.storage_mod["slots"] cargo_hold.max_combined_w_class -= SPE.storage_mod["w_class"] SPE.removed(user) @@ -459,6 +483,11 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment equipment_system.misc_system = L equipment_system.misc_system.my_atom = src equipment_system.misc_system.enabled = 1 + var/obj/item/device/spacepod_equipment/sec_cargo/chair/C = new /obj/item/device/spacepod_equipment/sec_cargo/chair + C.loc = equipment_system + equipment_system.sec_cargo_system = C + equipment_system.sec_cargo_system.my_atom = src + max_passengers = 1 var/obj/item/device/spacepod_equipment/lock/keyed/K = new /obj/item/device/spacepod_equipment/lock/keyed K.loc = equipment_system equipment_system.lock_system = K @@ -489,12 +518,11 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set category = "Spacepod" set src = usr.loc set popup_menu = 0 - if(usr != src.occupants[PILOT]) - to_chat(usr, "You can't reach the controls from your chair") return use_internal_tank = !use_internal_tank - for(var/mob/M in occupants) - to_chat(M, "Now taking air from [use_internal_tank?"internal airtank":"environment"].") + to_chat(usr, "Now taking air from [use_internal_tank?"internal airtank":"environment"].") return /obj/spacepod/proc/add_cabin() @@ -549,19 +577,20 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment . = t_air.return_temperature() return -/* Save for cargo refactor /obj/spacepod/proc/moved_other_inside(var/mob/living/carbon/human/H as mob) occupant_sanity_check() - if(!occupant2) + if(passengers.len < max_passengers) H.stop_pulling() H.forceMove(src) - occupant2 = H + passengers += H H.forceMove(src) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) return 1 -*/ /obj/spacepod/MouseDrop_T(atom/A, mob/user) + if(user == pilot || user in passengers) + return + if(istype(A,/mob)) var/mob/M = A if(!isliving(M)) @@ -569,61 +598,48 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment occupant_sanity_check() -/* save for cargo refactor - if(M != user && M.stat == DEAD && unlocked) - if(occupant2 && !occupant) - to_chat(usr, "You can't put a corpse into the driver's seat!") + if(M != user && unlocked && (M.stat == DEAD || M.incapacitated())) + if(passengers.len >= max_passengers && !pilot) + to_chat(usr, "That person can't fly the pod!") return 0 - if(!occupant2) + if(passengers.len < max_passengers) visible_message("[user.name] starts loading [M.name] into the pod!") - sleep(10) - moved_other_inside(M) -*/ + if(do_after(user, 50, M)) + moved_other_inside(M) if(M == user) enter_pod(user) - if(istype(A, /obj/structure/ore_box)) // For loading ore boxes - var/obj/structure/ore_box/O = A - if(equipment_system.cargo_system && istype(equipment_system.cargo_system,/obj/item/device/spacepod_equipment/cargo/ore)) - var/obj/item/device/spacepod_equipment/cargo/ore/C = equipment_system.cargo_system - if(!C.box) - to_chat(user, "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]") - if(do_after(user, 40, target = src)) - C.box = O - O.forceMove(C) - to_chat(user, "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!") - else - to_chat(user, "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]") - else - to_chat(user, "\The [src] already has \an [C.box]") + if(istype(A, /obj/structure/ore_box) && equipment_system.cargo_system && istype(equipment_system.cargo_system,/obj/item/device/spacepod_equipment/cargo/ore)) // For loading ore boxes + load_cargo(user, A) - if(istype(A, /obj/structure/closet/crate)) // For loading crates - var/obj/structure/closet/crate/O = A - if(equipment_system.cargo_system && istype(equipment_system.cargo_system, /obj/item/device/spacepod_equipment/cargo/crate)) - var/obj/item/device/spacepod_equipment/cargo/crate/C = equipment_system.cargo_system - if(!C.crate) - to_chat(user, "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]") - if(do_after(user, 40, target = src)) - C.crate = O - O.forceMove(C) - to_chat(user, "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!") - else - to_chat(user, "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]") - else - to_chat(user, "\The [src] already has \an [C.crate]") + if(istype(A, /obj/structure/closet/crate) && equipment_system.cargo_system && istype(equipment_system.cargo_system, /obj/item/device/spacepod_equipment/cargo/crate)) // For loading crates + load_cargo(user, A) + +/obj/spacepod/proc/load_cargo(mob/user, var/obj/O) + var/obj/item/device/spacepod_equipment/cargo/ore/C = equipment_system.cargo_system + if(!C.storage) + to_chat(user, "You begin loading \the [O] into \the [src]'s [equipment_system.cargo_system]") + if(do_after(user, 40, target = src)) + C.storage = O + O.forceMove(C) + to_chat(user, "You load \the [O] into \the [src]'s [equipment_system.cargo_system]!") + else + to_chat(user, "You fail to load \the [O] into \the [src]'s [equipment_system.cargo_system]") + else + to_chat(user, "\The [src] already has \an [C.storage]") /obj/spacepod/proc/enter_pod(mob/user) if (usr.stat != CONSCIOUS) - return + return 0 if(equipment_system.lock_system && !unlocked) to_chat(user, "\The [src]'s doors are locked!") - return + return 0 if(get_dist(src, user) > 2 || get_dist(usr, user) > 1) to_chat(usr, "They are too far away to put inside") - return + return 0 if(!istype(user)) return 0 @@ -652,15 +668,19 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment occupant_sanity_check() - if(occupants.len < max_occupants) + if(passengers.len <= max_passengers) visible_message("[user] starts to climb into \the [src].") if(do_after(user, 40, target = src)) - if(occupants.len < max_occupants) + if(!pilot || pilot == null) user.stop_pulling() - if(!occupants[PILOT]) - occupants[PILOT] = user - else - occupants += user + pilot = user + user.forceMove(src) + add_fingerprint(user) + playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) + return + if(passengers.len < max_passengers) + user.stop_pulling() + passengers += user user.forceMove(src) add_fingerprint(user) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) @@ -672,26 +692,21 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment to_chat(user, "You can't fit in \the [src], it's full!") /obj/spacepod/proc/occupant_sanity_check() // going to have to adjust this later for cargo refactor - if(occupants) - if(occupants.len == max_occupants && !occupants[PILOT]) - var/occ = occupants[1] - occupants -= occ - occupants[PILOT] = occ - log_debug("##SPACEPOD WARNING: IMPOSSIBLE SEATING ARRANGEMENT: OCCUPANTS [english_list(occupants)], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - if(occupants.len > max_occupants) - for(var/i = occupants.len; i <= max_occupants; i--) - var/mob/occupant = occupants[i - 1] + if(passengers) + if(passengers.len > max_passengers) + for(var/i = passengers.len; i <= max_passengers; i--) + var/mob/occupant = passengers[i - 1] occupant.forceMove(get_turf(src)) - log_debug("##SPACEPOD WARNING: OCCUPANTS EXCEED CAP: MAX OCCUPANTS [max_occupants], OCCUPANTS [english_list(occupants)], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupants[i - 1] = null - for(var/mob/M in occupants) + log_debug("##SPACEPOD WARNING: passengers EXCEED CAP: MAX passengers [max_passengers], passengers [english_list(passengers)], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + passengers[i - 1] = null + for(var/mob/M in passengers) if(!ismob(M)) M.forceMove(get_turf(src)) log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [M], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupants -= M + passengers -= M else if(M.loc != src) log_debug("##SPACEPOD WARNING: OCCUPANT [M] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupants -= M + passengers -= M /obj/spacepod/verb/exit_pod() set name = "Exit pod" @@ -702,18 +717,18 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment if(!istype(user)) return - if (usr.stat != CONSCIOUS) // unconscious people can't let themselves out + if (user.stat != CONSCIOUS || user.incapacitated()) // unconscious and restrained people can't let themselves out return occupant_sanity_check() - if(user in occupants) + if(user == pilot) user.forceMove(get_turf(src)) - occupants -= user + pilot = null to_chat(user, "You climb out of \the [src].") - if(user == occupants[PILOT]) + if(user in passengers) user.forceMove(get_turf(src)) - occupants[PILOT] = null + passengers -= user to_chat(user, "You climb out of \the [src].") /obj/spacepod/verb/lock_pod() @@ -721,8 +736,8 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set category = "Spacepod" set src = usr.loc - if(usr in occupants && usr != src.occupants[PILOT]) - to_chat(usr, "You can't reach the controls from your chair") return unlocked = !unlocked @@ -734,8 +749,8 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set category = "Spacepod" set src = usr.loc - if(usr != src.occupants[PILOT]) - to_chat(usr, "You can't reach the controls from your chair") return for(var/obj/machinery/door/poddoor/multi_tile/P in orange(3,src)) @@ -747,6 +762,14 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment else P.close() return 1 + for(var/mob/living/carbon/human/O in passengers) + if(P.check_access(O.get_active_hand()) || P.check_access(O.wear_id)) + if(P.density) + P.open() + return 1 + else + P.close() + return 1 to_chat(usr, "Access denied.") return @@ -759,8 +782,8 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set desc = "Fire the weapons." set category = "Spacepod" set src = usr.loc - if(usr != src.occupants[PILOT]) - to_chat(usr, "You can't reach the controls from your chair") return if(!equipment_system.weapon_system) to_chat(usr, "\The [src] has no weapons!") @@ -772,8 +795,8 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set desc = "Unloads the cargo" set category = "Spacepod" set src = usr.loc - if(usr != src.occupants[PILOT]) - to_chat(usr, "You can't reach the controls from your chair") return if(!equipment_system.cargo_system) to_chat(usr, "\The [src] has no cargo system!") @@ -784,8 +807,8 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set name = "Toggle Lights" set category = "Spacepod" set src = usr.loc - if(usr != src.occupants[PILOT]) - to_chat(usr, "You can't reach the controls from your chair") return lightsToggle() @@ -795,10 +818,32 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment set_light(lights_power) else set_light(0) - for(var/mob/M in occupants) + to_chat(usr, "Lights toggled [lights ? "on" : "off"].") + for(var/mob/M in passengers) to_chat(M, "Lights toggled [lights ? "on" : "off"].") return +/obj/spacepod/verb/checkSeat() + set name = "Check under Seat" + set category = "Spacepod" + set src = usr.loc + var/mob/user = usr + to_chat(user, "You start rooting around under the seat for lost items") + if(do_after(user, 40, src)) + var/obj/badlist = list(internal_tank, cargo_hold, pilot, battery) + equipment_system.get_list() + var/list/true_contents = contents - badlist + if(true_contents.len > 0) + var/obj/I = pick(true_contents) + if(user.put_in_any_hand_if_possible(I)) + src.contents -= I + to_chat(user, "You find a [I] [pick("under the seat", "under the console", "in the mainenance access")]!") + else + to_chat(user, "You think you saw something shiny, but you can't reach it!") + else + to_chat(user, "You fail to find anything of value.") + else + to_chat(user, "You decide against searching the [src]") + /obj/spacepod/proc/enter_after(delay as num, var/mob/user as mob, var/numticks = 5) var/delayfraction = delay/numticks @@ -854,7 +899,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment return /obj/spacepod/relaymove(mob/user, direction) - if(usr != src.occupants[PILOT]) + if(usr != src.pilot) return handlerelaymove(user, direction) diff --git a/icons/vehicles/spacepod.dmi b/icons/vehicles/spacepod.dmi index e55085622c9ad236c0b3fe4ba1eea300de26c9c5..54edb864aba2f28c995cfde7da069596d3991ed9 100644 GIT binary patch literal 4134 zcmZu!c{tS3yZ_D@`_7bYvVn^F1OwIfcu-7E&`R6L2lJR0tzliV zrBQ_q&x=0%BhKR}Oj@6Ta+w7!SE}I}1eMQAlyDnV9Z& zm|B7wtoWn!x-tA^1LiHh`e!?kO-CwJVzFe6bW=-=aA6n# zFkjZuxNYqJZX?t3E{wp1J6FPkd;DfCdMe^17vk)b<$Hwd<|3hle5)Hnnw3A~19W(~ zb^CQc__`Xto)b#dhUMkQ><)fbynmrM<^;hVH8G}dj%Vz6ZUF+Pd(k!|ggNH)tV=X| zuXK7vV(p$|$FV5)#SQT=ggjpy<2$#^IAptyE8@ z#jK*wast8)jN}p3G-itji>`huE@uDbR^Oo4`@vBq+aQ^lffezdU*UFuQO$42EpzeX zrly;@H8oICQBhme#YAmLqPB)#-`-vgnzd_+lEtKH$_;z1)c)`0)KzhDBnri~ySrN= z?=Gr)!{%w`&WY3eJHShg%a7dM73TA6l2TJ6$H!5+uEH{_kQcWB^XU_EGrZHz%C~2V zGQY6UAuy2JOh5BWMsKfwu@PhA4nrr#5rtm|BgmHD>5F`sk@C;N?XMBUE7!alS)w(z zhf-8t#WUEQQdmkIowCSOPo=}odHBLU~m~}>;4jPzDbzb7~**=f&2**Mh3Si3x{cMv$R*izh^2%y?X~M9a%0YE7RW& zY?)SMg5h#=b3p+C0S#NNB)Af_XqfF(S7Ac~r$m}AwApK#g9ai;_!Pjc^lw&^fnb>*2w|%%}Wuyuq3?vSY!haB%Ot(zd_y^41nEQ|T$Zni(jT{UNQS^f($= zU0n@7CH)l?6jX<8EnnIf8-fE-ogjHw&v{Qzm(1lbjoTX2UXAej%+ypgw)D-LN9}PV zQ!CD=7$%TnrvA3KpsgrxycU6W`MDiu-(5XBw96fITVWwJqNba(<*IP0cMuvvDONZ% zJ|6AfdZc+Wr5$wVtIyLw=%5OW!Yr zs|h@Ga*7rA^!Mk?%*>3O9PS+{HUlAygnq&?-N&DspKiI7-ce8*O{Il zB*PYISAp*5-ht7WmQYGDyg=|{W@l%S@#FRGd|@5@78Vvi3B^kf(N{#eH_C1-oRfMO zZ<(xw*|GhFl157{Ik~x$Qc%~~zYYx8?A5ons_gCWJC_-mK@R(aw!Zb2xSocaJSIq7 zbwG{!I9(-8M@CW^ZHTU{tVDBB?h=X8qR#0q(k1j2;3}$wq@=LI$B(;fft5y73w(XY zUrJ6c+`a8|)W_1w$}0A3lt75WV!5CfFS-;NRReE~Sj4iw+&Y?1*4EQQnwfFbxsG4< zR`L9N0X$XXoV+4$pO}$xO_SddS^)=ZXMaXrI9^*_g~a1t)YQm%7K!+(unOa={>=>v zYIcryQg9th7`)0EOZI@R)XT?&GV&GaRRjHbqF&X}MEaPR8q-|*!eP;}Q1@So=ku{k z0k7iXVn}HcRxFVme)0$F<9VN~^}yRl&*I3Z zA3AzC@7~SOzTyK;P~uDH5E>vJ&c;gK4V6}3A>(>nSZm3Yg@H<1M&^CvIkk@lkUg-} z;I%-9IU2PwG!74IEc8Nmc*6djRqXA%caQ<1hayZ@!jKDDGU&c9OCwzG{)dX?62&qq zj>BV^ zozm9(BjCz(0n@Kj6v0ntXk?TZ`1`zv#~t3R|6Uhx`W@~~p|x_O_CmLX zFLA@Zt)M{j87;DuSo=&?$AshGT9jV*TqLs`Uk9n<$_~C^4D=M!>Yk}nBB+#mRbH>_ z;y)-j*w$F?>ll(^iG8vI&cTRo+IUVfFOL!q1N1=iuzw-Vg|Z4 z&+%u0%E#5ghf4$wP+wFBwprFQbF9Vfd@mvdXkXl88s4C2k7gIS_~z2BK)KC86D>^3 zg7t#~g5=n5;#YQ-#U$B2Zp@VKL6rJXtKVeZ$IS2g(?g98eH8{@8ZDfv;bI|oG#N8S zLE7{U>*cuLUgex%+8>~V#2GUe)tWj60U%z*iV9#cd)V6gsOfaZkoMZOYhAaoyXsK% zxQLx~22l$Q=_SmdQm;EP@sd_e5a*lWTn7d=%UVbz z<(0+OyE5|fk(HIwQVb5q`=MtOk7p0qMf9f!mf~Yc)O_Vhmx`}@nxp`VsS!qw<|~&r zyB7PNsk2{KOhuA5_&^TyTBGEokvc|=iH@cn;`MB0%iE}i$J%_S#muXm*llIo^YSo7 zbySrUz(q~yZ^M<^00Bl){+6)FsM4=!J|_;YvmLa3+rezNaJ=kf>(3*^9_gfw6j1kx zFd(*B$(F>g7U!)9O0d{`80Lf;#54**8TsQF_6pbi~E9fz--KfV!Xx$S$=QDK-sppLZT9lT%e z0($VI5tBJ7rqTJ3R2&){SC#!H7RUH!we$72XL=&Jk#;{QkX|0uPHy1Ayx@AJ*0u7J`L zv$I|qo0%26L27GjBNf1c8^sqfsH2r{n!diZ735?F3_Yb-TU(pi54>k%!+f6!= zv9lTBZ0|eSd-%So$%0HszV`Nlft><&5tfX%Zyia0t4!IM1Bc8{og# z1q3uA&bXX)Cw4JMZ{aQDC=}|En_FsaSJ2d1k`?B{(Mn*z`Nr@UeEH|)1h=%bGef8dXHeT8ulD~`dtqROg@Vgtgh0Ueerv6Hu)-iHHF;JAewpHW)wgxmYG32W#I--= zDnX`op#`5G3<`n~A>I_vG3yEo*+nAaLtmfgpbmV+A&G4x$ycpI7LZySYg!QoDyMe= z%mg8x4ybUTu9%xX@vNn0$~kBUd8+a*=~^0VYEsF_$N(DdA&!n84&Tbad7fhru9s3U zFf+$at`W-P173}u__Qb=ZcF%BxoZ;k(YeQCv{8Syv>re9VL(KJOiWC+NvClIR?R@0 zszlIz5$*bZzYsWSCP@+me7e*;S64n^)OAFTNn}pleR!xye$*UK$qqN>Q<^#4Eq*-v z=+D+)rJ|yuha}AjK?Tdeybm*D>%N%Y-aGGtHWZ~4elxXg3rhtmOOWt>Ad5`r5kAxJ zeSKXb*&$a-tXnKhH~*3@&1VnE>x@~I+`Xx)AjtOc;X~W=V%!i_4r6<@k;q&fUpstCZV2iJhL4Hl~2`fFP8vV}q=^qpJ%7)<#Py zSVBXZto^p&-oOwnxcXjP6Nh>rF(o@*`pa43S!V+JYkdo}EtpJ5>L(fNC&h36d3mzu z&&kP&siK#npA9#+=XdPw<`(3GTv}0mRllnrLwfR3^SS> z7kuREszLm4s#H-8v|f*hk1y#s zGt-)@GZ^knn~B=n)q?*^roo~={{sqj4sDo%Pj+zZ!E|+zn*S&D{x3iYa#BO_+M+$V zC?NWKd?9CSfdv21(GGO(o;XHh31`%I+k_)w`NTga051059msut!_{A(U)>vb_jM}! zcF_MdzA*hoku*k*Rc+p$nl6*qf?HQa-{7WfVeu zk#z0rWRp9~Z0%7T)Q%+6MV!$qWD3BR$!8$VJi>~&7RGU~&~?(^M;>*f>lRh|1Cyql zS2tAy48?&39L@8OM2Fz~!B_vZA1$c)`Lr5Dj}SDpq?DAD_cW_(YtDEB8DmMvC)8x& qcLSBw3xMw`GtaSp&VLA6#L(p;fiCUEgs literal 3194 zcmV-=42AQFP)V=-0C=2@&N~i+Fc1XL+CIe!`Y6BFO$3Tuz!i|e8?g8ot(TzOJ_RUUgu5B( z?P^kZTWl298OQ%K>l=k8DDn~;4Aj^dD?r*{*9C{N z$O(k5l87p(m++LAMrvLvEs2bZQ4%bH60brPMQWeOOHdzpXi9K#fZ&bXCZ?u{wOL>4 zOIT#5wiBDMcrTt?AJ%6wJKpuqnVpLl<|kR+IXgSwneRK_cg~#o&J5Gp*$D^xVC}BJ zgTRp^N2DW1j!1fb`#=~V7X{c&f!!6zXZ(J@1OVmb%zuzyFmzSfw zyj)g*l{7XsqOPtE4Gj&bs;Z*?eO`Nj-|v^|>goUh9LFIT4BAqU;^JZ?5(!$PLtN*oL8SA4oaRaTp5s>8=zFu~^I!Iq48ZF{joK zP=+9-@_CL+QGU&aZQwahR({QfZ8=pe9qBq;j^hxI#|@X2tsVf--`|h#zWWXUbQ?mm z2dI@#l&n^^S;{B8_~MIjxm=JW2|Ul^lTSWDWo4yl^3?eKe(B)BgAfD(f*_#1y&Y9m zRe0o)M|2%elLwqVeOMw&)vA1+7j#u98!XG>{F`s$@5hfr6h(NwUW|>6;i*?&HAP;g zI$UXML+5+%!Rz&6WMl;Q?%mUMtgIeDI$U*3C)>($r7=b)`gK((8w|sMpPxtMn{VVY zuh)zA_I6X`X@SVEt*xd0t>zH)i~YZWAn*VHflvNV#FHIhS9eFszC+l+e!{B99$Qq#^L$1R&4eZckhniHGlTK*aR88&uVyIRhYjxP zMMg0S+7mPqat%;WP=H^aJSkrbDCh8d=8k-a)ZUCF`<$pdy!;d|3X?S`VgR|A^v>ulR zpU=nm{eEfBo;?7PBcIJ%wpcO(B4JjkeBk>AA&MfdUcE}Cd_bcC{`v1q*!{ET03_#v z2pl($y6wAh?PdS~@YVkYO>6lCr4dN$C;wNiT4kDCK@hNU&dK2>11d;n-@ zXn@P*!u2kEiKZH9XpoXhvPW(_V((o&~lbfC@d_L?*Zp}Pg-*y zpgehw<1+sB_V!}?_U$=UYB|bR^5LgJ{P}|ZReT>JJujDQ0Zla}VWzOK zP%a}Q5_LL8x{zT6METdRUq@YC9j2zHP+D4QnS8?Z^faQ;DAuoEFPG)g5o?-sY5jjZPn@ZP8|@ug@HMJ-c84lKb-eXa1P6ay-xL z&JxQce<=ef^Ks0OpAE0qi`%zvONMUed%hQZj_m|+uPq9`IB zkIT>GAx}psEiJV~ema!lCs%Untpq`k4a4(11VJ$MsEni8x(4+Sm5ricTV8ux-XZdQ>2Dp3oF6QUw z<<+7jO_3&JE^o7=t%fWLQO>%?<8j=)c~jojld9-sMNr`L`55KYIO&IcJ|Cm^ro3YS zN|Z(*1_<`NA?eMMb_}2cpU=m%x3|kPpvv_Ew8wJtf^5d|0Gn|PU^CRiQ1ydTGnM5F zd-v|ORlef^Hbd13YgwJHcRXwtc6)&45Ja9-UQkdVKQCFGC>4oBbY}-VtWbrZrIhcW z52{X>JSbbO{6r$L=w7LVHmD3h(y~ALd>B*Xx3Om3M$CSF8}71l%uaocN7q!~C+V|A z95O&X4E^v*@{z=4YbyXrfV(VtoAA*!6-)ihAp=wfh(@CeX?aRWe``&O;DZL00s8y< zQCnM!nwlE<`DvRrZA#fE7z{ciAquDrP+MDz!oos11w`HPMx#;VYNmk?-aR7$z-zC+ zA{*P|@yORIfk0r{Hv&xt@caGJ^UptziHQkW$##!=K6v+xL=;axdpsWL)TvYQKF!U| z(sDNfl?RXvwR9=rRD3v~dXrzds$=(%$#+h;uDae#A7Zf>y1Tm#soYXL z@zgGaZhV2zjW495$6J{|Ab_5pWFJ7ff#&9B1Ofr3bJs2)5HP(?dZ6k9s;jFrE(s!; zVe8hJni-hF(c`VmzrMVdGU{n=Zhr7aK}rS&2GV*#b#*mn6)#pW8@JnykI!F_)Yl>T zpmZfveLyG_%J|*z@Nmi!A}dfUKOdp;fTE%zc@(7f0;@fsac2Y5d#hiHL?V{SGy_9Y z6Qj{6VzC&mUAqRBWmDFYnaSwrXx@8)<`5)FQpz>Jz`%g~G6OK1SIds`j` g9{LqBb|>flAITV7_NQ*YH2?qr07*qoM6N<$f|H;NjsO4v