dy)
- distance = dx
- else
- distance = dy
- if(distance > explosion_detection_dist)
- return
- display_visor_message("Explosion detected! Epicenter radius: [devastation_range], Outer radius: [heavy_impact_range], Shockwave radius: [light_impact_range]")
-
-/obj/item/clothing/suit/space/hardsuit/rd
- name = "prototype hardsuit"
- desc = "A prototype suit that protects against hazardous, low pressure environments. Fitted with extensive plating for handling explosives and dangerous research materials."
- icon_state = "hardsuit-rd"
- item_state = "hardsuit-rd"
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure.
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector,
- /obj/item/hand_tele, /obj/item/aicard)
- armor = list(MELEE = 20, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = INFINITY, RAD = 75, FIRE = 75, ACID = 200)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd
-
-
- //Security
+//Security
/obj/item/clothing/head/helmet/space/hardsuit/security
name = "security hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
diff --git a/code/modules/clothing/suits/armor_suits.dm b/code/modules/clothing/suits/armor_suits.dm
index d4328ed99b60..846b5d033e9d 100644
--- a/code/modules/clothing/suits/armor_suits.dm
+++ b/code/modules/clothing/suits/armor_suits.dm
@@ -190,7 +190,7 @@
armor = list(MELEE = 50, BULLET = 35, LASER = 50, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = INFINITY, ACID = 450)
dog_fashion = null
resistance_flags = FIRE_PROOF
- allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/gun/energy, /obj/item/gun/projectile)
+ allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/fancy/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/gun/energy, /obj/item/gun/projectile)
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/suit.dmi',
@@ -626,9 +626,8 @@
for(var/atom/movable/AM in T)
thrown_atoms += AM
- for(var/am in thrown_atoms)
- var/atom/movable/AM = am
- if(AM == owner || AM.anchored)
+ for(var/atom/movable/AM as anything in thrown_atoms)
+ if(AM == owner || AM.anchored || (ismob(AM) && !isliving(AM)))
continue
var/throw_target = get_edge_target_turf(owner, get_dir(owner, get_step_away(AM, owner)))
diff --git a/code/modules/clothing/suits/job_suits.dm b/code/modules/clothing/suits/job_suits.dm
index 81da15db9d6e..4b3232679f5b 100644
--- a/code/modules/clothing/suits/job_suits.dm
+++ b/code/modules/clothing/suits/job_suits.dm
@@ -271,6 +271,7 @@
desc = "A big coat for the Head of Personnel who wants to make a fashion statement. Has armour woven within the fabric."
icon_state = "hopcoat"
item_state = "hopcoat"
+ allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton/telescopic, /obj/item/kitchen/knife/combat)
armor = list(MELEE = 15, BULLET = 10, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 50)
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/suit.dmi',
diff --git a/code/modules/clothing/suits/misc_suits.dm b/code/modules/clothing/suits/misc_suits.dm
index ae8646e5c70c..bfa4b04a399a 100644
--- a/code/modules/clothing/suits/misc_suits.dm
+++ b/code/modules/clothing/suits/misc_suits.dm
@@ -809,7 +809,7 @@
desc = "Aviators not included."
icon_state = "bomber"
item_state = "bomber"
- ignore_suitadjust = 0
+ ignore_suitadjust = FALSE
allowed = list(/obj/item/flashlight,/obj/item/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
@@ -818,7 +818,10 @@
adjust_flavour = "unzip"
sprite_sheets = list(
- "Vox" = 'icons/mob/clothing/species/vox/suit.dmi'
+ "Vox" = 'icons/mob/clothing/species/vox/suit.dmi',
+ "Drask" = 'icons/mob/clothing/species/drask/suit.dmi',
+ "Grey" = 'icons/mob/clothing/species/grey/suit.dmi',
+ "Kidan" = 'icons/mob/clothing/species/kidan/suit.dmi'
)
/obj/item/clothing/suit/jacket/varsity
@@ -870,22 +873,15 @@
desc = "A suspicious but extremely stylish jacket."
icon_state = "bombersyndie"
item_state = "bombersyndie"
- ignore_suitadjust = FALSE
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun, /obj/item/melee/classic_baton/telescopic/contractor, /obj/item/kitchen/knife/combat)
- body_parts_covered = UPPER_TORSO | LOWER_TORSO | ARMS
- cold_protection = UPPER_TORSO | LOWER_TORSO | ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- actions_types = list(/datum/action/item_action/zipper)
- adjust_flavour = "unzip"
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 30, ACID = 30)
/obj/item/clothing/suit/jacket/secbomber
name = "security bomber jacket"
- desc = "A stylish and worn-in armoured black bomber jacket emblazoned with the NT Security crest on the left breast. Looks rugged."
+ desc = "A stylish and worn-in armoured black bomber jacket emblazoned with a red stripe across the left. Looks rugged."
w_class = WEIGHT_CLASS_NORMAL
icon_state = "bombersec"
item_state = "bombersec"
- ignore_suitadjust = 0
//Inherited from Security armour.
allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat)
heat_protection = UPPER_TORSO|LOWER_TORSO
@@ -895,66 +891,84 @@
put_on_delay = 40
armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 20, ACID = 20)
//End of inheritance from Security armour.
- sprite_sheets = list(
- "Vox" = 'icons/mob/clothing/species/vox/suit.dmi',
- "Drask" = 'icons/mob/clothing/species/drask/suit.dmi',
- "Grey" = 'icons/mob/clothing/species/grey/suit.dmi'
- )
/obj/item/clothing/suit/jacket/engibomber
name = "engineering bomber jacket"
desc = "A stylish and warm jacket adorned with the colors of the humble Station Engineer."
icon_state = "bomberengi"
item_state = "bomberengi"
- ignore_suitadjust = 0
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 10, FIRE = 20, ACID = 40)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd, /obj/item/rpd)
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- actions_types = list(/datum/action/item_action/zipper)
- adjust_flavour = "unzip"
/obj/item/clothing/suit/jacket/atmosbomber
name = "atmospherics bomber jacket"
desc = "A stylish and warm jacket adorned with the colors of the magical Atmospherics Technician."
icon_state = "bomberatmos"
item_state = "bomberatmos"
- ignore_suitadjust = 0
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 10, FIRE = 20, ACID = 40)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/t_scanner, /obj/item/rcd, /obj/item/rpd)
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- actions_types = list(/datum/action/item_action/zipper)
- adjust_flavour = "unzip"
/obj/item/clothing/suit/jacket/cargobomber
name = "cargo bomber jacket"
desc = "A stylish jacket to keep you warm in the warehouse."
icon_state = "bombercargo"
item_state = "bombercargo"
- ignore_suitadjust = 0
allowed = list(/obj/item/rcs, /obj/item/clipboard, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/lighter, /obj/item/storage/fancy/cigarettes, /obj/item/storage/bag/mail, /obj/item/envelope)
- body_parts_covered = UPPER_TORSO | LOWER_TORSO | ARMS
- cold_protection = UPPER_TORSO | LOWER_TORSO | ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- actions_types = list(/datum/action/item_action/zipper)
- adjust_flavour = "unzip"
/obj/item/clothing/suit/jacket/miningbomber
name = "mining bomber jacket"
desc = "A slightly armoured and stylish jacket for shaft miners."
icon_state = "bombermining"
item_state = "bombermining"
- ignore_suitadjust = 0
allowed = list(/obj/item/pickaxe, /obj/item/t_scanner/adv_mining_scanner, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/energy/kinetic_accelerator, /obj/item/shovel, /obj/item/storage/bag/ore)
armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 0, ACID = 0)
- body_parts_covered = UPPER_TORSO | LOWER_TORSO | ARMS
- cold_protection = UPPER_TORSO | LOWER_TORSO | ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- actions_types = list(/datum/action/item_action/zipper)
- adjust_flavour = "unzip"
+
+/obj/item/clothing/suit/jacket/hydrobomber
+ name = "hydroponics bomber jacket"
+ desc = "A stylish choice for the workers of the hydroponics lab."
+ icon_state = "bomberhydro"
+ item_state = "bomberhydro"
+ allowed = list(/obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/hatchet, /obj/item/storage/bag/plants)
+
+/obj/item/clothing/suit/jacket/medbomber
+ name = "medical bomber jacket"
+ desc = "A stain-resistant and stylish option for any member of the medical department."
+ icon_state = "bombermed"
+ item_state = "bombermed"
+ allowed = list(/obj/item/bodyanalyzer, /obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper)
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 5, FIRE = 0, ACID = 20)
+
+/obj/item/clothing/suit/jacket/chembomber
+ name = "chemistry bomber jacket"
+ desc = "An exclusive and stylish variant of the medical bomber, for chemists only."
+ icon_state = "bomberchem"
+ item_state = "bomberchem"
+ allowed = list(/obj/item/reagent_scanner, /obj/item/reagent_scanner/adv, /obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper)
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, RAD = 0, FIRE = 0, ACID = 40)
+
+/obj/item/clothing/suit/jacket/coronerbomber
+ name = "coroner's bomber jacket"
+ desc = "An extremely exclusive and stylish jacket. Coroner's use only!"
+ icon_state = "bombercoroner"
+ item_state = "bombercoroner"
+ allowed = list(/obj/item/autopsy_scanner, /obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper)
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 5, FIRE = 0, ACID = 20)
+
+/obj/item/clothing/suit/jacket/scibomber
+ name = "science bomber jacket"
+ desc = "A stylish and slightly bomb-resistant jacket for warmth within the sterile labs."
+ icon_state = "bombersci"
+ item_state = "bombersci"
+ allowed = list(/obj/item/slime_scanner, /obj/item/reagent_scanner/adv, /obj/item/reagent_scanner, /obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper)
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, RAD = 0, FIRE = 0, ACID = 20)
+
+/obj/item/clothing/suit/jacket/robobomber
+ name = "robotics bomber jacket"
+ desc = "A stylish jacket to warm you up after handling cold robotic limbs."
+ icon_state = "bomberrobo"
+ item_state = "bomberrobo"
+ allowed = list(/obj/item/robotanalyzer, /obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper)
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, RAD = 0, FIRE = 0, ACID = 20)
/obj/item/clothing/suit/jacket/leather
name = "leather jacket"
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 4cb0098abffb..cc753c4d261b 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -469,13 +469,13 @@
else
to_chat(user, "You can't modify [target]!")
-
+// These two fluff items are commented out due to the transfer to MODsuits breaking these. Sprites are still in custom_items.dmi , but they need a resprite to work with MODsuits.
/obj/item/fluff/pyro_wintersec_kit //DarkLordpyro: Valthorne Haliber
name = "winter sec conversion kit"
desc = "A securirty hardsuit conversion kit."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
-
+/*
/obj/item/fluff/pyro_wintersec_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -521,14 +521,14 @@
H.update_inv_wear_suit()
return
to_chat(user, "You can't modify [target]!")
-
+*/
/obj/item/fluff/sylus_conversion_kit //Decemviri: Sylus Cain
name = "cerberus pattern conversion kit"
desc = "A securirty hardsuit conversion kit."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
-
+/*
/obj/item/fluff/sylus_conversion_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
@@ -581,7 +581,7 @@
to_chat(user, "You can't modify [target]!")
-
+*/
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 858f8ef45b0d..f2e6cc5bcf88 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -41,3 +41,4 @@
spawncount--
successSpawn = TRUE
+ SSevents.biohazards_this_round += "Xenomorphs"
diff --git a/code/modules/events/blob_spawn.dm b/code/modules/events/blob_spawn.dm
index 4220569f1208..9061bbbaf086 100644
--- a/code/modules/events/blob_spawn.dm
+++ b/code/modules/events/blob_spawn.dm
@@ -39,3 +39,4 @@
to_chat(B, "For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Blob)")
notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, action = NOTIFY_FOLLOW)
successSpawn = TRUE
+ SSevents.biohazards_this_round += "Blob"
diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm
index d8f33867b4b9..96d0252503a5 100644
--- a/code/modules/events/fake_virus.dm
+++ b/code/modules/events/fake_virus.dm
@@ -17,7 +17,7 @@
hypochondriac.apply_status_effect(STATUS_EFFECT_FAKE_VIRUS)
hypochondriac.create_log(MISC_LOG, "[hypochondriac] has contracted a fake virus.")
valid_targets -= hypochondriac
- notify_ghosts("[hypochondriac] now has a fake virus!")
+ notify_ghosts("[hypochondriac] now has a fake virus!", flashwindow = FALSE)
if(!length(valid_targets)) // List has been modified, lets check again
return
diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm
index 9f0d0a677a52..51f71526d24a 100644
--- a/code/modules/events/spider_terror.dm
+++ b/code/modules/events/spider_terror.dm
@@ -1,9 +1,4 @@
#define TS_HIGHPOP_TRIGGER 80
-#define GREEN_SPIDER 1
-#define PRINCE_SPIDER 2
-#define WHITE_SPIDER 3
-#define PRINCESS_SPIDER 4
-#define QUEEN_SPIDER 5
/datum/event/spider_terror
announceWhen = 240
@@ -28,27 +23,27 @@
var/spider_type
var/infestation_type
if((length(GLOB.clients)) < TS_HIGHPOP_TRIGGER)
- infestation_type = pick(GREEN_SPIDER, PRINCE_SPIDER, WHITE_SPIDER, PRINCESS_SPIDER)
+ infestation_type = pick(TS_INFESTATION_GREEN_SPIDER, TS_INFESTATION_PRINCE_SPIDER, TS_INFESTATION_WHITE_SPIDER, TS_INFESTATION_PRINCESS_SPIDER)
else
- infestation_type = pick(PRINCE_SPIDER, WHITE_SPIDER, PRINCESS_SPIDER, QUEEN_SPIDER)
+ infestation_type = pick(TS_INFESTATION_PRINCE_SPIDER, TS_INFESTATION_WHITE_SPIDER, TS_INFESTATION_PRINCESS_SPIDER, TS_INFESTATION_QUEEN_SPIDER)
switch(infestation_type)
- if(GREEN_SPIDER)
+ if(TS_INFESTATION_GREEN_SPIDER)
// Weakest, only used during lowpop.
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/green
spawncount = 5
- if(PRINCE_SPIDER)
+ if(TS_INFESTATION_PRINCE_SPIDER)
// Fairly weak. Dangerous in single combat but has little staying power. Always gets whittled down.
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/prince
spawncount = 1
- if(WHITE_SPIDER)
+ if(TS_INFESTATION_WHITE_SPIDER)
// Variable. Depends how many they infect.
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/white
spawncount = 2
- if(PRINCESS_SPIDER)
+ if(TS_INFESTATION_PRINCESS_SPIDER)
// Pretty strong.
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen/princess
spawncount = 3
- if(QUEEN_SPIDER)
+ if(TS_INFESTATION_QUEEN_SPIDER)
// Strongest, only used during highpop.
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
spawncount = 1
@@ -71,10 +66,6 @@
S.give_intro_text()
spawncount--
successSpawn = TRUE
+ SSevents.biohazards_this_round += infestation_type
#undef TS_HIGHPOP_TRIGGER
-#undef GREEN_SPIDER
-#undef PRINCE_SPIDER
-#undef WHITE_SPIDER
-#undef PRINCESS_SPIDER
-#undef QUEEN_SPIDER
diff --git a/code/modules/food_and_drinks/food/foods/frozen.dm b/code/modules/food_and_drinks/food/foods/frozen.dm
index d9c790827b77..069dfa297111 100644
--- a/code/modules/food_and_drinks/food/foods/frozen.dm
+++ b/code/modules/food_and_drinks/food/foods/frozen.dm
@@ -17,8 +17,10 @@
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "clowncake"
slice_path = /obj/item/reagent_containers/food/snacks/frozen/clowncakeslice
+ slices_num = 5
+ bitesize = 3
list_reagents = list("nutriment" = 20, "sugar" = 5, "vitamin" = 5, "banana" = 15)
- tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ tastes = list("cake" = 5, "sweetness" = 2, "banana" = 1, "sad clowns" = 1, "ice-cream" = 1)
/obj/item/reagent_containers/food/snacks/frozen/clowncakeslice
name = "clown cake slice"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 44c77a26e235..515af3acb849 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -409,8 +409,8 @@
for(var/obj/O in H)
if(isclothing(O)) //clothing gets skipped to avoid cleaning out shit
continue
- if(istype(O,/obj/item/implant))
- var/obj/item/implant/I = O
+ if(istype(O,/obj/item/bio_chip))
+ var/obj/item/bio_chip/I = O
if(I.implanted)
continue
if(O.flags & NODROP || stealthmode)
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index 6d90036f05f9..de80880e5712 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -451,14 +451,3 @@
return
if((user.mind.assigned_role == "Captain" || user.mind.special_role == SPECIAL_ROLE_NUKEOPS) && (user.Adjacent(src)))
. += "... Wait. This isn't the nuclear authentication disk! It's a clever forgery!"
-
-/*
- * Plant DNA Disks Box
- */
-/obj/item/storage/box/disks_plantgene
- name = "plant data disks box"
- icon_state = "disk_kit"
-
-/obj/item/storage/box/disks_plantgene/populate_contents()
- for(var/i in 1 to 7)
- new /obj/item/disk/plantgene(src)
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index 5365d90f81f8..451353bfc28f 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -146,7 +146,7 @@
/obj/item/wormhole_jaunter/contractor/proc/create_portal(turf/destination)
new /obj/effect/decal/cleanable/ash(get_turf(src))
- new /obj/effect/portal/redspace/getaway(get_turf(src), get_turf(destination), src, 100)
+ new /obj/effect/portal/advanced/getaway(get_turf(src), get_turf(destination), src, 100)
qdel(src)
/obj/item/wormhole_jaunter/contractor/emag_act(mob/user)
@@ -162,7 +162,7 @@
new /obj/item/wormhole_jaunter/contractor(src)
new /obj/item/radio/beacon/emagged(src)
-/obj/effect/portal/redspace/getaway
+/obj/effect/portal/advanced/getaway
one_use = TRUE
/obj/effect/temp_visual/getaway_flare // Because the original contractor flare is not a temp visual, for some reason.
@@ -210,7 +210,7 @@
playsound(src, 'sound/magic/lightningbolt.ogg', 100, TRUE)
qdel(src)
return
-
+
var/list/portal_turfs = list()
for(var/turf/PT in circleviewturfs(T, 3))
if(!PT.density)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 8e03c2e1e749..f96ea785af88 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -341,7 +341,7 @@
EQUIPMENT("Cigarettes", /obj/item/storage/fancy/cigarettes, 100),
EQUIPMENT("Medical Marijuana", /obj/item/storage/fancy/cigarettes/cigpack_med, 250),
EQUIPMENT("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
- EQUIPMENT("Box of matches", /obj/item/storage/box/matches, 50),
+ EQUIPMENT("Box of matches", /obj/item/storage/fancy/matches, 50),
EQUIPMENT("Cheeseburger", /obj/item/reagent_containers/food/snacks/burger/cheese, 150),
EQUIPMENT("Big Burger", /obj/item/reagent_containers/food/snacks/burger/bigbite, 250),
EQUIPMENT("Recycled Prisoner", /obj/item/reagent_containers/food/snacks/soylentgreen, 500),
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3e7b91df663b..8fbf5c0d845e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -518,7 +518,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
if(iscarbon(src) && contents.len && ventcrawlerlocal < 2)//It must have atleast been 1 to get this far
for(var/obj/item/I in contents)
var/failed = 0
- if(istype(I, /obj/item/implant))
+ if(istype(I, /obj/item/bio_chip))
continue
if(istype(I, /obj/item/reagent_containers/patch))
continue
@@ -1136,7 +1136,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
if(!(slipAny))
if(ishuman(src))
var/mob/living/carbon/human/H = src
- if(isobj(H.shoes) && H.shoes.flags & NOSLIP)
+ if(HAS_TRAIT(H, TRAIT_NOSLIP))
return FALSE
if(tilesSlipped)
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 12c3d77b9c77..afa842014de5 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -286,7 +286,7 @@
if(stat == UNCONSCIOUS || just_sleeping)
msg += "[p_they(TRUE)] [p_are()]n't responding to anything around [p_them()] and seems to be asleep.\n"
else if(getBrainLoss() >= 60)
- msg += "[p_they(TRUE)] [p_have()] a stupid expression on [p_their()] face.\n"
+ msg += "[p_they(TRUE)] [p_are()] staring forward with a blank expression.\n"
if(get_int_organ(/obj/item/organ/internal/brain))
msg += examine_show_ssd()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 705ae6ee6560..04d9bb6f7457 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -746,10 +746,8 @@ emp_act
/mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction)
playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE)
- if(shoes && isclothing(shoes))
- var/obj/item/clothing/S = shoes
- if(S.flags & NOSLIP)
- return FALSE
+ if(HAS_TRAIT(src, TRAIT_NOSLIP))
+ return FALSE
return ..()
/mob/living/carbon/human/water_act(volume, temperature, source, method = REAGENT_TOUCH)
diff --git a/code/modules/mob/living/carbon/human/human_life.dm b/code/modules/mob/living/carbon/human/human_life.dm
index b3f5227145aa..5cec16605726 100644
--- a/code/modules/mob/living/carbon/human/human_life.dm
+++ b/code/modules/mob/living/carbon/human/human_life.dm
@@ -99,56 +99,6 @@
else if(!vision || vision.is_broken()) // Vision organs cut out or broken? Permablind.
EyeBlind(4 SECONDS)
- if(getBrainLoss() >= 60 && stat != DEAD)
- if(prob(3))
- var/list/crazysay = list("IM A [pick("PONY","LIZARD","taJaran","kitty","Vulpakin","drASK","BIRDIE","voxxie","race car","combat meCH","SPESSSHIP")] [pick("NEEEEEEIIIIIIIIIGH","sKREEEEEE","MEOW","NYA~","rawr","Barkbark","Hissssss","vROOOOOM","pewpew","choo Choo")]!",
- "without oxigen blob don't evoluate?",
- "CAPTAINS A COMDOM",
- "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
- "can u give me [pick("telikesis","halk","eppilapse")]?",
- "THe saiyans screwed",
- "Bi is THE BEST OF BOTH WORLDS",
- "I WANNA PET TEH monkeyS",
- "stop grifing me!!!!",
- "SOTP IT!",
- "HALPZ SITCULITY",
- "VOXES caN't LOVE",
- "my dad own this station",
- "the CHef put [pick("PROTEIN", "toiret waTer", "RiPPleing TendIes", "Einzymes","HORRY WALTER","nuTriments","ReActive MutAngen","TeSLium","sKrektonium")] in my [pick("wiSh soup","Bullito","rAingurber","sOilent GREEn","KoI Susishes","yaya")]!",
- "the monkey have TASER ARMS!",
- "qM blew my points on [pick("cOMbat Shtogun","inSuLated gloves","LOTS MASSHEEN!")]",
- "EI'NATH!",
- "WAKE UP SHEEPLES!",
- "et wus my [pick("wittle brother!!","fiancee","friend staying over","entiRe orphanage","love interest","wife","husband","liTTle kids","sentient cAT","accidentally")]!",
- "FUS RO DAH",
- "fuckin tangerines!!!",
- "stAT ME",
- "my FACE",
- "rOLl it eaSy!",
- "waaaaaagh!!!",
- "red wonz go fasta",
- "FOR TEH EMPRAH",
- "HAZ A SECURE DAY!!!!",
- "dem dwarfs man, dem dwarfs",
- "SPESS MAHREENS",
- "hwee did eet fhor khayosss",
- "lifelike texture",
- "luv can bloooom",
- "PACKETS!!!",
- "[pick("WHERE MY","aYE need","giv me my","bath me inn.")] [pick("dermaline","alKkyZine","dylOvene","inAprovaline","biCaridine","Hyperzine","kELotane","lePorazine","bAcch Salts","tricord","clOnexazone","hydroChloric Acid","chlORine Hydrate","paRoxetine")]!",
- "mALPRACTICEBAY",
- "I HavE A pe H dee iN ENTerpriSE resOUrCE pLaNNIN",
- "h-h-HalP MaINT",
- "dey come, dey COME! DEY COME!!!",
- "THE END IS NIGH!",
- "I FOT AND DIED FOR MUH [pick("RITES","FREEDOM","payCHECK","cARGO points","teCH Level","doG","mAPLe syrup","fluffy fWiends","gATEway LoOt")]",
- "KILL DEM [pick("mainTnacE cHickinNS","kiRA CulwnNES","FLOOR CLUWNEs","MIME ASSASSIN","BOMBING TAJARAN","cC offiser","morPhlings","slinglings")]!",
- "I CAN FORCE YOU TO SAY WHATEREVE!!?!?!")
- if(prob(66))
- say(pick(crazysay))
- else
- emote("drool")
-
/mob/living/carbon/human/handle_mutations_and_radiation()
for(var/mutation_type in active_mutations)
var/datum/mutation/mutation = GLOB.dna_mutations[mutation_type]
diff --git a/code/modules/mob/living/carbon/human/human_mob.dm b/code/modules/mob/living/carbon/human/human_mob.dm
index 6d46d5f16e71..2f0c994e8afe 100644
--- a/code/modules/mob/living/carbon/human/human_mob.dm
+++ b/code/modules/mob/living/carbon/human/human_mob.dm
@@ -1987,7 +1987,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
if(thing != null)
equip_list[i] = thing.serialize()
- for(var/obj/item/implant/implant in src)
+ for(var/obj/item/bio_chip/implant in src)
implant_list[implant] = implant.serialize()
return data
@@ -2031,7 +2031,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
for(var/thing in implant_list)
var/implant_data = implant_list[thing]
var/path = text2path(implant_data["type"])
- var/obj/item/implant/implant = new path(T)
+ var/obj/item/bio_chip/implant = new path(T)
if(!implant.implant(src, src))
qdel(implant)
@@ -2074,7 +2074,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
makeCluwne()
/mob/living/carbon/human/is_literate()
- return getBrainLoss() < 100
+ return getBrainLoss() < 90
/mob/living/carbon/human/fakefire(fire_icon = "Generic_mob_burning")
diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm
index 551689b1ec6c..50562a09e37a 100644
--- a/code/modules/mob/living/carbon/human/human_say.dm
+++ b/code/modules/mob/living/carbon/human/human_say.dm
@@ -158,7 +158,7 @@ GLOBAL_LIST_INIT(soapy_words, list(
if(prob(braindam / 4))
S.message = stutter(S.message)
verb = "gibbers"
- if(prob(braindam))
+ else if(prob(braindam / 2))
S.message = uppertext(S.message)
verb = "yells loudly"
diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm
index 17e5ec1234cf..924ca49d8762 100644
--- a/code/modules/mob/living/carbon/human/species/machine.dm
+++ b/code/modules/mob/living/carbon/human/species/machine.dm
@@ -113,17 +113,6 @@
H.med_hud_set_health()
H.med_hud_set_status()
-/datum/species/machine/handle_death(gibbed, mob/living/carbon/human/H)
- var/obj/item/organ/external/head/head_organ = H.get_organ("head")
- if(!istype(head_organ))
- return
- head_organ.h_style = "Bald"
- head_organ.f_style = "Shaved"
- spawn(100)
- if(H && head_organ)
- H.update_hair()
- H.update_fhair()
-
/datum/species/machine/handle_life(mob/living/carbon/human/H) // Handles IPC starvation
..()
if(isLivingSSD(H)) // We don't want AFK people dying from this
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index ba0c7a9942a9..85528b51b87a 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -96,7 +96,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/owlwings/griffinwings(H), SLOT_HUD_OUTER_SUIT)
H.equip_to_slot_or_del(new /obj/item/clothing/head/griffin/(H), SLOT_HUD_HEAD)
- var/obj/item/implant/freedom/L = new/obj/item/implant/freedom(H)
+ var/obj/item/bio_chip/freedom/L = new/obj/item/bio_chip/freedom(H)
L.implant(H)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index daf0ab0dcd05..4c53754a20dd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -414,7 +414,7 @@
L += get_contents(S)
for(var/obj/item/clothing/accessory/storage/S in contents)//Check for holsters
L += get_contents(S)
- for(var/obj/item/implant/storage/I in contents) //Check for storage implants.
+ for(var/obj/item/bio_chip/storage/I in contents) //Check for storage implants.
L += I.get_contents()
for(var/obj/item/gift/G in contents) //Check for gift-wrapped items
L += G.gift
diff --git a/code/modules/mob/living/silicon/robot/robot_mob.dm b/code/modules/mob/living/silicon/robot/robot_mob.dm
index 341079ffdc9e..37ee1966f42d 100644
--- a/code/modules/mob/living/silicon/robot/robot_mob.dm
+++ b/code/modules/mob/living/silicon/robot/robot_mob.dm
@@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
/mob/living/silicon/robot/rename_character(oldname, newname)
if(!..(oldname, newname))
- return 0
+ return FALSE
if(oldname != real_name)
notify_ai(3, oldname, newname)
@@ -225,7 +225,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(mmi && mmi.brainmob)
mmi.brainmob.name = newname
- return 1
+ return TRUE
/mob/living/silicon/robot/proc/check_custom_sprite()
if(!custom_sprite && (ckey in GLOB.configuration.custom_sprites.cyborg_ckeys))
diff --git a/code/modules/mob/living/silicon/silicon_mob.dm b/code/modules/mob/living/silicon/silicon_mob.dm
index 3197196e4c58..ca6e2ec72655 100644
--- a/code/modules/mob/living/silicon/silicon_mob.dm
+++ b/code/modules/mob/living/silicon/silicon_mob.dm
@@ -167,13 +167,15 @@
alarm_types_clear[key] = 0
/mob/living/silicon/rename_character(oldname, newname)
- // we actually don't want it changing minds and stuff
if(!newname)
- return 0
+ return FALSE
real_name = newname
name = real_name
- return 1
+ if(mind?.is_original_mob(src))
+ mind.set_original_mob(src) // update our original mind name, since this is our original mob.
+ mind.name = newname
+ return TRUE
/mob/living/silicon/proc/show_laws()
return
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 9366461eb337..379e8e674cd9 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -445,10 +445,10 @@
/mob/living/simple_animal/bot/rename_character(oldname, newname)
if(!..(oldname, newname))
- return 0
+ return FALSE
set_custom_texts()
- return 1
+ return TRUE
/mob/living/simple_animal/bot/proc/set_custom_texts() //Superclass for setting hack texts. Appears only if a set is not given to a bot locally.
text_hack = "You hack [name]."
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index 470315968dd9..b232b63a106f 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -64,15 +64,15 @@
for(var/i in list(IMPTRACK_HUD, IMPMINDSHIELD_HUD, IMPCHEM_HUD))
holder2 = hud_list[i]
holder2.icon_state = null
- for(var/obj/item/implant/I in H)
+ for(var/obj/item/bio_chip/I in H)
if(I.implanted)
- if(istype(I, /obj/item/implant/tracking))
+ if(istype(I, /obj/item/bio_chip/tracking))
holder2 = hud_list[IMPTRACK_HUD]
holder2.icon_state = "hud_imp_tracking"
- else if(istype(I, /obj/item/implant/mindshield))
+ else if(istype(I, /obj/item/bio_chip/mindshield))
holder2 = hud_list[IMPMINDSHIELD_HUD]
holder2.icon_state = "hud_imp_loyal"
- else if(istype(I, /obj/item/implant/chem))
+ else if(istype(I, /obj/item/bio_chip/chem))
holder2 = hud_list[IMPCHEM_HUD]
holder2.icon_state = "hud_imp_chem"
var/image/holder3 = hud_list[WANTED_HUD]
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm
index b11bf9f1d407..e1e4d06f04da 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm
@@ -256,6 +256,8 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/ancient_robot/proc/charge(atom/chargeat = target, delay = 5, chargepast = 2)
if(!chargeat)
return
+ if(chargeat.z != z)
+ return
if(mode == BLUESPACE || (enraged && prob(13)))
new /obj/effect/temp_visual/bsg_kaboom(get_turf(src))
src.visible_message("[src] teleports somewhere nearby!")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index bf87953eec06..978f0d19b104 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -63,7 +63,7 @@ Difficulty: Hard
/// Is it on its enraged exclusive second life?
var/second_life = FALSE
/// Does it have a portal to the funny second life arena created?
- var/obj/effect/portal/redspace/second_life_portal
+ var/obj/effect/portal/advanced/second_life_portal
/// Enraged healing recived
var/enraged_healing = 0
internal_gps = /obj/item/gps/internal/bubblegum
@@ -649,7 +649,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/round_2/Initialize(mapload)
. = ..()
for(var/obj/effect/landmark/spawner/bubblegum_exit/E in GLOB.landmarks_list)
- second_life_portal = new /obj/effect/portal/redspace(get_turf(E), get_turf(src), null, 2 HOURS, src, FALSE)
+ second_life_portal = new /obj/effect/portal/advanced(get_turf(E), get_turf(src), null, 2 HOURS, src, FALSE)
break
RegisterSignal(src, COMSIG_HOSTILE_FOUND_TARGET, PROC_REF(i_see_you))
for(var/mob/living/carbon/human/H in range(20))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index 4c89d2b6bd94..c7c33b6daa63 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -392,7 +392,7 @@
if(prob(10))
l_pocket = pickweight(list(/obj/item/bikehorn/golden = 3, /obj/item/bikehorn/airhorn= 1 ))
if(prob(10))
- r_pocket = /obj/item/implanter/sad_trombone
+ r_pocket = /obj/item/bio_chip_implanter/sad_trombone
if("Golem")
mob_species = pick(list(/datum/species/golem/adamantine, /datum/species/golem/plasma, /datum/species/golem/diamond, /datum/species/golem/gold, /datum/species/golem/silver, /datum/species/golem/plasteel, /datum/species/golem/titanium, /datum/species/golem/plastitanium))
if(prob(30))
diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm
index 55c2dbffda50..475a4f84da67 100644
--- a/code/modules/mob/living/simple_animal/posessed_object.dm
+++ b/code/modules/mob/living/simple_animal/posessed_object.dm
@@ -16,6 +16,7 @@
no_spin_thrown = TRUE
del_on_death = TRUE
+ weather_immunities = list("ash")
/// The probability % of us escaping if stuffed into a bag/toolbox/etc
var/escape_chance = 10
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index a00609a43dd7..2878a7d4595c 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -62,6 +62,7 @@
can_change_intents = FALSE // same here
health = 100
maxHealth = 100
+ weather_immunities = list("ash")
/mob/living/simple_animal/shade/sword/Initialize(mapload)
.=..()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index ebcfa14a2992..1f0516b06408 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -628,7 +628,25 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
return 1
face_atom(A)
- var/list/result = A.examine(src)
+ if(!client)
+ var/list/result = A.examine(src)
+ to_chat(src, chat_box_examine(result.Join("\n")))
+ return
+
+ var/list/result
+ LAZYINITLIST(client.recent_examines)
+ for(var/key in client.recent_examines)
+ if(client.recent_examines[key] < world.time)
+ client.recent_examines -= key
+ var/ref_to_atom = A.UID()
+ if(LAZYACCESS(client.recent_examines, ref_to_atom))
+ result = A.examine_more(src)
+ if(!length(result))
+ result += "You examine [A] closer, but find nothing of interest..."
+ else
+ result = A.examine(src)
+ client.recent_examines[ref_to_atom] = world.time + EXAMINE_MORE_WINDOW // set to when we should not examine something
+
to_chat(src, chat_box_examine(result.Join("\n")))
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
diff --git a/code/modules/mob/mob_misc_procs.dm b/code/modules/mob/mob_misc_procs.dm
index e698bb602a72..e90fa1aa0e47 100644
--- a/code/modules/mob/mob_misc_procs.dm
+++ b/code/modules/mob/mob_misc_procs.dm
@@ -99,7 +99,7 @@
INVOKE_ASYNC(client, TYPE_PROC_REF(/client, colour_transition), get_screen_colour(), flash_time)
/proc/ismindshielded(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
- for(var/obj/item/implant/mindshield/L in A)
+ for(var/obj/item/bio_chip/mindshield/L in A)
if(L && L.implanted)
return 1
return 0
@@ -602,7 +602,7 @@
/mob/proc/rename_character(oldname, newname)
if(!newname)
- return 0
+ return FALSE
real_name = newname
name = newname
if(mind)
@@ -620,8 +620,8 @@
//update our pda and id if we have them on our person
var/list/searching = GetAllContents(searchDepth = 3)
- var/search_id = 1
- var/search_pda = 1
+ var/search_id = TRUE
+ var/search_pda = TRUE
for(var/A in searching)
if(search_id && istype(A,/obj/item/card/id))
@@ -630,27 +630,26 @@
ID.registered_name = newname
ID.name = "[newname]'s ID Card ([ID.assignment])"
ID.RebuildHTML()
- if(!search_pda) break
- search_id = 0
+ if(!search_pda)
+ break
+ search_id = FALSE
else if(search_pda && istype(A,/obj/item/pda))
var/obj/item/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
PDA.name = "PDA-[newname] ([PDA.ownjob])"
- if(!search_id) break
- search_pda = 0
+ if(!search_id)
+ break
+ search_pda = FALSE
//Fixes renames not being reflected in objective text
- var/length
- var/pos
- for(var/datum/objective/objective in GLOB.all_objectives)
- if(!mind || objective.target != mind)
- continue
- length = length_char(oldname) // SS220 EDIT - ORIGINAL: length
- pos = findtextEx_char(objective.explanation_text, oldname) // SS220 EDIT - ORIGINAL: findtextEx
- objective.explanation_text = copytext_char(objective.explanation_text, 1, pos)+newname+copytext_char(objective.explanation_text, pos+length) // SS220 EDIT - ORIGINAL: copytext
- return 1
+ if(mind)
+ for(var/datum/objective/objective in GLOB.all_objectives)
+ if(objective.target != mind)
+ continue
+ objective.update_explanation_text()
+ return TRUE
/mob/proc/rename_self(role, allow_numbers = FALSE, force = FALSE)
spawn(0)
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
index bb2640cdd65e..d08429da4ad9 100644
--- a/code/modules/mod/mod_clothes.dm
+++ b/code/modules/mod/mod_clothes.dm
@@ -14,7 +14,7 @@
"Grey" = 'icons/mob/clothing/modsuit/species/grey_helmets.dmi',
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
"Tajaran" = 'icons/mob/clothing/modsuit/species/taj_modsuits.dmi',
- "Unathi" = 'icons/mob/clothing/modsuit/species/modsuits_younahthee.dmi',
+ "Unathi" = 'icons/mob/clothing/modsuit/species/unathi_modsuits.dmi',
"Vox" = 'icons/mob/clothing/modsuit/species/vox_modsuits.dmi'
)
@@ -40,7 +40,7 @@
sprite_sheets = list(
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
"Tajaran" = 'icons/mob/clothing/modsuit/species/taj_modsuits.dmi',
- "Unathi" = 'icons/mob/clothing/modsuit/species/modsuits_younahthee.dmi',
+ "Unathi" = 'icons/mob/clothing/modsuit/species/unathi_modsuits.dmi',
"Vox" = 'icons/mob/clothing/modsuit/species/vox_modsuits.dmi'
)
@@ -60,7 +60,7 @@
sprite_sheets = list(
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
"Tajaran" = 'icons/mob/clothing/modsuit/species/taj_modsuits.dmi',
- "Unathi" = 'icons/mob/clothing/modsuit/species/modsuits_younahthee.dmi',
+ "Unathi" = 'icons/mob/clothing/modsuit/species/unathi_modsuits.dmi',
"Vox" = 'icons/mob/clothing/modsuit/species/vox_modsuits.dmi'
)
@@ -80,6 +80,6 @@
sprite_sheets = list(
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
"Tajaran" = 'icons/mob/clothing/modsuit/species/taj_modsuits.dmi',
- "Unathi" = 'icons/mob/clothing/modsuit/species/modsuits_younahthee.dmi',
+ "Unathi" = 'icons/mob/clothing/modsuit/species/unathi_modsuits.dmi',
"Vox" = 'icons/mob/clothing/modsuit/species/vox_modsuits.dmi'
)
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index 29885c2809ad..bf016502b8cc 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -203,7 +203,10 @@
. += "You could remove [core] with a wrench."
else
. += "You could use a MOD core on it to install one."
- . += "[extended_desc]" //god is dead
+
+/obj/item/mod/control/examine_more(mob/user)
+ . = ..()
+ . += "[extended_desc]"
/obj/item/mod/control/process()
if(seconds_electrified > 0)
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
index 3d50e73e1273..d4057244a450 100644
--- a/code/modules/mod/mod_theme.dm
+++ b/code/modules/mod/mod_theme.dm
@@ -289,7 +289,7 @@
offering full view of the land and its soon-to-be-dead inhabitants. The armor plating has been trimmed down to \
the bare essentials, geared far more for environmental hazards than combat against fauna; however, \
this gives way to incredible protection against corrosives and thermal protection good enough for \
- both casual backstroking through molten magma and romantic walks through arctic terrain. \
+ traversing the hostile climate of scorching hot barren planets, molten, and volcanic worlds like Epsilon Eridanii II. \
Instead, the suit is capable of using its' anomalous properties to attract and \
carefully distribute layers of ash or ice across the surface; these layers are ablative, but incredibly strong. \
However, all of this has proven to be straining on all Nanotrasen-approved cells, \
diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm
index 2a09c01a11e7..2b9a95508d99 100644
--- a/code/modules/mod/modules/module_pathfinder.dm
+++ b/code/modules/mod/modules/module_pathfinder.dm
@@ -14,7 +14,7 @@
use_power_cost = DEFAULT_CHARGE_DRAIN * 200
incompatible_modules = list(/obj/item/mod/module/pathfinder)
/// The pathfinding implant.
- var/obj/item/implant/mod/implant
+ var/obj/item/bio_chip/mod/implant
/obj/item/mod/module/pathfinder/Initialize(mapload)
. = ..()
@@ -60,7 +60,7 @@
playsound(mod, 'sound/machines/ping.ogg', 50, TRUE)
drain_power(use_power_cost)
-/obj/item/implant/mod
+/obj/item/bio_chip/mod
name = "MOD pathfinder implant"
desc = "Lets you recall a MODsuit to you at any time."
implant_data = /datum/implant_fluff/pathfinder
@@ -77,21 +77,21 @@
var/tries = 0
-/obj/item/implant/mod/Initialize(mapload)
+/obj/item/bio_chip/mod/Initialize(mapload)
. = ..()
if(!istype(loc, /obj/item/mod/module/pathfinder))
return INITIALIZE_HINT_QDEL
module = loc
jet_icon = image(icon = 'icons/obj/clothing/modsuit/mod_modules.dmi', icon_state = "mod_jet", layer = LOW_ITEM_LAYER)
-/obj/item/implant/mod/Destroy()
+/obj/item/bio_chip/mod/Destroy()
if(path)
end_recall(successful = FALSE)
module = null
jet_icon = null
return ..()
-/obj/item/implant/mod/proc/recall()
+/obj/item/bio_chip/mod/proc/recall()
target = get_turf(imp_in)
if(!module?.mod)
to_chat(imp_in, "Module is not attached to a suit!")
@@ -126,12 +126,12 @@
mod_move(target)
return TRUE
-/obj/item/implant/mod/proc/set_path(list/newpath)
+/obj/item/bio_chip/mod/proc/set_path(list/newpath)
if(newpath == null)
end_recall(FALSE)
path = newpath ? newpath : list()
-/obj/item/implant/mod/proc/end_recall(successful = TRUE)
+/obj/item/bio_chip/mod/proc/end_recall(successful = TRUE)
if(!module?.mod)
return
module.mod.cut_overlay(jet_icon)
@@ -141,14 +141,14 @@
to_chat(imp_in, "Lost connection to suit!")
path = list() //Stopping endless end_recall with luck.
-/obj/item/implant/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced)
+/obj/item/bio_chip/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced)
SIGNAL_HANDLER
var/matrix/mod_matrix = matrix()
mod_matrix.Turn(get_angle(source, imp_in))
source.transform = mod_matrix
-/obj/item/implant/mod/proc/mod_move(dest)
+/obj/item/bio_chip/mod/proc/mod_move(dest)
dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else.
if(get_turf(module.mod) == dest) //We have arrived, no need to move again.
for(var/mob/living/carbon/human/H in range(1, module.mod))
@@ -184,7 +184,7 @@
return TRUE
-/obj/item/implant/mod/proc/mod_step() //Step,increase tries if failed
+/obj/item/bio_chip/mod/proc/mod_step() //Step,increase tries if failed
if(!path || !length(path))
return FALSE
for(var/obj/machinery/door/D in range(2, module.mod))
@@ -203,7 +203,7 @@
tries = 0
return TRUE
-/obj/item/implant/mod/proc/increment_path()
+/obj/item/bio_chip/mod/proc/increment_path()
if(!path || !length(path))
return
path.Cut(1, 2)
@@ -222,7 +222,7 @@
/datum/action/item_action/mod_recall/New(Target)
..()
- if(!istype(Target, /obj/item/implant/mod))
+ if(!istype(Target, /obj/item/bio_chip/mod))
qdel(src)
return
@@ -230,7 +230,7 @@
. = ..()
if(!.)
return
- var/obj/item/implant/mod/implant = target
+ var/obj/item/bio_chip/mod/implant = target
if(!COOLDOWN_FINISHED(src, recall_cooldown))
to_chat(usr, "On cooldown!")
return
diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm
index c4777b08e469..912c1018b317 100644
--- a/code/modules/mod/modules/modules_antag.dm
+++ b/code/modules/mod/modules/modules_antag.dm
@@ -143,10 +143,10 @@
origin_tech = "syndicate=1"
/obj/item/mod/module/noslip/on_suit_activation()
- mod.boots.flags |= NOSLIP
+ ADD_TRAIT(mod.wearer, TRAIT_NOSLIP, UID())
/obj/item/mod/module/noslip/on_suit_deactivation(deleting = FALSE)
- mod.boots.flags ^= NOSLIP
+ REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIP, UID())
//Bite of 87 Springlock - Equips faster, disguised as DNA lock, can block retracting for 10 seconds.
/obj/item/mod/module/springlock/bite_of_87
diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm
index 0b2f5a456cbb..bf118f3edad4 100644
--- a/code/modules/mod/modules/modules_engineering.dm
+++ b/code/modules/mod/modules/modules_engineering.dm
@@ -57,7 +57,7 @@
. = ..()
if(!.)
return
- mod.boots.flags |= NOSLIP
+ ADD_TRAIT(mod.wearer, TRAIT_NOSLIP, UID())
mod.slowdown += slowdown_active
ADD_TRAIT(mod.wearer, TRAIT_MAGPULSE, "magbooted")
@@ -65,7 +65,7 @@
. = ..()
if(!.)
return
- mod.boots.flags ^= NOSLIP
+ REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIP, UID())
mod.slowdown -= slowdown_active
REMOVE_TRAIT(mod.wearer, TRAIT_MAGPULSE, "magbooted")
diff --git a/code/modules/ninja/suit/ninja_shoes.dm b/code/modules/ninja/suit/ninja_shoes.dm
index 2ec11a2aebc0..5095058efc16 100644
--- a/code/modules/ninja/suit/ninja_shoes.dm
+++ b/code/modules/ninja/suit/ninja_shoes.dm
@@ -4,7 +4,7 @@
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
permeability_coefficient = 0.01
- flags = NOSLIP
+ no_slip = TRUE
armor = list(MELEE = 75, BULLET = 50, LASER = 20, ENERGY = 10, BOMB = 20, RAD = 15, FIRE = INFINITY, ACID = INFINITY)
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 44b99c137209..bb2290f27734 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -577,6 +577,11 @@
name = "discoveries and thoughts"
info = "As the Diona species, we awoke aboard our terraformation vessel with the primary goal of reshaping the alien world. Our endeavors were highly successful, as we cultivated various plant species and made astonishing discoveries throughout our journey. We seeded a remarkable 'special' grass around our ship, which thrived splendidly. However, as time passed, we faced a growing challenge - a shortage of oxygen in our containment tanks hindered our ability to spread the grass further. In response, we embarked on a series of trials and experiments to engineer plants with the capacity to survive in low-oxygen environments, thus extending our breath of life.
Through a series of trials, combining failures and successes, we unveiled several plant species with unique attributes. Some proved to be valuable for healing purposes, while others offered addictive properties. Glowing mushrooms emerged as a source of vital light, preventing us from succumbing to the darkness. Among these discoveries, one plant commanded our utmost attention – the 'space tobacco.' While this species did not generate oxygen, it contained a chemical known as Salbutamol, enabling us to respire in low-oxygen conditions when consumed. The only drawback was the need to meticulously extract harmful compounds for its safe utilization.
Amid our efforts to expand the greenery, an unexpected encounter transpired. I found myself under assault by an enigmatic creature, and I was forced to flee in haste, straying too far from our vessel. As I stand now, my supplies of life-sustaining plants are dwindling, as is my ability to endure in this low-oxygen environment. Suffocation looms, and I must hasten my return to the safety of our ship to avert this dire fate."
+/obj/item/paper/crumpled/bloody/hacker
+ name = "burned paper scrap"
+ icon_state = "scrap_bloodied"
+ info = "FINALLY, I DECIPHERED NTS' FAXING NETWO-
"
+
/obj/item/paper/fortune
name = "fortune"
icon_state = "slip"
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index f4dec2234251..a247777e91f7 100644
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -378,20 +378,21 @@ GLOBAL_LIST_EMPTY(PDAs)
for(var/mob/O in hearers(3, loc))
O.show_message(text("[bicon(src)] *[ttone]*"))
-/obj/item/pda/proc/set_ringtone()
- var/t = input("Please enter new ringtone", name, ttone) as text
- if(in_range(src, usr) && loc == usr)
- if(t)
- if(hidden_uplink && hidden_uplink.check_trigger(usr, trim(lowertext(t)), lowertext(lock_code))) // SS220 EDIT - ORIGINAL: (usr, lowertext(t), lowertext(lock_code)))
- to_chat(usr, "The PDA softly beeps.")
- close(usr)
- else
- t = sanitize(copytext_char(t, 1, 20)) // SS220 EDIT - ORIGINAL: copytext
- ttone = t
- return 1
- else
- close(usr)
- return 0
+/obj/item/pda/proc/set_ringtone(mob/user)
+ var/new_tone = input("Please enter new ringtone", name, ttone) as text
+ new_tone = trim(new_tone)
+ if(!in_range(src, user) || loc != user)
+ close(user)
+ return FALSE
+ if(!new_tone)
+ return FALSE
+
+ if(hidden_uplink && hidden_uplink.check_trigger(user, lowertext(new_tone), lowertext(lock_code)))
+ to_chat(user, "The PDA softly beeps.")
+ close(user)
+ return TRUE
+ ttone = sanitize(copytext_char(new_tone, 1, 20)) // SS220 EDIT - ORIGINAL: copytext
+ return TRUE
/obj/item/pda/process()
if(current_app)
diff --git a/code/modules/pda/pda_tgui.dm b/code/modules/pda/pda_tgui.dm
index 00e1c6580aea..535d47616b4d 100644
--- a/code/modules/pda/pda_tgui.dm
+++ b/code/modules/pda/pda_tgui.dm
@@ -62,7 +62,7 @@
if(..())
return
- add_fingerprint(usr)
+ add_fingerprint(ui.user)
. = TRUE
switch(action)
@@ -93,13 +93,13 @@
update_shortcuts()
playsound(src, 'sound/machines/terminal_eject.ogg', 50, TRUE)
if("Authenticate") //Checks for ID
- id_check(usr, 1)
+ id_check(ui.user, 1)
if("Available_Ringtones")
ttone = params["selected_ringtone"]
if("Ringtone")
if(!silent)
playsound(src, 'sound/machines/terminal_select.ogg', 15, TRUE)
- return set_ringtone()
+ return set_ringtone(ui.user)
else
if(current_app)
. = current_app.ui_act(action, params, ui, state) // It needs proxying through down here so apps actually have their interacts called
diff --git a/code/modules/pda/pdas.dm b/code/modules/pda/pdas.dm
index 534399396954..8d568b0f1454 100644
--- a/code/modules/pda/pdas.dm
+++ b/code/modules/pda/pdas.dm
@@ -186,24 +186,3 @@
var/datum/data/pda/app/messenger/M = find_program(/datum/data/pda/app/messenger)
if(M)
M.m_hidden = 1
-
-//Some spare PDAs in a box
-/obj/item/storage/box/PDAs
- name = "spare PDAs"
- desc = "A box of spare PDA microcomputers."
- icon = 'icons/obj/pda.dmi'
- icon_state = "pdabox"
-
-/obj/item/storage/box/PDAs/populate_contents()
- new /obj/item/pda(src)
- new /obj/item/pda(src)
- new /obj/item/pda(src)
- new /obj/item/pda(src)
- new /obj/item/cartridge/head(src)
-
- var/newcart = pick( /obj/item/cartridge/engineering,
- /obj/item/cartridge/security,
- /obj/item/cartridge/medical,
- /obj/item/cartridge/signal/toxins,
- /obj/item/cartridge/cargo)
- new newcart(src)
diff --git a/code/modules/power/apc/apc.dm b/code/modules/power/apc/apc.dm
index 54288d681250..f27668e5af46 100644
--- a/code/modules/power/apc/apc.dm
+++ b/code/modules/power/apc/apc.dm
@@ -520,7 +520,7 @@
if(istype(H))
if(H.getBrainLoss() >= 60)
for(var/mob/M in viewers(src, null))
- to_chat(M, "[H] stares cluelessly at [src] and drools.")
+ to_chat(M, "[H] stares cluelessly at [src].")
return FALSE
else if(prob(H.getBrainLoss()))
to_chat(user, "You momentarily forget how to use [src].")
diff --git a/code/modules/reagents/chemistry/reagents/drinks_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks_reagents.dm
index 2b62c63e9c38..27d2d5977ce4 100644
--- a/code/modules/reagents/chemistry/reagents/drinks_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drinks_reagents.dm
@@ -271,10 +271,6 @@
/datum/reagent/consumable/drink/hot_coco/on_mob_life(mob/living/M)
if(M.bodytemperature < 310) // 310 is the normal bodytemp. 310.055
M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- var/update_flags = STATUS_UPDATE_NONE
- if(isvulpkanin(M) || istajaran(M) || isfarwa(M) || iswolpin(M))
- update_flags |= M.adjustToxLoss(2, FALSE)
- return ..() | update_flags
/datum/reagent/consumable/drink/coffee
name = "Coffee"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 50807d7b54f8..2a541a575d84 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -343,12 +343,6 @@
color = "#5F3A13"
taste_description = "bitter cocoa"
-/datum/reagent/consumable/cocoa/on_mob_life(mob/living/M)
- var/update_flags = STATUS_UPDATE_NONE
- if(isvulpkanin(M) || istajaran(M) || isfarwa(M) || iswolpin(M))
- update_flags |= M.adjustToxLoss(2, FALSE)
- return ..() | update_flags
-
/datum/reagent/consumable/vanilla
name = "Vanilla"
id = "vanilla"
@@ -603,10 +597,6 @@
/datum/reagent/consumable/chocolate/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar", 0.8)
- var/update_flags = STATUS_UPDATE_NONE
- if(isvulpkanin(M) || istajaran(M) || isfarwa(M) || iswolpin(M)) // chocolate is bad for dogs and cats, ya know
- update_flags |= M.adjustToxLoss(2, FALSE)
- return ..() | update_flags
/datum/reagent/consumable/chocolate/reaction_turf(turf/T, volume)
if(volume >= 5 && !isspaceturf(T))
@@ -618,7 +608,7 @@
description = "A rather bitter herb once thought to hold magical protective properties."
reagent_state = LIQUID
color = "#21170E"
- process_flags = ORGANIC | SYNTHETIC
+ process_flags = ORGANIC | SYNTHETIC
taste_description = "tea"
harmless = TRUE
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 6fe535ff9d0e..a25bbe0a7140 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -172,7 +172,8 @@
/obj/item/reagent_containers/food/snacks/chinese,
/obj/item/reagent_containers/food/snacks/human,
/obj/item/reagent_containers/food/snacks/monstermeat,
- /obj/item/reagent_containers/food/snacks/meatsteak/stimulating
+ /obj/item/reagent_containers/food/snacks/meatsteak/stimulating,
+ /obj/item/reagent_containers/food/snacks/egg/watcher
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
diff --git a/code/modules/reagents/reagent_containers/iv_bag.dm b/code/modules/reagents/reagent_containers/iv_bag.dm
index e6e64b404810..0236eb5ed2eb 100644
--- a/code/modules/reagents/reagent_containers/iv_bag.dm
+++ b/code/modules/reagents/reagent_containers/iv_bag.dm
@@ -74,10 +74,10 @@
else // Drawing
if(reagents.total_volume < reagents.maximum_volume)
injection_target.transfer_blood_to(src, amount_per_transfer_from_this)
- for(var/datum/reagent/x in injection_target.reagents.reagent_list) // Pull small amounts of reagents from the person while drawing blood
- if(x.id in GLOB.blocked_chems)
+ for(var/datum/reagent/reagent in injection_target.reagents.reagent_list) // Pull small amounts of reagents from the person while drawing blood
+ if(reagent.id in GLOB.blocked_chems)
continue
- injection_target.reagents.trans_to(src, amount_per_transfer_from_this/10)
+ injection_target.reagents.trans_id_to(src, reagent.id, amount_per_transfer_from_this / 10)
update_icon(UPDATE_OVERLAYS)
/obj/item/reagent_containers/iv_bag/attack(mob/living/M, mob/living/user, def_zone)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 8f3a15c754d5..ce03f7589b60 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -365,7 +365,7 @@
/obj/item/shippingPackage
name = "Shipping package"
desc = "A pre-labeled package for shipping an item to coworkers."
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/boxes.dmi'
icon_state = "shippack"
var/obj/item/wrapped = null
var/sortTag = 1
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 91620b6e399a..0c5a86e82d61 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -588,54 +588,54 @@
////////////Regular Implants/////////////
/////////////////////////////////////////
-/datum/design/implanter
+/datum/design/bio_chip_implanter
name = "Bio-chip Implanter"
desc = "A sterile automatic bio-chip injector."
id = "implanter"
req_tech = list("materials" = 2, "biotech" = 3, "programming" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 600, MAT_GLASS = 200)
- build_path = /obj/item/implanter
+ build_path = /obj/item/bio_chip_implanter
category = list("Medical")
-/datum/design/implantcase
+/datum/design/bio_chip_case
name = "Bio-chip Case"
desc = "A glass case containing a bio-chip."
id = "implantcase"
req_tech = list("biotech" = 2)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500)
- build_path = /obj/item/implantcase
+ build_path = /obj/item/bio_chip_case
category = list("Medical")
-/datum/design/implant_chem
+/datum/design/bio_chip_chem
name = "Chemical Bio-chip Case"
desc = "A glass case containing a bio-chip."
id = "implant_chem"
req_tech = list("materials" = 3, "biotech" = 5)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 700)
- build_path = /obj/item/implantcase/chem
+ build_path = /obj/item/bio_chip_case/chem
category = list("Medical")
-/datum/design/implant_sadtrombone
+/datum/design/bio_chip_sad_trombone
name = "Sad Trombone Bio-chip Case"
desc = "Makes death amusing."
id = "implant_trombone"
req_tech = list("materials" = 3, "biotech" = 5)
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500, MAT_BANANIUM = 500)
- build_path = /obj/item/implantcase/sad_trombone
+ build_path = /obj/item/bio_chip_case/sad_trombone
category = list("Medical")
-/datum/design/implant_tracking
+/datum/design/bio_chip_tracking
name = "Tracking Bio-chip Case"
desc = "A glass case containing a bio-chip."
id = "implant_tracking"
req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "programming" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
- build_path = /obj/item/implantcase/tracking
+ build_path = /obj/item/bio_chip_case/tracking
category = list("Medical")
//Cybernetic organs
diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm
index 5975eb7f1fb9..33b4895a1e31 100644
--- a/code/modules/response_team/ert.dm
+++ b/code/modules/response_team/ert.dm
@@ -368,7 +368,7 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
box = /obj/item/storage/box/responseteam
gloves = /obj/item/clothing/gloves/combat
- implants = list(/obj/item/implant/mindshield)
+ bio_chips = list(/obj/item/bio_chip/mindshield)
/obj/item/radio/centcom
name = "centcomm bounced radio"
diff --git a/code/modules/response_team/ert_outfits.dm b/code/modules/response_team/ert_outfits.dm
index 6d69660f7818..c3e7c3de8c45 100644
--- a/code/modules/response_team/ert_outfits.dm
+++ b/code/modules/response_team/ert_outfits.dm
@@ -84,9 +84,9 @@
/obj/item/organ/internal/cyberimp/chest/nutriment/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
/datum/outfit/job/centcom/response_team/commander/gamma
@@ -113,9 +113,9 @@
/obj/item/organ/internal/cyberimp/arm/flash
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
//////////////////// SECURITY ///////////////////
@@ -169,9 +169,9 @@
/obj/item/organ/internal/cyberimp/eyes/hud/security
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
/datum/outfit/job/centcom/response_team/security/gamma
@@ -201,9 +201,9 @@
/obj/item/organ/internal/cyberimp/chest/reviver/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
//////////////////// ENGINEER ///////////////////
@@ -270,9 +270,9 @@
/obj/item/organ/internal/cyberimp/brain/wire_interface/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
/datum/outfit/job/centcom/response_team/engineer/gamma
@@ -301,8 +301,8 @@
/obj/item/organ/internal/cyberimp/brain/wire_interface/hardened
)
- implants = list(/obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(/obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
//////////////////// MEDIC ///////////////////
@@ -367,9 +367,9 @@
/obj/item/organ/internal/cyberimp/chest/nutriment/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
/datum/outfit/job/centcom/response_team/medic/gamma
@@ -402,9 +402,9 @@
/obj/item/organ/internal/cyberimp/brain/anti_stam/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
//////////////////// PARANORMAL ///////////////////
@@ -454,9 +454,9 @@
/obj/item/organ/internal/cyberimp/chest/nutriment/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
/datum/outfit/job/centcom/response_team/paranormal/gamma
@@ -480,9 +480,9 @@
/obj/item/organ/internal/cyberimp/brain/anti_stam/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
//////////////////// JANITORIAL ///////////////////
@@ -534,9 +534,9 @@
/obj/item/organ/internal/cyberimp/chest/nutriment/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
/datum/outfit/job/centcom/response_team/janitorial/gamma
@@ -560,7 +560,7 @@
/obj/item/organ/internal/cyberimp/brain/anti_stam/hardened
)
- implants = list(
- /obj/item/implant/mindshield,
- /obj/item/implant/death_alarm
+ bio_chips = list(
+ /obj/item/bio_chip/mindshield,
+ /obj/item/bio_chip/death_alarm
)
diff --git a/code/modules/ruins/ghost_bar.dm b/code/modules/ruins/ghost_bar.dm
index c957eb01dabf..879580a8a26e 100644
--- a/code/modules/ruins/ghost_bar.dm
+++ b/code/modules/ruins/ghost_bar.dm
@@ -38,7 +38,7 @@
equip_item(H, /obj/item/radio/headset/deadsay, SLOT_HUD_LEFT_EAR)
H.dna.species.before_equip_job(/datum/job/assistant, H)
H.dna.species.remains_type = /obj/effect/decal/cleanable/ash
- var/obj/item/implant/dust/I = new
+ var/obj/item/bio_chip/dust/I = new
I.implant(H, null)
for(var/gear in save_to_load.loadout_gear)
var/datum/gear/G = GLOB.gear_datums[text2path(gear) || gear]
diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index 404a4e91a70a..a4887697fca5 100644
--- a/code/modules/station_goals/bluespace_tap.dm
+++ b/code/modules/station_goals/bluespace_tap.dm
@@ -260,7 +260,7 @@
. = ..()
if(length(active_nether_portals))
- icon_state = "redspace_tap"
+ icon_state = "cascade_tap"
return
if(get_available_power() <= 0)
@@ -275,7 +275,7 @@
underlays.Cut()
if(length(active_nether_portals))
- . += "redspace"
+ . += "cascade"
set_light(15, 5, "#ff0000")
return
diff --git a/code/modules/supply/supply_packs/pack_miscellaneous.dm b/code/modules/supply/supply_packs/pack_miscellaneous.dm
index bce9c7952cba..dd906cfc71c0 100644
--- a/code/modules/supply/supply_packs/pack_miscellaneous.dm
+++ b/code/modules/supply/supply_packs/pack_miscellaneous.dm
@@ -207,6 +207,23 @@
cost = 200
containername = "high-traction floor tiles"
+/datum/supply_packs/misc/soap
+ name = "Assorted Soap Crate"
+ contains = list(/obj/item/soap,
+ /obj/item/soap,
+ /obj/item/soap,
+ /obj/item/soap/nanotrasen)
+ cost = 250
+ containername = "soap crate"
+
+/datum/supply_packs/misc/sus_soap
+ name = "Suspicious Soap Crate"
+ contains = list(/obj/item/soap/syndie,
+ /obj/item/soap/syndie)
+ cost = 250
+ containername = "suspicious soap crate"
+ hidden = TRUE
+
///////////// Costumes
/datum/supply_packs/misc/servicecostume
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/bio_chip_removal.dm
similarity index 83%
rename from code/modules/surgery/implant_removal.dm
rename to code/modules/surgery/bio_chip_removal.dm
index c22841d26f0e..039e1c81c765 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/bio_chip_removal.dm
@@ -9,7 +9,7 @@
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/proxy/open_organ,
- /datum/surgery_step/extract_implant,
+ /datum/surgery_step/extract_bio_chip,
/datum/surgery_step/generic/cauterize
)
possible_locs = list(BODY_ZONE_CHEST)
@@ -21,20 +21,20 @@
/datum/surgery_step/robotics/external/unscrew_hatch,
/datum/surgery_step/robotics/external/open_hatch,
/datum/surgery_step/proxy/robotics/repair_limb,
- /datum/surgery_step/extract_implant/synth,
+ /datum/surgery_step/extract_bio_chip/synth,
/datum/surgery_step/robotics/external/close_hatch
)
requires_organic_bodypart = FALSE
-/datum/surgery_step/extract_implant
+/datum/surgery_step/extract_bio_chip
name = "extract bio-chip"
allowed_tools = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 65)
time = 6.4 SECONDS
repeatable = TRUE
- var/obj/item/implant/I = null
+ var/obj/item/bio_chip/I = null
var/max_times_to_check = 5
-/datum/surgery_step/extract_implant/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
+/datum/surgery_step/extract_bio_chip/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -45,7 +45,7 @@
)
return SURGERY_BEGINSTEP_SKIP
- I = locate(/obj/item/implant) in target
+ I = locate(/obj/item/bio_chip) in target
user.visible_message(
"[user] starts poking around inside [target]'s [affected.name] with \the [tool].",
"You start poking around inside [target]'s [affected.name] with \the [tool]."
@@ -53,7 +53,7 @@
affected.custom_pain("The pain in your [affected.name] is living hell!")
return ..()
-/datum/surgery_step/extract_implant/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
+/datum/surgery_step/extract_bio_chip/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
. = ..()
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -64,9 +64,9 @@
affected.receive_damage(10)
return SURGERY_STEP_RETRY
-/datum/surgery_step/extract_implant/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
+/datum/surgery_step/extract_bio_chip/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- I = locate(/obj/item/implant) in target
+ I = locate(/obj/item/bio_chip) in target
if(I && prob(80)) //implant removal only works on the chest.
user.visible_message(
"[user] takes something out of [target]'s [affected.name] with \the [tool].",
@@ -75,14 +75,14 @@
I.removed(target)
- var/obj/item/implantcase/case
+ var/obj/item/bio_chip_case/case
- if(istype(user.get_item_by_slot(SLOT_HUD_LEFT_HAND), /obj/item/implantcase))
+ if(istype(user.get_item_by_slot(SLOT_HUD_LEFT_HAND), /obj/item/bio_chip_case))
case = user.get_item_by_slot(SLOT_HUD_LEFT_HAND)
- else if(istype(user.get_item_by_slot(SLOT_HUD_RIGHT_HAND), /obj/item/implantcase))
+ else if(istype(user.get_item_by_slot(SLOT_HUD_RIGHT_HAND), /obj/item/bio_chip_case))
case = user.get_item_by_slot(SLOT_HUD_RIGHT_HAND)
else
- case = locate(/obj/item/implantcase) in get_turf(target)
+ case = locate(/obj/item/bio_chip_case) in get_turf(target)
if(case && !case.imp)
case.imp = I
@@ -98,6 +98,6 @@
)
return SURGERY_STEP_CONTINUE
-/datum/surgery_step/extract_implant/synth
+/datum/surgery_step/extract_bio_chip/synth
allowed_tools = list(TOOL_WIRECUTTER = 100, TOOL_HEMOSTAT = 60)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 48736aab74b4..11a274d816d6 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -294,7 +294,7 @@
/obj/item/organ/internal/cyberimp/arm/combat/centcom
name = "NT specops cybernetics implant"
desc = "An extremely powerful cybernetic implant that contains combat and utility modules used by NT special forces."
- contents = newlist(/obj/item/gun/energy/pulse/pistol/m1911, /obj/item/door_remote/omni, /obj/item/melee/energy/blade/hardlight, /obj/item/reagent_containers/hypospray/combat/nanites, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/implanter/mindshield, /obj/item/flash/armimplant)
+ contents = newlist(/obj/item/gun/energy/pulse/pistol/m1911, /obj/item/door_remote/omni, /obj/item/melee/energy/blade/hardlight, /obj/item/reagent_containers/hypospray/combat/nanites, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/bio_chip_implanter/mindshield, /obj/item/flash/armimplant)
icon = 'icons/obj/guns/energy.dmi'
icon_state = "m1911"
emp_proof = 1
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index f9f56bbf8d01..c5fa8032c335 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -540,7 +540,7 @@
/obj/item/storage/box/cyber_implants
name = "boxed cybernetic implants"
desc = "A sleek, sturdy box."
- icon_state = "cyber_implants"
+ icon_state = "cyber_implants_box"
var/list/boxed = list(
/obj/item/autosurgeon/organ/syndicate/thermal_eyes,
/obj/item/autosurgeon/organ/syndicate/xray_eyes,
diff --git a/code/modules/surgery/organs/brain.dm b/code/modules/surgery/organs/brain.dm
index 36fd7ed612e3..3e55578c4a4c 100644
--- a/code/modules/surgery/organs/brain.dm
+++ b/code/modules/surgery/organs/brain.dm
@@ -125,6 +125,65 @@
if(owner && vital)
owner.setBrainLoss(120)
+/obj/item/organ/internal/brain/on_life()
+ if(decoy_brain || damage < 10)
+ return
+ switch(damage)
+ if(10 to 30)
+ handle_minor_brain_damage()
+ if(31 to 60)
+ handle_moderate_brain_damage()
+ if(61 to 80)
+ handle_severe_brain_damage()
+ if(81 to 100)
+ handle_critical_brain_damage()
+
+/obj/item/organ/internal/brain/proc/handle_minor_brain_damage()
+ if(prob(5))
+ owner.Dizzy(5 SECONDS)
+ to_chat(owner, "Your head feels foggy.")
+ else if(prob(4))
+ owner.vomit()
+ to_chat(owner, "")
+
+/obj/item/organ/internal/brain/proc/handle_moderate_brain_damage()
+ if(prob(4))
+ owner.Confused(20 SECONDS)
+ to_chat(owner, "It's suddenly difficult to walk straight.")
+ else if(prob(5))
+ owner.EyeBlurry(15 SECONDS)
+ to_chat(owner, "Your vision unfocuses.")
+ else if(prob(3))
+ owner.Drowsy(20 SECONDS)
+ to_chat(owner, "You're getting tired.")
+
+/obj/item/organ/internal/brain/proc/handle_severe_brain_damage()
+ if(prob(5))
+ owner.Hallucinate(60 SECONDS)
+ to_chat(owner, "You start losing your grip on reality.")
+ else if(prob(10))
+ owner.Slur(60 SECONDS)
+ owner.Stuttering(60 SECONDS)
+ to_chat(owner, "You can't form your words properly.")
+ else if(prob(2))
+ owner.Stun(5 SECONDS)
+ to_chat(owner, "You stare forward in a stupor.")
+ else if(prob(5))
+ owner.KnockDown(1 SECONDS)
+ to_chat(owner, "You lose your footing, and stumble.")
+
+/obj/item/organ/internal/brain/proc/handle_critical_brain_damage()
+ if(prob(4))
+ owner.Silence(45 SECONDS)
+ to_chat(owner, "You open your mouth to speak, but no sound comes out.")
+ else if(prob(5))
+ owner.EyeBlind(30 SECONDS)
+ to_chat(owner, "Your vision gives out.")
+ else if(prob(5))
+ owner.Weaken(10 SECONDS)
+ owner.Jitter(150 SECONDS)
+ to_chat(owner, "You start to have a seizure.")
+
/obj/item/organ/internal/brain/prepare_eat()
return // Too important to eat.
diff --git a/icons/mob/clothing/modsuit/species/modsuits_younahthee.dmi b/icons/mob/clothing/modsuit/species/unathi_modsuits.dmi
similarity index 100%
rename from icons/mob/clothing/modsuit/species/modsuits_younahthee.dmi
rename to icons/mob/clothing/modsuit/species/unathi_modsuits.dmi
diff --git a/icons/mob/clothing/species/drask/helmet.dmi b/icons/mob/clothing/species/drask/helmet.dmi
index 9d58968d0ab1..a060778cd947 100644
Binary files a/icons/mob/clothing/species/drask/helmet.dmi and b/icons/mob/clothing/species/drask/helmet.dmi differ
diff --git a/icons/mob/clothing/species/drask/suit.dmi b/icons/mob/clothing/species/drask/suit.dmi
index b4bf22f7f1ed..4f4792871054 100644
Binary files a/icons/mob/clothing/species/drask/suit.dmi and b/icons/mob/clothing/species/drask/suit.dmi differ
diff --git a/icons/mob/clothing/species/grey/suit.dmi b/icons/mob/clothing/species/grey/suit.dmi
index 45f1f6cc44ae..25f80cacbb92 100644
Binary files a/icons/mob/clothing/species/grey/suit.dmi and b/icons/mob/clothing/species/grey/suit.dmi differ
diff --git a/icons/mob/clothing/species/kidan/suit.dmi b/icons/mob/clothing/species/kidan/suit.dmi
index 8e398165f2c2..d773c94c128b 100644
Binary files a/icons/mob/clothing/species/kidan/suit.dmi and b/icons/mob/clothing/species/kidan/suit.dmi differ
diff --git a/icons/mob/clothing/species/tajaran/helmet.dmi b/icons/mob/clothing/species/tajaran/helmet.dmi
index e479ea8a5c7a..08f4afe33224 100644
Binary files a/icons/mob/clothing/species/tajaran/helmet.dmi and b/icons/mob/clothing/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/clothing/species/tajaran/suit.dmi b/icons/mob/clothing/species/tajaran/suit.dmi
index 337c48b46930..d9a9352d29c0 100644
Binary files a/icons/mob/clothing/species/tajaran/suit.dmi and b/icons/mob/clothing/species/tajaran/suit.dmi differ
diff --git a/icons/mob/clothing/species/unathi/helmet.dmi b/icons/mob/clothing/species/unathi/helmet.dmi
index fc6db757d5a3..633680846162 100644
Binary files a/icons/mob/clothing/species/unathi/helmet.dmi and b/icons/mob/clothing/species/unathi/helmet.dmi differ
diff --git a/icons/mob/clothing/species/unathi/suit.dmi b/icons/mob/clothing/species/unathi/suit.dmi
index e1964adac4fa..59c8faa766af 100644
Binary files a/icons/mob/clothing/species/unathi/suit.dmi and b/icons/mob/clothing/species/unathi/suit.dmi differ
diff --git a/icons/mob/clothing/species/vox/helmet.dmi b/icons/mob/clothing/species/vox/helmet.dmi
index d7fb92eea9b9..47e6adb7b522 100644
Binary files a/icons/mob/clothing/species/vox/helmet.dmi and b/icons/mob/clothing/species/vox/helmet.dmi differ
diff --git a/icons/mob/clothing/species/vox/suit.dmi b/icons/mob/clothing/species/vox/suit.dmi
index 52aa1343e512..e713793e1a72 100644
Binary files a/icons/mob/clothing/species/vox/suit.dmi and b/icons/mob/clothing/species/vox/suit.dmi differ
diff --git a/icons/mob/clothing/species/vulpkanin/helmet.dmi b/icons/mob/clothing/species/vulpkanin/helmet.dmi
index 24c0283c0e2b..afc6ea5edf2f 100644
Binary files a/icons/mob/clothing/species/vulpkanin/helmet.dmi and b/icons/mob/clothing/species/vulpkanin/helmet.dmi differ
diff --git a/icons/mob/clothing/species/vulpkanin/suit.dmi b/icons/mob/clothing/species/vulpkanin/suit.dmi
index 3cdf1a1228b8..f03f0627393f 100644
Binary files a/icons/mob/clothing/species/vulpkanin/suit.dmi and b/icons/mob/clothing/species/vulpkanin/suit.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index b034654674c5..d5d99a310bd1 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/obj/implants.dmi b/icons/obj/bio_chips.dmi
similarity index 100%
rename from icons/obj/implants.dmi
rename to icons/obj/bio_chips.dmi
diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi
new file mode 100644
index 000000000000..03d0a7413b57
Binary files /dev/null and b/icons/obj/boxes.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index aaf4877597a3..c5c655fb781a 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 2660087f11cb..f2030353f36d 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index ae96898cf33d..5ff5e5a5ebdf 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 502ad16f1c59..bd40ddcc8a9a 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/machines/bluespace_tap.dmi b/icons/obj/machines/bluespace_tap.dmi
index 7d53d84fc225..d271f9eb2cf6 100644
Binary files a/icons/obj/machines/bluespace_tap.dmi and b/icons/obj/machines/bluespace_tap.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 459f9150c6c3..d93b0cec3b78 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index b5805bbd6ae5..8758283d1532 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 8782e222d2b9..e21855df14ad 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 951c7c361d6a..5a9d28d9774c 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1105,6 +1105,31 @@
#include "code\game\objects\items\weapons\vending_items.dm"
#include "code\game\objects\items\weapons\weaponry.dm"
#include "code\game\objects\items\weapons\whetstone.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_abductor.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_adrenalin.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_case.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_chem.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_death_alarm.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_dust.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_emp.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_explosive.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_fluff.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_freedom.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_gorilla_rampage.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_health.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_krav_maga.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_mindshield.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_pad.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_prescan.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_sad_trombone.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_stealth.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_storage.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_supercharge.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_tracking.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_traitor.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chip_uplink.dm"
+#include "code\game\objects\items\weapons\bio_chips\bio_chipper.dm"
#include "code\game\objects\items\weapons\grenades\atmosgrenade.dm"
#include "code\game\objects\items\weapons\grenades\bananade.dm"
#include "code\game\objects\items\weapons\grenades\chem_grenade.dm"
@@ -1120,30 +1145,6 @@
#include "code\game\objects\items\weapons\grenades\smokebomb.dm"
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
-#include "code\game\objects\items\weapons\implants\implant.dm"
-#include "code\game\objects\items\weapons\implants\implant_abductor.dm"
-#include "code\game\objects\items\weapons\implants\implant_adrenalin.dm"
-#include "code\game\objects\items\weapons\implants\implant_chem.dm"
-#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm"
-#include "code\game\objects\items\weapons\implants\implant_dust.dm"
-#include "code\game\objects\items\weapons\implants\implant_emp.dm"
-#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
-#include "code\game\objects\items\weapons\implants\implant_freedom.dm"
-#include "code\game\objects\items\weapons\implants\implant_gorilla_rampage.dm"
-#include "code\game\objects\items\weapons\implants\implant_health.dm"
-#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm"
-#include "code\game\objects\items\weapons\implants\implant_mindshield.dm"
-#include "code\game\objects\items\weapons\implants\implant_sad_trombone.dm"
-#include "code\game\objects\items\weapons\implants\implant_stealth.dm"
-#include "code\game\objects\items\weapons\implants\implant_storage.dm"
-#include "code\game\objects\items\weapons\implants\implant_supercharge.dm"
-#include "code\game\objects\items\weapons\implants\implant_tracking.dm"
-#include "code\game\objects\items\weapons\implants\implant_traitor.dm"
-#include "code\game\objects\items\weapons\implants\implant_uplink.dm"
-#include "code\game\objects\items\weapons\implants\implantcase.dm"
-#include "code\game\objects\items\weapons\implants\implanter.dm"
-#include "code\game\objects\items\weapons\implants\implantfluff.dm"
-#include "code\game\objects\items\weapons\implants\implantpad.dm"
#include "code\game\objects\items\weapons\melee\energy_melee_weapons.dm"
#include "code\game\objects\items\weapons\melee\melee_misc.dm"
#include "code\game\objects\items\weapons\storage\backpack.dm"
@@ -1186,6 +1187,7 @@
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
#include "code\game\objects\structures\girders.dm"
+#include "code\game\objects\structures\grey_autocloner.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guillotine.dm"
#include "code\game\objects\structures\holosigns.dm"
@@ -2654,13 +2656,13 @@
#include "code\modules\supply\supply_packs\pack_security.dm"
#include "code\modules\supply\supply_packs\pack_vendor.dm"
#include "code\modules\surgery\abstract_steps.dm"
+#include "code\modules\surgery\bio_chip_removal.dm"
#include "code\modules\surgery\bones.dm"
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\core_removal.dm"
#include "code\modules\surgery\dental_implant.dm"
#include "code\modules\surgery\encased.dm"
#include "code\modules\surgery\generic.dm"
-#include "code\modules\surgery\implant_removal.dm"
#include "code\modules\surgery\limb_augmentation.dm"
#include "code\modules\surgery\limb_reattach.dm"
#include "code\modules\surgery\organs_internal.dm"
diff --git a/sound/effects/ghost_ping.ogg b/sound/effects/ghost_ping.ogg
new file mode 100644
index 000000000000..380df597d7ad
Binary files /dev/null and b/sound/effects/ghost_ping.ogg differ
diff --git a/tools/UpdatePaths/Scripts/23213_matches.txt b/tools/UpdatePaths/Scripts/23213_matches.txt
new file mode 100644
index 000000000000..3344731ab2e4
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/23213_matches.txt
@@ -0,0 +1 @@
+/obj/item/storage/box/matches : /obj/item/storage/fancy/matches{@OLD}
diff --git a/tools/ci/check_grep2.py b/tools/ci/check_grep2.py
index 9ebbf17a633f..fbf68189889b 100644
--- a/tools/ci/check_grep2.py
+++ b/tools/ci/check_grep2.py
@@ -101,10 +101,9 @@ def check_to_chats_have_a_user_arguement(lines):
if TO_CHAT_WITH_NO_USER_ARG_RE.search(line):
return Failure(idx + 1, "Changed files contains a to_chat() procedure without a user argument.")
-CONDITIONAL_LEADING_SPACE = re.compile(r"(if|for|while|switch)\s+(\(.*?\))") # checks for "if (thing)", replace with $1$2
-CONDITIONAL_BEGINNING_SPACE = re.compile(r"(if|for|while|switch)(\(.+) \)") # checks for "if( thing)", replace with $1$2)
-CONDITIONAL_ENDING_SPACE = re.compile(r"(if|for|while|switch)\( (.+\))") # checks for "if(thing )", replace with $1($2
-CONDITIONAL_INFIX_NOT_SPACE = re.compile(r"(if)\(! (.+\))") # checks for "if(! thing)", replace with $1(!$2
+CONDITIONAL_LEADING_SPACE = re.compile(r"(if|for|while|switch)\s+(\(.*?\)?)") # checks for "if (thing)", replace with $1$2
+CONDITIONAL_BEGINNING_SPACE = re.compile(r"(if|for|while|switch)\((!?) (.+\)?)") # checks for "if( thing)", replace with $1($2$3
+CONDITIONAL_ENDING_SPACE = re.compile(r"(if|for|while|switch)(\(.+) \)") # checks for "if(thing )", replace with $1$2)
# To fix any of these, run them as regex in VSCode, with the appropriate replacement
# It may be a good idea to turn the replacement into a script someday
def check_conditional_spacing(lines):
@@ -115,8 +114,6 @@ def check_conditional_spacing(lines):
return Failure(idx + 1, "Found a conditional statement matching the format \"if( thing)\", please use \"if(thing)\" instead.")
if CONDITIONAL_ENDING_SPACE.search(line):
return Failure(idx + 1, "Found a conditional statement matching the format \"if(thing )\", please use \"if(thing)\" instead.")
- if CONDITIONAL_INFIX_NOT_SPACE.search(line):
- return Failure(idx + 1, "Found a conditional statement matching the format \"if(! thing)\", please use \"if(!thing)\" instead.")
# makes sure that no global list inits have an empty list in them without using the helper
GLOBAL_LIST_EMPTY = re.compile(r"(?