diff --git a/code/__DEFINES/exosuit_fabs.dm b/code/__DEFINES/exosuit_fabs.dm
new file mode 100644
index 0000000000..d951a7bc28
--- /dev/null
+++ b/code/__DEFINES/exosuit_fabs.dm
@@ -0,0 +1,35 @@
+/// Module is compatible with Security Cyborg models
+#define BORG_MODULE_SECURITY (1<<0)
+/// Module is compatible with Miner Cyborg models
+#define BORG_MODULE_MINER (1<<1)
+/// Module is compatible with Janitor Cyborg models
+#define BORG_MODULE_JANITOR (1<<2)
+/// Module is compatible with Medical Cyborg models
+#define BORG_MODULE_MEDICAL (1<<3)
+/// Module is compatible with Engineering Cyborg models
+#define BORG_MODULE_ENGINEERING (1<<4)
+
+/// Module is compatible with Ripley Exosuit models
+#define EXOSUIT_MODULE_RIPLEY (1<<0)
+/// Module is compatible with Odyseeus Exosuit models
+#define EXOSUIT_MODULE_ODYSSEUS (1<<1)
+/// Module is compatible with Clarke Exosuit models. Rebranded to firefighter because tg nerfed it to this.
+#define EXOSUIT_MODULE_FIREFIGHTER (1<<2)
+// #define EXOSUIT_MODULE_CLARKE (1<<2)
+/// Module is compatible with Gygax Exosuit models
+#define EXOSUIT_MODULE_GYGAX (1<<3)
+/// Module is compatible with Durand Exosuit models
+#define EXOSUIT_MODULE_DURAND (1<<4)
+/// Module is compatible with H.O.N.K Exosuit models
+#define EXOSUIT_MODULE_HONK (1<<5)
+/// Module is compatible with Phazon Exosuit models
+#define EXOSUIT_MODULE_PHAZON (1<<6)
+/// Module is compatable with N models
+#define EXOSUIT_MODULE_GYGAX_MED (1<<7)
+
+/// Module is compatible with "Working" Exosuit models - Ripley and Clarke
+#define EXOSUIT_MODULE_WORKING EXOSUIT_MODULE_RIPLEY | EXOSUIT_MODULE_FIREFIGHTER // | EXOSUIT_MODULE_CLARKE
+/// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand and Phazon
+#define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON
+/// Module is compatible with "Medical" Exosuit modelsm - Odysseus
+#define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS | EXOSUIT_MODULE_GYGAX_MED
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 120fdcb72d..c6b031497d 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -341,10 +341,11 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are.
//Endgame Results
-#define NUKE_MISS_STATION 1
-#define NUKE_SYNDICATE_BASE 2
-#define STATION_DESTROYED_NUKE 3
-#define STATION_EVACUATED 4
+#define NUKE_NEAR_MISS 1
+#define NUKE_MISS_STATION 2
+#define NUKE_SYNDICATE_BASE 3
+#define STATION_DESTROYED_NUKE 4
+#define STATION_EVACUATED 5
#define BLOB_WIN 8
#define BLOB_NUKE 9
#define BLOB_DESTROYED 10
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index 4e0c6febab..79f2727ef3 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -174,6 +174,7 @@ GLOBAL_LIST_EMPTY(uplinks)
is_inaccessible = FALSE
if(is_inaccessible)
continue
+ /*
if(I.restricted_species) //catpeople specfic gloves.
if(ishuman(user))
var/is_inaccessible = TRUE
@@ -184,6 +185,7 @@ GLOBAL_LIST_EMPTY(uplinks)
break
if(is_inaccessible)
continue
+ */
cat["items"] += list(list(
"name" = I.name,
"cost" = I.cost,
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 0f4f02ae2a..a0b2909178 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -178,7 +178,7 @@
. = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME)
if(!.)
calling_holopad.say("No answer received.")
- calling_holopad.temp = ""
+ // calling_holopad.temp = ""
if(!.)
testing("Holocall Check fail")
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 122e89dd93..a2fdc2336f 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -54,28 +54,61 @@
/obj/machinery/computer/operating/ui_data(mob/user)
var/list/data = list()
- var/list/surgeries = list()
- for(var/X in advanced_surgeries)
- var/datum/surgery/S = X
- var/list/surgery = list()
- surgery["name"] = initial(S.name)
- surgery["desc"] = initial(S.desc)
- surgeries += list(surgery)
- data["surgeries"] = surgeries
- data["patient"] = null
+ data["table"] = table
if(table)
- data["table"] = table
- if(!table.check_eligible_patient())
- return data
- data["patient"] = list()
- patient = table.patient
- else
- if(sbed)
- data["table"] = sbed
- if(!ishuman(sbed.occupant) && !ismonkey(sbed.occupant))
- return data
+ var/list/surgeries = list()
+ for(var/X in advanced_surgeries)
+ var/datum/surgery/S = X
+ var/list/surgery = list()
+ surgery["name"] = initial(S.name)
+ surgery["desc"] = initial(S.desc)
+ surgeries += list(surgery)
+ data["surgeries"] = surgeries
+ if(table.check_patient())
data["patient"] = list()
- patient = sbed.occupant
+ patient = table.patient
+ switch(patient.stat)
+ if(CONSCIOUS)
+ data["patient"]["stat"] = "Conscious"
+ data["patient"]["statstate"] = "good"
+ if(SOFT_CRIT)
+ data["patient"]["stat"] = "Conscious"
+ data["patient"]["statstate"] = "average"
+ if(UNCONSCIOUS)
+ data["patient"]["stat"] = "Unconscious"
+ data["patient"]["statstate"] = "average"
+ if(DEAD)
+ data["patient"]["stat"] = "Dead"
+ data["patient"]["statstate"] = "bad"
+ data["patient"]["health"] = patient.health
+ data["patient"]["blood_type"] = patient.dna.blood_type
+ data["patient"]["maxHealth"] = patient.maxHealth
+ data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
+ data["patient"]["bruteLoss"] = patient.getBruteLoss()
+ data["patient"]["fireLoss"] = patient.getFireLoss()
+ data["patient"]["toxLoss"] = patient.getToxLoss()
+ data["patient"]["oxyLoss"] = patient.getOxyLoss()
+ if(patient.surgeries.len)
+ data["procedures"] = list()
+ for(var/datum/surgery/procedure in patient.surgeries)
+ var/datum/surgery_step/surgery_step = procedure.get_surgery_step()
+ var/chems_needed = surgery_step.get_chem_list()
+ var/alternative_step
+ var/alt_chems_needed = ""
+ if(surgery_step.repeatable)
+ var/datum/surgery_step/next_step = procedure.get_surgery_next_step()
+ if(next_step)
+ alternative_step = capitalize(next_step.name)
+ alt_chems_needed = next_step.get_chem_list()
+ else
+ alternative_step = "Finish operation"
+ data["procedures"] += list(list(
+ "name" = capitalize(procedure.name),
+ "next_step" = capitalize(surgery_step.name),
+ "chems_needed" = chems_needed,
+ "alternative_step" = alternative_step,
+ "alt_chems_needed" = alt_chems_needed
+ ))
else
data["patient"] = null
return data
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 6714354183..8ebb64097d 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -2,14 +2,13 @@
name = "\improper AI system integrity restorer"
desc = "Used with intelliCards containing nonfunctional AIs to restore them to working order."
req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS)
- var/mob/living/silicon/ai/occupier = null
- var/active = 0
- circuit = /obj/item/circuitboard/computer/aifixer
icon_keyboard = "tech_key"
icon_screen = "ai-fixer"
light_color = LIGHT_COLOR_PINK
- ui_x = 370
- ui_y = 360
+ circuit = /obj/item/circuitboard/computer/aifixer
+
+ var/mob/living/silicon/ai/occupier = null
+ var/active = FALSE
/obj/machinery/computer/aifixer/attackby(obj/I, mob/user, params)
if(occupier && istype(I, /obj/item/screwdriver))
@@ -38,7 +37,7 @@
else
data["AI_present"] = TRUE
data["name"] = occupier.name
- data["restoring"] = restoring
+ data["restoring"] = active
data["health"] = (occupier.health + 100) / 2
data["isDead"] = occupier.stat == DEAD
data["laws"] = occupier.laws.get_law_list(include_zeroth = TRUE, render_html = FALSE)
@@ -49,14 +48,14 @@
if(..())
return
if(!occupier)
- restoring = FALSE
+ active = FALSE
switch(action)
if("PRG_beginReconstruction")
if(occupier?.health < 100)
to_chat(usr, "Reconstruction in progress. This will take several minutes.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, FALSE)
- restoring = TRUE
+ active = TRUE
occupier.notify_ghost_cloning("Your core files are being restored!", source = src)
. = TRUE
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index eaee100510..c14837b8e3 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -183,7 +183,7 @@
/obj/machinery/computer/apc_control/proc/log_activity(log_text)
if(!should_log)
return
- LAZYADD(logs, "([station_time_timestamp()]): [auth_id] [log_text]")
+ LAZYADD(logs, "([STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]): [auth_id] [log_text]")
/obj/machinery/computer/apc_control/proc/restore_comp()
obj_flags &= ~EMAGGED
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 5c8173adae..d42291cd3c 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -72,7 +72,7 @@
use_power(active_power_usage)
// Register map objects
user.client.register_map_obj(cam_screen)
- for(var/plane in cam_plane_masters)
+ for(var/plane in cam_plane_master)
user.client.register_map_obj(plane)
user.client.register_map_obj(cam_background)
// Open UI
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 80ce1eaa3a..756f924cfa 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -9,6 +9,7 @@
var/active = FALSE
var/list/rangers = list()
var/stop = 0
+ var/volume = 70
var/datum/track/selection = null
/obj/machinery/jukebox/disco
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 5ca77cb1e2..4a576c5a6e 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -372,7 +372,7 @@ GLOBAL_LIST_EMPTY(network_holopads)
if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2)))
HC.Answer(src)
break
- if(HC.head_call && !secure)
+ if(!secure) //HC.head_call &&
HC.Answer(src)
break
if(outgoing_call)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 04e91d12ae..e8218549ad 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -25,7 +25,7 @@
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
req_access = list(ACCESS_SECURITY) /// Only people with Security access
- power_channel = AREA_USAGE_EQUIP //drains power from the EQUIPMENT channel
+ power_channel = EQUIP //drains power from the EQUIPMENT channel
max_integrity = 160 //the turret's health
integrity_failure = 0.5
armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
@@ -91,6 +91,8 @@
var/datum/action/turret_toggle/toggle_action
/// Mob that is remotely controlling the turret
var/mob/remote_controller
+ /// MISSING:
+ var/shot_stagger = 0
/obj/machinery/porta_turret/Initialize()
. = ..()
@@ -126,10 +128,12 @@
/obj/machinery/porta_turret/proc/check_should_process()
if (datum_flags & DF_ISPROCESSING)
if (!on || !anchored || (stat & BROKEN) || !powered())
- end_processing()
+ //end_processing()
+ STOP_PROCESSING(SSmachines, src)
else
if (on && anchored && !(stat & BROKEN) && powered())
- begin_processing()
+ START_PROCESSING(SSmachines, src)
+ //begin_processing()
/obj/machinery/porta_turret/update_icon_state()
if(!anchored)
@@ -934,7 +938,7 @@
locked = FALSE
/obj/machinery/turretid/attack_ai(mob/user)
- if(!ailock || isAdminGhostAI(user))
+ if(!ailock || IsAdminGhost(user))
return attack_hand(user)
else
to_chat(user, "There seems to be a firewall preventing you from accessing this device!")
@@ -948,7 +952,7 @@
/obj/machinery/turretid/ui_data(mob/user)
var/list/data = list()
data["locked"] = locked
- data["siliconUser"] = user.has_unlimited_silicon_privilege
+ data["siliconUser"] = hasSiliconAccessInArea(user) || IsAdminGhost(user)
data["enabled"] = enabled
data["lethal"] = lethal
data["shootCyborgs"] = shoot_cyborgs
@@ -961,7 +965,7 @@
switch(action)
if("lock")
- if(!usr.has_unlimited_silicon_privilege)
+ if(!hasSiliconAccessInArea(usr) || IsAdminGhost(usr))
return
if((obj_flags & EMAGGED) || (stat & BROKEN))
to_chat(usr, "The turret control is unresponsive!")
@@ -1122,7 +1126,7 @@
installation = /obj/item/gun/energy/laser/bluetag
team_color = "blue"
-/obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/P)
+/obj/machinery/porta_turret/lasertag/bullet_act(obj/item/projectile/P)
. = ..()
if(on)
if(team_color == "blue")
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 86cdd87505..ef1565502e 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -11,10 +11,15 @@
var/equip_ready = 1 //whether the equipment is ready for use. (or deactivated/activated for static stuff)
var/energy_drain = 0
var/obj/mecha/chassis = null
- var/range = MELEE //bitFflags
+ /// Bitflag. Determines the range of the equipment.
+ var/range = MELEE
+ /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this.
+ var/mech_flags = NONE
var/salvageable = 1
+ //var/detachable = TRUE // Set to FALSE for built-in equipment that cannot be removed
var/selectable = 1 // Set to 0 for passive equipment such as mining scanner or armor plates
var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist.
+ //var/destroy_sound = 'sound/mecha/critdestr.ogg'
/obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page()
if(chassis)
@@ -35,9 +40,14 @@
if(chassis.selected == src)
chassis.selected = null
src.update_chassis_page()
- chassis.occupant_message("[src] is destroyed!")
+ //log_message("[src] is destroyed.", LOG_MECHA)
chassis.log_append_to_last("[src] is destroyed.",1)
- SEND_SOUND(chassis.occupant, sound(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon) ? 'sound/mecha/weapdestr.ogg' : 'sound/mecha/critdestr.ogg', volume=50))
+ if(chassis.occupant)
+ chassis.occupant_message("[src] is destroyed!")
+ SEND_SOUND(chassis.occupant, sound(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon) ? 'sound/mecha/weapdestr.ogg' : 'sound/mecha/critdestr.ogg', volume=50))
+ //chassis.occupant.playsound_local(chassis, destroy_sound, 50)
+ //if(!detachable) //If we're a built-in nondetachable equipment, let's lock up the slot that we were in.
+ // chassis.max_equip--
chassis = null
return ..()
@@ -59,7 +69,7 @@
return txt
/obj/item/mecha_parts/mecha_equipment/proc/is_ranged()//add a distance restricted equipment. Why not?
- return range&RANGED
+ return range&RANGED //rename to MECHA_RANGE and MECHA_MELEE
/obj/item/mecha_parts/mecha_equipment/proc/is_melee()
return range&MELEE
@@ -72,10 +82,10 @@
return 0
if(!equip_ready)
return 0
- if(crit_fail)
- return 0
if(energy_drain && !chassis.has_charge(energy_drain))
return 0
+ if(crit_fail)
+ return 0
if(chassis.equipment_disabled)
to_chat(chassis.occupant, "Error -- Equipment control unit is unresponsive.")
return 0
@@ -117,8 +127,6 @@
chassis = M
forceMove(M)
M.mecha_log_message("[src] initialized.")
- if(!M.selected && selectable)
- M.selected = src
src.update_chassis_page()
return
@@ -150,7 +158,7 @@
chassis.occupant_message("[icon2html(src, chassis.occupant)] [message]")
return
-/obj/item/mecha_parts/mecha_equipment/proc/mecha_log_message(message, color)
+/obj/item/mecha_parts/mecha_equipment/proc/mecha_log_message(message, color) //on tg this just overrides log_message
log_message(message, LOG_GAME, color) //pass to default admin logging too
if(chassis)
chassis.mecha_log_message(message, color) //and pass to our chassis
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 4a4d58ea73..1435f78718 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -1,6 +1,7 @@
// Sleeper, Medical Beam, and Syringe gun
/obj/item/mecha_parts/mecha_equipment/medical
+ mech_flags = EXOSUIT_MODULE_MEDICAL
/obj/item/mecha_parts/mecha_equipment/medical/Initialize()
. = ..()
diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm
index d4a29f639d..7c7c6be2bc 100644
--- a/code/game/mecha/equipment/tools/mining_tools.dm
+++ b/code/game/mecha/equipment/tools/mining_tools.dm
@@ -17,6 +17,7 @@
toolspeed = 0.9
var/drill_delay = 7
var/drill_level = DRILL_BASIC
+ mech_flags = EXOSUIT_MODULE_WORKING | EXOSUIT_MODULE_COMBAT
/obj/item/mecha_parts/mecha_equipment/drill/Initialize()
. = ..()
@@ -153,6 +154,7 @@
selectable = 0
equip_cooldown = 15
var/scanning_time = 0
+ mech_flags = EXOSUIT_MODULE_WORKING
/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize()
. = ..()
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 759fcd996d..1c4586205a 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -8,11 +8,12 @@
icon_state = "mecha_clamp"
equip_cooldown = 15
energy_drain = 10
+ tool_behaviour = TOOL_RETRACTOR
+ toolspeed = 0.8
var/dam_force = 20
var/obj/mecha/working/ripley/cargo_holder
harmful = TRUE
- tool_behaviour = TOOL_RETRACTOR
- toolspeed = 0.8
+ mech_flags = EXOSUIT_MODULE_RIPLEY
/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj)
if(..())
@@ -180,6 +181,7 @@
equip_cooldown = 5
energy_drain = 0
range = MELEE|RANGED
+ mech_flags = EXOSUIT_MODULE_WORKING
/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize()
. = ..()
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 65aa001fe1..f2bced4aa8 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -9,6 +9,7 @@
var/projectile_delay = 0
var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired.
var/kickback = TRUE //Will using this weapon in no grav push mecha back.
+ mech_flags = EXOSUIT_MODULE_COMBAT
/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/mecha/combat/M)
if(..())
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 714878cf56..817ef95de4 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -9,9 +9,9 @@
active_power_usage = 5000
req_access = list(ACCESS_ROBOTICS)
circuit = /obj/item/circuitboard/machine/mechfab
- processing_flags = START_PROCESSING_MANUALLY
+ // processing_flags = START_PROCESSING_MANUALLY
- subsystem_type = /datum/controller/subsystem/processing/fastprocess
+ // subsystem_type = /datum/controller/subsystem/processing/fastprocess
/// Current items in the build queue.
var/list/queue = list()
@@ -66,7 +66,7 @@
/obj/machinery/mecha_part_fabricator/Initialize(mapload)
stored_research = new
rmat = AddComponent(/datum/component/remote_materials, "mechfab", mapload && link_on_init)
-
+
RefreshParts() //Recalculating local material sizes if the fab isn't linked
return ..()
@@ -152,10 +152,14 @@
category_override = list()
if(mech_types & EXOSUIT_MODULE_RIPLEY)
category_override += "Ripley"
+ if(mech_types & EXOSUIT_MODULE_FIREFIGHTER)
+ category_override += "Firefighter"
if(mech_types & EXOSUIT_MODULE_ODYSSEUS)
category_override += "Odysseus"
// if(mech_types & EXOSUIT_MODULE_CLARKE)
// category_override += "Clarke"
+ if(mech_types & EXOSUIT_MODULE_GYGAX_MED)
+ category_override += "Medical-Spec Gygax"
if(mech_types & EXOSUIT_MODULE_GYGAX)
category_override += "Gygax"
if(mech_types & EXOSUIT_MODULE_DURAND)
@@ -330,7 +334,8 @@
// If we're not processing the queue anymore or there's nothing to build, end processing.
if(!process_queue || !build_next_in_queue())
on_finish_printing()
- end_processing()
+ STOP_PROCESSING(SSfastprocess, src)
+ //end_processing()
return TRUE
on_start_printing()
@@ -572,7 +577,8 @@
process_queue = TRUE
if(!being_built)
- begin_processing()
+ START_PROCESSING(SSfastprocess, src)
+ //begin_processing()
return
if("stop_queue")
// Pause queue building. Also known as stop.
@@ -591,7 +597,8 @@
if(build_part(D))
on_start_printing()
- begin_processing()
+ START_PROCESSING(SSfastprocess, src)
+ //begin_processing() teege has this as a helper proc. please port it!
return
if("move_queue_part")
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index e75a18dca8..41270bb09e 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -8,7 +8,7 @@
anchored = TRUE
light_range = 3
var/movechance = 70
- var/obj/item/assembly/signaler/anomaly/aSignal
+ var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly
var/area/impact_area
var/lifespan = 990
@@ -23,8 +23,10 @@
START_PROCESSING(SSobj, src)
impact_area = get_area(src)
- aSignal = new(src)
- aSignal.name = "[name] core"
+ if (!impact_area)
+ return INITIALIZE_HINT_QDEL
+
+ aSignal = new aSignal(src)
aSignal.code = rand(1,100)
aSignal.anomaly_type = type
@@ -75,7 +77,7 @@
/obj/effect/anomaly/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/analyzer))
+ if(I.tool_behaviour == TOOL_ANALYZER) //revert if runtimed
to_chat(user, "Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].")
///////////////////////
@@ -85,6 +87,7 @@
icon_state = "shield2"
density = FALSE
var/boing = 0
+ aSignal = /obj/item/assembly/signaler/anomaly/grav
/obj/effect/anomaly/grav/anomalyEffect()
..()
@@ -95,17 +98,23 @@
for(var/mob/living/M in range(0, src))
gravShock(M)
for(var/mob/living/M in orange(4, src))
- step_towards(M,src)
+ if(!M.mob_negates_gravity()) //delete when runtimed
+ step_towards(M,src)
for(var/obj/O in range(0,src))
if(!O.anchored)
+ //if(isturf(O.loc))
+ // var/turf/T = O.loc
+ // if(T.intact && HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE))
+ // continue
var/mob/living/target = locate() in view(4,src)
if(target && !target.stat)
O.throw_at(target, 5, 10)
-/obj/effect/anomaly/grav/Crossed(mob/A)
- gravShock(A)
+/obj/effect/anomaly/grav/Crossed(atom/movable/AM)
+ . = ..()
+ gravShock(AM)
-/obj/effect/anomaly/grav/Bump(mob/A)
+/obj/effect/anomaly/grav/Bump(atom/A)
gravShock(A)
/obj/effect/anomaly/grav/Bumped(atom/movable/AM)
@@ -138,6 +147,7 @@
name = "flux wave anomaly"
icon_state = "electricity2"
density = TRUE
+ aSignal = /obj/item/assembly/signaler/anomaly/flux
var/canshock = FALSE
var/shockdamage = 20
var/explosive = TRUE
@@ -148,11 +158,12 @@
for(var/mob/living/M in range(0, src))
mobShock(M)
-/obj/effect/anomaly/flux/Crossed(mob/living/M)
- mobShock(M)
+/obj/effect/anomaly/flux/Crossed(atom/movable/AM)
+ . = ..()
+ mobShock(AM)
-/obj/effect/anomaly/flux/Bump(mob/living/M)
- mobShock(M)
+/obj/effect/anomaly/flux/Bump(atom/A)
+ mobShock(A)
/obj/effect/anomaly/flux/Bumped(atom/movable/AM)
mobShock(AM)
@@ -160,7 +171,7 @@
/obj/effect/anomaly/flux/proc/mobShock(mob/living/M)
if(canshock && istype(M))
canshock = FALSE //Just so you don't instakill yourself if you slam into the anomaly five times in a second.
- M.electrocute_act(shockdamage, "[name]", flags = SHOCK_NOGLOVES)
+ M.electrocute_act(shockdamage, name, flags = SHOCK_NOGLOVES)
/obj/effect/anomaly/flux/detonate()
if(explosive)
@@ -176,6 +187,7 @@
icon = 'icons/obj/projectiles.dmi'
icon_state = "bluespace"
density = TRUE
+ aSignal = /obj/item/assembly/signaler/anomaly/bluespace
/obj/effect/anomaly/bluespace/anomalyEffect()
..()
@@ -187,7 +199,7 @@
do_teleport(AM, locate(AM.x, AM.y, AM.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/effect/anomaly/bluespace/detonate()
- var/turf/T = safepick(get_area_turfs(impact_area))
+ var/turf/T = pick(get_area_turfs(impact_area))
if(T)
// Calculate new position (searches through beacons in world)
var/obj/item/beacon/chosen
@@ -224,21 +236,23 @@
if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
A.forceMove(newloc)
- spawn()
- if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
- var/mob/M = A
- if(M.client)
- var/obj/blueeffect = new /obj(src)
- blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
- blueeffect.icon = 'icons/effects/effects.dmi'
- blueeffect.icon_state = "shieldsparkles"
- blueeffect.layer = FLASH_LAYER
- blueeffect.plane = FULLSCREEN_PLANE
- blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- M.client.screen += blueeffect
- sleep(20)
- M.client.screen -= blueeffect
- qdel(blueeffect)
+ if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
+ var/mob/M = A
+ if(M.client)
+ INVOKE_ASYNC(src, .proc/blue_effect, M)
+
+/obj/effect/anomaly/bluespace/proc/blue_effect(mob/M)
+ var/obj/blueeffect = new /obj(src)
+ blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
+ blueeffect.icon = 'icons/effects/effects.dmi'
+ blueeffect.icon_state = "shieldsparkles"
+ blueeffect.layer = FLASH_LAYER
+ blueeffect.plane = FULLSCREEN_PLANE
+ blueeffect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ M.client.screen += blueeffect
+ sleep(20)
+ M.client.screen -= blueeffect
+ qdel(blueeffect)
/////////////////////
@@ -246,6 +260,7 @@
name = "pyroclastic anomaly"
icon_state = "mustard"
var/ticks = 0
+ aSignal = /obj/item/assembly/signaler/anomaly/pyro
/obj/effect/anomaly/pyro/anomalyEffect()
..()
@@ -278,6 +293,7 @@
name = "vortex anomaly"
icon_state = "bhole3"
desc = "That's a nice station you have there. It'd be a shame if something happened to it."
+ aSignal = /obj/item/assembly/signaler/anomaly/vortex
/obj/effect/anomaly/bhole/anomalyEffect()
..()
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index ee26d81a0d..bb46577702 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -1,4 +1,4 @@
-GLOBAL_LIST_EMPTY(GPS_list)
+
/obj/item/gps
name = "global positioning system"
desc = "Helping lost spacemen find their way through the planets since 2016."
@@ -8,138 +8,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
slot_flags = ITEM_SLOT_BELT
obj_flags = UNIQUE_RENAME
var/gpstag = "COM0"
- var/emped = FALSE
- var/tracking = TRUE
- var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user.
- var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown
-
-/obj/item/gps/examine(mob/user)
- . = ..()
- var/turf/curr = get_turf(src)
- . += "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])"
- . += "Alt-click to switch it [tracking ? "off":"on"]."
/obj/item/gps/Initialize()
. = ..()
- GLOB.GPS_list += src
- name = "global positioning system ([gpstag])"
- add_overlay("working")
-
-/obj/item/gps/Destroy()
- GLOB.GPS_list -= src
- return ..()
-
-/obj/item/gps/emp_act(severity)
- . = ..()
- if (. & EMP_PROTECT_SELF)
- return
- emped = TRUE
- cut_overlay("working")
- add_overlay("emp")
- addtimer(CALLBACK(src, .proc/reboot), 300, TIMER_UNIQUE|TIMER_OVERRIDE) //if a new EMP happens, remove the old timer so it doesn't reactivate early
- SStgui.close_uis(src) //Close the UI control if it is open.
-
-/obj/item/gps/proc/reboot()
- emped = FALSE
- cut_overlay("emp")
- add_overlay("working")
-
-/obj/item/gps/AltClick(mob/user)
- . = ..()
- if(!user.canUseTopic(src, BE_CLOSE))
- return
- toggletracking(user)
- return TRUE
-
-/obj/item/gps/proc/toggletracking(mob/user)
- if(!user.canUseTopic(src, BE_CLOSE))
- return //user not valid to use gps
- if(emped)
- to_chat(user, "It's busted!")
- return
- if(tracking)
- cut_overlay("working")
- to_chat(user, "[src] is no longer tracking, or visible to other GPS devices.")
- tracking = FALSE
- else
- add_overlay("working")
- to_chat(user, "[src] is now tracking, and visible to other GPS devices.")
- tracking = TRUE
-
-
-/obj/item/gps/ui_interact(mob/user, ui_key = "gps", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
- if(emped)
- to_chat(user, "[src] fizzles weakly.")
- return
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- // Variable window height, depending on how many GPS units there are
- // to show, clamped to relatively safe range.
- var/gps_window_height = clamp(325 + GLOB.GPS_list.len * 14, 325, 700)
- ui = new(user, src, ui_key, "Gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height
- ui.open()
-
- ui.set_autoupdate(state = updating)
-
-
-/obj/item/gps/ui_data(mob/user)
- var/list/data = list()
- data["power"] = tracking
- data["tag"] = gpstag
- data["updating"] = updating
- data["globalmode"] = global_mode
- if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed
- return data
-
- var/turf/curr = get_turf(src)
- data["current"] = "[get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])"
- data["currentArea"] = "[get_area_name(curr, TRUE)]"
- data["currentCoords"] = "[curr.x], [curr.y], [curr.z]"
-
- var/list/signals = list()
- data["signals"] = list()
-
- for(var/gps in GLOB.GPS_list)
- var/obj/item/gps/G = gps
- if(G.emped || !G.tracking || G == src)
- continue
- var/turf/pos = get_turf(G)
- if(!global_mode && pos.z != curr.z)
- continue
- var/list/signal = list()
- signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS
- signal["coords"] = "[pos.x], [pos.y], [pos.z]"
- if(pos.z == curr.z) //Distance/Direction calculations for same z-level only
- signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs
- signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision.
-
- signals += list(signal) //Add this signal to the list of signals
- data["signals"] = signals
- return data
-
-
-
-/obj/item/gps/ui_act(action, params)
- if(..())
- return
- switch(action)
- if("rename")
- var/a = input("Please enter desired tag.", name, gpstag) as text
- a = copytext(sanitize(a), 1, 20)
- gpstag = a
- . = TRUE
- name = "global positioning system ([gpstag])"
-
- if("power")
- toggletracking(usr)
- . = TRUE
- if("updating")
- updating = !updating
- . = TRUE
- if("globalmode")
- global_mode = !global_mode
- . = TRUE
-
+ AddComponent(/datum/component/gps/item, gpstag)
/obj/item/gps/science
icon_state = "gps-s"
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index c50dc6e316..34aa36a70a 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -6,21 +6,24 @@
desc = "Protected by FRM."
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade"
+ w_class = WEIGHT_CLASS_SMALL
var/locked = FALSE
var/installed = 0
var/require_module = 0
var/list/module_type
+ /// Bitflags listing module compatibility. Used in the exosuit fabricator for creating sub-categories.
+ var/module_flags = NONE
// if true, is not stored in the robot to be ejected
// if module is reset
var/one_use = FALSE
/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R, user = usr)
if(R.stat == DEAD)
- to_chat(user, "[src] will not function on a deceased cyborg.")
+ to_chat(user, "[src] will not function on a deceased cyborg.")
return FALSE
if(module_type && !is_type_in_list(R.module, module_type))
- to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!")
- to_chat(user, "There's no mounting point for the module!")
+ to_chat(R, "Upgrade mounting error! No suitable hardpoint detected.")
+ to_chat(user, "There's no mounting point for the module!")
return FALSE
return TRUE
@@ -37,7 +40,7 @@
one_use = TRUE
/obj/item/borg/upgrade/rename/attack_self(mob/user)
- heldname = stripped_input(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN)
+ heldname = sanitize_name(stripped_input(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN), allow_numbers = TRUE)
/obj/item/borg/upgrade/rename/action(mob/living/silicon/robot/R)
. = ..()
@@ -95,6 +98,7 @@
desc = "Used to cool a mounted energy-based firearm, increasing the potential current in it and thus its recharge rate."
icon_state = "cyborg_upgrade3"
require_module = 1
+ module_flags = BORG_MODULE_SECURITY
/obj/item/borg/upgrade/disablercooler/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -147,6 +151,7 @@
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = list(/obj/item/robot_module/miner)
+ module_flags = BORG_MODULE_MINER
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -207,6 +212,7 @@
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = list(/obj/item/robot_module/butler)
+ module_flags = BORG_MODULE_JANITOR
/obj/item/borg/upgrade/tboh/action(mob/living/silicon/robot/R)
. = ..()
@@ -234,6 +240,7 @@
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = list(/obj/item/robot_module/butler)
+ module_flags = BORG_MODULE_JANITOR
/obj/item/borg/upgrade/amop/action(mob/living/silicon/robot/R)
. = ..()
@@ -283,6 +290,7 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF
require_module = 1
module_type = list(/obj/item/robot_module/miner)
+ module_flags = BORG_MODULE_MINER
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -402,6 +410,7 @@
module_type = list(/obj/item/robot_module/medical,
/obj/item/robot_module/syndicate_medical)
var/list/additional_reagents = list()
+ module_flags = BORG_MODULE_MEDICAL
/obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -471,6 +480,7 @@
require_module = 1
module_type = list(/obj/item/robot_module/medical,
/obj/item/robot_module/syndicate_medical)
+ module_flags = BORG_MODULE_MEDICAL
/obj/item/borg/upgrade/processor/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -578,6 +588,7 @@
icon_state = "borg_BS_RPED"
require_module = TRUE
module_type = list(/obj/item/robot_module/engineering, /obj/item/robot_module/saboteur)
+ module_flags = BORG_MODULE_ENGINEERING
/obj/item/borg/upgrade/rped/action(mob/living/silicon/robot/R, user = usr)
. = ..()
@@ -612,8 +623,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "pinpointer_crew"
require_module = TRUE
- module_type = list(/obj/item/robot_module/medical,
- /obj/item/robot_module/syndicate_medical)
+ module_type = list(/obj/item/robot_module/medical, /obj/item/robot_module/syndicate_medical)
+ module_flags = BORG_MODULE_MEDICAL
/obj/item/borg/upgrade/pinpointer/action(mob/living/silicon/robot/R, user = usr)
. = ..()
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index c7e013f802..47584a1775 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -45,8 +45,6 @@
var/height = 11
var/list/grid
var/canvas_color = "#ffffff" //empty canvas color
- var/ui_x = 400
- var/ui_y = 400
var/used = FALSE
var/painting_name //Painting name, this is set after framing.
var/finalized = FALSE //Blocks edits
@@ -194,8 +192,6 @@
icon_state = "19x19"
width = 19
height = 19
- ui_x = 600
- ui_y = 600
pixel_x = 6
pixel_y = 9
framed_offset_x = 8
@@ -205,8 +201,6 @@
icon_state = "23x19"
width = 23
height = 19
- ui_x = 800
- ui_y = 600
pixel_x = 4
pixel_y = 10
framed_offset_x = 6
@@ -216,8 +210,6 @@
icon_state = "23x23"
width = 23
height = 23
- ui_x = 800
- ui_y = 800
pixel_x = 5
pixel_y = 9
framed_offset_x = 5
@@ -266,7 +258,7 @@
/obj/structure/sign/painting/examine(mob/user)
. = ..()
if(C)
- C.ui_interact(user,state = GLOB.physical_obscured_state)
+ C.ui_interact(user)
/obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I)
. = ..()
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index e44ba0cb11..19c0f0aed1 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -345,7 +345,7 @@
name = initial(I.name)
icon = initial(I.icon)
icon_state = initial(I.icon_state)
-
+/* Selling people in jars is currently disabled.
/obj/structure/displaycase/forsale
name = "vend-a-tray"
icon = 'icons/obj/stationobjs.dmi'
@@ -553,3 +553,4 @@
/obj/structure/displaycase/forsale/kitchen
desc = "A display case with an ID-card swiper. Use your ID to purchase the contents. Meant for the bartender and chef."
req_one_access = list(ACCESS_KITCHEN, ACCESS_BAR)
+*/
\ No newline at end of file
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 8e780beb0c..a18906b70b 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -661,15 +661,16 @@ This is here to make the tiles around the station mininuke change when it's arme
if(isobserver(user) || HAS_TRAIT(user.mind, TRAIT_DISK_VERIFIER))
. += "The serial numbers on [src] are incorrect."
-/*
+/*
* You can't accidentally eat the nuke disk, bro
*/
+ /*
/obj/item/disk/nuclear/on_accidental_consumption(mob/living/carbon/M, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE)
M.visible_message("[M] looks like [M.p_theyve()] just bitten into something important.", \
- "Wait, is this the nuke disk?")
+ "Wait, is this the nuke disk?")
return discover_after
-
+*/
/obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/claymore/highlander) && !fake)
var/obj/item/claymore/highlander/H = I
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 80d1a8f81a..e586f97a28 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -24,7 +24,7 @@
moveToNullspace()
suicider = user.mind
suicide_mob = REF(user)
- return MANUAL_SUICIDE_NONLETHAL
+ return MANUAL_SUICIDE
/obj/item/assembly/signaler/proc/manual_suicide(datum/mind/suicidee)
var/mob/living/user = suicidee.current
@@ -36,7 +36,7 @@
user.visible_message("[user]'s [src] receives a signal and [user.p_they()] die[user.p_s()] like a gamer!")
user.adjustOxyLoss(200)//it sends an electrical pulse to their heart, killing them. or something.
user.death(0)
- user.set_suicide(TRUE)
+ //user.set_suicide(TRUE)
user.suicide_log()
playsound(user, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
qdel(src)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index eacb3978cb..d4ab7b5648 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -91,8 +91,8 @@
"stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png',
"stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png',
"stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png',
- "stamp-law" = 'icons/stamp_icons/large_stamp-law.png',
- "stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png'
+ "stamp-law" = 'icons/stamp_icons/large_stamp-law.png'
+ // "stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png'
// "stamp-mime" = 'icons/stamp_icons/large_stamp-mime.png',
// "stamp-centcom" = 'icons/stamp_icons/large_stamp-centcom.png',
// "stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png'
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index d1d6950108..b7eac1e591 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -125,9 +125,11 @@
refreshBay()
. = TRUE
if("bay5")
- bay = locate(/area/centcom/supplypod/loading/ert) in GLOB.sortedAreas
- refreshBay()
- . = TRUE
+ to_chat(usr, "LetterN is lazy and didin't bother porting this new cc area!")
+ return
+ // bay = locate(/area/centcom/supplypod/loading/ert) in GLOB.sortedAreas
+ // refreshBay()
+ // . = TRUE
if("pickDropoffTurf") //Enters a mode that lets you pick the dropoff location for reverse pods
if (picking_dropoff_turf)
picking_dropoff_turf = FALSE
@@ -487,11 +489,11 @@
return
if (launching || turf_picking) //If the launching param is true, we give the user new mouse icons.
if(launching)
- holder.mouse_up_icon = 'icons/effects/supplypod_target.dmi' //Icon for when mouse is released
- holder.mouse_down_icon = 'icons/effects/supplypod_down_target.dmi' //Icon for when mouse is pressed
+ holder.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_target.dmi' //Icon for when mouse is released
+ holder.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_down_target.dmi' //Icon for when mouse is pressed
if(turf_picking)
- holder.mouse_up_icon = 'icons/effects/supplypod_pickturf.dmi' //Icon for when mouse is released
- holder.mouse_down_icon = 'icons/effects/supplypod_pickturf_down.dmi' //Icon for when mouse is pressed
+ holder.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_pickturf.dmi' //Icon for when mouse is released
+ holder.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_pickturf_down.dmi' //Icon for when mouse is pressed
holder.mouse_pointer_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released)
holder.click_intercept = src //Create a click_intercept so we know where the user is clicking
else
@@ -612,8 +614,8 @@
toLaunch.reverse_dropoff_turf = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject
*/
toLaunch.update_icon()//we update_icon() here so that the door doesnt "flicker on" right after it lands
- var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/fly_me_to_the_moon]
- toLaunch.forceMove(shippingLane)
+ // var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/fly_me_to_the_moon]
+ // toLaunch.forceMove(shippingLane) The shipping lane is temporarily closed due to ratvarian blockades
if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those
if(launchRandomItem)
var/atom/movable/O = pick_n_take(launchList)
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index e16a7cf639..af44b54ed0 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -95,14 +95,11 @@
icon_state = "dominator"
density = TRUE
var/active = FALSE
- var/obj/item/gps/gps
var/credits_stored = 0
var/siphon_per_tick = 5
/obj/machinery/shuttle_scrambler/Initialize(mapload)
. = ..()
- gps = new/obj/item/gps/internal/pirate(src)
- gps.tracking = FALSE
update_icon()
/obj/machinery/shuttle_scrambler/process()
@@ -112,6 +109,7 @@
if(D)
var/siphoned = min(D.account_balance,siphon_per_tick)
D.adjust_money(-siphoned)
+ credits_stored += siphoned
interrupt_research()
else
return
@@ -120,7 +118,7 @@
/obj/machinery/shuttle_scrambler/proc/toggle_on(mob/user)
SSshuttle.registerTradeBlockade(src)
- gps.tracking = TRUE
+ AddComponent(/datum/component/gps, "Nautical Signal")
active = TRUE
to_chat(user,"You toggle [src] [active ? "on":"off"].")
to_chat(user,"The scrambling signal can be now tracked by GPS.")
@@ -130,7 +128,7 @@
if(!active)
if(alert(user, "Turning the scrambler on will make the shuttle trackable by GPS. Are you sure you want to do it?", "Scrambler", "Yes", "Cancel") == "Cancel")
return
- if(active || !user.canUseTopic(src))
+ if(active || !user.canUseTopic(src, BE_CLOSE))
return
toggle_on(user)
update_icon()
@@ -147,35 +145,31 @@
new /obj/effect/temp_visual/emp(get_turf(S))
/obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user)
- new /obj/item/holochip(drop_location(), credits_stored)
- to_chat(user,"You retrieve the siphoned credits!")
- credits_stored = 0
+ if(credits_stored) // Prevents spamming empty holochips
+ new /obj/item/holochip(drop_location(), credits_stored)
+ to_chat(user,"You retrieve the siphoned credits!")
+ credits_stored = 0
+ else
+ to_chat(user,"There's nothing to withdraw.")
/obj/machinery/shuttle_scrambler/proc/send_notification()
priority_announce("Data theft signal detected, source registered on local gps units.")
/obj/machinery/shuttle_scrambler/proc/toggle_off(mob/user)
SSshuttle.clearTradeBlockade(src)
- gps.tracking = FALSE
active = FALSE
STOP_PROCESSING(SSobj,src)
-/obj/machinery/shuttle_scrambler/update_overlays()
- . = ..()
+/obj/machinery/shuttle_scrambler/update_icon_state()
if(active)
- var/mutable_appearance/M = mutable_appearance(icon, "dominator-overlay")
- M.color = "#00FFFF"
- . += M
+ icon_state = "dominator-blue"
+ else
+ icon_state = "dominator"
/obj/machinery/shuttle_scrambler/Destroy()
toggle_off()
- QDEL_NULL(gps)
return ..()
-/obj/item/gps/internal/pirate
- gpstag = "Nautical Signal"
- desc = "You can hear shanties over the static."
-
/obj/machinery/computer/shuttle/pirate
name = "pirate shuttle console"
shuttleId = "pirateship"
diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm
index 27eb3a6ae9..b5f3bae53d 100644
--- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm
+++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm
@@ -25,12 +25,12 @@
return ..()
/datum/ntnet_conversation/proc/add_message(message, username)
- message = "[station_time_timestamp()] [username]: [message]"
+ message = "[STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)] [username]: [message]"
messages.Add(message)
trim_message_list()
/datum/ntnet_conversation/proc/add_status_message(message)
- messages.Add("[station_time_timestamp()] -!- [message]")
+ messages.Add("[STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)] -!- [message]")
trim_message_list()
/datum/ntnet_conversation/proc/trim_message_list()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 796cf227f5..e2f8c4e58a 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -25,9 +25,6 @@
QDEL_NULL(soundloop)
return ..()
-/obj/machinery/power/port_gen/should_have_node() //remove if runtimed
- return anchored
-
/obj/machinery/power/port_gen/connect_to_network()
if(!anchored)
return FALSE
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 0111c893a6..a4fc7d0641 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -75,9 +75,6 @@
if(!initial(charge) && !charge)
charge = C / 15000 * 1e6
-/obj/machinery/power/smes/should_have_node() //remove if runtimed.
- return TRUE
-
/obj/machinery/power/smes/attackby(obj/item/I, mob/user, params)
//opening using screwdriver
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I))
diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm
new file mode 100644
index 0000000000..7aeb7b3a9b
--- /dev/null
+++ b/code/modules/research/anomaly/anomaly_core.dm
@@ -0,0 +1,63 @@
+// Embedded signaller used in anomalies.
+/obj/item/assembly/signaler/anomaly
+ name = "anomaly core"
+ desc = "The neutralized core of an anomaly. It'd probably be valuable for research."
+ icon_state = "anomaly_core"
+ //inhand_icon_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ resistance_flags = FIRE_PROOF
+ var/anomaly_type = /obj/effect/anomaly
+
+/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
+ if(!signal)
+ return FALSE
+ if(signal.data["code"] != code)
+ return FALSE
+ if(suicider)
+ manual_suicide(suicider)
+ for(var/obj/effect/anomaly/A in get_turf(src))
+ A.anomalyNeutralize()
+ return TRUE
+
+/obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user)
+ user.visible_message("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!")
+ //user.set_suicide(TRUE)
+ user.suicide_log()
+ user.gib()
+
+/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_ANALYZER)
+ to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].")
+ return ..()
+
+//Anomaly cores
+/obj/item/assembly/signaler/anomaly/pyro
+ name = "\improper pyroclastic anomaly core"
+ desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research."
+ icon_state = "pyro_core"
+ anomaly_type = /obj/effect/anomaly/pyro
+
+/obj/item/assembly/signaler/anomaly/grav
+ name = "\improper gravitational anomaly core"
+ desc = "The neutralized core of a gravitational anomaly. It feels much heavier than it looks. It'd probably be valuable for research."
+ icon_state = "grav_core"
+ anomaly_type = /obj/effect/anomaly/grav
+
+/obj/item/assembly/signaler/anomaly/flux
+ name = "\improper flux anomaly core"
+ desc = "The neutralized core of a flux anomaly. Touching it makes your skin tingle. It'd probably be valuable for research."
+ icon_state = "flux_core"
+ anomaly_type = /obj/effect/anomaly/flux
+
+/obj/item/assembly/signaler/anomaly/bluespace
+ name = "\improper bluespace anomaly core"
+ desc = "The neutralized core of a bluespace anomaly. It keeps phasing in and out of view. It'd probably be valuable for research."
+ icon_state = "anomaly_core"
+ anomaly_type = /obj/effect/anomaly/bluespace
+
+/obj/item/assembly/signaler/anomaly/vortex
+ name = "\improper vortex anomaly core"
+ desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research."
+ icon_state = "vortex_core"
+ anomaly_type = /obj/effect/anomaly/bhole
diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm
index eb9ab40744..7b36a614a7 100644
--- a/code/modules/research/bepis.dm
+++ b/code/modules/research/bepis.dm
@@ -103,7 +103,7 @@
return
account.adjust_money(-deposit_value) //The money vanishes, not paid to any accounts.
SSblackbox.record_feedback("amount", "BEPIS_credits_spent", deposit_value)
- log_econ("[deposit_value] credits were inserted into [src] by [account.account_holder]")
+ //log_econ("[deposit_value] credits were inserted into [src] by [account.account_holder]")
banked_cash += deposit_value
use_power(1000 * power_saver)
say("Cash deposit successful. There is [banked_cash] in the chamber.")
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 07369b9798..4c3f30a786 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -258,7 +258,7 @@
if(!GLOB.bsa_unlock)
return
var/list/gps_locators = list()
- for(var/obj/item/gps/G in GLOB.GPS_list) //nulls on the list somehow
+ for(var/datum/component/gps/G in GLOB.GPS_list) //nulls on the list somehow
if(G.tracking)
gps_locators[G.gpstag] = G
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 4a5ec56535..fa88cc1338 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -84,7 +84,7 @@
/mob/living/silicon/robot/shared_ui_interaction(src_object)
// Disable UIs if the Borg is unpowered or locked.
- if(!cell || cell.charge <= 0 || lockcharge)
+ if(!cell || cell.charge <= 0 || locked_down)
return UI_DISABLED
return ..()
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 95f2771c36..994815dc49 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -816,7 +816,7 @@ GLOBAL_LIST_EMPTY(vending_products)
if(D)
D.adjust_money(price_to_use)
SSblackbox.record_feedback("amount", "vending_spent", price_to_use)
- log_econ("[price_to_use] credits were inserted into [src] by [D.account_holder] to buy [R].")
+ //log_econ("[price_to_use] credits were inserted into [src] by [D.account_holder] to buy [R].")
if(last_shopper != usr || purchase_message_cooldown < world.time)
say("Thank you for shopping with [src]!")
purchase_message_cooldown = world.time + 5 SECONDS
diff --git a/icons/effects/supplypod_down_target.dmi b/icons/effects/mouse_pointers/supplypod_down_target.dmi
similarity index 100%
rename from icons/effects/supplypod_down_target.dmi
rename to icons/effects/mouse_pointers/supplypod_down_target.dmi
diff --git a/icons/effects/mouse_pointers/supplypod_pickturf.dmi b/icons/effects/mouse_pointers/supplypod_pickturf.dmi
new file mode 100644
index 0000000000..3ca1131e1a
Binary files /dev/null and b/icons/effects/mouse_pointers/supplypod_pickturf.dmi differ
diff --git a/icons/effects/mouse_pointers/supplypod_pickturf_down.dmi b/icons/effects/mouse_pointers/supplypod_pickturf_down.dmi
new file mode 100644
index 0000000000..113fe47540
Binary files /dev/null and b/icons/effects/mouse_pointers/supplypod_pickturf_down.dmi differ
diff --git a/icons/effects/supplypod_target.dmi b/icons/effects/mouse_pointers/supplypod_target.dmi
similarity index 100%
rename from icons/effects/supplypod_target.dmi
rename to icons/effects/mouse_pointers/supplypod_target.dmi
diff --git a/tgstation.dme b/tgstation.dme
index 0e3485fb36..c415424793 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -47,6 +47,7 @@
#include "code\__DEFINES\dynamic.dm"
#include "code\__DEFINES\economy.dm"
#include "code\__DEFINES\events.dm"
+#include "code\__DEFINES\exosuit_fabs.dm"
#include "code\__DEFINES\exports.dm"
#include "code\__DEFINES\fantasy_affixes.dm"
#include "code\__DEFINES\food.dm"
@@ -426,6 +427,7 @@
#include "code\datums\components\field_of_vision.dm"
#include "code\datums\components\footstep.dm"
#include "code\datums\components\fried.dm"
+#include "code\datums\components\gps.dm"
#include "code\datums\components\identification.dm"
#include "code\datums\components\igniter.dm"
#include "code\datums\components\infective.dm"
@@ -3068,6 +3070,7 @@
#include "code\modules\research\research_disk.dm"
#include "code\modules\research\server.dm"
#include "code\modules\research\stock_parts.dm"
+#include "code\modules\research\anomaly\anomaly_core.dm"
#include "code\modules\research\designs\AI_module_designs.dm"
#include "code\modules\research\designs\autobotter_designs.dm"
#include "code\modules\research\designs\autoylathe_designs.dm"