diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 4e60163547..c59cc6e714 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -130,5 +130,21 @@
user.drop_item()
src.throw_at(target, throw_range, throw_speed, user)
+/obj/item/weapon/beach_ball/dodgeball
+ icon = 'icons/obj/balls_vr.dmi'
+ icon_state = "dodgeball"
+ item_state = "dodgeball"
+ item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_balls_vr.dmi')
+ name = "dodgeball"
+ desc = "Think fast, chucklenuts!"
+ w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets
+ force = 0.1
+ throwforce = 0.1
+ throw_speed = 5
+ throw_range = 15
+ drop_sound = 'sound/items/drop/rubber.ogg'
+ pickup_sound = 'sound/items/pickup/rubber.ogg'
+ hitsound = 'sound/weapons/dodgeball.ogg'
+
/obj/effect/spawner
name = "object spawner"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 9a72196f8d..a3430383ef 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -43,7 +43,9 @@
var/no_air = null
// var/list/lights // list of all lights on this area
var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
+ var/list/all_arfgs = null //Similar, but a list of all arfgs adjacent to this area
var/firedoors_closed = 0
+ var/arfgs_active = 0
var/list/ambience = list()
var/list/forced_ambience = null
var/sound_env = STANDARD_STATION
@@ -128,10 +130,11 @@
return 1
return 0
-// Either close or open firedoors depending on current alert statuses
+// Either close or open firedoors and arfgs depending on current alert statuses
/area/proc/firedoors_update()
if(fire || party || atmosalm)
firedoors_close()
+ arfgs_activate()
// VOREStation Edit - Make the lights colored!
if(fire)
for(var/obj/machinery/light/L in src)
@@ -142,6 +145,7 @@
// VOREStation Edit End
else
firedoors_open()
+ arfgs_deactivate()
// VOREStation Edit - Put the lights back!
for(var/obj/machinery/light/L in src)
L.reset_alert()
@@ -175,6 +179,25 @@
spawn(0)
E.open()
+// Activate all retention fields!
+/area/proc/arfgs_activate()
+ if(!arfgs_active)
+ arfgs_active = TRUE
+ if(!all_arfgs)
+ return
+ for(var/obj/machinery/atmospheric_field_generator/E in all_arfgs)
+ E.generate_field() //don't need to check powered state like doors, the arfgs handles it on its end
+ E.wasactive = TRUE
+
+// Deactivate retention fields!
+/area/proc/arfgs_deactivate()
+ if(arfgs_active)
+ arfgs_active = FALSE
+ if(!all_arfgs)
+ return
+ for(var/obj/machinery/atmospheric_field_generator/E in all_arfgs)
+ E.disable_field()
+ E.wasactive = FALSE
/area/proc/fire_alert()
if(!fire)
diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm
index 3d7547debc..d4526e6346 100644
--- a/code/game/jobs/job/civilian_vr.dm
+++ b/code/game/jobs/job/civilian_vr.dm
@@ -221,7 +221,8 @@
"Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer,
"Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian,
"Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/clown/jester,"Fool" = /datum/alt_title/clown/fool,
- "Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur) //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer
+ "Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur, //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer
+ "Artist" = /datum/alt_title/artist)
// Entertainer Alt Titles
/datum/alt_title/actor
@@ -259,3 +260,7 @@
/datum/alt_title/tragedian
title = "Tragedian"
title_blurb = "A Tragedian will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?"
+
+/datum/alt_title/artist
+ title = "Artist"
+ title_blurb = "An Artist's calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity."
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index c28268b09d..509572aa98 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -166,11 +166,12 @@
///Assigns minimum age by race & brain type. Code says Positronic = mechanical and Drone = digital because nothing can be simple.
///Will first check based on brain type, then based on species.
/datum/job/proc/get_min_age(species_name, brain_type)
- return 18 // VOREStation Edit - Minimum character age by rules anyway, might as well return 18 instead of 0 or 1 or whatever.
- //return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Edit
+ return minimum_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species
+ //return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Removal
/datum/job/proc/get_ideal_age(species_name, brain_type)
- return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age
+ return ideal_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species
+ //return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age //VOREStation Removal
/datum/job/proc/is_species_banned(species_name, brain_type)
return FALSE // VOREStation Edit - Any species can be any job.
diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm
index 6ae91b66dd..23adcc1daf 100644
--- a/code/game/jobs/whitelist.dm
+++ b/code/game/jobs/whitelist.dm
@@ -100,6 +100,10 @@ var/list/whitelist = list()
if(!M || !module)
return 0
+ //Module is not even whitelisted
+ if(!(module in whitelisted_module_types))
+ return 1
+
//If we have a loaded file, search it
if(alien_whitelist)
for (var/s in alien_whitelist)
diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm
new file mode 100644
index 0000000000..9e9a2af168
--- /dev/null
+++ b/code/game/machinery/atm_ret_field.dm
@@ -0,0 +1,233 @@
+/obj/machinery/atmospheric_field_generator
+ name = "atmospheric retention field generator"
+ desc = "A floor-mounted piece of equipment that generates an atmosphere-retaining energy field when powered and activated. Linked to environmental alarm systems and will automatically activate when hazardous conditions are detected.
Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences."
+ icon = 'icons/obj/atm_fieldgen.dmi'
+ icon_state = "arfg_off"
+ anchored = TRUE
+ opacity = FALSE
+ density = FALSE
+ power_channel = ENVIRON //so they shut off last
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 10
+ active_power_usage = 2500
+ var/ispowered = TRUE
+ var/isactive = FALSE
+ var/wasactive = FALSE //controls automatic reboot after power-loss
+ var/alwaysactive = FALSE //for a special subtype
+
+ //how long it takes us to reboot if we're shut down by an EMP
+ var/reboot_delay_min = 50
+ var/reboot_delay_max = 75
+
+ var/hatch_open = FALSE
+ var/wires_intact = TRUE
+ var/list/areas_added
+ var/field_type = /obj/structure/atmospheric_retention_field
+ circuit = /obj/item/weapon/circuitboard/arf_generator
+
+/obj/machinery/atmospheric_field_generator/impassable
+ desc = "An older model of ARF-G that generates an impassable retention field. Works just as well as the modern variety, but is slightly more energy-efficient.
Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences."
+ active_power_usage = 2000
+ field_type = /obj/structure/atmospheric_retention_field/impassable
+
+/obj/machinery/atmospheric_field_generator/perma
+ name = "static atmospheric retention field generator"
+ desc = "A floor-mounted piece of equipment that generates an atmosphere-retaining energy field when powered and activated. This model is designed to always be active, though the field will still drop from loss of power or electromagnetic interference.
Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences."
+ alwaysactive = TRUE
+ active_power_usage = 2000
+
+/obj/machinery/atmospheric_field_generator/perma/impassable
+ active_power_usage = 1500
+ field_type = /obj/structure/atmospheric_retention_field/impassable
+
+/obj/machinery/atmospheric_field_generator/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.is_crowbar() && isactive)
+ if(!src) return
+ to_chat(user, "You can't open the ARF-G whilst it's running!")
+ return
+ if(W.is_crowbar() && !isactive)
+ if(!src) return
+ to_chat(user, "You [hatch_open? "close" : "open"] \the [src]'s access hatch.")
+ hatch_open = !hatch_open
+ update_icon()
+ if(alwaysactive && wires_intact)
+ generate_field()
+ return
+ if(hatch_open && W.is_multitool())
+ if(!src) return
+ to_chat(user, "You toggle \the [src]'s activation behavior to [alwaysactive? "emergency" : "always-on"].")
+ alwaysactive = !alwaysactive
+ update_icon()
+ return
+ if(hatch_open && W.is_wirecutter())
+ if(!src) return
+ to_chat(user, "You [wires_intact? "cut" : "mend"] \the [src]'s wires!")
+ wires_intact = !wires_intact
+ update_icon()
+ return
+ if(hatch_open && istype(W,/obj/item/weapon/weldingtool))
+ if(!src) return
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.isOn()) return
+ if(WT.get_fuel() < 5) // uses up 5 fuel.
+ to_chat(user, "You need more fuel to complete this task.")
+ return
+ user.visible_message("[user] starts to disassemble \the [src].", "You start to disassemble \the [src].")
+ playsound(src, WT.usesound, 50, 1)
+ if(do_after(user,15 * W.toolspeed))
+ if(!src || !user || !WT.remove_fuel(5, user)) return
+ to_chat(user, "You fully disassemble \the [src]. There were no salvageable parts.")
+ qdel(src)
+ return
+
+/obj/machinery/atmospheric_field_generator/perma/Initialize()
+ generate_field()
+
+/obj/machinery/atmospheric_field_generator/update_icon()
+ if(stat & BROKEN)
+ icon_state = "arfg_broken"
+ else if(hatch_open && wires_intact)
+ icon_state = "arfg_open_wires"
+ else if(hatch_open && !wires_intact)
+ icon_state = "arfg_open_wirescut"
+ else if(isactive)
+ icon_state = "arfg_on"
+ else
+ icon_state = "arfg_off"
+
+/obj/machinery/atmospheric_field_generator/power_change()
+ var/oldstat
+ ..()
+ if(!(stat & NOPOWER))
+ ispowered = 1
+ update_icon()
+ if(alwaysactive || wasactive) //reboot our field if we were on or are supposed to be always-on
+ generate_field()
+ if(stat != oldstat && isactive && (stat & NOPOWER))
+ ispowered = 0
+ disable_field()
+ update_icon()
+
+/obj/machinery/atmospheric_field_generator/emp_act()
+ . = ..()
+ disable_field() //shutting dowwwwwwn
+ if(alwaysactive || wasactive) //reboot after a short delay if we were online before
+ spawn(rand(reboot_delay_min,reboot_delay_max))
+ generate_field()
+
+/obj/machinery/atmospheric_field_generator/ex_act(severity)
+ switch(severity)
+ if(1)
+ disable_field()
+ qdel(src)
+ return
+ if(2)
+ stat |= BROKEN
+ update_icon()
+ src.visible_message("The ARF-G cracks and shatters!","You hear an uncomfortable metallic crunch.")
+ disable_field()
+ if(3)
+ emp_act()
+ return
+
+/obj/machinery/atmospheric_field_generator/proc/generate_field()
+ if(!ispowered || hatch_open || !wires_intact || isactive) //if it's not powered, the hatch is open, the wires are busted, or it's already on, don't do anything
+ return
+ else
+ isactive = 1
+ icon_state = "arfg_on"
+ new field_type (src.loc)
+ src.visible_message("The ARF-G crackles to life!","You hear an ARF-G coming online!")
+ update_use_power(USE_POWER_ACTIVE)
+ return
+
+/obj/machinery/atmospheric_field_generator/proc/disable_field()
+ if(isactive)
+ icon_state = "arfg_off"
+ for(var/obj/structure/atmospheric_retention_field/F in loc)
+ qdel(F)
+ src.visible_message("The ARF-G shuts down with a low hum.","You hear an ARF-G powering down.")
+ update_use_power(USE_POWER_IDLE)
+ isactive = 0
+ return
+
+/obj/machinery/atmospheric_field_generator/Initialize()
+ . = ..()
+ //Delete ourselves if we find extra mapped in arfgs
+ for(var/obj/machinery/atmospheric_field_generator/F in loc)
+ if(F != src)
+ log_debug("Duplicate ARFGS at [x],[y],[z]")
+ return INITIALIZE_HINT_QDEL
+
+ var/area/A = get_area(src)
+ ASSERT(istype(A))
+
+ LAZYADD(A.all_arfgs, src)
+ areas_added = list(A)
+
+ for(var/direction in cardinal)
+ A = get_area(get_step(src,direction))
+ if(istype(A) && !(A in areas_added))
+ LAZYADD(A.all_arfgs, src)
+ areas_added += A
+
+/obj/structure/atmospheric_retention_field
+ name = "atmospheric retention field"
+ desc = "A shimmering forcefield that keeps the good air inside and the bad air outside. This field has been modulated so that it doesn't impede movement or projectiles.
Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences."
+ icon = 'icons/obj/atm_fieldgen.dmi'
+ icon_state = "arfg_field"
+ anchored = TRUE
+ density = FALSE
+ opacity = 0
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
+ //mouse_opacity = 0
+ can_atmos_pass = ATMOS_PASS_NO
+ var/basestate = "arfg_field"
+
+ light_range = 3
+ light_power = 1
+ light_color = "#FFFFFF"
+ light_on = TRUE
+
+/obj/structure/atmospheric_retention_field/update_icon()
+ cut_overlays() //overlays.Cut()
+ var/list/dirs = list()
+ for(var/obj/structure/atmospheric_retention_field/F in orange(src,1))
+ dirs += get_dir(src, F)
+
+ var/list/connections = dirs_to_corner_states(dirs)
+
+ icon_state = ""
+ for(var/i = 1 to 4)
+ var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1))
+ add_overlay(I)
+
+ return
+
+/obj/structure/atmospheric_retention_field/Initialize()
+ . = ..()
+ update_nearby_tiles() //Force ZAS update
+ update_connections(1)
+ update_icon()
+
+/obj/structure/atmospheric_retention_field/Destroy()
+ for(var/obj/structure/atmospheric_retention_field/W in orange(1, src.loc))
+ W.update_connections(1)
+ update_nearby_tiles() //Force ZAS update
+ . = ..()
+
+/obj/structure/atmospheric_retention_field/attack_hand(mob/user as mob)
+ if(density)
+ visible_message("You touch the retention field, and it crackles faintly. Tingly!")
+ else
+ visible_message("You try to touch the retention field, but pass through it like it isn't even there.")
+
+/obj/structure/atmospheric_retention_field/ex_act()
+ return
+
+/obj/structure/atmospheric_retention_field/impassable
+ desc = "A shimmering forcefield that keeps the good air inside and the bad air outside. It seems fairly solid, almost like it's made out of some kind of hardened light.
Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences."
+ icon = 'icons/obj/atm_fieldgen.dmi'
+ icon_state = "arfg_field"
+ density = TRUE
\ No newline at end of file
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 78f8569cb4..be8639e4bc 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -95,7 +95,7 @@
data["real_name"] = user.real_name
data["allow_items"] = allow_items
data["crew"] = frozen_crew
-
+
var/list/items = list()
if(allow_items)
for(var/F in frozen_items)
@@ -250,6 +250,10 @@
/obj/machinery/cryopod/robot/door/dorms
name = "Residential District Elevator"
desc = "A small elevator that goes down to the deeper section of the colony."
+ icon = 'icons/obj/Cryogenic2_vr.dmi'
+ icon_state = "lift_closed"
+ base_icon_state = "lift_open"
+ occupied_icon_state = "lift_closed"
on_store_message = "has departed for the residential district."
on_store_name = "Residential Oversight"
on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the residential district."
@@ -259,6 +263,10 @@
/obj/machinery/cryopod/robot/door/travel
name = "Passenger Elevator"
desc = "A small elevator that goes down to the passenger section of the vessel."
+ icon = 'icons/obj/Cryogenic2_vr.dmi'
+ icon_state = "lift_closed"
+ base_icon_state = "lift_open"
+ occupied_icon_state = "lift_closed"
on_store_message = "is slated to depart from the colony."
on_store_name = "Travel Oversight"
on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the hell that is economy class travel."
@@ -491,7 +499,7 @@
for(var/datum/data/record/G in data_core.general)
if((G.fields["name"] == to_despawn.real_name))
qdel(G)
-
+
// Also check the hidden version of each datacore, if they're an offmap role.
var/datum/job/J = SSjob.get_job(job)
if(J?.offmap_spawn)
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index ed4b086e73..d651ad2025 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -221,6 +221,11 @@
frame_style = FRAME_STYLE_WALL
x_offset = 28
y_offset = 28
+
+/datum/frame/frame_types/arfgs
+ name = "ARF Generator"
+ frame_class = FRAME_CLASS_MACHINE
+ frame_size = 3
//////////////////////////////
// Frame Object (Structure)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 351e6b8cf8..ac7658bc73 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -4,7 +4,7 @@
w_class = ITEMSIZE_NORMAL
blocks_emissive = EMISSIVE_BLOCK_GENERIC
- matter = list(MAT_STEEL = 1)
+ //matter = list(MAT_STEEL = 1)
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/randpixel = 6
@@ -251,7 +251,7 @@
var/obj/item/weapon/storage/S = src.loc
if(!S.remove_from_storage(src))
return
-
+
src.pickup(user)
src.throwing = 0
if (src.loc == user)
@@ -260,7 +260,7 @@
else
if(isliving(src.loc))
return
-
+
if(user.put_in_active_hand(src))
if(isturf(old_loc))
var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc)
@@ -834,7 +834,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!inhands)
apply_blood(standing) //Some items show blood when bloodied
apply_accessories(standing) //Some items sport accessories like webbing
-
+
//Apply overlays to our...overlay
apply_overlays(standing)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 9595f1ba80..3b20ccbb5c 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -1,3 +1,16 @@
+/*
+ * Contains:
+ * Flashlights
+ * Lamps
+ * Flares
+ * Chemlights
+ * Slime Extract
+ */
+
+/*
+ * Flashlights
+ */
+
/obj/item/device/flashlight
name = "flashlight"
desc = "A hand-held emergency light."
@@ -7,15 +20,15 @@
slot_flags = SLOT_BELT
matter = list(MAT_STEEL = 50,MAT_GLASS = 20)
action_button_name = "Toggle Flashlight"
-
+
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_range = 4 //luminosity when on
light_power = 0.8 //lighting power when on
light_color = "#FFFFFF" //LIGHT_COLOR_INCANDESCENT_FLASHLIGHT //lighting colour when on
light_cone_y_offset = -7
-
+
var/on = 0
-
+
var/obj/item/weapon/cell/cell
var/cell_type = /obj/item/weapon/cell/device
var/power_usage = 1
@@ -26,7 +39,7 @@
if(power_use && cell_type)
cell = new cell_type(src)
-
+
update_brightness()
/obj/item/device/flashlight/Destroy()
@@ -232,24 +245,34 @@
w_class = ITEMSIZE_TINY
power_use = 0
-/obj/item/device/flashlight/color //Default color is blue, just roll with it.
+/obj/item/device/flashlight/color //Default color is blue
name = "blue flashlight"
- desc = "A hand-held emergency light. This one is blue."
+ desc = "A small flashlight. This one is blue."
icon_state = "flashlight_blue"
+/obj/item/device/flashlight/color/green
+ name = "green flashlight"
+ desc = "A small flashlight. This one is green."
+ icon_state = "flashlight_green"
+
+/obj/item/device/flashlight/color/purple
+ name = "purple flashlight"
+ desc = "A small flashlight. This one is purple."
+ icon_state = "flashlight_purple"
+
/obj/item/device/flashlight/color/red
name = "red flashlight"
- desc = "A hand-held emergency light. This one is red."
+ desc = "A small flashlight. This one is red."
icon_state = "flashlight_red"
/obj/item/device/flashlight/color/orange
name = "orange flashlight"
- desc = "A hand-held emergency light. This one is orange."
+ desc = "A small flashlight. This one is orange."
icon_state = "flashlight_orange"
/obj/item/device/flashlight/color/yellow
name = "yellow flashlight"
- desc = "A hand-held emergency light. This one is yellow."
+ desc = "A small flashlight. This one is yellow."
icon_state = "flashlight_yellow"
/obj/item/device/flashlight/maglight
@@ -273,7 +296,11 @@
w_class = ITEMSIZE_TINY
power_use = 0
-// the desk lamps are a bit special
+/*
+ * Lamps
+ */
+
+// pixar desk lamp
/obj/item/device/flashlight/lamp
name = "desk lamp"
desc = "A desk lamp with an adjustable mount."
@@ -286,14 +313,6 @@
on = 1
light_system = STATIC_LIGHT
-
-// green-shaded desk lamp
-/obj/item/device/flashlight/lamp/green
- desc = "A classic green-shaded desk lamp."
- icon_state = "lampgreen"
- center_of_mass = list("x" = 15,"y" = 11)
- light_color = "#FFC58F"
-
/obj/item/device/flashlight/lamp/verb/toggle_light()
set name = "Toggle light"
set category = "Object"
@@ -302,7 +321,23 @@
if(!usr.stat)
attack_self(usr)
-// FLARES
+// green-shaded desk lamp
+/obj/item/device/flashlight/lamp/green
+ desc = "A classic green-shaded desk lamp."
+ icon_state = "lampgreen"
+ center_of_mass = list("x" = 15,"y" = 11)
+ light_color = "#FFC58F"
+
+// clown lamp
+/obj/item/device/flashlight/lamp/clown
+ desc = "A whacky banana peel shaped lamp."
+ icon_state = "bananalamp"
+ center_of_mass = list("x" = 15,"y" = 11)
+
+
+/*
+ * Flares
+ */
/obj/item/device/flashlight/flare
name = "flare"
@@ -368,18 +403,20 @@
START_PROCESSING(SSobj, src)
return 1
-//Glowsticks
+/*
+ * Chemlights
+ */
/obj/item/device/flashlight/glowstick
name = "green glowstick"
- desc = "A green military-grade glowstick."
+ desc = "A green military-grade chemical light."
w_class = ITEMSIZE_SMALL
light_system = MOVABLE_LIGHT
light_range = 4
light_power = 0.9
light_color = "#49F37C"
- icon_state = "glowstick"
- item_state = "glowstick"
+ icon_state = "glowstick_green"
+ item_state = "glowstick_green"
var/fuel = 0
power_use = 0
@@ -414,32 +451,45 @@
/obj/item/device/flashlight/glowstick/red
name = "red glowstick"
- desc = "A red military-grade glowstick."
+ desc = "A red military-grade chemical light."
light_color = "#FC0F29"
icon_state = "glowstick_red"
item_state = "glowstick_red"
/obj/item/device/flashlight/glowstick/blue
name = "blue glowstick"
- desc = "A blue military-grade glowstick."
+ desc = "A blue military-grade chemical light."
light_color = "#599DFF"
icon_state = "glowstick_blue"
item_state = "glowstick_blue"
/obj/item/device/flashlight/glowstick/orange
name = "orange glowstick"
- desc = "A orange military-grade glowstick."
+ desc = "A orange military-grade chemical light."
light_color = "#FA7C0B"
icon_state = "glowstick_orange"
item_state = "glowstick_orange"
/obj/item/device/flashlight/glowstick/yellow
name = "yellow glowstick"
- desc = "A yellow military-grade glowstick."
+ desc = "A yellow military-grade chemical light."
light_color = "#FEF923"
icon_state = "glowstick_yellow"
item_state = "glowstick_yellow"
+/obj/item/device/flashlight/glowstick/radioisotope
+ name = "radioisotope glowstick"
+ desc = "A radioisotope powered chemical light. Escaping particles light up the area far brighter on similar levels to flares and for longer"
+ icon_state = "glowstick_isotope"
+ item_state = "glowstick_isotope"
+
+ light_range = 8
+ light_power = 0.1
+ light_color = "#49F37C"
+
+/*
+ * Slime Extract
+ */
/obj/item/device/flashlight/slime
gender = PLURAL
diff --git a/code/game/objects/items/devices/flashlight_vr.dm b/code/game/objects/items/devices/flashlight_vr.dm
deleted file mode 100644
index 876dddc76d..0000000000
--- a/code/game/objects/items/devices/flashlight_vr.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/obj/item/device/flashlight/glowstick/radioisotope
- name = "radioisotope glowstick"
- desc = "A radioisotope powered glowstick. Escaping particles light up the area far brighter on similar levels to flares and for longer"
- icon_state = "glowstick_blue"
- item_state = "glowstick_blue"
-
- light_range = 8
- light_power = 0.1
- light_color = "#599DFF"
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 775b27cc08..c8c8d376c8 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -249,6 +249,12 @@
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
+/obj/item/trash/tomato
+ name = "empty tomato soup can"
+ icon_state = "tomato"
+ drop_sound = 'sound/items/drop/soda.ogg'
+ pickup_sound = 'sound/items/pickup/soda.ogg'
+
/obj/item/trash/spinach
name = "empty spinach can"
icon_state = "spinach"
@@ -410,3 +416,14 @@
name = "burrito packaging"
icon_state = "smolburrito"
+/obj/item/trash/brainzsnax
+ name = "\improper BrainzSnax can"
+ icon_state = "brainzsnax"
+ drop_sound = 'sound/items/drop/soda.ogg'
+ pickup_sound = 'sound/items/pickup/soda.ogg'
+
+/obj/item/trash/brainzsnaxred
+ name = "\improper BrainzSnax RED can"
+ icon_state = "brainzsnaxred"
+ drop_sound = 'sound/items/drop/soda.ogg'
+ pickup_sound = 'sound/items/pickup/soda.ogg'
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index ade55cbeca..5a751e3527 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -207,8 +207,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
to_chat(M, "Your [name] goes out.")
M.remove_from_mob(src) //un-equip it so the overlays can update
M.update_inv_wear_mask(0)
- M.update_inv_l_hand(0)
- M.update_inv_r_hand(1)
qdel(src)
else
new /obj/effect/decal/cleanable/ash(T)
@@ -221,8 +219,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = initial(icon_state)
item_state = initial(item_state)
M.update_inv_wear_mask(0)
- M.update_inv_l_hand(0)
- M.update_inv_r_hand(1)
smoketime = 0
reagents.clear_reagents()
name = "empty [initial(name)]"
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index a3c755a3ac..db3106e635 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -261,3 +261,13 @@
/obj/item/weapon/stock_parts/spring = 1,
/obj/item/stack/cable_coil = 5)
+/obj/item/weapon/circuitboard/arf_generator
+ name = T_BOARD("atmospheric field generator")
+ build_path = /obj/machinery/atmospheric_field_generator
+ board_type = new /datum/frame/frame_types/arfgs
+ origin_tech = list(TECH_MAGNET = 4, TECH_POWER = 4, TECH_BIO = 3)
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters
+ /obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor
+ /obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE
+ /obj/item/stack/cable_coil = 10)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
index c24b296412..3f97fad2f7 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
@@ -17,4 +17,6 @@
build_path = /obj/machinery/mining/brace
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
- req_components = list()
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1
+ )
diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm
index 1f2bc91404..e234f22d4a 100644
--- a/code/game/objects/items/weapons/storage/boxes_vr.dm
+++ b/code/game/objects/items/weapons/storage/boxes_vr.dm
@@ -25,3 +25,14 @@
/obj/item/weapon/storage/secure/briefcase/trashmoney
starts_with = list(/obj/item/weapon/spacecash/c200 = 10)
+
+/obj/item/weapon/storage/box/brainzsnax
+ name = "\improper BrainzSnax box"
+ icon_state = "brainzsnax_box"
+ desc = "A box designed to hold canned food. This one has BrainzSnax branding printed on it."
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/canned)
+ max_storage_space = ITEMSIZE_COST_NORMAL * 6
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax = 6)
+
+/obj/item/weapon/storage/box/brainzsnax/red
+ starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index dd2e2603f3..67ac33d136 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -69,6 +69,7 @@
throwforce = 2
slot_flags = SLOT_BELT
max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit
+ can_hold = list(/obj/item/weapon/flame/candle)
starts_with = list(/obj/item/weapon/flame/candle = 5)
/obj/item/weapon/storage/fancy/whitecandle_box
@@ -81,6 +82,7 @@
throwforce = 2
slot_flags = SLOT_BELT
max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit
+ can_hold = list(/obj/item/weapon/flame/candle)
starts_with = list(/obj/item/weapon/flame/candle/white = 5)
/obj/item/weapon/storage/fancy/blackcandle_box
@@ -93,6 +95,7 @@
throwforce = 2
slot_flags = SLOT_BELT
max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit
+ can_hold = list(/obj/item/weapon/flame/candle)
starts_with = list(/obj/item/weapon/flame/candle/black = 5)
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index e62ac35ea8..bd80bf247e 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -1,7 +1,10 @@
+/*
+ * Toolboxes
+ */
/obj/item/weapon/storage/toolbox
name = "toolbox"
desc = "Danger. Very robust."
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
center_of_mass = list("x" = 16,"y" = 11)
@@ -18,8 +21,10 @@
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
+//Emergency
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
starts_with = list(
@@ -34,8 +39,10 @@
new /obj/item/device/flashlight/flare(src)
. = ..()
+//Mechanical
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "blue"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
starts_with = list(
@@ -47,8 +54,10 @@
/obj/item/weapon/tool/wirecutters
)
+//Electrical
/obj/item/weapon/storage/toolbox/electrical
name = "electrical toolbox"
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "yellow"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
starts_with = list(
@@ -67,8 +76,10 @@
new /obj/item/stack/cable_coil/random(src,30)
calibrate_size()
+//Syndicate
/obj/item/weapon/storage/toolbox/syndicate
name = "black and red toolbox"
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "syndicate"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1)
@@ -94,9 +105,43 @@
/obj/item/device/analyzer
)
+//Brass
+/obj/item/weapon/storage/toolbox/brass
+ name = "brass toolbox"
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_state = "brass"
+ item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
+ starts_with = list(
+ /obj/item/weapon/tool/crowbar/brass,
+ /obj/item/weapon/tool/wirecutters/brass,
+ /obj/item/weapon/tool/screwdriver/brass,
+ /obj/item/weapon/tool/wrench/brass,
+ /obj/item/weapon/weldingtool/brass
+ )
+
+//Hydro
+/obj/item/weapon/storage/toolbox/hydro
+ name = "hydroponic toolbox"
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_state = "green"
+ item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green")
+ starts_with = list(
+ /obj/item/device/analyzer/plant_analyzer,
+ /obj/item/weapon/material/minihoe,
+ /obj/item/weapon/material/knife/machete/hatchet,
+ /obj/item/weapon/tool/wirecutters/clippers/trimmers,
+ /obj/item/weapon/reagent_containers/spray/plantbgone,
+ /obj/item/weapon/reagent_containers/glass/beaker
+ )
+
+/*
+ * Lunchboxes
+ */
+
/obj/item/weapon/storage/toolbox/lunchbox
max_storage_space = ITEMSIZE_COST_SMALL * 4 //slightly smaller than a toolbox
name = "rainbow lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_rainbow"
item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink")
desc = "A little lunchbox. This one is the colors of the rainbow!"
@@ -125,6 +170,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/heart
name = "heart lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_lovelyhearts"
item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink")
desc = "A little lunchbox. This one has cute little hearts on it!"
@@ -134,6 +180,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/cat
name = "cat lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_sciencecatshow"
item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green")
desc = "A little lunchbox. This one has a cute little science cat from a popular show on it!"
@@ -143,6 +190,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/nt
name = "NanoTrasen brand lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_nanotrasen"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the NanoTrasen logo!"
@@ -152,6 +200,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/mars
name = "\improper Mojave university lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_marsuniversity"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
desc = "A little lunchbox. This one is branded with the Mojave university logo!"
@@ -161,6 +210,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/cti
name = "\improper CTI lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_cti"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the CTI logo!"
@@ -170,6 +220,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/nymph
name = "\improper Diona nymph lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_dionanymph"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
desc = "A little lunchbox. This one is an adorable Diona nymph on the side!"
@@ -179,6 +230,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/syndicate
name = "black and red lunchbox"
+ icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_syndie"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!"
diff --git a/code/game/objects/items/weapons/tools/brass.dm b/code/game/objects/items/weapons/tools/brass.dm
new file mode 100644
index 0000000000..eedebe3220
--- /dev/null
+++ b/code/game/objects/items/weapons/tools/brass.dm
@@ -0,0 +1,32 @@
+/*
+ * Brass Tools
+ */
+
+//Crowbar
+/obj/item/weapon/tool/crowbar/brass
+ icon_state = "crowbar_brass"
+ item_state = "crowbar"
+
+//Cutters
+/obj/item/weapon/tool/wirecutters/brass
+ icon_state = "cutters_brass"
+ item_state = "cutters_yellow"
+
+//Screwdriver
+/obj/item/weapon/tool/screwdriver/brass
+ icon_state = "screwdriver_brass"
+ item_state = "screwdriver_black"
+
+//Wrench
+/obj/item/weapon/tool/wrench/brass
+ icon_state = "wrench_brass"
+ item_state = "wrench_brass"
+
+//Welder
+/obj/item/weapon/weldingtool/brass
+ name = "brass welding tool"
+ desc = "A welder made from brass fittings."
+ icon_state = "brasswelder"
+ max_fuel = 20
+ origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2)
+ matter = list(MAT_STEEL = 70, MAT_GLASS = 60)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm
index 0d34937656..9da82688c3 100644
--- a/code/game/objects/items/weapons/tools/crowbar.dm
+++ b/code/game/objects/items/weapons/tools/crowbar.dm
@@ -1,7 +1,6 @@
/*
* Crowbar
*/
-
/obj/item/weapon/tool/crowbar
name = "crowbar"
desc = "Used to remove floors and to pry open doors."
@@ -27,6 +26,10 @@
icon_state = "red_crowbar"
item_state = "crowbar_red"
+/obj/item/weapon/tool/crowbar/old
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "old_crowbar"
+ item_state = "crowbar"
/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar
name = "Precursor Alpha Object - Hard Light Pry Tool"
diff --git a/code/game/objects/items/weapons/tools/crowbar_vr.dm b/code/game/objects/items/weapons/tools/crowbar_vr.dm
index b376c15af8..b846a0e294 100644
--- a/code/game/objects/items/weapons/tools/crowbar_vr.dm
+++ b/code/game/objects/items/weapons/tools/crowbar_vr.dm
@@ -7,11 +7,11 @@
desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!"
icon = 'icons/obj/tools_vr.dmi'
icon_state = "prybar"
+ item_state = "crowbar"
slot_flags = SLOT_BELT
force = 4
throwforce = 5
pry = 1
- item_state = "crowbar"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_ENGINEERING = 1)
matter = list(MAT_STEEL = 30)
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index 34a824112c..ab673d3fc0 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -21,7 +21,7 @@
//R&D tech level
origin_tech = list(TECH_ENGINEERING = 1)
-
+
tool_qualities = list(TOOL_WELDER)
//Welding tool specific stuff
@@ -375,7 +375,7 @@
/obj/item/weapon/weldingtool/hugetank
name = "upgraded welding tool"
desc = "A much larger welder with a huge tank."
- icon_state = "indwelder"
+ icon_state = "upindwelder"
max_fuel = 80
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_ENGINEERING = 3)
@@ -392,6 +392,9 @@
toolspeed = 2
eye_safety_modifier = 1 // Safer on eyes.
+/obj/item/weapon/weldingtool/mini/two
+ icon_state = "miniwelder2"
+
/datum/category_item/catalogue/anomalous/precursor_a/alien_welder
name = "Precursor Alpha Object - Self Refueling Exothermic Tool"
desc = "An unwieldly tool which somewhat resembles a weapon, due to \
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
index a8f64d4f10..6e5973f0c3 100644
--- a/code/game/objects/items/weapons/tools/wirecutters.dm
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -6,6 +6,7 @@
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
+ item_state = "cutters"
center_of_mass = list("x" = 18,"y" = 10)
slot_flags = SLOT_BELT
force = 6
@@ -26,9 +27,20 @@
var/random_color = TRUE
/obj/item/weapon/tool/wirecutters/New()
- if(random_color && prob(50))
- icon_state = "cutters-y"
- item_state = "cutters_yellow"
+ if(random_color)
+ switch(pick("red","blue","yellow"))
+ if ("red")
+ icon_state = "cutters"
+ item_state = "cutters"
+ if ("blue")
+ icon_state = "cutters-b"
+ item_state = "cutters_blue"
+ if ("yellow")
+ icon_state = "cutters-y"
+ item_state = "cutters_yellow"
+
+ if (prob(75))
+ src.pixel_y = rand(0, 16)
..()
/obj/item/weapon/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm
index 052eae0d2c..634382ff11 100644
--- a/code/game/objects/items/weapons/tools/wrench.dm
+++ b/code/game/objects/items/weapons/tools/wrench.dm
@@ -25,6 +25,14 @@
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
+/obj/item/weapon/tool/wrench/pipe
+ name = "pipe wrench"
+ desc = "A wrench used for plumbing. Can make a good makeshift weapon."
+ icon_state = "pipe_wrench"
+ slot_flags = SLOT_BELT
+ force = 8
+ throwforce = 10
+
/obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach. If reach even worked half the time.
name = "strange wrench"
desc = "A wrench with many common uses. Can be usually found in your hand."
@@ -40,7 +48,6 @@
toolspeed = 0.5
reach = 2
-
/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench
name = "Precursor Alpha Object - Fastener Torque Tool"
desc = "This is an object that has a distinctive tool shape. \
diff --git a/code/game/objects/random/mapping_vr.dm b/code/game/objects/random/mapping_vr.dm
index b9ebfd1dc0..3075c40415 100644
--- a/code/game/objects/random/mapping_vr.dm
+++ b/code/game/objects/random/mapping_vr.dm
@@ -8,14 +8,21 @@
/obj/random/empty_or_lootable_crate/item_to_spawn()
return pick(/obj/random/crate,
/obj/random/multiple/corp_crate)
-
+
/obj/random/forgotten_tram
name = "random forgotten tram item"
desc = "Spawns a random item that someone might accidentally leave on a tram. Sometimes spawns nothing."
spawn_nothing_percentage = 30
/obj/random/forgotten_tram/item_to_spawn()
- return pick(prob(2);/obj/item/device/flashlight,
+ return pick(
+ prob(2);/obj/item/device/flashlight,
+ prob(2);/obj/item/device/flashlight/color,
+ prob(2);/obj/item/device/flashlight/color/green,
+ prob(2);/obj/item/device/flashlight/color/purple,
+ prob(2);/obj/item/device/flashlight/color/red,
+ prob(2);/obj/item/device/flashlight/color/orange,
+ prob(2);/obj/item/device/flashlight/color/yellow,
prob(2);/obj/item/device/flashlight/glowstick,
prob(2);/obj/item/device/flashlight/glowstick/blue,
prob(1);/obj/item/device/flashlight/glowstick/orange,
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 0d85609223..4726aa3a10 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -972,3 +972,21 @@
prob(5);/obj/item/weapon/storage/pouch/baton/full,
prob(1);/obj/item/weapon/storage/pouch/holding
)
+
+/obj/random/flashlight
+ name = "Random Flashlight"
+ desc = "This is a random storage pouch."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "random_flashlight"
+
+/obj/random/flashlight/item_to_spawn()
+ return pick(
+ prob(8);/obj/item/device/flashlight,
+ prob(6);/obj/item/device/flashlight/color,
+ prob(6);/obj/item/device/flashlight/color/green,
+ prob(6);/obj/item/device/flashlight/color/purple,
+ prob(6);/obj/item/device/flashlight/color/red,
+ prob(6);/obj/item/device/flashlight/color/orange,
+ prob(6);/obj/item/device/flashlight/color/yellow,
+ prob(2);/obj/item/device/flashlight/maglight
+ )
\ No newline at end of file
diff --git a/code/game/turfs/simulated/fancy_shuttles.dm b/code/game/turfs/simulated/fancy_shuttles.dm
index 31f4681da9..2de10aeb38 100644
--- a/code/game/turfs/simulated/fancy_shuttles.dm
+++ b/code/game/turfs/simulated/fancy_shuttles.dm
@@ -301,6 +301,16 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
/obj/effect/fancy_shuttle_floor_preview/delivery
icon = 'icons/turf/fancy_shuttles/delivery_preview.dmi'
+/**
+ * Tether Cargo shuttle
+ * North facing: W:8, H:12
+ */
+/obj/effect/fancy_shuttle/tether_cargo
+ icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi'
+ split_file = 'icons/turf/fancy_shuttles/tether_cargo.dmi'
+/obj/effect/fancy_shuttle_floor_preview/tether_cargo
+ icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi'
+
/**
* Wagon
* North facing: W:5, H:13
diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm
index bd4fdca814..22af37dd53 100644
--- a/code/game/turfs/unsimulated/floor.dm
+++ b/code/game/turfs/unsimulated/floor.dm
@@ -9,4 +9,9 @@
icon_state = "rockvault"
/turf/unsimulated/floor/shuttle_ceiling
- icon_state = "reinforced"
\ No newline at end of file
+ icon_state = "reinforced"
+
+/turf/unsimulated/elevator_shaft
+ name = "floor"
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "elevatorshaft"
\ No newline at end of file
diff --git a/code/game/turfs/unsimulated/planetary_vr.dm b/code/game/turfs/unsimulated/planetary_vr.dm
index 17c33b7525..b82342ea0a 100644
--- a/code/game/turfs/unsimulated/planetary_vr.dm
+++ b/code/game/turfs/unsimulated/planetary_vr.dm
@@ -52,8 +52,16 @@
alpha = 0xFF
VIRGO3B_SET_ATMOS
+//other set - for map building
+/turf/unsimulated/wall2/planetary/virgo3b_better
+ icon_state = "riveted2"
+
/turf/unsimulated/wall/planetary/virgo3b_better
name = "facility wall"
desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps."
alpha = 0xFF
VIRGO3BB_SET_ATMOS
+
+//other set - for map building
+/turf/unsimulated/wall2/planetary/virgo3b_better
+ icon_state = "riveted2"
\ No newline at end of file
diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm
index 878a12404a..dce3c345bb 100644
--- a/code/game/turfs/unsimulated/walls.dm
+++ b/code/game/turfs/unsimulated/walls.dm
@@ -6,10 +6,22 @@
density = TRUE
blocks_air = TRUE
+//other set - for map building
+/turf/unsimulated/wall/wall1
+ icon_state = "riveted1"
+
+/turf/unsimulated/wall/wall2
+ icon_state = "riveted2"
+
/turf/unsimulated/wall/fakeglass
name = "window"
icon_state = "fakewindows"
opacity = 0
+//other set - for map building
+/turf/unsimulated/wall/fakeglass2
+ icon_state = "fakewindows2"
+ opacity = 0
+
/turf/unsimulated/wall/other
icon_state = "r_wall"
\ No newline at end of file
diff --git a/code/modules/busy_space_vr/air_traffic.dm b/code/modules/busy_space_vr/air_traffic.dm
index 7c06b964e4..a71fb888df 100644
--- a/code/modules/busy_space_vr/air_traffic.dm
+++ b/code/modules/busy_space_vr/air_traffic.dm
@@ -4,12 +4,12 @@
var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
/datum/lore/atc_controller
- var/delay_min = 25 MINUTES //How long between ATC traffic
- var/delay_max = 35 MINUTES //Adjusted to give approx 2 per hour, will work out to 10-14 over a full shift
+ var/delay_min = 20 MINUTES //How long between ATC traffic, minimum
+ var/delay_max = 30 MINUTES //Ditto, maximum
//Shorter delays means more traffic, which gives the impression of a busier system, but also means a lot more radio noise
var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins.
var/initial_delay = 2 MINUTES //How long to wait before sending the first message of the shift.
- var/next_message = 30 MINUTES //When the next message should happen in world.time - Making it default to min value
+ var/next_message = 20 MINUTES //When the next message should happen in world.time - Making it default to min value
var/force_chatter_type //Force a specific type of messages
var/squelched = 0 //If ATC is squelched currently
@@ -77,18 +77,15 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does
var/shipname = pick(source.ship_names) //Pick a random ship name
var/destname = pick(source.destination_names) //destination is where?
- var/law_abiding = source.lawful //do we fully observe system law (or are we otherwise favored by the system owners, i.e. NT)?
- var/law_breaker = source.hostile //or are we part of a pirate group
- var/system_defense = source.sysdef //are we actually system law/SDF? unlocks the SDF-specific events
+ var/slogan = pick(source.slogans) //god help you all
+ var/org_type = source.org_type //which group do we belong to?
//pick our second ship
//var/secondname = secondary.name //not used atm, commented out to suppress errors
var/secondowner = secondary.short_name
var/secondprefix = pick(secondary.ship_prefixes) //Pick a random prefix
var/secondshipname = pick(secondary.ship_names) //Pick a random ship name
- var/law_abiding2 = secondary.lawful
- var/law_breaker2 = secondary.hostile
- var/system_defense2 = secondary.sysdef //mostly here as a secondary check to ensure SDF don't interrogate other SDF
+ var/org_type2 = secondary.org_type
var/combined_first_name = "[owner][prefix] |[shipname]|"
var/combined_second_name = "[secondowner][secondprefix] |[secondshipname]|"
@@ -102,7 +99,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/requests = list(
"special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"),
"current solar weather info" = list("sending you the relevant information via tightbeam", "your request has been queued, stand by"),
- "aerospace priority" = list("affirmative, aerospace priority is yours", "negative, another vessel has priority right now"),
+ "sector aerospace priority" = list("affirmative, sector aerospace priority is yours", "negative, another vessel in your sector has priority right now"),
"system traffic info" = list("sending you current traffic info", "request queued, please hold"),
"refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"),
"a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"),
@@ -113,30 +110,38 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/chatter_type = "normal"
if(force_chatter_type)
chatter_type = force_chatter_type
- else if(law_abiding && !system_defense) //I have to offload this from the chatter_type switch below and do it here, otherwise BYOND throws a shitfit for no discernable reason
+ else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos.
+ chatter_type = "distress"
+ else if(org_type == "corporate") //corporate-specific subset for the slogan event. despite the relatively high weight it was still quite rare in tests.
+ chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed",300;"slogan")
+ else if((org_type == "government" || org_type == "neutral" || org_type == "military"))
chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed")
//the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with
- else if(name == "Smugglers" && !system_defense2) //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff
+ else if(org_type == "smuggler" && org_type2 != "system defense") //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff
chatter_type = "policeflee"
- else if(name == "Smugglers" && system_defense2) //ditto, if an SDF ship catches them
+ else if(org_type == "smuggler" && org_type2 == "system defense") //ditto, if an SDF ship catches them
chatter_type = "policeshipflee"
- else if(law_abiding && law_breaker2) //on the offchance that we manage to roll a goodguy and a badguy, run a new distress event - it's like emerg but better
- chatter_type = "distress"
- else if(law_breaker && system_defense2) //if we roll this combo instead, time for the SDF to do their fucking job
+ else if((org_type == "smuggler" || org_type == "pirate") && org_type2 == "system defense") //if we roll this combo instead, time for the SDF to do their fucking job
chatter_type = "policeshipcombat"
- else if(law_breaker && !system_defense2) //but if we roll THIS combo, time to alert the SDF to get off their asses
+ else if((org_type == "smuggler" || org_type == "pirate") && org_type2 != "system defense") //but if we roll THIS combo, time to alert the SDF to get off their asses
chatter_type = "hostiledetected"
//SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in)
- else if(system_defense && law_abiding2 && !system_defense2) //let's see if we can narrow this down, I didn't see many ship-to-ship scans
+ else if(org_type == "system defense" && (org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans
chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal")
//SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something
- else if(system_defense)
+ else if(org_type == "system defense")
chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",80;"sdfbeginpatrol","normal")
//if we somehow don't match any of the other existing filters once we've run through all of them
else
chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal")
//I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed
+ //DEBUG BLOCK
+ //to_world("DEBUG OUTPUT 1: [name], [owner], [prefix], [mission], [shipname], [org_type], [destname]")
+ //to_world("DEBUG OUTPUT 2: [secondowner], [secondprefix], [secondshipname], [org_type2]")
+ //to_world("DEBUG OUTPUT 3: Chose [chatter_type]")
+ //DEBUG BLOCK ENDS
+
var/yes = prob(90) //Chance for them to say yes vs no
var/request = pick(requests)
@@ -167,7 +172,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
switch(chatter_type)
//mayday call
if("emerg")
- var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have asteroids impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our life support has failed")
+ var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our RCS are malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]")
msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! [problem]!","[prefix] [shipname]")
sleep(5 SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].")
@@ -175,7 +180,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
msg("Understood [using_map.dock_name] Control, switching now.","[prefix] [shipname]")
//Control scan event: soft outcome
if("policescan")
- var/confirm = pick("Understood","Roger that","Affirmative")
+ var/confirm = pick("Understood","Roger that","Affirmative","Very well","Copy that")
var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?")
var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.")
msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.")
@@ -190,7 +195,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
//Control scan event: hard outcome
if("policeflee")
var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!")
- msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.")
+ msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.")
sleep(5 SECONDS)
msg("[uhoh]","[shipname]")
sleep(5 SECONDS)
@@ -212,11 +217,11 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
//SDF scan event: hard outcome
if("policeshipflee")
var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!")
- msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.","[secondprefix] [secondshipname]")
+ msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.","[secondprefix] [secondshipname]")
sleep(5 SECONDS)
msg("[uhoh]","[shipname]")
sleep(5 SECONDS)
- msg("[using_map.starsys_name] Defense Control, this is [combined_second_name], we have a situation here, please advise.","[secondprefix] [secondshipname]")
+ msg("[using_map.starsys_name] Defense Control, this is [combined_second_name]. We have a situation here, please advise.","[secondprefix] [secondshipname]")
sleep(5 SECONDS)
msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[using_map.starsys_name] Defense Control")
//SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll
@@ -282,7 +287,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
if("dockingrequestdenied")
var/reason = pick("we don't have any landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class")
var/disappointed = pick("That's unfortunate. [combined_first_name], out.","Damn shame. We'll just have to keep moving. [combined_first_name], out.","[combined_first_name], out.")
- msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_move].","[prefix] [shipname]")
+ msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
sleep(5 SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason].")
sleep(5 SECONDS)
@@ -388,6 +393,10 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].")
sleep(5 SECONDS)
msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]")
+ if("slogan")
+ msg("The following is a sponsored message from [name].","Facility PA")
+ sleep (5 SECONDS)
+ msg("[slogan]","Facility PA")
else //time for generic message
msg("[callname], this is [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]")
sleep(5 SECONDS)
diff --git a/code/modules/busy_space_vr/organizations.dm b/code/modules/busy_space_vr/organizations.dm
index ec30b2a2a8..4c24cf6420 100644
--- a/code/modules/busy_space_vr/organizations.dm
+++ b/code/modules/busy_space_vr/organizations.dm
@@ -14,7 +14,7 @@
//how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE
//e.g. NDV = Asset Protection + Patrol + Flight
- //this allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level
+ //this overrides the standard PREFIX = TASK logic and allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level
//task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense!
var/list/task_types = list(
@@ -86,14 +86,114 @@
"Falcon",
"Casper",
"Orion",
+ "Columbia",
+ "Atlantis",
+ "Enterprise",
+ "Challenger",
+ "Pathfinder",
+ "Buran",
+ "Aldrin",
+ "Armstrong",
+ "Tranquility",
+ "Nostrodamus",
+ "Soyuz",
+ "Cosmos",
+ "Sputnik",
+ "Belka",
+ "Strelka",
+ "Gagarin",
+ "Shepard",
+ "Tereshkova",
+ "Leonov",
+ "Vostok",
+ "Apollo",
+ "Mir",
+ "Titan",
+ "Serenity",
+ "Andiamo",
+ "Aurora",
+ "Phoenix",
+ "Lucky",
+ "Raven",
+ "Valkyrie",
+ "Halcyon",
+ "Nakatomi",
+ "Cutlass",
+ "Unicorn",
+ "Sheepdog",
+ "Arcadia",
+ "Gigantic",
+ "Goliath",
+ "Pequod",
+ "Poseidon",
+ "Venture",
+ "Evergreen",
+ "Natal",
+ "Maru",
+ "Djinn",
+ "Witch",
+ "Wolf",
+ "Lone Star",
+ "Grey Fox",
+ "Dutchman",
+ "Sultana",
+ "Siren",
+ "Venus",
+ "Anastasia",
+ "Rasputin",
+ "Stride",
+ "Suzaku",
+ "Hathor",
+ "Dream",
+ "Gaia",
+ "Ibis",
+ "Progress",
+ "Olympic",
+ "Venture",
+ "Brazil",
+ "Tiger",
+ "Hedgehog",
+ "Potemkin",
+ "Fountainhead",
+ "Sinbad",
+ "Esteban",
+ "Mumbai",
+ "Shanghai",
+ "Madagascar",
+ "Kampala",
+ "Bangkok",
+ "Emerald",
+ "Guo Hong",
+ "Shun Kai",
+ "Fu Xing",
+ "Zhenyang",
+ "Da Qing",
+ "Rascal",
+ "Flamingo",
+ "Jackal",
+ "Andromeda",
+ "Ferryman",
+ "Panchatantra",
+ "Nunda",
+ "Fortune",
+ "New Dawn",
+ "Fionn MacCool",
+ "Red Bird",
+ "Star Rat",
+ "Cwn Annwn",
+ "Morning Swan",
+ "Black Cat",
"Challenger"
)
var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly.
var/lawful = TRUE //Are we exempt from routine inspections? to avoid incidents where SysDef appears to go rogue -- defaults to TRUE now (regular ships always get the "soft" result)
var/hostile = FALSE //Are we explicitly lawless, hostile, or otherwise bad? allows for a finer alignment system, since my last checks weren't working properly
+ var/org_type = "neutral" //Valid options are "neutral", "corporate", "government", "system defense", "military, "smuggler", & "pirate"
var/sysdef = FALSE //Are we the space cops?
var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? see the proc below for info on that
+
+ var/slogans = list("This is a placeholder slogan, ding dong!") //Advertising slogans. Who doesn't want more obnoxiousness on the radio? Picked at random each time the slogan event fires. This has a placeholder so it doesn't runtime on trying to draw from a 0-length list in the event that new corps are added without full support.
/datum/lore/organization/New()
..()
@@ -213,7 +313,7 @@
and therapy.\
\
NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \
- It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \
+ It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \
for newly tested posibrains to remain with the company. \
\
NT's ships are named for famous scientists."
@@ -222,6 +322,12 @@
headquarters = "Luna, Sol"
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "NanoTrasen - Phoron Makes The Galaxy Go 'Round.",
+ "NanoTrasen - Join for the Medical, stay for the Company.",
+ "NanoTrasen - Advancing Humanity."
+ )
ship_prefixes = list("NTV" = "a general operations", "NEV" = "an exploration", "NGV" = "a hauling", "NDV" = "a patrol", "NRV" = "an emergency response", "NDV" = "an asset protection")
//Scientist naming scheme
ship_names = list(
@@ -247,13 +353,11 @@
"Nye",
"Hawking",
"Aristotle",
- "Von Braun",
"Kaku",
"Oppenheimer",
"Renwick",
"Hubble",
"Alcubierre",
- "Robineau",
"Glass"
)
// Note that the current station being used will be pruned from this list upon being instantiated
@@ -297,6 +401,12 @@
headquarters = "Luna, Sol"
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Hephaestus Arms - When it comes to personal protection, nobody does it better.",
+ "Hephaestus Arms - Peace through Superior Firepower.",
+ "Hephaestus Arms - Don't be caught firing blanks."
+ )
ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment")
//War God Theme, updated
ship_names = list(
@@ -401,6 +511,12 @@
headquarters = "Toledo, New Ohio"
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Vey-Medical. Medical care you can trust.",
+ "Vey-Medical. Only the finest in surgical equipment.",
+ "Vey-Medical. Because your patients deserve the best."
+ )
ship_prefixes = list("VMV" = "a general operations", "VTV" = "a transportation", "VHV" = "a medical resupply", "VSV" = "a research", "VRV" = "an emergency medical support")
// Diona names, mostly
ship_names = list(
@@ -415,6 +531,9 @@
"Fire Blown Out By Wind",
"Star That Fades From View",
"Eyes Which Turn Inwards",
+ "Still Water Upon An Endless Shore",
+ "Sunlight Glitters Upon Tranquil Sands",
+ "Growth Within The Darkest Abyss",
"Joy Without Which The World Would Come Undone",
"A Thousand Thousand Planets Dangling From Branches",
"Light Streaming Through Interminable Branches",
@@ -447,6 +566,13 @@
headquarters = "Earth, Sol"
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Zeng-Hu! WE make the medicines that YOU need!",
+ "Zeng-Hu! Having acid reflux problems? Consult your local physician to see if Dylovene is right for YOU!",
+ "Zeng-Hu! Tired of getting left in the dust? Try Hyperzine! You'll never fall behind again!",
+ "Zeng-Hu! Life's aches and pains getting to you? Try Tramadol - available at any good pharmacy!"
+ )
ship_prefixes = list("ZHV" = "a general operations", "ZTV" = "a transportation", "ZMV" = "a medical resupply", "ZRV" = "a medical research")
//ship names: a selection of famous physicians who advanced the cause of medicine
ship_names = list(
@@ -527,6 +653,12 @@
headquarters = ""
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Takahashi Appliances - keeping your home running smoothly.",
+ "W-T Automotive - keeping you on time, all the time.",
+ "Ward-Takahashi Electronics - keeping you in touch with the galaxy."
+ )
ship_prefixes = list("WTV" = "a general operations", "WTFV" = "a freight", "WTGV" = "a transport", "WTDV" = "an asset protection")
ship_names = list(
"Comet",
@@ -560,6 +692,8 @@
"Curtain",
"Planetar",
"Quasar",
+ "Blazar",
+ "Corona",
"Binary"
)
destination_names = list()
@@ -581,6 +715,12 @@
headquarters = ""
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Bishop Cybernetics - only the best in personal augmentation.",
+ "Bishop Cybernetics - why settle for flesh when you can have metal?",
+ "Bishop Cybernetics - make a statement."
+ )
ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange")
//famous mechanical engineers
ship_names = list(
@@ -660,6 +800,10 @@
headquarters = "Shelf flotilla"
motto = ""
+ org_type = "neutral" //disables slogans for morpheus as they don't advertise, per the description above
+ /*
+ slogans = list()
+ */
ship_prefixes = list("MCV" = "a general operations", "MTV" = "a freight", "MDV" = "a market protection", "MSV" = "an outreach")
//periodic elements; something 'unusual' for the posibrain TSC without being full on 'quirky' culture ship names (much as I love them, they're done to death)
ship_names = list(
@@ -749,6 +893,12 @@
headquarters = ""
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Xion Manufacturing - We have what you need.",
+ // "Xion Manufacturing - The #1 choice of the SolGov Engineer's Union for 150 years.", // CHOMPedit, year mismatch
+ "Xion Manufacturing - Our products are as bulletproof as our contracts."
+ )
ship_prefixes = list("XMV" = "a general operations", "XTV" = "a hauling", "XFV" = "a bulk transport", "XIV" = "a resupply")
//martian mountains
ship_names = list(
@@ -803,6 +953,12 @@
headquarters = ""
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "The FTU. We look out for the little guy.",
+ "There's no Trade like Free Trade.",
+ "Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13
+ )
ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment")
//famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder
ship_names = list(
@@ -846,6 +1002,12 @@
headquarters = "Mars, Sol"
motto = "With Major Bill's, you won't pay major bills!"
+ org_type = "corporate"
+ slogans = list(
+ "With Major Bill's, you won't pay major bills!",
+ "Major Bill's - Private Couriers - General Shipping!",
+ "Major Bill's got you covered, now get out there!"
+ )
ship_prefixes = list("TTV" = "a general operations", "TTV" = "a transport", "TTV" = "a luxury transit", "TTV" = "a priority transit", "TTV" = "a secure data courier")
//ship names: big rivers
ship_names = list (
@@ -916,6 +1078,12 @@
headquarters = "Mars, Sol"
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Grayson Mining - It's An Ore Effort, For The War Effort!",
+ "Grayson Mining - Winning The War On Ore!",
+ "Grayson Mining - Come On Down To Our Ore Chasm!"
+ )
ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit")
//rocks
ship_names = list(
@@ -976,6 +1144,12 @@
headquarters = ""
motto = "Dum spiro spero"
+ org_type = "corporate"
+ slogans = list(
+ "Aether A&R - We're Absolutely Breathtaking.",
+ "Aether A&R - You Can Breathe Easy With Us!",
+ "Aether A&R - The SolGov's #1 Environmental Systems Provider." // CHOMPedit
+ )
ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport")
//weather systems/patterns
ship_names = list (
@@ -1025,6 +1199,12 @@
headquarters = ""
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Focal Point Energistics - Sustainable Power for a Sustainable Future.",
+ "Focal Point Energistics - Powering The Future Before It Even Happens.",
+ "Focal Point Energistics - Let There Be Light."
+ )
ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport")
//famous electrical engineers
ship_names = list (
@@ -1085,6 +1265,12 @@
headquarters = "Spin Aerostat, Jupiter"
motto = "Sic itur ad astra"
+ org_type = "corporate"
+ slogans = list(
+ "StarFlight - travel the stars.",
+ "StarFlight - bringing you to new horizons.",
+ "StarFlight - getting you where you need to be since 2137."
+ )
ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure")
flight_types = list( //no military-sounding ones here
"flight",
@@ -1143,6 +1329,12 @@
headquarters = ""
motto = "News from all across the spectrum"
+ org_type = "corporate"
+ slogans = list(
+ "Oculum - All News, All The Time.",
+ "Oculum - We Keep An Eye Out.",
+ "Oculum - Your Eye On The Galaxy."
+ )
ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations")
destination_names = list(
"Oculus HQ"
@@ -1158,6 +1350,12 @@
headquarters = "Alpha Centauri"
motto = "The largest brands of food and drink - most of them are Centauri."
+ org_type = "corporate"
+ slogans = list(
+ "Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|",
+ "Centauri Provisions SkrellSnax - Not |Just| For Skrell!",
+ "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!"
+ )
ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations")
destination_names = list(
"Centauri Provisions HQ",
@@ -1175,6 +1373,12 @@
headquarters = ""
motto = "Engine designs, emergency generators, and old memories"
+ org_type = "corporate"
+ slogans = list(
+ "Einstein Engines - you don't have to be Einstein to use |our| engines!",
+ "Einstein Engines - bringing power to the people.",
+ "Einstein Engines - because it's the smart thing to do."
+ )
ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations")
destination_names = list(
"Einstein HQ"
@@ -1190,6 +1394,12 @@
headquarters = ""
motto = "We build it - you fly it"
+ org_type = "corporate"
+ slogans = list(
+ "Wulf Aeronautics. We build it - you fly it.",
+ // "Wulf Aeronautics, the Commonwealth's favorite shipwrights.", // CHOMPedit
+ "Wulf Aeronautics, building tomorrow's ships today."
+ )
ship_prefixes = list("WATV" = "a transport", "WARV" = "a repair", "WAV" = "a general operations")
destination_names = list(
"Wulf Aeronautics HQ",
@@ -1207,6 +1417,12 @@
headquarters = ""
motto = ""
+ org_type = "corporate"
+ slogans = list(
+ "Why choose |luxury| when you can choose |Gilthari|?",
+ "|Gilthari|. Because |you're| worth it.",
+ "|Gilthari|. Why settle for |anything| less?"
+ )
ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations")
//precious stones
ship_names = list(
@@ -1283,6 +1499,12 @@
headquarters = "N/A"
motto = "one man's trash is another man's treasure"
+ org_type = "corporate"
+ slogans = list(
+ "Coyote Salvage Corp. 'cause your trash ain't gonna clean itself.",
+ "Coyote Salvage Corp. 'cause one man's trash is another man's treasure.",
+ "Coyote Salvage Corp. We'll take your scrap - but not your crap."
+ )
ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing")
//mostly-original, maybe some references, and more than a few puns
ship_names = list(
@@ -1351,6 +1573,12 @@
headquarters = "Titan, Sol"
motto = "the whole is greater than the sum of its parts"
+ org_type = "corporate"
+ slogans = list(
+ "Chimera Genetics. Find your true self today!",
+ "Chimera Genetics. Bring us your genes and we'll clean them right up.",
+ "Chimera Genetics. Better bodies for a better tomorrow."
+ )
ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical")
//edgy mythological critters!
ship_names = list(
@@ -1506,6 +1734,7 @@
sysdef = TRUE //we're the space law, we don't impersonate people and stuff
autogenerate_destination_names = FALSE //don't add extra destinations to our pool, or else we leave the system which makes no sense
+ org_type = "system defense"
ship_prefixes = list ("SDB" = "a patrol", "SDF" = "a patrol", "SDV" = "a patrol", "SDB" = "an escort", "SDF" = "an escort", "SDV" = "an escort", "SAR" = "a search and rescue", "SDT" = "a logistics", "SDT" = "a resupply", "SDJ" = "a prisoner transport") //b = boat, f = fleet (generic), v = vessel, t = tender
//ship names: weapons
ship_names = list(
@@ -1605,6 +1834,7 @@
sysdef = FALSE
autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes.
+ org_type = "smuggler"
ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up
//blank out our shipnames for redesignation
ship_names = list(
@@ -1781,6 +2011,7 @@
hostile = TRUE
autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes.
+ org_type = "pirate"
ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case
ship_names = list(
"Morally Bankrupt",
@@ -1953,6 +2184,7 @@
hostile = TRUE
autogenerate_destination_names = TRUE
+ org_type = "pirate"
ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement")
ship_names = list(
"Keqxuer'xeu's Prize",
@@ -1987,6 +2219,7 @@
hostile = TRUE
autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes.
+ org_type = "pirate"
ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up
//blank out our shipnames for redesignation
ship_names = list(
@@ -2063,6 +2296,7 @@
motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals'
autogenerate_destination_names = TRUE
+ org_type = "government"
ship_prefixes = list("CWS-A" = "an administrative", "CWS-T" = "a transportation", "CWS-D" = "a diplomatic", "CWS-F" = "a freight", "CWS-J" = "a prisoner transfer")
//earth's biggest impact craters
ship_names = list(
@@ -2158,6 +2392,7 @@
headquarters = "Paraiso a Àstrea"
motto = "Liberty to the Stars!"
+ org_type = "government"
ship_prefixes = list("UFHV" = "military", "FFHV" = "classified")
ship_names = list(
"Bulwark of the Free",
@@ -2236,6 +2471,7 @@
headquarters = ""
motto = ""
+ org_type = "government"
ship_prefixes = list("ECS-M" = "a military", "ECS-T" = "a transport", "ECS-T" = "a special transport", "ECS-D" = "a diplomatic") //The Special Transport is SLAAAAVES. but let's not advertise that openly.
ship_names = list(
"Bring Me Wine!",
@@ -2291,6 +2527,7 @@
headquarters = "The Pact, Myria"
motto = ""
+ org_type = "government"
ship_prefixes = list("SFM-M" = "a military", "SFM-M" = "a patrol") // The Salthans don't do anything else.
flight_types = list(
"mission",
@@ -2394,6 +2631,7 @@
motto = ""
autogenerate_destination_names = TRUE //big list of own holdings to come
+ org_type = "government"
//the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well
ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering")
//TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word.
@@ -2441,6 +2679,7 @@
motto = "Si Vis Pacem Para Bellum" //if you wish for peace, prepare for war
autogenerate_destination_names = TRUE
+ org_type = "military"
ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified")
flight_types = list(
"mission",
@@ -2539,6 +2778,7 @@
motto = ""
autogenerate_destination_names = TRUE
+ org_type = "military"
ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security")
flight_types = list(
"flight",
@@ -2602,6 +2842,7 @@
motto = "Strength in Numbers"
autogenerate_destination_names = TRUE
+ org_type = "military"
ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy")
flight_types = list(
"flight",
@@ -2686,6 +2927,7 @@
motto = "Aut Neca Aut Necare"
autogenerate_destination_names = TRUE
+ org_type = "military"
ship_prefixes = list("SAARE" = "a secure freight", "SAARE" = "a training", "SAARE" = "a logistics", "SAARE" = "a patrol", "SAARE" = "a security", "SAARE" = "an experimental", "SAARE" = "a command", "SAARE" = "a classified")
flight_types = list(
"flight",
diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm
index b216ec4dec..730c05649f 100644
--- a/code/modules/client/preference_setup/general/02_language.dm
+++ b/code/modules/client/preference_setup/general/02_language.dm
@@ -34,6 +34,7 @@
for(var/language in pref.alternate_languages)
var/datum/language/L = GLOB.all_languages[language]
if(!istype(L) || (L.flags & RESTRICTED) || (!(language in S.secondary_langs) && pref.client && !is_lang_whitelisted(pref.client, L)))
+ testing("LANGSANI: Removed [L?.name || "lang not found"] from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] because it failed allowed checks")
pref.alternate_languages -= language
if(isnull(pref.language_prefixes) || !pref.language_prefixes.len)
diff --git a/code/modules/client/preference_setup/loadout/loadout_mask.dm b/code/modules/client/preference_setup/loadout/loadout_mask.dm
index 52e491fbe6..2c89ce66cb 100644
--- a/code/modules/client/preference_setup/loadout/loadout_mask.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_mask.dm
@@ -30,32 +30,6 @@
/datum/gear/mask/plaguedoctor2
display_name = "golden plague doctor's mask"
path = /obj/item/clothing/mask/gas/plaguedoctor/gold
-<<<<<<< HEAD
- cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
-||||||| parent of 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories
- cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
-
-/datum/gear/mask/papermask
- display_name = "paper mask"
- path = /obj/item/clothing/mask/paper
-
-/datum/gear/mask/emotionalmask
- display_name = "emotional mask"
- path = /obj/item/clothing/mask/emotions
-
-/datum/gear/mask/gaiter
- display_name = "neck gaiter selection"
- path = /obj/item/clothing/mask/gaiter
- cost = 1
-
-/datum/gear/mask/gaiter/New()
- ..()
- var/list/gaiters = list()
- for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter))
- var/obj/item/clothing/mask/gaiter_type = gaiter
- gaiters[initial(gaiter_type.name)] = gaiter_type
- gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
-=======
cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
/datum/gear/mask/mouthwheat
@@ -81,5 +55,4 @@
for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter))
var/obj/item/clothing/mask/gaiter_type = gaiter
gaiters[initial(gaiter_type.name)] = gaiter_type
- gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
->>>>>>> 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories
+ gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index d185ca2608..ea12b86778 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -89,37 +89,37 @@
display_name = "flashlight"
path = /obj/item/device/flashlight
-/datum/gear/utility/flashlight_blue
- display_name = "flashlight, blue"
- path = /obj/item/device/flashlight/color
-
-/datum/gear/utility/flashlight_orange
- display_name = "flashlight, orange"
- path = /obj/item/device/flashlight/color/orange
-
-/datum/gear/utility/flashlight_red
- display_name = "flashlight, red"
- path = /obj/item/device/flashlight/color/red
-
-/datum/gear/utility/flashlight_yellow
- display_name = "flashlight, yellow"
- path = /obj/item/device/flashlight/color/yellow
-
/datum/gear/utility/maglight
display_name = "flashlight, maglight"
path = /obj/item/device/flashlight/maglight
cost = 2
+/datum/gear/utility/flashlight/color
+ display_name = "flashlight, small (selection)"
+ path = /obj/item/device/flashlight/color
+
+/datum/gear/utility/flashlight/color/New()
+ ..()
+ var/list/flashlights = list(
+ "Blue Flashlight" = /obj/item/device/flashlight/color,
+ "Red Flashlight" = /obj/item/device/flashlight/color/red,
+ "Green Flashlight" = /obj/item/device/flashlight/color/green,
+ "Yellow Flashlight" = /obj/item/device/flashlight/color/yellow,
+ "Purple Flashlight" = /obj/item/device/flashlight/color/purple,
+ "Orange Flashlight" = /obj/item/device/flashlight/color/orange
+ )
+ gear_tweaks += new/datum/gear_tweak/path(flashlights)
+
/datum/gear/utility/battery
display_name = "cell, device"
path = /obj/item/weapon/cell/device
/datum/gear/utility/pen
- display_name = "Fountain Pen"
+ display_name = "fountain pen"
path = /obj/item/weapon/pen/fountain
/datum/gear/utility/umbrella
- display_name = "Umbrella"
+ display_name = "umbrella"
path = /obj/item/weapon/melee/umbrella
cost = 3
@@ -131,7 +131,7 @@
display_name = "wheelchair selection"
path = /obj/item/wheelchair
cost = 4
-
+
/datum/gear/utility/wheelchair/New()
..()
gear_tweaks += gear_tweak_free_color_choice
diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm
index 6cc380d625..2090358a89 100644
--- a/code/modules/client/preference_setup/vore/07_traits.dm
+++ b/code/modules/client/preference_setup/vore/07_traits.dm
@@ -112,12 +112,17 @@
else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases))
pref.custom_base = SPECIES_HUMAN
+ pref.custom_say = lowertext(trim(pref.custom_say))
+ pref.custom_whisper = lowertext(trim(pref.custom_whisper))
+ pref.custom_ask = lowertext(trim(pref.custom_ask))
+ pref.custom_exclaim = lowertext(trim(pref.custom_exclaim))
+
/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character)
character.custom_species = pref.custom_species
- character.custom_say = pref.custom_say
- character.custom_ask = pref.custom_ask
- character.custom_whisper = pref.custom_whisper
- character.custom_exclaim = pref.custom_exclaim
+ character.custom_say = lowertext(trim(pref.custom_say))
+ character.custom_ask = lowertext(trim(pref.custom_ask))
+ character.custom_whisper = lowertext(trim(pref.custom_whisper))
+ character.custom_exclaim = lowertext(trim(pref.custom_exclaim))
if(character.isSynthetic()) //Checking if we have a synth on our hands, boys.
pref.dirty_synth = 1
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 2689df87a3..ad24f6e0d0 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -1,6 +1,6 @@
/mob/var/suiciding = 0
-/mob/living/carbon/human/verb/suicide()
+/mob/living/carbon/human/verb/suicide() /// At best, useful for admins to see if it's being called.
set hidden = 1
if (stat == DEAD)
@@ -10,83 +10,9 @@
if (!ticker)
to_chat(src, "You can't commit suicide before the game starts!")
return
-
- if(!player_is_antag(mind))
- message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
- to_chat(src, "No. Adminhelp if there is a legitimate reason.")
- return
-
- if (suiciding)
- to_chat(src, "You're already committing suicide! Be patient!")
- return
-
- var/confirm = tgui_alert(usr, "Are you sure you want to commit suicide?", "Confirm Suicide", list("Yes", "No"))
-
- if(confirm == "Yes")
- if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
- to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
- return
- suiciding = 15
- does_not_breathe = 0 //Prevents ling-suicide zombies, or something
- var/obj/item/held_item = get_active_hand()
- if(held_item)
- var/damagetype = held_item.suicide_act(src)
- if(damagetype)
- log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
- var/damage_mod = 1
- switch(damagetype) //Sorry about the magic numbers.
- //brute = 1, burn = 2, tox = 4, oxy = 8
- if(15) //4 damage types
- damage_mod = 4
-
- if(6, 11, 13, 14) //3 damage types
- damage_mod = 3
-
- if(3, 5, 7, 9, 10, 12) //2 damage types
- damage_mod = 2
-
- if(1, 2, 4, 8) //1 damage type
- damage_mod = 1
-
- else //This should not happen, but if it does, everything should still work
- damage_mod = 1
-
- //Do 175 damage divided by the number of damage types applied.
- if(damagetype & BRUTELOSS)
- adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
- adjustOxyLoss(145/damage_mod)
-
- if(damagetype & FIRELOSS)
- adjustFireLoss(175/damage_mod)
-
- if(damagetype & TOXLOSS)
- adjustToxLoss(175/damage_mod)
-
- if(damagetype & OXYLOSS)
- adjustOxyLoss(175/damage_mod)
-
- //If something went wrong, just do normal oxyloss
- if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
-
- updatehealth()
- return
-
- log_and_message_admins("[key_name(src)] commited suicide")
-
- var/datum/gender/T = gender_datums[get_visible_gender()]
-
- var/suicidemsg
- suicidemsg = pick("[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.", \
- "[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.", \
- "[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.", \
- "[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.")
- if(isSynthetic())
- suicidemsg = "[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide."
- visible_message(suicidemsg)
-
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- updatehealth()
+
+ to_chat(src, "No. Adminhelp if there is a legitimate reason, and please review our server rules.")
+ message_admins("[ckey] has tried to trigger the suicide verb as human, but it is currently disabled.")
/mob/living/carbon/brain/verb/suicide()
set hidden = 1
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 3db7ad58cf..7f45fcfdb3 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -292,6 +292,12 @@ BLIND // can't see anything
item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses")
body_parts_covered = 0
+/obj/item/clothing/glasses/artist
+ name = "4-D Glasses"
+ desc = "You can see in every dimension, and get four times the amount of headache!"
+ icon_state = "artist"
+ item_state = "artist_glasses"
+
/obj/item/clothing/glasses/gglasses
name = "green glasses"
desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
@@ -590,3 +596,4 @@ BLIND // can't see anything
to_chat(usr, "You push \the [src] up from in front of your eyes.")
update_clothing_icon()
usr.update_action_buttons()
+
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 7c9e323466..3a79b7177a 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -294,104 +294,6 @@
desc = "A black veil, typically worn at funerals or by goths."
w_class = ITEMSIZE_TINY
body_parts_covered = FACE
-<<<<<<< HEAD
- icon_state = "veil"
-||||||| parent of 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories
- icon_state = "veil"
-
-/obj/item/clothing/mask/paper
- name = "paper mask"
- desc = "A neat, circular mask made out of paper. Perhaps you could try drawing on it with a pen!"
- w_class = ITEMSIZE_SMALL
- body_parts_covered = FACE
- icon_state = "papermask"
-
-/obj/item/clothing/mask/paper/attackby(obj/item/I as obj, mob/living/user as mob, proximity)
- if(!proximity) return
- if(istype(I, /obj/item/weapon/pen))
- var/drawtype = tgui_alert(user, "Choose what you'd like to draw.", "Faces", list("blank","neutral","eyes","sleeping", "heart", "core", "plus", "square", "bullseye", "vertical", "horizontal", "X", "bug eyes", "double", "mark" ))
- switch(drawtype)
- if("blank")
- src.icon_state = "papermask"
- if("neutral")
- src.icon_state = "neutralmask"
- if("eyes")
- src.icon_state = "eyemask"
- if("sleeping")
- src.icon_state = "sleepingmask"
- if("heart")
- src.icon_state = "heartmask"
- if("core")
- src.icon_state = "coremask"
- if("plus")
- src.icon_state = "plusmask"
- if("square")
- src.icon_state = "squaremask"
- if("bullseye")
- src.icon_state = "bullseyemask"
- if("vertical")
- src.icon_state = "verticalmask"
- if("horizontal")
- src.icon_state = "horizontalmask"
- if("X")
- src.icon_state = "xmask"
- if("bug eyes")
- src.icon_state = "bugmask"
- if("double")
- src.icon_state = "doublemask"
- if("mark")
- src.icon_state = "markmask"
- return
-
-/obj/item/clothing/mask/emotions
- name = "emotional mask"
- desc = "Express your happiness or hide your sorrows with this modular cutout. Draw your current emotions onto it with a pen!"
- w_class = ITEMSIZE_SMALL
- body_parts_covered = FACE
- icon_state = "joy"
-
-/obj/item/clothing/mask/emotions/attackby(obj/item/I as obj, mob/living/user as mob, proximity)
- if(!proximity) return
- if(istype(I, /obj/item/weapon/pen))
- var/drawtype = tgui_alert(user, "Choose what emotions you'd like to display.", "Emotions", list("joy","pensive","angry","flushed" ))
- switch(drawtype)
- if("joy")
- src.icon_state = "joy"
- if("pensive")
- src.icon_state = "pensive"
- if("angry")
- src.icon_state = "angry"
- if("flushed")
- src.icon_state = "flushed"
- return
-
-//Gaiter scarves
-/obj/item/clothing/mask/gaiter
- name = "red neck gaiter"
- desc = "A slightly worn neck gaiter, it's loose enough to be worn comfortably like a scarf. Commonly used by outdoorsmen and mercenaries, both to keep warm and keep debris away from the face."
- icon_state = "gaiter_red"
-
-/obj/item/clothing/mask/gaiter/attack_self(mob/user as mob)
- if(src.icon_state == initial(icon_state))
- src.icon_state = "[icon_state]_up"
- to_chat(user, "You pull the gaiter up over your nose.")
- else
- src.icon_state = initial(icon_state)
- to_chat(user, "You tug the gaiter down around your neck.")
- update_clothing_icon() //so our mob-overlays update
-
-/obj/item/clothing/mask/gaiter/tan
- name = "tan neck gaiter"
- icon_state = "gaiter_tan"
-
-/obj/item/clothing/mask/gaiter/gray
- name = "gray neck gaiter"
- icon_state = "gaiter_gray"
-
-/obj/item/clothing/mask/gaiter/green
- name = "green neck gaiter"
- icon_state = "gaiter_green"
-=======
icon_state = "veil"
/obj/item/clothing/mask/paper
@@ -492,5 +394,4 @@
desc = "100% synthetic \"Country Girls LLC.\" brand mouth wheat. Warning: not for actual consumption."
icon_state = "mouthwheat"
w_class = ITEMSIZE_SMALL
- body_parts_covered = 0
->>>>>>> 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories
+ body_parts_covered = 0
\ No newline at end of file
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index a8f6bf57a1..e18b594233 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -524,7 +524,7 @@
/obj/item/clothing/suit/storage/toggle/bomber/retro
name = "retro bomber jacket"
desc = "A retro style, fur-lined leather bomber jacket that invokes the early days of space exploration when spacemen were spacemen, and laser guns had funny little antennae on them."
- icon_state = "retro_bomber"
+ icon_state = "retrojacket"
/obj/item/clothing/suit/storage/bomber/alt
name = "bomber jacket"
diff --git a/code/modules/clothing/under/accessories/holster_vr.dm b/code/modules/clothing/under/accessories/holster_vr.dm
index 8cd7681dd9..2506251a4f 100644
--- a/code/modules/clothing/under/accessories/holster_vr.dm
+++ b/code/modules/clothing/under/accessories/holster_vr.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/accessory/holster/waist/kinetic_accelerator
name = "KA holster"
- desc = "A specialized holster, made specifically for Kinetic Accelerator."
+ desc = "A specialized holster, made specifically for Kinetic Accelerators."
can_hold = list(/obj/item/weapon/gun/energy/kinetic_accelerator)
/obj/item/clothing/accessory/holster/machete/rapier
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index de1fa2dc85..61b5921157 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -34,6 +34,11 @@
/// Packaged meals switch to this state when opened, if set
var/package_open_state
+ /// If this is canned. If true, it will print a message and ask you to open it
+ var/canned = FALSE
+ /// Canned food switch to this state when opened, if set
+ var/canned_open_state
+
/obj/item/weapon/reagent_containers/food/snacks/Initialize()
. = ..()
if(nutriment_amt)
@@ -63,6 +68,9 @@
if(package && !user.incapacitated())
unpackage(user)
+ if(canned && !user.incapacitated())
+ uncan(user)
+
/obj/item/weapon/reagent_containers/food/snacks/attack(mob/living/M as mob, mob/user as mob, def_zone)
if(reagents && !reagents.total_volume)
to_chat(user, "None of [src] left!")
@@ -74,6 +82,10 @@
to_chat(M, "How do you expect to eat this with the package still on?")
return FALSE
+ if(canned)
+ to_chat(M, "How do you expect to eat this without opening it?")
+ return FALSE
+
if(istype(M, /mob/living/carbon))
//TODO: replace with standard_feed_mob() call.
@@ -257,6 +269,13 @@
if(package_open_state)
icon_state = package_open_state
+/obj/item/weapon/reagent_containers/food/snacks/proc/uncan(mob/user)
+ canned = FALSE
+ to_chat(user, "You unseal \the [src] with a crack of metal.")
+ playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1)
+ if(canned_open_state)
+ icon_state = canned_open_state
+
////////////////////////////////////////////////////////////////////////////////
/// FOOD END
////////////////////////////////////////////////////////////////////////////////
@@ -4224,10 +4243,12 @@
desc = "Musical fruit in a slightly less musical container."
filling_color = "#FC6F28"
icon_state = "bakedbeans"
- nutriment_amt = 4
- nutriment_desc = list("beans" = 4)
bitesize = 2
+/obj/item/weapon/reagent_containers/food/snacks/berrymuffin/berry/Initialize()
+ . = ..()
+ reagents.add_reagent("bean_protein", 6)
+
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
@@ -6745,34 +6766,8 @@
//////////////////////Canned Foods - crack open and eat (ADDED 04/11/2021)//////////////////////
/obj/item/weapon/reagent_containers/food/snacks/canned
- name = "void can"
icon = 'icons/obj/food_canned.dmi'
- flags = 0
- var/sealed = TRUE
-
-/obj/item/weapon/reagent_containers/food/snacks/canned/Initialize()
- . = ..()
- if(!sealed)
- unseal()
-
-/obj/item/weapon/reagent_containers/food/snacks/canned/examine(mob/user)
- . = ..()
- to_chat(user, "It is [sealed ? "" : "un"]sealed.")
-
-/obj/item/weapon/reagent_containers/food/snacks/canned/proc/unseal()
- flags |= OPENCONTAINER
- sealed = FALSE
- update_icon()
-
-/obj/item/weapon/reagent_containers/food/snacks/canned/attack_self(var/mob/user)
- if(sealed)
- playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1)
- to_chat(user, "You unseal \the [src] with a crack of metal.")
- unseal()
-
-/obj/item/weapon/reagent_containers/food/snacks/canned/update_icon()
- if(!sealed)
- icon_state = "[initial(icon_state)]-open"
+ canned = TRUE
//////////Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts//////////
@@ -6781,6 +6776,7 @@
icon_state = "beef"
desc = "A can of premium preserved vat-grown holstein beef. Now 99.9% bone free!"
trash = /obj/item/trash/beef
+ canned_open_state = "beef-open"
filling_color = "#663300"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("beef" = 1)
@@ -6789,54 +6785,54 @@
/obj/item/weapon/reagent_containers/food/snacks/canned/beef/Initialize()
.=..()
reagents.add_reagent("protein", 4)
- reagents.add_reagent("sodiumchloride", 1)
+ reagents.add_reagent("sodiumchloride", 2)
/obj/item/weapon/reagent_containers/food/snacks/canned/beans
name = "baked beans"
icon_state = "beans"
desc = "Luna Colony beans. Carefully synthethized from soy."
trash = /obj/item/trash/beans
+ canned_open_state = "beans-open"
filling_color = "#ff6633"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("beans" = 1, "tomato sauce" = 1)
- nutriment_amt = 15
bitesize = 2
-///obj/item/weapon/reagent_containers/food/snacks/canned/tomato (NEED TO SEE HOW TO CHANGE EATING SOUND)
-// name = "tomato soup"
-// icon_state = "tomato"
-// desc = "Plain old unseasoned tomato soup. This can has no use-by date."
-// trash = "/obj/item/trash/tomato"
-// filling_color = "#ae0000"
-// center_of_mass = list("x"=15, "y"=9)
-// nutriment_desc = list("tomato" = 1)
-// bitesize = 3
-// eat_sound = 'sound/items/drink.ogg'
-//
-///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize()
-// .=..()
-// reagents.add_reagent(/datum/reagent/drink/juice/tomato, 12)
-//
-//
-///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/feed_sound(var/mob/user)
-// playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1)
+/obj/item/weapon/reagent_containers/food/snacks/canned/beans/Initialize()
+ .=..()
+ reagents.add_reagent("bean_protein", 5)
+ reagents.add_reagent("tomatojuice", 5)
+
+/obj/item/weapon/reagent_containers/food/snacks/canned/tomato
+ name = "tomato soup"
+ icon_state = "tomato"
+ desc = "Plain old unseasoned tomato soup. This can has no use-by date."
+ trash = /obj/item/trash/tomato
+ package_open_state = "tomato-open"
+ filling_color = "#ae0000"
+ center_of_mass = list("x"=15, "y"=9)
+ bitesize = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize()
+ .=..()
+ reagents.add_reagent("tomatojuice", 12)
/obj/item/weapon/reagent_containers/food/snacks/canned/spinach
name = "spinach"
icon_state = "spinach"
desc = "Wup-Az! Brand canned spinach. Notably has less iron in it than a watermelon."
trash = /obj/item/trash/spinach
+ canned_open_state = "spinach-open"
filling_color = "#003300"
center_of_mass = list("x"=15, "y"=9)
- nutriment_amt = 5
nutriment_desc = list("soggy" = 1, "vegetable" = 1)
- bitesize = 5
+ bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/canned/spinach/Initialize()
.=..()
- reagents.add_reagent("adrenaline", 5)
- reagents.add_reagent("hyperzine", 5)
- reagents.add_reagent("iron", 5)
+ reagents.add_reagent("adrenaline", 4)
+ reagents.add_reagent("hyperzine", 4)
+ reagents.add_reagent("iron", 4)
//////////////////////////////Advanced Canned Food//////////////////////////////
@@ -6845,30 +6841,30 @@
icon_state = "fisheggs"
desc = "Terran caviar, or space carp eggs. Carefully faked using alginate, artificial flavoring and salt. Skrell approved!"
trash = /obj/item/trash/fishegg
+ canned_open_state = "fisheggs-open"
filling_color = "#000000"
center_of_mass = list("x"=15, "y"=9)
- nutriment_desc = list("fish" = 1, "salt" = 1)
- nutriment_amt = 6
+ nutriment_desc = list("salt" = 1)
bitesize = 1
-/obj/item/weapon/reagent_containers/food/snacks/caviar/Initialize()
+/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/Initialize()
. = ..()
- reagents.add_reagent("protein", 5)
+ reagents.add_reagent("seafood", 5)
/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true
name = "\improper Classic Terran Caviar"
icon_state = "carpeggs"
desc = "Terran caviar, or space carp eggs. Banned by the Vir Food Health Administration for exceeding the legally set amount of carpotoxins in food stuffs."
trash = /obj/item/trash/carpegg
+ canned_open_state = "carpeggs-open"
filling_color = "#330066"
center_of_mass = list("x"=15, "y"=9)
- nutriment_desc = list("fish" = 1, "salt" = 1, "a numbing sensation" = 1)
- nutriment_amt = 6
+ nutriment_desc = list("salt" = 1, "a numbing sensation" = 1)
bitesize = 1
-/obj/item/weapon/reagent_containers/food/snacks/caviar/true/Initialize()
+/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true/Initialize()
. = ..()
- reagents.add_reagent("protein", 4)
+ reagents.add_reagent("seafood", 4)
reagents.add_reagent("carpotoxin", 1)
/obj/item/weapon/reagent_containers/food/snacks/canned/maps
@@ -6876,13 +6872,12 @@
icon_state = "maps"
desc = "A re-branding of a classic Terran snack! Contains mostly edible ingredients."
trash = /obj/item/trash/maps
+ canned_open_state = "maps-open"
filling_color = "#330066"
center_of_mass = list("x"=15, "y"=9)
- nutriment_desc = list("meat" = 1, "salt" = 1)
- nutriment_amt = 8
bitesize = 2
-/obj/item/weapon/reagent_containers/food/snacks/maps/Initialize()
+/obj/item/weapon/reagent_containers/food/snacks/canned/maps/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("sodiumchloride", 2)
@@ -6892,10 +6887,10 @@
icon_state = "appleberry"
desc = "A classic snack favored by Sol astronauts. Made from dried apple-hybidized berries grown on the lunar colonies."
trash = /obj/item/trash/appleberry
+ canned_open_state = "appleberry-open"
filling_color = "#FFFFFF"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("apple" = 1, "sweetness" = 1)
- nutriment_amt = 8
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/appleberry/Initialize()
@@ -6907,16 +6902,50 @@
icon_state = "ntbeans"
desc = "Musical fruit in a slightly less musical container. Now with bacon!"
trash = /obj/item/trash/ntbeans
+ canned_open_state = "ntbeans-open"
filling_color = "#FC6F28"
center_of_mass = list("x"=15, "y"=9)
- nutriment_desc = list("beans" = 4)
- nutriment_amt = 6
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/canned/ntbeans/Initialize()
. = ..()
+ reagents.add_reagent("bean_protein", 6)
reagents.add_reagent("protein", 2)
+/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax
+ name = "\improper BrainzSnax"
+ icon_state = "brainzsnax"
+ desc = "A can of grey matter marketed for xenochimeras."
+ description_fluff = "As the cartoon brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Rich in limbic system\" and \
+ under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \
+ GrubCo LTD is not liable for any brain damage occuring after consumption of product.\""
+ trash = /obj/item/trash/brainzsnax
+ canned_open_state = "brainzsnax-open"
+ filling_color = "#caa3c9"
+ center_of_mass = list("x"=15, "y"=9)
+ bitesize = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/Initialize()
+ . = ..()
+ reagents.add_reagent("brain_protein", 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red
+ name = "\improper BrainzSnax RED"
+ icon_state = "brainzsnaxred"
+ desc = "A can of grey matter marketed for xenochimeras. This one has added tomato sauce."
+ description_fluff = "As the cartoonish brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Yummy red stuff!\" and \
+ under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \
+ GrubCo LTD is not liable for any brain damage occuring after consumption of product.\""
+ trash = /obj/item/trash/brainzsnaxred
+ canned_open_state = "brainzsnaxred-open"
+ filling_color = "#a6898d"
+ center_of_mass = list("x"=15, "y"=9)
+ bitesize = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red/Initialize()
+ . = ..()
+ reagents.add_reagent("red_brain_protein", 10)
+
//////////////Packaged Food - break open and eat//////////////
/obj/item/weapon/reagent_containers/food/snacks/packaged
@@ -7008,7 +7037,7 @@
/obj/item/weapon/reagent_containers/food/snacks/packaged/meatration/Initialize()
. = ..()
- reagents.add_reagent("protein", 3)
+ reagents.add_reagent("protein", 4)
/obj/item/weapon/reagent_containers/food/snacks/packaged/vegration
name = "veggie ration"
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index 99cca32d4c..ee7060dfd8 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -358,7 +358,7 @@
//BASKETBALL OBJECTS
/obj/item/weapon/beach_ball/holoball
- icon = 'icons/obj/basketball.dmi'
+ icon = 'icons/obj/balls_vr.dmi'
icon_state = "basketball"
name = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
@@ -370,7 +370,7 @@
/obj/structure/holohoop
name = "basketball hoop"
desc = "Boom, Shakalaka!"
- icon = 'icons/obj/basketball.dmi'
+ icon = 'icons/obj/32x64.dmi'
icon_state = "hoop"
anchored = TRUE
density = TRUE
@@ -406,7 +406,6 @@
return FALSE
return ..()
-
/obj/machinery/readybutton
name = "Ready Declaration Device"
desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!"
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index b8618ccf86..e1874f1a93 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -11,11 +11,13 @@
icon_state = "mining_drill"
circuit = /obj/item/weapon/circuitboard/miningdrill
var/braces_needed = 2
- var/list/supports = list()
+ var/list/obj/machinery/mining/brace/supports = list()
var/supported = 0
var/active = 0
var/list/resource_field = list()
var/obj/item/device/radio/intercom/faultreporter
+ var/drill_range = 5
+ var/offset = 2
var/list/ore_types = list(
"hematite" = /obj/item/weapon/ore/iron,
@@ -242,10 +244,14 @@
harvest_speed = 0
capacity = 0
charge_use = 50
+ drill_range = 5
+ offset = 2
for(var/obj/item/weapon/stock_parts/P in component_parts)
if(istype(P, /obj/item/weapon/stock_parts/micro_laser))
harvest_speed = P.rating
+ if(P.rating >= 5)
+ harvest_speed *= 2
exotic_drilling = P.rating - 1
if(exotic_drilling >= 1)
ore_types |= ore_types_uncommon
@@ -254,6 +260,14 @@
else
ore_types -= ore_types_uncommon
ore_types -= ore_types_rare
+ if(P.rating > 3) // are we t4+?
+ // default drill range 5, offset 2
+ if(P.rating >= 5) // t5
+ drill_range = 9
+ offset = 4
+ else if(P.rating >= 4) // t4
+ drill_range = 7
+ offset = 3
if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
capacity = 200 * P.rating
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
@@ -271,8 +285,12 @@
else
anchored = TRUE
- if(supports && supports.len >= braces_needed)
- supported = 1
+ if(supports)
+ if(supports.len >= braces_needed)
+ supported = 1
+ else for(var/obj/machinery/mining/brace/check in supports)
+ if(check.brace_tier > 3)
+ supported = 1
update_icon()
@@ -293,11 +311,11 @@
var/turf/T = get_turf(src)
if(!istype(T)) return
- var/tx = T.x - 2
- var/ty = T.y - 2
+ var/tx = T.x - offset
+ var/ty = T.y - offset
var/turf/simulated/mine_turf
- for(var/iy = 0,iy < 5, iy++)
- for(var/ix = 0, ix < 5, ix++)
+ for(var/iy = 0,iy < drill_range, iy++)
+ for(var/ix = 0, ix < drill_range, ix++)
mine_turf = locate(tx + ix, ty + iy, T.z)
if(!istype(mine_turf, /turf/space/))
if(mine_turf && mine_turf.has_resources)
@@ -334,12 +352,23 @@
desc = "A machinery brace for an industrial drill. It looks easily two feet thick."
icon_state = "mining_brace"
circuit = /obj/item/weapon/circuitboard/miningdrillbrace
+ var/brace_tier = 1
var/obj/machinery/mining/drill/connected
-/obj/machinery/mining/brace/New()
- ..()
+/obj/machinery/mining/brace/examine(mob/user)
+ . = ..()
+ if(brace_tier > 3)
+ . += SPAN_NOTICE("The internals of the brace look resilient enough to support a drill by itself.")
- component_parts = list()
+/obj/machinery/mining/brace/Initialize()
+ . = ..()
+ default_apply_parts()
+
+/obj/machinery/mining/brace/RefreshParts()
+ ..()
+ brace_tier = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ brace_tier += M.rating
/obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(connected && connected.active)
@@ -350,6 +379,8 @@
return
if(default_deconstruction_crowbar(user, W))
return
+ if(default_part_replacement(user,W))
+ return
if(W.is_wrench())
diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm
index f4712d31b9..7effaf60d9 100644
--- a/code/modules/mining/kinetic_crusher.dm
+++ b/code/modules/mining/kinetic_crusher.dm
@@ -246,7 +246,7 @@
slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi',
)
item_state = "c-machete"
- w_class = ITEMSIZE_SMALL
+ w_class = ITEMSIZE_NORMAL
attack_verb = list("cleaved", "chopped", "pulped", "stabbed", "skewered")
can_cleave = TRUE
requires_wield = FALSE
diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm
index 7ab96cda10..ff7d36e6dd 100644
--- a/code/modules/mining/ore_box.dm
+++ b/code/modules/mining/ore_box.dm
@@ -63,34 +63,33 @@
for(var/ore in stored_ore)
. += "- [stored_ore[ore]] [ore]"
-/obj/structure/ore_box/verb/empty_box()
- set name = "Empty Ore Box"
- set category = "Object"
- set src in view(1)
-
- if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes.
- to_chat(usr, "You are physically incapable of emptying the ore box.")
- return
-
- if(usr.stat || usr.restrained())
- return
-
- if(!Adjacent(usr)) //You can only empty the box if you can physically reach it
- to_chat(usr, "You cannot reach the ore box.")
- return
-
- add_fingerprint(usr)
-
- if(contents.len < 1)
- to_chat(usr, "The ore box is empty.")
- return
-
- for (var/obj/item/weapon/ore/O in contents)
- contents -= O
- O.loc = src.loc
- to_chat(usr, "You empty the ore box.")
-
- return
+// /obj/structure/ore_box/verb/empty_box()
+// set name = "Empty Ore Box"
+// set category = "Object"
+// set src in view(1)
+//
+// if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes.
+// to_chat(usr, "You are physically incapable of emptying the ore box.")
+// return
+// if(usr.stat || usr.restrained())
+// return
+//
+// if(!Adjacent(usr)) //You can only empty the box if you can physically reach it
+// to_chat(usr, "You cannot reach the ore box.")
+// return
+//
+// add_fingerprint(usr)
+//
+// if(contents.len < 1)
+// to_chat(usr, "The ore box is empty.")
+// return
+//
+// for (var/obj/item/weapon/ore/O in contents)
+// contents -= O
+// O.loc = src.loc
+// to_chat(usr, "You empty the ore box.")
+//
+// return
/obj/structure/ore_box/ex_act(severity)
if(severity == 1.0 || (severity < 3.0 && prob(50)))
diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
index 1f54311881..e1f33581e1 100644
--- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
+++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
@@ -76,7 +76,7 @@
EQUIPMENT("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 900),
EQUIPMENT("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
- EQUIPMENT("KA Efficiency Increase", /obj/item/borg/upgrade/modkit/efficiency, 1200),
+ EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1200),
EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
EQUIPMENT("KA Holster", /obj/item/clothing/accessory/holster/waist/kinetic_accelerator, 350),
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 08457ad628..f30898809e 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -7,7 +7,7 @@
colour = "soghun"
key = "q"
machine_understands = 0
- flags = RESTRICTED
+ flags = WHITELISTED // RESTRICTED would make this completely unavailable from character select
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona_local/get_random_name()
@@ -20,7 +20,7 @@
desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges."
key = "w"
machine_understands = 0
- flags = RESTRICTED | HIVEMIND
+ flags = WHITELISTED | HIVEMIND // RESTRICTED would make this completely unavailable from character select
/datum/language/unathi
name = LANGUAGE_UNATHI
diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm
index 6a651155f1..f4c0aeb64c 100644
--- a/code/modules/mob/living/bot/medbot.dm
+++ b/code/modules/mob/living/bot/medbot.dm
@@ -452,7 +452,7 @@
return treatment_emag
// If they're injured, we're using a beaker, and they don't have on of the chems in the beaker
- if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15))))
+ if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getFireLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15))))
for(var/datum/reagent/R in reagent_glass.reagents.reagent_list)
if(!H.reagents.has_reagent(R))
return 1
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 6c2e0a8595..c017377297 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -173,7 +173,8 @@ This saves us from having to call add_fingerprint() any time something is put in
if(I.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR))
update_hair(0) //rebuild hair
update_inv_ears(0)
- if(internal)
+ // If this is how the internals are connected, disable them
+ if(internal && !(head?.item_flags & AIRTIGHT))
if(internals)
internals.icon_state = "internal0"
internal = null
diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm
index 6aba13840b..0ac13c062c 100644
--- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm
+++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm
@@ -122,6 +122,7 @@
sleep(5) //The duration of the TP animation
canmove = original_canmove
alpha = initial(alpha)
+ remove_modifiers_of_type(/datum/modifier/shadekin_phase_vision)
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
@@ -170,6 +171,7 @@
var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc)
phaseanim.dir = dir
alpha = 0
+ add_modifier(/datum/modifier/shadekin_phase_vision)
sleep(5)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
@@ -182,6 +184,10 @@
density = FALSE
force_max_speed = TRUE
+/datum/modifier/shadekin_phase_vision
+ name = "Shadekin Phase Vision"
+ vision_flags = SEE_THRU
+
//////////////////////////
/// REGENERATE OTHER ///
//////////////////////////
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index dd7d27bdd8..62ef3c0a78 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -490,7 +490,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/image/em_block_ears
if(ears_s)
if(ears_s.Height() > face_standing.Height()) // Tol ears
- face_standing.Crop(face_standing.Width(), ears_s.Height())
+ face_standing.Crop(1, 1, face_standing.Width(), ears_s.Height())
face_standing.Blend(ears_s, ICON_OVERLAY)
if(ear_style?.em_block)
em_block_ears = em_block_image_generic(image(ears_s))
diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm
index 04523d514e..a570ed60db 100644
--- a/code/modules/mob/living/living_vr.dm
+++ b/code/modules/mob/living/living_vr.dm
@@ -12,13 +12,13 @@
var/sayselect = tgui_alert(src, "Which say-verb do you wish to customize?", "Select Verb", list("Say","Whisper","Ask (?)","Exclaim/Shout/Yell (!)","Cancel"))
if(sayselect == "Say")
- custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text)
+ custom_say = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text))
else if(sayselect == "Whisper")
- custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text)
+ custom_whisper = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text))
else if(sayselect == "Ask (?)")
- custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text)
+ custom_ask = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text))
else if(sayselect == "Exclaim/Shout/Yell (!)")
- custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text)
+ custom_exclaim = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text))
else
return
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 1cda8274d3..91e5a9db43 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -612,7 +612,6 @@
for(var/tech in tech_item.origin_tech)
files.UpdateTech(tech, tech_item.origin_tech[tech])
synced = FALSE
- drain(-50 * digested)
if(volume)
water.add_charge(volume)
if(recycles && T.matter)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm
index 75a0ca508e..4eb5b16661 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm
@@ -124,7 +124,7 @@
vore_icons = 0
/mob/living/simple_mob/animal/space/carp/large/huge
vore_icons = 0
-/mob/living/simple_mob/animal/space/carp/holographic
+/mob/living/simple_mob/animal/space/carp/holodeck
vore_icons = 0
/* //VOREStation AI Temporary removal
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 83a2c06213..86b22c3da4 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -175,12 +175,13 @@
assailant.visible_message("[assailant] covers [affecting]'s eyes!")
if(affecting.eye_blind < 3)
affecting.Blind(3)
- //TFF 8/1/20 CHOMPStation Addition Start - Re-add sitting on one's head.
if(BP_HEAD)
if(force_down)
- if(announce)
- assailant.visible_message("[assailant] sits on [target]'s head!")
- //CHOMPStation Addition End
+ if(user.a_intent == I_HELP)
+ if(announce)
+ assailant.visible_message("[assailant] sits on [target]'s face!")
+ //VOREStation Edit End
+
/obj/item/weapon/grab/attack_self()
return s_click(hud)
diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm
index 52b275a92f..99b015c6c2 100644
--- a/code/modules/multiz/stairs.dm
+++ b/code/modules/multiz/stairs.dm
@@ -18,13 +18,13 @@
// Returns TRUE if the stairs are a complete and connected unit, FALSE if a piece is missing or obstructed
// Will attempt to reconnect broken pieces
-// Parameters:
+// Parameters:
// - B1: Loc of bottom stair
// - B2: Loc of middle stair
// - T1: Openspace over bottom stair
// - T2: Loc of top stair, over middle stair
-/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null,
- var/obj/structure/stairs/middle/M = null,
+/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null,
+ var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
@@ -91,14 +91,14 @@
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
-
+
// In the case where we're provided all the pieces, just try connecting them.
// In order: all exist, they are appropriately adjacent, and they can connect
if(istype(B) && istype(M) && istype(T) && istype(O) && \
B.Adjacent(M) && (GetBelow(O) == get_turf(B)) && T.Adjacent(O) && \
..())
return TRUE
-
+
// If we're already configured, just check those
else if(istype(top) && istype(middle))
O = locate(/turf/simulated/open) in GetAbove(src)
@@ -118,7 +118,7 @@
// If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work
// Everything is simply linked in our original direction
- if(istype(M) && istype(T) && ..(src, M, T, O))
+ if(istype(M) && istype(T) && ..(src, M, T, O))
return TRUE
// Else, we have to look in other directions
@@ -127,12 +127,12 @@
T2 = GetAbove(B2)
if(!istype(B2) || !istype(T2))
continue
-
+
T = locate(/obj/structure/stairs/top) in T2
M = locate(/obj/structure/stairs/middle) in B2
if(..(src, M, T, O))
return TRUE
-
+
// Out of the dir check, we have no valid neighbors, and thus are not complete.
return FALSE
@@ -143,18 +143,18 @@
use_stairs(AM, oldloc)
..()
-/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc)
+/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc)
// If we're coming from the top of the stairs, don't trap us in an infinite staircase
// Or if we fell down the openspace
if((top in oldloc) || oldloc == GetAbove(src))
return
-
+
if(isobserver(AM)) // Ghosts have their own methods for going up and down
return
-
+
if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs
return
-
+
if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to
return
@@ -173,7 +173,7 @@
pulling |= L.pulling
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
pulling |= G.affecting
-
+
// If the stairs aren't broken, go up.
if(check_integrity())
AM.dir = src.dir
@@ -185,7 +185,7 @@
// Move to Top
AM.forceMove(get_turf(top))
-
+
// If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays
for(var/atom/movable/P in pulling)
P.forceMove(get_turf(top)) // Just bring it along directly, no fussing with animation timing
@@ -202,16 +202,18 @@
if(isliving(AM))
var/mob/living/L = AM
-
+
if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs.
return
-
+
if(L.has_buckled_mobs())
return
if(L.buckled)
L.buckled.forceMove(get_turf(top))
-
+
+ L.forceMove(get_turf(top))
+
// If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so.
if(L.pulling && !L.pulling.anchored)
var/atom/movable/P = L.pulling
@@ -220,8 +222,7 @@
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
G.affecting.forceMove(get_turf(top))
- L.forceMove(get_turf(top))
-
+
if(L.client)
L.client.Process_Grab()
else
@@ -255,10 +256,10 @@
// These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit
/obj/structure/stairs/middle/check_integrity(var/obj/structure/stairs/bottom/B = null,
- var/obj/structure/stairs/middle/M = null,
+ var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
-
+
// In the case where we're provided all the pieces, just try connecting them.
// In order: all exist, they are appropriately adjacent, and they can connect
if(istype(B) && istype(M) && istype(T) && istype(O) && \
@@ -281,7 +282,7 @@
// Top is static for Middle stair, if it's invalid we can't do much
if(!istype(T))
return FALSE
-
+
// If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work
// Everything is simply linked in our original direction
if(istype(B1) && istype(T2) && istype(O) && ..(B, src, T, O))
@@ -293,11 +294,11 @@
O = GetAbove(B1)
if(!istype(B1) || !istype(O))
continue
-
+
B = locate(/obj/structure/stairs/bottom) in B1
if(..(B, src, T, O))
return TRUE
-
+
// The middle stair has some further special logic, in that it can be climbed, and so is technically valid if only the top exists
// T is enforced by a prior if
T.middle = src
@@ -341,7 +342,7 @@
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
-
+
// In the case where we're provided all the pieces, just try connecting them.
// In order: all exist, they are appropriately adjacent, and they can connect
if(istype(B) && istype(M) && istype(T) && istype(O) && \
@@ -377,11 +378,11 @@
B1 = GetBelow(O)
if(!istype(B1) || !istype(O))
continue
-
+
B = locate(/obj/structure/stairs/bottom) in B1
if((. = ..(B, M, src, O)))
return
-
+
// Out of the dir check, we have no valid neighbors, and thus are not complete. `.` was set by ..()
return
@@ -403,13 +404,13 @@
// Or if we climb up the middle
if((bottom in oldloc) || oldloc == GetBelow(src))
return
-
+
if(isobserver(AM)) // Ghosts have their own methods for going up and down
return
-
+
if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs
return
-
+
if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to
return
@@ -428,7 +429,7 @@
pulling |= L.pulling
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
pulling |= G.affecting
-
+
// If the stairs aren't broken, go up.
if(check_integrity())
AM.dir = turn(src.dir, 180)
@@ -438,7 +439,7 @@
// Move to Top
AM.forceMove(get_turf(bottom))
-
+
// If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays
for(var/atom/movable/P in pulling)
P.forceMove(get_turf(bottom)) // Just bring it along directly, no fussing with animation timing
@@ -455,16 +456,18 @@
if(isliving(AM))
var/mob/living/L = AM
-
+
if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs.
return
-
+
if(L.has_buckled_mobs())
return
if(L.buckled)
L.buckled.forceMove(get_turf(bottom))
-
+
+ L.forceMove(get_turf(bottom))
+
// If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so.
if(L.pulling && !L.pulling.anchored)
var/atom/movable/P = L.pulling
@@ -473,8 +476,6 @@
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
G.affecting.forceMove(get_turf(bottom))
-
- L.forceMove(get_turf(bottom))
if(L.client)
L.client.Process_Grab()
@@ -493,14 +494,14 @@
var/turf/B2 = get_turf(src)
var/turf/T1 = GetAbove(B1)
var/turf/T2 = GetAbove(B2)
-
+
if(!istype(B1) || !istype(B2))
warning("Stair created at invalid loc: ([loc.x], [loc.y], [loc.z])")
return INITIALIZE_HINT_QDEL
if(!istype(T1) || !istype(T2))
warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])")
return INITIALIZE_HINT_QDEL
-
+
// Spawn the stairs
// Railings sold separately
var/turf/simulated/open/O = T1
@@ -516,7 +517,7 @@
B.check_integrity(B, M, T, O)
return INITIALIZE_HINT_QDEL
-
+
// For ease of spawning. While you *can* spawn the base type and set its dir, this is useful for adminbus and a little bit quicker to map in
/obj/structure/stairs/spawner/north
dir = NORTH
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index aa37003520..2b0d100c10 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -14,6 +14,8 @@
throw_speed = 3
throw_range = 5
w_class = ITEMSIZE_NORMAL
+ /// Are we EMP immune?
+ var/emp_proof = FALSE
var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI.
var/c_uid
var/charge = 0 // note %age conveted to actual charge in New
@@ -189,6 +191,8 @@
rigged = 1 //broken batterys are dangerous
/obj/item/weapon/cell/emp_act(severity)
+ if(emp_proof)
+ return
//remove this once emp changes on dev are merged in
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm
index 643383067d..a5a0b66e0e 100644
--- a/code/modules/power/cells/device_cells.dm
+++ b/code/modules/power/cells/device_cells.dm
@@ -69,6 +69,9 @@
update_icon()
//CHOMP Add end
+/obj/item/weapon/cell/device/weapon/empproof
+ emp_proof = TRUE
+
/obj/item/weapon/cell/device/weapon/recharge
name = "self-charging weapon power cell"
desc = "A small power cell designed to power handheld weaponry. This one recharges itself."
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index c1dae89a6e..74dc34a72c 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -21,6 +21,7 @@
var/recharge_time = 4
var/charge_tick = 0
var/charge_delay = 75 //delay between firing and charging
+ var/shot_counter = TRUE // does this gun tell you how many shots it has?
var/battery_lock = 0 //If set, weapon cannot switch batteries
@@ -175,14 +176,15 @@
/obj/item/weapon/gun/energy/examine(mob/user)
. = ..()
- if(power_supply)
- if(charge_cost)
- var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
- . += "Has [shots_remaining] shot\s remaining."
+ if(shot_counter)
+ if(power_supply)
+ if(charge_cost)
+ var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
+ . += "Has [shots_remaining] shot\s remaining."
+ else
+ . += "Has infinite shots remaining."
else
- . += "Has infinite shots remaining."
- else
- . += "Does not have a power cell."
+ . += "Does not have a power cell."
/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands)
if(power_supply == null)
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
index 581e05d74d..f486d897d2 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
@@ -1,51 +1,126 @@
+#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
+#define HEATMODE_ATMOSPHERE 312.1 //kPa. basically virgo 2's
+#define HEATMODE_TEMP 612 //kelvin. basically virgo 2's
+/**
+ * This is here for now
+ */
+/proc/lavaland_environment_check(turf/simulated/T)
+ . = TRUE
+ if(!istype(T))
+ return
+ var/datum/gas_mixture/environment = T.return_air()
+ if(!istype(environment))
+ return
+ var/pressure = environment.return_pressure()
+ if(pressure > LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
+ . = FALSE
+ if(environment.temperature < (T20C - 30))
+ . = TRUE
+
+/proc/virgotwo_environment_check(turf/simulated/T)
+ . = TRUE
+ if(!istype(T))
+ return
+ var/datum/gas_mixture/environment = T.return_air()
+ if(!istype(environment))
+ return
+ var/pressure = environment.return_pressure()
+ if(pressure < HEATMODE_ATMOSPHERE - 20)
+ . = FALSE
+ if(environment.temperature > HEATMODE_TEMP - 30)
+ . = TRUE
+
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
- desc = "A self recharging, ranged mining tool that does increased damage in low temperature. Capable of holding up to six slots worth of mod kits."
+ desc = "A self recharging, ranged mining tool that does increased damage in low pressure."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "kineticgun"
- item_state = "kineticgun"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi')
+ slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi',
+ )
+ item_state = "kineticgun"
+ // ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
+ cell_type = /obj/item/weapon/cell/device/weapon/empproof
+ item_flags = NONE
+ charge_meter = FALSE
+ // obj_flags = UNIQUE_RENAME
+ // weapon_weight = WEAPON_LIGHT
+ // can_flashlight = 1
+ // flight_x_offset = 15
+ // flight_y_offset = 9
+ // automatic_charge_overlays = FALSE
projectile_type = /obj/item/projectile/kinetic
- origin_tech = list(TECH_COMBAT = 3, TECH_POWER = 3, TECH_ENGINEERING = 3)
- can_flashlight = TRUE
- flight_x_offset = 15
- flight_y_offset = 9
- charge_cost = 120 // 20 shots on weapon power cell
- fire_delay = 16
- self_recharge = TRUE
- recharge_time = 10 // every 20*2 seconds will get 20% power restored
+ charge_cost = 1200
+ battery_lock = TRUE
+ fire_sound = 'sound/weapons/kenetic_accel.ogg'
+ var/overheat_time = 16
+ var/holds_charge = FALSE
+ var/unique_frequency = FALSE // modified by KA modkits
+ var/overheat = FALSE
+ var/emptystate = "kineticgun_empty"
+ shot_counter = FALSE
+ // can_bayonet = TRUE
+ // knife_x_offset = 20
+ // knife_y_offset = 12
var/max_mod_capacity = 100
var/list/modkits = list()
- var/empty_state = "kineticgun_empty"
+
+ var/recharge_timerid
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile()
+ if(overheat)
+ return
+ . = ..()
+ if(.)
+ var/obj/item/projectile/P = .
+ modify_projectile(P)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, pointblank, reflex)
+ . = ..()
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka
+ name = "premium accelerator"
+ desc = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank."
+ icon_state = "premiumgun"
+ item_state = "premiumgun"
+ projectile_type = /obj/item/projectile/kinetic/premium
/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
. = ..()
- if(Adjacent(user) && max_mod_capacity)
+ if(max_mod_capacity)
. += "[get_remaining_mod_capacity()]% mod capacity remaining."
- for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
- . += "There is a [M.name] mod installed, using [M.cost]% capacity."
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ . += "There is \a [M] installed, using [M.cost]% capacity."
-/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/weapon/tool/crowbar))
+/obj/item/weapon/gun/energy/kinetic_accelerator/Exited(atom/movable/AM)
+ . = ..()
+ if((AM in modkits) && istype(AM, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/M = AM
+ M.uninstall(src, FALSE)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user)
+ if(I.has_tool_quality(TOOL_CROWBAR))
if(modkits.len)
to_chat(user, "You pry the modifications out.")
- playsound(src, A.usesound, 100, 1)
+ playsound(loc, I.usesound, 100, 1)
for(var/obj/item/borg/upgrade/modkit/M in modkits)
M.uninstall(src)
else
to_chat(user, "There are no modifications currently installed.")
- else if(istype(A, /obj/item/borg/upgrade/modkit))
- var/obj/item/borg/upgrade/modkit/MK = A
+ if(istype(I, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/MK = I
MK.install(src, user)
else
..()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity()
var/current_capacity_used = 0
- for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
current_capacity_used += M.cost
return max_mod_capacity - current_capacity_used
@@ -55,134 +130,243 @@
. += A
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
- for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
+ K.kinetic_gun = src //do something special on-hit, easy!
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
M.modify_projectile(K)
-/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile()
- var/obj/item/projectile/kinetic/BB = ..()
- if(!istype(BB))
- return
- modify_projectile(BB)
+/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
- var/turf/proj_turf = get_turf(src)
- if(!isturf(proj_turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- if(environment.temperature > 250)
- BB.name = "weakened [BB.name]"
- BB.damage *= BB.pressure_decrease
- return BB
+/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/Destroy()
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
+ return ..()
-/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0)
+/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg/Destroy()
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
+ return ..()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/minebot
+ // trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+ overheat_time = 20
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize()
. = ..()
- spawn(fire_delay)
- if(power_supply && power_supply.check_charge(charge_cost))
- playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ if(!holds_charge)
+ empty()
+ AddElement(/datum/element/conflict_checking, CONFLICT_ELEMENT_KA)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
+ . = ..()
+ if(power_supply.charge < charge_cost)
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/dropped(mob/user)
+ . = ..()
+ if(!QDELING(src) && !holds_charge)
+ // Put it on a delay because moving item from slot to hand
+ // calls dropped().
+ addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
+ if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit))
+ empty()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
+ if(power_supply)
+ power_supply.use(power_supply.charge)
+ update_icon()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
+ if(!power_supply)
+ return
+ if(overheat)
+ return
+ if(!recharge_time)
+ recharge_time = overheat_time
+ overheat = TRUE
+ update_icon()
+
+ var/carried = max(1, loc.ConflictElementCount(CONFLICT_ELEMENT_KA))
+
+ deltimer(recharge_timerid)
+ recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
+ return
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
+ power_supply.give(power_supply.maxcharge)
+ // process_chamber()
+ // if(!suppressed)
+ playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ // else
+ // to_chat(loc, "[src] silently charges up.")
+ overheat = FALSE
+ update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
cut_overlays()
- if(!power_supply || !power_supply.check_charge(charge_cost))
- add_overlay(empty_state)
- if(can_flashlight)
- var/iconF = "flight"
- if(gun_light)
- iconF = "flight_on"
- add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
+ if(overheat || (power_supply.charge == 0))
+ add_overlay(emptystate)
+
+#define KA_ENVIRO_TYPE_COLD 0
+#define KA_ENVIRO_TYPE_HOT 1
//Projectiles
/obj/item/projectile/kinetic
name = "kinetic force"
- icon = 'icons/obj/projectiles_vr.dmi'
icon_state = null
- damage = 32
+ damage = 30
damage_type = BRUTE
check_armour = "bomb"
- range = 3 // Our "range" var is named "kill_count". Yes it is.
+ range = 4
+ // log_override = TRUE
- var/pressure_decrease = 0.25
- var/turf_aoe = FALSE
- var/mob_aoe = FALSE
- var/list/hit_overlays = list()
+ var/pressure_decrease_active = FALSE
+ var/pressure_decrease = 1/3
+ var/environment = KA_ENVIRO_TYPE_COLD
+ var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun
-// /obj/item/projectile/kinetic/pod
-// kill_count = 4
-//
-// /obj/item/projectile/kinetic/pod/regular
-// damage = 50
-// pressure_decrease = 0.5
-//
-// /obj/item/projectile/kinetic/pod/enhanced
-// turf_aoe = TRUE
-// mob_aoe = TRUE
+/obj/item/projectile/kinetic/premium
+ damage = 40
+ damage_type = BRUTE
+ range = 5
-/obj/item/projectile/kinetic/on_impact(var/atom/A)
- strike_thing(A)
- . = ..()
+/obj/item/projectile/kinetic/Destroy()
+ kinetic_gun = null
+ return ..()
-/obj/item/projectile/kinetic/on_hit(var/atom/target)
+/obj/item/projectile/kinetic/Bump(atom/target)
+ if(kinetic_gun)
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_prehit(src, target, kinetic_gun)
+ if(!pressure_decrease_active)
+ if(environment == KA_ENVIRO_TYPE_COLD)
+ if(!lavaland_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ else if(environment == KA_ENVIRO_TYPE_HOT)
+ if(!virgotwo_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ return ..()
+
+/obj/item/projectile/kinetic/attack_mob(mob/living/target_mob, distance, miss_modifier)
+ if(!pressure_decrease_active)
+ if(environment == KA_ENVIRO_TYPE_COLD)
+ if(!lavaland_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ else if(environment == KA_ENVIRO_TYPE_HOT)
+ if(!virgotwo_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ return ..()
+
+/obj/item/projectile/kinetic/on_range()
+ strike_thing()
+ ..()
+
+/obj/item/projectile/kinetic/on_hit(atom/target)
strike_thing(target)
. = ..()
+/obj/item/projectile/kinetic/on_impact(atom/A)
+ . = ..()
+ strike_thing(A)
+
/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
+ if(!pressure_decrease_active)
+ if(environment == KA_ENVIRO_TYPE_COLD)
+ if(!lavaland_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ else if(environment == KA_ENVIRO_TYPE_HOT)
+ if(!virgotwo_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
- if(istype(target_turf, /turf/simulated/mineral))
+ if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike_predamage(src, target_turf, target, kinetic_gun)
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike(src, target_turf, target, kinetic_gun)
+ if(ismineralturf(target_turf))
var/turf/simulated/mineral/M = target_turf
- M.GetDrilled()
+ M.GetDrilled(TRUE)
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
- for(var/type in hit_overlays)
- new type(target_turf)
- if(turf_aoe)
- for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
- if(istype(T, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = T
- M.GetDrilled()
- if(mob_aoe)
- for(var/mob/living/L in range(1, target_turf) - firer - target)
- var/armor = L.run_armor_check(def_zone, check_armour)
- L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
- to_chat(L, "You're struck by a [name]!")
+
//Modkits
/obj/item/borg/upgrade/modkit
- name = "modification kit"
+ name = "kinetic accelerator modification kit"
desc = "An upgrade for kinetic accelerators."
icon = 'icons/obj/objects_vr.dmi'
icon_state = "modkit"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 4)
+ w_class = ITEMSIZE_SMALL
require_module = 1
- // var/module_type = /obj/item/robot_module/miner
- usesound = 'sound/items/Screwdriver.ogg'
+ // module_type = list(/obj/item/robot_module/miner)
var/denied_type = null
var/maximum_of_type = 1
var/cost = 30
var/modifier = 1 //For use in any mod kit that has numerical modifiers
+ var/minebot_upgrade = TRUE
+ var/minebot_exclusive = FALSE
/obj/item/borg/upgrade/modkit/examine(mob/user)
. = ..()
- if(Adjacent(user))
- . += "Occupies [cost]% of mod capacity."
+ . += "Occupies [cost]% of mod capacity."
/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user))
+ if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator))
install(A, user)
else
..()
-/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
- if(..())
- return
-
+/*
+/obj/item/borg/upgrade/modkit/afterInstall(mob/living/silicon/robot/R)
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/H in R.module.modules)
- return install(H, usr)
+ if(install(H, R)) //It worked
+ return
+ to_chat(R, "Upgrade error - Aborting Kinetic Accelerator linking.") //No applicable KA found, insufficient capacity, or some other problem.
+*/
/obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = TRUE
+ if(src in KA.modkits) // Sanity check to prevent installing the same modkit twice thanks to occasional click/lag delays.
+ return FALSE
+ // if(minebot_upgrade)
+ // if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
+ // to_chat(user, "The modkit you're trying to install is only rated for minebot use.")
+ // return FALSE
+ // else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
+ // to_chat(user, "The modkit you're trying to install is not rated for minebot use.")
+ // return FALSE
if(denied_type)
var/number_of_denied = 0
- for(var/obj/item/borg/upgrade/modkit/M as anything in KA.get_modkits())
+ for(var/A in KA.get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, denied_type))
number_of_denied++
if(number_of_denied >= maximum_of_type)
@@ -190,10 +374,11 @@
break
if(KA.get_remaining_mod_capacity() >= cost)
if(.)
+ user.drop_from_inventory(src, KA)
+ // if(!user.transferItemToLoc(src, KA))
+ // return FALSE
to_chat(user, "You install the modkit.")
- playsound(src, usesound, 100, 1)
- user.unEquip(src)
- forceMove(KA)
+ playsound(loc, 'sound/items/screwdriver.ogg', 100, 1)
KA.modkits += src
else
to_chat(user, "The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.")
@@ -201,19 +386,26 @@
to_chat(user, "You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.")
. = FALSE
-/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
- forceMove(get_turf(KA))
+/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA, forcemove = TRUE)
KA.modkits -= src
+ if(forcemove)
+ forceMove(get_turf(KA))
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
- return
+
+//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
+/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+//use this one for effects you want to trigger before mods that do damage
+/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+//and this one for things that don't need to trigger before other damage-dealing mods
+/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
//Range
/obj/item/borg/upgrade/modkit/range
name = "range increase"
desc = "Increases the range of a kinetic accelerator when installed."
modifier = 1
- cost = 24 //so you can fit four plus a tracer cosmetic
+ cost = 25
/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K)
K.range += modifier
@@ -228,55 +420,87 @@
/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
K.damage += modifier
-
- //Cooldown - CHOMPstation re-addition start
+//Cooldown
/obj/item/borg/upgrade/modkit/cooldown
name = "cooldown decrease"
- desc = "Decreases the cooldown of a kinetic accelerator."
+ desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use."
modifier = 2.5
+ minebot_upgrade = FALSE
+ var/decreased
/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
- KA.fire_delay -= modifier
+ var/old = KA.overheat_time
+ KA.overheat_time = max(0, KA.overheat_time - modifier)
+ decreased = old - KA.overheat_time
+
/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
- KA.fire_delay += modifier
+ KA.overheat_time += decreased
..()
-//Cooldown - CHOMPstation re-addition end
-/obj/item/borg/upgrade/modkit/efficiency
- name = "energy efficiency"
- desc = "Decreases the energy use of a kinetic accelerator."
- modifier = 20
+/obj/item/borg/upgrade/modkit/cooldown/minebot
+ name = "minebot cooldown decrease"
+ desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use."
+ icon_state = "door_electronics"
+ icon = 'icons/obj/module.dmi'
+ denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot
+ modifier = 10
+ cost = 0
+ minebot_upgrade = TRUE
+ minebot_exclusive = TRUE
-/obj/item/borg/upgrade/modkit/efficiency/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
- . = ..()
- if(.)
- KA.charge_cost -= modifier
-
-/obj/item/borg/upgrade/modkit/efficiency/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
- KA.charge_cost += modifier
- ..()
//AoE blasts
/obj/item/borg/upgrade/modkit/aoe
modifier = 0
+ var/turf_aoe = FALSE
+ var/stats_stolen = FALSE
+
+/obj/item/borg/upgrade/modkit/aoe/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple
+ if(AOE.stats_stolen || AOE == src)
+ continue
+ modifier += AOE.modifier //take its modifiers
+ AOE.modifier = 0
+ turf_aoe += AOE.turf_aoe
+ AOE.turf_aoe = FALSE
+ AOE.stats_stolen = TRUE
+
+/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ ..()
+ modifier = initial(modifier) //get our modifiers back
+ turf_aoe = initial(turf_aoe)
+ stats_stolen = FALSE
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
K.name = "kinetic explosion"
- if(!K.turf_aoe && !K.mob_aoe)
- K.hit_overlays += /obj/effect/temp_visual/explosion/fast
- K.mob_aoe += modifier
+
+/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(stats_stolen)
+ return
+ new /obj/effect/temp_visual/explosion/fast(target_turf)
+ if(turf_aoe)
+ for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
+ if(ismineralturf(T))
+ var/turf/simulated/mineral/M = T
+ M.GetDrilled(TRUE)
+ if(modifier)
+ for(var/mob/living/L in range(1, target_turf) - K.firer - target)
+ var/armor = L.run_armor_check(K.def_zone, K.check_armour)
+ // var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
+ L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
+ // L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
+ to_chat(L, "You're struck by a [K.name]!")
/obj/item/borg/upgrade/modkit/aoe/turfs
name = "mining explosion"
desc = "Causes the kinetic accelerator to destroy rock in an AoE."
denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs
-
-/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K)
- ..()
- K.turf_aoe = TRUE
+ turf_aoe = TRUE
/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
name = "offensive mining explosion"
@@ -289,19 +513,150 @@
desc = "Causes the kinetic accelerator to damage mobs in an AoE."
modifier = 0.2
+//Minebot passthrough
+/obj/item/borg/upgrade/modkit/minebot_passthrough
+ name = "minebot passthrough"
+ desc = "Causes kinetic accelerator shots to pass through minebots."
+ cost = 0
+
+//Tendril-unique modules
+/obj/item/borg/upgrade/modkit/cooldown/repeater
+ name = "rapid repeater"
+ desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown."
+ denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater
+ modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
+ cost = 50
+
+/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ var/valid_repeat = FALSE
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat != DEAD)
+ valid_repeat = TRUE
+ if(ismineralturf(target_turf))
+ valid_repeat = TRUE
+ if(valid_repeat)
+ KA.overheat = FALSE
+ KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds.
+
+/*
+/obj/item/borg/upgrade/modkit/lifesteal
+ name = "lifesteal crystal"
+ desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target."
+ icon_state = "modkit_crystal"
+ modifier = 2.5 //Not a very effective method of healing.
+ cost = 20
+ var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
+
+/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target) && isliving(K.firer))
+ var/mob/living/L = target
+ if(L.stat == DEAD)
+ return
+ L = K.firer
+ L.heal_ordered_damage(modifier, damage_heal_order)
+*/
+
+/obj/item/borg/upgrade/modkit/resonator_blasts
+ name = "resonator blast"
+ desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts."
+ denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts
+ cost = 30
+ modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it.
+
+/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs.
+ var/obj/effect/resonance/R = locate(/obj/effect/resonance) in target_turf
+ if(R)
+ R.resonance_damage *= modifier
+ R.burst()
+ return
+ new /obj/effect/resonance(target_turf, K.firer, 30)
+
+/*
+/obj/item/borg/upgrade/modkit/bounty
+ name = "death syphon"
+ desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature."
+ denied_type = /obj/item/borg/upgrade/modkit/bounty
+ modifier = 1.25
+ cost = 30
+ var/maximum_bounty = 25
+ var/list/bounties_reaped = list()
+
+/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK)
+ for(var/i in existing_marks)
+ var/datum/status_effect/syphon_mark/SM = i
+ if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward
+ SM.reward_target = null
+ qdel(SM)
+ L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src)
+
+/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target))
+ var/mob/living/L = target
+ if(bounties_reaped[L.type])
+ var/kill_modifier = 1
+ if(K.pressure_decrease_active)
+ kill_modifier *= K.pressure_decrease
+ var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
+ L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
+
+/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
+ var/bonus_mod = 1
+ if(ismegafauna(L)) //megafauna reward
+ bonus_mod = 4
+ if(!bounties_reaped[L.type])
+ bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty)
+ else
+ bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty)
+*/
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
- desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
+ desc = "A remarkably illegal modification kit that increases the damage a kinetic accelerator does in pressurized environments."
modifier = 2
denied_type = /obj/item/borg/upgrade/modkit/indoors
maximum_of_type = 2
- cost = 40
+ cost = 35
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
K.pressure_decrease *= modifier
+// Atmospheric
+/obj/item/borg/upgrade/modkit/heater
+ name = "temperature modulator"
+ desc = "A remarkably unusual modification kit that makes kinetic accelerators more usable in hot, overpressurized environments, \
+ in exchange for making them weak elsewhere, like the cold or in space."
+ denied_type = /obj/item/borg/upgrade/modkit/indoors
+ maximum_of_type = 1
+ cost = 30
+
+/obj/item/borg/upgrade/modkit/heater/modify_projectile(obj/item/projectile/kinetic/K)
+ K.environment = KA_ENVIRO_TYPE_HOT
+
+//Trigger Guard
+
+/*
+/obj/item/borg/upgrade/modkit/trigger_guard
+ name = "modified trigger guard"
+ desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed."
+ cost = 20
+ denied_type = /obj/item/borg/upgrade/modkit/trigger_guard
+
+/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+
+/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.trigger_guard = TRIGGER_GUARD_NORMAL
+ ..()
+*/
+
//Cosmetic
/obj/item/borg/upgrade/modkit/chassis_mod
@@ -342,7 +697,7 @@
/obj/item/borg/upgrade/modkit/tracer/adjustable
name = "adjustable tracer bolts"
- desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color."
+ desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color."
/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
- bolt_color = input(user,"Choose Color") as color
+ bolt_color = input(user,"","Choose Color",bolt_color) as color|null
diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm
index aedd12f100..9545e923ac 100644
--- a/code/modules/projectiles/guns/launcher/rocket.dm
+++ b/code/modules/projectiles/guns/launcher/rocket.dm
@@ -36,7 +36,7 @@
if(rockets.len)
var/obj/item/ammo_casing/rocket/I = rockets[1]
rockets -= I
- return
+ return new I.projectile_type(src)
return null
/obj/item/weapon/gun/launcher/rocket/handle_post_fire(mob/user, atom/target)
diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm
index 06e11c6800..100e4ea60a 100644
--- a/code/modules/reagents/reagents/food_drinks.dm
+++ b/code/modules/reagents/reagents/food_drinks.dm
@@ -316,6 +316,13 @@
color = "#664330"
allergen_type = ALLERGEN_FISH //Murkfin is fish
+/datum/reagent/nutriment/protein/bean
+ name = "beans"
+ id = "bean_protein"
+ taste_description = "beans"
+ color = "#562e0b"
+ allergen_type = ALLERGEN_BEANS //Made from soy beans
+
/datum/reagent/nutriment/honey
name = "Honey"
id = "honey"
diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm
index 715e0fa735..46cece483e 100644
--- a/code/modules/reagents/reagents/food_drinks_vr.dm
+++ b/code/modules/reagents/reagents/food_drinks_vr.dm
@@ -155,15 +155,12 @@
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
M.adjust_nutrition(alt_nutriment_factor * removed)
-
/datum/reagent/nutriment/magicdust/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
playsound(M, 'sound/items/hooh.ogg', 50, 1, -1)
if(prob(5))
to_chat(M, "You feel like you've been gnomed...")
-
-
/datum/reagent/ethanol/galacticpanic
name = "Galactic Panic Attack"
id = "galacticpanic"
@@ -515,4 +512,34 @@
glass_name = "Shambler's Juice"
glass_desc = "A glass of something shambly"
- glass_special = list(DRINK_FIZZ)
\ No newline at end of file
+ glass_special = list(DRINK_FIZZ)
+
+////////////////START BrainzSnax Reagents////////////////
+
+/datum/reagent/nutriment/protein/brainzsnax
+ name = "grey matter"
+ id = "brain_protein"
+ taste_description = "fatty, mushy meat and allspice"
+ color = "#caa3c9"
+
+/datum/reagent/nutriment/protein/brainzsnax/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ if(prob(5) && !(alien == IS_CHIMERA || alien == IS_SLIME || alien == IS_PLANT || alien == IS_DIONA || alien == IS_SHADEKIN && !M.isSynthetic()))
+ M.adjustBrainLoss(removed) //Any other species risks prion disease.
+ M.Confuse(5)
+ M.hallucination = max(M.hallucination, 25)
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling
+ H.feral -= removed * 3 //Should calm them down quick, provided they're actually in a state to STAY calm.
+ if(H.feral <=0) //Check if they're unferalled
+ H.feral = 0
+ to_chat(H, "Your mind starts to clear, soothed into a state of clarity as your senses return.")
+ log_and_message_admins("is no longer feral.", H)
+
+/datum/reagent/nutriment/protein/brainzsnax/red
+ id = "red_brain_protein"
+ taste_description = "fatty, mushy meat and cheap tomato sauce"
+ color = "#a6898d"
+
+////////////////END BrainzSnax Reagents////////////////
diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm
index 5c77c19e60..9e21b9bc16 100644
--- a/code/modules/research/designs/circuits/circuits.dm
+++ b/code/modules/research/designs/circuits/circuits.dm
@@ -427,6 +427,13 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/circuitboard/skills
sort_string = "LAAAC"
+/datum/design/circuit/arf_generator
+ name = "atmospheric field generator"
+ id = "arf_generator"
+ req_tech = list(TECH_MAGNET = 4, TECH_POWER = 4, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/arf_generator
+ sort_string = "LAAAD"
+
/datum/design/circuit/mecha
req_tech = list(TECH_DATA = 3)
diff --git a/icons/_nanomaps/southern_cross_nanomap_z8.png b/icons/_nanomaps/southern_cross_nanomap_z8.png
index b939884875..b102d77030 100644
Binary files a/icons/_nanomaps/southern_cross_nanomap_z8.png and b/icons/_nanomaps/southern_cross_nanomap_z8.png differ
diff --git a/icons/inventory/eyes/item.dmi b/icons/inventory/eyes/item.dmi
index b4ba37ad39..bcd48ade6b 100644
Binary files a/icons/inventory/eyes/item.dmi and b/icons/inventory/eyes/item.dmi differ
diff --git a/icons/inventory/eyes/mob.dmi b/icons/inventory/eyes/mob.dmi
index 70113e3d8c..1d4e1fe2ca 100644
Binary files a/icons/inventory/eyes/mob.dmi and b/icons/inventory/eyes/mob.dmi differ
diff --git a/icons/inventory/face/item.dmi b/icons/inventory/face/item.dmi
index 5bde3b32d4..60cb749378 100644
Binary files a/icons/inventory/face/item.dmi and b/icons/inventory/face/item.dmi differ
diff --git a/icons/inventory/face/item_vr.dmi b/icons/inventory/face/item_vr.dmi
index 78230b3e59..c923555fe7 100644
Binary files a/icons/inventory/face/item_vr.dmi and b/icons/inventory/face/item_vr.dmi differ
diff --git a/icons/inventory/face/mob.dmi b/icons/inventory/face/mob.dmi
index fd1af6e950..7c9363956c 100644
Binary files a/icons/inventory/face/mob.dmi and b/icons/inventory/face/mob.dmi differ
diff --git a/icons/inventory/face/mob_vr.dmi b/icons/inventory/face/mob_vr.dmi
index ec49d3cdb7..fbac00cd0d 100644
Binary files a/icons/inventory/face/mob_vr.dmi and b/icons/inventory/face/mob_vr.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 327eb3b9ce..17b80b78a5 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/lefthand_balls_vr.dmi b/icons/mob/items/lefthand_balls_vr.dmi
index 2f65e0969a..70455d01c2 100644
Binary files a/icons/mob/items/lefthand_balls_vr.dmi and b/icons/mob/items/lefthand_balls_vr.dmi differ
diff --git a/icons/mob/items/lefthand_guns_vr.dmi b/icons/mob/items/lefthand_guns_vr.dmi
index 0d8acb4fbb..fcf529ee98 100644
Binary files a/icons/mob/items/lefthand_guns_vr.dmi and b/icons/mob/items/lefthand_guns_vr.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 75d2c9ac51..f8b95c18bc 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/items/righthand_balls_vr.dmi b/icons/mob/items/righthand_balls_vr.dmi
index ba2bccac38..286540595d 100644
Binary files a/icons/mob/items/righthand_balls_vr.dmi and b/icons/mob/items/righthand_balls_vr.dmi differ
diff --git a/icons/mob/items/righthand_guns_vr.dmi b/icons/mob/items/righthand_guns_vr.dmi
index 73ee95c0a3..5554423acb 100644
Binary files a/icons/mob/items/righthand_guns_vr.dmi and b/icons/mob/items/righthand_guns_vr.dmi differ
diff --git a/icons/obj/32x64.dmi b/icons/obj/32x64.dmi
index 7b8c00eef8..493b337ad6 100644
Binary files a/icons/obj/32x64.dmi and b/icons/obj/32x64.dmi differ
diff --git a/icons/obj/Cryogenic2_vr.dmi b/icons/obj/Cryogenic2_vr.dmi
index 69d24bc15e..e4b88cb635 100644
Binary files a/icons/obj/Cryogenic2_vr.dmi and b/icons/obj/Cryogenic2_vr.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 20c744e0a0..99362c782d 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/icons/obj/atm_fieldgen.dmi b/icons/obj/atm_fieldgen.dmi
new file mode 100644
index 0000000000..0c30371196
Binary files /dev/null and b/icons/obj/atm_fieldgen.dmi differ
diff --git a/icons/obj/balls_vr.dmi b/icons/obj/balls_vr.dmi
index 994be4ab97..e85f4cab05 100644
Binary files a/icons/obj/balls_vr.dmi and b/icons/obj/balls_vr.dmi differ
diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi
index 1f7e82c960..dad29a40a2 100644
Binary files a/icons/obj/boxes.dmi and b/icons/obj/boxes.dmi differ
diff --git a/icons/obj/food_canned.dmi b/icons/obj/food_canned.dmi
index 606ca9f6e4..1a4be5b506 100644
Binary files a/icons/obj/food_canned.dmi and b/icons/obj/food_canned.dmi differ
diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi
index 609e107845..a623c02134 100644
Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 84fdd7be13..ededfc4b50 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 64184432c7..1f203a1e8f 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/storage_vr.dmi b/icons/obj/storage_vr.dmi
index 2975e65409..31181de6c7 100644
Binary files a/icons/obj/storage_vr.dmi and b/icons/obj/storage_vr.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index dbc403ce40..f81d8a42d6 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/obj/tools_vr.dmi b/icons/obj/tools_vr.dmi
index c49a991ff9..05de9a423a 100644
Binary files a/icons/obj/tools_vr.dmi and b/icons/obj/tools_vr.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index 98b6c9b60f..f9c1ce7400 100644
Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ
diff --git a/icons/obj/wall_frame_bay.dmi b/icons/obj/wall_frame_bay.dmi
index 628a002edb..c3f14c5f48 100644
Binary files a/icons/obj/wall_frame_bay.dmi and b/icons/obj/wall_frame_bay.dmi differ
diff --git a/icons/turf/fancy_shuttles/tether_cargo.dmi b/icons/turf/fancy_shuttles/tether_cargo.dmi
new file mode 100644
index 0000000000..b65e9a0e6c
Binary files /dev/null and b/icons/turf/fancy_shuttles/tether_cargo.dmi differ
diff --git a/icons/turf/fancy_shuttles/tether_cargo_preview.dmi b/icons/turf/fancy_shuttles/tether_cargo_preview.dmi
new file mode 100644
index 0000000000..48ef0cb78f
Binary files /dev/null and b/icons/turf/fancy_shuttles/tether_cargo_preview.dmi differ
diff --git a/icons/turf/transit_vr.dmi b/icons/turf/transit_vr.dmi
index 4b7339548e..b4bdfc1953 100644
Binary files a/icons/turf/transit_vr.dmi and b/icons/turf/transit_vr.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index e3fc2202e9..86243a853f 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index c1b018e525..1ea3e6f625 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -2850,6 +2850,18 @@
dir = 10
},
/obj/effect/floor_decal/steeldecal/steel_decals4,
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/paleblue/bordercorner2{
+ dir = 5
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"aeE" = (
@@ -3359,9 +3371,6 @@
/obj/effect/floor_decal/corner/paleblue/border{
dir = 5
},
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 5
- },
/obj/effect/floor_decal/borderfloor/corner2{
dir = 4
},
@@ -3577,6 +3586,11 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"afN" = (
@@ -3589,6 +3603,11 @@
/obj/machinery/door/firedoor/glass/hidden/steel{
dir = 8
},
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"afO" = (
@@ -17402,21 +17421,9 @@
/turf/simulated/floor/tiled,
/area/rnd/hallway)
"aCg" = (
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/paleblue/border{
- dir = 4
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 6
- },
-/obj/effect/floor_decal/corner/paleblue/bordercorner2{
- dir = 6
- },
/obj/effect/floor_decal/steeldecal/steel_decals7{
dir = 9
},
@@ -32164,6 +32171,38 @@
/obj/effect/floor_decal/corner/red/border,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/lowerhall)
+<<<<<<< HEAD
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+"cwS" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/crew_quarters/visitor_laundry)
+=======
+"ctE" = (
+/obj/structure/table/rack,
+/obj/item/weapon/tank/emergency,
+/obj/item/weapon/tank/emergency,
+/obj/item/weapon/tank/emergency,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
+"cwS" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/crew_quarters/visitor_laundry)
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
"cAR" = (
/turf/simulated/floor/looking_glass/center,
/area/looking_glass/lg_1)
@@ -32421,6 +32460,20 @@
},
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/hideyhole)
+"dvU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/lowernorthhall)
"dxY" = (
/obj/structure/table/rack,
/obj/item/clothing/mask/gas,
@@ -32528,6 +32581,12 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/lowerhall)
+"dNE" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
"dNP" = (
/obj/machinery/door/airlock/silver{
name = "Clown's Office";
@@ -32785,6 +32844,10 @@
},
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/weaponsrange)
+"eJc" = (
+/obj/item/weapon/storage/toolbox/brass,
+/turf/simulated/floor/plating,
+/area/maintenance/lowmedbaymaint)
"eJQ" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/door/blast/regular{
@@ -32984,6 +33047,7 @@
/obj/item/weapon/reagent_containers/food/snacks/pie,
/obj/item/weapon/pen/crayon/marker/rainbow,
/obj/item/weapon/pen/crayon/rainbow,
+/obj/item/clothing/mask/emotions,
/obj/structure/closet/secure_closet{
desc = "Where the Clown keeps their hooliganisms.";
name = "funny locker";
@@ -34065,6 +34129,12 @@
},
/turf/simulated/floor/tiled,
/area/rnd/hallway)
+"jkI" = (
+/obj/structure/table/rack/shelf,
+/obj/random/maintenance/cargo,
+/obj/random/maintenance/cargo,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
"jnj" = (
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/lightgrey/border,
@@ -34969,6 +35039,24 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/brig)
+<<<<<<< HEAD
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+"lEA" = (
+/turf/simulated/wall,
+/area/maintenance/engineering/atmos/airlock/gas)
+=======
+"lEA" = (
+/turf/simulated/wall,
+/area/maintenance/engineering/atmos/airlock/gas)
+"lEB" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
"lIj" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/dark,
@@ -35361,6 +35449,12 @@
/obj/effect/floor_decal/steeldecal/steel_decals7{
dir = 10
},
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/paleblue/bordercorner2{
+ dir = 6
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"mGP" = (
@@ -36586,6 +36680,40 @@
},
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/lowerhall)
+<<<<<<< HEAD
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+"qtU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
+ dir = 5
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/engineering/atmos/airlock/gas)
+=======
+"qtC" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7,
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/lowernorthhall)
+"qtU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
+ dir = 5
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/engineering/atmos/airlock/gas)
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
"qwm" = (
/obj/effect/floor_decal/borderfloor/corner{
dir = 4
@@ -36620,7 +36748,39 @@
pixel_x = -24
},
/turf/simulated/wall,
+<<<<<<< HEAD
/area/maintenance/substation/cargostoresubstation)
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+/area/maintenance/substation/surfaceservicesubstation)
+"qEW" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plating,
+/area/tether/surfacebase/funny/clownoffice)
+=======
+/area/maintenance/substation/surfaceservicesubstation)
+"qEW" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plating,
+/area/tether/surfacebase/funny/clownoffice)
+"qJe" = (
+/obj/structure/table/rack/shelf,
+/obj/random/maintenance/cargo,
+/obj/random/maintenance/cargo,
+/obj/random/maintenance/cargo,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
"qJl" = (
/obj/machinery/door/airlock/maintenance/common,
/turf/simulated/floor/plating,
@@ -36887,6 +37047,13 @@
/obj/item/weapon/bedsheet/mimedouble,
/turf/simulated/floor/carpet/bcarpet,
/area/tether/surfacebase/funny/mimeoffice)
+"rtV" = (
+/obj/random/maintenance/medical,
+/obj/structure/table/rack,
+/obj/random/maintenance/cargo,
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
"ruj" = (
/obj/machinery/door/airlock/silver{
name = "Mime's Office";
@@ -37212,6 +37379,10 @@
},
/turf/simulated/floor/lino,
/area/crew_quarters/visitor_dining)
+"syt" = (
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
"szT" = (
/obj/effect/floor_decal/borderfloor/corner{
dir = 1
@@ -37258,6 +37429,33 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_one_hall)
+<<<<<<< HEAD
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+"sHK" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/tether/surfacebase/funny/mimeoffice)
+=======
+"sGh" = (
+/obj/structure/table/rack/shelf,
+/obj/random/maintenance/medical,
+/obj/random/maintenance/medical,
+/obj/random/maintenance/cargo,
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
+"sHK" = (
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/tether/surfacebase/funny/mimeoffice)
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
"sHO" = (
/obj/effect/floor_decal/steeldecal/steel_decals6{
dir = 1
@@ -37324,6 +37522,10 @@
},
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/brig/storage)
+"sYi" = (
+/obj/effect/decal/remains/human,
+/turf/simulated/floor/plating,
+/area/maintenance/lowmedbaymaint)
"tak" = (
/obj/structure/table/steel,
/obj/structure/cable/green{
@@ -37340,6 +37542,10 @@
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/brig)
+"tcK" = (
+/obj/item/clothing/suit/storage/hooded/wintercoat/ratvar,
+/turf/simulated/floor/plating,
+/area/maintenance/lowmedbaymaint)
"tdg" = (
/turf/simulated/mineral,
/area/maintenance/lowmedbaymaint)
@@ -37414,6 +37620,20 @@
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/security/lowerhall)
+"tAo" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/lowernorthhall)
"tAT" = (
/obj/effect/floor_decal/borderfloor{
dir = 9
@@ -37644,6 +37864,16 @@
},
/turf/simulated/floor,
/area/tether/surfacebase/security/gasstorage)
+"ucq" = (
+/obj/machinery/door/airlock/maintenance/common,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/tether/surfacebase/lowernorthhall)
"ucv" = (
/obj/machinery/door/firedoor/glass,
/obj/machinery/door/airlock/glass_security{
@@ -37661,6 +37891,10 @@
},
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/lowerhall)
+"udU" = (
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/plating,
+/area/maintenance/lowmedbaymaint)
"uge" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
@@ -38180,7 +38414,73 @@
},
/turf/simulated/wall,
/area/maintenance/substation/surfaceservicesubstation)
+<<<<<<< HEAD
>>>>>>> 660b7d0a0e... Merge pull request #10831 from Very-Soft/MESSESWITHTHEMAPMOAR
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+"wjo" = (
+/obj/effect/map_helper/airlock/door/ext_door,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "atmoslockdown";
+ layer = 1;
+ name = "Atmospherics Lockdown";
+ opacity = 0;
+ open_layer = 1
+ },
+/obj/machinery/door/airlock/glass_external{
+ frequency = 1379;
+ icon_state = "door_locked";
+ id_tag = "atmos_airlock_outer";
+ locked = 1
+ },
+/obj/machinery/access_button/airlock_exterior{
+ dir = 8;
+ master_tag = "atmos_airlock";
+ pixel_x = -8;
+ pixel_y = -25
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/engineering/atmos/airlock)
+=======
+"wjd" = (
+/obj/effect/floor_decal/rust,
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "east bump";
+ pixel_x = 28
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
+"wjo" = (
+/obj/effect/map_helper/airlock/door/ext_door,
+/obj/machinery/door/blast/regular{
+ density = 0;
+ icon_state = "pdoor0";
+ id = "atmoslockdown";
+ layer = 1;
+ name = "Atmospherics Lockdown";
+ opacity = 0;
+ open_layer = 1
+ },
+/obj/machinery/door/airlock/glass_external{
+ frequency = 1379;
+ icon_state = "door_locked";
+ id_tag = "atmos_airlock_outer";
+ locked = 1
+ },
+/obj/machinery/access_button/airlock_exterior{
+ dir = 8;
+ master_tag = "atmos_airlock";
+ pixel_x = -8;
+ pixel_y = -25
+ },
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/engineering/atmos/airlock)
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
"wjq" = (
/obj/structure/bed/chair{
dir = 4
@@ -38450,6 +38750,9 @@
},
/turf/simulated/floor/tiled/freezer,
/area/tether/surfacebase/security/brig/bathroom)
+"xfm" = (
+/turf/simulated/floor/tiled/steel_dirty,
+/area/maintenance/lowmedbaymaint)
"xgQ" = (
/obj/effect/floor_decal/borderfloor{
dir = 1
@@ -46699,6 +47002,7 @@ aad
aad
aad
aad
+<<<<<<< HEAD
aad
aah
gCa
@@ -46761,6 +47065,163 @@ aDg
aGo
aGX
awn
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+aaa
+"}
+(80,1,1) = {"
+aqR
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aAD
+aAD
+aAD
+aAD
+aAI
+aAI
+aAI
+aef
+aeZ
+afN
+aBA
+aCr
+aCr
+aCr
+aCr
+aCr
+aGa
+aGa
+aGa
+aHV
+aGa
+aGa
+aGa
+agM
+aja
+afh
+agM
+agM
+agM
+aqI
+agM
+agM
+agM
+asa
+agM
+asM
+agM
+aqI
+agM
+agM
+agM
+agM
+agM
+agM
+abc
+sQB
+byP
+agM
+aBO
+aBO
+aBO
+aBO
+aEz
+aFl
+=======
+aaa
+"}
+(80,1,1) = {"
+aqR
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aAD
+aAD
+aAD
+aAD
+sGh
+qJe
+jkI
+aef
+aeZ
+afN
+aBA
+aCr
+aCr
+aCr
+aCr
+aCr
+aGa
+aGa
+aGa
+aHV
+aGa
+aGa
+aGa
+agM
+aja
+afh
+agM
+agM
+agM
+aqI
+agM
+agM
+agM
+asa
+agM
+asM
+agM
+aqI
+agM
+agM
+agM
+agM
+agM
+agM
+abc
+sQB
+byP
+agM
+aBO
+aBO
+aBO
+aBO
+aEz
+aFl
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
aBO
aBO
aBO
@@ -46817,6 +47278,250 @@ aad
aad
aad
aad
+<<<<<<< HEAD
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+aaa
+"}
+(81,1,1) = {"
+aqR
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aAD
+aAI
+aAI
+aAI
+aAI
+aAI
+aAI
+aef
+aeS
+afO
+aBB
+aCr
+aDa
+aDU
+aEj
+aCr
+aGb
+aGK
+aHr
+aIq
+aJU
+aLt
+aGa
+anD
+anU
+afp
+aoP
+apz
+aqd
+aqJ
+arf
+arx
+arN
+aqd
+asr
+asN
+atk
+atM
+aus
+auN
+avm
+avV
+jDg
+wUW
+abh
+abk
+osh
+agM
+aah
+aah
+aah
+aBO
+aEw
+aFl
+aBO
+aah
+aBO
+aHC
+aIh
+aIV
+aJN
+aJI
+aJI
+aJI
+aMs
+aNa
+aJI
+aJI
+aJI
+aJI
+aJI
+aNZ
+aQy
+aNa
+aJI
+aMm
+aSM
+aTo
+aTS
+aTS
+aIh
+aTZ
+aEx
+aVn
+aWc
+aWc
+aWc
+aWA
+aHd
+aYb
+aYb
+aHZ
+aHZ
+aYb
+aYb
+aZY
+aYd
+=======
+aaa
+"}
+(81,1,1) = {"
+aqR
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aAD
+udU
+sYi
+aAD
+xfm
+syt
+xfm
+aef
+aeS
+tAo
+aBB
+aCr
+aDa
+aDU
+aEj
+aCr
+aGb
+aGK
+aHr
+aIq
+aJU
+aLt
+aGa
+anD
+anU
+afp
+aoP
+apz
+aqd
+aqJ
+arf
+arx
+arN
+aqd
+asr
+asN
+atk
+atM
+aus
+auN
+avm
+avV
+jDg
+wUW
+abh
+abk
+osh
+agM
+aah
+aah
+aah
+aBO
+aEw
+aFl
+aBO
+aah
+aBO
+aHC
+aIh
+aIV
+aJN
+aJI
+aJI
+aJI
+aMs
+aNa
+aJI
+aJI
+aJI
+aJI
+aJI
+aNZ
+aQy
+aNa
+aJI
+aMm
+aSM
+aTo
+aTS
+aTS
+aIh
+aTZ
+aEx
+aVn
+aWc
+aWc
+aWc
+aWA
+aHd
+aYb
+aYb
+aHZ
+aHZ
+aYb
+aYb
+aZY
+aYd
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
aad
aad
aad
@@ -46843,6 +47548,7 @@ aad
aad
aad
aad
+<<<<<<< HEAD
gCa
gCa
ucv
@@ -46906,6 +47612,151 @@ aHt
aBN
aIa
aBO
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+aaa
+"}
+(82,1,1) = {"
+aqR
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aAD
+aAI
+aAI
+aAI
+aAI
+aAI
+aAI
+aef
+aeS
+afO
+aBC
+aCr
+aDb
+aDV
+aEk
+aCr
+aGc
+aGL
+aHs
+aIs
+aKb
+aLu
+aGa
+aic
+anV
+aoh
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+asb
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+xAT
+aoQ
+tvk
+abl
+ghr
+agM
+=======
+aaa
+"}
+(82,1,1) = {"
+aqR
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aaf
+aAD
+tcK
+aAI
+aAD
+rtV
+ctE
+lEB
+ucq
+qtC
+dvU
+aBC
+aCr
+aDb
+aDV
+aEk
+aCr
+aGc
+aGL
+aHs
+aIs
+aKb
+aLu
+aGa
+aic
+anV
+aoh
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+asb
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+aoQ
+xAT
+aoQ
+tvk
+abl
+ghr
+agM
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
aah
aah
aah
@@ -46966,8 +47817,258 @@ aad
aad
aaa
"}
+<<<<<<< HEAD
(58,1,1) = {"
aaa
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+(83,1,1) = {"
+aqR
+aaf
+aaf
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aaf
+aag
+aaf
+aaf
+aAD
+aAI
+aAI
+aAI
+aAI
+aAI
+aAI
+aef
+afi
+afQ
+bca
+aCr
+aDs
+aDW
+aEl
+aFc
+aGe
+aGM
+aHz
+aIA
+aKc
+aLZ
+baX
+aid
+goJ
+aoi
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoi
+awH
+oQm
+gVe
+lNt
+mon
+agM
+aah
+aah
+aah
+aBO
+aAY
+aFl
+aBO
+aah
+aBO
+aHC
+aIh
+aIX
+aJO
+aKw
+aLd
+aLJ
+aMr
+aNc
+aNK
+aOf
+aOf
+aOf
+aOf
+aNZ
+aQB
+aRe
+aRJ
+aSe
+aSO
+aTr
+aer
+aTZ
+aTZ
+aTZ
+aTZ
+aVn
+aWe
+aWd
+aWc
+aWA
+aXG
+aXk
+aWA
+aWA
+aWA
+aWA
+aXk
+aWc
+aWc
+aWc
+bas
+baU
+baU
+aad
+=======
+(83,1,1) = {"
+aqR
+aaf
+aaf
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aae
+aaf
+aag
+aaf
+aaf
+aAD
+eJc
+udU
+aAD
+syt
+dNE
+wjd
+aef
+afi
+afQ
+bca
+aCr
+aDs
+aDW
+aEl
+aFc
+aGe
+aGM
+aHz
+aIA
+aKc
+aLZ
+baX
+aid
+goJ
+aoi
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoj
+aoi
+awH
+oQm
+gVe
+lNt
+mon
+agM
+aah
+aah
+aah
+aBO
+aAY
+aFl
+aBO
+aah
+aBO
+aHC
+aIh
+aIX
+aJO
+aKw
+aLd
+aLJ
+aMr
+aNc
+aNK
+aOf
+aOf
+aOf
+aOf
+aNZ
+aQB
+aRe
+aRJ
+aSe
+aSO
+aTr
+aer
+aTZ
+aTZ
+aTZ
+aTZ
+aVn
+aWe
+aWd
+aWc
+aWA
+aXG
+aXk
+aWA
+aWA
+aWA
+aWA
+aXk
+aWc
+aWc
+aWc
+bas
+baU
+baU
+aad
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
aad
aad
aad
@@ -48532,6 +49633,222 @@ asS
aaa
aad
aad
+<<<<<<< HEAD
+||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz
+aan
+abj
+acm
+acU
+adA
+aan
+aBn
+lbu
+axL
+adc
+adS
+aeU
+afs
+aeD
+aCg
+mGH
+aDH
+mGH
+aEX
+aFv
+aGw
+aGV
+aHU
+aJT
+tRA
+igw
+bbf
+ago
+anY
+aok
+aok
+aok
+aok
+aok
+aok
+aok
+aok
+ase
+aok
+aok
+aok
+sEz
+aut
+aut
+avn
+avW
+awJ
+avW
+kgk
+mSz
+qhq
+oib
+agM
+aCJ
+aCJ
+aCJ
+aCJ
+aCJ
+aCJ
+agM
+agM
+agM
+aIm
+aJf
+aJQ
+aKC
+aLg
+aLM
+aLM
+aLM
+aLg
+aOk
+aOk
+aOk
+aOj
+aQc
+aQc
+aQc
+aQb
+aSj
+aSj
+aSj
+aSi
+aUc
+aUc
+aUc
+aVr
+aUc
+aUc
+aUc
+aUb
+aXt
+aXO
+aYh
+aHE
+aIj
+aZo
+aZC
+aZC
+aVp
+aWu
+aZQ
+baS
+baU
+baU
+aah
+=======
+aan
+abj
+acm
+acU
+adA
+aan
+aBn
+lbu
+axL
+adc
+adS
+aeU
+afs
+aeD
+aCg
+mGH
+aDH
+adx
+aEX
+aFv
+aGw
+aGV
+aHU
+aJT
+tRA
+igw
+bbf
+ago
+anY
+aok
+aok
+aok
+aok
+aok
+aok
+aok
+aok
+ase
+aok
+aok
+aok
+sEz
+aut
+aut
+avn
+avW
+awJ
+avW
+kgk
+mSz
+qhq
+oib
+agM
+aCJ
+aCJ
+aCJ
+aCJ
+aCJ
+aCJ
+agM
+agM
+agM
+aIm
+aJf
+aJQ
+aKC
+aLg
+aLM
+aLM
+aLM
+aLg
+aOk
+aOk
+aOk
+aOj
+aQc
+aQc
+aQc
+aQb
+aSj
+aSj
+aSj
+aSi
+aUc
+aUc
+aUc
+aVr
+aUc
+aUc
+aUc
+aUb
+aXt
+aXO
+aYh
+aHE
+aIj
+aZo
+aZC
+aZC
+aVp
+aWu
+aZQ
+baS
+baU
+baU
+aah
+>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz
aad
aad
aad
diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm
index 92b9b10b9a..8eeecd2d37 100644
--- a/maps/tether/tether_things.dm
+++ b/maps/tether/tether_things.dm
@@ -473,6 +473,5 @@ var/global/list/latejoin_tram = list()
prob_fall = 50
mobs_to_pick_from = list(
/mob/living/simple_mob/animal/passive/gaslamp = 300,
- /mob/living/simple_mob/animal/space/goose/virgo3b = 100,
- /mob/living/simple_mob/vore/alienanimals/teppi = 5
+ /mob/living/simple_mob/vore/alienanimals/teppi = 4
)
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index 9c3839f46c..977ad2ffc8 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -219,14 +219,9 @@ var/list/all_maps = list()
// Get a list of 'nearby' or 'connected' zlevels.
// You should at least return a list with the given z if nothing else.
/datum/map/proc/get_map_levels(var/srcz, var/long_range = FALSE, var/om_range = -1)
- //Overmap behavior
- if(use_overmap)
- //Get what sector we're in
- var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz)
- if(!istype(O))
- //Not in a sector, just the passed zlevel
- return list(srcz)
-
+ //Get what sector we're in
+ var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz)
+ if(istype(O))
//Just the sector we're in
if(om_range == -1)
return O.map_z.Copy()
@@ -239,7 +234,7 @@ var/list/all_maps = list()
connections += V.map_z // Adding list to list adds contents
return connections
- //Traditional behavior
+ //Traditional behavior, if not in an overmap sector
else
//If long range, and they're at least in contact levels, return contact levels.
if (long_range && (srcz in contact_levels))
diff --git a/sound/weapons/dodgeball.ogg b/sound/weapons/dodgeball.ogg
new file mode 100644
index 0000000000..3e76dcdfc8
Binary files /dev/null and b/sound/weapons/dodgeball.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index bea44f2300..8f6608b956 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -832,6 +832,7 @@
#include "code\game\machinery\air_alarm.dm"
#include "code\game\machinery\airconditioner_vr.dm"
#include "code\game\machinery\airconditioner_yw.dm"
+#include "code\game\machinery\atm_ret_field.dm"
#include "code\game\machinery\atmo_control.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\Beacon.dm"
@@ -1230,7 +1231,6 @@
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flash_vr.dm"
#include "code\game\objects\items\devices\flashlight.dm"
-#include "code\game\objects\items\devices\flashlight_vr.dm"
#include "code\game\objects\items\devices\floor_painter.dm"
#include "code\game\objects\items\devices\geiger.dm"
#include "code\game\objects\items\devices\gps.dm"
@@ -1497,6 +1497,7 @@
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
+#include "code\game\objects\items\weapons\tools\brass.dm"
#include "code\game\objects\items\weapons\tools\crowbar.dm"
#include "code\game\objects\items\weapons\tools\crowbar_vr.dm"
#include "code\game\objects\items\weapons\tools\screwdriver.dm"