diff --git a/aurorastation.dme b/aurorastation.dme
index c1433a57a15..d4ffabf8571 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1418,6 +1418,7 @@
#include "code\modules\clothing\rings\rings.dm"
#include "code\modules\clothing\sets\acting_captain.dm"
#include "code\modules\clothing\sets\captain.dm"
+#include "code\modules\clothing\sets\laser_tag.dm"
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\jobs.dm"
#include "code\modules\clothing\shoes\magboots.dm"
diff --git a/code/__defines/armor.dm b/code/__defines/armor.dm
index df211842e9d..ddba38187b1 100644
--- a/code/__defines/armor.dm
+++ b/code/__defines/armor.dm
@@ -2,6 +2,7 @@
// Some levels are marked with what they intend to block in such way.
#define ARMOR_TYPE_STANDARD 1
#define ARMOR_TYPE_EXOSUIT 2
+#define ARMOR_TYPE_RIG 4
#define ARMOR_BALLISTIC_MINOR 10
#define ARMOR_BALLISTIC_SMALL 25
diff --git a/code/controllers/subsystems/chemistry.dm b/code/controllers/subsystems/chemistry.dm
index bc23c0106b0..4c6085b223c 100644
--- a/code/controllers/subsystems/chemistry.dm
+++ b/code/controllers/subsystems/chemistry.dm
@@ -87,8 +87,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry
initialize_codex_data()
var/pre_secret_len = chemical_reactions.len
log_ss("chemistry", "Found [pre_secret_len] reactions.")
- load_secret_chemicals()
- log_ss("chemistry", "Loaded [chemical_reactions.len - pre_secret_len] secret reactions.")
+ log_ss("chemistry", "Loaded [load_secret_chemicals()] secret reactions.")
initialize_specific_heats() // must be after reactions
..()
@@ -125,6 +124,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry
src.chemical_reactions = SSchemistry.chemical_reactions
/datum/controller/subsystem/chemistry/proc/load_secret_chemicals()
+ . = 0
var/list/chemconfig = list()
try
chemconfig = json_decode(return_file_text("config/secretchem.json"))
@@ -140,24 +140,24 @@ var/datum/controller/subsystem/chemistry/SSchemistry
cc.id = chemconfig[chemical]["id"]
cc.result = text2path(chemconfig[chemical]["result"])
cc.result_amount = chemconfig[chemical]["resultamount"]
- cc.required_reagents = chemconfig[chemical]["required_reagents"]
- if(!istype(cc.result, /decl/reagent))
+ if(!ispath(cc.result, /decl/reagent))
log_debug("SSchemistry: Warning: Invalid result [cc.result] in [cc.name] reactions list.")
qdel(cc)
break
- for(var/i in 1 to cc.required_reagents.len)
- var/A = text2path(cc.required_reagents[i])
- cc.required_reagents[i] = text2path(cc.required_reagents[i])
- if(!ispath(A, /decl/reagent))
- log_debug("SSchemistry: Warning: Invalid chemical [A] in [cc.name] required reagents list.")
+ for(var/key in chemconfig[chemical]["required_reagents"])
+ var/result_chem = text2path(key)
+ LAZYSET(cc.required_reagents, result_chem, chemconfig[chemical]["required_reagents"][key])
+ if(!ispath(result_chem, /decl/reagent))
+ log_debug("SSchemistry: Warning: Invalid chemical [key] in [cc.name] required reagents list.")
qdel(cc)
break
- if(LAZYLEN(cc.required_reagents))
+ if(LAZYLEN(cc?.required_reagents))
var/rtype = cc.required_reagents[1]
LAZYINITLIST(chemical_reactions[rtype])
chemical_reactions[rtype] += cc
+ .++
//Chemical Reactions - Initialises all /datum/chemical_reaction into a list
// It is filtered into multiple lists within a list.
diff --git a/code/datums/components/armor/armor.dm b/code/datums/components/armor/armor.dm
index d9ac8dafa7b..1c5b7ed24f7 100644
--- a/code/datums/components/armor/armor.dm
+++ b/code/datums/components/armor/armor.dm
@@ -16,10 +16,14 @@
// E.g. setting it to more than 1 will make mitigation drop off faster, effectively reducing the range of damage mitigation
var/over_armor_mult = 1
-/datum/component/armor/Initialize(list/armor)
+ var/sealed = FALSE // Used with ARMOR_TYPE_RIG.
+
+/datum/component/armor/Initialize(list/armor, armor_type)
..()
if(armor)
armor_values = armor.Copy()
+ if(armor_type)
+ armor_flags = armor_type
// Takes in incoming damage value
// Applies state changes to self, holder, and whatever else caused by damage mitigation
@@ -71,6 +75,9 @@
/datum/component/armor/proc/get_value(key)
if(isnull(armor_values[key]))
return 0
+ if(armor_flags & ARMOR_TYPE_RIG)
+ if(key == "bio" && sealed)
+ return 100
return min(armor_values[key], 100)
/datum/component/armor/proc/set_value(key, newval)
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 2a295520fdf..24c90b72af7 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -6,9 +6,9 @@ var/list/doppler_arrays = list()
icon = 'icons/obj/computer.dmi'
icon_state = "computer"
- anchored = 1
- density = 1
-
+ anchored = TRUE
+ density = TRUE
+ var/active = TRUE
/obj/machinery/doppler_array/Initialize()
. = ..()
@@ -19,6 +19,14 @@ var/list/doppler_arrays = list()
doppler_arrays -= src
return ..()
+/obj/machinery/doppler_array/examine(mob/user)
+ . = ..()
+ to_chat(user, SPAN_NOTICE("\The [src] is [active ? "listening for explosions" : "[SPAN_WARNING("inactive")]"]."))
+
+/obj/machinery/doppler_array/attack_hand(mob/user)
+ active = !active
+ to_chat(user, SPAN_NOTICE("\The [src] is now [active ? "listening for explosions" : "[SPAN_WARNING("inactive")]"]."))
+
/obj/machinery/doppler_array/update_icon()
icon_state = initial(icon_state)
set_light(0)
@@ -31,8 +39,8 @@ var/list/doppler_arrays = list()
add_overlay(image(icon, src, "teleport"))
/obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range)
- if(stat & NOPOWER) return
- if(z != z0) return
+ if(!active || (stat & NOPOWER) || z != z0)
+ return
var/dx = abs(x0-x)
var/dy = abs(y0-y)
@@ -55,8 +63,8 @@ var/list/doppler_arrays = list()
return
var/message = "Explosive disturbance detected - Epicenter at: grid ([x0],[y0],[z0]). Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range]."
- global_announcer.autosay(message, src.name)
+ global_announcer.autosay(message, "Tachyon-Doppler Array", "Science")
/obj/machinery/doppler_array/power_change()
..()
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 70f9dc7566d..4940afc7e20 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -218,9 +218,10 @@
if(!hascell(M))
return
+ if(!M.Move(src))
+ return
add_fingerprint(M)
M.reset_view(src)
- M.forceMove(src)
occupant = M
update_icon()
return 1
diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm
index 2d9f5eb7c56..ffbc64a38e6 100644
--- a/code/game/machinery/vending_types.dm
+++ b/code/game/machinery/vending_types.dm
@@ -88,6 +88,7 @@
/obj/item/reagent_containers/food/drinks/bottle/cola = 5,
/obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind = 5,
/obj/item/reagent_containers/food/drinks/bottle/space_up = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/hrozamal_soda = 2,
/obj/item/reagent_containers/food/drinks/cans/adhomai_milk = 2,
/obj/item/reagent_containers/food/drinks/cans/grape_juice = 6,
/obj/item/reagent_containers/food/drinks/cans/beetle_milk = 2,
@@ -272,7 +273,6 @@
/obj/item/reagent_containers/food/snacks/koisbar_clean = 4,
/obj/item/reagent_containers/food/snacks/candy/koko = 5,
/obj/item/reagent_containers/food/snacks/tuna = 2,
- /obj/item/reagent_containers/food/snacks/diona_bites = 3,
/obj/item/reagent_containers/food/snacks/ricetub = 2,
/obj/item/reagent_containers/food/snacks/riceball = 4,
/obj/item/reagent_containers/food/snacks/seaweed = 5
@@ -304,7 +304,6 @@
/obj/item/reagent_containers/food/snacks/koisbar_clean = 60,
/obj/item/reagent_containers/food/snacks/candy/koko = 40,
/obj/item/reagent_containers/food/snacks/tuna = 23,
- /obj/item/reagent_containers/food/snacks/diona_bites = 40,
/obj/item/reagent_containers/food/snacks/ricetub = 40,
/obj/item/reagent_containers/food/snacks/riceball = 15,
/obj/item/reagent_containers/food/snacks/seaweed = 20
@@ -331,7 +330,8 @@
/obj/item/reagent_containers/food/drinks/cans/iced_tea = 10,
/obj/item/reagent_containers/food/drinks/cans/grape_juice = 10,
/obj/item/reagent_containers/food/drinks/cans/koispunch = 5,
- /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 10
+ /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 10,
+ /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 10
)
contraband = list(
/obj/item/reagent_containers/food/drinks/cans/thirteenloko = 5,
@@ -354,7 +354,8 @@
/obj/item/reagent_containers/food/drinks/cans/iced_tea = 13,
/obj/item/reagent_containers/food/drinks/cans/grape_juice = 16,
/obj/item/reagent_containers/food/drinks/cans/koispunch = 50,
- /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 5
+ /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 5,
+ /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 35
)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = 'sound/machines/vending/vending_cans.ogg'
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 46704e8d9c7..18a4ec3b383 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -103,7 +103,7 @@
if(islist(armor))
for(var/type in armor)
if(armor[type])
- AddComponent(/datum/component/armor, armor, armor_degradation_speed)
+ AddComponent(/datum/component/armor, armor)
break
/obj/item/Destroy()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 7a00cb34994..c1d1e20d0f9 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -925,6 +925,13 @@
icon_state = "kittenplushie"
slot_flags = SLOT_HEAD
+/obj/item/toy/plushie/pennyplush
+ name = "Penny plush"
+ desc = "It's a plush of the beloved company mascot cat, Penny! For the price Nanotrasen sells these things at, you probably could have bought an actual cat."
+ icon_state = "pennyplushie"
+ slot_flags = SLOT_HEAD
+
+
/obj/item/toy/plushie/lizard
name = "lizard plush"
desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi."
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 228fedda602..2b994554431 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -205,10 +205,6 @@
drop_sound = 'sound/items/drop/bottle.ogg'
pickup_sound = 'sound/items/pickup/bottle.ogg'
-/obj/item/trash/diona_bites
- name = "dionae bites"
- icon_state = "dionaebitesempty"
-
/obj/item/trash/ricetub
name = "empty rice tub"
icon_state = "ricetub"
diff --git a/code/game/objects/items/weapons/storage/field_ration.dm b/code/game/objects/items/weapons/storage/field_ration.dm
index ef747a60675..5efd16acfca 100644
--- a/code/game/objects/items/weapons/storage/field_ration.dm
+++ b/code/game/objects/items/weapons/storage/field_ration.dm
@@ -30,7 +30,7 @@
if("NanoTrasen Sponsored")
new /obj/item/reagent_containers/food/snacks/liquidfood(src)
new /obj/item/reagent_containers/food/snacks/liquidfood(src)
- new /obj/item/reagent_containers/food/drinks/cans/sodawater(src)
+ new /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda(src)
desc += " This one has the NanoTrasen logo."
/obj/item/storage/field_ration/army
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index 74174128e33..e96f1fdd64b 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -43,33 +43,3 @@
new /obj/item/clothing/mask/luchador(src)
new /obj/item/clothing/mask/luchador/rudos(src)
new /obj/item/clothing/mask/luchador/tecnicos(src)
-
-
-/obj/structure/closet/lasertag/red
- name = "red laser tag equipment"
- desc = "It's a storage unit for laser tag equipment."
- icon_state = "red"
- icon_closed = "red"
-
-/obj/structure/closet/lasertag/red/fill()
- new /obj/item/clothing/ears/earmuffs(src)
- new /obj/item/clothing/ears/earmuffs(src)
- new /obj/item/gun/energy/lasertag/red(src)
- new /obj/item/gun/energy/lasertag/red(src)
- new /obj/item/clothing/suit/redtag(src)
- new /obj/item/clothing/suit/redtag(src)
-
-
-/obj/structure/closet/lasertag/blue
- name = "blue laser tag equipment"
- desc = "It's a storage unit for laser tag equipment."
- icon_state = "blue"
- icon_closed = "blue"
-
-/obj/structure/closet/lasertag/blue/fill()
- new /obj/item/clothing/ears/earmuffs(src)
- new /obj/item/clothing/ears/earmuffs(src)
- new /obj/item/gun/energy/lasertag/blue(src)
- new /obj/item/gun/energy/lasertag/blue(src)
- new /obj/item/clothing/suit/bluetag(src)
- new /obj/item/clothing/suit/bluetag(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index ee9e1c63cd4..71bd14f20c6 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -261,7 +261,7 @@
/obj/structure/bed/roller/attackby(obj/item/I, mob/user)
if(iswrench(I) || istype(I, /obj/item/stack) || iswirecutter(I))
return 1
- if(iv_stand && !beaker && istype(I, /obj/item/reagent_containers))
+ if(iv_stand && !beaker && (istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/blood)))
if(!user.unEquip(I, target = src))
return
to_chat(user, SPAN_NOTICE("You attach \the [I] to \the [src]."))
@@ -318,7 +318,7 @@
..()
if(use_check(usr) || !Adjacent(usr))
return
- if(!(ishuman(usr) || isrobot(usr)))
+ if(!ishuman(usr))
return
if(over_object == buckled && beaker)
if(iv_attached)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 26cc663ea21..1f90ba6b795 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -210,11 +210,12 @@
/obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location)
..()
- if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
- if(!ishuman(usr))
- return FALSE
- if(buckled)
- return FALSE
+ if(!ishuman(usr))
+ return FALSE
+ if(buckled)
+ return FALSE
+ if(!usr.Adjacent(src))
+ return FALSE
visible_message(SPAN_NOTICE("[usr] collapses [src]."))
var/obj/item/wheelchair/R = new(get_turf(src))
R.name = src.name
diff --git a/code/game/sound.dm b/code/game/sound.dm
index ffd6cd7139b..14c7ef8b139 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -502,6 +502,11 @@
'sound/effects/bodyfall4.ogg'
)
+/decl/sound_category/bodyfall_skrell_sound
+ sounds = list(
+ 'sound/effects/bodyfall_skrell1.ogg'
+ )
+
/decl/sound_category/bodyfall_machine_sound
sounds = list(
'sound/effects/bodyfall_machine1.ogg',
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 8eb94ee3f8e..c8664995f7d 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -15,6 +15,8 @@
roof_type = /turf/simulated/floor/airless/ceiling
+ baseturf = /turf/space
+
/turf/simulated/proc/wet_floor(var/apply_type = WET_TYPE_WATER, var/amount = 1)
//Wet type:
diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm
index 34ada832c7e..32d5b81355c 100644
--- a/code/modules/cargo/random_stock/t2_uncommon.dm
+++ b/code/modules/cargo/random_stock/t2_uncommon.dm
@@ -93,13 +93,11 @@ STOCK_ITEM_UNCOMMON(chempack, 5)
for (var/i in 1 to rand(2, 4))
var/obj/item/reagent_containers/chem_disp_cartridge/C = new /obj/item/reagent_containers/chem_disp_cartridge(L)
var/rname = pick(chems)
- var/decl/reagent/R = decls_repository.get_decl(rname)
-
//If we get a drink, reroll it once.
//Should result in a higher chance of getting medicines and chemicals
- if (istype(R, /decl/reagent/drink) || istype(R, /decl/reagent/alcohol))
+ if (ispath(rname, /decl/reagent/drink) || ispath(rname, /decl/reagent/alcohol))
rname = pick(chems)
- R = decls_repository.get_decl(rname)
+ var/decl/reagent/R = decls_repository.get_decl(rname)
C.reagents.add_reagent(rname, C.volume)
C.setLabel(R.name)
diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm
index d1e63fb721f..d1d64d172cd 100644
--- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm
@@ -231,7 +231,7 @@
/datum/gear/shoes/tajara/footwraps
display_name = "native tajaran foot-wear"
- path = /obj/item/clothing/shoes/tajara
+ path = /obj/item/clothing/shoes/tajara/footwraps
sort_category = "Xenowear - Tajara"
whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index b2bef7eba92..dbe0c5c4059 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -642,7 +642,7 @@ datum/preferences
job_engsec_med = 0
job_engsec_low = 0
- alternate_option = 0
+ alternate_option = 1
metadata = ""
organ_data = list()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a6ba99a0fb5..4b76e1a205e 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -251,11 +251,17 @@
for(var/number in list(melee_armor, bullet_armor, laser_armor, energy_armor, bomb_armor))
number = between(0, number, 100)
- armor["melee"] = melee_armor
- armor["bullet"] = bullet_armor
- armor["laser"] = laser_armor
- armor["energy"] = energy_armor
- armor["bomb"] = bomb_armor
+ var/datum/component/armor/armor_component = GetComponent(/datum/component/armor)
+ if(istype(armor_component))
+ armor_component.RemoveComponent()
+ var/list/armor_list = list(
+ melee = melee_armor,
+ bullet = bullet_armor,
+ laser = laser_armor,
+ energy = energy_armor,
+ bomb = bomb_armor
+ )
+ AddComponent(/datum/component/armor, armor_list)
if(!isnull(material.conductivity))
siemens_coefficient = between(0, material.conductivity / 10, 10)
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 2612fe5fa31..b603d7b1805 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -108,17 +108,20 @@
if (use_check_and_message(user))
return
+ do_flip(user)
+ update_clothing_icon()
+
+/obj/item/clothing/head/helmet/riot/proc/do_flip(var/mob/user)
if(icon_state == initial(icon_state))
- icon_state = "helm_riot_down"
- item_state = "helm_riot_down"
- to_chat(user, SPAN_NOTICE("You lower the visor on \the [src]."))
- body_parts_covered = HEAD|FACE|EYES
- else
- icon_state = initial(icon_state)
- item_state = initial(item_state)
+ icon_state = "[icon_state]-up"
+ item_state = icon_state
to_chat(user, SPAN_NOTICE("You raise the visor on \the [src]."))
body_parts_covered = HEAD
- update_clothing_icon()
+ else
+ icon_state = initial(icon_state)
+ item_state = icon_state
+ to_chat(user, SPAN_NOTICE("You lower the visor on \the [src]."))
+ body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/helmet/ablative
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index efb4fb0b8ba..bc1d9ffeee8 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -272,4 +272,4 @@
w_class = ITEMSIZE_SMALL
body_parts_covered = HEAD
attack_verb = list("warned", "cautioned", "smashed")
- armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
diff --git a/code/modules/clothing/sets/laser_tag.dm b/code/modules/clothing/sets/laser_tag.dm
new file mode 100644
index 00000000000..61069d2be82
--- /dev/null
+++ b/code/modules/clothing/sets/laser_tag.dm
@@ -0,0 +1,143 @@
+/*
+ Armor
+*/
+/obj/item/clothing/suit/armor/riot/laser_tag
+ name = "laser tag armor"
+ desc = "A set of laser tag armor. Very swanky."
+ desc_info = "You can alt-click this while holding or wearing it to set how many laser tag shots you want to be able to take before going down."
+ icon = 'icons/clothing/kit/laser_tag.dmi'
+ icon_state = "vest"
+ item_state = "vest"
+ contained_sprite = TRUE
+ blood_overlay_type = "armor"
+ body_parts_covered = UPPER_TORSO
+ slowdown = 0
+ armor = list( // still somewhat sturdy, but ultimately not very
+ melee = ARMOR_MELEE_MINOR,
+ laser = ARMOR_LASER_MINOR,
+ energy = ARMOR_ENERGY_MINOR
+ )
+ siemens_coefficient = 1.0
+ var/laser_tag_color = "red"
+
+ var/set_health = 3
+ var/current_health
+
+/obj/item/clothing/suit/armor/riot/laser_tag/Initialize(mapload, material_key)
+ . = ..()
+ get_tag_color(laser_tag_color)
+ current_health = set_health
+
+/obj/item/clothing/suit/armor/riot/laser_tag/AltClick(mob/user)
+ if(loc == user)
+ set_health = input(user, "Set the amount of shots you want your armour to take.", "Laser Armor", 3) as null|anything in list(1, 2, 3, 4, 5)
+ if(!set_health)
+ return
+ current_health = set_health
+ var/user_name = "Unknown User"
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/card/id/ID = H.GetIdCard()
+ user_name = ID.registered_name
+ var/list/num_to_word = list("one", "two", "three", "four", "five")
+ visible_message("[capitalize_first_letters(name)] says, \"[SPAN_NOTICE("[user_name] armor health set to [num_to_word[set_health]].")]\".")
+ return
+ return ..()
+
+/obj/item/clothing/suit/armor/riot/laser_tag/attackby(obj/item/I, mob/user)
+ if(I.ismultitool())
+ var/chosen_color = input(user, "Which color do you wish your vest to be?", "Color Selection") as null|anything in list("blue", "red")
+ if(!chosen_color)
+ return
+ laser_tag_color = chosen_color
+ get_tag_color(chosen_color)
+ to_chat(user, SPAN_NOTICE("\The [src] is now a [chosen_color] laser tag vest."))
+ return
+ return ..()
+
+/obj/item/clothing/suit/armor/riot/laser_tag/proc/laser_hit()
+ current_health--
+ if(current_health <= 0 && ismob(loc))
+ var/mob/M = loc
+ M.Weaken(5)
+ current_health = set_health
+
+/obj/item/clothing/suit/armor/riot/laser_tag/blue
+ laser_tag_color = "blue"
+
+/obj/item/clothing/head/helmet/riot/laser_tag
+ name = "laser tag helmet"
+ desc = "A helmet in the form of a riot helm, made for high-impact laser tag gameplay."
+ icon = 'icons/clothing/kit/laser_tag.dmi'
+ icon_state = "helmet"
+ item_state = "helmet"
+ contained_sprite = TRUE
+ armor = list( // still somewhat sturdy, but ultimately not very
+ melee = ARMOR_MELEE_MINOR,
+ laser = ARMOR_LASER_MINOR,
+ energy = ARMOR_ENERGY_MINOR
+ )
+ siemens_coefficient = 1.0
+ var/laser_tag_color = "red"
+
+/obj/item/clothing/head/helmet/riot/laser_tag/Initialize(mapload, material_key)
+ . = ..()
+ get_tag_color(laser_tag_color)
+
+/obj/item/clothing/head/helmet/riot/laser_tag/attackby(obj/item/I, mob/user)
+ if(I.ismultitool())
+ var/chosen_color = input(user, "Which color do you wish your helmet to be?", "Color Selection") as null|anything in list("blue", "red")
+ if(!chosen_color)
+ return
+ laser_tag_color = chosen_color
+ get_tag_color(chosen_color)
+ to_chat(user, SPAN_NOTICE("\The [src] is now a [chosen_color] laser tag helmet."))
+ return
+ return ..()
+
+/obj/item/clothing/head/helmet/riot/laser_tag/do_flip(mob/user)
+ if(item_state == initial(item_state))
+ item_state = "[item_state]-up"
+ else
+ item_state = initial(item_state)
+ ..()
+
+/obj/item/clothing/head/helmet/riot/laser_tag/blue
+ laser_tag_color = "blue"
+
+/*
+ Helpers
+*/
+/obj/item/clothing/proc/get_tag_color(var/set_color)
+ var/list/color_to_color = list("red" = COLOR_RED, "blue" = COLOR_BLUE)
+ color = color_to_color[set_color]
+ update_clothing_icon()
+
+
+/*
+ Closets
+*/
+/obj/structure/closet/lasertag
+ name = "red laser tag equipment"
+ desc = "It's a storage unit for laser tag equipment."
+ icon_state = "red"
+ icon_closed = "red"
+ var/helmet_path = /obj/item/clothing/head/helmet/riot/laser_tag
+ var/armor_path = /obj/item/clothing/suit/armor/riot/laser_tag
+ var/gun_path = /obj/item/gun/energy/lasertag/red
+
+/obj/structure/closet/lasertag/fill()
+ new /obj/item/device/multitool(src)
+ for(var/i = 1 to 3)
+ new helmet_path(src)
+ new armor_path(src)
+ new gun_path(src)
+ new /obj/item/clothing/ears/earmuffs(src)
+
+/obj/structure/closet/lasertag/blue
+ name = "blue laser tag equipment"
+ icon_state = "blue"
+ icon_closed = "blue"
+ helmet_path = /obj/item/clothing/head/helmet/riot/laser_tag/blue
+ armor_path = /obj/item/clothing/suit/armor/riot/laser_tag/blue
+ gun_path = /obj/item/gun/energy/lasertag/blue
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index a828d31ae32..22b4ae74261 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -166,7 +166,11 @@
piece.permeability_coefficient = permeability_coefficient
piece.unacidable = unacidable
piece.species_restricted = species_restricted
- if(islist(armor)) piece.armor = armor.Copy()
+ if(islist(armor))
+ var/datum/component/armor/armor_component = piece.GetComponent(/datum/component/armor)
+ if(istype(armor_component))
+ armor_component.RemoveComponent()
+ piece.AddComponent(/datum/component/armor, armor, ARMOR_TYPE_STANDARD|ARMOR_TYPE_RIG)
set_vision(!offline)
update_icon(1)
@@ -288,12 +292,9 @@
helmet.update_light(wearer)
//sealed pieces become airtight, protecting against diseases
- if (!seal_target)
- LAZYINITLIST(piece.armor)
- piece.armor["bio"] = 100
- else
- LAZYINITLIST(piece.armor)
- piece.armor["bio"] = LAZYACCESS(src.armor, "bio") || 0
+ var/datum/component/armor/armor_component = piece.GetComponent(/datum/component/armor)
+ if(istype(armor_component))
+ armor_component.sealed = !seal_target
playsound(src, "[!seal_target ? 'sound/machines/rig/rig_deploy.ogg' : 'sound/machines/rig/rig_retract.ogg']", 20, FALSE)
else
@@ -670,7 +671,7 @@
equip_to = slot_shoes
use_obj = boots
check_slot = wearer.shoes
- if(BP_CHEST)
+ if("chest")
equip_to = slot_wear_suit
use_obj = chest
check_slot = wearer.wear_suit
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 7157c3266b3..014b7e310df 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -33,7 +33,7 @@
armor = list(
melee = ARMOR_MELEE_VERY_HIGH,
bullet = ARMOR_BALLISTIC_AP,
- laser = ARMOR_LASER_MAJOR,
+ laser = ARMOR_LASER_RIFLES,
energy = ARMOR_ENERGY_STRONG,
bomb = ARMOR_BOMB_RESISTANT,
bio = ARMOR_BIO_SHIELDED,
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 7d05ea75036..6ec996a80e5 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -1,33 +1,9 @@
/*
* Contains:
- * Lasertag
* Costume
* Misc
*/
-/*
- * Lasertag
- */
-/obj/item/clothing/suit/bluetag
- name = "blue laser tag armor"
- desc = "Blue Pride, Station Wide."
- icon_state = "bluetag"
- item_state = "bluetag"
- blood_overlay_type = "armor"
- body_parts_covered = UPPER_TORSO
- allowed = list (/obj/item/gun/energy/lasertag/blue)
- siemens_coefficient = 1.0
-
-/obj/item/clothing/suit/redtag
- name = "red laser tag armor"
- desc = "Reputed to go faster."
- icon_state = "redtag"
- item_state = "redtag"
- blood_overlay_type = "armor"
- body_parts_covered = UPPER_TORSO
- allowed = list (/obj/item/gun/energy/lasertag/red)
- siemens_coefficient = 1.0
-
/*
* Costume
*/
@@ -576,7 +552,7 @@
w_class = ITEMSIZE_SMALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO
attack_verb = list("warned", "cautioned", "smashed")
- armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/caution/attack_self()
toggle()
diff --git a/code/modules/clothing/under/accessories/xeno/tajara.dm b/code/modules/clothing/under/accessories/xeno/tajara.dm
index 454a4ca1cd0..acd77c29f99 100644
--- a/code/modules/clothing/under/accessories/xeno/tajara.dm
+++ b/code/modules/clothing/under/accessories/xeno/tajara.dm
@@ -116,7 +116,7 @@
desc_fluff = "The Party of the Free Tajara under the Leadership of Hadii is the only and ruling party in the PRA, with its leader always being the elected president. \
They follow Hadiism as their main ideology, with the objective of securing the tajaran freedom and place in the galactic community. Membership of the Hadiist Party is not open. \
For anyone to become a member, they must be approved by a committee that will consider their qualifications and past. Goverment officials can grant honorary memberships, this is \
- seem as nothing but a honor and does not grant any status or position that a regular Party member would have."
+ seen as nothing but a honor and does not grant any status or position that a regular Party member would have."
w_class = ITEMSIZE_TINY
flippable = TRUE
v_flippable = FALSE
diff --git a/code/modules/cooking/machinery/cooking_machines/_appliance.dm b/code/modules/cooking/machinery/cooking_machines/_appliance.dm
index 91c83e0e5f0..b50640222e6 100644
--- a/code/modules/cooking/machinery/cooking_machines/_appliance.dm
+++ b/code/modules/cooking/machinery/cooking_machines/_appliance.dm
@@ -254,12 +254,11 @@
oilwork(J, CI)
for (var/_R in CI.container.reagents.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if (istype(R, /decl/reagent/nutriment))
+ if (ispath(_R, /decl/reagent/nutriment))
CI.max_cookwork += CI.container.reagents.reagent_volumes[_R] *2//Added reagents contribute less than those in food items due to granular form
//Nonfat reagents will soak oil
- if (!istype(R, /decl/reagent/nutriment/triglyceride))
+ if (!ispath(_R, /decl/reagent/nutriment/triglyceride))
CI.max_oil += CI.container.reagents.reagent_volumes[_R] * 0.25
else
CI.max_cookwork += CI.container.reagents.reagent_volumes[_R]
@@ -275,12 +274,11 @@
var/work = 0
if (istype(S) && S.reagents)
for (var/_R in S.reagents.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if (istype(R, /decl/reagent/nutriment))
+ if (ispath(_R, /decl/reagent/nutriment))
work += S.reagents.reagent_volumes[_R] *3//Core nutrients contribute much more than peripheral chemicals
//Nonfat reagents will soak oil
- if (!istype(R, /decl/reagent/nutriment/triglyceride))
+ if (!ispath(_R, /decl/reagent/nutriment/triglyceride))
CI.max_oil += S.reagents.reagent_volumes[_R] * 0.35
else
work += S.reagents.reagent_volumes[_R]
@@ -575,15 +573,15 @@
result.kitchen_tag = SA.kitchen_tag
if (SA.meat_amount)
reagent_amount = SA.meat_amount*9 // at a rate of 9 protein per meat
- var/decl/reagent/digest_product = victim.get_digestion_product()
+ var/digest_product_type = victim.get_digestion_product() // DOES NOT RETURN A DECL, RETURNS A PATH
var/list/data
var/meat_name = result.kitchen_tag || victim.name
if(ishuman(victim))
var/mob/living/carbon/human/CH = victim
meat_name = CH.species?.name || meat_name
- if(istype(digest_product, /decl/reagent/nutriment/protein))
+ if(ispath(digest_product_type, /decl/reagent/nutriment/protein))
data = list("[meat_name] meat" = reagent_amount)
- result.reagents.add_reagent(victim.get_digestion_product(), reagent_amount, data)
+ result.reagents.add_reagent(digest_product_type, reagent_amount, data)
if (victim.reagents)
victim.reagents.trans_to(result, victim.reagents.total_volume)
diff --git a/code/modules/cooking/machinery/cooking_machines/fryer.dm b/code/modules/cooking/machinery/cooking_machines/fryer.dm
index 25a4f7695ff..4de8faa54cd 100644
--- a/code/modules/cooking/machinery/cooking_machines/fryer.dm
+++ b/code/modules/cooking/machinery/cooking_machines/fryer.dm
@@ -102,10 +102,9 @@
for (var/obj/item/I in CI.container)
if (I.reagents && I.reagents.total_volume)
for (var/_R in I.reagents.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if (istype(R, /decl/reagent/nutriment/triglyceride/oil))
+ if (ispath(_R, /decl/reagent/nutriment/triglyceride/oil))
total_oil += I.reagents.reagent_volumes[_R]
- if (R.type != our_oil.type)
+ if (_R != our_oil.type)
total_removed += I.reagents.reagent_volumes[_R]
I.reagents.remove_reagent(_R, I.reagents.reagent_volumes[_R])
else
@@ -206,8 +205,7 @@
//So for now, restrict to oil only
var/amount = 0
for (var/_R in I.reagents.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if (istype(R, /decl/reagent/nutriment/triglyceride/oil))
+ if (ispath(_R, /decl/reagent/nutriment/triglyceride/oil))
var/delta = REAGENTS_FREE_SPACE(oil)
delta = min(delta, I.reagents.reagent_volumes[_R])
oil.add_reagent(_R, delta)
diff --git a/code/modules/cooking/recipes/recipe.dm b/code/modules/cooking/recipes/recipe.dm
index 0427336121f..c7e7d67e88b 100644
--- a/code/modules/cooking/recipes/recipe.dm
+++ b/code/modules/cooking/recipes/recipe.dm
@@ -37,7 +37,7 @@
var/list/reagents // example: = list(/decl/reagent/drink/berryjuice = 5) // do not list same reagent twice
var/list/items // example: = list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo
var/list/fruit // example: = list("fruit" = 3)
- var/decl/reagent/coating = null//Required coating on all items in the recipe. The default value of null explitly requires no coating
+ var/coating = null//Required coating on all items in the recipe. The default value of null explitly requires no coating
//A value of -1 is permissive and cares not for any coatings
//Any typepath indicates a specific coating that should be present
//Coatings are used for batter, breadcrumbs, beer-batter, colonel's secret coating, etc
@@ -172,7 +172,7 @@
if (coating == -1)
return TRUE //-1 value doesnt care
- return !coating || (S.coating.type == coating)
+ return !coating || (S.coating == coating)
//general version
/decl/recipe/proc/make(var/obj/container as obj)
diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm
index f10a8a8701a..e62977e2686 100644
--- a/code/modules/detectivework/tools/rag.dm
+++ b/code/modules/detectivework/tools/rag.dm
@@ -144,7 +144,7 @@
for(var/_R in reagents.reagent_volumes)
var/decl/reagent/R = decls_repository.get_decl(_R)
var/strength = R.germ_adjust * reagents.reagent_volumes[_R]/4
- if(istype(R, /decl/reagent/alcohol))
+ if(ispath(_R, /decl/reagent/alcohol))
var/decl/reagent/alcohol/A = R
strength = strength * (A.strength/100)
W.germ_level -= min(strength, W.germ_level)//Clean the wound a bit.
diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm
index e717a4542b7..9437d66ec39 100644
--- a/code/modules/events/infestation.dm
+++ b/code/modules/events/infestation.dm
@@ -116,7 +116,7 @@
chosen_mob_types += chosen_slime_type
if(INFESTATION_SPIDERLINGS)
- event_name = "Spiderling Infestation"
+ event_name = "Greimorian Infestation"
chosen_verb = "have burrowed into"
for(var/i = 1, i < rand(3,6),i++)
chosen_mob_types += /obj/effect/spider/spiderling
diff --git a/code/modules/heavy_vehicle/components/armor.dm b/code/modules/heavy_vehicle/components/armor.dm
index 0ad058d1b83..b3c2663c895 100644
--- a/code/modules/heavy_vehicle/components/armor.dm
+++ b/code/modules/heavy_vehicle/components/armor.dm
@@ -13,7 +13,7 @@
/obj/item/robot_parts/robot_component/armor/mech/Initialize()
. = ..()
- AddComponent(/datum/component/armor, armor, ARMOR_TYPE_EXOSUIT)
+ AddComponent(/datum/component/armor, armor, ARMOR_TYPE_STANDARD|ARMOR_TYPE_EXOSUIT)
/obj/item/robot_parts/robot_component/armor/mech/radproof
name = "radiation-proof armor plating"
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 2f8255cd6cb..9587526a4e7 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -114,7 +114,7 @@
dat += "
This sample contains: "
for(var/_R in grown_reagents.reagent_volumes)
var/decl/reagent/R = decls_repository.get_decl(_R)
- dat += "
- [R.name], [REAGENT_VOLUME(grown_reagents, R.type)] unit(s)"
+ dat += "
- [R.name], [REAGENT_VOLUME(grown_reagents, _R)] unit(s)"
dat += "
Other Data
"
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 5ecece3157f..289b98f4100 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -7,6 +7,7 @@
w_class = ITEMSIZE_SMALL
icon = 'icons/obj/assemblies/electronic_setups.dmi'
icon_state = "setup_small"
+ flags = NOBLUDGEON
var/max_components = IC_COMPONENTS_BASE
var/max_complexity = IC_COMPLEXITY_BASE
var/opened = 0
diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm
index cb82d8ac7a1..5052ea23b50 100644
--- a/code/modules/integrated_electronics/core/tools.dm
+++ b/code/modules/integrated_electronics/core/tools.dm
@@ -109,7 +109,7 @@
settings to specific circuits, or for debugging purposes. It can also pulse activation pins."
icon = 'icons/obj/assemblies/electronic_tools.dmi'
icon_state = "debugger"
- flags = CONDUCT
+ flags = CONDUCT | NOBLUDGEON
w_class = ITEMSIZE_SMALL
var/data_to_write = null
var/accepting_refs = 0
diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm
index 3059e12d6af..8349c1f4a21 100644
--- a/code/modules/item_worth/worths_list.dm
+++ b/code/modules/item_worth/worths_list.dm
@@ -502,8 +502,7 @@ var/list/worths = list(
/obj/item/clothing/suit/security/hos/dnavy = 80,
/obj/item/clothing/suit/storage/hazardvest = 60,
/obj/item/clothing/suit/storage/toggle/labcoat = 55,
- /obj/item/clothing/suit/bluetag = 20,
- /obj/item/clothing/suit/redtag = 20,
+ /obj/item/clothing/suit/armor/riot/laser_tag = 125,
/obj/item/clothing/suit/fire/heavy = 600,
/obj/item/clothing/suit/fire = 500,
/obj/item/clothing/suit/radiation = 450,
diff --git a/code/modules/makeshift/makeshift_reagents.dm b/code/modules/makeshift/makeshift_reagents.dm
index b5243d5d39a..5730e0aae1e 100644
--- a/code/modules/makeshift/makeshift_reagents.dm
+++ b/code/modules/makeshift/makeshift_reagents.dm
@@ -185,46 +185,48 @@
var/obj/item/weldingtool/welder
/obj/structure/distillery/dismantle()
- var/obj/structure/reagent_dispensers/keg/keg = new (loc)
- if (src.reagents && src.reagents.total_volume)
- src.reagents.trans_to_holder(keg.reagents, src.reagents.total_volume)
- new /obj/item/stack/rods(get_turf(src), 3)
+ var/turf/T = get_turf(src)
+ var/obj/structure/reagent_dispensers/keg/keg = new (T)
+ if (reagents?.total_volume)
+ reagents.trans_to_holder(keg.reagents, reagents.total_volume)
+ new /obj/item/stack/rods(T, 3)
if(welder)
- welder.forceMove(loc)
+ welder.forceMove(T)
welder = null
qdel(src)
/obj/structure/distillery/proc/trans_item(obj/item/W, mob/user)
if(transfer_out)
if(!reagents.total_volume)
- to_chat(user, SPAN_NOTICE("\The [src] is empty."))
+ to_chat(user, SPAN_NOTICE("[src] is empty."))
return
var/amt = reagents.trans_to_holder(W.reagents, reagents.total_volume)
- to_chat(user, SPAN_NOTICE("You fill \the [W] with [amt] units from \the [src]."))
+ to_chat(user, SPAN_NOTICE("You fill [W] with [amt] units from [src]."))
return
else
- if(!W.reagents || !W.reagents.total_volume)
- to_chat(user, SPAN_NOTICE("\The [W] is empty."))
+ if(!W.reagents?.total_volume)
+ to_chat(user, SPAN_NOTICE("[W] is empty."))
return
- var/amt = min(10, W.reagents.total_volume)
- W.reagents.trans_to_holder(src.reagents, amt) // just pour it if you can
- to_chat(user, SPAN_NOTICE("You pour [amt] units from \the [W] into \the [src]."))
+ var/amt = 5
+ if(istype(W, /obj/item/reagent_containers))
+ var/obj/item/reagent_containers/reagent_container = W
+ amt = reagent_container.amount_per_transfer_from_this
+ W.reagents.trans_to_holder(reagents, amt) // just pour it if you can
+ to_chat(user, SPAN_NOTICE("You pour [amt] units from [W] into [src]."))
return
/obj/structure/distillery/proc/distill()
- if(!reagents || !reagents.total_volume) // can't distill nothing
+ if(!reagents?.total_volume) // can't distill nothing
return
for(var/_R in reagents.reagent_volumes)
+ if(!ispath(_R, /decl/reagent/alcohol))
+ continue
var/decl/reagent/alcohol/AR = decls_repository.get_decl(_R)
- if(!istype(AR))
- return
- var/ARvol = REAGENT_VOLUME(reagents, AR.type)
- reagents.add_reagent(/decl/reagent/water, (1-(AR.strength/100))*ARvol)
- if(istype(AR, /decl/reagent/alcohol))
- reagents.add_reagent(/decl/reagent/alcohol, (AR.strength/100)*ARvol)
- else if(istype(AR, /decl/reagent/alcohol/butanol))
- reagents.add_reagent(/decl/reagent/alcohol/butanol, (AR.strength/100)*ARvol)
- reagents.remove_reagent(AR.type, ARvol)
+ var/ARvol = REAGENT_VOLUME(reagents, _R)
+ var/alcohol_fraction = AR.strength/100
+ reagents.add_reagent(/decl/reagent/water, (1-alcohol_fraction)*ARvol)
+ reagents.add_reagent(ispath(_R, /decl/reagent/alcohol/butanol) ? /decl/reagent/alcohol/butanol : /decl/reagent/alcohol, alcohol_fraction*ARvol)
+ reagents.remove_reagent(_R, ARvol)
icon_state = "distillery-off"
/obj/structure/distillery/attackby(obj/item/W, mob/user)
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index e9dcccd25b6..89aa8d138ef 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -67,6 +67,9 @@
new /datum/stack_recipe("custodial cart", /obj/structure/janitorialcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("closet", /obj/structure/closet, BUILD_AMT, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, BUILD_AMT, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, BUILD_AMT, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("plain comfy chair", /obj/structure/bed/chair/comfy, BUILD_AMT, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("sofa (middle)", /obj/structure/bed/chair/comfy/sofa, BUILD_AMT, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("sofa (left)", /obj/structure/bed/chair/comfy/sofa/left, BUILD_AMT, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("sofa (right)", /obj/structure/bed/chair/comfy/sofa/right, BUILD_AMT, one_per_turf = 1, on_floor = 1),
@@ -94,25 +97,6 @@
new /datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, BUILD_AMT, time = 50, one_per_turf = 1, on_floor = 1)
))
- recipes += new /datum/stack_recipe_list("office chairs",
- list(
- new /datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, BUILD_AMT, one_per_turf = 1, on_floor = 1)
- ))
-
- recipes += new /datum/stack_recipe_list("comfy chairs",
- list(
- new /datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, BUILD_AMT, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, BUILD_AMT, one_per_turf = 1, on_floor = 1)
- ))
-
recipes += new /datum/stack_recipe_list("turret frames",
list(
new /datum/stack_recipe("light turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1),
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index be609aadd2e..02016ea63a9 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -101,7 +101,7 @@
blinded = 1
silent = 0
else //ALIVE. LIGHTS ARE ON
- if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) )
+ if(!container && (health < config.health_threshold_dead || ((config.revival_brain_life != -1) && world.time - timeofhostdeath > config.revival_brain_life)))
death()
blinded = 1
silent = 0
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index d98317f8ca1..514316f5c89 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -146,8 +146,9 @@
//presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well
var/obj/item/clothing/head/helmet = get_equipped_item(slot_head)
if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.flags & STOPPRESSUREDAMAGE))
- //we don't do an armor_check here because this is not an impact effect like a weapon swung with momentum, that either penetrates or glances off.
- damage_mod = 1.0 - (LAZYACCESS(helmet.armor, "melee")/100)
+ var/datum/component/armor/armor_component = helmet.GetComponent(/datum/component/armor)
+ if(armor_component)
+ damage_mod -= armor_component.get_blocked(BRUTE, damage_flags, W.armor_penetration, W.force*1.5)
var/total_damage = 0
for(var/i in 1 to 3)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 4ec40811bde..52dcbe9823c 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -480,6 +480,8 @@
var/datum/gas_mixture/breath = H.get_breath_from_environment()
var/fail = L.handle_breath(breath, 1)
if(!fail)
+ if(!L.is_bruised())
+ losebreath = 0
to_chat(src, "You feel a breath of fresh air enter your lungs. It feels good.")
cpr(H) //Again.
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index d9e15e8b585..fb4daec6c3a 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -148,12 +148,13 @@
var/turf/T = loc
var/footsound
var/top_layer = 0
- for(var/obj/structure/S in T)
- if(S.layer > top_layer && S.footstep_sound)
- top_layer = S.layer
- footsound = S.footstep_sound
- if(!footsound)
- footsound = T.footstep_sound
+ if(istype(T))
+ for(var/obj/structure/S in T)
+ if(S.layer > top_layer && S.footstep_sound)
+ top_layer = S.layer
+ footsound = S.footstep_sound
+ if(!footsound)
+ footsound = T.footstep_sound
if (client)
var/turf/B = GetAbove(T)
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index 3944d52343b..fd9ad41a6d9 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -766,7 +766,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
/datum/species/golem/uranium/handle_environment_special(var/mob/living/carbon/human/H)
if(prob(25))
for(var/mob/living/L in view(7, H))
- L.apply_damage(150, IRRADIATE, damage_flags = DAM_DISPERSED)
+ L.apply_damage(20, IRRADIATE, damage_flags = DAM_DISPERSED)
/datum/species/golem/homunculus
name = SPECIES_GOLEM_MEAT
diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm
index f97fce081b5..eb15c7427d3 100644
--- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm
+++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm
@@ -10,7 +10,7 @@
grab_mod = 1
blurb = "IPCs with humanlike properties. Their focus is on service, civilian, and medical, but there are no \
- job restrictions. Created in the late days of 2457, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \
+ job restrictions. Created in the late days of 2450, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \
to create an uncannily close approximation of the organic form. Early models of Shell had the advantage of being able to compose themselves of a wide \
variety of organic parts, but contemporary models have been restricted to a single species for the sake of prosthetic integrity. The additional weight of \
the synthskin on the original Hephaestus frame reduces the efficacy of the unit's already strained coolant systems, and increases charge consumption."
@@ -19,6 +19,7 @@
icobase = 'icons/mob/human_races/human/r_human.dmi'
deform = 'icons/mob/human_races/ipc/robotic.dmi'
+ preview_icon = 'icons/mob/human_races/ipc/shell_preview.dmi'
light_range = 0
light_power = 0
diff --git a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm
index 70c4d205db8..d0612bd3833 100644
--- a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm
+++ b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm
@@ -81,6 +81,7 @@
ACCENT_SILVERSUN, ACCENT_KONYAN, ACCENT_EUROPA)
zombie_type = SPECIES_ZOMBIE_SKRELL
+ bodyfall_sound = /decl/sound_category/bodyfall_skrell_sound
/datum/species/skrell/handle_post_spawn(mob/living/carbon/human/H)
..()
diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm
index f908079052a..ddf1e92f8e9 100644
--- a/code/modules/mob/living/carbon/taste.dm
+++ b/code/modules/mob/living/carbon/taste.dm
@@ -35,8 +35,8 @@ calculate text size per text.
var/decl/reagent/R = decls_repository.get_decl(_R)
if(!R.taste_mult)
continue
- if(R.type == /decl/reagent/nutriment)
- var/list/taste_data = REAGENT_DATA(src, R.type)
+ if(_R == /decl/reagent/nutriment)
+ var/list/taste_data = REAGENT_DATA(src, _R)
for(var/taste in taste_data)
if(taste in tastes)
tastes[taste] += taste_data[taste]
@@ -44,7 +44,7 @@ calculate text size per text.
tastes[taste] = taste_data[taste]
else
var/taste_desc = R.taste_description
- var/taste_amount = REAGENT_VOLUME(src, R.type) * R.taste_mult
+ var/taste_amount = REAGENT_VOLUME(src, _R) * R.taste_mult
if(R.taste_description in tastes)
tastes[taste_desc] += taste_amount
else
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index c463b6d33d1..ac8b2dd0ce9 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -161,7 +161,7 @@
if(length(message) >= 2 && is_language_prefix(prefix))
var/language_prefix = lowertext(copytext(message, 2, 4))
var/datum/language/L = language_keys[language_prefix]
- if(!L)
+ if(!L || !can_speak(L))
language_prefix = lowertext(copytext(message, 2, 3))
L = language_keys[language_prefix]
if(can_speak(L))
diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm
index 31faf8ca6dc..ae576998854 100644
--- a/code/modules/organs/internal/brain.dm
+++ b/code/modules/organs/internal/brain.dm
@@ -156,20 +156,17 @@
if(prob(damprob))
take_internal_damage(1)
if(prob(damprob))
- take_internal_damage(2)
+ take_internal_damage(1)
..()
/obj/item/organ/internal/brain/take_internal_damage(var/damage, var/silent)
set waitfor = 0
- if(damage >= (max_damage / 4))
- damage *= 2
..()
if(damage >= (max_damage / 5)) //This probably won't be triggered by oxyloss or mercury. Probably.
var/damage_secondary = damage * 0.20
owner.eye_blurry += damage_secondary
owner.confused += damage_secondary * 2
owner.Weaken(round(damage_secondary * 3, 1))
- owner.adjustOxyLoss(damage)
if(prob(30))
addtimer(CALLBACK(src, .proc/brain_damage_callback, damage), rand(6, 20) SECONDS, TIMER_UNIQUE)
diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm
index 8705083be4b..b638b46e69c 100644
--- a/code/modules/organs/internal/lungs.dm
+++ b/code/modules/organs/internal/lungs.dm
@@ -1,5 +1,4 @@
#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
-#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average
/obj/item/organ/internal/lungs
name = "lungs"
@@ -67,7 +66,7 @@
"You can't breathe!",
"You hear someone gasp for air!",
)
- owner.losebreath += round(damage/2)
+ owner.losebreath = max(round(damage / 2), owner.losebreath)
if(rescued)
if(is_bruised())
@@ -377,4 +376,3 @@
rescued = FALSE
#undef HUMAN_MAX_OXYLOSS
-#undef HUMAN_CRIT_MAX_OXYLOSS
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 7486b2a9d74..d9cf814b36a 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -13,6 +13,7 @@
var/vital //Lose a vital limb, die immediately.
var/rejecting // Is this organ already being rejected?
var/is_augment = FALSE
+ var/death_time
//Organ damage stats.
var/damage = 0 // amount of damage to the organ
@@ -128,6 +129,7 @@
return
damage = max_damage
status |= ORGAN_DEAD
+ death_time = world.time
STOP_PROCESSING(SSprocessing, src)
if(owner && vital)
owner.death()
@@ -141,8 +143,9 @@
/obj/item/organ/proc/can_feel_pain()
return (!BP_IS_ROBOTIC(src) && (!species || !(species.flags & NO_PAIN)))
+#define ORGAN_RECOVERY_THRESHOLD (5 MINUTES)
/obj/item/organ/proc/can_recover()
- return max_damage > 0
+ return (max_damage > 0) && !(status & ORGAN_DEAD) || death_time >= world.time - ORGAN_RECOVERY_THRESHOLD
/obj/item/organ/process()
if(loc != owner)
diff --git a/code/modules/power/lights/fixtures.dm b/code/modules/power/lights/fixtures.dm
index 0cf70217b15..b8060647d30 100644
--- a/code/modules/power/lights/fixtures.dm
+++ b/code/modules/power/lights/fixtures.dm
@@ -225,7 +225,7 @@
active_power_usage = ((light_range * light_power) * 10)
/obj/machinery/light/proc/broken_sparks()
- if(world.time > next_spark && has_power())
+ if(world.time > next_spark && !(stat & POWEROFF) && has_power())
spark(src, 3, alldirs)
next_spark = world.time + 1 MINUTE + (rand(-15, 15) SECONDS)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index c990ee22712..9f2aa18f12a 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -211,41 +211,55 @@ obj/item/gun/energy/retro
/obj/item/gun/energy/lasertag
name = "laser tag gun"
+ desc = "A simple low-power laser gun, outfitted for use in laser tag arenas."
item_state = "laser"
has_item_ratio = FALSE
- desc = "Standard issue weapon of the Imperial Guard"
origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
- self_recharge = 1
+ self_recharge = TRUE
+ recharge_time = 2
matter = list(DEFAULT_WALL_MATERIAL = 2000)
fire_sound = 'sound/weapons/laser1.ogg'
- projectile_type = /obj/item/projectile/beam/lastertag/blue
- var/required_vest
+ projectile_type = /obj/item/projectile/beam/laser_tag
+ pin = /obj/item/device/firing_pin/tag/red
+ can_turret = TRUE
+ turret_is_lethal = FALSE
+ turret_sprite_set = "red"
-/obj/item/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
- if(ishuman(M))
- if(!istype(M.wear_suit, required_vest))
- to_chat(M, "You need to be wearing your laser tag vest!")
- return 0
+/obj/item/gun/energy/lasertag/attackby(obj/item/I, mob/user)
+ if(I.ismultitool())
+ var/chosen_color = input(user, "Which color do you wish your gun to be?", "Color Selection") as null|anything in list("blue", "red")
+ if(!chosen_color)
+ return
+ get_tag_color(chosen_color)
+ to_chat(user, SPAN_NOTICE("\The [src] is now a [chosen_color] laser tag gun."))
+ return
return ..()
+/obj/item/gun/energy/lasertag/proc/get_tag_color(var/set_color)
+ projectile_type = text2path("/obj/item/projectile/beam/laser_tag/[set_color]")
+ if(pin)
+ QDEL_NULL(pin)
+ var/pin_path = text2path("/obj/item/device/firing_pin/tag/[set_color]")
+ pin = new pin_path(src)
+ switch(set_color)
+ if("red")
+ icon = 'icons/obj/guns/redtag.dmi'
+ if("blue")
+ icon = 'icons/obj/guns/bluetag.dmi'
+ icon_state = "[set_color]tag"
+ item_state = icon_state
+ modifystate = item_state
+ update_held_icon()
+
/obj/item/gun/energy/lasertag/blue
icon = 'icons/obj/guns/bluetag.dmi'
icon_state = "bluetag"
item_state = "bluetag"
- projectile_type = /obj/item/projectile/beam/lastertag/blue
- required_vest = /obj/item/clothing/suit/bluetag
+ projectile_type = /obj/item/projectile/beam/laser_tag/blue
pin = /obj/item/device/firing_pin/tag/blue
- can_turret = 1
- turret_is_lethal = 0
turret_sprite_set = "blue"
/obj/item/gun/energy/lasertag/red
icon = 'icons/obj/guns/redtag.dmi'
icon_state = "redtag"
- item_state = "redtag"
- projectile_type = /obj/item/projectile/beam/lastertag/red
- required_vest = /obj/item/clothing/suit/redtag
- pin = /obj/item/device/firing_pin/tag/red
- can_turret = 1
- turret_is_lethal = 0
- turret_sprite_set = "red"
+ item_state = "redtag"
\ No newline at end of file
diff --git a/code/modules/projectiles/modular/laser_components.dm b/code/modules/projectiles/modular/laser_components.dm
index fb6a58635ff..41eb2cf4f4e 100644
--- a/code/modules/projectiles/modular/laser_components.dm
+++ b/code/modules/projectiles/modular/laser_components.dm
@@ -365,21 +365,21 @@
/obj/item/laser_components/modulator/red
name = "red team modulator"
desc = "Modulates the beam into firing red team tagger beams."
- projectile = /obj/item/projectile/beam/lastertag/red
+ projectile = /obj/item/projectile/beam/laser_tag
damage = 0
icon_state = "red"
/obj/item/laser_components/modulator/blue
name = "blue team modulator"
desc = "Modulates the beam into firing blue team tagger beams."
- projectile = /obj/item/projectile/beam/lastertag/blue
+ projectile = /obj/item/projectile/beam/laser_tag/blue
damage = 0
icon_state = "blue"
/obj/item/laser_components/modulator/omni
name = "omni team modulator"
desc = "Modulates the beam into firing omni team tagger beams."
- projectile = /obj/item/projectile/beam/lastertag/omni
+ projectile = /obj/item/projectile/beam/laser_tag/omni
damage = 0
icon_state = "omni"
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 21a68092f91..721f157f70d 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -181,28 +181,26 @@ Pins Below.
name = "laser tag firing pin"
desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
fail_message = "SUIT CHECK FAILED."
- var/obj/item/clothing/suit/suit_requirement = null
- var/tagcolor = ""
+ var/tag_color = ""
/obj/item/device/firing_pin/tag/pin_auth(mob/living/user)
if(ishuman(user))
- var/mob/living/carbon/human/M = user
- if(istype(M.wear_suit, suit_requirement))
- return 1
- to_chat(user, "You need to be wearing [tagcolor] laser tag armor!")
- return 0
+ var/mob/living/carbon/human/H = user
+ var/obj/item/clothing/suit/armor/riot/laser_tag/LT = H.wear_suit
+ if(istype(LT) && tag_color == LT.laser_tag_color)
+ return TRUE
+ to_chat(user, SPAN_WARNING("You need to be wearing [tag_color] laser tag armor!"))
+ return FALSE
/obj/item/device/firing_pin/tag/red
name = "red laser tag firing pin"
icon_state = "firing_pin_red"
- suit_requirement = /obj/item/clothing/suit/redtag
- tagcolor = "red"
+ tag_color = "red"
/obj/item/device/firing_pin/tag/blue
name = "blue laser tag firing pin"
icon_state = "firing_pin_blue"
- suit_requirement = /obj/item/clothing/suit/bluetag
- tagcolor = "blue"
+ tag_color = "blue"
/obj/item/device/firing_pin/Destroy()
if(gun)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index cb7750d7489..d6973236951 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -99,27 +99,7 @@
tracer_type = /obj/effect/projectile/tracer/emitter
impact_type = /obj/effect/projectile/impact/emitter
-/obj/item/projectile/beam/lastertag/blue
- name = "lasertag beam"
- icon_state = "bluelaser"
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 0
- no_attack_log = 1
- damage_type = BURN
- check_armor = "laser"
-
- muzzle_type = /obj/effect/projectile/muzzle/laser/blue
- tracer_type = /obj/effect/projectile/tracer/laser/blue
- impact_type = /obj/effect/projectile/impact/laser/blue
-
-/obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
- M.Weaken(5)
- return 1
-
-/obj/item/projectile/beam/lastertag/red
+/obj/item/projectile/beam/laser_tag
name = "lasertag beam"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -127,32 +107,38 @@
no_attack_log = 1
damage_type = BURN
check_armor = "laser"
+ var/laser_tag_color = "red"
-/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
- M.Weaken(5)
- return 1
+ muzzle_type = /obj/effect/projectile/muzzle/laser
+ tracer_type = /obj/effect/projectile/tracer/laser
+ impact_type = /obj/effect/projectile/impact/laser
-/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE
+/obj/item/projectile/beam/laser_tag/on_hit(var/atom/target, var/blocked = 0)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/clothing/suit/armor/riot/laser_tag/LT = H.wear_suit
+ if(istype(LT) && laser_tag_color != LT.laser_tag_color)
+ LT.laser_hit()
+ return TRUE
+
+/obj/item/projectile/beam/laser_tag/blue
+ name = "lasertag beam"
+ icon_state = "bluelaser"
+ laser_tag_color = "blue"
+
+ muzzle_type = /obj/effect/projectile/muzzle/laser/blue
+ tracer_type = /obj/effect/projectile/tracer/laser/blue
+ impact_type = /obj/effect/projectile/impact/laser/blue
+
+/obj/item/projectile/beam/laser_tag/omni//A laser tag bolt that stuns EVERYONE
name = "lasertag beam"
icon_state = "omnilaser"
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 0
- damage_type = BURN
- check_armor = "laser"
+ laser_tag_color = "omni"
muzzle_type = /obj/effect/projectile/muzzle/disabler
tracer_type = /obj/effect/projectile/tracer/disabler
impact_type = /obj/effect/projectile/impact/disabler
-/obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag)))
- M.Weaken(5)
- return 1
/obj/item/projectile/beam/sniper
name = "sniper beam"
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index e6b7a801dd0..c74e696bd50 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -385,7 +385,7 @@
var/turf/T = get_turf(mob)
if(T && (loc.z == T.z))
if(ishuman(mob))
- mob.apply_effect(450, IRRADIATE)
+ mob.apply_damage(250, IRRADIATE, damage_flags = DAM_DISPERSED)
new /obj/effect/temp_visual/nuke(A.loc)
explosion(A,2,5,9)
..()
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 4e8565cee50..7ffa1f2be3d 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -197,6 +197,7 @@
damage = 30
check_armor = "laser"
damage_type = BURN
+ damage_flags = DAM_LASER
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
muzzle_type = /obj/effect/projectile/muzzle/bolt
hit_effect = /obj/effect/temp_visual/blaster_effect
@@ -216,7 +217,6 @@
pass_flags = PASSTABLE
muzzle_type = /obj/effect/projectile/muzzle/bolt
-
/obj/item/projectile/energy/blaster/heavy
damage = 35
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index dab4244c99c..63b1098240a 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -330,6 +330,12 @@
/obj/item/stack/material/glass = list(/decl/reagent/silicate),
/obj/item/stack/material/glass/phoronglass = list(/decl/reagent/platinum, /decl/reagent/silicate, /decl/reagent/silicate, /decl/reagent/silicate), //5 platinum, 15 silicate,
)
+ var/list/beaker_types = list( // also can't be ground
+ /obj/item/reagent_containers/glass,
+ /obj/item/reagent_containers/food/drinks/drinkingglass,
+ /obj/item/reagent_containers/food/drinks/shaker,
+ /obj/item/reagent_containers/cooking_container
+ )
/obj/machinery/reagentgrinder/Initialize()
. = ..()
@@ -340,10 +346,7 @@
return
/obj/machinery/reagentgrinder/attackby(var/obj/item/O as obj, var/mob/user as mob)
-
- if (istype(O,/obj/item/reagent_containers/glass) || \
- istype(O,/obj/item/reagent_containers/food/drinks/drinkingglass) || \
- istype(O,/obj/item/reagent_containers/food/drinks/shaker))
+ if (is_type_in_list(O, beaker_types))
if (beaker)
return 1
else
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index b8d3c53d3a1..fae573002f1 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -705,7 +705,6 @@
if(alien != IS_DIONA)
if (caffeine)
M.add_up_to_chemical_effect(CE_SPEEDBOOST, caffeine)
- M.add_chemical_effect(CE_PULSE, 1)
M.dizziness = max(0, M.dizziness + adj_dizzy)
M.drowsyness = max(0, M.drowsyness + adj_drowsy)
M.sleeping = max(0, M.sleeping + adj_sleepy)
@@ -4513,6 +4512,19 @@
M.dizziness += 5
M.drowsyness = 0
+/decl/reagent/drink/hrozamal_soda
+ name = "Hro'zamal Soda"
+ description = "A cabornated version of the herbal tea made with Hro'zamal Ras'Nifs powder."
+ color = "#F0C56C"
+ adj_sleepy = -1
+ caffeine = 0.2
+ taste_description = "carbonated fruit sweetness"
+ carbonated = TRUE
+
+ glass_icon_state = "hrozamal_soda_glass"
+ glass_name = "glass of Hro'zamal Soda"
+ glass_desc = "A cabornated version of the herbal tea made with Hro'zamal Ras'Nifs powder."
+
/decl/reagent/nutriment/pumpkinpulp
name = "Pumpkin Pulp"
description = "The gooey insides of a slain pumpkin. This day is the greatest..."
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index 6c36549fc41..bfdf41fa37a 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -139,13 +139,11 @@
var/removing = (4 * removed)
var/datum/reagents/ingested = M.get_ingested_reagents()
for(var/_R in ingested.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if((remove_generic && istype(R, /decl/reagent/toxin)) || (_R in remove_toxins))
- ingested.remove_reagent(R.type, removing)
+ if((remove_generic && ispath(_R, /decl/reagent/toxin)) || (_R in remove_toxins))
+ ingested.remove_reagent(_R, removing)
return
for(var/_R in M.reagents.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if((remove_generic && istype(R, /decl/reagent/toxin)) || (_R in remove_toxins))
+ if((remove_generic && ispath(_R, /decl/reagent/toxin)) || (_R in remove_toxins))
M.reagents.remove_reagent(_R, removing)
return
@@ -605,10 +603,9 @@
var/datum/reagents/ingested = M.get_ingested_reagents()
if(ingested)
for(var/_R in ingested.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if(istype(R, /decl/reagent/alcohol))
+ if(ispath(_R, /decl/reagent/alcohol))
var/amount = min(P, REAGENT_VOLUME(ingested, _R))
- ingested.remove_reagent(R.type, amount)
+ ingested.remove_reagent(_R, amount)
P -= amount
if (P <= 0)
return
@@ -617,8 +614,7 @@
//as a treatment option if someone was dumb enough to do this
if(M.bloodstr)
for(var/_R in M.bloodstr.reagent_volumes)
- var/decl/reagent/R = decls_repository.get_decl(_R)
- if(istype(R, /decl/reagent/alcohol))
+ if(ispath(_R, /decl/reagent/alcohol))
var/amount = min(P, REAGENT_VOLUME(M.bloodstr, _R))
M.bloodstr.remove_reagent(_R, amount)
P -= amount
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 247131ae47c..270fc89ea06 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -79,12 +79,17 @@
qdel(src)
/obj/item/reagent_containers/attackby(var/obj/item/W, var/mob/user)
+ if(istype(W, /obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/dipped = W
+ dipped.attempt_apply_coating(src, user)
+ return
if(!(W.flags & NOBLUDGEON) && (user.a_intent == I_HURT) && fragile && (W.force > fragile))
if(do_after(user, 10))
if(!QDELETED(src))
visible_message(SPAN_WARNING("[user] smashes [src] with \a [W]!"))
user.do_attack_animation(src)
shatter(W, user)
+ return
..()
/obj/item/reagent_containers/attack(mob/M, mob/user, def_zone)
diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm
index b120b33bba4..5e553e7efb8 100644
--- a/code/modules/reagents/reagent_containers/food/cans.dm
+++ b/code/modules/reagents/reagent_containers/food/cans.dm
@@ -451,3 +451,14 @@
icon_state = "three_towns_cider"
center_of_mass = list("x"=16, "y"=10)
reagents_to_add = list(/decl/reagent/alcohol/butanol/threetownscider = 30)
+
+/obj/item/reagent_containers/food/drinks/cans/hrozamal_soda
+ name = "Hro'zamal Soda"
+ desc = "A can of Hro'zamal Soda. Made with Hro'zamal Ras'Nifs powder and canned in the People's Republic of Adhomai."
+ desc_fluff = "Hro'zamal Soda is a soft drink made from the seed's powder of a plant native to Hro'zamal, the sole Hadiist colony. While initially consumed as a herbal tea by the \
+ colonists, it was introduced to Adhomai by the Army Expeditionary Force and transformed into a carbonated drink. The beverage is popular with factory workers and university \
+ students because of its stimulant effect."
+ icon_state = "hrozamal_soda_can"
+ center_of_mass = list("x"=16, "y"=10)
+
+ reagents_to_add = list(/decl/reagent/drink/hrozamal_soda = 30)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index 02088c8e9c5..92f2b8c67f9 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -433,6 +433,17 @@
shatter_material = MATERIAL_PLASTIC
fragile = 0
+/obj/item/reagent_containers/food/drinks/bottle/hrozamal_soda
+ name = "Hro'zamal Soda"
+ desc = "A bottle of Hro'zamal Soda. Made with Hro'zamal Ras'Nifs powder and bottled in the People's Republic of Adhomai."
+ desc_fluff = "Hro'zamal Soda is a soft drink made from the seed's powder of a plant native to Hro'zamal, the sole Hadiist colony. While initially consumed as a herbal tea by the \
+ colonists, it was introduced to Adhomai by the Army Expeditionary Force and transformed into a carbonated drink. The beverage is popular with factory workers and university \
+ students because of its stimulant effect."
+ icon_state = "hrozamal_soda_bottle"
+ center_of_mass = list("x"=16, "y"=5)
+ reagents_to_add = list(/decl/reagent/drink/hrozamal_soda = 100)
+ fragile = FALSE
+
/obj/item/reagent_containers/food/drinks/bottle/pwine
name = "Chip Getmore's Velvet"
desc = "What a delightful packaging for a surely high quality wine! The vintage must be amazing!"
diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm
index 3bc5d79c334..7d014a7a29b 100644
--- a/code/modules/reagents/reagent_containers/food/lunch.dm
+++ b/code/modules/reagents/reagent_containers/food/lunch.dm
@@ -65,7 +65,8 @@ var/list/lunchables_drinks_ = list(
/obj/item/reagent_containers/food/drinks/cans/tonic,
/obj/item/reagent_containers/food/drinks/cans/sodawater,
/obj/item/reagent_containers/food/drinks/cans/adhomai_milk,
- /obj/item/reagent_containers/food/drinks/cans/beetle_milk
+ /obj/item/reagent_containers/food/drinks/cans/beetle_milk,
+ /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda
)
// This default list is a bit different, it contains items we don't want
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 64c40bdd51d..15c804a7a7e 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -11,7 +11,7 @@
var/slices_num
var/dried_type = null
var/dry = 0
- var/decl/reagent/nutriment/coating/coating = null
+ var/coating = null // coating typepath, NOT decl
var/icon/flat_icon = null //Used to cache a flat icon generated from dipping in batter. This is used again to make the cooked-batter-overlay
var/do_coating_prefix = TRUE
//If 0, we wont do "battered thing" or similar prefixes. Mainly for recipes that include batter but have a special name
@@ -142,7 +142,8 @@
else
to_chat(user, SPAN_NOTICE("You know the item as [initial(name)], but a little piece of propped-up paper indicates it's \a [name]."))
if (coating)
- to_chat(user, SPAN_NOTICE("It's coated in [coating.name]!"))
+ var/decl/reagent/coating_reagent = decls_repository.get_decl(coating)
+ to_chat(user, SPAN_NOTICE("It's coated in [coating_reagent.name]!"))
if (bitecount==0)
return
else if (bitecount==1)
@@ -256,28 +257,35 @@
return ..()
//Code for dipping food in batter
-/obj/item/reagent_containers/food/snacks/afterattack(obj/O as obj, mob/user as mob, proximity)
- if(O.is_open_container() && !(istype(O, /obj/item/reagent_containers/food)) && proximity)
- for (var/r in O.reagents.reagent_volumes)
-
- var/decl/reagent/R = r
- if (istype(R, /decl/reagent/nutriment/coating))
- if (apply_coating(O.reagents, R, user))
- return TRUE
-
- return ..()
+/**
+ * Perform checks, then apply any applicable coatings.
+ *
+ * @param dip /obj The object to attempt to dip src into.
+ * @param user /mob The mob attempting to dip src into dip.
+ *
+ * @return TRUE if coating applied, FALSE otherwise
+ */
+/obj/item/reagent_containers/food/snacks/proc/attempt_apply_coating(obj/dip, mob/user)
+ if(!dip.is_open_container() || istype(dip, /obj/item/reagent_containers/food) || !Adjacent(user))
+ return
+ for (var/reagent_type in dip.reagents?.reagent_volumes)
+ if(!ispath(reagent_type, /decl/reagent/nutriment/coating))
+ continue
+ return apply_coating(dip.reagents, reagent_type, user)
//This proc handles drawing coatings out of a container when this food is dipped into it
-/obj/item/reagent_containers/food/snacks/proc/apply_coating(var/datum/reagents/holder, var/decl/reagent/nutriment/coating/C, var/mob/user)
+/obj/item/reagent_containers/food/snacks/proc/apply_coating(var/datum/reagents/holder, var/applied_coating, var/mob/user)
if (coating)
- to_chat(user, "The [src] is already coated in [coating.name]!")
+ var/decl/reagent/coating_reagent = decls_repository.get_decl(coating)
+ to_chat(user, "[src] is already coated in [coating_reagent.name]!")
return FALSE
+ var/decl/reagent/nutriment/coating/applied_coating_reagent = decls_repository.get_decl(applied_coating)
+
//Calculate the reagents of the coating needed
var/req = 0
for (var/r in reagents.reagent_volumes)
- var/decl/reagent/R = r
- if (istype(R, /decl/reagent/nutriment))
+ if (ispath(r, /decl/reagent/nutriment))
req += reagents.reagent_volumes[r] * 0.2
else
req += reagents.reagent_volumes[r] * 0.1
@@ -288,8 +296,8 @@
//the food has no reagents left, it's probably getting deleted soon
return FALSE
- if (holder.reagent_volumes[C.type] < req)
- to_chat(user, SPAN_WARNING("There's not enough [C.name] to coat the [src]!"))
+ if (holder.reagent_volumes[applied_coating] < req)
+ to_chat(user, SPAN_WARNING("There's not enough [applied_coating_reagent.name] to coat [src]!"))
return FALSE
//First make sure there's space for our batter
@@ -300,10 +308,10 @@
//Suck the coating out of the holder
holder.trans_to_holder(reagents, req)
- if (!REAGENT_VOLUME(reagents, C.type))
+ if (!REAGENT_VOLUME(reagents, applied_coating))
return
- coating = C
+ coating = applied_coating
//Now we have to do the witchcraft with masking images
//var/icon/I = new /icon(icon, icon_state)
@@ -312,7 +320,7 @@
var/icon/I = flat_icon
color = "#FFFFFF" //Some fruits use the color var. Reset this so it doesnt tint the batter
I.Blend(new /icon('icons/obj/food_custom.dmi', rgb(255,255,255)),ICON_ADD)
- I.Blend(new /icon('icons/obj/food_custom.dmi', coating.icon_raw),ICON_MULTIPLY)
+ I.Blend(new /icon('icons/obj/food_custom.dmi', applied_coating_reagent.icon_raw),ICON_MULTIPLY)
var/image/J = image(I)
J.alpha = 200
J.blend_mode = BLEND_OVERLAY
@@ -320,13 +328,14 @@
add_overlay(J)
if (user)
- user.visible_message(SPAN_NOTICE("[user] dips [src] into \the [coating.name]"), SPAN_NOTICE("You dip [src] into \the [coating.name]"))
+ user.visible_message(SPAN_NOTICE("[user] dips [src] into \the [applied_coating_reagent.name]"), SPAN_NOTICE("You dip [src] into \the [applied_coating_reagent.name]"))
return TRUE
//Called by cooking machines. This is mainly intended to set properties on the food that differ between raw/cooked
/obj/item/reagent_containers/food/snacks/proc/cook()
if (coating)
+ var/decl/reagent/nutriment/coating/our_coating = decls_repository.get_decl(coating)
var/list/temp = overlays.Copy()
for (var/i in temp)
if (istype(i, /image))
@@ -343,22 +352,20 @@
var/icon/I = flat_icon
color = "#FFFFFF" //Some fruits use the color var
I.Blend(new /icon('icons/obj/food_custom.dmi', rgb(255,255,255)),ICON_ADD)
- I.Blend(new /icon('icons/obj/food_custom.dmi', coating.icon_cooked),ICON_MULTIPLY)
+ I.Blend(new /icon('icons/obj/food_custom.dmi', our_coating.icon_cooked),ICON_MULTIPLY)
var/image/J = image(I)
J.alpha = 200
J.tag = "coating"
add_overlay(J)
if (do_coating_prefix == 1)
- name = "[coating.coated_adj] [name]"
+ name = "[our_coating.coated_adj] [name]"
for (var/r in reagents.reagent_volumes)
- var/decl/reagent/R = r
- if (istype(R, /decl/reagent/nutriment/coating))
- var/decl/reagent/nutriment/coating/C = R
+ if (ispath(r, /decl/reagent/nutriment/coating))
+ var/decl/reagent/nutriment/coating/C = decls_repository.get_decl(r)
LAZYINITLIST(reagents.reagent_data)
- LAZYINITLIST(reagents.reagent_data[r])
- reagents.reagent_data[r]["cooked"] = TRUE
+ LAZYSET(reagents.reagent_data[r], "cooked", TRUE)
C.name = C.cooked_name
// A proc for setting various flavors of the same type of food instead of creating new foods with the only difference being a flavor
@@ -938,25 +945,19 @@
do_coating_prefix = 0
bitesize = 2
reagents_to_add = list(/decl/reagent/nutriment/protein = 6, /decl/reagent/nutriment/coating/batter = 1.7, /decl/reagent/nutriment/triglyceride/oil = 1.5)
-
-/obj/item/reagent_containers/food/snacks/sausage/battered/Initialize()
- . = ..()
- coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter)
+ coating = /decl/reagent/nutriment/coating/batter
/obj/item/reagent_containers/food/snacks/jalapeno_poppers
name = "jalapeno popper"
- desc = "A battered, deep-fried chilli pepper"
+ desc = "A battered, deep-fried chili pepper"
icon_state = "popper"
filling_color = "#00AA00"
do_coating_prefix = 0
reagents_to_add = list(/decl/reagent/nutriment = 2, /decl/reagent/nutriment/coating/batter = 2, /decl/reagent/nutriment/triglyceride/oil = 2)
- reagent_data = list(/decl/reagent/nutriment = list("chilli pepper" = 2))
+ reagent_data = list(/decl/reagent/nutriment = list("chili pepper" = 2))
bitesize = 1
-
-/obj/item/reagent_containers/food/snacks/jalapeno_poppers/Initialize()
- . = ..()
- coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter)
+ coating = /decl/reagent/nutriment/coating/batter
/obj/item/reagent_containers/food/snacks/donkpocket
name = "Donk-pocket"
@@ -2313,7 +2314,7 @@
filling_color = "#702708"
center_of_mass = list("x"=15, "y"=9)
reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein = 3, /decl/reagent/capsaicin = 3, /decl/reagent/drink/tomatojuice = 2, /decl/reagent/hyperzine = 5)
- reagent_data = list(/decl/reagent/nutriment = list("chilli peppers" = 3))
+ reagent_data = list(/decl/reagent/nutriment = list("chili peppers" = 3))
bitesize = 5
/obj/item/reagent_containers/food/snacks/stew/bear
@@ -2380,7 +2381,7 @@
filling_color = "#EDDD00"
center_of_mass = list("x"=18, "y"=14)
reagents_to_add = list(/decl/reagent/nutriment = 8, /decl/reagent/nutriment/protein = 2, /decl/reagent/capsaicin = 2)
- reagent_data = list(/decl/reagent/nutriment = list("fresh fries" = 4, "cheese" = 2, "chilli peppers" = 2))
+ reagent_data = list(/decl/reagent/nutriment = list("fresh fries" = 4, "cheese" = 2, "chili peppers" = 2))
bitesize = 4
/obj/item/reagent_containers/food/snacks/friedmushroom
@@ -3200,7 +3201,7 @@
/obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize()
. = ..()
- coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter)
+ coating = /decl/reagent/nutriment/coating/batter
/obj/item/reagent_containers/food/snacks/pizzacrunchslice
name = "pizza crunch"
@@ -3211,10 +3212,7 @@
center_of_mass = list("x"=18, "y"=13)
reagents_to_add = list(/decl/reagent/nutriment = 5, /decl/reagent/nutriment/coating/batter = 2, /decl/reagent/nutriment/triglyceride/oil = 1)
reagent_data = list(/decl/reagent/nutriment = list("pizza crust" = 5))
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize()
- . = ..()
- coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter)
+ coating = /decl/reagent/nutriment/coating/batter
/obj/item/pizzabox
name = "pizza box"
@@ -3463,7 +3461,7 @@
reagents_to_add = list(/decl/reagent/nutriment = 3)
reagent_data = list(/decl/reagent/nutriment = list("uncooked dough" = 3))
filling_color = "#EDE0AF"
-
+
/obj/item/reagent_containers/food/snacks/doughslice
name = "dough slice"
desc = "A building block of an impressive dish."
@@ -3516,7 +3514,7 @@
if ("rodent")
result = new /obj/item/reagent_containers/food/snacks/burger/mouse(src)
to_chat(user, "You make a ratburger!")
-
+
else if(istype(W,/obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/csandwich/roll/R = new(get_turf(src))
R.attackby(W,user)
@@ -3647,7 +3645,7 @@
reagents_to_add = list(/decl/reagent/nutriment = 3)
reagent_data = list(/decl/reagent/nutriment = list("uncooked potatos" = 3))
filling_color = "#EDF291"
-
+
/obj/item/reagent_containers/food/snacks/liquidfood
name = "LiquidFood ration"
desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy? Now with artificial flavoring!"
@@ -4056,7 +4054,7 @@
reagents_to_add = list(/decl/reagent/nutriment = 2)
reagent_data = list(/decl/reagent/nutriment = list("nacho chips" = 1))
filling_color = "#EDF291"
-
+
/obj/item/reagent_containers/food/snacks/chip/on_consume(mob/M as mob)
if(reagents && reagents.total_volume)
@@ -4224,7 +4222,7 @@
reagents_to_add = list(/decl/reagent/nutriment = 20)
reagent_data = list(/decl/reagent/nutriment = list("salsa" = 20))
filling_color = "#FF4D36"
-
+
/obj/item/reagent_containers/food/snacks/dip/guac
name = "guac dip"
desc = "A recreation of the ancient Sol 'Guacamole' dip using tofu, limes, and spices. This recreation obviously leaves out mole meat."
@@ -4474,7 +4472,7 @@
reagents_to_add = list(/decl/reagent/nutriment = 8)
reagent_data = list(/decl/reagent/nutriment = list("cheese toast" = 8))
filling_color = "#FFF97D"
-
+
/obj/item/reagent_containers/food/snacks/bacon_and_eggs
name = "bacon and eggs"
desc = "A piece of bacon and two fried eggs."
@@ -5015,13 +5013,3 @@
reagent_data = list(/decl/reagent/nutriment = list("diona delicacy" = 5))
reagents_to_add = list(/decl/reagent/nutriment = 8, /decl/reagent/drink/carrotjuice = 2, /decl/reagent/drink/potatojuice = 2, /decl/reagent/radium = 2)
filling_color = "#BD8939"
-
-/obj/item/reagent_containers/food/snacks/diona_bites
- name = "dionae bites"
- desc = "Freeze dried Dionae bites artfully crafted by Getmore chefs for that home cooked taste on the go!"
- icon_state = "dionaebites"
- reagent_data = list(/decl/reagent/nutriment = list("diona delicacy" = 5))
- reagents_to_add = list(/decl/reagent/nutriment = 6)
- trash = /obj/item/trash/diona_bites
- bitesize = 3
- filling_color = "#BD8939"
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 1d3639fbd7b..4b1c6028e6b 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -195,7 +195,7 @@
log_and_message_admins("shot a welding tank", Proj.firer)
log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).",ckey=key_name(Proj.firer))
- if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) && !istype(Proj ,/obj/item/projectile/kinetic))
+ if(!istype(Proj ,/obj/item/projectile/beam/laser_tag) && !istype(Proj ,/obj/item/projectile/beam/practice) && !istype(Proj ,/obj/item/projectile/kinetic))
ex_act(2.0)
/obj/structure/reagent_dispensers/fueltank/ex_act(var/severity = 3.0)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 52e3831820b..e70b2ae8ad4 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -638,7 +638,7 @@
if (hasmob && prob(3))
for(var/mob/living/H in src)
if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system,
- H.take_overall_damage(20, 0, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie
+ H.take_overall_damage(20, 0, DAM_SHARP, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie
var/obj/structure/disposalpipe/curr = loc
if (!loc)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index cbec0dccbbc..149db63495f 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -48,15 +48,15 @@
if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
tool_name = "regenerative membrane"
else if(istype(tool, /obj/item/stack/medical/bruise_pack))
- tool_name = "the bandaid"
+ tool_name = "some bandaids"
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/internal/I in affected.internal_organs)
- if(I && I.damage > 0 && !BP_IS_ROBOTIC(I))
+ if(I && I.damage > 0 && !BP_IS_ROBOTIC(I) && (!I.status & ORGAN_DEAD || I.can_recover()))
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
"You start treating damage to [target]'s [I.name] with [tool_name]." )
+ target.custom_pain("The pain in your [affected.name] is living hell!",100, affecting = affected)
- target.custom_pain("The pain in your [affected.name] is living hell!", 75)
..()
/decl/surgery_step/internal/fix_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -72,12 +72,20 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0 && !BP_IS_ROBOTIC(I))
- user.visible_message("[user] finishes applying [tool_name] to [target]'s [I.name].", \
- SPAN_NOTICE("You treat damage to [target]'s [I.name] with [tool_name].") )
+ if(I.status & ORGAN_DEAD && I.can_recover())
+ user.visible_message("\The [user] treats damage to [target]'s [I.name] with [tool_name], though it needs to be recovered further.", \
+ "You treat damage to [target]'s [I.name] with [tool_name], though it needs to be recovered further." )
+ else
+ user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \
+ "You treat damage to [target]'s [I.name] with [tool_name].")
I.surgical_fix(user)
+ user.visible_message("\The [user] finishes treating damage within \the [target]'s [affected.name] with [tool_name].", \
+ "You finish treating damage within \the [target]'s [affected.name] with [tool_name].")
var/obj/item/organ/internal/brain/sponge = target.internal_organs_by_name[BP_BRAIN]
if(sponge && istype(I, sponge))
target.cure_all_traumas(cure_type = CURE_SURGERY)
+ if(I.status & ORGAN_DEAD)
+ to_chat(user, SPAN_DANGER("This organ is still dead! You must remove the dead tissue with a scalpel!"))
/decl/surgery_step/internal/fix_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!ishuman(target))
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index a9766c68a8c..edeec246065 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -52,7 +52,7 @@
/decl/surgery_step/internal/fix_dead_tissue //Debridement
name = "Debride damaged tissue"
- priority = 3
+ priority = 4
allowed_tools = list(
/obj/item/surgery/scalpel = 100,
/obj/item/material/knife = 75,
@@ -77,7 +77,7 @@
break
if(!organ)
return
- if(organ.damage >= organ.max_damage)
+ if(organ.damage > organ.max_damage)
to_chat(user, SPAN_WARNING("\The [organ] is too damaged. Repair it first."))
return 0
@@ -105,6 +105,7 @@
user.visible_message(SPAN_NOTICE("[user] has cut away necrotic tissue from [target]'s [organ_to_fix.name] with \the [tool]."), \
SPAN_NOTICE("You have cut away necrotic tissue in [target]'s [organ_to_fix.name] with \the [tool]."))
organ_to_fix.status &= ~ORGAN_DEAD
+ organ_to_fix.heal_damage(10) //so that they don't insta-die again
/decl/surgery_step/internal/fix_dead_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -114,7 +115,7 @@
/decl/surgery_step/treat_necrosis
name = "Treat necrosis"
- priority = 2
+ priority = 4
allowed_tools = list(
/obj/item/reagent_containers/dropper = 100,
/obj/item/reagent_containers/glass/bottle = 75,
@@ -126,8 +127,8 @@
can_infect = FALSE
blood_level = 0
- min_duration = 50
- max_duration = 60
+ min_duration = 100
+ max_duration = 110
/decl/surgery_step/treat_necrosis/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!..())
diff --git a/code/unit_tests/chemistry_tests.dm b/code/unit_tests/chemistry_tests.dm
index 35fc755a910..51b89f9d2a5 100644
--- a/code/unit_tests/chemistry_tests.dm
+++ b/code/unit_tests/chemistry_tests.dm
@@ -15,7 +15,7 @@ datum/unit_test/specific_heat/start_test()
for(var/reagent in decls_repository.get_decls_of_subtype(/decl/reagent/))
var/decl/reagent/R = reagent
if(!SSchemistry.has_valid_specific_heat(R))
- log_unit_test("[ascii_red][R.type] lacks a proper specific heat value![ascii_reset]")
+ log_unit_test("[ascii_red][reagent] lacks a proper specific heat value![ascii_reset]")
error_count++
if(error_count)
diff --git a/config/example/secretchem.json b/config/example/secretchem.json
index a43bd9975fd..eb686317304 100644
--- a/config/example/secretchem.json
+++ b/config/example/secretchem.json
@@ -3,12 +3,12 @@
"superrine": {
"name": "super rine",
"id": "superrine",
- "result": "water",
+ "result": "/decl/reagent/water",
"resultamount": 60,
"required_reagents": {
- "water": 1,
- "sugar": 1
+ "/decl/reagent/water": 1,
+ "/decl/reagent/sugar": 1
}
}
}
-}
\ No newline at end of file
+}
diff --git a/html/changelog.html b/html/changelog.html
index c8100bf66e0..f3b9857f067 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -35,6 +35,103 @@
-->
+
07 March 2021
+
Flpfs updated:
+
+ - Changes the shell creation date in the IPC blurb to match the new lore.
+ - Adds an image for shells in the blurb preview.
+
+
Geeves updated:
+
+ - Fixed brains dying instantly when the head gets decapitated or the body explodes. This will give roboticists enough time to retrieve and borg them.
+ - Broken lights that have been turned off with a lightswitch no longer spark.
+ - Added helmets to the laser tag gear loadout.
+ - You can now alt-click laser tag armour to be able to set how many hits it will take before flooring you.
+ - You can now use a multitool on laser tag gear to change which colour it is and works against.
+ - Lowered the laser tag gun recharge rate to 4 seconds per shot, down from 8 seconds per shot.
+ - The Tachyon-Doppler Array outputs its results to the science channel instead of common, now.
+ - You can now toggle the doppler array's reporting on or off by clicking on it.
+ - Skrell now make a wet slapping noise when they fall over. Yeah.
+
+
TheGreyWolf updated:
+
+ - New characters now start with their preference set to return to lobby if all their job slots are taken.
+
+
+
06 March 2021
+
witchbells updated:
+
+ - Added a plushtoy of Penny. You're welcome.
+
+
+
05 March 2021
+
Alberyk updated:
+
+ - Reduced radiation damage caused by uranium golems.
+
+
Geeves updated:
+
+ - You can no longer build padded comfy chairs out of steel, comfy chairs are now built plain and require you to pad it with other materials, such as carpet or leather.
+ - Office chairs and comfy chairs have been collapsed into the miscellaneous construction tab in the steel sheet menu.
+
+
MattAtlas updated:
+
+ - Suffocating will no longer continuously apply losebreath. This is capped now, thus making recovery periods for suffocation much shorter.
+ - The necrotic (dead) organ surgery has been fixed. For internal organs, use a scalpel! Cancel out of the organ removal prompt and the surgery will begin.
+ - Wheelchairs no longer interact with the paranormal entities.
+ - CPR now removes losebreath, thus making it a convenient option if people aren't breathing.
+ - It is now obvious if the organ is dead following an organ repair surgery.
+ - Getting headshots no longer multiplies damage exponentially if the damage is extremely high.
+ - Headshots no longer make you lose breath.
+ - Organs now need necrotic surgery if they've been dead for over five minutes.
+ - The necrotic organ surgery is now longer, at about ten seconds. It also heals ten damage so that organs don't instantly die anymore.
+ - Slowed brain decay while in cardiac arrest.
+ - Non-glass (beakers, bottles) or non-bloodbag reagent containers may no longer be put onto roller beds.
+ - Coffee no longer applies CE_PULSE, which means you won't get spammed by heartbeat for having the audacity to drink it.
+
+
Yonnimer updated:
+
+
+
04 March 2021
+
Alberyk updated:
+
+ - Fixed jumping down disposals causing no damage.
+ - Destroying the station's floor won't create asteroid tiles anymore.
+
+
Alberyk, Canon35 updated:
+
+ - Added Hro'zamal Soda.
+
+
Carpe Venenum updated:
+
+ - You can now properly scan people with circuit debuggers and integrated circuit sensors.
+
+
MattAtlas updated:
+
+ - Lethal blaster bolts now correctly go through laser armor.
+ - Fixed rig armor suddenly disappearing upon being deployed.
+ - Fixed various wrong armor definitions.
+ - Fixed the unathi breacher having wrong armor values for laser defense.
+
+
MoondancerPony updated:
+
+ - Cooking containers are now acceptable containers for blenders, and also won't be ground up.
+ - Converts a lot of reagent decl istypes to ispaths, which might cause a speedup.
+ - Ya'ssa will now properly handle messages starting with S that have no space between it and the key.
+ - Native Tajaran footwear selected from the loadout will now spawn properly.
+ - Fixes makeshift distilleries.
+ - You can no longer charge remotely by abusing a wheelchair and a cyborg charger.
+ - Fixes batter.
+ - Batter is now applied by clicking a container with food in your hand.
+ - Secret chems now load properly.
+
+
WickedCybs updated:
+
+ - The spiderling infestation announcement now references greimorians.
+
+
03 March 2021
Carpe Venenum updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index b3424ec7833..645bb59193a 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -18674,3 +18674,91 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
it was previously not in line with the rest when it comes to colour.
- rscadd: Tajara can now pick from a selection of closed boots that aren't
toeless in their xenoware section. These are the black boots and workboots.
+2021-03-04:
+ Alberyk:
+ - bugfix: Fixed jumping down disposals causing no damage.
+ - tweak: Destroying the station's floor won't create asteroid tiles anymore.
+ Alberyk, Canon35:
+ - rscadd: Added Hro'zamal Soda.
+ Carpe Venenum:
+ - bugfix: You can now properly scan people with circuit debuggers and integrated
+ circuit sensors.
+ MattAtlas:
+ - bugfix: Lethal blaster bolts now correctly go through laser armor.
+ - bugfix: Fixed rig armor suddenly disappearing upon being deployed.
+ - bugfix: Fixed various wrong armor definitions.
+ - bugfix: Fixed the unathi breacher having wrong armor values for laser defense.
+ MoondancerPony:
+ - bugfix: Cooking containers are now acceptable containers for blenders, and also
+ won't be ground up.
+ - refactor: Converts a lot of reagent decl istypes to ispaths, which might cause
+ a speedup.
+ - bugfix: Ya'ssa will now properly handle messages starting with S that have
+ no space between it and the key.
+ - bugfix: Native Tajaran footwear selected from the loadout will now spawn properly.
+ - bugfix: Fixes makeshift distilleries.
+ - bugfix: You can no longer charge remotely by abusing a wheelchair and a cyborg
+ charger.
+ - bugfix: Fixes batter.
+ - tweak: Batter is now applied by clicking a container with food in your hand.
+ - bugfix: Secret chems now load properly.
+ WickedCybs:
+ - bugfix: The spiderling infestation announcement now references greimorians.
+2021-03-05:
+ Alberyk:
+ - tweak: Reduced radiation damage caused by uranium golems.
+ Geeves:
+ - tweak: You can no longer build padded comfy chairs out of steel, comfy chairs
+ are now built plain and require you to pad it with other materials, such as
+ carpet or leather.
+ - tweak: Office chairs and comfy chairs have been collapsed into the miscellaneous
+ construction tab in the steel sheet menu.
+ MattAtlas:
+ - bugfix: Suffocating will no longer continuously apply losebreath. This is capped
+ now, thus making recovery periods for suffocation much shorter.
+ - bugfix: The necrotic (dead) organ surgery has been fixed. For internal organs,
+ use a scalpel! Cancel out of the organ removal prompt and the surgery will begin.
+ - bugfix: Wheelchairs no longer interact with the paranormal entities.
+ - tweak: CPR now removes losebreath, thus making it a convenient option if people
+ aren't breathing.
+ - tweak: It is now obvious if the organ is dead following an organ repair surgery.
+ - balance: Getting headshots no longer multiplies damage exponentially if the damage
+ is extremely high.
+ - balance: Headshots no longer make you lose breath.
+ - balance: Organs now need necrotic surgery if they've been dead for over five
+ minutes.
+ - balance: The necrotic organ surgery is now longer, at about ten seconds. It also
+ heals ten damage so that organs don't instantly die anymore.
+ - balance: Slowed brain decay while in cardiac arrest.
+ - tweak: Non-glass (beakers, bottles) or non-bloodbag reagent containers may no
+ longer be put onto roller beds.
+ - tweak: Coffee no longer applies CE_PULSE, which means you won't get spammed
+ by heartbeat for having the audacity to drink it.
+ Yonnimer:
+ - rscdel: Removes diona bites.
+2021-03-06:
+ witchbells:
+ - rscadd: Added a plushtoy of Penny. You're welcome.
+2021-03-07:
+ Flpfs:
+ - tweak: Changes the shell creation date in the IPC blurb to match the new lore.
+ - tweak: Adds an image for shells in the blurb preview.
+ Geeves:
+ - bugfix: Fixed brains dying instantly when the head gets decapitated or the body
+ explodes. This will give roboticists enough time to retrieve and borg them.
+ - bugfix: Broken lights that have been turned off with a lightswitch no longer spark.
+ - rscadd: Added helmets to the laser tag gear loadout.
+ - rscadd: You can now alt-click laser tag armour to be able to set how many hits
+ it will take before flooring you.
+ - rscadd: You can now use a multitool on laser tag gear to change which colour it
+ is and works against.
+ - tweak: Lowered the laser tag gun recharge rate to 4 seconds per shot, down from
+ 8 seconds per shot.
+ - tweak: The Tachyon-Doppler Array outputs its results to the science channel instead
+ of common, now.
+ - rscadd: You can now toggle the doppler array's reporting on or off by clicking
+ on it.
+ - rscadd: Skrell now make a wet slapping noise when they fall over. Yeah.
+ TheGreyWolf:
+ - tweak: New characters now start with their preference set to return to lobby if
+ all their job slots are taken.
diff --git a/icons/clothing/kit/laser_tag.dmi b/icons/clothing/kit/laser_tag.dmi
new file mode 100644
index 00000000000..55c31e53fd5
Binary files /dev/null and b/icons/clothing/kit/laser_tag.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index cc748f562c4..289680d6a8d 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/ipc/shell_preview.dmi b/icons/mob/human_races/ipc/shell_preview.dmi
new file mode 100644
index 00000000000..b59f1bd3886
Binary files /dev/null and b/icons/mob/human_races/ipc/shell_preview.dmi differ
diff --git a/icons/mob/items/lefthand_toy.dmi b/icons/mob/items/lefthand_toy.dmi
index 98fcb6d54de..83716d0ca64 100644
Binary files a/icons/mob/items/lefthand_toy.dmi and b/icons/mob/items/lefthand_toy.dmi differ
diff --git a/icons/mob/items/righthand_toy.dmi b/icons/mob/items/righthand_toy.dmi
index 62c008e21d6..5e0760a66de 100644
Binary files a/icons/mob/items/righthand_toy.dmi and b/icons/mob/items/righthand_toy.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 7c179100063..aec5517b34c 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/drinks_empty.dmi b/icons/obj/drinks_empty.dmi
index 5f314f5f04d..76893ee7466 100644
Binary files a/icons/obj/drinks_empty.dmi and b/icons/obj/drinks_empty.dmi differ
diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi
index 1deb809a862..c1488a218d7 100644
Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 8e55d260d6e..86360883ac9 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index e5ef1b352cb..7419b7c891a 100644
Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ
diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm
index 84d3c5aeb9e..0b7d92758de 100644
--- a/maps/aurora/aurora-6_surface.dmm
+++ b/maps/aurora/aurora-6_surface.dmm
@@ -10253,7 +10253,7 @@
/turf/simulated/floor/plating,
/area/store)
"jiW" = (
-/obj/structure/closet/lasertag/red,
+/obj/structure/closet/lasertag,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
},
@@ -10261,10 +10261,6 @@
dir = 4;
pixel_x = -28
},
-/obj/item/gun/energy/lasertag/red,
-/obj/item/gun/energy/lasertag/red,
-/obj/item/clothing/suit/redtag,
-/obj/item/clothing/suit/redtag,
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/fitness/changing)
"jkk" = (
@@ -25005,10 +25001,6 @@
dir = 8;
icon_state = "tube1"
},
-/obj/item/gun/energy/lasertag/blue,
-/obj/item/gun/energy/lasertag/blue,
-/obj/item/clothing/suit/bluetag,
-/obj/item/clothing/suit/bluetag,
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/fitness/changing)
"wcR" = (
diff --git a/maps/aurora/code/aurora.dm b/maps/aurora/code/aurora.dm
index f9667d2f0d4..ebcf922d0d6 100644
--- a/maps/aurora/code/aurora.dm
+++ b/maps/aurora/code/aurora.dm
@@ -19,7 +19,7 @@
base_turf_by_z = list(
"1" = /turf/space,
"2" = /turf/space,
- "3" = /turf/space,
+ "3" = /turf/unsimulated/floor/asteroid/ash/rocky,
"4" = /turf/unsimulated/floor/asteroid/ash/rocky,
"5" = /turf/unsimulated/floor/asteroid/ash/rocky,
"6" = /turf/unsimulated/floor/asteroid/ash,
diff --git a/maps/exodus/exodus-1_station.dmm b/maps/exodus/exodus-1_station.dmm
index b71389c976b..7a08e3064cb 100644
--- a/maps/exodus/exodus-1_station.dmm
+++ b/maps/exodus/exodus-1_station.dmm
@@ -14218,7 +14218,7 @@
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/fitness)
"aBc" = (
-/obj/structure/closet/lasertag/red,
+/obj/structure/closet/lasertag,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
},
diff --git a/sound/effects/bodyfall_skrell1.ogg b/sound/effects/bodyfall_skrell1.ogg
new file mode 100644
index 00000000000..8baa5754143
Binary files /dev/null and b/sound/effects/bodyfall_skrell1.ogg differ