diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 3985659b..486728b6 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -44,6 +44,12 @@
index = findtext(t, char, index + length(char))
return t
+/proc/sanitize_name(t,list/repl_chars = null)
+ if(t == "space" || t == "floor" || t == "wall" || t == "r-wall" || t == "monkey" || t == "unknown" || t == "inactive ai") //prevents these common metagamey names
+ alert("Invalid name.")
+ return ""
+ return sanitize(t)
+
/proc/sanitize_filename(t)
return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"=""))
@@ -775,4 +781,4 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
#define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97))
-#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1))
\ No newline at end of file
+#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1))
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 0c082cf2..aaf91d41 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -448,8 +448,10 @@
symptom_delay_max = 1
passive_message = "Your skin glows faintly for a moment."
var/cellular_damage = FALSE
- threshold_desc = "Transmission 6: Additionally heals cellular damage.
\
- Resistance 7: Increases healing speed."
+ threshold_desc = list(
+ "Transmission 6" = "Additionally heals cellular damage and toxin lovers.",
+ "Resistance 7" = "Increases healing speed.",
+ )
/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
if(!..())
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index 19dbf4fe..079e0d79 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -205,3 +205,7 @@
/obj/item/inducer/sci/combat/Initialize()
. = ..()
update_icon()
+
+/obj/item/inducer/sci/supply
+ opened = FALSE
+ cell_type = /obj/item/stock_parts/cell/inducer_supply
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index c27f4e65..389619c9 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -402,6 +402,8 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("alien bar stool", /obj/item/chair/stool/bar/alien, 1, time = 20, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("alien stool", /obj/item/chair/stool/alien, 1, time = 20, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 9cc329c1..df05eb27 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -689,6 +689,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
+ new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
/obj/item/stack/sheet/plastic
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index a145bffe..8fcbe6e9 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -348,6 +348,43 @@
item_state = "stool_bar"
origin_type = /obj/structure/chair/stool/bar
+//////////////////////////
+//Alien(Disco) Stools!////
+//////////////////////////
+
+/obj/structure/chair/stool/alien
+ name = "alien stool"
+ desc = "A hard stool made of advanced alien alloy."
+ icon_state = "stoolalien"
+ icon = 'icons/obj/abductor.dmi'
+ item_chair = /obj/item/chair/stool/alien
+ buildstacktype = /obj/item/stack/sheet/mineral/abductor
+ buildstackamount = 1
+
+/obj/structure/chair/stool/bar/alien
+ name = "bronze bar stool"
+ desc = "A hard bar stool made of advanced alien alloy."
+ icon_state = "baralien"
+ icon = 'icons/obj/abductor.dmi'
+ item_chair = /obj/item/chair/stool/bar/alien
+ buildstacktype = /obj/item/stack/sheet/mineral/abductor
+ buildstackamount = 1
+
+/obj/item/chair/stool/alien
+ name = "stool"
+ icon_state = "stoolalien_toppled"
+ item_state = "stoolalien"
+ icon = 'icons/obj/abductor.dmi'
+ origin_type = /obj/structure/chair/stool/alien
+ break_chance = 0 //It's too sturdy.
+
+/obj/item/chair/stool/bar/alien
+ name = "bar stool"
+ icon_state = "baralien_toppled"
+ item_state = "baralien"
+ icon = 'icons/obj/abductor.dmi'
+ origin_type = /obj/structure/chair/stool/bar/alien
+
//////////////////////////
//Brass & Bronze stools!//
//////////////////////////
diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm
index 02f634ed..7646fdb3 100644
--- a/code/game/objects/structures/crates_lockers/crates/bins.dm
+++ b/code/game/objects/structures/crates_lockers/crates/bins.dm
@@ -4,6 +4,8 @@
icon_state = "largebins"
open_sound = 'sound/effects/bin_open.ogg'
close_sound = 'sound/effects/bin_close.ogg'
+ material_drop = /obj/item/stack/sheet/plastic
+ material_drop_amount = 40
anchored = TRUE
horizontal = FALSE
delivery_icon = null
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 5fabcafd..5789c5ab 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -74,6 +74,9 @@
ui = new(user, src, ui_key, "tank_dispenser", name, 275, 103, master_ui, state)
ui.open()
+/obj/structure/tank_dispenser/attack_robot(mob/user)
+ ui_interact(user)
+
/obj/structure/tank_dispenser/ui_data(mob/user)
var/list/data = list()
data["oxygen"] = oxygentanks
diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm
index 17d008d1..74d70e52 100644
--- a/code/modules/cargo/packs/engineering.dm
+++ b/code/modules/cargo/packs/engineering.dm
@@ -91,15 +91,11 @@
crate_name = "insulated gloves crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
-/obj/item/stock_parts/cell/inducer_supply
- maxcharge = 5000
- charge = 5000
-
/datum/supply_pack/engineering/inducers
name = "NT-75 Electromagnetic Power Inducers Crate"
desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers."
cost = 2300
- contains = list(/obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}, /obj/item/inducer/sci {cell_type = /obj/item/stock_parts/cell/inducer_supply; opened = 0}) //FALSE doesn't work in modified type paths apparently.
+ contains = list(/obj/item/inducer/sci/supply, /obj/item/inducer/sci/supply)
crate_name = "inducer crate"
crate_type = /obj/structure/closet/crate/engineering/electrical
@@ -133,17 +129,6 @@
crate_name = "power tools crate"
crate_type = /obj/structure/closet/crate/secure/engineering
-/datum/supply_pack/engineering/siezedpower
- name = "Seized Power Cell Crate"
- desc = "We took the means of power! Contains three high-voltage plus power cells."
- cost = 1300
- contraband = TRUE
- contains = list(/obj/item/stock_parts/cell/high/plus,
- /obj/item/stock_parts/cell/high/plus,
- /obj/item/stock_parts/cell/high/plus)
- crate_name = "seized crate"
- crate_type = /obj/structure/closet/crate/engineering/electrical
-
/datum/supply_pack/engineering/shuttle_engine
name = "Shuttle Engine Crate"
desc = "Through advanced bluespace-shenanigans, our engineers have managed to fit an entire shuttle engine into one tiny little crate. Requires CE access to open."
@@ -153,22 +138,6 @@
crate_name = "shuttle engine crate"
crate_type = /obj/structure/closet/crate/secure/engineering
-/datum/supply_pack/engineering/seizedproduction
- name = "The Means of Production"
- desc = "We will win for we have took over the production! Contains five metal sheets, five wire, three matter bins, one manipulator and one sheet of glass."
- cost = 1500
- contraband = TRUE
- contains = list(/obj/item/stock_parts/cell/high/plus,
- /obj/item/circuitboard/machine/autolathe,
- /obj/item/stack/cable_coil/random/five,
- /obj/item/stack/sheet/metal/five,
- /obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/matter_bin,
- /obj/item/stock_parts/manipulator,
- /obj/item/stack/sheet/glass,)
- crate_name = "seized crate"
-
/datum/supply_pack/engineering/tools
name = "Toolbox Crate"
desc = "Any robust spaceman is never far from their trusty toolbox. Contains three electrical toolboxes and three mechanical toolboxes."
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 5bda9173..d1605421 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -40,9 +40,10 @@
/datum/supply_pack/medical/bloodpacks
name = "Blood Pack Variety Crate"
- desc = "Contains ten different blood packs for reintroducing blood to patients."
+ desc = "Contains nine different blood packs for reintroducing blood to patients, plus two universal synthetic blood packs."
cost = 3000
- contains = list(/obj/item/reagent_containers/blood/random,
+ contains = list(/obj/item/reagent_containers/blood/synthetics,
+ /obj/item/reagent_containers/blood/synthetics,
/obj/item/reagent_containers/blood/random,
/obj/item/reagent_containers/blood/APlus,
/obj/item/reagent_containers/blood/AMinus,
@@ -56,18 +57,6 @@
crate_name = "blood freezer"
crate_type = /obj/structure/closet/crate/freezer
-/datum/supply_pack/medical/bloodpackssynth
- name = "Synthetics Blood Pack Crate"
- desc = "Contains five synthetics blood packs for reintroducing blood to patients."
- cost = 3000
- contains = list(/obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics,
- /obj/item/reagent_containers/blood/synthetics)
- crate_name = "blood freezer"
- crate_type = /obj/structure/closet/crate/freezer
-
/datum/supply_pack/medical/defibs
name = "Defibrillator Crate"
desc = "Contains two defibrillators for bringing the recently deceased back to life."
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index ceacd0cd..e7df7f46 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -311,19 +311,6 @@
)
crate_name = "religious supplies crate"
-/datum/supply_pack/misc/randomised/promiscuous
- name = "Promiscuous Organs"
- desc = "Do YOU want to have more genital? Well we have just the thing for you~. This crate has two autosurgeon, that will let you have a new sex, organ to impress that hot stud and or chick."
- cost = 4000 //Only get 2!
- contraband = TRUE
- var/num_contained = 2
- contains = list(/obj/item/autosurgeon/penis,
- /obj/item/autosurgeon/testicles,
- /obj/item/autosurgeon/vagina,
- /obj/item/autosurgeon/breasts,
- /obj/item/autosurgeon/womb)
- crate_name = "promiscuous organs"
-
/datum/supply_pack/misc/shower
name = "Shower Supplies"
desc = "Everyone needs a bit of R&R. Make sure you get can get yours by ordering this crate filled with towels, rubber duckies, and some soap!"
diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm
index 751b5827..249d1aa8 100644
--- a/code/modules/cargo/packs/service.dm
+++ b/code/modules/cargo/packs/service.dm
@@ -226,23 +226,39 @@
/datum/supply_pack/service/carpet
name = "Premium Carpet Crate"
- desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains the classics."
+ desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains one of each pattern: classic, black, black-red and monochrome."
cost = 1000
contains = list(/obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/fifty,
+ /obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/black/fifty,
- /obj/item/stack/tile/carpet/black/fifty)
+ /obj/item/stack/tile/carpet/monochrome/fifty)
crate_name = "premium carpet crate"
-/datum/supply_pack/service/carpet2
- name = "Premium Carpet Crate #2"
- desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome"
- cost = 1000
- contains = list(/obj/item/stack/tile/carpet/blackred/fifty,
+/datum/supply_pack/service/carpet_exotic
+ name = "Exotic Carpet Crate"
+ desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
+ cost = 7000
+ contains = list(/obj/item/stack/tile/carpet/blue/fifty,
+ /obj/item/stack/tile/carpet/blue/fifty,
+ /obj/item/stack/tile/carpet/cyan/fifty,
+ /obj/item/stack/tile/carpet/cyan/fifty,
+ /obj/item/stack/tile/carpet/green/fifty,
+ /obj/item/stack/tile/carpet/green/fifty,
+ /obj/item/stack/tile/carpet/orange/fifty,
+ /obj/item/stack/tile/carpet/orange/fifty,
+ /obj/item/stack/tile/carpet/purple/fifty,
+ /obj/item/stack/tile/carpet/purple/fifty,
+ /obj/item/stack/tile/carpet/red/fifty,
+ /obj/item/stack/tile/carpet/red/fifty,
+ /obj/item/stack/tile/carpet/royalblue/fifty,
+ /obj/item/stack/tile/carpet/royalblue/fifty,
+ /obj/item/stack/tile/carpet/royalblack/fifty,
+ /obj/item/stack/tile/carpet/royalblack/fifty,
+ /obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "premium carpet crate #2"
+ crate_name = "exotic carpet crate"
/datum/supply_pack/service/lightbulbs
name = "Replacement Lights"
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index c1a336eb..00f63510 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -134,7 +134,7 @@
/datum/language_holder/synthetic
languages = list(/datum/language/common)
- shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic)
+ shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic, /datum/language/slime)
/datum/language_holder/empty
languages = list()
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index c0b3e188..5288f5e9 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -189,7 +189,25 @@
icon_dead = "mouse_plasma" //No need for a dead sprite since it qdels itself on death
/mob/living/simple_animal/mouse/boommouse/death(gibbed, toast)
+ var/turf/T = get_turf(src)
+ message_admins("A boommouse explosion was triggered at [ADMIN_VERBOSEJMP(T)].")
visible_message("The boommouse violently explodes!")
atmos_spawn_air("plasma=15;TEMP=750")
explosion(src.loc, 0, 0, 2, 0, 1, 0, 2, 0, 0)
qdel(src)
+
+/mob/living/simple_animal/mouse/boommouse/attackby(obj/item/I, mob/living/user, params)
+ var/turf/T = get_turf(src)
+ message_admins("[ADMIN_LOOKUPFLW(user)] is attacking a boommouse at [ADMIN_VERBOSEJMP(T)].")
+ if(istype(I, /obj/item/weldingtool))
+ var/obj/item/weldingtool/W = I
+ if(W.welding)
+ user.visible_message("[user] burns the boommouse with [user.p_their()] [W.name]!", "That was stupid of you.")
+ var/message_admins = "[ADMIN_LOOKUPFLW(user)] triggered a boommouse explosion at [ADMIN_VERBOSEJMP(T)]."
+ GLOB.bombers += message_admins
+ message_admins(message_admins)
+ user.log_message("triggered a boommouse explosion.", LOG_ATTACK)
+ death()
+ return ..()
+
+ //TODO - look into attacked_by to make this better and less shitcode
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index d8df1918..8a0c660e 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -359,3 +359,7 @@
var/area/A = get_area(src)
if(!A.lightswitch || !A.light_power)
charge = 0 //For naturally depowered areas, we start with no power
+
+//found inside the inducers ordered from cargo.
+/obj/item/stock_parts/cell/inducer_supply
+ maxcharge = 5000
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 4036f03c..42426b46 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -170,7 +170,7 @@
if(!A.mutable)
return
if(A)
- var/new_name = stripped_input(usr, "Name the disease", "New name", "", MAX_NAME_LEN)
+ var/new_name = sanitize_name(html_encode(params["name"]))
if(!new_name || ..())
return
A.AssignName(new_name)
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 9a32c834..87c29329 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -611,13 +611,9 @@
/datum/reagent/toxin/lipolicide/overdose_process(mob/living/carbon/C)
. = ..()
- if(current_cycle >=41 && prob(15))
- C.spew_organ()
- C.vomit(10, TRUE, TRUE, 4)
- to_chat(C, "You feel something lumpy come up as you vomit.")
- if(prob(1))
- to_chat(C, "You feel like your organs are on fire!")
- C.IgniteMob()
+ if(current_cycle >=41 && prob(10))
+ to_chat(C, "You feel like your organs are on fire!")
+ C.IgniteMob()
/datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index d684b2ed..46ddb1e2 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -135,6 +135,9 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
addtimer(CALLBACK(src, .proc/convey, affecting), 1)
/obj/machinery/conveyor/proc/convey(list/affecting)
+ var/turf/T = get_step(src, movedir)
+ if(length(T.contents) > 150)
+ return
for(var/atom/movable/A in affecting)
if((A.loc == loc) && A.has_gravity())
A.ConveyorMove(movedir)
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 5602b03f..b5dc7e00 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ