[N.name], "
var/atom/disk_loc = N.loc
while(!isturf(disk_loc))
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 42d7643fb926..5fc667c4db4a 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -195,10 +195,10 @@
/obj/machinery/capture_the_flag/Initialize()
. = ..()
- GLOB.poi_list |= src
+ SSpoints_of_interest.make_point_of_interest(src)
/obj/machinery/capture_the_flag/Destroy()
- GLOB.poi_list.Remove(src)
+ SSpoints_of_interest.remove_point_of_interest(src)
return ..()
/obj/machinery/capture_the_flag/process()
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 0bf0b74c715a..26361b99cfc6 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -61,11 +61,11 @@
if(instant || (roundstart && (mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP))))
INVOKE_ASYNC(src, PROC_REF(create))
else if(ghost_usable)
- GLOB.poi_list |= src
+ SSpoints_of_interest.make_point_of_interest(src)
LAZYADD(GLOB.mob_spawners[name], src)
/obj/effect/mob_spawn/Destroy()
- GLOB.poi_list -= src
+ SSpoints_of_interest.remove_point_of_interest(src)
var/list/spawners = GLOB.mob_spawners[name]
LAZYREMOVE(spawners, src)
if(!LAZYLEN(spawners))
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
index 47f7fd884993..d5489edeb3e0 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
@@ -271,3 +271,25 @@
stock_min = 2
stock_max = 10
availability_prob = 10
+
+/datum/blackmarket_item/ammo/c38hotshot
+ name = ".38 Hearth Ammo Box"
+ desc = "We got our ship cook to marinade some .38 in some hearthwine we pocketed off some hunters. It'll cook your targets to a nice well done."
+ item = /obj/item/ammo_box/c38/hotshot
+
+ price_min = 300
+ price_max = 500
+ stock_min = 3
+ stock_max = 8
+ availability_prob = 50
+
+/datum/blackmarket_item/ammo/c38iceblox
+ name = ".38 Chilled Ammo Box"
+ desc = "One of our runners accidentally spilled some .38 into a fucking pristine icewine shipment. It'll freeze your targets faster than our runner froze solid outside for making a mess."
+ item = /obj/item/ammo_box/c38/iceblox
+
+ price_min = 300
+ price_max = 500
+ stock_min = 3
+ stock_max = 8
+ availability_prob = 50
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
index d049589fe40a..7a9803085ab8 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
@@ -264,7 +264,7 @@
price_min = 1500
price_max = 2500
- stock = 1
+ stock_max = 3
availability_prob = 30
/datum/blackmarket_item/clothing/frontiersmen_hardsuit
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
index cd0fcf9fd7a9..7da2610a9049 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
@@ -350,4 +350,12 @@
stock_max = 2
availability_prob = 20
+/datum/blackmarket_item/weapon/fireaxe
+ name = "Fire Axe"
+ desc = "An incredibly sharp axe of dubious make used by various engineers throughout the years to settle arguments while hammered. Sold to us by a very friendly man in a suit."
+ item = /obj/item/melee/axe/fire
+ price_min = 2500
+ price_max = 3500
+ stock = 2
+ availability_prob = 40
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index dfec659e1644..0b302925e10e 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -383,7 +383,7 @@
if (specificTarget)
specificTarget = null
return
- var/list/mobs = getpois()//code stolen from observer.dm
+ var/list/mobs = SSpoints_of_interest.get_mob_pois()
var/inputTarget = input("Select a mob! (Smiting does this automatically)", "Target", null, null) as null|anything in mobs
if (isnull(inputTarget))
return
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index 6fa0b54966c1..a7ab407b428e 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -72,6 +72,18 @@
cost = 500
contains = list(/obj/item/ammo_box/a12g/slug)
+/datum/supply_pack/ammo/blank_shells
+ name = "Blank Shell Crate"
+ desc = "Contains a box of blank shells."
+ cost = 500
+ contains = list(/obj/item/ammo_box/a12g/blanks)
+
+/datum/supply_pack/ammo/blank_ammo_disk
+ name = "Blank Ammo Design Disk Crate"
+ desc = "Run your own training drills!"
+ cost = 1000
+ contains = list(/obj/item/disk/design_disk/blanks)
+
/datum/supply_pack/ammo/techshells
name = "Unloaded Shotgun Technological Shells Crate"
desc = "Contains a box of 7 versatile tech shells, capable of producing a variety of deadly effects for any situation. Some assembly required."
diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm
index f2b9d0ec09a7..3eb7f33cbe4c 100644
--- a/code/modules/cargo/packs/food.dm
+++ b/code/modules/cargo/packs/food.dm
@@ -64,12 +64,12 @@
name = "Basic Ingredients Crate"
desc = "Get things cooking with this crate full of useful ingredients! Contains a dozen eggs, two slabs of meat, some flour, some rice, a bottle of milk, a bottle of soymilk, and a bag of sugar."
cost = 300
- contains = list(/obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/rice,
- /obj/item/reagent_containers/food/condiment/milk,
- /obj/item/reagent_containers/food/condiment/soymilk,
- /obj/item/reagent_containers/food/condiment/sugar,
+ contains = list(/obj/item/reagent_containers/condiment/flour,
+ /obj/item/reagent_containers/condiment/flour,
+ /obj/item/reagent_containers/condiment/rice,
+ /obj/item/reagent_containers/condiment/milk,
+ /obj/item/reagent_containers/condiment/soymilk,
+ /obj/item/reagent_containers/condiment/sugar,
/obj/item/storage/fancy/egg_box,
/obj/item/reagent_containers/food/snacks/meat/slab,
/obj/item/reagent_containers/food/snacks/meat/slab
@@ -81,13 +81,13 @@
name = "Condiments Crate"
desc = "A variety of garnishes for topping off your dish with a little extra pizzaz. Contains a bottle of enzyme, a salt shaker, a pepper mill, a bottle of ketchup, a bottle of hot sauce, a bottle of BBQ sauce, and a bottle of cream."
cost = 250
- contains = list(/obj/item/reagent_containers/food/condiment/enzyme,
- /obj/item/reagent_containers/food/condiment/saltshaker,
- /obj/item/reagent_containers/food/condiment/peppermill,
- /obj/item/reagent_containers/food/condiment/ketchup,
- /obj/item/reagent_containers/food/condiment/hotsauce,
+ contains = list(/obj/item/reagent_containers/condiment/enzyme,
+ /obj/item/reagent_containers/condiment/saltshaker,
+ /obj/item/reagent_containers/condiment/peppermill,
+ /obj/item/reagent_containers/condiment/ketchup,
+ /obj/item/reagent_containers/condiment/hotsauce,
/obj/item/reagent_containers/food/drinks/bottle/cream,
- /obj/item/reagent_containers/food/condiment/bbqsauce
+ /obj/item/reagent_containers/condiment/bbqsauce
)
crate_name = "condiments crate"
crate_type = /obj/structure/closet/crate/freezer
diff --git a/code/modules/cargo/packs/mechs.dm b/code/modules/cargo/packs/mechs.dm
index 7790e696ee15..744e9f67e2f2 100644
--- a/code/modules/cargo/packs/mechs.dm
+++ b/code/modules/cargo/packs/mechs.dm
@@ -220,6 +220,15 @@ Mech Equipment
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
)
+/datum/supply_pack/mech/equipment/recharger
+ name = "Exosuit Recharger kit"
+ desc = "Two boards for an exosuit recharger and recharger console. For the stylish exosuit bay."
+ cost = 400
+ contains = list(
+ /obj/item/circuitboard/computer/mech_bay_power_console,
+ /obj/item/circuitboard/machine/mech_recharger
+ )
+
/*
weapons
*/
diff --git a/code/modules/cargo/packs/tools.dm b/code/modules/cargo/packs/tools.dm
index 25ed4aaab554..e4081a448e0b 100644
--- a/code/modules/cargo/packs/tools.dm
+++ b/code/modules/cargo/packs/tools.dm
@@ -146,3 +146,14 @@
contains = list(/obj/structure/reagent_dispensers/foamtank)
crate_name = "foam tank crate"
crate_type = /obj/structure/closet/crate/large
+
+/datum/supply_pack/tools/radfoamtank
+ name = "Radiation Foam Tank Crate"
+ desc = "Contains a tank of anti-radiation foam. Pressurized sprayer included!"
+ cost = 1500
+ contains = list(
+ /obj/item/watertank/anti_rad,
+ /obj/structure/reagent_dispensers/foamtank/antirad
+ )
+ crate_name = "foam tank crate"
+ crate_type = /obj/structure/closet/crate/large
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index e292a6e61d03..aaba1d8054cf 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -495,7 +495,7 @@
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/lp
alt_uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/skirt/lp
- dcoat = /obj/item/clothing/suit/jacket
+ dcoat = /obj/item/clothing/suit/armor/nanotrasen/sec_director
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/command
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index d1ee50d1a629..0d05c4e0cf7f 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -137,6 +137,7 @@
icon_state = "bronze"
custom_materials = list(/datum/material/iron=1000)
resistance_flags = FIRE_PROOF
+ attachment_slot = null
var/medaltype = "medal" //Sprite used for medalbox
var/commended = FALSE
@@ -409,6 +410,7 @@
icon_state = "holster"
item_state = "holster"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/holster
+ attachment_slot = null
/obj/item/clothing/accessory/holster/detective
name = "detective's shoulder holster"
@@ -477,7 +479,7 @@
icon_state = "rilena_pin"
above_suit = FALSE
minimize_when_attached = TRUE
- attachment_slot = CHEST
+ attachment_slot = null
/obj/item/clothing/accessory/rilena_pin/on_uniform_equip(obj/item/clothing/under/U, user)
var/mob/living/L = user
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index adde1124935f..4ba2d878ad46 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -62,7 +62,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
z_original = z
destination = end
special_target = aimed_at
- GLOB.poi_list += src
+ SSpoints_of_interest.make_point_of_interest(src)
var/special_target_valid = FALSE
if(special_target)
@@ -81,7 +81,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
ghost.ManualFollow(src)
/obj/effect/immovablerod/Destroy()
- GLOB.poi_list -= src
+ SSpoints_of_interest.remove_point_of_interest(src)
. = ..()
/obj/effect/immovablerod/Moved()
diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm
index 890bbc0f1f2b..8e4baab893fc 100644
--- a/code/modules/events/wizard/greentext.dm
+++ b/code/modules/events/wizard/greentext.dm
@@ -34,7 +34,7 @@
/obj/item/greentext/Initialize(mapload)
. = ..()
- GLOB.poi_list |= src
+ SSpoints_of_interest.make_point_of_interest(src)
roundend_callback = CALLBACK(src, PROC_REF(check_winner))
SSticker.OnRoundend(roundend_callback)
@@ -83,7 +83,7 @@
if(!(resistance_flags & ON_FIRE) && !force)
return QDEL_HINT_LETMELIVE
- GLOB.poi_list.Remove(src)
+ SSpoints_of_interest.remove_point_of_interest(src)
LAZYREMOVE(SSticker.round_end_events, roundend_callback)
roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling
for(var/i in GLOB.player_list)
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index 0adf98ba5666..bd24a21d1a16 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -5,7 +5,7 @@
// to mixed-drinks code. If you want an object that starts pre-loaded, you need to make it in addition to the other code.
//Food items that aren't eaten normally and leave an empty container behind.
-/obj/item/reagent_containers/food/condiment
+/obj/item/reagent_containers/condiment
name = "condiment bottle"
desc = "Just your average condiment bottle."
icon = 'icons/obj/food/containers.dmi'
@@ -36,23 +36,25 @@
var/icon_empty = ""
fill_icon_thresholds = list(0, 10, 25, 50, 75, 100)
-/obj/item/reagent_containers/food/condiment/Initialize()
+/obj/item/reagent_containers/condiment/Initialize()
. = ..()
possible_states = typelist("possible_states", possible_states)
update_appearance()
-/obj/item/reagent_containers/food/condiment/update_icon()
+/obj/item/reagent_containers/condiment/update_icon()
cut_overlays()
if(reagents.reagent_list.len > 0 && possible_states.len)
- var/main_reagent = reagents.get_master_reagent_id()
- if(main_reagent in possible_states)
- icon_state = possible_states[main_reagent]["icon_state"]
- item_state = possible_states[main_reagent]["item_state"]
- icon_empty = possible_states[main_reagent]["icon_empty"]
- name = possible_states[main_reagent]["name"]
- desc = possible_states[main_reagent]["desc"]
+
+ var/datum/reagent/main_reagent_ref = reagents.get_master_reagent()
+ var/main_reagent_id = main_reagent_ref.type
+ if(main_reagent_id in possible_states)
+ icon_state = possible_states[main_reagent_id]["icon_state"]
+ item_state = possible_states[main_reagent_id]["item_state"]
+ icon_empty = possible_states[main_reagent_id]["icon_empty"]
+ name = possible_states[main_reagent_id]["name"]
+ desc = possible_states[main_reagent_id]["desc"]
return ..(TRUE) // Don't fill normally
else
name = "condiment bottle"
@@ -64,7 +66,7 @@
. = ..()
-/obj/item/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone)
+/obj/item/reagent_containers/condiment/attack(mob/M, mob/user, def_zone)
if(!reagents || !reagents.total_volume)
to_chat(user, "None of [src] left, oh no!")
@@ -90,7 +92,7 @@
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
return 1
-/obj/item/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity)
+/obj/item/reagent_containers/condiment/afterattack(obj/target, mob/user , proximity)
. = ..()
if(!proximity)
return
@@ -119,23 +121,23 @@
to_chat(user, "You transfer [trans] units of the condiment to [target].")
playsound(src, 'sound/items/glass_transfer.ogg', 50, 1)
-/obj/item/reagent_containers/food/condiment/on_reagent_change(changetype)
+/obj/item/reagent_containers/condiment/on_reagent_change(changetype)
update_appearance()
-/obj/item/reagent_containers/food/condiment/enzyme
+/obj/item/reagent_containers/condiment/enzyme
name = "universal enzyme"
desc = "Used in cooking various dishes."
icon_state = "enzyme"
list_reagents = list(/datum/reagent/consumable/enzyme = 50)
-/obj/item/reagent_containers/food/condiment/sugar
+/obj/item/reagent_containers/condiment/sugar
name = "sugar sack"
desc = "Tasty spacey sugar!"
icon_state = "sugar"
item_state = "flour"
list_reagents = list(/datum/reagent/consumable/sugar = 50)
-/obj/item/reagent_containers/food/condiment/saltshaker //Separate from above since it's a small shaker rather then
+/obj/item/reagent_containers/condiment/saltshaker //Separate from above since it's a small shaker rather then
name = "salt shaker" // a large one.
desc = "Salt. From space oceans, presumably."
icon_state = "saltshakersmall"
@@ -145,7 +147,7 @@
volume = 20
list_reagents = list(/datum/reagent/consumable/sodiumchloride = 20)
-/obj/item/reagent_containers/food/condiment/saltshaker/afterattack(obj/target, mob/living/user, proximity)
+/obj/item/reagent_containers/condiment/saltshaker/afterattack(obj/target, mob/living/user, proximity)
. = ..()
if(!proximity)
return
@@ -158,7 +160,7 @@
new/obj/effect/decal/cleanable/food/salt(target)
return
-/obj/item/reagent_containers/food/condiment/peppermill
+/obj/item/reagent_containers/condiment/peppermill
name = "pepper mill"
desc = "Often used to flavor food or make people sneeze."
icon_state = "peppermillsmall"
@@ -168,7 +170,7 @@
volume = 20
list_reagents = list(/datum/reagent/consumable/blackpepper = 20)
-/obj/item/reagent_containers/food/condiment/milk
+/obj/item/reagent_containers/condiment/milk
name = "space milk"
desc = "It's milk. White and nutritious goodness!"
icon_state = "milk"
@@ -177,14 +179,14 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
list_reagents = list(/datum/reagent/consumable/milk = 50)
-/obj/item/reagent_containers/food/condiment/flour
+/obj/item/reagent_containers/condiment/flour
name = "flour sack"
desc = "A big bag of flour. Good for baking!"
icon_state = "flour"
item_state = "flour"
list_reagents = list(/datum/reagent/consumable/flour = 30)
-/obj/item/reagent_containers/food/condiment/soymilk
+/obj/item/reagent_containers/condiment/soymilk
name = "soy milk"
desc = "It's soy milk. White and nutritious goodness!"
icon_state = "soymilk"
@@ -193,20 +195,20 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
list_reagents = list(/datum/reagent/consumable/soymilk = 50)
-/obj/item/reagent_containers/food/condiment/rice
+/obj/item/reagent_containers/condiment/rice
name = "rice sack"
desc = "A big bag of rice. Good for cooking!"
icon_state = "rice"
item_state = "flour"
list_reagents = list(/datum/reagent/consumable/rice = 30)
-/obj/item/reagent_containers/food/condiment/soysauce
+/obj/item/reagent_containers/condiment/soysauce
name = "soy sauce"
desc = "A salty soy-based flavoring."
icon_state = "soysauce"
list_reagents = list(/datum/reagent/consumable/soysauce = 50)
-/obj/item/reagent_containers/food/condiment/mayonnaise
+/obj/item/reagent_containers/condiment/mayonnaise
name = "mayonnaise"
desc = "An oily condiment made from egg yolks."
icon_state = "mayonnaise"
@@ -214,7 +216,7 @@
//Food packs. To easily apply deadly toxi... delicious sauces to your food!
-/obj/item/reagent_containers/food/condiment/pack
+/obj/item/reagent_containers/condiment/pack
name = "condiment pack"
desc = "A small plastic pack with condiments to put on your food."
icon_state = "condi_empty"
@@ -234,14 +236,19 @@
/datum/reagent/consumable/bbqsauce = list("condi_bbq", "BBQ sauce", "Hand wipes not included."),
)
-/obj/item/reagent_containers/food/condiment/pack/update_icon()
+/obj/item/reagent_containers/condiment/pack/create_reagents(max_vol, flags)
+ . = ..()
+ RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_add), TRUE)
+ RegisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_del), TRUE)
+
+/obj/item/reagent_containers/condiment/pack/update_icon()
SHOULD_CALL_PARENT(FALSE)
- return ..()
+ return
-/obj/item/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
+/obj/item/reagent_containers/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
return
-/obj/item/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity)
+/obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity)
. = ..()
if(!proximity)
return
@@ -257,67 +264,74 @@
src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user)
qdel(src)
-/obj/item/reagent_containers/food/condiment/pack/on_reagent_change(changetype)
- if(reagents.reagent_list.len > 0)
- var/main_reagent = reagents.get_master_reagent_id()
- if(main_reagent in possible_states)
- var/list/temp_list = possible_states[main_reagent]
- icon_state = temp_list[1]
- desc = temp_list[3]
- else
- icon_state = "condi_mixed"
- desc = "A small condiment pack. The label says it contains [originalname]"
+/// Handles reagents getting added to the condiment pack.
+/obj/item/reagent_containers/condiment/pack/proc/on_reagent_add(datum/reagents/reagents)
+ SIGNAL_HANDLER
+
+ var/datum/reagent/main_reagent = reagents.get_master_reagent()
+
+ var/main_reagent_type = main_reagent?.type
+ if(main_reagent_type in possible_states)
+ var/list/temp_list = possible_states[main_reagent_type]
+ icon_state = temp_list[1]
+ desc = temp_list[3]
else
- icon_state = "condi_empty"
- desc = "A small condiment pack. It is empty."
+ icon_state = "condi_mixed"
+ desc = "A small condiment pack. The label says it contains [originalname]"
+
+/// Handles reagents getting removed from the condiment pack.
+/obj/item/reagent_containers/condiment/pack/proc/on_reagent_del(datum/reagents/reagents)
+ SIGNAL_HANDLER
+ icon_state = "condi_empty"
+ desc = "A small condiment pack. It is empty."
//Ketchup
-/obj/item/reagent_containers/food/condiment/pack/ketchup
+/obj/item/reagent_containers/condiment/pack/ketchup
name = "ketchup pack"
originalname = "ketchup"
list_reagents = list(/datum/reagent/consumable/ketchup = 10)
//Hot sauce
-/obj/item/reagent_containers/food/condiment/pack/hotsauce
+/obj/item/reagent_containers/condiment/pack/hotsauce
name = "hotsauce pack"
originalname = "hotsauce"
list_reagents = list(/datum/reagent/consumable/capsaicin = 10)
-/obj/item/reagent_containers/food/condiment/pack/astrotame
+/obj/item/reagent_containers/condiment/pack/astrotame
name = "astrotame pack"
originalname = "astrotame"
list_reagents = list(/datum/reagent/consumable/astrotame = 5)
-/obj/item/reagent_containers/food/condiment/pack/bbqsauce
+/obj/item/reagent_containers/condiment/pack/bbqsauce
name = "bbq sauce pack"
originalname = "bbq sauce"
list_reagents = list(/datum/reagent/consumable/bbqsauce = 10)
-/obj/item/reagent_containers/food/condiment/ketchup
+/obj/item/reagent_containers/condiment/ketchup
name = "ketchup bottle"
desc = "You feel more american already"
icon_state = "ketchup"
list_reagents = list(/datum/reagent/consumable/ketchup = 50)
-/obj/item/reagent_containers/food/condiment/bbqsauce
+/obj/item/reagent_containers/condiment/bbqsauce
name = "bbq sauce bottle"
desc = "Hand wipes not included"
icon_state = "bbqsauce"
list_reagents = list(/datum/reagent/consumable/bbqsauce = 50)
-/obj/item/reagent_containers/food/condiment/hotsauce
+/obj/item/reagent_containers/condiment/hotsauce
name = "hot sauce bottle"
desc = "You can almost TASTE the stomach ulcers now!"
icon_state = "hotsauce"
list_reagents = list(/datum/reagent/consumable/capsaicin = 50)
-/obj/item/reagent_containers/food/condiment/coldsauce
+/obj/item/reagent_containers/condiment/coldsauce
name = "cold sauce bottle"
desc = "Leaves the tounge numb in it's passage"
icon_state = "coldsauce"
list_reagents = list(/datum/reagent/consumable/frostoil = 50)
-/obj/item/reagent_containers/food/condiment/oliveoil
+/obj/item/reagent_containers/condiment/oliveoil
name = "olive oil bottle"
desc = "A delicious oil used in cooking"
icon_state = "oliveoil"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 62e6a4075a93..bcee075e0dcd 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -44,7 +44,7 @@
/obj/item/weldingtool,
/obj/item/reagent_containers/glass,
/obj/item/reagent_containers/syringe,
- /obj/item/reagent_containers/food/condiment,
+ /obj/item/reagent_containers/condiment,
/obj/item/storage,
/obj/item/smallDelivery,
)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 5852ea34742b..9a6b10e0444b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -366,7 +366,7 @@
/obj/machinery/smartfridge/drinks/accept_check(obj/item/O)
if(!istype(O, /obj/item/reagent_containers) || (O.item_flags & ABSTRACT) || !O.reagents || !O.reagents.reagent_list.len)
return FALSE
- if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food/drinks) || istype(O, /obj/item/reagent_containers/food/condiment))
+ if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food/drinks) || istype(O, /obj/item/reagent_containers/condiment))
return TRUE
// ----------------------------
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 3e0bed238bec..05e81421ac4f 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -8,7 +8,7 @@
name = "proto-magnetic crusher"
desc = "A multipurpose disembarkation and self-defense tool designed by EXOCOM using an incomplete Nanotrasen prototype. \
Found in the grime-stained hands of wannabee explorers across the frontier, it cuts rock and hews flora using magnetic osscilation and a heavy cleaving edge."
- force = 0 //You can't hit stuff unless wielded
+ force = 0 //You can't hit stuff unless it's wielded
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
throwforce = 5
@@ -28,33 +28,19 @@
var/charge_time = 15
var/detonation_damage = 20
var/backstab_bonus = 10
- var/wielded = FALSE // track wielded status on item
-
-/obj/item/kinetic_crusher/Initialize()
- . = ..()
- RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
- RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
/obj/item/kinetic_crusher/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15)
-/// triggered on wield of two handed item
-/obj/item/kinetic_crusher/proc/on_wield(obj/item/source, mob/user)
- wielded = TRUE
-
-/// triggered on unwield of two handed item
-/obj/item/kinetic_crusher/proc/on_unwield(obj/item/source, mob/user)
- wielded = FALSE
-
/obj/item/kinetic_crusher/examine(mob/living/user)
. = ..()
. += "Induce magnetism in an enemy by striking them with a magnetospheric wave, then hit them in melee to force a waveform collapse for [force + detonation_damage] damage."
. += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]."
/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user, "[src] is too heavy to use with one hand! You fumble and drop everything.")
user.drop_all_held_items()
return
@@ -66,7 +52,7 @@
/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
. = ..()
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
return
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = user.loc
@@ -118,7 +104,7 @@
/obj/item/kinetic_crusher/update_icon_state()
- item_state = "crusher[wielded]" // this is not icon_state and not supported by 2hcomponent
+ item_state = "crusher[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent
return ..()
/obj/item/kinetic_crusher/update_overlays()
@@ -182,7 +168,7 @@
user.changeNext_move(CLICK_CD_MELEE * 2.0)//...slow swinga.
/obj/item/kinetic_crusher/old/update_icon_state()
- item_state = "crusherold[wielded]" // still not supported by 2hcomponent
+ item_state = "crusherold[HAS_TRAIT(src, TRAIT_WIELDED)]" // still not supported by 2hcomponent
return ..()
//100% original syndicate oc, plz do not steal. More effective against human targets then the typical crusher, with a bit of block chance.
@@ -195,7 +181,7 @@
name = "magnetic cleaver"
desc = "Designed by Syndicate Research and Development for their resource-gathering operations on hostile worlds. Syndicate Legal Ops would like to stress that you've never seen anything like this before. Ever."
armour_penetration = 69//nice cut
- force = 0 //You can't hit stuff unless wielded
+ force = 0 //You can't hit stuff unless HAS_TRAIT(src, TRAIT_WIELDED)
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
throwforce = 5
@@ -216,35 +202,40 @@
charge_time = 15
detonation_damage = 35
backstab_bonus = 15
- wielded = FALSE // track wielded status on item
actions_types = list()
+
+/obj/item/kinetic_crusher/syndie_crusher/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
+
/obj/item/kinetic_crusher/syndie_crusher/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 150)
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=10)
/// triggered on wield of two handed item
-/obj/item/kinetic_crusher/syndie_crusher/on_wield(obj/item/source, mob/user)
- . = ..()
- wielded = TRUE
+/obj/item/kinetic_crusher/syndie_crusher/proc/on_wield(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+
icon_state = "crushersyndie1"
playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE)
- set_light_on(wielded)
+ set_light_on(HAS_TRAIT(src, TRAIT_WIELDED))
/// triggered on unwield of two handed item
-/obj/item/kinetic_crusher/syndie_crusher/on_unwield(obj/item/source, mob/user)
- . = ..()
- wielded = FALSE
+/obj/item/kinetic_crusher/syndie_crusher/proc/on_unwield(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+
icon_state = "crushersyndie"
playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE)
- set_light_on(wielded)
+ set_light_on(HAS_TRAIT(src, TRAIT_WIELDED))
/obj/item/kinetic_crusher/syndie_crusher/update_icon_state()
- item_state = "crushersyndie[wielded]" // this is not icon_state and not supported by 2hcomponent
+ item_state = "crushersyndie[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent
return ..()
/obj/item/kinetic_crusher/syndie_crusher/update_overlays()
. = ..()
- if(wielded)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
. += "[icon_state]_lit"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 52d910e8a732..8807aa5872b7 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -150,34 +150,6 @@
if(28)
new /obj/item/clothing/suit/armor/ascetic(src)
-//KA modkit design discs
-/obj/item/disk/design_disk/modkit_disc
- name = "KA Mod Disk"
- desc = "A design disc containing the design for a unique kinetic accelerator modkit. It's compatible with a research console."
- illustration = "accel"
- color = "#6F6F6F"
- var/modkit_design = /datum/design/unique_modkit
-
-/obj/item/disk/design_disk/modkit_disc/Initialize()
- . = ..()
- blueprints[1] = new modkit_design
-
-/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe
- name = "Offensive Mining Explosion Mod Disk"
- modkit_design = /datum/design/unique_modkit/offensive_turf_aoe
-
-/obj/item/disk/design_disk/modkit_disc/rapid_repeater
- name = "Rapid Repeater Mod Disk"
- modkit_design = /datum/design/unique_modkit/rapid_repeater
-
-/obj/item/disk/design_disk/modkit_disc/resonator_blast
- name = "Resonator Blast Mod Disk"
- modkit_design = /datum/design/unique_modkit/resonator_blast
-
-/obj/item/disk/design_disk/modkit_disc/bounty
- name = "Death Syphon Mod Disk"
- modkit_design = /datum/design/unique_modkit/bounty
-
/datum/design/unique_modkit
category = list("Mining Designs", "Cyborg Upgrade Modules") //can't be normally obtained
build_type = PROTOLATHE | MECHFAB
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 8fbf9c32a38e..2dbbd9d4b65b 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -35,6 +35,7 @@
. = ..()
GLOB.new_player_list += src
+ SSpoints_of_interest.make_point_of_interest(src)
/mob/dead/new_player/Destroy()
GLOB.new_player_list -= src
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index c15c4a1af835..0fcfa5c13940 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -62,6 +62,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/datum/orbit_menu/orbit_menu
var/datum/spawners_menu/spawners_menu
+ // The POI we're orbiting (orbit menu)
+ var/orbiting_ref
+
/mob/dead/observer/Initialize()
set_invisibility(GLOB.observer_default_invisibility)
@@ -142,6 +145,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
. = ..()
+ SSpoints_of_interest.make_point_of_interest(src)
+
grant_all_languages()
show_data_huds()
data_huds_on = 1
@@ -499,7 +504,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/list/dest = list() //List of possible destinations (mobs)
var/target = null //Chosen target.
- dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list
+ dest += SSpoints_of_interest.get_mob_pois()
target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest
if (!target)//Make sure we actually have a target
@@ -839,20 +844,24 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/reset_perspective(atom/A)
if(client)
if(ismob(client.eye) && (client.eye != src))
- var/mob/target = client.eye
- observetarget = null
- if(target.observers)
- LAZYREMOVE(target.observers, src)
+ cleanup_observe()
if(..())
if(hud_used)
client.screen = list()
hud_used.show_hud(hud_used.hud_version)
+/mob/dead/observer/proc/cleanup_observe()
+ var/mob/target = client.eye
+ observetarget = null
+ client?.perspective = initial(client.perspective)
+ if(target.observers)
+ LAZYREMOVE(target.observers, src)
+
/mob/dead/observer/verb/observe()
set name = "Observe"
set category = "Ghost"
- var/list/creatures = getpois()
+ var/list/creatures = SSpoints_of_interest.get_mob_pois()
reset_perspective(null)
diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm
index 86d54577538c..051faa5bedac 100644
--- a/code/modules/mob/dead/observer/orbit.dm
+++ b/code/modules/mob/dead/observer/orbit.dm
@@ -1,6 +1,9 @@
/datum/orbit_menu
+ ///mobs worth orbiting. Because spaghetti, all mobs have the point of interest, but only some are allowed to actually show up.
+ ///this obviously should be changed in the future, so we only add mobs as POI if they actually are interesting, and we don't use
+ ///a typecache.
+ var/static/list/mob_allowed_typecache
var/mob/dead/observer/owner
- var/auto_observe = FALSE
/datum/orbit_menu/New(mob/dead/observer/new_owner)
if(!istype(new_owner))
@@ -23,87 +26,243 @@
switch(action)
if ("orbit")
var/ref = params["ref"]
- var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
- if (poi == null)
- . = TRUE
- return
+ var/auto_observe = params["auto_observe"]
+ var/atom/movable/poi = SSpoints_of_interest.get_poi_atom_by_ref(ref)
+
+ if((ismob(poi) && !SSpoints_of_interest.is_valid_poi(poi, CALLBACK(src, PROC_REF(validate_mob_poi)))) \
+ || !SSpoints_of_interest.is_valid_poi(poi)
+ )
+ to_chat(usr, span_notice("That point of interest is no longer valid."))
+ return TRUE
+
+ var/mob/dead/observer/user = usr
owner.ManualFollow(poi)
owner.reset_perspective(null)
+ user.orbiting_ref = ref
if (auto_observe)
owner.do_observe(poi)
. = TRUE
if ("refresh")
update_static_data(owner, ui)
. = TRUE
- if ("toggle_observe")
- auto_observe = !auto_observe
- if (auto_observe && owner.orbit_target)
- owner.do_observe(owner.orbit_target)
- else
- owner.reset_perspective(null)
+
/datum/orbit_menu/ui_data(mob/user)
var/list/data = list()
- data["auto_observe"] = auto_observe
+
+ if(isobserver(user))
+ data["orbiting"] = get_currently_orbiting(user)
+
return data
/datum/orbit_menu/ui_static_data(mob/user)
- var/list/data = list()
+ var/list/new_mob_pois = SSpoints_of_interest.get_mob_pois(CALLBACK(src, PROC_REF(validate_mob_poi)), append_dead_role = FALSE)
+ var/list/new_other_pois = SSpoints_of_interest.get_other_pois()
var/list/alive = list()
var/list/antagonists = list()
+ var/list/critical = list()
var/list/dead = list()
var/list/ghosts = list()
var/list/misc = list()
var/list/npcs = list()
+ var/list/ships = list()
- var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE)
- for (var/name in pois)
+ for(var/name in new_mob_pois)
var/list/serialized = list()
- serialized["name"] = name
-
- var/poi = pois[name]
-
- serialized["ref"] = REF(poi)
-
- var/mob/M = poi
- if (istype(M))
- if (isobserver(M))
- ghosts += list(serialized)
- else if (M.stat == DEAD)
- dead += list(serialized)
- else if (M.mind == null)
- npcs += list(serialized)
- else
- var/number_of_orbiters = M.orbiters?.orbiters?.len
- if (number_of_orbiters)
- serialized["orbiters"] = number_of_orbiters
-
- var/datum/mind/mind = M.mind
- var/was_antagonist = FALSE
-
- for (var/_A in mind.antag_datums)
- var/datum/antagonist/A = _A
- if (A.show_to_ghosts)
- was_antagonist = TRUE
- serialized["antag"] = A.name
- antagonists += list(serialized)
- break
-
- if (!was_antagonist)
- alive += list(serialized)
+ var/mob/mob_poi = new_mob_pois[name]
+ var/number_of_orbiters = length(mob_poi.get_all_orbiters())
+
+ if(isnewplayer(mob_poi))
+ continue
+
+ serialized["ref"] = REF(mob_poi)
+ serialized["full_name"] = mob_poi.name
+ serialized["job"] = mob_poi.job
+ if(number_of_orbiters)
+ serialized["orbiters"] = number_of_orbiters
+
+ if(isobserver(mob_poi))
+ ghosts += list(serialized)
+ continue
+
+ if(mob_poi.stat == DEAD)
+ dead += list(serialized)
+ continue
+
+ if(isnull(mob_poi.mind))
+ if(isliving(mob_poi))
+ var/mob/living/npc = mob_poi
+ serialized["health"] = FLOOR((npc.health / npc.maxHealth * 100), 1)
+
+ npcs += list(serialized)
+ continue
+
+ serialized["client"] = !!mob_poi.client
+ serialized["name"] = mob_poi.real_name
+
+ if(isliving(mob_poi))
+ serialized += get_living_data(mob_poi)
+
+ var/list/antag_data = get_antag_data(mob_poi.mind)
+ if(length(antag_data))
+ serialized += antag_data
+ antagonists += list(serialized)
+ continue
+
+ alive += list(serialized)
+
+ for(var/name in new_other_pois)
+ var/atom/atom_poi = new_other_pois[name]
+
+ var/list/other_data = get_misc_data(atom_poi)
+ var/misc_data = list(other_data[1])
+
+ if(istype(atom_poi, /obj/machinery/computer/helm))
+ ships += misc_data
else
- misc += list(serialized)
-
- data["alive"] = alive
- data["antagonists"] = antagonists
- data["dead"] = dead
- data["ghosts"] = ghosts
- data["misc"] = misc
- data["npcs"] = npcs
- return data
+ misc += misc_data
+
+ if(other_data[2]) // Critical = TRUE
+ critical += misc_data
+
+ return list(
+ "alive" = alive,
+ "antagonists" = antagonists,
+ "critical" = critical,
+ "dead" = dead,
+ "ghosts" = ghosts,
+ "misc" = misc,
+ "npcs" = npcs,
+ "ships" = ships,
+ )
/datum/orbit_menu/ui_assets()
. = ..() || list()
. += get_asset_datum(/datum/asset/simple/orbit)
+/// Helper function to get threat type, group, overrides for job and icon
+/datum/orbit_menu/proc/get_antag_data(datum/mind/poi_mind) as /list
+ var/list/serialized = list()
+
+ for(var/datum/antagonist/antag as anything in poi_mind.antag_datums)
+ if(!antag.show_to_ghosts)
+ continue
+
+ serialized["antag"] = antag.name
+ serialized["antag_group"] = antag.antagpanel_category
+ serialized["job"] = antag.name
+ serialized["icon"] = antag.antag_hud_name
+
+ return serialized
+
+/// Helper to get the current thing we're orbiting (if any)
+/datum/orbit_menu/proc/get_currently_orbiting(mob/dead/observer/user)
+ if(isnull(user.orbiting_ref))
+ return
+
+ var/atom/poi = SSpoints_of_interest.get_poi_atom_by_ref(user.orbiting_ref)
+ if(isnull(poi))
+ user.orbiting_ref = null
+ return
+
+ if((ismob(poi) && !SSpoints_of_interest.is_valid_poi(poi, CALLBACK(src, PROC_REF(validate_mob_poi)))) \
+ || !SSpoints_of_interest.is_valid_poi(poi)
+ )
+ user.orbiting_ref = null
+ return
+
+ var/list/serialized = list()
+
+ if(!ismob(poi))
+ var/list/misc_info = get_misc_data(poi)
+ serialized += misc_info[1]
+ return serialized
+
+ var/mob/mob_poi = poi
+ serialized["full_name"] = mob_poi.name
+ serialized["ref"] = REF(poi)
+
+ if(mob_poi.mind)
+ serialized["client"] = !!mob_poi.client
+ serialized["name"] = mob_poi.real_name
+
+ if(isliving(mob_poi))
+ serialized += get_living_data(mob_poi)
+
+ return serialized
+
+/// Helper function to get job / icon / health data for a living mob
+/datum/orbit_menu/proc/get_living_data(mob/living/player) as /list
+ var/list/serialized = list()
+
+ serialized["health"] = FLOOR((player.health / player.maxHealth * 100), 1)
+
+ return serialized
+
+
+/// Gets a list: Misc data and whether it's critical. Handles all snowflakey type cases
+/datum/orbit_menu/proc/get_misc_data(atom/movable/atom_poi) as /list
+ var/list/misc = list()
+ var/critical = FALSE
+
+ misc["ref"] = REF(atom_poi)
+ misc["full_name"] = atom_poi.name
+
+ // Display the nuke timer
+ if(istype(atom_poi, /obj/machinery/nuclearbomb))
+ var/obj/machinery/nuclearbomb/bomb = atom_poi
+
+ if(bomb.timing)
+ misc["extra"] = "Timer: [bomb.countdown?.displayed_text]s"
+ critical = TRUE
+
+ return list(misc, critical)
+
+ // Display the holder if its a nuke disk
+ if(istype(atom_poi, /obj/item/disk/nuclear))
+ var/obj/item/disk/nuclear/disk = atom_poi
+ var/mob/holder = disk.pulledby || get(disk, /mob)
+ misc["extra"] = "Location: [holder?.real_name || "Unsecured"]"
+
+ return list(misc, critical)
+
+ // Display singuloths if they exist
+ if(istype(atom_poi, /obj/singularity))
+ var/obj/singularity/singulo = atom_poi
+ misc["extra"] = "Energy: [round(singulo.energy)]"
+
+ if(singulo.current_size > 2)
+ critical = TRUE
+
+ return list(misc, critical)
+
+ if(istype(atom_poi, /obj/machinery/computer/helm))
+ var/obj/machinery/computer/helm/helm_poi = atom_poi
+ if(helm_poi.current_ship)
+ misc["extra"] = "Ship: [helm_poi.current_ship.name]"
+
+ return list(misc, critical)
+
+ return list(misc, critical)
+
+/**
+ * Helper POI validation function passed as a callback to various SSpoints_of_interest procs.
+ *
+ * Provides extended validation above and beyond standard, limiting mob POIs without minds or ckeys
+ * unless they're mobs, camera mobs or megafauna. Also allows exceptions for mobs that are deadchat controlled.
+ *
+ * If they satisfy that requirement, falls back to default validation for the POI.
+ */
+/datum/orbit_menu/proc/validate_mob_poi(datum/point_of_interest/mob_poi/potential_poi)
+ var/mob/potential_mob_poi = potential_poi.target
+ if(!potential_mob_poi.mind && !potential_mob_poi.ckey)
+ if(!mob_allowed_typecache)
+ mob_allowed_typecache = typecacheof(list(
+ /mob/living/simple_animal/hostile/megafauna,
+ /mob/living/simple_animal/hostile/boss
+ ))
+ if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache) && !potential_mob_poi.GetComponent(/datum/component/deadchat_control))
+ return FALSE
+
+ return potential_poi.validate()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 1258df8b84c5..6046cfe82b63 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -9,6 +9,7 @@
diag_hud.add_to_hud(src)
faction += "[REF(src)]"
GLOB.mob_living_list += src
+ SSpoints_of_interest.make_point_of_interest(src)
if(speed)
update_living_varspeed()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 2d1430296fe7..9e2a0bd9aaca 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -782,7 +782,7 @@
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/reagent_containers/glass/beaker/large, //I know a shaker is more appropiate but this is for ease of identification
- /obj/item/reagent_containers/food/condiment/enzyme,
+ /obj/item/reagent_containers/condiment/enzyme,
/obj/item/pen,
/obj/item/toy/crayon/spraycan/borg,
/obj/item/extinguisher/mini,
@@ -806,7 +806,7 @@
/obj/item/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
- var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules
+ var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/condiment/enzyme) in basic_modules
if(O)
O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
index e0537594c8ff..76dc1f095009 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm
@@ -30,11 +30,6 @@
var/area/A = get_area(src)
if(A)
notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE)
- GLOB.poi_list |= src
-
-/obj/effect/mob_spawn/drone/Destroy()
- GLOB.poi_list -= src
- . = ..()
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/mob_spawn/drone/attack_ghost(mob/user)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 863abf56dad1..ff06df9c6113 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -607,12 +607,12 @@ GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box)
var/ready_to_deploy = FALSE
/obj/machinery/anomalous_crystal/helpers/Destroy()
- GLOB.poi_list -= src
+ SSpoints_of_interest.remove_point_of_interest(src)
. = ..()
/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method)
if(..() && !ready_to_deploy)
- GLOB.poi_list |= src
+ SSpoints_of_interest.make_point_of_interest(src)
ready_to_deploy = TRUE
notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK, header = "Anomalous crystal activated")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index b7ca291a5be4..bd9133ffce20 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -297,6 +297,8 @@
/// track our timers and reagents
/obj/item/organ/legion_skull/proc/skull_check()
+ if(!owner)
+ return
if(!malignance)
malignance = new()
malignance.infect(owner, FALSE)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index b1788a7aa50d..a05c2e65688e 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -462,7 +462,7 @@
else
client.perspective = EYE_PERSPECTIVE
client.eye = loc
- return 1
+ return TRUE
/// Show the mob's inventory to another mob
/mob/proc/show_inv(mob/user)
diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm
index d082503a012d..06324b8f8b78 100644
--- a/code/modules/modular_computers/file_system/programs/radar.dm
+++ b/code/modules/modular_computers/file_system/programs/radar.dm
@@ -156,7 +156,7 @@
*something like "mob_209". In order to find the actual atom, we need
*to search the appropriate list for the REF string. This is dependant
*on the program (Lifeline uses GLOB.human_list, while Fission360 uses
- *GLOB.poi_list), but the result will be the same; evaluate the string and
+ *SSpoints_of_interest.other_points_of_interest), but the result will be the same; evaluate the string and
*return an atom reference.
*/
/datum/computer_file/program/radar/proc/find_atom()
@@ -269,7 +269,7 @@
pointercolor = "red"
/datum/computer_file/program/radar/fission360/find_atom()
- return locate(selected) in GLOB.poi_list
+ return locate(selected) in SSpoints_of_interest.other_points_of_interest
/datum/computer_file/program/radar/fission360/scan()
if(world.time < next_scan)
@@ -286,7 +286,7 @@
name = nuke.name,
)
objects += list(nukeinfo)
- var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list
+ var/obj/item/disk/nuclear/disk = locate() in SSpoints_of_interest.other_points_of_interest
if(trackable(disk))
var/list/nukeinfo = list(
ref = REF(disk),
diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm
index 5b1f27fa2cb9..3b825ce39524 100644
--- a/code/modules/overmap/helm.dm
+++ b/code/modules/overmap/helm.dm
@@ -49,6 +49,8 @@
/obj/machinery/computer/helm/Initialize(mapload, obj/item/circuitboard/C)
. = ..()
+ if(!viewer)
+ SSpoints_of_interest.make_point_of_interest(src)
jump_allowed = world.time + CONFIG_GET(number/bluespace_jump_wait)
ntnet_relay = new(src)
@@ -76,6 +78,7 @@
SStgui.close_uis(src)
ASSERT(length(concurrent_users) == 0)
QDEL_NULL(ntnet_relay)
+ SSpoints_of_interest.remove_point_of_interest(src)
if(current_ship)
current_ship.helms -= src
current_ship = null
diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm
index 5d851e52f4fd..efa4e36026c0 100644
--- a/code/modules/overmap/ships/controlled_ship_datum.dm
+++ b/code/modules/overmap/ships/controlled_ship_datum.dm
@@ -56,7 +56,7 @@
var/owner_check_timer_id
/// The ship's join mode. Controls whether players can join freely, have to apply, or can't join at all.
- var/join_mode = SHIP_JOIN_MODE_OPEN
+ var/join_mode = SHIP_JOIN_MODE_CLOSED
/// Lazylist of /datum/ship_applications for this ship. Only used if join_mode == SHIP_JOIN_MODE_APPLY
var/list/datum/ship_application/applications
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 9218b829e940..499a88b161f1 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -38,7 +38,7 @@
src.energy = starting_energy
. = ..()
START_PROCESSING(SSobj, src)
- GLOB.poi_list |= src
+ SSpoints_of_interest.make_point_of_interest(src)
GLOB.singularities |= src
for(var/obj/machinery/power/singularity_beacon/singubeacon in GLOB.machines)
if(singubeacon.active)
@@ -53,7 +53,7 @@
/obj/singularity/Destroy()
STOP_PROCESSING(SSobj, src)
- GLOB.poi_list.Remove(src)
+ SSpoints_of_interest.remove_point_of_interest(src)
GLOB.singularities.Remove(src)
return ..()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 6ed294fa8936..400366415d9a 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -275,7 +275,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
SSair.start_processing_machine(src, mapload)
countdown = new(src)
countdown.start()
- GLOB.poi_list |= src
+ SSpoints_of_interest.make_point_of_interest(src)
radio = new(src)
radio.keyslot = new radio_key
radio.listening = 0
@@ -293,7 +293,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER)
SSair.stop_processing_machine(src)
QDEL_NULL(radio)
- GLOB.poi_list -= src
+ SSpoints_of_interest.remove_point_of_interest(src)
QDEL_NULL(countdown)
if(is_main_engine && GLOB.main_supermatter_engine == src)
GLOB.main_supermatter_engine = null
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 7d58610fc7f7..d4a6f71cca4d 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -151,7 +151,7 @@
/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target)
if (istype(target))
target.orbiting_balls += src
- GLOB.poi_list -= src
+ SSpoints_of_interest.remove_point_of_interest(src)
target.dissipate_strength = target.orbiting_balls.len
. = ..()
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index e235e00b98f6..8705a932b392 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -88,14 +88,14 @@
projectile_type = /obj/projectile/bullet/c38/dumdum
/obj/item/ammo_casing/c38/hotshot
- name = ".38 hot shot bullet casing"
- desc = "A .38 hot shot bullet casing."
+ name = ".38 hearth bullet casing"
+ desc = "A .38 hearth bullet casing."
bullet_skin = "incen"
projectile_type = /obj/projectile/bullet/c38/hotshot
/obj/item/ammo_casing/c38/iceblox
- name = ".38 iceblox bullet casing"
- desc = "A .38 iceblox bullet casing."
+ name = ".38 chilled bullet casing"
+ desc = "A .38 chilled bullet casing."
bullet_skin = "surplus"
projectile_type = /obj/projectile/bullet/c38/iceblox
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 9f6a8c169ecd..24854030c041 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -46,6 +46,13 @@
icon_state = "incendiary"
projectile_type = /obj/projectile/bullet/incendiary/shotgun
+/obj/item/ammo_casing/shotgun/blank
+ name = "blank shell"
+ desc = "A shell packed with powder but no projectile."
+ icon_state = "blank"
+ projectile_type = /obj/projectile/bullet/pellet/blank
+ custom_materials = list(/datum/material/iron=250)
+
/obj/item/ammo_casing/shotgun/improvised
name = "improvised shell"
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index b590f0831df1..5b78f1fc93a1 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -113,13 +113,13 @@
ammo_type = /obj/item/ammo_casing/c38/dumdum
/obj/item/ammo_box/c38/hotshot
- name = "speed loader (.38 hot shot)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hot shot bullets contain an incendiary payload that set targets alight."
+ name = "speed loader (.38 hearth)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hearthwine bullets contain an incendiary payload that set targets alight."
ammo_type = /obj/item/ammo_casing/c38/hotshot
/obj/item/ammo_box/c38/iceblox
- name = "speed loader (.38 iceblox)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These iceblox bullets contain a cryogenic payload that chills targets."
+ name = "speed loader (.38 chilled)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These icewine bullets contain a cryogenic payload that chills targets."
ammo_type = /obj/item/ammo_casing/c38/iceblox
/obj/item/ammo_box/c38/empty
@@ -213,6 +213,18 @@
icon_state = "38box-surplus"
ammo_type = /obj/item/ammo_casing/c38/surplus
+/obj/item/ammo_box/c38_box/hotshot
+ name = "ammo box (.38 hearth)"
+ desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire."
+ icon_state = "38hotshot"
+ ammo_type = /obj/item/ammo_casing/c38/hotshot
+
+/obj/item/ammo_box/c38_box/iceblox
+ name = "ammo box (.38 chilled)"
+ desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down."
+ icon_state = "38iceblox"
+ ammo_type = /obj/item/ammo_casing/c38/iceblox
+
/obj/item/ammo_box/a12g
name = "ammo box (12g buckshot)"
desc = "A box of 12-gauge buckshot shells, devastating at close range."
@@ -238,6 +250,12 @@
icon_state = "12gbox-rubbershot"
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+/obj/item/ammo_box/a12g/blanks
+ name = "ammo box (12g blanks)"
+ desc = "A box of 12-gauge blank shells, designed for training."
+ icon_state ="12gbox-slug"
+ ammo_type = /obj/item/ammo_casing/shotgun/blank
+
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
desc = "A box of standard 9mm ammo."
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 34f02e8364b3..f506c775f4f2 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -209,6 +209,12 @@
///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max.
var/recoil_deviation = 22.5
+ ///Used if the guns recoil is lower then the min, it clamps the highest recoil
+ var/min_recoil = 0
+
+ var/gunslinger_recoil_bonus = 0
+ var/gunslinger_spread_bonus = 0
+
/// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst.
var/burst_size = 3
///The rate of fire when firing in a burst. Not the delay between bursts
@@ -320,9 +326,6 @@
///This prevents gun from firing until the coodown is done, affected by lag
var/current_cooldown = 0
- var/gunslinger_recoil_bonus = 0
- var/gunslinger_spread_bonus = 0
-
/obj/item/gun/Initialize()
. = ..()
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
@@ -330,6 +333,8 @@
muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
build_firemodes()
+ if(sawn_off)
+ sawoff(forced = TRUE)
/obj/item/gun/ComponentInitialize()
. = ..()
@@ -361,9 +366,6 @@
wielded_fully = TRUE
return TRUE
-/obj/item/gun/proc/is_wielded()
- return wielded
-
/// triggered on unwield of two handed item
/obj/item/gun/proc/on_unwield(obj/item/source, mob/user)
wielded = FALSE
@@ -371,6 +373,9 @@
zoom(user, forced_zoom = FALSE)
user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
+/obj/item/gun/proc/is_wielded()
+ return wielded
+
/obj/item/gun/Destroy()
if(chambered) //Not all guns are chambered (EMP'ed energy guns etc)
QDEL_NULL(chambered)
@@ -817,7 +822,7 @@
/obj/item/gun/proc/calculate_recoil(mob/user, recoil_bonus = 0)
if(HAS_TRAIT(user, TRAIT_GUNSLINGER))
recoil_bonus += gunslinger_recoil_bonus
- return clamp(recoil_bonus, 0 , INFINITY)
+ return clamp(recoil_bonus, min_recoil , INFINITY)
/obj/item/gun/proc/calculate_spread(mob/user, bonus_spread)
var/final_spread = 0
@@ -1108,3 +1113,46 @@
var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]"
button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]"
return ..()
+
+GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
+ /obj/item/gun/energy/plasmacutter,
+ /obj/item/melee/transforming/energy,
+ )))
+
+///Handles all the logic of sawing off guns,
+/obj/item/gun/proc/try_sawoff(mob/user, obj/item/saw)
+ if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this.
+ return
+ if(sawn_off)
+ to_chat(user, span_warning("\The [src] is already shortened!"))
+ return
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.visible_message(span_notice("[user] begins to shorten \the [src]."), span_notice("You begin to shorten \the [src]..."))
+
+ //if there's any live ammo inside the gun, makes it go off
+ if(blow_up(user))
+ user.visible_message(span_danger("\The [src] goes off!"), span_danger("\The [src] goes off in your face!"))
+ return
+
+ if(do_after(user, 30, target = src))
+ user.visible_message(span_notice("[user] shortens \the [src]!"), span_notice("You shorten \the [src]."))
+ sawoff(user, saw)
+
+///Used on init or try_sawoff
+/obj/item/gun/proc/sawoff(forced = FALSE)
+ if(sawn_off && !forced)
+ return
+ name = "sawn-off [src.name]"
+ desc = sawn_desc
+ w_class = WEIGHT_CLASS_NORMAL
+ item_state = "gun"
+ slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
+ slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
+ recoil = SAWN_OFF_RECOIL
+ sawn_off = TRUE
+ update_appearance()
+ return TRUE
+
+///used for sawing guns, causes the gun to fire without the input of the user
+/obj/item/gun/proc/blow_up(mob/user)
+ return
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index be96d982d79c..47558d1b47cb 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -13,6 +13,8 @@
has_safety = TRUE
safety = TRUE
+ min_recoil = 0.1
+
valid_attachments = list(
/obj/item/attachment/silencer,
/obj/item/attachment/laser_sight,
@@ -228,7 +230,7 @@
update_appearance()
return
if (can_be_sawn_off)
- if (sawoff(user, A))
+ if (try_sawoff(user, A))
return
return FALSE
@@ -334,43 +336,7 @@
rounds.Add(magazine.ammo_list(drop_all))
return rounds
-GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
- /obj/item/gun/energy/plasmacutter,
- /obj/item/melee/energy,
- )))
-
-///Handles all the logic of sawing off guns,
-/obj/item/gun/ballistic/proc/sawoff(mob/user, obj/item/saw)
- if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this.
- return
- if(sawn_off)
- to_chat(user, "\The [src] is already shortened!")
- return
- user.changeNext_move(CLICK_CD_MELEE)
- user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...")
-
- //if there's any live ammo inside the gun, makes it go off
- if(blow_up(user))
- user.visible_message("\The [src] goes off!", "\The [src] goes off in your face!")
- return
-
- if(do_after(user, 30, target = src))
- if(sawn_off)
- return
- user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].")
- name = "sawn-off [src.name]"
- desc = sawn_desc
- w_class = WEIGHT_CLASS_NORMAL
- item_state = "gun"
- slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
- slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
- recoil = SAWN_OFF_RECOIL
- sawn_off = TRUE
- update_appearance()
- return TRUE
-
-///used for sawing guns, causes the gun to fire without the input of the user
-/obj/item/gun/ballistic/proc/blow_up(mob/user)
+/obj/item/gun/ballistic/blow_up(mob/user)
. = FALSE
for(var/obj/item/ammo_casing/AC in magazine.stored_ammo)
if(AC.BB)
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 2d3cb6908c83..a61413057606 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -94,7 +94,7 @@
/obj/item/gun/ballistic/rifle/illestren/empty //i had to name it empty instead of no_mag because else it wouldnt work with guncases. sorry!
spawnwithmagazine = FALSE
-/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
+/obj/item/gun/ballistic/rifle/illestren/sawoff(forced = FALSE)
. = ..()
if(.)
spread = 24
@@ -114,20 +114,15 @@
icon_state = "illestren_factory"
item_state = "illestren_factory"
-/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
+/obj/item/gun/ballistic/rifle/illestren/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "illestren_factory_sawn"
mob_overlay_state = item_state
/obj/item/gun/ballistic/rifle/illestren/sawn
- name = "sawn-off Illestren rifle"
desc = "An Illestren rifle sawn down to a ridiculously small size. There was probably a reason it wasn't made this short to begin with, but it still packs a punch."
- item_state = "illestren_sawn"
sawn_off = TRUE
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BELT
/obj/item/gun/ballistic/rifle/solgov
name = "SSG-669C"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index eb8ea3355fe9..ab85fb9a01c4 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -74,7 +74,7 @@
can_be_sawn_off = TRUE
-/obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/brimstone/sawoff(forced = FALSE)
. = ..()
if(.)
weapon_weight = WEAPON_MEDIUM
@@ -108,7 +108,7 @@
rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
fire_delay = 0.1 SECONDS
-/obj/item/gun/ballistic/shotgun/hellfire/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/hellfire/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -316,7 +316,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY) && (!bolt_locked))
reskin_obj(user)
-/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(forced = FALSE)
. = ..()
if(.)
weapon_weight = WEAPON_MEDIUM
@@ -361,7 +361,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
item_state = "dshotgun_srm"
unique_reskin = null
-/obj/item/gun/ballistic/shotgun/doublebarrel/roumain/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/roumain/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "dshotgun_srm_sawn"
@@ -416,7 +416,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
if(sawn_off)
. += "ishotgun_sawn"
-/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawoff(forced = FALSE)
. = ..()
if(. && slung) //sawing off the gun removes the sling
new /obj/item/stack/cable_coil(get_turf(src), 10)
@@ -424,13 +424,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
update_appearance()
/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawn
- name = "sawn-off improvised shotgun"
- desc = "A single-shot shotgun. Better not miss."
- icon_state = "ishotgun_sawn"
- item_state = "ishotgun_sawn"
- w_class = WEIGHT_CLASS_NORMAL
sawn_off = TRUE
- slot_flags = ITEM_SLOT_BELT
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact
name = "compact compact combat shotgun"
@@ -596,7 +590,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
balloon_alert_to_viewers("quickly racks!")
fire_delay = 0 SECONDS
-/obj/item/gun/ballistic/shotgun/flamingarrow/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -621,7 +615,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
base_icon_state = "flamingarrow_factory"
item_state = "flamingarrow_factory"
-/obj/item/gun/ballistic/shotgun/flamingarrow/factory/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/factory/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "flamingarrow_factory_sawn"
@@ -634,7 +628,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
icon_state = "flamingbolt"
item_state = "flamingbolt"
-/obj/item/gun/ballistic/shotgun/flamingarrow/bolt/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/bolt/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "flamingbolt_sawn"
@@ -650,7 +644,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
sawn_desc = "A large lever-action rifle, sawn down for portability. It looks much cooler, but you should probably be using a revolver..."
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester/absolution
-/obj/item/gun/ballistic/shotgun/flamingarrow/absolution/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/absolution/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -682,7 +676,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
sawn_desc = "A lever action shotgun that's been sawed down for portability. The recoil makes it mostly useless outside of point-blank range, but it hits hard for its size and, more importantly, can be flipped around stylishly."
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester/conflagration
-/obj/item/gun/ballistic/shotgun/flamingarrow/conflagration/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/conflagration/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -765,7 +759,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
gun_firemodes = list(FIREMODE_SEMIAUTO)
default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "beacon_sawn"
@@ -788,7 +782,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
icon_state = "beacon_factory"
item_state = "beacon_factory"
-/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "beacon_factory_sawn"
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 266c9059046a..6f52daaf2292 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -192,6 +192,7 @@
name = "\improper Nanotrasen Saber SMG"
desc = "A prototype full-auto 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors and a folding stock."
icon = 'icons/obj/guns/projectile.dmi'
+ default_attachments = list(/obj/item/attachment/foldable_stock)
icon_state = "saber"
item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/smgm9mm
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index c2e5b4cb2933..40fd10e94785 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -46,7 +46,7 @@
/obj/item/gun/energy/pulse/prize/Initialize()
. = ..()
- GLOB.poi_list += src
+ SSpoints_of_interest.make_point_of_interest(src)
var/turf/T = get_turf(src)
message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]")
@@ -55,7 +55,7 @@
notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize")
/obj/item/gun/energy/pulse/prize/Destroy()
- GLOB.poi_list -= src
+ SSpoints_of_interest.remove_point_of_interest(src)
. = ..()
/obj/item/gun/energy/pulse/pistol
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index dede2ce0d7ce..340aa692f5b2 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -69,7 +69,7 @@
imp.implant(M)
/obj/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail
- name = ".38 hot shot bullet"
+ name = ".38 hearth bullet"
ricochets_max = 0
/obj/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE)
@@ -80,7 +80,7 @@
M.IgniteMob()
/obj/projectile/bullet/c38/iceblox //see /obj/projectile/temp for the original code
- name = ".38 iceblox bullet"
+ name = ".38 chilled bullet"
var/temperature = 100
ricochets_max = 0
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index ba9c8c88d7f8..a069102a39cc 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -114,3 +114,9 @@
damage = 30
armour_penetration = -25
tile_dropoff = 3
+
+/obj/projectile/bullet/pellet/blank
+ name = "blank"
+ damage = 30
+ range = 2
+ armour_penetration = -70
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 9eb48f11cf4d..49765fd6747b 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -162,7 +162,7 @@
handle_reactions()
return amount
-/// Get the name of the reagent there is the most of in this holder
+/// DEPRICATED use get_master_regent. Get the name of the reagent there is the most of in this holder
/datum/reagents/proc/get_master_reagent_name()
var/list/cached_reagents = reagent_list
var/name
@@ -175,7 +175,7 @@
return name
-/// Get the id of the reagent there is the most of in this holder
+/// DEPRICATED use get_master_regent. Get the id of the reagent there is the most of in this holder
/datum/reagents/proc/get_master_reagent_id()
var/list/cached_reagents = reagent_list
var/max_type
@@ -611,6 +611,7 @@
//Clear from relevant lists
addiction_list -= R
reagent_list -= R
+ SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, R)
qdel(R)
update_total()
if(my_atom)
@@ -638,6 +639,8 @@
del_reagent(R.type)
if(my_atom)
my_atom.on_reagent_change(CLEAR_REAGENTS)
+
+ SEND_SIGNAL(src, COMSIG_REAGENTS_CLEAR_REAGENTS)
return 0
/**
@@ -747,6 +750,8 @@
if(my_atom)
my_atom.on_reagent_change(ADD_REAGENT)
R.on_merge(data, amount)
+
+ SEND_SIGNAL(src, COMSIG_REAGENTS_ADD_REAGENT, cached_reagents, amount, reagtemp, data, no_react)
if(!no_react)
handle_reactions()
return TRUE
@@ -765,6 +770,8 @@
update_total()
if(my_atom)
my_atom.on_reagent_change(ADD_REAGENT)
+
+ SEND_SIGNAL(src, COMSIG_REAGENTS_NEW_REAGENT, reagent, amount, reagtemp, data, no_react)
if(!no_react)
handle_reactions()
return TRUE
@@ -797,6 +804,7 @@
//and zero, to prevent removing more than the holder has stored
amount = clamp(amount, 0, R.volume)
R.volume -= amount
+ SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, A, amount)
update_total()
if(!safety)//So it does not handle reactions when it need not to
handle_reactions()
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index ac1cd94b092e..8e6935766346 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -337,18 +337,18 @@
reagents.trans_to(P, vol_each, transfered_by = usr)
return TRUE
if(item_type == "condimentPack")
- var/obj/item/reagent_containers/food/condiment/pack/P
+ var/obj/item/reagent_containers/condiment/pack/P
for(var/i = 0; i < amount; i++)
- P = new/obj/item/reagent_containers/food/condiment/pack(drop_location())
+ P = new/obj/item/reagent_containers/condiment/pack(drop_location())
P.originalname = name
P.name = trim("[name] pack")
P.desc = "A small condiment pack. The label says it contains [name]."
reagents.trans_to(P, vol_each, transfered_by = usr)
return TRUE
if(item_type == "condimentBottle")
- var/obj/item/reagent_containers/food/condiment/P
+ var/obj/item/reagent_containers/condiment/P
for(var/i = 0; i < amount; i++)
- P = new/obj/item/reagent_containers/food/condiment(drop_location())
+ P = new/obj/item/reagent_containers/condiment(drop_location())
P.originalname = name
P.name = trim("[name] bottle")
reagents.trans_to(P, vol_each, transfered_by = usr)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 11306b441f1e..e0d4e2a86606 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -2526,3 +2526,38 @@
description = "Bacteria native to the Saint-Roumain Militia home planet."
color = "#5a4f42"
taste_description = "sour"
+
+//anti rad foam
+/datum/reagent/anti_radiation_foam
+ name = "Anti-Radiation Foam"
+ description = "A tried and tested foam, used for decontaminating nuclear disasters."
+ reagent_state = LIQUID
+ color = "#A6FAFF55"
+ taste_description = "bitter, foamy awfulness."
+
+/datum/reagent/anti_radiation_foam/expose_turf(turf/open/T, reac_volume)
+ if (!istype(T))
+ return
+
+ if(reac_volume >= 1)
+ var/obj/effect/particle_effect/foam/antirad/F = (locate(/obj/effect/particle_effect/foam/antirad) in T)
+ if(!F)
+ F = new(T)
+ else if(istype(F))
+ F.lifetime = initial(F.lifetime) //the foam is what does the cleaning here
+
+/datum/reagent/anti_radiation_foam/expose_obj(obj/O, reac_volume)
+ O.wash(CLEAN_RAD)
+
+/datum/reagent/anti_radiation_foam/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method in list(TOUCH, VAPOR))
+ M.radiation = M.radiation - rand(max(M.radiation * 0.95, M.radiation)) //get the hose
+ M.ExtinguishMob()
+ ..()
+
+
+/datum/reagent/anti_radiation_foam/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(0.5, 200)
+ M.adjust_disgust(4)
+ ..()
+ . = 1
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index fafd67305c9c..54d2fc182398 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -58,6 +58,12 @@
reagent_id = /datum/reagent/firefighting_foam
tank_volume = 500
+/obj/structure/reagent_dispensers/foamtank/antirad
+ name = "anti-radiation foam tank"
+ desc = "A tank full of decontamination foam"
+ reagent_id = /datum/reagent/anti_radiation_foam
+ tank_volume = 1000
+
/obj/structure/reagent_dispensers/fueltank
name = "fuel tank"
desc = "A tank full of industrial welding fuel. Do not consume."
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 79b28ccef331..340119a4e78a 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -97,18 +97,25 @@ other types of metals and chemistry for reagents).
color = "#8b70ff"
illustration = "design"
custom_materials = list(/datum/material/iron =300, /datum/material/glass =100)
+ var/disk_name = "Design Disk"
+ var/design_name
var/list/blueprints = list()
- var/list/starting_blueprints = list()
+ var/starting_blueprints = list()
var/max_blueprints = 1
/obj/item/disk/design_disk/Initialize()
. = ..()
pixel_x = base_pixel_x + rand(-5, 5)
pixel_y = base_pixel_y + rand(-5, 5)
- blueprints = new/list(max_blueprints)
+ if(design_name)
+ name = jointext(list(disk_name, design_name), " - ")
+ if(length(starting_blueprints))
+ for(var/design in starting_blueprints)
+ blueprints += new design()
/obj/item/disk/design_disk/adv
name = "Advanced Component Design Disk"
+ disk_name = "Advanced Design Disk"
color = "#bed876"
desc = "A disk for storing device design data for construction in lathes. This one has a little bit of extra storage space."
custom_materials = list(/datum/material/iron =300, /datum/material/glass = 100, /datum/material/silver = 50)
@@ -116,6 +123,7 @@ other types of metals and chemistry for reagents).
/obj/item/disk/design_disk/super
name = "Super Component Design Disk"
+ disk_name = "Super Design Disk"
color = "#c25454"
desc = "A disk for storing device design data for construction in lathes. This one has more extra storage space."
custom_materials = list(/datum/material/iron =300, /datum/material/glass = 100, /datum/material/silver = 50, /datum/material/gold = 50)
@@ -123,6 +131,7 @@ other types of metals and chemistry for reagents).
/obj/item/disk/design_disk/elite
name = "Elite Component Design Disk"
+ disk_name = "Elite Design Disk"
color = "#333333"
desc = "A disk for storing device design data for construction in lathes. This one has absurd amounts of extra storage space."
custom_materials = list(/datum/material/iron =300, /datum/material/glass = 100, /datum/material/silver = 100, /datum/material/gold = 100, /datum/material/bluespace = 50)
@@ -130,39 +139,60 @@ other types of metals and chemistry for reagents).
//Disks with content
/obj/item/disk/design_disk/ammo_c10mm
- name = "Design Disk - 10mm Ammo"
+ design_name = "10mm Ammo"
desc = "A design disk containing the pattern for a refill box of standard 10mm ammo, used in Stechkin pistols."
-
-/obj/item/disk/design_disk/ammo_c10mm/Initialize()
- . = ..()
- blueprints[1] = new /datum/design/c10mm()
-
+ starting_blueprints = (/datum/design/c10mm)
/obj/item/disk/design_disk/disposable_gun
- name = "design disk - disposable gun"
+ design_name = "Disposable gun"
desc = "A design disk containing designs for a cheap and disposable gun."
illustration = "gun"
max_blueprints = 2
-
-/obj/item/disk/design_disk/disposable_gun/Initialize()
- . = ..()
- blueprints[1] = new /datum/design/disposable_gun()
+ starting_blueprints = list(/datum/design/disposable_gun)
/obj/item/disk/design_disk/clip_mechs
- name = "design disk - CLIP exosuit modifications"
+ design_name = "CLIP exosuit modifications"
desc = "A design disk containing specifications for CLIP-custom exosuit conversions."
color = "#57b8f0"
max_blueprints = 2
-
-/obj/item/disk/design_disk/clip_mechs/Initialize()
- . = ..()
- blueprints[1] = new /datum/design/clip_ripley_upgrade()
- blueprints[2] = new /datum/design/clip_durand_upgrade()
+ starting_blueprints = list(/datum/design/clip_ripley_upgrade, /datum/design/clip_durand_upgrade)
/obj/item/disk/design_disk/ammo_c9mm
- name = "Design Disk - 9mm Ammo"
+ design_name = "9mm Ammo"
desc = "A design disk containing the pattern for a refill box of standard 9mm ammo, used in Commander pistols."
-
-/obj/item/disk/design_disk/ammo_c9mm/Initialize()
- . = ..()
- blueprints[1] = new /datum/design/c9mmautolathe()
+ starting_blueprints = list(/datum/design/c9mmautolathe)
+
+/obj/item/disk/design_disk/blanks
+ design_name = "Blank Ammo"
+ starting_blueprints = list(/datum/design/blank_shell)
+
+
+/obj/item/disk/design_disk/ammo_1911
+ design_name = "1911 Magazine"
+ desc = "A design disk containing the pattern for the classic 1911's seven round .45ACP magazine."
+ illustration = "ammo"
+ starting_blueprints = list(/datum/design/colt_1911_magazine)
+
+//KA modkit design discs
+/obj/item/disk/design_disk/modkit_disc
+ design_name = "KA Mod"
+ desc = "A design disc containing the design for a unique kinetic accelerator modkit. It's compatible with a research console."
+ illustration = "accel"
+ color = "#6F6F6F"
+ starting_blueprints = list(/datum/design/unique_modkit)
+
+/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe
+ design_name = "Offensive Mining Explosion Mod"
+ starting_blueprints = list(/datum/design/unique_modkit/offensive_turf_aoe)
+
+/obj/item/disk/design_disk/modkit_disc/rapid_repeater
+ design_name = "Rapid Repeater Mod"
+ starting_blueprints = list(/datum/design/unique_modkit/rapid_repeater)
+
+/obj/item/disk/design_disk/modkit_disc/resonator_blast
+ design_name = "Resonator Blast Mod"
+ starting_blueprints = list(/datum/design/unique_modkit/resonator_blast)
+
+/obj/item/disk/design_disk/modkit_disc/bounty
+ design_name = "Death Syphon Mod"
+ starting_blueprints = list(/datum/design/unique_modkit/bounty)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index d1fe33024919..0b679dfcc4bf 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -796,6 +796,14 @@
build_path = /obj/item/ammo_casing/shotgun/beanbag
category = list("initial", "Security", "Ammo")
+/datum/design/blank_shell
+ name = "Shotgun Blank"
+ id = "blank_shell"
+ build_type = AUTOLATHE | PROTOLATHE
+ materials = list(/datum/material/iron = 2000)
+ build_path = /obj/item/ammo_casing/shotgun/blank
+ category = list("Security", "Ammo")
+
/datum/design/riot_dart
name = "Foam Riot Dart"
id = "riot_dart"
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 2a8f390e9e36..1c3edc8b7c32 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -18,7 +18,7 @@
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
/datum/design/c38_hotshot
- name = "Speed Loader (.38 Hot Shot)"
+ name = "Speed Loader (.38 Hearth)"
desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload."
id = "c38_hotshot"
build_type = PROTOLATHE
@@ -28,7 +28,7 @@
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
/datum/design/c38_iceblox
- name = "Speed Loader (.38 Iceblox)"
+ name = "Speed Loader (.38 Chilled)"
desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload."
id = "c38_iceblox"
build_type = PROTOLATHE
diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
deleted file mode 100644
index e9ca8f3d4093..000000000000
--- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
+++ /dev/null
@@ -1,258 +0,0 @@
-//******Decoration objects
-//***Bone statues and giant skeleton parts.
-/obj/structure/statue/bone
- anchored = TRUE
- max_integrity = 120
- material_drop_type = /obj/item/stack/sheet/bone
- impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least
- layer = ABOVE_ALL_MOB_LAYER
-
-/obj/structure/statue/bone/rib
- name = "collosal rib"
- desc = "It's staggering to think that something this big could have lived, let alone died."
- oreAmount = 4
- icon = 'icons/obj/statuelarge.dmi'
- icon_state = "rib"
-
-/obj/structure/statue/bone/skull
- name = "collosal skull"
- desc = "The gaping maw of a dead, titanic monster."
- oreAmount = 12
- icon = 'icons/obj/statuelarge.dmi'
- icon_state = "skull"
-
-/obj/structure/statue/bone/skull/half
- desc = "The gaping maw of a dead, titanic monster. This one is cracked in half."
- oreAmount = 6
- icon = 'icons/obj/statuelarge.dmi'
- icon_state = "skull-half"
-
-//***Wasteland floor and rock turfs here.
-/turf/open/floor/plating/asteroid/basalt/wasteland //Like a more fun version of living in Arizona.
- name = "cracked earth"
- icon = 'icons/turf/floors.dmi'
- icon_state = "wasteland"
- base_icon_state = "wasteland"
- baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
- digResult = /obj/item/stack/ore/glass/basalt
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- slowdown = 0.5
- floor_variance = 30
- max_icon_states = 6
-
-/turf/closed/mineral/strong/wasteland
- name = "ancient dry rock"
- color = "#B5651D"
- environment_type = "wasteland"
- turf_type = /turf/open/floor/plating/asteroid/basalt/wasteland
- baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
- smooth_icon = 'icons/turf/walls/rock_wall.dmi'
- base_icon_state = "rock_wall"
- smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
-
-/turf/closed/mineral/strong/wasteland/drop_ores()
- if(prob(10))
- new /obj/item/stack/ore/iron(src, 1)
- new /obj/item/stack/ore/glass(src, 1)
- new /obj/effect/decal/remains/human/grave(src, 1)
- else
- new /obj/item/stack/sheet/bone(src, 1)
-
-//***Oil well puddles.
-/obj/structure/sink/oil_well //You're not going to enjoy bathing in this...
- name = "oil well"
- desc = "A bubbling pool of oil.This would probably be valuable, had bluespace technology not destroyed the need for fossil fuels 200 years ago."
- icon = 'icons/obj/watercloset.dmi'
- icon_state = "puddle-oil"
- dispensedreagent = /datum/reagent/fuel/oil
-
-/obj/structure/sink/oil_well/Initialize()
- .=..()
- create_reagents(20)
- reagents.add_reagent(dispensedreagent, 20)
-
-/obj/structure/sink/oil_well/attack_hand(mob/M)
- flick("puddle-oil-splash",src)
- reagents.expose(M, TOUCH, 20) //Covers target in 20u of oil.
- to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.")
-
-/obj/structure/sink/oil_well/attackby(obj/item/O, mob/user, params)
- flick("puddle-oil-splash",src)
- if(O.tool_behaviour == TOOL_SHOVEL && !(flags_1&NODECONSTRUCT_1)) //attempt to deconstruct the puddle with a shovel
- to_chat(user, "You fill in the oil well with soil.")
- O.play_tool_sound(src)
- deconstruct()
- return 1
- if(istype(O, /obj/item/reagent_containers)) //Refilling bottles with oil
- var/obj/item/reagent_containers/RG = O
- if(RG.is_refillable())
- if(!RG.reagents.holder_full())
- RG.reagents.add_reagent(dispensedreagent, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
- to_chat(user, "You fill [RG] from [src].")
- return TRUE
- to_chat(user, "\The [RG] is full.")
- return FALSE
- if(user.a_intent != INTENT_HARM)
- to_chat(user, "You won't have any luck getting \the [O] out if you drop it in the oil.")
- return 1
- else
- return ..()
-
-/obj/structure/sink/oil_well/drop_materials()
- new /obj/effect/decal/cleanable/oil(loc)
-
-//***Grave mounds.
-/obj/structure/closet/crate/grave
- name = "burial mound"
- desc = "A marked patch of soil, adorned with a wooden cross"
- icon_state = "grave"
- dense_when_open = TRUE
- material_drop = /obj/item/stack/ore/glass/basalt
- material_drop_amount = 5
- opened = TRUE
- anchorable = FALSE
- anchored = TRUE
- locked = TRUE
- breakout_time = 900
- cutting_tool = TOOL_SHOVEL
- var/lead_tomb = FALSE
- var/first_open = FALSE
-
-/obj/structure/closet/crate/grave/attackby(obj/item/W, mob/user, params)
- .=..()
- if(istype(W, /obj/item/screwdriver))
- if(!user.is_literate())
- to_chat(user, "You scratch illegibly on [src]!")
- return
- var/t = stripped_input(user, "What would you like the inscription to be?", name, null, 53)
- if(user.get_active_held_item() != W)
- return
- if(!user.canUseTopic(src, BE_CLOSE))
- return
- if(t)
- desc = "[t]"
- return
-
-/obj/structure/closet/crate/grave/open(mob/living/user, obj/item/S, force = FALSE)
- if(!opened)
- to_chat(user, "The ground here is too hard to dig up with your bare hands. You'll need a shovel.")
- else
- to_chat(user, "The grave has already been dug up.")
-
-/obj/structure/closet/crate/grave/tool_interact(obj/item/S, mob/living/carbon/user)
- if(user.a_intent == INTENT_HELP) //checks to attempt to dig the grave, must be done on help intent only.
- if(!opened)
- if(S.tool_behaviour == cutting_tool)
- to_chat(user, "You start start to dig open \the [src] with \the [S]...")
- if (do_after(user,20, target = src))
- opened = TRUE
- locked = TRUE
- dump_contents()
- update_appearance()
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing)
- if(lead_tomb == TRUE && first_open == TRUE)
- user.gain_trauma(/datum/brain_trauma/magic/stalker)
- to_chat(user, "Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")
- first_open = FALSE
- return 1
- return 1
- else
- to_chat(user, "You can't dig up a grave with \the [S.name].")
- return 1
- else
- to_chat(user, "The grave has already been dug up.")
- return 1
-
- else if((user.a_intent != INTENT_HELP) && opened) //checks to attempt to remove the grave entirely.
- if(S.tool_behaviour == cutting_tool)
- to_chat(user, "You start to remove \the [src] with \the [S].")
- if (do_after(user,15, target = src))
- to_chat(user, "You remove \the [src] completely.")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing)
- deconstruct(TRUE)
- return 1
- return
-
-/obj/structure/closet/crate/grave/bust_open()
- ..()
- opened = TRUE
- update_appearance()
- dump_contents()
- return
-
-/obj/structure/closet/crate/grave/stone
- name = "burial mound"
- desc = "A marked patch of soil, adorned with a sandstone slab"
- icon_state = "grave_lead"
-
-/obj/structure/closet/crate/grave/loot
- name = "burial mound"
- desc = "A marked patch of soil, showing signs of a burial long ago. You wouldn't disturb a grave... right?"
- opened = FALSE
-
-/obj/structure/closet/crate/grave/loot/PopulateContents() //GRAVEROBBING IS NOW A FEATURE
- ..()
- new /obj/effect/decal/remains/human/grave(src)
- switch(rand(1,7))
- if(1)
- new /obj/item/coin/gold(src)
- new /obj/item/storage/wallet(src)
- if(2)
- new /obj/item/clothing/glasses/meson(src)
- if(3)
- new /obj/item/coin/silver(src)
- new /obj/item/shovel/spade(src)
- if(4)
- new /obj/item/storage/book/bible/booze(src)
- if(5)
- new /obj/item/clothing/neck/stethoscope(src)
- new /obj/item/scalpel(src)
- new /obj/item/hemostat(src)
-
- if(6)
- new /obj/item/reagent_containers/glass/beaker(src)
- new /obj/item/clothing/glasses/science(src)
- if(7)
- new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/mask/cigarette/rollie(src)
-
-/obj/structure/closet/crate/grave/loot/lead_researcher
- name = "ominous burial mound"
- desc = "Even in a place filled to the brim with graves, this one shows a level of preperation and planning that fills you with dread."
- icon_state = "grave_lead"
- lead_tomb = TRUE
- first_open = TRUE
-
-/obj/structure/closet/crate/grave/loot/lead_researcher/PopulateContents() //ADVANCED GRAVEROBBING
- ..()
- new /obj/effect/decal/cleanable/blood/gibs/old(src)
-
-/obj/effect/decal/remains/human/grave
- turf_loc_check = FALSE
-
-//***Fluff items for lore/intrigue
-/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard
- name = "posted warning"
- desc = "It seems to be smudged with mud and... oil?"
- default_raw_text = "TO WHOM IT MAY CONCERN This area is property of the Nanotrasen Mining Division. Trespassing in this area is illegal, highly dangerous, and subject to several NDAs. Please turn back now, under intergalactic law section 48-R." - -/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes - name = "Research Findings: Day 26" - desc = "Huh, this one page looks like it was torn out of a full book. How odd." - icon_state = "docs_part" - default_raw_text = "Researcher name: B--*--* J--*s. Detailed findings:Today the camp site's cond-tion has wor--ene*. The ashst--ms keep blocking us off from le-ving the sit* for m-re supplies, and it's lo-king like we're out of pl*sma to p-wer the ge-erat*r. Can't rea-*y study c-*bon *ating with no li--ts, ya know? Da-*y's been going -*f again and ag-*n a-*ut h*w the company's left us to *ie here, but I j-s* keep tell-ng him to stop che*-in* out these damn graves. We m-y b* archaeologists, but -e sho*ld have t-e dec-**cy to know these grav-s are *-l NEW. The rest of the page is just semantics about carbon dating methods." - -/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny - name = "hastily scribbled note" - desc = "Seems like someone was in a hurry." - default_raw_text = "Alright, we all know that stuck up son a bitch is just doing this to keep us satisifed. Who the hell does he think he is, taking extra rations? We're OUT OF FOOD, CARL. Tomorrow at noon, we're going to try and take the ship by force. He HAS to be lying about the engine cooling down. He HAS TO BE. I'm tellin ya, with this implant I lifted off that last supply ship, I got the smarts to get us offa this shithole. Keep your knife handy carl." - -/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis - name = "research document" - desc = "Standard Nanotrasen typeface for important research documents." - default_raw_text = "Day 9: Tenative Conclusions While the area appears to be of significant cultural importance to the lizard race, outside of some sparce contact with native wildlife, we're yet to find any exact reasoning for the nature of this phenomenon. It seems that organic life is communally drawn to this planet as though it functions as a final resting place for intelligent life. As per company guidelines, this site shall be given the following classification: 'LZ-0271 - Elephant Graveyard' Compiled list of Artifact findings (Currently Sent Offsite) Cultist Blade Fragments: x8 Brass Multiplicative Ore Sample: x105 Syndicate Revolutionary Leader Implant (Broken) x1 Extinct Cortical Borer Tissue Sample x1 Space Carp Fossil x3" - -/obj/item/paper/fluff/ruins/elephant_graveyard/final_message - name = "important looking Note" - desc = "This note is well written, and seems to have been put here so you'd find it." - default_raw_text = "If you find this... you don't need to know who I am. You need to leave this place. I dunno what shit they did to me out here, but I don't think I'm going to be making it out of here. This place... it wears down your psyche. The other researchers out here laughed it off but... They were the first to go. One by one they started turning on each other. The more they found out, the more they started fighting and arguing... As I speak now, I had to... I wound up having to put most of my men down. I know what I had to do, and I know there's no way left for me to live with myself. If anyone ever finds this, just don't touch the graves. DO NOT. TOUCH. THE GRAVES. Don't be a dumbass, like we all were." diff --git a/code/modules/ruins/spaceruin_code/bigderelict1.dm b/code/modules/ruins/spaceruin_code/bigderelict1.dm index 99af3b9efa28..9e2a0957547b 100644 --- a/code/modules/ruins/spaceruin_code/bigderelict1.dm +++ b/code/modules/ruins/spaceruin_code/bigderelict1.dm @@ -6,13 +6,3 @@ /obj/item/paper/crumpled/ruins/bigderelict1/coward icon_state = "scrap_bloodied" default_raw_text = "If anyone finds this, please, don't let my kids know I died a coward.." - -/obj/item/disk/design_disk/ammo_1911 - name = "design disk - 1911 magazine" - desc = "A design disk containing the pattern for the classic 1911's seven round .45ACP magazine." - illustration = "ammo" - -/obj/item/disk/design_disk/ammo_1911/Initialize() - . = ..() - var/datum/design/colt_1911_magazine/M = new - blueprints[1] = M diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 720670e3fc21..38e2f0df145e 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -99,7 +99,7 @@ name = "phylactery of [mind.name]" active_phylacteries++ - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) START_PROCESSING(SSobj, src) if(initial(SSticker.mode.round_ends_with_antag_death)) SSticker.mode.round_ends_with_antag_death = FALSE @@ -107,7 +107,7 @@ /obj/item/phylactery/Destroy(force=FALSE) STOP_PROCESSING(SSobj, src) active_phylacteries-- - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) if(!active_phylacteries) SSticker.mode.round_ends_with_antag_death = initial(SSticker.mode.round_ends_with_antag_death) . = ..() diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index 18b8fd522aab..0dc0102c91ef 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -8,11 +8,11 @@ /obj/item/reagent_containers/glass/bowl = 20, /obj/item/kitchen/fork = 6, /obj/item/reagent_containers/food/drinks/drinkingglass = 8, - /obj/item/reagent_containers/food/condiment/pack/ketchup = 5, - /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5, - /obj/item/reagent_containers/food/condiment/pack/astrotame = 5, - /obj/item/reagent_containers/food/condiment/saltshaker = 5, - /obj/item/reagent_containers/food/condiment/peppermill = 5, + /obj/item/reagent_containers/condiment/pack/ketchup = 5, + /obj/item/reagent_containers/condiment/pack/hotsauce = 5, + /obj/item/reagent_containers/condiment/pack/astrotame = 5, + /obj/item/reagent_containers/condiment/saltshaker = 5, + /obj/item/reagent_containers/condiment/peppermill = 5, /obj/item/clothing/suit/apron/chef = 2, /obj/item/kitchen/rollingpin = 2, /obj/item/melee/knife/kitchen = 2, diff --git a/html/changelogs/AutoChangeLog-pr-2932.yml b/html/changelogs/AutoChangeLog-pr-2932.yml deleted file mode 100644 index 14c0c5985f64..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2932.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: FalloutFalcon -changes: - - {code_imp: bunch of code organization related to melee} - - {refactor: cleaned up a bunch of melee items to have better inheritance and paths} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3366.yml b/html/changelogs/AutoChangeLog-pr-3366.yml new file mode 100644 index 000000000000..f1b353bf3387 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3366.yml @@ -0,0 +1,4 @@ +author: Erika Fox +changes: + - {rscadd: Anti-Radiation Foam is now available at the outpost} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3370.yml b/html/changelogs/AutoChangeLog-pr-3370.yml deleted file mode 100644 index 95a56f2e9b49..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3370.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: trazodont -changes: - - {bugfix: miso soup spelling error} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3377.yml b/html/changelogs/AutoChangeLog-pr-3377.yml deleted file mode 100644 index 26fbe6b2eec3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3377.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Apogee-dev -changes: - - {balance: Changed decoration on Miskilamo ships to look similar to each other} - - {balance: reduced Kilo starting funds to 1500} - - {bugfix: fixed wires on Mudskipper} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3378.yml b/html/changelogs/AutoChangeLog-pr-3378.yml new file mode 100644 index 000000000000..7ed5af71b205 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3378.yml @@ -0,0 +1,5 @@ +author: Erika Fox +changes: + - {code_imp: 'Fireaxe cabinets have been repathed, and now function as a more general + cabinet object. please report any inconsistencies with behavior'} +delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3392.yml b/html/changelogs/AutoChangeLog-pr-3392.yml deleted file mode 100644 index b1fd3875e1c8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3392.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: thgvr -changes: - - {rscadd: A bunch of kepori underwear have sprites now} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3397.yml b/html/changelogs/AutoChangeLog-pr-3397.yml deleted file mode 100644 index 673b299d889d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3397.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: rye, erika -changes: - - {rscadd: 'concrete jugs have been replaced by much more appropriate concrete bags, - jee, i hope whoever made *that* blunder got fired.'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3409.yml b/html/changelogs/AutoChangeLog-pr-3409.yml deleted file mode 100644 index e2ad0fc06bde..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3409.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: PositiveEntropy -changes: - - {imageadd: Resprites all balaclavas!} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3411.yml b/html/changelogs/AutoChangeLog-pr-3411.yml deleted file mode 100644 index cb95ac44d223..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3411.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: zimon9 -changes: - - {rscadd: Adds a bit more contrast to the output of health analyzers} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3412.yml b/html/changelogs/AutoChangeLog-pr-3412.yml deleted file mode 100644 index 1c0b79981ecd..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3412.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Bjarl -changes: - - {bugfix: turrets will now _actually_ connect to their console. i swear im a real - coder.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3414.yml b/html/changelogs/AutoChangeLog-pr-3414.yml deleted file mode 100644 index a4603970da7e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3414.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Thera-Pissed -changes: - - {rscdel: B.E.P.I.S. and related tech nodes.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3415.yml b/html/changelogs/AutoChangeLog-pr-3415.yml deleted file mode 100644 index 05558e44aa1c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3415.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Thera-Pissed -changes: - - {rscdel: unused did_fire var} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3416.yml b/html/changelogs/AutoChangeLog-pr-3416.yml deleted file mode 100644 index b99d0706e9ef..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: thgvr -changes: - - {balance: Colossus now only has 2 recruit slots instead of a whopping !!5!!} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3455.yml b/html/changelogs/AutoChangeLog-pr-3455.yml new file mode 100644 index 000000000000..0351ddf280b1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3455.yml @@ -0,0 +1,5 @@ +author: Sadhorizon +changes: + - {tweak: You can now put knives in secbelts and the subtypes of secbelts.} + - {bugfix: You can now fit all knives in mining webbings.} +delete-after: true diff --git a/html/changelogs/archive/2024-09.yml b/html/changelogs/archive/2024-09.yml index d6027a6f2a58..52b3cbfbf679 100644 --- a/html/changelogs/archive/2024-09.yml +++ b/html/changelogs/archive/2024-09.yml @@ -137,3 +137,84 @@ Bjarl: - rscadd: You can now buy flares at the outpost - rscadd: Wasteplanets now will generate concrete filled caves. +2024-09-24: + Apogee-dev: + - balance: Changed decoration on Miskilamo ships to look similar to each other + - balance: reduced Kilo starting funds to 1500 + - bugfix: fixed wires on Mudskipper + Bjarl: + - bugfix: turrets will now _actually_ connect to their console. i swear im a real + coder. + FalloutFalcon: + - code_imp: bunch of code organization related to melee + - refactor: cleaned up a bunch of melee items to have better inheritance and paths + PositiveEntropy: + - imageadd: Resprites all balaclavas! + Thera-Pissed: + - rscdel: unused did_fire var + - rscdel: B.E.P.I.S. and related tech nodes. + rye, erika: + - rscadd: concrete jugs have been replaced by much more appropriate concrete bags, + jee, i hope whoever made *that* blunder got fired. + thgvr: + - balance: Colossus now only has 2 recruit slots instead of a whopping !!5!! + - rscadd: A bunch of kepori underwear have sprites now + trazodont: + - bugfix: miso soup spelling error + zimon9: + - rscadd: Adds a bit more contrast to the output of health analyzers +2024-09-25: + Jedi-Toothpaste: + - bugfix: Added windows to the mudskipper and shetland's engines. + - bugfix: Adjusted the blast doors which open on the Shetland's engines. + SomeguyManperson: + - bugfix: sawn off illestren/improvised shotgun stats are now consistent if they + are spawned in +2024-09-26: + FalloutFalcon: + - rscadd: Added new blank shells for training drills! + - refactor: Minor refactor of design disks to reduce repeated code + - rscadd: Ballistics now have a minimum recoil, not enough to mess up your shot! + - bugfix: ships now start closed. shiptesters be writing there memos and ship names. + - rscadd: You can now see ships in the orbit menu and its alot prettier! + - code_imp: ported tg points of interest and a much improved orbit menu + Gristlebee: + - bugfix: fixes wall deconstruction causing runtimes + Jedi-Toothpaste: + - bugfix: Fixed the lack of windows for the Kilo's Thrusters, and fixed the broken + link for the new blast doors. + generalthrax: + - balance: Most common accessories now fit on pants + - rscadd: Exosuit Recharger machines are now available from cargo + - balance: Rust Reds on the blackmarket are now available to a maximum of 3 + zimon9: + - rscadd: Added fruit puree to vegan rations + - rscdel: Removed pizza crackers from vegan rations +2024-09-27: + Jedi-Toothpaste: + - rscadd: Firelocks to the Valor-Class' Doors + - rscadd: Lighting to dark areas on the Valor-Class' Doors + - rscadd: New areas on the Valor-Class to seperate rooms + - rscadd: Added APC for the Surgical Area + PositiveEntropy: + - imageadd: Adjusts the inner part of the normal rabbit ears. +2024-09-28: + Sadhorizon: + - rscadd: Added a fax machine to the Dwayne-class. + SomeguyManperson: + - bugfix: legion skulls will no longer check if they should rise up and consume + their owner if they are ownerless +2024-09-29: + fighterslam: + - balance: Modernizes and slightly buffs the Ranger. +2024-09-30: + Bjarl: + - rscdel: The Elephant Graveyard ruin has been taken out back + - bugfix: m90 posters are real again + FalloutFalcon: + - bugfix: sawnoff weapons made from init now function correctly + - bugfix: condiment packs are no longer invisible and missing names + MassiveMen: + - rscadd: Added the fire axe to the black market uplink + Thera-Pissed: + - rscadd: New wasteplanet ruin, the abandoned Miskilamo shipbreaking yard! diff --git a/icons/mob/species/human/rabbit.dmi b/icons/mob/species/human/rabbit.dmi index fcc6599f7356..26f0cb080d22 100644 Binary files a/icons/mob/species/human/rabbit.dmi and b/icons/mob/species/human/rabbit.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 403b198c179b..ec5f14748540 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/ammo_shotshells.dmi b/icons/obj/ammo_shotshells.dmi index fe37023686bd..55b00cdd0b21 100644 Binary files a/icons/obj/ammo_shotshells.dmi and b/icons/obj/ammo_shotshells.dmi differ diff --git a/shiptest.dme b/shiptest.dme index 9dcece1b986a..7a73c1f40a94 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -163,6 +163,7 @@ #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals\signals.dm" #include "code\__DEFINES\dcs\signals\signals_mod.dm" +#include "code\__DEFINES\dcs\signals\signals_reagent.dm" #include "code\__DEFINES\dcs\signals\signals_ship.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm" @@ -371,6 +372,7 @@ #include "code\controllers\subsystem\persistence.dm" #include "code\controllers\subsystem\physics.dm" #include "code\controllers\subsystem\ping.dm" +#include "code\controllers\subsystem\points_of_interest.dm" #include "code\controllers\subsystem\profiler.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" @@ -676,6 +678,7 @@ #include "code\datums\elements\lazy_fishing_spot.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\mobappearance.dm" +#include "code\datums\elements\point_of_interest.dm" #include "code\datums\elements\plant_backfire.dm" #include "code\datums\elements\renamemob.dm" #include "code\datums\elements\selfknockback.dm" @@ -861,6 +864,7 @@ #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" #include "code\game\area\areas\ruins\wasteplanet.dm" +#include "code\game\atom\atom_orbit.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" @@ -1388,6 +1392,8 @@ #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\cabinet.dm" +#include "code\game\objects\structures\cabinet_types.dm" #include "code\game\objects\structures\catwalk.dm" #include "code\game\objects\structures\crateshelf.dm" #include "code\game\objects\structures\curtains.dm" @@ -1401,7 +1407,6 @@ #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\false_walls.dm" #include "code\game\objects\structures\fence.dm" -#include "code\game\objects\structures\fireaxe.dm" #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" @@ -1485,6 +1490,7 @@ #include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" #include "code\game\objects\structures\crates_lockers\crates\bins.dm" #include "code\game\objects\structures\crates_lockers\crates\critter.dm" +#include "code\game\objects\structures\crates_lockers\crates\graves.dm" #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" @@ -3307,7 +3313,6 @@ #include "code\modules\ruins\icemoonruin_code\library.dm" #include "code\modules\ruins\icemoonruin_code\wrath.dm" #include "code\modules\ruins\lavalandruin_code\biodome_winter.dm" -#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm" #include "code\modules\ruins\lavalandruin_code\puzzle.dm" #include "code\modules\ruins\lavalandruin_code\surface.dm" #include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js deleted file mode 100644 index 91bf9d1f7929..000000000000 --- a/tgui/packages/tgui/interfaces/Orbit.js +++ /dev/null @@ -1,218 +0,0 @@ -import { createSearch } from 'common/string'; -import { multiline } from 'common/string'; -import { resolveAsset } from '../assets'; -import { useBackend, useLocalState } from '../backend'; -import { - Box, - Button, - Divider, - Flex, - Icon, - Input, - Section, -} from '../components'; -import { Window } from '../layouts'; - -const PATTERN_NUMBER = / \(([0-9]+)\)$/; - -const searchFor = (searchText) => - createSearch(searchText, (thing) => thing.name); - -const compareString = (a, b) => (a < b ? -1 : a > b); - -const compareNumberedText = (a, b) => { - const aName = a.name; - const bName = b.name; - - // Check if aName and bName are the same except for a number at the end - // e.g. Medibot (2) and Medibot (3) - const aNumberMatch = aName.match(PATTERN_NUMBER); - const bNumberMatch = bName.match(PATTERN_NUMBER); - - if ( - aNumberMatch && - bNumberMatch && - aName.replace(PATTERN_NUMBER, '') === bName.replace(PATTERN_NUMBER, '') - ) { - const aNumber = parseInt(aNumberMatch[1], 10); - const bNumber = parseInt(bNumberMatch[1], 10); - - return aNumber - bNumber; - } - - return compareString(aName, bName); -}; - -const BasicSection = (props, context) => { - const { act } = useBackend(context); - const { searchText, source, title } = props; - const things = source.filter(searchFor(searchText)); - things.sort(compareNumberedText); - return ( - source.length > 0 && ( - |