diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index d36c6059c5f..1d2e0483563 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -42,6 +42,12 @@ id_tag = num2text(uid) icon = null +/obj/machinery/atmospherics/binary/dp_vent_pump/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/binary/dp_vent_pump/initialize() ..() if(frequency) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index bff752be688..5112326fe9e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -21,6 +21,12 @@ if(frequency) set_frequency(frequency) +/obj/machinery/atmospherics/binary/passive_gate/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/binary/passive_gate/update_icon() icon_state = "[on ? "on" : "off"]" diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 4acf261c205..a2e6a93ec0a 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -28,6 +28,12 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/pump/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/binary/pump/highcap name = "High capacity gas pump" desc = "A high capacity pump" diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index 2737b7abfbd..0e06c5b55d5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -44,10 +44,10 @@ update_icon() investigate_log("was closed by [usr ? key_name(usr) : "a remote signal"]", "atmos") return - + /obj/machinery/atmospherics/binary/valve/attack_ai(mob/user) return - + /obj/machinery/atmospherics/binary/valve/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) @@ -60,7 +60,7 @@ close() else open() - + /obj/machinery/atmospherics/binary/valve/digital // can be controlled by AI name = "digital valve" desc = "A digitally controlled valve." @@ -71,6 +71,12 @@ var/datum/radio_frequency/radio_connection settagwhitelist = list("id_tag") +/obj/machinery/atmospherics/binary/valve/digital/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/binary/valve/digital/attack_ai(mob/user) return attack_hand(user) diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index f731efde5b7..049524d6e03 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -28,6 +28,12 @@ Thus, the two variables affect pump operation are set in New(): var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/volume_pump/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/binary/volume_pump/on on = 1 icon_state = "map_on" diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 2bf8f249185..427c77e8246 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -22,6 +22,13 @@ Filter types: var/frequency = 0 var/datum/radio_frequency/radio_connection + +/obj/machinery/atmospherics/trinary/filter/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/trinary/filter/flipped icon_state = "mmap" flipped = 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index 0987561f94c..ad9561fbf1d 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -7,7 +7,7 @@ name = "manual switching valve" desc = "A pipe valve" - + can_unwrench = 1 var/state = TVALVE_STATE_STRAIGHT @@ -15,16 +15,16 @@ /obj/machinery/atmospherics/trinary/tvalve/bypass icon_state = "map_tvalve1" state = TVALVE_STATE_SIDE - + /obj/machinery/atmospherics/trinary/tvalve/flipped icon_state = "map_tvalvem0" flipped = 1 - + /obj/machinery/atmospherics/trinary/tvalve/flipped/bypass icon_state = "map_tvalvem1" flipped = 1 state = TVALVE_STATE_SIDE - + /obj/machinery/atmospherics/trinary/tvalve/update_icon(animation) var/flipstate = "" if(flipped) @@ -40,7 +40,7 @@ var/turf/T = get_turf(src) if(!istype(T)) return - + add_underlay(T, node1, turn(dir, -180)) if(flipped) @@ -49,7 +49,7 @@ add_underlay(T, node2, turn(dir, -90)) add_underlay(T, node3, dir) - + /obj/machinery/atmospherics/trinary/tvalve/proc/switch_side() if(state == TVALVE_STATE_STRAIGHT) go_to_side() @@ -57,7 +57,7 @@ go_straight() /obj/machinery/atmospherics/trinary/tvalve/proc/go_to_side() - if(state == TVALVE_STATE_SIDE) + if(state == TVALVE_STATE_SIDE) return 0 state = TVALVE_STATE_SIDE @@ -74,7 +74,7 @@ /obj/machinery/atmospherics/trinary/tvalve/proc/go_straight() if(state == TVALVE_STATE_STRAIGHT) return 0 - + state = TVALVE_STATE_STRAIGHT update_icon() @@ -82,13 +82,13 @@ parent2.update = 0 parent3.update = 0 parent1.reconcile_air() - + investigate_log("was set to straight by [usr ? key_name(usr) : "a remote signal"]", "atmos") return 1 /obj/machinery/atmospherics/trinary/tvalve/attack_ai(mob/user) return - + /obj/machinery/atmospherics/trinary/tvalve/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) @@ -108,14 +108,20 @@ var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/trinary/tvalve/digital/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/trinary/tvalve/digital/bypass icon_state = "map_tvalve1" state = TVALVE_STATE_SIDE - + /obj/machinery/atmospherics/trinary/tvalve/digital/flipped icon_state = "map_tvalvem0" flipped = 1 - + /obj/machinery/atmospherics/trinary/tvalve/digital/flipped/bypass icon_state = "map_tvalvem1" flipped = 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index 63070b19538..f61275a8065 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -31,6 +31,12 @@ if(id && !id_tag)//I'm not dealing with any more merge conflicts id_tag = id +/obj/machinery/atmospherics/unary/outlet_injector/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/atmospherics/unary/outlet_injector/update_icon() if(!powered()) icon_state = "off" diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 662f5fe48f2..b6eafcf5ee4 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -433,4 +433,7 @@ if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index e86b8caa722..83f9466a574 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -53,6 +53,9 @@ if(initial_loc && frequency == 1439) initial_loc.air_scrub_info -= id_tag initial_loc.air_scrub_names -= id_tag + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 0d20e14a743..14fd6ea0e36 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -8,6 +8,7 @@ #define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. #define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. //if TESTING is enabled, qdel will call this object's find_references() verb. +#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. //defines for the gc_destroyed var #define GC_QUEUE_PREQUEUE 1 diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 5e336033b6e..05dab2bd97b 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -25,6 +25,10 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues + #ifdef TESTING + var/list/reference_find_on_fail = list() + #endif + /datum/controller/subsystem/garbage/PreInit() queues = new(GC_QUEUE_COUNT) @@ -154,6 +158,9 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ + #ifdef TESTING + reference_find_on_fail -= refID //It's deleted we don't care anymore. + #endif if(MC_TICK_CHECK) break continue @@ -162,8 +169,14 @@ SUBSYSTEM_DEF(garbage) fail_counts[level]++ switch(level) if(GC_QUEUE_CHECK) + #ifdef TESTING + if(reference_find_on_fail[refID]) + D.find_references() #ifdef GC_FAILURE_HARD_LOOKUP - D.find_references() + else + D.find_references() + #endif + reference_find_on_fail -= refID #endif var/type = D.type var/datum/qdel_item/I = items[type] @@ -263,6 +276,11 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" +#ifdef TESTING +/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) + SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE + qdel(D, force) +#endif // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. @@ -319,6 +337,11 @@ SUBSYSTEM_DEF(garbage) #ifdef TESTING D.find_references() #endif + if(QDEL_HINT_IFFAIL_FINDREFERENCE) + SSgarbage.PreQueue(D) + #ifdef TESTING + SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE + #endif else #ifdef TESTING if(!I.no_hint) @@ -388,10 +411,17 @@ SUBSYSTEM_DEF(garbage) set name = "qdel() then Find References" set src in world - qdel(src) + qdel(src, TRUE) //Force. if(!running_find_references) find_references(TRUE) +/datum/verb/qdel_then_if_fail_find_references() + set category = "Debug" + set name = "qdel() then Find References if GC failure" + set src in world + + qdel_and_find_ref_if_fail(src, TRUE) + /datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) if(usr && usr.client && !usr.client.running_find_references) return diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 558f6407528..96c663fb703 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -468,137 +468,142 @@ var/record_id_num = 1001 var/icon/clothes_s = null - switch(H.mind.assigned_role) - if("Head of Personnel") - clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if("Nanotrasen Representative") - clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) - if("Blueshield") - clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "blueshield"), ICON_OVERLAY) - if("Magistrate") - clothes_s = new /icon('icons/mob/uniform.dmi', "really_black_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "judge"), ICON_OVERLAY) - if("Bartender") - clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Botanist") - clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Chef") - clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Janitor") - clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Librarian") - clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Quartermaster") - clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if("Cargo Technician") - clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Shaft Miner") - clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Lawyer") - clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if("Chaplain") - clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Research Director") - clothes_s = new /icon('icons/mob/uniform.dmi', "director_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if("Scientist") - clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) - if("Chemist") - clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY) - if("Chief Medical Officer") - clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY) - if("Medical Doctor") - clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - if("Geneticist") - clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY) - if("Virologist") - clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) - if("Psychiatrist") - clothes_s = new /icon('icons/mob/uniform.dmi', "psych_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_UNDERLAY) - if("Paramedic") - clothes_s = new /icon('icons/mob/uniform.dmi', "paramedic_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - if("Captain") - clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - if("Head of Security") - clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - if("Warden") - clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - if("Detective") - clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) - if("Security Pod Pilot") - clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bomber"), ICON_OVERLAY) - if("Brig Physician") - clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "fr_jacket_open"), ICON_OVERLAY) - if("Security Officer") - clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) - if("Chief Engineer") - clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Station Engineer") - clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Life Support Specialist") - clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Mechanic") - clothes_s = new /icon('icons/mob/uniform.dmi', "mechanic_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) - if("Roboticist") - clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) - else if(H.mind.assigned_role in get_all_centcom_jobs()) - clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) - else - clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") - clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(H.mind) + switch(H.mind.assigned_role) + if("Head of Personnel") + clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if("Nanotrasen Representative") + clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + if("Blueshield") + clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "swat_gl"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "blueshield"), ICON_OVERLAY) + if("Magistrate") + clothes_s = new /icon('icons/mob/uniform.dmi', "really_black_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "judge"), ICON_OVERLAY) + if("Bartender") + clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Botanist") + clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Chef") + clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Janitor") + clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Librarian") + clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Quartermaster") + clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if("Cargo Technician") + clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Shaft Miner") + clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Lawyer") + clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if("Chaplain") + clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Research Director") + clothes_s = new /icon('icons/mob/uniform.dmi', "director_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if("Scientist") + clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) + if("Chemist") + clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY) + if("Chief Medical Officer") + clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY) + if("Medical Doctor") + clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if("Geneticist") + clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY) + if("Virologist") + clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) + if("Psychiatrist") + clothes_s = new /icon('icons/mob/uniform.dmi', "psych_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_UNDERLAY) + if("Paramedic") + clothes_s = new /icon('icons/mob/uniform.dmi', "paramedic_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Captain") + clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if("Head of Security") + clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + if("Warden") + clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + if("Detective") + clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) + if("Security Pod Pilot") + clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bomber"), ICON_OVERLAY) + if("Brig Physician") + clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "fr_jacket_open"), ICON_OVERLAY) + if("Security Officer") + clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + if("Chief Engineer") + clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Station Engineer") + clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Life Support Specialist") + clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Mechanic") + clothes_s = new /icon('icons/mob/uniform.dmi', "mechanic_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Roboticist") + clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + else if(H.mind.assigned_role in get_all_centcom_jobs()) + clothes_s = new /icon('icons/mob/uniform.dmi', "officer_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + else + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + else + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + preview_icon.Blend(face_s, ICON_OVERLAY) // Why do we do this twice if(clothes_s) diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 9517ee09ef8..2d67a5d71dd 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -22,6 +22,8 @@ var/pda = null var/internals_slot = null //ID of slot containing a gas tank var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format + var/list/implants = null + var/list/cybernetic_implants = null /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -89,6 +91,13 @@ var/number = backpack_contents[path] for(var/i = 0, i < number, i++) equip_item(H, path, slot_in_backpack) + if(implants) + for(var/path in implants) + var/obj/item/weapon/implant/I = new path(H) + I.implant(H) + for(var/path in cybernetic_implants) + var/obj/item/organ/internal/O = new path(H) + O.insert(H) post_equip(H, visualsOnly) diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 5212570223f..ae98f702ac1 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -1,6 +1,13 @@ // Used for 'select equipment' // code/modules/admin/verbs/debug.dm 566 +/datum/outfit/admin/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(!visualsOnly) + H.mind.assigned_role = name + H.job = name + + /proc/apply_to_card(obj/item/weapon/card/id/I, mob/living/carbon/human/H, list/access = list(), rank, special_icon) if(!istype(I) || !istype(H)) return 0 @@ -95,6 +102,7 @@ mask = /obj/item/clothing/mask/gas/syndicate l_ear = /obj/item/device/radio/headset/syndicate/alt glasses = /obj/item/clothing/glasses/night + shoes = /obj/item/clothing/shoes/magboots/syndie l_pocket = /obj/item/weapon/pinpointer/advpinpointer l_hand = /obj/item/weapon/tank/jetpack/oxygen/harness @@ -107,6 +115,7 @@ /obj/item/weapon/grenade/plastic/c4 = 1, /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1, /obj/item/device/flashlight = 1, + /obj/item/clothing/shoes/combat = 1 ) /datum/outfit/admin/syndicate/operative/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -131,15 +140,21 @@ /datum/outfit/admin/syndicate/officer name = "Syndicate Officer" + head = /obj/item/clothing/head/beret + mask = /obj/item/clothing/mask/cigarette/cigar/havana belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo l_ear = /obj/item/device/radio/headset/syndicate/alt l_pocket = /obj/item/weapon/pinpointer/advpinpointer backpack_contents = list( /obj/item/weapon/storage/box/engineer = 1, + /obj/item/device/flashlight = 1, /obj/item/weapon/reagent_containers/food/pill/initropidril = 1, /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1, - /obj/item/ammo_box/magazine/m50 = 2) + /obj/item/ammo_box/magazine/m50 = 2, + /obj/item/clothing/shoes/magboots/syndie/advance = 1, + /obj/item/weapon/lighter/zippo/gonzofist = 1 + ) id_icon = "commander" id_access = "Syndicate Operative Leader" @@ -152,22 +167,11 @@ var/obj/item/weapon/implant/uplink/U = new /obj/item/weapon/implant/uplink(H) U.implant(H) - U.hidden_uplink.uses = 500//a measly 1000 TC along with the uplink in the pocket + U.hidden_uplink.uses = 500 var/obj/item/weapon/implant/dust/D = new(H) D.implant(H) -/datum/outfit/admin/syndicate/bomber - name = "Syndicate Bomber" - - backpack_contents = list( - /obj/item/weapon/storage/box/engineer = 1, - /obj/item/device/flashlight = 1, - /obj/item/weapon/card/emag = 1, - /obj/item/device/radio/beacon/syndicate/bomb = 2, - /obj/item/device/syndicatedetonator = 1, - /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1 - ) /datum/outfit/admin/nt_vip name = "VIP Guest" @@ -193,114 +197,6 @@ if(istype(I)) apply_to_card(I, H, get_centcom_access("VIP Guest"), "VIP Guest") -/datum/outfit/admin/nt_navy_officer - name = "NT Navy Officer" - - uniform = /obj/item/clothing/under/rank/centcom/officer - back = /obj/item/weapon/storage/backpack/satchel - belt = /obj/item/weapon/gun/energy/pulse/pistol - gloves = /obj/item/clothing/gloves/color/white - shoes = /obj/item/clothing/shoes/centcom - head = /obj/item/clothing/head/beret/centcom/officer - l_ear = /obj/item/device/radio/headset/centcom - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - id = /obj/item/weapon/card/id/centcom - pda = /obj/item/device/pda/centcom - backpack_contents = list( - /obj/item/weapon/storage/box/engineer = 1, - /obj/item/weapon/implanter/dust = 1, - /obj/item/weapon/implanter/death_alarm = 1 - ) - -/datum/outfit/admin/nt_navy_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - . = ..() - if(visualsOnly) - return - - var/obj/item/weapon/card/id/I = H.wear_id - if(istype(I)) - apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer") - - var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H) - L.implant(H) - - -/datum/outfit/admin/nt_special_ops_officer - name = "NT Special Ops Officer" - - uniform = /obj/item/clothing/under/syndicate/combat - suit = /obj/item/clothing/suit/space/deathsquad/officer - back = /obj/item/weapon/storage/backpack/security - belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911 - gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/helmet/space/deathsquad/beret - mask = /obj/item/clothing/mask/cigarette/cigar/cohiba - l_ear = /obj/item/device/radio/headset/centcom - glasses = /obj/item/clothing/glasses/thermal/cyber - id = /obj/item/weapon/card/id/centcom - r_pocket = /obj/item/weapon/storage/box/matches - pda = /obj/item/device/pda/centcom - backpack_contents = list( - /obj/item/weapon/storage/box/engineer = 1, - /obj/item/weapon/tank/emergency_oxygen/double/full = 1, - /obj/item/weapon/implanter/dust = 1, - /obj/item/weapon/implanter/death_alarm = 1, - /obj/item/weapon/twohanded/dualsaber/red = 1, - /obj/item/weapon/pinpointer/advpinpointer = 1, - /obj/item/weapon/reagent_containers/hypospray/combat/nanites = 1, - /obj/item/weapon/storage/box/zipties = 1, - /obj/item/clothing/shoes/magboots/advance = 1, - /obj/item/weapon/implanter/mindshield = 1, - ) - -/datum/outfit/admin/nt_special_ops_officer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - . = ..() - if(visualsOnly) - return - - var/obj/item/weapon/card/id/I = H.wear_id - if(istype(I)) - apply_to_card(I, H, get_centcom_access("Special Operations Officer"), "Special Operations Officer") - -/datum/outfit/admin/nt_special_ops_formal - name = "NT Special Ops Formal" - - uniform = /obj/item/clothing/under/rank/centcom/captain - back = /obj/item/weapon/storage/backpack/satchel - belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911 - gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/helmet/space/deathsquad/beret - mask = /obj/item/clothing/mask/cigarette/cigar/cohiba - l_ear = /obj/item/device/radio/headset/centcom - glasses = /obj/item/clothing/glasses/thermal/cyber - id = /obj/item/weapon/card/id/centcom - r_pocket = /obj/item/weapon/storage/box/matches - pda = /obj/item/device/pda/centcom - backpack_contents = list( - /obj/item/weapon/storage/box/engineer = 1, - /obj/item/weapon/melee/classic_baton/telescopic = 1, - /obj/item/weapon/implanter/dust = 1, - /obj/item/weapon/implanter/death_alarm = 1 - ) - -/datum/outfit/admin/nt_special_ops_formal/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - . = ..() - if(visualsOnly) - return - - var/obj/item/device/pda/PDA = H.wear_pda - if(istype(PDA)) - PDA.owner = H.real_name - PDA.ownjob = "Special Operations Officer" - PDA.icon_state = "pda-syndi" - PDA.name = "PDA-[H.real_name] ([PDA.ownjob])" - PDA.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work." - - var/obj/item/weapon/card/id/I = H.wear_id - if(istype(I)) - apply_to_card(I, H, get_centcom_access("Special Operations Officer"), "Special Operations Officer") /datum/outfit/admin/nt_navy_captain name = "NT Navy Captain" @@ -316,10 +212,13 @@ id = /obj/item/weapon/card/id/centcom pda = /obj/item/device/pda/centcom backpack_contents = list( - /obj/item/weapon/storage/box/engineer = 1, - /obj/item/weapon/implanter/dust = 1, + /obj/item/weapon/storage/box/centcomofficer = 1, /obj/item/weapon/implanter/death_alarm = 1 ) + implants = list( + /obj/item/weapon/implant/mindshield, + /obj/item/weapon/implant/dust + ) /datum/outfit/admin/nt_navy_captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() @@ -330,9 +229,6 @@ if(istype(I)) apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain") - var/obj/item/weapon/implant/L = new /obj/item/weapon/implant/mindshield(H) - L.implant(H) - /datum/outfit/admin/nt_diplomat name = "NT Diplomat" @@ -347,9 +243,12 @@ pda = /obj/item/device/pda/centcom backpack_contents = list( /obj/item/weapon/storage/box/survival = 1, - /obj/item/weapon/implanter/dust = 1, /obj/item/weapon/implanter/death_alarm = 1, ) + implants = list( + /obj/item/weapon/implant/mindshield, + /obj/item/weapon/implant/dust + ) /datum/outfit/admin/nt_diplomat/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() @@ -360,6 +259,57 @@ if(istype(I)) apply_to_card(I, H, get_centcom_access("Nanotrasen Navy Representative"), "Nanotrasen Diplomat") + +/datum/outfit/admin/nt_undercover + name = "NT Undercover Operative" + // Disguised NT special forces, sent to quietly eliminate mutinous people in high positions (e.g: captain) + + uniform = /obj/item/clothing/under/chameleon + back = /obj/item/weapon/storage/backpack + belt = /obj/item/weapon/storage/belt/utility/full/multitool + gloves = /obj/item/clothing/gloves/combat + shoes = /obj/item/clothing/shoes/syndigaloshes + l_ear = /obj/item/device/radio/headset/heads/captain + id = /obj/item/weapon/card/id/syndicate + pda = /obj/item/device/pda + backpack_contents = list( + /obj/item/weapon/storage/box/engineer = 1, + /obj/item/device/flashlight = 1, + /obj/item/weapon/gun/projectile/automatic/proto = 1, // NT saber SMG + /obj/item/weapon/suppressor = 1, // silencer for SMG + /obj/item/ammo_box/magazine/smgm9mm = 3, // SMG ammo + /obj/item/weapon/door_remote/omni = 1, + /obj/item/weapon/implanter/mindshield = 1, // not implanted by default, as that would make them suspicious + /obj/item/weapon/implanter/storage = 1 // do not auto-implant this, that causes a bug + ) + implants = list( + /obj/item/weapon/implant/dust + ) + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/eyes/hud/security, + /obj/item/organ/internal/cyberimp/eyes/xray, + /obj/item/organ/internal/cyberimp/brain/anti_drop, + /obj/item/organ/internal/cyberimp/brain/anti_stun, + /obj/item/organ/internal/cyberimp/chest/nutriment/plus + ) + +/datum/outfit/admin/nt_undercover/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + + var/obj/item/weapon/card/id/I = H.wear_id + if(istype(I)) + apply_to_card(I, H, get_all_accesses(), "Civilian") + I.icon_state = "deathsquad" + + + var/obj/item/device/radio/R = H.l_ear + if(istype(R)) + R.name = "radio headset" + R.icon_state = "headset" + + /datum/outfit/admin/death_commando name = "NT Death Commando" @@ -485,12 +435,10 @@ backpack_contents = list( /obj/item/weapon/storage/box/survival = 1, /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 1, - /obj/item/weapon/storage/box/syndie_kit/caneshotgun = 1, /obj/item/toy/crayon/mime = 1, - /obj/item/weapon/gun/projectile/automatic/pistol = 1, - /obj/item/weapon/suppressor = 1, + /obj/item/weapon/storage/box/syndie_kit/caneshotgun = 1, /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath = 2, - /obj/item/weapon/pen/sleepy = 1, + /obj/item/device/radio/uplink = 1, /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket = 1, /obj/item/device/flashlight = 1 ) @@ -701,7 +649,9 @@ backpack_contents = list( /obj/item/weapon/storage/box/survival = 1, /obj/item/weapon/kitchen/knife/combat = 1, - /obj/item/ammo_box/magazine/m556 = 3) + /obj/item/ammo_box/magazine/m556 = 3, + /obj/item/clothing/shoes/magboots = 1 + ) /datum/outfit/admin/solgov/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -725,7 +675,9 @@ /obj/item/weapon/storage/box/survival = 1, /obj/item/weapon/kitchen/knife/combat = 1, /obj/item/weapon/melee/classic_baton/telescopic = 1, - /obj/item/ammo_box/magazine/m50 = 2) + /obj/item/ammo_box/magazine/m50 = 2, + /obj/item/clothing/shoes/magboots/advance = 1 + ) /datum/outfit/admin/chrono name = "Chrono Legionnaire" @@ -734,7 +686,7 @@ suit = /obj/item/clothing/suit/space/chronos back = /obj/item/weapon/chrono_eraser gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/combat + shoes = /obj/item/clothing/shoes/magboots/advance head = /obj/item/clothing/head/helmet/space/chronos mask = /obj/item/clothing/mask/gas/syndicate glasses = /obj/item/clothing/glasses/night @@ -756,7 +708,7 @@ uniform = /obj/item/clothing/under/color/grey suit = /obj/item/clothing/suit/space back = /obj/item/weapon/tank/jetpack/oxygen - shoes = /obj/item/clothing/shoes/black + shoes = /obj/item/clothing/shoes/magboots head = /obj/item/clothing/head/helmet/space mask = /obj/item/clothing/mask/breath l_ear = /obj/item/device/radio/headset @@ -779,6 +731,7 @@ /datum/outfit/admin/hardsuit back = /obj/item/weapon/tank/jetpack/oxygen mask = /obj/item/clothing/mask/breath + shoes = /obj/item/clothing/shoes/magboots id = /obj/item/weapon/card/id /datum/outfit/admin/hardsuit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -804,6 +757,7 @@ name = "CE Hardsuit" suit = /obj/item/clothing/suit/space/hardsuit/elite head = /obj/item/clothing/head/helmet/space/hardsuit/elite + shoes = /obj/item/clothing/shoes/magboots/advance /datum/outfit/admin/hardsuit/mining name = "Mining Hardsuit" @@ -814,11 +768,13 @@ name = "Syndi Hardsuit" suit = /obj/item/clothing/suit/space/hardsuit/syndi head = /obj/item/clothing/head/helmet/space/hardsuit/syndi + shoes = /obj/item/clothing/shoes/magboots/syndie /datum/outfit/admin/hardsuit/wizard name = "Wizard Hardsuit" suit = /obj/item/clothing/suit/space/hardsuit/wizard head = /obj/item/clothing/head/helmet/space/hardsuit/wizard + shoes = /obj/item/clothing/shoes/magboots /datum/outfit/admin/hardsuit/medical name = "Medical Hardsuit" @@ -996,15 +952,15 @@ /obj/item/weapon/storage/box/survival = 1, /obj/item/device/flashlight = 1 ) + implants = list( + /obj/item/weapon/implant/dust + ) /datum/outfit/admin/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() if(visualsOnly) return - var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H) - D.implant(H) - var/obj/item/device/pda/PDA = H.wear_pda if(istype(PDA)) PDA.owner = H.real_name @@ -1034,7 +990,10 @@ /obj/item/weapon/suppressor = 1, /obj/item/weapon/card/emag = 1, /obj/item/device/flashlight = 1, - /obj/item/weapon/implanter/storage = 1 + /obj/item/weapon/implanter/storage = 1 // do not auto-implant this, that causes a bug + ) + implants = list( + /obj/item/weapon/implant/dust ) /datum/outfit/admin/spy/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -1046,9 +1005,6 @@ if(istype(G)) G.name = "black gloves" - var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H) - D.implant(H) - var/obj/item/device/pda/PDA = H.wear_pda if(istype(PDA)) PDA.owner = H.real_name @@ -1089,6 +1045,7 @@ if(istype(I)) apply_to_card(I, H, get_all_accesses(), "Dark Lord", "syndie") + /datum/outfit/admin/wizard uniform = /obj/item/clothing/under/color/lightpurple suit = /obj/item/clothing/suit/wizrobe @@ -1130,6 +1087,36 @@ shoes = /obj/item/clothing/shoes/sandal/marisa head = /obj/item/clothing/head/wizard/marisa +/datum/outfit/admin/wizard/arch + name = "Arch Wizard" + + suit = /obj/item/clothing/suit/wizrobe/magusred + head = /obj/item/clothing/head/wizard/magus + belt = /obj/item/weapon/storage/belt/wands/full + l_hand = null + backpack_contents = list( + /obj/item/weapon/storage/box/engineer = 1, + /obj/item/clothing/suit/space/hardsuit/wizard = 1, + /obj/item/clothing/head/helmet/space/hardsuit/wizard = 1, + /obj/item/clothing/shoes/magboots = 1, + /obj/item/weapon/kitchen/knife/ritual = 1, + /obj/item/clothing/suit/wizrobe/red = 1, + /obj/item/clothing/head/wizard/red = 1 + ) + +/datum/outfit/admin/wizard/arch/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + . = ..() + if(visualsOnly) + return + var/obj/item/weapon/spellbook/B = H.r_hand + if(istype(B)) + B.owner = H // force-bind it so it can never be stolen, no matter what. + B.name = "Archwizard Spellbook" + B.uses = 50 + var/obj/item/weapon/card/id/I = H.wear_id + if(istype(I)) + apply_to_card(I, H, get_all_accesses(), "Arch Wizard") + /datum/outfit/admin/dark_priest name = "Dark Priest" @@ -1147,6 +1134,9 @@ /obj/item/weapon/storage/box/survival = 1, /obj/item/device/flashlight = 1, ) + implants = list( + /obj/item/weapon/implant/dust + ) /datum/outfit/admin/dark_priest/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) . = ..() @@ -1163,5 +1153,3 @@ var/obj/item/device/radio/headset/R = H.l_ear if(istype(R)) R.flags |= NODROP - var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H) - D.implant(H) \ No newline at end of file diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index c78cc55676f..1b5921119db 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -349,6 +349,7 @@ to_chat(user, "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp.") add_logs(user, H, "vampire-thralled") + /obj/effect/proc_holder/spell/vampire/self/cloak name = "Cloak of Darkness" desc = "Toggles whether you are currently cloaking yourself in darkness." diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm index 64298b70fbe..b07b2655f28 100644 --- a/code/game/jobs/job/central.dm +++ b/code/game/jobs/job/central.dm @@ -28,16 +28,13 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses id = /obj/item/weapon/card/id/centcom pda = /obj/item/device/pda/centcom - backpack_contents = list( - /obj/item/weapon/gun/energy/pulse/pistol = 1, - /obj/item/weapon/implanter/dust = 1, - /obj/item/weapon/implanter/death_alarm = 1 + belt = /obj/item/weapon/gun/energy/pulse/pistol + implants = list( + /obj/item/weapon/implant/mindshield, + /obj/item/weapon/implant/dust ) - - implants = list(/obj/item/weapon/implant/mindshield) - backpack = /obj/item/weapon/storage/backpack/satchel - + box = /obj/item/weapon/storage/box/centcomofficer // CC Officials who lead ERTs, Death Squads, etc. @@ -61,22 +58,33 @@ /datum/outfit/job/ntspecops name = "Special Operations Officer" jobtype = /datum/job/ntspecops - - uniform = /obj/item/clothing/under/syndicate/combat + uniform = /obj/item/clothing/under/rank/centcom_commander suit = /obj/item/clothing/suit/space/deathsquad/officer + back = /obj/item/weapon/storage/backpack/security + belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911 gloves = /obj/item/clothing/gloves/combat shoes = /obj/item/clothing/shoes/combat - head = /obj/item/clothing/head/beret/centcom/officer/navy + mask = /obj/item/clothing/mask/cigarette/cigar/cohiba + head = /obj/item/clothing/head/helmet/space/deathsquad/beret l_ear = /obj/item/device/radio/headset/centcom glasses = /obj/item/clothing/glasses/hud/security/sunglasses id = /obj/item/weapon/card/id/centcom pda = /obj/item/device/pda/centcom + r_pocket = /obj/item/weapon/storage/box/matches + box = /obj/item/weapon/storage/box/centcomofficer + backpack = /obj/item/weapon/storage/backpack/satchel backpack_contents = list( - /obj/item/weapon/implanter/dust = 1, - /obj/item/weapon/gun/energy/pulse/pistol/m1911 = 1, - /obj/item/weapon/implanter/death_alarm = 1 + /obj/item/clothing/shoes/magboots/advance = 1, + /obj/item/weapon/twohanded/dualsaber/red = 1, + /obj/item/weapon/storage/box/zipties = 1 ) - - implants = list(/obj/item/weapon/implant/mindshield) - - backpack = /obj/item/weapon/storage/backpack/satchel \ No newline at end of file + implants = list( + /obj/item/weapon/implant/mindshield, + /obj/item/weapon/implant/dust + ) + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/eyes/xray, + /obj/item/organ/internal/cyberimp/brain/anti_drop, + /obj/item/organ/internal/cyberimp/brain/anti_stun, + /obj/item/organ/internal/cyberimp/chest/nutriment/plus + ) \ No newline at end of file diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index cfb4e9418a9..a611735701a 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -142,8 +142,6 @@ shoes = /obj/item/clothing/shoes/black pda = /obj/item/device/pda - var/list/implants = null - var/backpack = /obj/item/weapon/storage/backpack var/satchel = /obj/item/weapon/storage/backpack/satchel_norm var/dufflebag = /obj/item/weapon/storage/backpack/duffel @@ -210,11 +208,6 @@ imprint_pda(H) - if(implants) - for(var/implant_type in implants) - var/obj/item/weapon/implant/I = new implant_type(H) - I.implant(H) - if(gear_leftovers.len) for(var/datum/gear/G in gear_leftovers) var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.gear[G.display_name])) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 748e5ac9bb6..0a6ea8c784d 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -1,6 +1,4 @@ /obj/machinery/bodyscanner - var/mob/living/carbon/occupant - var/locked name = "body scanner" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "bodyscanner-open" @@ -11,6 +9,16 @@ active_power_usage = 2500 light_color = "#00FF00" + var/obj/machinery/body_scanconsole/console = null + var/mob/living/carbon/occupant = null + var/locked + +/obj/machinery/bodyscanner/Destroy() + go_out() + if(console) + console.connected = null + console = null + return ..() /obj/machinery/bodyscanner/power_change() ..() @@ -207,9 +215,6 @@ return /obj/machinery/body_scanconsole - var/obj/machinery/bodyscanner/connected - var/delete - var/temphtml name = "Body Scanner Console" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "bodyscannerconsole" @@ -218,6 +223,9 @@ dir = 8 idle_power_usage = 250 active_power_usage = 500 + var/obj/machinery/bodyscanner/connected = null + var/delete + var/temphtml var/printing = null var/printing_text = null var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/mindshield, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/health) @@ -243,6 +251,12 @@ RefreshParts() findscanner() +/obj/machinery/body_scanconsole/Destroy() + if(connected) + connected.console = null + connected = null + return ..() + /obj/machinery/body_scanconsole/ex_act(severity) switch(severity) if(1.0) @@ -269,15 +283,13 @@ return /obj/machinery/body_scanconsole/proc/findscanner() - var/obj/machinery/bodyscanner/bodyscannernew = null - // Loop through every direction for(dir in list(NORTH,EAST,SOUTH,WEST)) // Try to find a scanner in that direction var/temp = locate(/obj/machinery/bodyscanner, get_step(src, dir)) - if(!isnull(temp)) - bodyscannernew = temp - src.connected = bodyscannernew - return + if(temp) + connected = temp + connected.console = src + break /obj/machinery/body_scanconsole/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index d0f75dbe9e1..c0197b136a3 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -212,6 +212,7 @@ air_alarms -= src if(radio_controller) radio_controller.remove_object(src, frequency) + radio_connection = null air_alarm_repository.update_cache(src) QDEL_NULL(wires) if(alarm_area && alarm_area.master_air_alarm == src) diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index fcb9bd0d28e..eebf66bc447 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -135,7 +135,8 @@ obj/machinery/air_sensor Destroy() SSair.atmos_machinery -= src if(radio_controller) - radio_controller.remove_object(src,frequency) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() @@ -156,6 +157,12 @@ obj/machinery/air_sensor var/list/sensor_information = list() var/datum/radio_frequency/radio_connection + Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + attack_hand(mob/user) if(..(user)) return diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 80cfef47d88..91852deaf73 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -48,13 +48,14 @@ /obj/machinery/driver_button/Destroy() if(radio_controller) - radio_controller.remove_object(src,frequency) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/machinery/driver_button/attack_ai(mob/user as mob) return attack_hand(user) - + /obj/machinery/driver_button/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) @@ -167,7 +168,7 @@ /obj/machinery/ignition_switch/attack_ai(mob/user) return attack_hand(user) - + /obj/machinery/ignition_switch/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 9ab55f0e1f5..074e29096a6 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -140,6 +140,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/Destroy() QDEL_NULL(electronics) QDEL_NULL(wires) + QDEL_NULL(note) if(main_power_timer) deltimer(main_power_timer) main_power_timer = null @@ -149,7 +150,9 @@ About the new airlock wires panel: if(electrified_timer) deltimer(electrified_timer) electrified_timer = null - qdel(note) + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/machinery/door/airlock/handle_atom_del(atom/A) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index cc7da319ddd..8a53dd3de8c 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -216,6 +216,12 @@ if(radio_controller) set_frequency(frequency) +/obj/machinery/airlock_sensor/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/airlock_sensor/airlock_interior command = "cycle_interior" @@ -279,6 +285,12 @@ if(radio_controller) set_frequency(frequency) +/obj/machinery/access_button/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/access_button/airlock_interior frequency = 1379 command = "cycle_interior" diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index a4a656fa5d6..08143524744 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -58,6 +58,12 @@ ..() set_frequency(frequency) +/obj/machinery/embedded_controller/radio/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + /obj/machinery/embedded_controller/radio/update_icon() if(on && program) if(program.memory["processing"]) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 644b5a73ab9..abe9f38f363 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -56,7 +56,8 @@ /obj/machinery/light_switch/Destroy() if(radio_controller) - radio_controller.remove_object(src,frequency) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/machinery/light_switch/proc/updateicon() @@ -75,7 +76,7 @@ /obj/machinery/light_switch/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) - + /obj/machinery/light_switch/attack_hand(mob/user) on = !on updateicon() diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 362b9718b3a..0ff8847a8d8 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -236,6 +236,12 @@ filter_path() // renders rpath + Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null + return ..() + process() if(magnets.len == 0 && autolink) for(var/obj/machinery/magnetic_module/M in world) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 0fe6cf48631..40629931aa5 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -9,6 +9,7 @@ name = "control wand" desc = "Remotely controls airlocks." w_class = WEIGHT_CLASS_TINY + flags = NOBLUDGEON var/mode = WAND_OPEN var/region_access = 1 //See access.dm var/obj/item/weapon/card/id/ID diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e353834ca22..f10eeff1ebb 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -77,6 +77,7 @@ var/global/list/default_medbay_channels = list( radio_controller.remove_object(src, frequency) for(var/ch_name in channels) radio_controller.remove_object(src, radiochannels[ch_name]) + radio_connection = null global_radios -= src follow_target = null return ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 582432c06b7..6a631f53e38 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -13,6 +13,7 @@ var/list/recipes = list() // /datum/stack_recipe var/singular_name var/amount = 1 + var/to_transfer = 0 var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount var/merge_type = null // This path and its children should merge with this stack, defaults to src.type @@ -231,6 +232,9 @@ /obj/item/stack/proc/get_max_amount() return max_amount +/obj/item/stack/proc/get_amount_transferred() + return to_transfer + /obj/item/stack/proc/split(mob/user, amt) var/obj/item/stack/F = new type(loc, amt) F.copy_evidences(src) @@ -257,7 +261,6 @@ if(S.amount >= max_amount) return 1 - var/to_transfer if(user.is_in_inactive_hand(src)) var/desired = input("How much would you like to transfer from this stack?", "How much?", 1) as null|num if(!desired) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 302fa1bd0bc..30d8f8a9ef5 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -829,6 +829,26 @@ return return ..() + +/obj/item/weapon/storage/box/centcomofficer + name = "officer kit" + +/obj/item/weapon/storage/box/centcomofficer/New() + ..() + contents = list() + new /obj/item/clothing/mask/breath(src) + new /obj/item/weapon/tank/emergency_oxygen/double/full(src) + new /obj/item/device/flashlight/seclite(src) + new /obj/item/weapon/kitchen/knife/combat(src) + + new /obj/item/device/radio/centcom(src) + new /obj/item/weapon/door_remote/omni(src) + new /obj/item/weapon/implanter/death_alarm(src) + + new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src) + new /obj/item/weapon/pinpointer/advpinpointer(src) + + #undef NODESIGN #undef NANOTRASEN #undef SYNDI diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 3334fdf2de7..42dbbbda4b6 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -96,6 +96,14 @@ ..() air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) +/obj/item/weapon/tank/jetpack/void/grey + name = "Void Jetpack (Oxygen)" + icon_state = "jetpack-void-grey" + +/obj/item/weapon/tank/jetpack/void/gold + name = "Retro Jetpack (Oxygen)" + icon_state = "jetpack-void-gold" + /obj/item/weapon/tank/jetpack/oxygen name = "Jetpack (Oxygen)" diff --git a/code/game/objects/structures/crates_lockers/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm index ba32e37f38c..06d5fd19d30 100644 --- a/code/game/objects/structures/crates_lockers/closets/malfunction.dm +++ b/code/game/objects/structures/crates_lockers/closets/malfunction.dm @@ -9,8 +9,7 @@ ..() new /obj/item/weapon/tank/jetpack/void(src) new /obj/item/clothing/mask/breath(src) - new /obj/item/clothing/head/helmet/space/nasavoid(src) - new /obj/item/clothing/suit/space/nasavoid(src) + new /obj/effect/nasavoidsuitspawner(src) new /obj/item/weapon/crowbar(src) new /obj/item/weapon/stock_parts/cell(src) new /obj/item/device/multitool(src) \ No newline at end of file diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 959a8d60452..6c94893d6db 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -29,7 +29,8 @@ /obj/item/device/assembly/signaler/Destroy() if(radio_controller) - radio_controller.remove_object(src,frequency) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/item/device/assembly/signaler/describe() diff --git a/code/modules/clothing/spacesuits/void.dm b/code/modules/clothing/spacesuits/void.dm index cce0f4c49b3..df26d6f2f15 100644 --- a/code/modules/clothing/spacesuits/void.dm +++ b/code/modules/clothing/spacesuits/void.dm @@ -1,14 +1,113 @@ -//NASA Voidsuit +//Voidsuits /obj/item/clothing/head/helmet/space/nasavoid name = "NASA Void Helmet" - desc = "A high tech, NASA Centcom branch designed, dark red space suit helmet. Used for AI satellite maintenance." - icon_state = "void" + desc = "A high tech, NASA Centcom branch designed space suit helmet. Used for AI satellite maintenance." + icon_state = "void-red" item_state = "void" + flags_inv = HIDEMASK|HIDEEARS /obj/item/clothing/suit/space/nasavoid - name = "NASA Voidsuit" - icon_state = "void" + name = "NASA Void Suit" + icon_state = "void-red" item_state = "void" - desc = "A high tech, NASA Centcom branch designed, dark red Space suit. Used for AI satellite maintenance." - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/multitool) \ No newline at end of file + desc = "A high tech, NASA Centcom branch designed space suit. Used for AI satellite maintenance." + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/multitool) + +//Colors!!! +/obj/item/clothing/head/helmet/space/nasavoid/green + icon_state = "void-green" + +/obj/item/clothing/suit/space/nasavoid/green + icon_state = "void-green" + +/obj/item/clothing/head/helmet/space/nasavoid/ntblue + icon_state = "void-ntblue" + +/obj/item/clothing/suit/space/nasavoid/ntblue + icon_state = "void-ntblue" + +/obj/item/clothing/head/helmet/space/nasavoid/purple + icon_state = "void-purple" + +/obj/item/clothing/suit/space/nasavoid/purple + icon_state = "void-purple" + +/obj/item/clothing/head/helmet/space/nasavoid/yellow + icon_state = "void-yellow" + +/obj/item/clothing/suit/space/nasavoid/yellow + icon_state = "void-yellow" + +/obj/item/clothing/head/helmet/space/nasavoid/ltblue + icon_state = "void-light_blue" + +/obj/item/clothing/suit/space/nasavoid/ltblue + icon_state = "void-light_blue" + + +//Captian's Suit, like the other captian's suit, but looks better, at the cost of armor +/obj/item/clothing/head/helmet/space/nasavoid/captain + name = "Fancy Retro Void Helmet" + icon_state = "void-captian" + desc = "A high tech, NASA Centcom branch designed space suit helmet. Used for AI satellite maintenance. This one is fit for a captain." + +/obj/item/clothing/suit/space/nasavoid/captain + name = "Fancy NASA Void Suit" + icon_state = "void-captian" + desc = "A high tech, NASA Centcom branch designed space suit. Used for AI satellite maintenance. This one is fit for a captain." + +//Syndi's suit, on par with a blood red softsuit + +/obj/item/clothing/head/helmet/space/nasavoid/syndi + name = "Blood Red Retro Void Helmet" + icon_state = "void-syndi" + desc = "A high tech, NASA Centcom branch designed space suit helmet. This one looks rather suspicious." + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) + +/obj/item/clothing/suit/space/nasavoid/syndi + name = "Blood Red NASA Void Suit" + icon_state = "void-syndi" + desc = "A high tech, NASA Centcom branch designed space suit. This one looks rather suspicious." + w_class = WEIGHT_CLASS_NORMAL + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) + armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) + +//random spawner + +/obj/effect/nasavoidsuitspawner + name = "NASA Void Suit Spawner" + icon = 'icons/obj/clothing/suits.dmi' + icon_state = "void-red" + desc = "You shouldn't see this, a spawner for NASA Void Suits." + var/suits = list("red", "green", "ntblue", "purple", "yellow", "ltblue") + +/obj/effect/nasavoidsuitspawner/New() + var/obj/item/clothing/head/helmet/space/nasavoid/H + var/obj/item/clothing/suit/space/nasavoid/S + switch(pick(suits)) + if("red") + H = new /obj/item/clothing/head/helmet/space/nasavoid + S = new /obj/item/clothing/suit/space/nasavoid + if("green") + H = new /obj/item/clothing/head/helmet/space/nasavoid/green + S = new /obj/item/clothing/suit/space/nasavoid/green + if("ntblue") + H = new /obj/item/clothing/head/helmet/space/nasavoid/ntblue + S = new /obj/item/clothing/suit/space/nasavoid/ntblue + if("purple") + H = new /obj/item/clothing/head/helmet/space/nasavoid/purple + S = new /obj/item/clothing/suit/space/nasavoid/purple + if("yellow") + H = new /obj/item/clothing/head/helmet/space/nasavoid/yellow + S = new /obj/item/clothing/suit/space/nasavoid/yellow + if("ltblue") + H = new /obj/item/clothing/head/helmet/space/nasavoid/ltblue + S = new /obj/item/clothing/suit/space/nasavoid/ltblue + var/turf/T = get_turf(src) + if(H) + H.forceMove(T) + if(S) + S.forceMove(T) + qdel(src) \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 289a4c66d4c..1f1fd454c12 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -32,6 +32,7 @@ ********************/ /obj/machinery/kitchen_machine/New() + ..() create_reagents(100) reagents.set_reacting(FALSE) if(!available_recipes) diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm index 926b8a1f129..abc80df5fca 100644 --- a/code/modules/logic/logic_base.dm +++ b/code/modules/logic/logic_base.dm @@ -62,7 +62,8 @@ /obj/machinery/logic_gate/Destroy() if(radio_controller) - radio_controller.remove_object(src,frequency) + radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/machinery/logic_gate/process() diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index 108dd4178fa..2a5e84bcac1 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -168,6 +168,7 @@ /obj/item/radio/integrated/signal/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) + radio_connection = null return ..() /obj/item/radio/integrated/signal/initialize() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index cb03d127ed5..7880cfeef2c 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -599,35 +599,21 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( ..() if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W + // Cable merging is handled by parent proc if(C.amount >= MAXCOIL) - to_chat(user, "The coil is too long, you cannot add any more cable to it.") + to_chat(user, "The coil is as long as it will get.") return - if( (C.amount + src.amount <= MAXCOIL) ) to_chat(user, "You join the cable coils together.") - C.give(src.amount) // give it cable - src.use(src.amount) // make sure this one cleans up right return - else - var/amt = MAXCOIL - C.amount - to_chat(user, "You transfer [amt] length\s of cable from one coil to the other.") - C.give(amt) - src.use(amt) + to_chat(user, "You transfer [get_amount_transferred()] length\s of cable from one coil to the other.") return if(istype(W, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = W cable_color(C.colourName) -//add cables to the stack -/obj/item/stack/cable_coil/proc/give(var/extra) - if(amount + extra > MAXCOIL) - amount = MAXCOIL - else - amount += extra - update_icon() - /////////////////////////////////////////////// // Cable laying procedures ////////////////////////////////////////////// diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 34dad709bd1..be39cb210de 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -117,6 +117,9 @@ update_icon() /obj/machinery/power/emitter/Destroy() + if(radio_controller) + radio_controller.remove_object(src, frequency) + radio_connection = null msg_admin_attack("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("Emitter deleted at ([x],[y],[z])") investigate_log("deleted at ([x],[y],[z])","singulo") diff --git a/html/changelog.html b/html/changelog.html index 22d4e228e23..11d029e7ea5 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,19 @@ -->
+

17 April 2018

+

Citinited updated:

+ +

MINIMAN10000 updated:

+ +

14 April 2018

Anticept updated: