diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 33756215179..8df9e3ae6c7 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -170,6 +170,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismecha(A) (istype(A, /obj/vehicle/sealed/mecha)) +#define ismedicalmecha(A) (istype(A, /obj/vehicle/sealed/mecha/medical)) + #define ismopable(A) (A && (A.layer <= HIGH_SIGIL_LAYER)) //If something can be cleaned by floor-cleaning devices such as mops or clean bots #define isorgan(A) (istype(A, /obj/item/organ)) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index b405569d67a..9013086f435 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -624,7 +624,7 @@ /// Only moves the object if it's under no gravity /atom/movable/proc/newtonian_move(direction) - if(!loc || Process_Spacemove(0)) + if(!isturf(loc) || Process_Spacemove(0)) inertia_dir = 0 return FALSE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index b64715a19ec..36ab052467d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -918,7 +918,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp // Ghosts have no momentum, being massless ectoplasm /mob/dead/observer/Process_Spacemove(movement_dir) - return 1 + return TRUE /mob/dead/observer/vv_edit_var(var_name, var_value) . = ..() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d75260cad46..030f7461d17 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -268,7 +268,8 @@ * You can move in space if you have a spacewalk ability */ /mob/Process_Spacemove(movement_dir = 0) - if(HAS_TRAIT(src, TRAIT_SPACEWALK) || ..()) + . = ..() + if(. || HAS_TRAIT(src, TRAIT_SPACEWALK)) return TRUE var/atom/movable/backup = get_spacemove_backup() if(backup) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index ed4013783aa..2656cc0355c 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -43,7 +43,7 @@ SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name) /obj/item/ammo_casing/update_icon() - ..() + . = ..() icon_state = "[initial(icon_state)][BB ? "-live" : ""]" desc = "[initial(desc)][BB ? "" : " This one is spent."]" @@ -94,7 +94,7 @@ /obj/item/ammo_casing/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) bounce_away(FALSE, NONE) - . = ..() + return ..() /obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3) if(!heavy_metal) diff --git a/code/modules/projectiles/ammunition/special/syringe.dm b/code/modules/projectiles/ammunition/special/syringe.dm index 1133f113421..8486c700781 100644 --- a/code/modules/projectiles/ammunition/special/syringe.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -21,7 +21,16 @@ D.piercing = S.proj_piercing SG.syringes.Remove(S) qdel(S) - ..() + else if(istype(loc, /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun)) + var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/syringe_gun = loc + var/obj/item/reagent_containers/syringe/loaded_syringe = syringe_gun.syringes[1] + var/obj/projectile/bullet/dart/shot_dart = BB + syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transfered_by = user) + shot_dart.name = loaded_syringe.name + shot_dart.piercing = loaded_syringe.proj_piercing + LAZYREMOVE(syringe_gun.syringes, loaded_syringe) + qdel(loaded_syringe) + return ..() /obj/item/ammo_casing/chemgun name = "dart synthesiser" @@ -39,7 +48,7 @@ CG.reagents.trans_to(BB, 15, transfered_by = user) BB.name = "chemical dart" CG.syringes_left-- - ..() + return ..() /obj/item/ammo_casing/dnainjector name = "rigged syringe gun spring" @@ -59,4 +68,4 @@ var/obj/projectile/bullet/dnainjector/D = BB S.forceMove(D) D.injector = S - ..() + return ..() diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index f181d15020f..400dde4a51f 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -589,7 +589,7 @@ /obj/vehicle/sealed/mecha/Process_Spacemove(movement_dir = 0) . = ..() if(.) - return TRUE + return var/atom/movable/backup = get_spacemove_backup() if(backup) diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index e914c4bea9b..bbd2a030fc9 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -7,19 +7,20 @@ . = ..() START_PROCESSING(SSobj, src) -/obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/vehicle/sealed/mecha/medical/M) - if(..() && istype(M)) - return 1 - - -/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/M) - ..() - START_PROCESSING(SSobj, src) - /obj/item/mecha_parts/mecha_equipment/medical/Destroy() STOP_PROCESSING(SSobj, src) return ..() +/obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/vehicle/sealed/mecha/M) + . = ..() + if(!ismedicalmecha(M)) + return FALSE + + +/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/M) + . = ..() + START_PROCESSING(SSobj, src) + /obj/item/mecha_parts/mecha_equipment/medical/process() if(!chassis) return PROCESS_KILL @@ -36,51 +37,53 @@ energy_drain = 20 range = MECHA_MELEE equip_cooldown = 20 + salvageable = FALSE var/mob/living/carbon/patient = null var/inject_amount = 10 - salvageable = 0 /obj/item/mecha_parts/mecha_equipment/medical/sleeper/Destroy() for(var/atom/movable/AM in src) AM.forceMove(get_turf(src)) return ..() -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Exit(atom/movable/O) - return 0 +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Exit(atom/movable/O)//prevents them from leaving without being forcemoved I guess + return FALSE -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, mob/living/carbon/target, params) - if(!action_checks(target)) +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, atom/atomtarget, params) + if(!action_checks(atomtarget)) return - if(!istype(target)) + if(!iscarbon(atomtarget)) return + var/mob/living/carbon/target = atomtarget if(!patient_insertion_check(target)) return to_chat(source, "[icon2html(src, source)]You start putting [target] into [src]...") chassis.visible_message("[chassis] starts putting [target] into \the [src].") - if(do_after(source, equip_cooldown, target=target)) - if(!chassis || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) - return - if(!patient_insertion_check(target, source)) - return - target.forceMove(src) - patient = target - START_PROCESSING(SSobj, src) - update_equip_info() - to_chat(source, "[icon2html(src, source)][target] successfully loaded into [src]. Life support functions engaged.") - chassis.visible_message("[chassis] loads [target] into [src].") - log_message("[target] loaded. Life support functions engaged.", LOG_MECHA) - return ..() + if(!do_after(source, equip_cooldown, target=target)) + return + if(!chassis || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) + return + if(!patient_insertion_check(target, source)) + return + target.forceMove(src) + patient = target + START_PROCESSING(SSobj, src) + update_equip_info() + to_chat(source, "[icon2html(src, source)][target] successfully loaded into [src]. Life support functions engaged.") + chassis.visible_message("[chassis] loads [target] into [src].") + log_message("[target] loaded. Life support functions engaged.", LOG_MECHA) + return ..() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/patient_insertion_check(mob/living/carbon/target, mob/user) if(target.buckled) to_chat(user, "[icon2html(src, user)][target] will not fit into the sleeper because [target.p_theyre()] buckled to [target.buckled]!") - return + return FALSE if(target.has_buckled_mobs()) to_chat(user, "[icon2html(src, user)][target] will not fit into the sleeper because of the creatures attached to it!") - return + return FALSE if(patient) to_chat(user, "[icon2html(src, user)]The sleeper is already occupied!") - return + return FALSE return TRUE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/go_out() @@ -197,7 +200,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/inject_reagent(datum/reagent/R,obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG) if(!R || !patient || !SG || !(SG in chassis.equipment)) - return 0 + return var/to_inject = min(R.volume, inject_amount) if(to_inject && patient.reagents.get_reagent_amount(R.type) + to_inject <= inject_amount*2) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Injecting [patient] with [to_inject] units of [R.name].") @@ -205,22 +208,20 @@ log_combat(chassis.occupants, patient, "injected", "[name] ([R] - [to_inject] units)") SG.reagents.trans_id_to(patient,R.type,to_inject) update_equip_info() - return /obj/item/mecha_parts/mecha_equipment/medical/sleeper/update_equip_info() - if(..()) - if(patient) - send_byjax(chassis.occupants,"msleeper.browser","lossinfo",get_patient_dam()) - send_byjax(chassis.occupants,"msleeper.browser","reagents",get_patient_reagents()) - send_byjax(chassis.occupants,"msleeper.browser","injectwith",get_available_reagents()) - return 1 - return + . = ..() + if(. && patient) + send_byjax(chassis.occupants,"msleeper.browser","lossinfo",get_patient_dam()) + send_byjax(chassis.occupants,"msleeper.browser","reagents",get_patient_reagents()) + send_byjax(chassis.occupants,"msleeper.browser","injectwith",get_available_reagents()) /obj/item/mecha_parts/mecha_equipment/medical/sleeper/container_resist_act(mob/living/user) go_out() /obj/item/mecha_parts/mecha_equipment/medical/sleeper/process(delta_time) - if(..()) + . = ..() + if(.) return if(!chassis.has_charge(energy_drain)) log_message("Deactivated.", LOG_MECHA) @@ -247,29 +248,36 @@ ///////////////////////////////// Syringe Gun /////////////////////////////////////////////////////////////// +#define FIRE_SYRINGE_MODE 0 +#define ANALYZE_SYRINGE_MODE 1 /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun name = "exosuit syringe gun" desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur." icon = 'icons/obj/guns/projectile.dmi' icon_state = "syringegun" - var/list/syringes - var/list/known_reagents - var/list/processed_reagents - var/max_syringes = 10 - var/max_volume = 75 //max reagent volume - var/synth_speed = 2.5 //[num] reagent units per second - energy_drain = 10 - var/mode = 0 //0 - fire syringe, 1 - analyze reagents. range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 10 + energy_drain = 10 + ///Lazylist of syringes that we've picked up + var/list/syringes + ///List of all scanned reagents, starts with epinephrine and multiver + var/list/known_reagents + ///List of reagents we want to be creating this processing tick + var/list/processed_reagents + ///Maximu amount of syringes we can hold + var/max_syringes = 10 + ///Maximum volume of reagents we can hold + var/max_volume = 75 + ///Reagent amount in units we produce per two seconds + var/synth_speed = 2.5 + ///Chooses what kind of action we should perform when clicking + var/mode = FIRE_SYRINGE_MODE // fire syringe or analyze reagents. /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize() . = ..() create_reagents(max_volume, NO_REACT) - syringes = new known_reagents = list(/datum/reagent/medicine/epinephrine="Epinephrine",/datum/reagent/medicine/c2/multiver="Multiver") - processed_reagents = new /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() STOP_PROCESSING(SSobj, src) @@ -280,17 +288,16 @@ return ..() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/vehicle/sealed/mecha/medical/M) - if(..()) - if(istype(M)) - return 1 - return 0 + . = ..() + if(!istype(M)) + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/get_equip_info() - var/output = ..() + var/output = ..()// no . = here to avoid obfuscation if(output) - return "[output] \[[mode? "Analyze" : "Launch"]\]
\[Syringes: [syringes.len]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]
Reagents list" + return "[output] \[[mode? "Analyze" : "Launch"]\]
\[Syringes: [LAZYLEN(syringes)]/[max_syringes] | Reagents: [reagents.total_volume]/[reagents.maximum_volume]\]
Reagents list" -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(mob/source, atom/movable/target, params) +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(mob/source, atom/target, params) if(!action_checks(target)) return if(istype(target, /obj/item/reagent_containers/syringe)) @@ -299,62 +306,23 @@ for(var/obj/item/reagent_containers/syringe/S in target.contents) load_syringe(S, source) return - if(mode) + if(mode == ANALYZE_SYRINGE_MODE) return analyze_reagents(target, source) - if(!syringes.len) + //we're in syringe mode so lets do syringe stuff + if(!LAZYLEN(syringes)) to_chat(source, "[icon2html(src, source)]No syringes loaded.") return if(reagents.total_volume<=0) to_chat(source, "[icon2html(src, source)]No available reagents to load syringe with.") return if(HAS_TRAIT(source, TRAIT_PACIFISM)) - to_chat(source, "The [src] is lethally chambered! You don't want to risk harming anyone...") + to_chat(source, "The [src] might be lethally chambered! You don't want to risk harming anyone...") return - var/turf/trg = get_turf(target) - var/obj/item/reagent_containers/syringe/mechsyringe = syringes[1] - mechsyringe.forceMove(get_turf(chassis)) - reagents.trans_to(mechsyringe, min(mechsyringe.volume, reagents.total_volume), transfered_by = source) - syringes -= mechsyringe - mechsyringe.icon = 'icons/obj/chemical.dmi' - mechsyringe.icon_state = "syringeproj" - playsound(chassis, 'sound/items/syringeproj.ogg', 50, TRUE) - log_message("Launched [mechsyringe] from [src] by [source], targeting [target].", LOG_MECHA) - spawn(0) //This code is trash and whoever wrote it should feel bad - for(var/i=0, i<6, i++) - if(!mechsyringe) - break - if(step_towards(mechsyringe,trg)) - var/list/mobs = new - for(var/mob/living/carbon/M in mechsyringe.loc) - mobs += M - if(length(mobs)) - var/mob/living/carbon/M = pick(mobs) - var/R - mechsyringe.visible_message(" [M] is hit by the syringe!") - if(M.can_inject(null, 1)) - if(mechsyringe.reagents) - for(var/datum/reagent/A in mechsyringe.reagents.reagent_list) - R += "[A.name] ([num2text(A.volume)]" - mechsyringe.icon_state = initial(mechsyringe.icon_state) - mechsyringe.icon = initial(mechsyringe.icon) - mechsyringe.reagents.trans_to(M, mechsyringe.reagents.total_volume, transfered_by = source, methods = INJECT) - M.take_bodypart_damage(2) - log_combat(source, M, "shot", "syringegun") - break - else if(mechsyringe.loc == trg) - mechsyringe.icon_state = initial(mechsyringe.icon_state) - mechsyringe.icon = initial(mechsyringe.icon) - mechsyringe.update_icon() - break - else - mechsyringe.icon_state = initial(mechsyringe.icon_state) - mechsyringe.icon = initial(mechsyringe.icon) - mechsyringe.update_icon() - break - sleep(1) + var/obj/item/ammo_casing/syringegun/chambered = new /obj/item/ammo_casing/syringegun(src) + log_message("Fired [chambered] from [src] by [source], targeting [target].", LOG_MECHA) + chambered.fire_casing(target, source, null, 0, 0, null, 0, src) return ..() - /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Topic(href,href_list) ..() if (href_list["toggle_mode"]) @@ -362,18 +330,18 @@ update_equip_info() return if (href_list["select_reagents"]) - processed_reagents.len = 0 - var/m = 0 + LAZYCLEARLIST(processed_reagents) + var/processingreagentamount = 0 var/message for(var/i=1 to known_reagents.len) - if(m>=synth_speed) + if(processingreagentamount >= synth_speed) break var/reagent = text2path(href_list["reagent_[i]"]) if(reagent && (reagent in known_reagents)) - message = "[m ? ", " : null][known_reagents[reagent]]" - processed_reagents += reagent - m++ - if(processed_reagents.len) + message = "[processingreagentamount ? ", " : null][known_reagents[reagent]]" + LAZYADD(processed_reagents, reagent) + processingreagentamount++ + if(LAZYLEN(processed_reagents)) message += " added to production" START_PROCESSING(SSobj, src) to_chat(usr, message) @@ -384,10 +352,12 @@ if(!(usr in chassis.occupants)) return usr << browse(get_reagents_page(),"window=msyringegun") + return if (href_list["purge_reagent"]) var/reagent = href_list["purge_reagent"] - if(reagent) - reagents.del_reagent(reagent) + if(!reagent) + return + reagents.del_reagent(reagent) return if (href_list["purge_all"]) reagents.clear_reagents() @@ -453,26 +423,26 @@ return output || "None" /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S, mob/user) - if(syringes.len= 2) - to_chat(user, "[icon2html(src, user)]The syringe is too far away!") - return 0 - for(var/obj/structure/D in S.loc)//Basic level check for structures in the way (Like grilles and windows) - if(!(D.CanPass(S,src.loc))) - to_chat(user, "[icon2html(src, user)]Unable to load syringe!") - return 0 - for(var/obj/machinery/door/D in S.loc)//Checks for doors - if(!(D.CanPass(S,src.loc))) - to_chat(user, "[icon2html(src, user)]Unable to load syringe!") - return 0 - S.reagents.trans_to(src, S.reagents.total_volume, transfered_by = user) - S.forceMove(src) - syringes += S - to_chat(user, "[icon2html(src, user)]Syringe loaded.") - update_equip_info() - return 1 - to_chat(user, "[icon2html(src, user)][src]'s syringe chamber is full!") - return 0 + if(LAZYLEN(syringes) >= max_syringes) + to_chat(user, "[icon2html(src, user)][src]'s syringe chamber is full!") + return FALSE + if(get_dist(src,S) >= 2) + to_chat(user, "[icon2html(src, user)]The syringe is too far away!") + return FALSE + for(var/obj/structure/D in S.loc)//Basic level check for structures in the way (Like grilles and windows) + if(!(D.CanPass(S,src.loc))) + to_chat(user, "[icon2html(src, user)]Unable to load syringe!") + return FALSE + for(var/obj/machinery/door/D in S.loc)//Checks for doors + if(!(D.CanPass(S,src.loc))) + to_chat(user, "[icon2html(src, user)]Unable to load syringe!") + return FALSE + S.reagents.trans_to(src, S.reagents.total_volume, transfered_by = user) + S.forceMove(src) + LAZYADD(syringes,S) + to_chat(user, "[icon2html(src, user)]Syringe loaded.") + update_equip_info() + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/analyze_reagents(atom/A, mob/user) if(get_dist(src,A) >= 4) @@ -490,36 +460,39 @@ return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/add_known_reagent(r_id,r_name) - if(!(r_id in known_reagents)) - known_reagents += r_id - known_reagents[r_id] = r_name - return TRUE - return FALSE + if(r_id in known_reagents) + return FALSE + known_reagents += r_id + known_reagents[r_id] = r_name + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/update_equip_info() - if(..()) + . = ..() + if(.) send_byjax(chassis.occupants,"msyringegun.browser","reagents",get_current_reagents()) send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) - return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/on_reagent_change(changetype) - ..() + . = ..() update_equip_info() /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/process(delta_time) - if(..()) + . = ..() + if(.) return - if(!processed_reagents.len || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) + if(!LAZYLEN(processed_reagents) || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Reagent processing stopped.") log_message("Reagent processing stopped.", LOG_MECHA) - STOP_PROCESSING(SSobj, src) - return - var/amount = delta_time * synth_speed / processed_reagents.len + return PROCESS_KILL + var/amount = delta_time * synth_speed / LAZYLEN(processed_reagents) for(var/reagent in processed_reagents) reagents.add_reagent(reagent,amount) chassis.use_power(energy_drain) +#undef FIRE_SYRINGE_MODE +#undef ANALYZE_SYRINGE_MODE + ///////////////////////////////// Medical Beam /////////////////////////////////////////////////////////////// /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam @@ -529,6 +502,7 @@ energy_drain = 10 range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 0 + ///The medical gun doing the actual healing. yes its wierd but its better than copypasting the entire thing var/obj/item/gun/medbeam/mech/medigun custom_materials = list(/datum/material/iron = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000) material_flags = MATERIAL_NO_EFFECTS @@ -539,11 +513,12 @@ /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Destroy() - qdel(medigun) + QDEL_NULL(medigun) return ..() -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/process() - if(..()) +/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/process(deltatime) + . = ..() + if(.) return medigun.process(SSOBJ_DT) diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 40bf6c804c8..fffea9d1ed6 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -14,7 +14,8 @@ var/teleport_range = 7 /obj/item/mecha_parts/mecha_equipment/teleporter/action(mob/source, atom/target, params) - if(!action_checks(target) || is_centcom_level(loc.z)) + var/area/ourarea = get_area(src) + if(!action_checks(target) || ourarea & NOTELEPORT) return var/turf/T = get_turf(target) if(T && (loc.z == T.z) && (get_dist(loc, T) <= teleport_range)) @@ -27,7 +28,7 @@ /obj/item/mecha_parts/mecha_equipment/wormhole_generator name = "mounted wormhole generator" - desc = "An exosuit module that allows generating of small quasi-stable wormholes." + desc = "An exosuit module that allows generating of small quasi-stable wormholes, allowing for long-range inneacurate teleportation." icon_state = "mecha_wholegen" equip_cooldown = 50 energy_drain = 300 @@ -35,39 +36,38 @@ /obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(mob/source, atom/target, params) - if(!action_checks(target) || is_centcom_level(loc.z)) + var/area/ourarea = get_area(src) + if(!action_checks(target) || ourarea & NOTELEPORT) return - var/list/theareas = get_areas_in_range(100, chassis) - if(!theareas.len) + var/area/targetarea = pick(get_areas_in_range(100, chassis)) + if(!targetarea)//Literally middle of nowhere how did you even get here return - var/area/thearea = pick(theareas) - var/list/L = list() - var/turf/pos = get_turf(src) - for(var/turf/T in get_area_turfs(thearea.type)) - if(!T.density && pos.z == T.z) - var/clear = TRUE - for(var/obj/O in T) - if(O.density) - clear = FALSE - break - if(clear) - L+=T - if(!L.len) - return - var/turf/target_turf = pick(L) + var/list/validturfs = list() + var/turf/ourturf = get_turf(src) + for(var/t in get_area_turfs(targetarea.type)) + var/turf/evaluated_turf = t + if(evaluated_turf.density || chassis.z != evaluated_turf.z) + continue + for(var/obj/evaluated_obj in evaluated_turf) + if(!evaluated_obj.density) + continue + validturfs += evaluated_turf + + var/turf/target_turf = pick(validturfs) if(!target_turf) return - var/list/obj/effect/portal/created = create_portal_pair(get_turf(src), target_turf, 300, 1, /obj/effect/portal/anom) - var/turf/T = get_turf(target) - message_admins("[ADMIN_LOOKUPFLW(source)] used a Wormhole Generator in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(source)] used a Wormhole Generator in [AREACOORD(T)]") - src = null + var/list/obj/effect/portal/created = create_portal_pair(ourturf, target_turf, 300, 1, /obj/effect/portal/anom) + message_admins("[ADMIN_LOOKUPFLW(source)] used a Wormhole Generator in [ADMIN_VERBOSEJMP(ourturf)]") + log_game("[key_name(source)] used a Wormhole Generator in [AREACOORD(ourturf)]") QDEL_LIST_IN(created, rand(150,300)) return ..() /////////////////////////////////////// GRAVITATIONAL CATAPULT /////////////////////////////////////////// +#define GRAVSLING_MODE 1 +#define GRAVPUSH_MODE 2 + /obj/item/mecha_parts/mecha_equipment/gravcatapult name = "mounted gravitational catapult" desc = "An exosuit mounted Gravitational Catapult." @@ -75,47 +75,49 @@ equip_cooldown = 10 energy_drain = 100 range = MECHA_MELEE|MECHA_RANGED - var/atom/movable/locked - var/mode = 1 //1 - gravsling 2 - gravpush + ///Which atom we are movable_target onto for + var/atom/movable/movable_target + ///Whether we will throw movable atomstothrow by locking onto them or just throw them back from where we click + var/mode = GRAVSLING_MODE /obj/item/mecha_parts/mecha_equipment/gravcatapult/action(mob/source, atom/movable/target, params) if(!action_checks(target)) return switch(mode) - if(1) - if(!locked) + if(GRAVSLING_MODE) + if(!movable_target) if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) to_chat(source, "[icon2html(src, source)]Unable to lock on [target]!") return if(ismob(target)) var/mob/M = target if(M.mob_negates_gravity()) - to_chat(source, "[icon2html(src, source)]Unable to lock on [target]!") + to_chat(source, "[icon2html(src, source)][target] immune to gravitational impulses, unable to lock!") return - locked = target - to_chat(source, "[icon2html(src, source)]Locked on [target].") - send_byjax(source,"exosuit.browser","[REF(src)]",src.get_equip_info()) - else if(target!=locked) - if(locked in view(chassis)) + movable_target = target + to_chat(source, "[icon2html(src, source)]locked on [target].") + send_byjax(source,"exosuit.browser","[REF(src)]", get_equip_info()) + else if(target!=movable_target) + if(movable_target in view(chassis)) var/turf/targ = get_turf(target) - var/turf/orig = get_turf(locked) - locked.throw_at(target, 14, 1.5) - locked = null - send_byjax(source,"exosuit.browser","[REF(src)]",src.get_equip_info()) - log_game("[key_name(source)] used a Gravitational Catapult to throw [locked] (From [AREACOORD(orig)]) at [target] ([AREACOORD(targ)]).") + var/turf/orig = get_turf(movable_target) + movable_target.throw_at(target, 14, 1.5) + movable_target = null + send_byjax(source,"exosuit.browser","[REF(src)]", get_equip_info()) + log_game("[key_name(source)] used a Gravitational Catapult to throw [movable_target] (From [AREACOORD(orig)]) at [target] ([AREACOORD(targ)]).") return ..() - else - locked = null - to_chat(source, "[icon2html(src, source)]Lock on [locked] disengaged.") - send_byjax(source,"exosuit.browser","[REF(src)]",src.get_equip_info()) - if(2) - var/list/atoms = list() + movable_target = null + to_chat(source, "[icon2html(src, source)]Lock on [movable_target] disengaged.") + send_byjax(source,"exosuit.browser","[REF(src)]", get_equip_info()) + + if(GRAVPUSH_MODE) + var/list/atomstothrow = list() if(isturf(target)) - atoms = range(3, target) + atomstothrow = range(3, target) else - atoms = orange(3, target) - for(var/atom/movable/A in atoms) + atomstothrow = orange(3, target) + for(var/atom/movable/A in atomstothrow) if(A.anchored || A.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) continue if(ismob(A)) @@ -123,9 +125,8 @@ if(M.mob_negates_gravity()) continue INVOKE_ASYNC(src, .proc/do_scatter, A, target) - - var/turf/T = get_turf(target) - log_game("[key_name(source)] used a Gravitational Catapult repulse wave on [AREACOORD(T)]") + var/turf/targetturf = get_turf(target) + log_game("[key_name(source)] used a Gravitational Catapult repulse wave on [AREACOORD(targetturf)]") return ..() /obj/item/mecha_parts/mecha_equipment/gravcatapult/proc/do_scatter(atom/movable/A, atom/movable/target) @@ -135,17 +136,17 @@ sleep(2) /obj/item/mecha_parts/mecha_equipment/gravcatapult/get_equip_info() - return "[..()] [mode==1?"([locked||"Nothing"])":null] \[S|P\]" + return "[..()] [mode==1?"([movable_target||"Nothing"])":null] \[S|P\]" /obj/item/mecha_parts/mecha_equipment/gravcatapult/Topic(href, href_list) ..() if(href_list["mode"]) mode = text2num(href_list["mode"]) send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) - return - +#undef GRAVSLING_MODE +#undef GRAVPUSH_MODE //////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// @@ -159,7 +160,7 @@ range = 0 var/deflect_coeff = 1.15 var/damage_coeff = 0.8 - selectable = 0 + selectable = FALSE /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/proc/attack_react() if(energy_drain && !chassis.has_charge(energy_drain)) @@ -178,7 +179,7 @@ range = 0 var/deflect_coeff = 1.15 var/damage_coeff = 0.8 - selectable = 0 + selectable = FALSE /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster/proc/projectile_react() if(energy_drain && !chassis.has_charge(energy_drain)) @@ -205,24 +206,21 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() STOP_PROCESSING(SSobj, src) - if(chassis) - chassis.cut_overlay(droid_overlay) + chassis?.cut_overlay(droid_overlay) return ..() /obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/vehicle/sealed/mecha/M) - ..() + . = ..() droid_overlay = new(src.icon, icon_state = "repair_droid") M.add_overlay(droid_overlay) /obj/item/mecha_parts/mecha_equipment/repair_droid/detach() chassis.cut_overlay(droid_overlay) STOP_PROCESSING(SSobj, src) - ..() + return ..() /obj/item/mecha_parts/mecha_equipment/repair_droid/get_equip_info() - if(!chassis) - return - return "*  [src.name] - [equip_ready?"A":"Dea"]ctivate" + return "*  [name] - [equip_ready?"A":"Dea"]ctivate" /obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list) @@ -243,29 +241,29 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/process(delta_time) if(!chassis) - STOP_PROCESSING(SSobj, src) - return + return PROCESS_KILL var/h_boost = health_boost * delta_time - var/repaired = 0 + var/repaired = FALSE if(chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT) h_boost *= -2 else if(chassis.internal_damage && DT_PROB(8, delta_time)) for(var/int_dam_flag in repairable_damage) - if(chassis.internal_damage & int_dam_flag) - chassis.clearInternalDamage(int_dam_flag) - repaired = 1 - break + if(!chassis.internal_damage & int_dam_flag) + continue + chassis.clearInternalDamage(int_dam_flag) + repaired = TRUE + break if(h_boost<0 || chassis.obj_integrity < chassis.max_integrity) chassis.obj_integrity += min(h_boost, chassis.max_integrity-chassis.obj_integrity) - repaired = 1 + repaired = TRUE if(repaired) if(!chassis.use_power(energy_drain)) - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL else //no repair needed, we turn off - STOP_PROCESSING(SSobj, src) chassis.cut_overlay(droid_overlay) droid_overlay = new(src.icon, icon_state = "repair_droid") chassis.add_overlay(droid_overlay) + return PROCESS_KILL @@ -280,7 +278,7 @@ range = 0 var/coeff = 100 var/list/use_channels = list(AREA_USAGE_EQUIP,AREA_USAGE_ENVIRON,AREA_USAGE_LIGHT) - selectable = 0 + selectable = FALSE /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy() STOP_PROCESSING(SSobj, src) @@ -288,25 +286,25 @@ /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach() STOP_PROCESSING(SSobj, src) - ..() - return + return ..() /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_charge() if(equip_ready) //disabled return - var/area/A = get_area(chassis) - var/pow_chan = GET_MUTATION_POWER_channel(A) + var/pow_chan = get_chassis_area_power(get_area(chassis)) if(pow_chan) return 1000 //making magic -/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/GET_MUTATION_POWER_channel(area/A) - var/pow_chan - if(A) - for(var/c in use_channels) - if(A.powered(c)) - pow_chan = c - break +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_chassis_area_power(area/A) + if(!A) + return + var/pow_chan = 0 + for(var/c in use_channels) + if(!A.powered(c)) + continue + pow_chan = c + break return pow_chan /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Topic(href, href_list) @@ -327,25 +325,19 @@ /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/process(delta_time) if(!chassis || chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT) - STOP_PROCESSING(SSobj, src) - return + return PROCESS_KILL var/cur_charge = chassis.get_charge() if(isnull(cur_charge) || !chassis.cell) - STOP_PROCESSING(SSobj, src) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]No power cell detected.") + return PROCESS_KILL + if(cur_charge >= chassis.cell.maxcharge) return - if(cur_charge < chassis.cell.maxcharge) - var/area/A = get_area(chassis) - if(A) - var/pow_chan - for(var/c in use_channels) - if(A.powered(c)) - pow_chan = c - break - if(pow_chan) - var/delta = min(10 * delta_time, chassis.cell.maxcharge-cur_charge) - chassis.give_power(delta) - A.use_power(delta*coeff, pow_chan) + var/area/A = get_area(chassis) + var/pow_chan = get_chassis_area_power(A) + if(pow_chan) + var/delta = min(10 * delta_time, chassis.cell.maxcharge-cur_charge) + chassis.give_power(delta) + A.use_power(delta*coeff, pow_chan) @@ -381,7 +373,7 @@ /obj/item/mecha_parts/mecha_equipment/generator/detach() STOP_PROCESSING(SSobj, src) - ..() + return ..() /obj/item/mecha_parts/mecha_equipment/generator/Topic(href, href_list) ..() @@ -399,10 +391,11 @@ return "[output] \[[fuel]: [round(fuel.amount*MINERAL_MATERIAL_AMOUNT,0.1)] cm3\] - [equip_ready?"A":"Dea"]ctivate" /obj/item/mecha_parts/mecha_equipment/generator/action(mob/source, atom/movable/target, params) - if(chassis) - if(load_fuel(target, source)) - send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) - return ..() + if(!chassis) + return + if(load_fuel(target, source)) + send_byjax(chassis.occupants,"exosuit.browser","[REF(src)]",src.get_equip_info()) + return ..() /obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(obj/item/stack/sheet/P, mob/user) if(P.type == fuel.type && P.amount > 0) @@ -425,25 +418,22 @@ /obj/item/mecha_parts/mecha_equipment/generator/process(delta_time) if(!chassis) - STOP_PROCESSING(SSobj, src) - return + return PROCESS_KILL if(fuel.amount<=0) - STOP_PROCESSING(SSobj, src) log_message("Deactivated - no fuel.", LOG_MECHA) - return + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Fuel reserves depleted.") + return PROCESS_KILL var/cur_charge = chassis.get_charge() if(isnull(cur_charge)) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]No power cell detected.") log_message("Deactivated.", LOG_MECHA) - STOP_PROCESSING(SSobj, src) - return + return PROCESS_KILL var/use_fuel = fuelrate_idle if(cur_charge < chassis.cell.maxcharge) use_fuel = fuelrate_active chassis.give_power(rechargerate * delta_time) fuel.amount -= min(delta_time * use_fuel / MINERAL_MATERIAL_AMOUNT, fuel.amount) update_equip_info() - return TRUE /obj/item/mecha_parts/mecha_equipment/generator/nuclear @@ -460,7 +450,8 @@ fuel = new /obj/item/stack/sheet/mineral/uranium(src, 0) /obj/item/mecha_parts/mecha_equipment/generator/nuclear/process(delta_time) - if(..()) + . = ..() + if(!.) //process wasnt killed radiation_pulse(get_turf(src), radrate * delta_time) @@ -478,34 +469,33 @@ if(istype(I, src)) to_chat(user, "[M] already has this thruster package!") return FALSE - . = ..() + return ..() /obj/item/mecha_parts/mecha_equipment/thrusters/attach(obj/vehicle/sealed/mecha/M) M.active_thrusters = src //Enable by default - . = ..() + return ..() /obj/item/mecha_parts/mecha_equipment/thrusters/detach() if(chassis?.active_thrusters == src) chassis.active_thrusters = null - . = ..() + return ..() /obj/item/mecha_parts/mecha_equipment/thrusters/Destroy() if(chassis?.active_thrusters == src) chassis.active_thrusters = null - . = ..() + return ..() /obj/item/mecha_parts/mecha_equipment/thrusters/Topic(href,href_list) ..() if(!chassis) return if(href_list["mode"]) - var/mode = text2num(href_list["mode"]) - switch(mode) - if(0) + var/isactive = text2num(href_list["mode"]) + switch(isactive) + if(FALSE) enable() - if(1) + if(TRUE) disable() - return /obj/item/mecha_parts/mecha_equipment/thrusters/proc/enable() if (chassis.active_thrusters == src) @@ -520,7 +510,7 @@ to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][src] disabled.") /obj/item/mecha_parts/mecha_equipment/thrusters/get_equip_info() - return "[..()] \[Enable|Disable\]" + return "[..()] \[Enable|Disable\]" /obj/item/mecha_parts/mecha_equipment/thrusters/proc/thrust(movement_dir) if(!chassis) @@ -545,7 +535,7 @@ if(!M.internal_tank) to_chat(user, "[M] does not have an internal tank and cannot support this upgrade!") return FALSE - . = ..() + return ..() /obj/item/mecha_parts/mecha_equipment/thrusters/gas/thrust(movement_dir) if(!chassis || !chassis.internal_tank) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 3ef07ff3c71..59205c7c034 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -143,7 +143,7 @@ /obj/vehicle/sealed/mecha/working/ripley/Exit(atom/movable/O) if(O in cargo) - return 0 + return FALSE return ..() /obj/vehicle/sealed/mecha/working/ripley/Topic(href, href_list)