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)