")
+
+/obj/machinery/microwave/update_icon()
+ if(broken)
+ icon_state = "mwb"
+ else if(dirty_anim_playing)
+ icon_state = "mwbloody1"
+ else if(dirty == 100)
+ icon_state = "mwbloody"
+ else if(operating)
+ icon_state = "mw1"
+ else if(panel_open)
+ icon_state = "mw-o"
+ else
+ icon_state = "mw"
/obj/machinery/microwave/attackby(obj/item/O, mob/user, params)
if(operating)
return
- if(!broken && dirty<100)
- if(default_deconstruction_screwdriver(user, "mw-o", "mw", O))
- return
- if(default_unfasten_wrench(user, O))
- return
-
if(default_deconstruction_crowbar(O))
return
- if(src.broken > 0)
- if(src.broken == 2 && istype(O, /obj/item/wirecutters)) // If it's broken and they're using a screwdriver
- user.visible_message( \
- "[user] starts to fix part of the microwave.", \
- "You start to fix part of the microwave..." \
- )
- if (O.use_tool(src, user, 20))
- user.visible_message( \
- "[user] fixes part of the microwave.", \
- "You fix part of the microwave." \
- )
- src.broken = 1 // Fix it a bit
- else if(src.broken == 1 && istype(O, /obj/item/weldingtool)) // If it's broken and they're doing the wrench
- user.visible_message( \
- "[user] starts to fix part of the microwave.", \
- "You start to fix part of the microwave..." \
- )
- if (O.use_tool(src, user, 20))
- user.visible_message( \
- "[user] fixes the microwave.", \
- "You fix the microwave." \
- )
- src.icon_state = "mw"
- src.broken = 0 // Fix it!
- src.dirty = 0 // just to be sure
- return 0 //to use some fuel
+ if(dirty < 100)
+ if(default_deconstruction_screwdriver(user, icon_state, icon_state, O) || default_unfasten_wrench(user, O))
+ update_icon()
+ return
+
+ if(panel_open && is_wire_tool(O))
+ wires.interact(user)
+ return TRUE
+
+ if(broken > 0)
+ if(broken == 2 && O.tool_behaviour == TOOL_WIRECUTTER) // If it's broken and they're using a screwdriver
+ user.visible_message("[user] starts to fix part of \the [src].", "You start to fix part of \the [src]...")
+ if(O.use_tool(src, user, 20))
+ user.visible_message("[user] fixes part of \the [src].", "You fix part of \the [src].")
+ broken = 1 // Fix it a bit
+ else if(broken == 1 && O.tool_behaviour == TOOL_WELDER) // If it's broken and they're doing the wrench
+ user.visible_message("[user] starts to fix part of \the [src].", "You start to fix part of \the [src]...")
+ if(O.use_tool(src, user, 20))
+ user.visible_message("[user] fixes \the [src].", "You fix \the [src].")
+ broken = 0
+ update_icon()
+ return FALSE //to use some fuel
else
to_chat(user, "It's broken!")
- return 1
- else if(istype(O, /obj/item/reagent_containers/spray/))
+ return TRUE
+ return
+
+ if(istype(O, /obj/item/reagent_containers/spray))
var/obj/item/reagent_containers/spray/clean_spray = O
- if(clean_spray.reagents.has_reagent("cleaner",clean_spray.amount_per_transfer_from_this))
- clean_spray.reagents.remove_reagent("cleaner",clean_spray.amount_per_transfer_from_this,1)
+ if(clean_spray.reagents.has_reagent("cleaner", clean_spray.amount_per_transfer_from_this))
+ clean_spray.reagents.remove_reagent("cleaner", clean_spray.amount_per_transfer_from_this,1)
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
- user.visible_message( \
- "[user] has cleaned the microwave.", \
- "You clean the microwave." \
- )
- src.dirty = 0 // It's clean!
- src.broken = 0 // just to be sure
- src.icon_state = "mw"
- src.updateUsrDialog()
- return 1 // Disables the after-attack so we don't spray the floor/user.
+ user.visible_message("[user] has cleaned \the [src].", "You clean \the [src].")
+ dirty = 0
+ update_icon()
else
to_chat(user, "You need more space cleaner!")
- return 1
+ return TRUE
- else if(istype(O, /obj/item/soap/)) // If they're trying to clean it then let them
+ if(istype(O, /obj/item/soap))
var/obj/item/soap/P = O
- user.visible_message( \
- "[user] starts to clean the microwave.", \
- "You start to clean the microwave..." \
- )
- if (do_after(user, P.cleanspeed, target = src))
- user.visible_message( \
- "[user] has cleaned the microwave.", \
- "You clean the microwave." \
- )
- src.dirty = 0 // It's clean!
- src.broken = 0 // just to be sure
- src.icon_state = "mw"
+ user.visible_message("[user] starts to clean \the [src].", "You start to clean \the [src]...")
+ if(do_after(user, P.cleanspeed, target = src))
+ user.visible_message("[user] has cleaned \the [src].", "You clean \the [src].")
+ dirty = 0
+ update_icon()
+ return TRUE
- else if(src.dirty==100) // The microwave is all dirty so can't be used!
- to_chat(user, "It's dirty!")
- return 1
+ if(dirty == 100) // The microwave is all dirty so can't be used!
+ to_chat(user, "\The [src] is dirty!")
+ return TRUE
- else if(istype(O, /obj/item/storage/bag/tray))
+ if(istype(O, /obj/item/storage/bag/tray))
var/obj/item/storage/T = O
var/loaded = 0
for(var/obj/item/reagent_containers/food/snacks/S in T.contents)
- if (contents.len>=max_n_of_items)
- to_chat(user, "[src] is full, you can't put anything in!")
- return 1
+ if(ingredients.len >= max_n_of_items)
+ to_chat(user, "\The [src] is full, you can't put anything in!")
+ return TRUE
if(SEND_SIGNAL(T, COMSIG_TRY_STORAGE_TAKE, S, src))
loaded++
-
+ ingredients += S
if(loaded)
- to_chat(user, "You insert [loaded] items into [src].")
+ to_chat(user, "You insert [loaded] items into \the [src].")
+ return
+ if(O.w_class <= WEIGHT_CLASS_NORMAL && !istype(O, /obj/item/storage) && user.a_intent == INTENT_HELP)
+ if(ingredients.len >= max_n_of_items)
+ to_chat(user, "\The [src] is full, you can't put anything in!")
+ return TRUE
+ if(!user.transferItemToLoc(O, src))
+ to_chat(user, "\The [O] is stuck to your hand!")
+ return FALSE
- else if(O.w_class <= WEIGHT_CLASS_NORMAL && !istype(O, /obj/item/storage) && user.a_intent == INTENT_HELP)
- if (contents.len>=max_n_of_items)
- to_chat(user, "[src] is full, you can't put anything in!")
- return 1
- else
- if(!user.transferItemToLoc(O, src))
- to_chat(user, "\the [O] is stuck to your hand, you cannot put it in \the [src]!")
- return 0
+ ingredients += O
+ user.visible_message("[user] has added \a [O] to \the [src].", "You add [O] to \the [src].")
+ return
- user.visible_message( \
- "[user] has added \the [O] to \the [src].", \
- "You add \the [O] to \the [src].")
-
- else
- ..()
- updateUsrDialog()
+ ..()
/obj/machinery/microwave/AltClick(mob/user)
- if(user.canUseTopic(src, BE_CLOSE) && !(operating || broken > 0 || panel_open || !anchored || dirty == 100))
+ if(user.canUseTopic(src, !issilicon(usr)))
cook()
-/*******************
-* Microwave Menu
-********************/
-
-/obj/machinery/microwave/ui_interact(mob/user) // The microwave Menu
+/obj/machinery/microwave/ui_interact(mob/user)
. = ..()
- if(panel_open || !anchored)
+
+ if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user)))
+ return
+ if(isAI(user) && (stat & NOPOWER))
return
- var/dat = ""
- if(broken > 0)
- dat += "ERROR: 09734014-A2379-D18746 --Bad memory
Contact your operator or use command line to rebase memory ///git checkout {HEAD} -a commit pull --rebase push {*NEW HEAD*}
" //Thats how all the git fiddling looks to me
- else if(operating)
- dat += "Microwaving in progress!
Please wait...!"
- else if(dirty==100)
- dat += "ERROR: >> 0 --Response input zero
Contact your operator of the device manifactor support."
- else
- var/list/items_counts = new
- for (var/obj/O in contents)
- if(istype(O, /obj/item/stack/))
- var/obj/item/stack/S = O
- items_counts[O.name] += S.amount
- else
- items_counts[O.name]++
- for (var/O in items_counts)
- var/N = items_counts[O]
- dat += "[capitalize(O)]: [N]
"
-
- if (items_counts.len==0)
- dat += "The microwave is empty."
+ if(!length(ingredients))
+ if(isAI(user))
+ examine(user)
else
- dat = "Ingredients:
[dat]"
- dat += "Turn on"
- dat += "Eject ingredients
"
+ to_chat(user, "\The [src] is empty.")
+ return
- var/datum/browser/popup = new(user, "microwave", name, 300, 300)
- popup.set_content(dat)
- popup.open()
+ var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user))
-/***********************************
-* Microwave Menu Handling/Cooking
-************************************/
+ // post choice verification
+ if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user)))
+ return
+ if(isAI(user) && (stat & NOPOWER))
+ return
+
+ usr.set_machine(src)
+ switch(choice)
+ if("eject")
+ eject()
+ if("use")
+ cook()
+ if("examine")
+ examine(user)
+
+/obj/machinery/microwave/proc/eject()
+ for(var/i in ingredients)
+ var/atom/movable/AM = i
+ AM.forceMove(drop_location())
+ ingredients.Cut()
/obj/machinery/microwave/proc/cook()
if(stat & (NOPOWER|BROKEN))
return
+ if(operating || broken > 0 || panel_open || !anchored || dirty == 100)
+ return
+
+ if(wire_disabled)
+ audible_message("[src] buzzes.")
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ return
+
+ if(prob(max((5 / efficiency) - 5, dirty * 5))) //a clean unupgraded microwave has no risk of failure
+ muck()
+ return
+ for(var/obj/O in ingredients)
+ if(istype(O, /obj/item/reagent_containers/food) || istype(O, /obj/item/grown))
+ continue
+ if(prob(min(dirty * 5, 100)))
+ start_can_fail()
+ return
+ break
start()
- if (prob(max(5/efficiency-5,dirty*5))) //a clean unupgraded microwave has no risk of failure
- muck_start()
- if (!microwaving(4))
- muck_finish()
- return
- muck_finish()
- return
+/obj/machinery/microwave/proc/turn_on()
+ visible_message("\The [src] turns on.", "You hear a microwave humming.")
+ operating = TRUE
- else
- if(has_extra_item() && prob(min(dirty*5,100)) && !microwaving(4))
- broke()
- return
+ set_light(1.5)
+ soundloop.start()
+ update_icon()
- if(!microwaving(10))
- abort()
- return
- stop()
+/obj/machinery/microwave/proc/spark()
+ visible_message("Sparks fly around [src]!")
+ var/datum/effect_system/spark_spread/s = new
+ s.set_up(2, 1, src)
+ s.start()
- var/metal = 0
- for(var/obj/item/O in contents)
- O.microwave_act(src)
- if(O.materials[MAT_METAL])
- metal += O.materials[MAT_METAL]
-
- if(metal)
- visible_message("Sparks fly around [src]!")
- if(prob(max(metal/2, 33)))
- explosion(loc,0,1,2)
- broke()
- return
-
- dropContents()
- return
-
-/obj/machinery/microwave/proc/microwaving(seconds as num)
- for (var/i=1 to seconds)
- if (stat & (NOPOWER|BROKEN))
- return 0
- use_power(500)
- sleep(max(12-2*efficiency,2)) // standard microwave means sleep(10). The better the efficiency, the faster the cooking
- return 1
-
-/obj/machinery/microwave/proc/has_extra_item()
- for (var/obj/O in contents)
- if ( \
- !istype(O, /obj/item/reagent_containers/food) && \
- !istype(O, /obj/item/grown) \
- )
- return 1
- return 0
+#define MICROWAVE_NORMAL 0
+#define MICROWAVE_MUCK 1
+#define MICROWAVE_PRE 2
/obj/machinery/microwave/proc/start()
- visible_message("The microwave turns on.", "You hear a microwave humming.")
- soundloop.start()
- operating = TRUE
- icon_state = "mw1"
- set_light(1.5)
- updateUsrDialog()
+ turn_on()
+ loop(MICROWAVE_NORMAL, 10)
-/obj/machinery/microwave/proc/abort()
- operating = FALSE // Turn it off again aferwards
- icon_state = "mw"
- updateUsrDialog()
- set_light(0)
- soundloop.stop()
+/obj/machinery/microwave/proc/start_can_fail()
+ turn_on()
+ loop(MICROWAVE_PRE, 4)
-/obj/machinery/microwave/proc/stop()
- abort()
+/obj/machinery/microwave/proc/muck()
+ turn_on()
+ playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
+ dirty_anim_playing = TRUE
+ update_icon()
+ loop(MICROWAVE_MUCK, 4)
-/obj/machinery/microwave/proc/dispose()
- for (var/obj/O in contents)
- O.forceMove(drop_location())
- to_chat(usr, "You dispose of the microwave contents.")
- updateUsrDialog()
+/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2)) // standard wait is 10
+ if(stat & (NOPOWER|BROKEN))
+ if(MICROWAVE_PRE)
+ pre_fail()
+ return
+ if(!time)
+ switch(type)
+ if(MICROWAVE_NORMAL)
+ loop_finish()
+ if(MICROWAVE_MUCK)
+ muck_finish()
+ if(MICROWAVE_PRE)
+ pre_success()
+ return
+ time--
+ use_power(500)
+ addtimer(CALLBACK(src, .proc/loop, type, time, wait), wait)
-/obj/machinery/microwave/proc/muck_start()
- playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
- icon_state = "mwbloody1" // Make it look dirty!!
+/obj/machinery/microwave/proc/loop_finish()
+ operating = FALSE
+
+ var/metal = 0
+ for(var/obj/item/O in ingredients)
+ O.microwave_act(src)
+ if(O.materials[MAT_METAL])
+ metal += O.materials[MAT_METAL]
+
+ if(metal)
+ spark()
+ broken = 2
+ if(prob(max(metal / 2, 33)))
+ explosion(loc, 0, 1, 2)
+ else
+ dropContents(ingredients)
+ ingredients.Cut()
+
+ after_finish_loop()
+
+/obj/machinery/microwave/proc/pre_fail()
+ broken = 2
+ operating = FALSE
+ spark()
+ after_finish_loop()
+
+/obj/machinery/microwave/proc/pre_success()
+ loop(MICROWAVE_NORMAL, 10)
/obj/machinery/microwave/proc/muck_finish()
- visible_message("The microwave gets covered in muck!")
- dirty = 100 // Make it dirty so it can't be used util cleaned
- icon_state = "mwbloody" // Make it look dirty too
- operating = FALSE // Turn it off again aferwards
- updateUsrDialog()
+ visible_message("\The [src] gets covered in muck!")
+
+ dirty = 100
+ dirty_anim_playing = FALSE
+ operating = FALSE
+
for(var/obj/item/reagent_containers/food/snacks/S in src)
if(prob(50))
new /obj/item/reagent_containers/food/snacks/badrecipe(src)
qdel(S)
+
+ after_finish_loop()
+
+/obj/machinery/microwave/proc/after_finish_loop()
set_light(0)
soundloop.stop()
+ update_icon()
-/obj/machinery/microwave/proc/broke()
- var/datum/effect_system/spark_spread/s = new
- s.set_up(2, 1, src)
- s.start()
- icon_state = "mwb" // Make it look all busted up and shit
- visible_message("The microwave breaks!") //Let them know they're stupid
- broken = 2 // Make it broken so it can't be used util fixed
- flags_1 = null //So you can't add condiments
- operating = FALSE // Turn it off again aferwards
- updateUsrDialog()
- set_light(0)
- soundloop.stop()
-
-/obj/machinery/microwave/Topic(href, href_list)
- if(..() || panel_open)
- return
-
- usr.set_machine(src)
- if(operating)
- updateUsrDialog()
- return
-
- switch(href_list["action"])
- if ("cook")
- cook()
-
- if ("dispose")
- dispose()
- updateUsrDialog()
+#undef MICROWAVE_NORMAL
+#undef MICROWAVE_MUCK
+#undef MICROWAVE_PRE
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 3f917273b4..35ce25bbaf 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -138,6 +138,10 @@
for (var/mob/M in src)
M.forceMove(drop_location())
+/obj/machinery/processor/container_resist(mob/living/user)
+ user.forceMove(drop_location())
+ user.visible_message("[user] crawls free of the processor!")
+
/obj/machinery/processor/slime
name = "slime processor"
desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating."
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index b06a160180..d608a73560 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -332,6 +332,12 @@
/obj/item/pizzabox/infinite/proc/attune_pizza(mob/living/carbon/human/noms) //tonight on "proc names I never thought I'd type"
if(!pizza_preferences[noms.ckey])
pizza_preferences[noms.ckey] = pickweight(pizza_types)
+ if(noms.has_quirk(/datum/quirk/pineapple_liker))
+ pizza_preferences[noms.ckey] = /obj/item/reagent_containers/food/snacks/pizza/pineapple
+ else if(noms.has_quirk(/datum/quirk/pineapple_hater))
+ var/list/pineapple_pizza_liker = pizza_types.Copy()
+ pineapple_pizza_liker -= /obj/item/reagent_containers/food/snacks/pizza/pineapple
+ pizza_preferences[noms.ckey] = pickweight(pineapple_pizza_liker)
if(noms.mind && noms.mind.assigned_role == "Botanist")
pizza_preferences[noms.ckey] = /obj/item/reagent_containers/food/snacks/pizza/dank
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index f41f6cce80..7c44857b1d 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -152,8 +152,8 @@
/datum/chemical_reaction/beepsky_smash
name = "Beepksy Smash"
id = "beepksysmash"
- results = list("beepskysmash" = 4)
- required_reagents = list("limejuice" = 2, "whiskey" = 2, "iron" = 1)
+ results = list("beepskysmash" = 5)
+ required_reagents = list("limejuice" = 2, "quadruple_sec" = 2, "iron" = 1)
/datum/chemical_reaction/doctor_delight
name = "The Doctor's Delight"
@@ -532,11 +532,18 @@
required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1)
mix_message = "The mixture turns to a sickening froth."
+/datum/chemical_reaction/lemonade
+ name = "Lemonade"
+ id = "lemonade"
+ results = list("lemonade" = 5)
+ required_reagents = list("lemonjuice" = 2, "water" = 2, "sugar" = 1, "ice" = 1)
+ mix_message = "You're suddenly reminded of home."
+
/datum/chemical_reaction/arnold_palmer
name = "Arnold Palmer"
id = "arnold_palmer"
results = list("arnold_palmer" = 2)
- required_reagents = list("tea" = 1, "lemonjuice" = 1)
+ required_reagents = list("tea" = 1, "lemonade" = 1)
mix_message = "The smells of fresh green grass and sand traps waft through the air as the mixture turns a friendly yellow-orange."
/datum/chemical_reaction/chocolate_milk
@@ -704,3 +711,87 @@
id = "pinktea"
results = list("pinktea" = 5)
required_reagents = list("aphro" = 1, "arnold_palmer" = 1, "sugar" = 1)
+
+/datum/chemical_reaction/blank_paper
+ name = "Blank Paper"
+ id = "blank_paper"
+ results = list("blank_paper" = 3)
+ required_reagents = list("silencer" = 1, "nothing" = 1, "nuka_cola" = 1)
+
+/datum/chemical_reaction/wizz_fizz
+ name = "Wizz Fizz"
+ id = "wizz_fizz"
+ results = list("wizz_fizz" = 3)
+ required_reagents = list("triple_sec" = 1, "sodawater" = 1, "champagne" = 1)
+ mix_message = "The beverage starts to froth with an almost mystical zeal!"
+ mix_sound = 'sound/effects/bubbles2.ogg'
+
+/datum/chemical_reaction/bug_spray
+ name = "Bug Spray"
+ id = "bug_spray"
+ results = list("bug_spray" = 5)
+ required_reagents = list("triple_sec" = 2, "lemon_lime" = 1, "rum" = 2, "vodka" = 1)
+ mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?"
+ mix_sound = 'sound/creatures/bee.ogg'
+
+/datum/chemical_reaction/jack_rose
+ name = "Jack Rose"
+ id = "jack_rose"
+ results = list("jack_rose" = 4)
+ required_reagents = list("grenadine" = 1, "applejack" = 2, "limejuice" = 1)
+ mix_message = "As the grenadine incorporates, the beverage takes on a mellow, red-orange glow."
+
+/datum/chemical_reaction/turbo
+ name = "Turbo"
+ id = "turbo"
+ results = list("turbo" = 5)
+ required_reagents = list("moonshine" = 2, "nitrous_oxide" = 1, "sugar_rush" = 1, "pwr_game" = 1)
+
+/datum/chemical_reaction/old_timer
+ name = "Old Timer"
+ id = "old_timer"
+ results = list("old_timer" = 6)
+ required_reagents = list("whiskeysoda" = 3, "parsnipjuice" = 2, "alexander" = 1)
+
+/datum/chemical_reaction/rubberneck
+ name = "Rubberneck"
+ id = "rubberneck"
+ results = list("rubberneck" = 10)
+ required_reagents = list("ethanol" = 4, "grey_bull" = 5, "astrotame" = 1)
+
+/datum/chemical_reaction/duplex
+ name = "Duplex"
+ id = "duplex"
+ results = list("duplex" = 4)
+ required_reagents = list("hcider" = 2, "applejuice" = 1, "berryjuice" = 1)
+
+/datum/chemical_reaction/trappist
+ name = "Trappist"
+ id = "trappist"
+ results = list("trappist" = 5)
+ required_reagents = list("ale" = 2, "holywater" = 2, "sugar" = 1)
+
+/datum/chemical_reaction/cream_soda
+ name = "Cream Soda"
+ id = "cream_soda"
+ results = list("cream_soda" = 4)
+ required_reagents = list("sugar" = 2, "sodawater" = 2, "vanilla" = 1)
+
+/datum/chemical_reaction/blazaam
+ name = "Blazaam"
+ id = "blazaam"
+ results = list("blazaam" = 3)
+ required_reagents = list("gin" = 2, "peachjuice" = 1, "bluespace" = 1)
+
+/datum/chemical_reaction/planet_cracker
+ name = "Planet Cracker"
+ id = "planet_cracker"
+ results = list("planet_cracker" = 4)
+ required_reagents = list("champagne" = 2, "lizardwine" = 2, "eggyolk" = 1, "gold" = 1)
+ mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited."
+
+/datum/chemical_reaction/red_queen
+ name = "Red Queen"
+ id = "red_queen"
+ results = list("red_queen" = 10)
+ required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 0c4e2c2e30..a6240e5b48 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -116,7 +116,7 @@
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/jelliedyoast
+/datum/crafting_recipe/food/jelliedtoast
name = "Jellied toast"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
@@ -125,6 +125,15 @@
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
subcategory = CAT_MISCFOOD
+/datum/crafting_recipe/food/peanutbuttertoast
+ name = "Peanut butter toast"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/twobread
name = "Two bread"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 133713ac75..127b2cc238 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -43,6 +43,48 @@
result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry
subcategory = CAT_SANDWICH
+/datum/crafting_recipe/food/pbj_slimesandwich
+ name = "PB&J sandwich"
+ reqs = list(
+ /datum/reagent/toxin/slimejelly = 5,
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/slime
+ subcategory = CAT_SANDWICH
+
+/datum/crafting_recipe/food/pbj_slimesandwich/alt
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/jelliedtoast/slime = 1,
+ /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
+ )
+
+/datum/crafting_recipe/food/pbj_sandwich
+ name = "PB&J sandwich"
+ reqs = list(
+ /datum/reagent/consumable/cherryjelly = 5,
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/jellysandwich/pbj/cherry
+ subcategory = CAT_SANDWICH
+
+/datum/crafting_recipe/food/pbj_sandwich/alt
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry = 1,
+ /obj/item/reagent_containers/food/snacks/peanut_buttertoast = 1,
+ )
+
+/datum/crafting_recipe/peanutbutter_sandwich
+ name = "Peanut butter sandwich"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
+ subcategory = CAT_SANDWICH
+
+
/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm
index 9197e3d044..8953753a89 100644
--- a/code/modules/games/cas.dm
+++ b/code/modules/games/cas.dm
@@ -31,18 +31,17 @@
decksize = 50
card_text_file = "strings/cas_black.txt"
-/obj/item/toy/cards/deck/cas/Initialize()
- . = ..()
+/obj/item/toy/cards/deck/cas/populate_deck()
var/static/list/cards_against_space = list("cas_white" = world.file2list("strings/cas_white.txt"),"cas_black" = world.file2list("strings/cas_black.txt"))
allcards = cards_against_space[card_face]
var/list/possiblecards = allcards.Copy()
if(possiblecards.len < decksize) // sanity check
decksize = (possiblecards.len - 1)
var/list/randomcards = list()
- while (randomcards.len < decksize)
+ for(var/x in 1 to decksize)
randomcards += pick_n_take(possiblecards)
- for(var/i=1 to randomcards.len)
- var/cardtext = randomcards[i]
+ for(var/x in 1 to randomcards.len)
+ var/cardtext = randomcards[x]
var/datum/playingcard/P
P = new()
P.name = "[cardtext]"
@@ -50,7 +49,7 @@
cards += P
if(!blanks)
return
- for(var/x=1 to blanks)
+ for(var/x in 1 to blanks)
var/datum/playingcard/P
P = new()
P.name = "Blank Card"
@@ -58,10 +57,7 @@
cards += P
shuffle_inplace(cards) // distribute blank cards throughout deck
-/obj/item/toy/cards/deck/cas/attack_hand(mob/user)
- . = ..()
- if(.)
- return
+/obj/item/toy/cards/deck/cas/draw_card(mob/user)
if(user.lying)
return
if(cards.len == 0)
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 33884f8ef0..cf11b77879 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -303,6 +303,7 @@ h1.alert, h2.alert {color: #000000;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
+.alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
@@ -316,6 +317,8 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
+.red {color: #FF0000}
+.blue {color: #215cff}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
diff --git a/code/modules/hydroponics/grown/peanuts.dm b/code/modules/hydroponics/grown/peanuts.dm
new file mode 100644
index 0000000000..2423300cc4
--- /dev/null
+++ b/code/modules/hydroponics/grown/peanuts.dm
@@ -0,0 +1,30 @@
+/obj/item/seeds/peanutseed
+ name = "pack of peanut seeds"
+ desc = "These seeds grow to produce fruits botanically classified as legumes, but mundanely referred as nuts."
+ icon_state = "seed-peanut"
+ species = "peanut"
+ plantname = "Peanut Vines"
+ product = /obj/item/reagent_containers/food/snacks/grown/peanut
+ yield = 6
+ growthstages = 4
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list("vitamin" = 0.02, "nutriment" = 0.15, "cooking_oil" = 0.03)
+
+/obj/item/reagent_containers/food/snacks/grown/peanut
+ seed = /obj/item/seeds/peanutseed
+ name = "peanut"
+ desc = "Peanuts for the peanut gallery!" //get me a better description, boys.
+ icon_state = "peanut"
+ filling_color = "#C4AE7A"
+ bitesize = 100
+ foodtype = VEGETABLES
+ dried_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
+ cooked_type = /obj/item/reagent_containers/food/snacks/roasted_peanuts
+
+/obj/item/reagent_containers/food/snacks/roasted_peanuts
+ name = "roasted peanuts"
+ desc = "A handful of roasted peanuts, with or without salt."
+ icon_state = "roasted_peanuts"
+ foodtype = VEGETABLES
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ juice_results = list("peanut_butter" = 3)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index be0a209c9f..090809ca88 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -54,6 +54,7 @@
icon_state = "parsnip"
bitesize_mod = 2
foodtype = VEGETABLES
+ juice_results = list("parsnipjuice" = 0)
wine_power = 35
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 86efc4c74a..3975da18b6 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -112,7 +112,7 @@
var/brightness = get_pin_data(IC_INPUT, 2)
if(new_color && isnum(brightness))
- brightness = CLAMP(brightness, 0, 4)
+ brightness = CLAMP(brightness, 0, 10)
light_rgb = new_color
light_brightness = brightness
@@ -411,4 +411,4 @@
if(assembly)
assembly.investigate_log("displayed \"[html_encode(stuff_to_display)]\" with [type].", INVESTIGATE_CIRCUIT)
else
- investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
\ No newline at end of file
+ investigate_log("displayed \"[html_encode(stuff_to_display)]\" as [type].", INVESTIGATE_CIRCUIT)
diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm
index 944499470a..46e3d66f55 100644
--- a/code/modules/jobs/job_types/civilian.dm
+++ b/code/modules/jobs/job_types/civilian.dm
@@ -18,6 +18,7 @@ Clown
minimal_access = list(ACCESS_THEATRE)
/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
+ . = ..()
H.apply_pref_name("clown", M.client)
/datum/outfit/job/clown
@@ -174,6 +175,8 @@ Lawyer
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/outfit/job/lawyer
name = "Lawyer"
jobtype = /datum/job/lawyer
diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm
index e44347a208..2d190cfe60 100644
--- a/code/modules/jobs/job_types/civilian_chaplain.dm
+++ b/code/modules/jobs/job_types/civilian_chaplain.dm
@@ -19,19 +19,20 @@ Chaplain
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
/datum/job/chaplain/after_spawn(mob/living/H, mob/M)
+ . = ..()
if(H.mind)
H.mind.isholy = TRUE
var/obj/item/storage/book/bible/booze/B = new
- if(SSreligion.religion)
- B.deity_name = SSreligion.deity
- B.name = SSreligion.bible_name
- B.icon_state = SSreligion.bible_icon_state
- B.item_state = SSreligion.bible_item_state
- to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [SSreligion.deity]. Defer to the Chaplain.")
+ if(GLOB.religion)
+ B.deity_name = GLOB.deity
+ B.name = GLOB.bible_name
+ B.icon_state = GLOB.bible_icon_state
+ B.item_state = GLOB.bible_item_state
+ to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.")
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
- var/nrt = SSreligion.holy_weapon_type || /obj/item/nullrod
+ var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod
var/obj/item/nullrod/N = new nrt(H)
H.put_in_hands(N)
return
@@ -74,9 +75,9 @@ Chaplain
else
B.name = "The Holy Book of [new_religion]"
- SSreligion.religion = new_religion
- SSreligion.bible_name = B.name
- SSreligion.deity = B.deity_name
+ GLOB.religion = new_religion
+ GLOB.bible_name = B.name
+ GLOB.deity = B.deity_name
H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK)
diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm
index e441b3e889..f678700735 100644
--- a/code/modules/jobs/job_types/job.dm
+++ b/code/modules/jobs/job_types/job.dm
@@ -54,10 +54,15 @@
//can be overridden by antag_rep.txt config
var/antag_rep = 10
+ var/list/mind_traits // Traits added to the mind of the mob assigned this job
+
//Only override this proc
//H is usually a human unless an /equip override transformed it
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
//do actions on H but send messages to M as the key may not have been transferred_yet
+ if(mind_traits)
+ for(var/t in mind_traits)
+ ADD_TRAIT(H.mind, t, JOB_TRAIT)
/datum/job/proc/announce(mob/living/carbon/human/H)
if(head_announce)
diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm
index e7e0922f62..8d2b9e8681 100644
--- a/code/modules/jobs/job_types/security.dm
+++ b/code/modules/jobs/job_types/security.dm
@@ -35,6 +35,8 @@ Head of Security
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/outfit/job/hos
name = "Head of Security"
jobtype = /datum/job/hos
@@ -92,6 +94,8 @@ Warden
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/job/warden/get_access()
var/list/L = list()
L = ..() | check_config_for_sec_maint()
@@ -145,6 +149,8 @@ Detective
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+
/datum/outfit/job/detective
name = "Detective"
jobtype = /datum/job/detective
@@ -198,6 +204,7 @@ Security Officer
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
+ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
/datum/job/officer/get_access()
var/list/L = list()
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 8ae63a8a76..699df5de12 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -485,11 +485,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
if(href_list["printbible"])
if(cooldown < world.time)
var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible(src.loc)
- if(SSreligion.bible_icon_state && SSreligion.bible_item_state)
- B.icon_state = SSreligion.bible_icon_state
- B.item_state = SSreligion.bible_item_state
- B.name = SSreligion.bible_name
- B.deity_name = SSreligion.deity
+ if(GLOB.bible_icon_state && GLOB.bible_item_state)
+ B.icon_state = GLOB.bible_icon_state
+ B.item_state = GLOB.bible_item_state
+ B.name = GLOB.bible_name
+ B.deity_name = GLOB.deity
cooldown = world.time + PRINTER_COOLDOWN
else
say("Printer currently unavailable, please wait a moment.")
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 84be6438c0..4ccac5f9d7 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -164,7 +164,7 @@
return
var/obj/effect/mob_spawn/MS = pick(GLOB.mob_spawners[href_list["JoinAsGhostRole"]])
- if(istype(MS) && MS.attack_ghost(src, latejoinercalling = TRUE))
+ if(MS.attack_ghost(src, latejoinercalling = TRUE))
SSticker.queued_players -= src
SSticker.queue_delay = 4
qdel(src)
@@ -444,6 +444,11 @@
if(job && IsJobUnavailable(job.title, TRUE) == JOB_AVAILABLE)
available_job_count++
for(var/spawner in GLOB.mob_spawners)
+ if(!LAZYLEN(spawner))
+ continue
+ var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner])
+ if(!istype(S) || !S.can_latejoin())
+ continue
available_job_count++
break
@@ -465,6 +470,11 @@
"Security" = list(jobs = list(), titles = GLOB.security_positions, color = "#ff9999"),
)
for(var/spawner in GLOB.mob_spawners)
+ if(!LAZYLEN(spawner))
+ continue
+ var/obj/effect/mob_spawn/S = pick(GLOB.mob_spawners[spawner])
+ if(!istype(S) || !S.can_latejoin())
+ continue
categorizedJobs["Ghost Role"]["jobs"] += spawner
for(var/datum/job/job in SSjob.occupations)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
index 01a83dcc9f..3384f3754b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
@@ -67,6 +67,38 @@
name = "Short (White)"
icon_state = "white_short"
+/datum/sprite_accessory/socks/stockings_blue
+ name = "Stockings (Blue)"
+ icon_state = "stockings_blue"
+
+/datum/sprite_accessory/socks/stockings_cyan
+ name = "Stockings (Cyan)"
+ icon_state = "stockings_cyan"
+
+/datum/sprite_accessory/socks/stockings_dpink
+ name = "Stockings (Dark Pink)"
+ icon_state = "stockings_dpink"
+
+/datum/sprite_accessory/socks/stockings_green
+ name = "Stockings (Green)"
+ icon_state = "stockings_black"
+
+/datum/sprite_accessory/socks/stockings_orange
+ name = "Stockings (Orange)"
+ icon_state = "stockings_orange"
+
+/datum/sprite_accessory/socks/stockings_programmer
+ name = "Stockings (Programmer)"
+ icon_state = "stockings_lpink"
+
+/datum/sprite_accessory/socks/stockings_purple
+ name = "Stockings (Purple)"
+ icon_state = "stockings_purple"
+
+/datum/sprite_accessory/socks/stockings_yellow
+ name = "Stockings (Yellow)"
+ icon_state = "stockings_yellow"
+
/datum/sprite_accessory/socks/bee_thigh
name = "Thigh-high (Bee)"
icon_state = "bee_thigh"
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 2ced3054c4..dafc6cf5e0 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -265,7 +265,7 @@
var/list/datum/brain_trauma/possible_traumas = list()
for(var/T in subtypesof(brain_trauma_type))
var/datum/brain_trauma/BT = T
- if(can_gain_trauma(BT, resilience))
+ if(can_gain_trauma(BT, resilience) && initial(BT.random_gain))
possible_traumas += BT
if(!LAZYLEN(possible_traumas))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 51ee5b372b..92a993958a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -496,9 +496,12 @@
add_splatter_floor(T)
if(stun)
adjustBruteLoss(3)
+ else if(src.reagents.has_reagent("blazaam"))
+ if(T)
+ T.add_vomit_floor(src, VOMIT_PURPLE)
else
if(T)
- T.add_vomit_floor(src, toxic)//toxic barf looks different
+ T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different
T = get_step(T, dir)
if (is_blocked_turf(T))
break
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2a75119841..b42346382f 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -54,7 +54,12 @@
else
visible_message("[src] deflects the projectile!", "You deflect the projectile!")
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- return 0
+ if(!mind.martial_art.reroute_deflection)
+ return FALSE
+ else
+ P.firer = src
+ P.setAngle(rand(0, 360))//SHING
+ return FALSE
if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself
if(P.is_reflectable)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index d1ec7f3e4b..de976da40f 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -22,7 +22,7 @@
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
var/lip_color = "white"
- var/age = 30 //Player's age (pure fluff)
+ var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
var/undershirt = "Nude" //Which undershirt the player wants
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 4fb3fb0243..3324b07217 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -44,6 +44,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/siemens_coeff = 1 //base electrocution coefficient
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
+ var/list/special_step_sounds //Sounds to override barefeet walkng
+ var/grab_sound //Special sound for grabbing
// species-only traits. Can be found in DNA.dm
var/list/species_traits = list()
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index ff90929c4b..2907caff13 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -30,6 +30,7 @@
var/list/special_names = list("Tarkus")
var/human_surname_chance = 3
var/special_name_chance = 5
+ var/owner //dobby is a free golem
/datum/species/golem/random_name(gender,unique,lastname)
var/golem_surname = pick(GLOB.golem_names)
@@ -807,3 +808,196 @@
/datum/species/golem/plastic/on_species_loss(mob/living/carbon/C)
. = ..()
C.ventcrawler = initial(C.ventcrawler)
+
+/datum/species/golem/bronze
+ name = "Bronze Golem"
+ id = "bronze golem"
+ prefix = "Bronze"
+ special_names = list("Bell")
+ fixed_mut_color = "cd7f32"
+ info_text = "As a Bronze Golem, you are very resistant to loud noises, and make loud noises if something hard hits you, however this ability does hurt your hearing."
+ special_step_sounds = list('sound/machines/clockcult/integration_cog_install.ogg', 'sound/magic/clockwork/fellowship_armory.ogg' )
+ attack_verb = "bonk"
+ mutantears = /obj/item/organ/ears/bronze
+ var/last_gong_time = 0
+ var/gong_cooldown = 150
+
+/datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
+ if(!(world.time > last_gong_time + gong_cooldown))
+ return ..()
+ if(P.flag == "bullet" || P.flag == "bomb")
+ gong(H)
+ return ..()
+
+/datum/species/golem/bronze/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
+ ..()
+ if(world.time > last_gong_time + gong_cooldown)
+ gong(H)
+
+/datum/species/golem/bronze/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
+ ..()
+ if(world.time > last_gong_time + gong_cooldown && M.a_intent != INTENT_HELP)
+ gong(H)
+
+/datum/species/golem/bronze/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
+ ..()
+ if(world.time > last_gong_time + gong_cooldown)
+ gong(H)
+
+/datum/species/golem/bronze/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
+ ..()
+ if(world.time > last_gong_time + gong_cooldown)
+ gong(H)
+
+/datum/species/golem/bronze/proc/gong(mob/living/carbon/human/H)
+ last_gong_time = world.time
+ for(var/mob/living/M in get_hearers_in_view(7,H))
+ if(M.stat == DEAD) //F
+ return
+ if(M == H)
+ H.show_message("You cringe with pain as your body rings around you!", 2)
+ H.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
+ H.soundbang_act(2, 0, 100, 1)
+ H.jitteriness += 7
+ var/distance = max(0,get_dist(get_turf(H),get_turf(M)))
+ switch(distance)
+ if(0 to 1)
+ M.show_message("GONG!", 2)
+ M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE)
+ M.soundbang_act(1, 0, 30, 3)
+ M.confused += 10
+ M.jitteriness += 4
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
+ if(2 to 3)
+ M.show_message("GONG!", 2)
+ M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE)
+ M.soundbang_act(1, 0, 15, 2)
+ M.jitteriness += 3
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong)
+ else
+ M.show_message("GONG!", 2)
+ M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE)
+
+
+/datum/species/golem/cardboard //Faster but weaker, can also make new shells on its own
+ name = "Cardboard Golem"
+ id = "cardboard golem"
+ prefix = "Cardboard"
+ special_names = list("Box")
+ info_text = "As a Cardboard Golem, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself."
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
+ inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ fixed_mut_color = "ffffff"
+ limbs_id = "c_golem" //special sprites
+ attack_verb = "bash"
+ armor = 25
+ burnmod = 1.25
+ heatmod = 2
+ speedmod = 1.5
+ punchdamagelow = 4
+ punchstunthreshold = 7
+ punchdamagehigh = 8
+ var/last_creation = 0
+ var/brother_creation_cooldown = 300
+
+/datum/species/golem/cardboard/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
+ . = ..()
+ if(user != H)
+ return FALSE //forced reproduction is rape.
+ if(istype(I, /obj/item/stack/sheet/cardboard))
+ var/obj/item/stack/sheet/cardboard/C = I
+ if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork
+ return
+ if(C.amount < 10)
+ to_chat(H, "You do not have enough cardboard!")
+ return FALSE
+ to_chat(H, "You attempt to create a new cardboard brother.")
+ if(do_after(user, 30, target = user))
+ if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork
+ return
+ if(!C.use(10))
+ to_chat(H, "You do not have enough cardboard!")
+ return FALSE
+ to_chat(H, "You create a new cardboard golem shell.")
+ create_brother(H.loc)
+
+/datum/species/golem/cardboard/proc/create_brother(var/location)
+ new /obj/effect/mob_spawn/human/golem/servant(location, /datum/species/golem/cardboard, owner)
+ last_creation = world.time
+
+/datum/species/golem/leather
+ name = "Leather Golem"
+ id = "leather golem"
+ special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH
+ inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
+ prefix = "Leather"
+ fixed_mut_color = "624a2e"
+ info_text = "As a Leather Golem, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
+ attack_verb = "whipp"
+ grab_sound = 'sound/weapons/whipgrab.ogg'
+ attack_sound = 'sound/weapons/whip.ogg'
+
+/datum/species/golem/bone
+ name = "Bone Golem"
+ id = "bone golem"
+ say_mod = "rattles"
+ prefix = "Bone"
+ limbs_id = "b_golem"
+ special_names = list("Head", "Broth", "Fracture", "Rattler", "Appetit")
+ liked_food = GROSS | MEAT | RAW
+ toxic_food = null
+ inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
+ mutanttongue = /obj/item/organ/tongue/bone
+ sexes = FALSE
+ fixed_mut_color = "ffffff"
+ attack_verb = "rattl"
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NOGENITALS,NOAROUSAL,MUTCOLORS)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH,TRAIT_CALCIUM_HEALER)
+ info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
+ var/datum/action/innate/bonechill/bonechill
+
+/datum/species/golem/bone/on_species_gain(mob/living/carbon/C, datum/species/old_species)
+ ..()
+ if(ishuman(C))
+ bonechill = new
+ bonechill.Grant(C)
+
+/datum/species/golem/bone/on_species_loss(mob/living/carbon/C)
+ if(bonechill)
+ bonechill.Remove(C)
+ ..()
+
+/datum/action/innate/bonechill
+ name = "Bone Chill"
+ desc = "Rattle your bones and strike fear into your enemies!"
+ check_flags = AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_spells.dmi'
+ button_icon_state = "bonechill"
+ var/cooldown = 600
+ var/last_use
+ var/snas_chance = 3
+
+/datum/action/innate/bonechill/Activate()
+ if(world.time < last_use + cooldown)
+ to_chat("You aren't ready yet to rattle your bones again")
+ return
+ owner.visible_message("[owner] rattles [owner.p_their()] bones harrowingly.", "You rattle your bones")
+ last_use = world.time
+ if(prob(snas_chance))
+ playsound(get_turf(owner),'sound/magic/RATTLEMEBONES2.ogg', 100)
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ var/mutable_appearance/badtime = mutable_appearance('icons/mob/human_parts.dmi', "b_golem_eyes", -FIRE_LAYER-0.5)
+ badtime.appearance_flags = RESET_COLOR
+ H.overlays_standing[FIRE_LAYER+0.5] = badtime
+ H.apply_overlay(FIRE_LAYER+0.5)
+ addtimer(CALLBACK(H, /mob/living/carbon/.proc/remove_overlay, FIRE_LAYER+0.5), 25)
+ else
+ playsound(get_turf(owner),'sound/magic/RATTLEMEBONES.ogg', 100)
+ for(var/mob/living/L in orange(7, get_turf(owner)))
+ if((MOB_UNDEAD in L.mob_biotypes) || isgolem(L) || HAS_TRAIT(L, TRAIT_RESISTCOLD))
+ return //Do not affect our brothers
+
+ to_chat(L, "A spine-chilling sound chills you to the bone!")
+ L.apply_status_effect(/datum/status_effect/bonechill)
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "spooked", /datum/mood_event/spooked)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index b218b2cefc..2b487d4349 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -5,6 +5,7 @@
default_color = "00FF90"
say_mod = "chirps"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ mutantlungs = /obj/item/organ/lungs/slime
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur") //CIT CHANGE
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None") //CIT CHANGE
inherent_traits = list(TRAIT_TOXINLOVER)
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index afd6e4e7f5..d7bb151ddc 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -5,7 +5,7 @@
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
- inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER,TRAIT_CALCIUM_HEALER)
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index c3d1e1aedb..0da4073f1d 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -73,6 +73,9 @@
/datum/species/pod/pseudo_weak
id = "podweak"
limbs_id = "pod"
+ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS)
+ mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
light_nutrition_gain_factor = 7.5
light_bruteheal = 0.2
light_burnheal = 0.2
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 5c2b01a179..135992f3a6 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -7,7 +7,7 @@
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
- inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
mutanttongue = /obj/item/organ/tongue/bone
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
@@ -21,4 +21,4 @@
/datum/species/skeleton/pirate
name = "Space Queen's Skeleton"
- inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index b2eb83d668..9dd55c361e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -250,38 +250,39 @@
//MIASMA
if(breath_gases[/datum/gas/miasma])
var/miasma_partialpressure = (breath_gases[/datum/gas/miasma]/breath.total_moles())*breath_pressure
+ if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE)
- if(prob(1 * miasma_partialpressure))
- var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
- miasma_disease.name = "Unknown"
- ForceContractDisease(miasma_disease, TRUE, TRUE)
+ if(prob(0.05 * miasma_partialpressure))
+ var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
+ miasma_disease.name = "Unknown"
+ ForceContractDisease(miasma_disease, TRUE, TRUE)
- //Miasma side effects
- switch(miasma_partialpressure)
- if(1 to 5)
- // At lower pp, give out a little warning
- SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
- if(prob(5))
- to_chat(src, "There is an unpleasant smell in the air.")
- if(5 to 20)
- //At somewhat higher pp, warning becomes more obvious
- if(prob(15))
- to_chat(src, "You smell something horribly decayed inside this room.")
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
- if(15 to 30)
- //Small chance to vomit. By now, people have internals on anyway
- if(prob(5))
- to_chat(src, "The stench of rotting carcasses is unbearable!")
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
- vomit()
- if(30 to INFINITY)
- //Higher chance to vomit. Let the horror start
- if(prob(25))
- to_chat(src, "The stench of rotting carcasses is unbearable!")
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
- vomit()
- else
- SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
+ //Miasma side effects
+ switch(miasma_partialpressure)
+ if(1 to 5)
+ // At lower pp, give out a little warning
+ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
+ if(prob(5))
+ to_chat(src, "There is an unpleasant smell in the air.")
+ if(5 to 20)
+ //At somewhat higher pp, warning becomes more obvious
+ if(prob(15))
+ to_chat(src, "You smell something horribly decayed inside this room.")
+ SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
+ if(15 to 30)
+ //Small chance to vomit. By now, people have internals on anyway
+ if(prob(5))
+ to_chat(src, "The stench of rotting carcasses is unbearable!")
+ SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
+ vomit()
+ if(30 to INFINITY)
+ //Higher chance to vomit. Let the horror start
+ if(prob(25))
+ to_chat(src, "The stench of rotting carcasses is unbearable!")
+ SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
+ vomit()
+ else
+ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell")
//Clear all moods if no miasma at all
@@ -344,7 +345,7 @@
var/list/cached_gases = miasma_turf.air.gases
- cached_gases[/datum/gas/miasma] += 0.02
+ cached_gases[/datum/gas/miasma] += 0.1
/mob/living/carbon/proc/handle_blood()
return
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 4c1c235fe1..85436178fe 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -73,39 +73,21 @@
if(I.loc == src)
return TRUE
- if(I.anchored)
+ if(I.anchored || !put_in_hands(I))
blacklistItems[I] ++
return FALSE
- // WEAPONS
- if(istype(I, /obj/item))
- var/obj/item/W = I
- if(W.force >= best_force)
- put_in_hands(W)
- best_force = W.force
- return TRUE
-
- // CLOTHING
- else if(istype(I, /obj/item/clothing))
- var/obj/item/clothing/C = I
- monkeyDrop(C)
- addtimer(CALLBACK(src, .proc/pickup_and_wear, C), 5)
- return TRUE
-
- // EVERYTHING ELSE
+ if(I.force >= best_force)
+ best_force = I.force
else
- if(!get_item_for_held_index(1) || !get_item_for_held_index(2))
- put_in_hands(I)
- return TRUE
+ addtimer(CALLBACK(src, .proc/pickup_and_wear, I), 5)
- blacklistItems[I] ++
- return FALSE
+ return TRUE
-/mob/living/carbon/monkey/proc/pickup_and_wear(var/obj/item/clothing/C)
- if(!equip_to_appropriate_slot(C))
- monkeyDrop(get_item_by_slot(C)) // remove the existing item if worn
- sleep(5)
- equip_to_appropriate_slot(C)
+/mob/living/carbon/monkey/proc/pickup_and_wear(obj/item/I)
+ if(QDELETED(I) || I.loc != src)
+ return
+ equip_to_appropriate_slot(I)
/mob/living/carbon/monkey/resist_restraints()
var/obj/item/I = null
@@ -311,7 +293,8 @@
if(I == pickupTarget)
M.visible_message("[src] snatches [pickupTarget] from [M].", "[src] snatched [pickupTarget]!")
if(M.temporarilyRemoveItemFromInventory(pickupTarget) && !QDELETED(pickupTarget))
- equip_item(pickupTarget)
+ if(!equip_item(pickupTarget))
+ dropItemToGround(pickupTarget)
else
M.visible_message("[src] tried to snatch [pickupTarget] from [M], but failed!", "[src] tried to grab [pickupTarget]!")
pickpocketing = FALSE
diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm
index f6e43f487f..c52b827964 100644
--- a/code/modules/mob/living/carbon/say.dm
+++ b/code/modules/mob/living/carbon/say.dm
@@ -39,10 +39,21 @@
else
. = initial(dt.flags) & TONGUELESS_SPEECH
-/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+/mob/living/carbon/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
. = ..()
if(!client)
return
for(var/T in get_traumas())
var/datum/brain_trauma/trauma = T
- message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
\ No newline at end of file
+ message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq)
+
+ if (src.mind.has_antag_datum(/datum/antagonist/traitor))
+ for (var/codeword in GLOB.syndicate_code_phrase)
+ var/regex/codeword_match = new("([codeword])", "ig")
+ message = codeword_match.Replace(message, "$1")
+
+ for (var/codeword in GLOB.syndicate_code_response)
+ var/regex/codeword_match = new("([codeword])", "ig")
+ message = codeword_match.Replace(message, "$1")
+
+ return message
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b253e27e8d..b844a294be 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -263,7 +263,7 @@
var/mob/M = AM
log_combat(src, M, "grabbed", addition="passive grab")
- if(!supress_message)
+ if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER)))
visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!") //Cit change - And they thought ERP was bad.
if(!iscarbon(src))
M.LAssailant = null
@@ -281,6 +281,11 @@
var/datum/disease/D = thing
if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN)
ContactContractDisease(D)
+
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER))
+ C.grippedby(src)
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index e2f62b054c..160e596882 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -229,9 +229,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
// Recompose message for AI hrefs, language incomprehension.
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
+ message = hear_intercept(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+
show_message(message, 2, deaf_message, deaf_type)
return message
+/mob/living/proc/hear_intercept(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
+ return message
+
/mob/living/send_speech(message, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language=null, message_mode)
var/static/list/eavesdropping_modes = list(MODE_WHISPER = TRUE, MODE_WHISPER_CRIT = TRUE)
var/eavesdrop_range = 0
@@ -389,8 +394,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
else
. = ..()
-/mob/living/whisper(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null)
- say("#[message]", bubble_type, spans, sanitize, language)
+/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
+ say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
/mob/living/get_language_holder(shadow=TRUE)
if(mind && shadow)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 6d225d3913..1b1eb1a805 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -288,8 +288,17 @@
/mob/living/silicon/ai/can_interact_with(atom/A)
. = ..()
+ var/turf/ai = get_turf(src)
+ var/turf/target = get_turf(A)
if (.)
return
+
+ if(!target)
+ return
+
+ if ((ai.z != target.z) && !is_station_level(ai.z))
+ return FALSE
+
if (istype(loc, /obj/item/aicard))
var/turf/T0 = get_turf(src)
var/turf/T1 = get_turf(A)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e71e269222..29fbd39e2c 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -580,6 +580,19 @@
else
return ..()
+/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/I) //TODO: make fucking everything up there in that attackby() proc use the proper tool_act() procs. But honestly, who has time for that? 'cause I know for sure that you, the person reading this, sure as hell doesn't.
+ var/validbreakout = FALSE
+ for(var/obj/item/dogborg/sleeper/S in held_items)
+ if(!LAZYLEN(S.contents))
+ continue
+ if(!validbreakout)
+ visible_message("[user] wedges [I] into the crevice separating [S] from [src]'s chassis, and begins to pry...", "You wedge [I] into the crevice separating [S] from [src]'s chassis, and begin to pry...")
+ validbreakout = TRUE
+ S.go_out()
+ if(validbreakout)
+ return TRUE
+ return ..()
+
/mob/living/silicon/robot/verb/unlock_own_cover()
set category = "Robot Commands"
set name = "Unlock Cover"
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index d0e3fc8b1c..fa1ab7fc17 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -69,6 +69,9 @@
/mob/living/silicon/contents_explosion(severity, target)
return
+/mob/living/silicon/prevent_content_explosion()
+ return TRUE
+
/mob/living/silicon/proc/cancelAlarm()
return
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 9a08276999..5e5b486435 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -284,12 +284,8 @@
if(health < maxHealth)
adjustBruteLoss(-8) //Fast life regen
for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts!
- if(D.icon_state != "donut2")
- D.name = "frosted donut"
- D.icon_state = "donut2"
- D.reagents.add_reagent("sprinkles", 2)
- D.bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
- D.filling_color = "#FF69B4"
+ if(!D.is_frosted)
+ D.frost_donut()
/mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L)
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 3a5d02315b..c194233c42 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -28,13 +28,29 @@
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1)
childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5)
animal_species = /mob/living/simple_animal/pet/dog
- var/shaved = 0
- var/obj/item/inventory_head
- var/obj/item/inventory_back
- var/nofur = 0 //Corgis that have risen past the material plane of existence.
gold_core_spawnable = FRIENDLY_SPAWN
can_be_held = TRUE
collar_type = "corgi"
+ var/obj/item/inventory_head
+ var/obj/item/inventory_back
+ var/shaved = FALSE
+ var/nofur = FALSE //Corgis that have risen past the material plane of existence.
+
+/mob/living/simple_animal/pet/dog/corgi/Destroy()
+ QDEL_NULL(inventory_head)
+ QDEL_NULL(inventory_back)
+ return ..()
+
+/mob/living/simple_animal/pet/dog/corgi/handle_atom_del(atom/A)
+ if(A == inventory_head)
+ inventory_head = null
+ update_corgi_fluff()
+ regenerate_icons()
+ if(A == inventory_back)
+ inventory_back = null
+ update_corgi_fluff()
+ regenerate_icons()
+ return ..()
/mob/living/simple_animal/pet/dog/pug
name = "\improper pug"
@@ -80,23 +96,17 @@
regenerate_icons()
/mob/living/simple_animal/pet/dog/corgi/show_inv(mob/user)
- user.set_machine(src)
- if(user.stat)
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
+ user.set_machine(src)
var/dat = "Inventory of [name]
"
- if(inventory_head)
- dat += "
Head: [inventory_head] (Remove)"
- else
- dat += "
Head: Nothing"
- if(inventory_back)
- dat += "
Back: [inventory_back] (Remove)"
- else
- dat += "
Back: Nothing"
+ dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]"
+ dat += "
Back: [inventory_back]" : "add_inv=back'>Nothing"]"
+ dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]"
- user << browse(dat, text("window=mob[];size=325x500", real_name))
- onclose(user, "mob[real_name]")
- return
+ user << browse(dat, "window=mob[REF(src)];size=325x500")
+ onclose(user, "mob[REF(src)]")
/mob/living/simple_animal/pet/dog/corgi/getarmor(def_zone, type)
var/armorval = 0
@@ -128,7 +138,7 @@
if(do_after(user, 50, target = src))
user.visible_message("[user] shaves [src]'s hair using \the [O].")
playsound(loc, 'sound/items/welder2.ogg', 20, 1)
- shaved = 1
+ shaved = TRUE
icon_living = "[initial(icon_living)]_shaved"
icon_dead = "[initial(icon_living)]_shaved_dead"
if(stat == CONSCIOUS)
@@ -147,18 +157,18 @@
L.visible_message("[L] scoops up [src]!")
/mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list)
- if(usr.stat)
+ if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ usr << browse(null, "window=mob[REF(src)]")
+ usr.unset_machine()
return
//Removing from inventory
if(href_list["remove_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)))
- return
var/remove_from = href_list["remove_inv"]
switch(remove_from)
if(BODY_ZONE_HEAD)
if(inventory_head)
- inventory_head.forceMove(drop_location())
+ usr.put_in_hands(inventory_head)
inventory_head = null
update_corgi_fluff()
regenerate_icons()
@@ -167,24 +177,32 @@
return
if("back")
if(inventory_back)
- inventory_back.forceMove(drop_location())
+ usr.put_in_hands(inventory_back)
inventory_back = null
update_corgi_fluff()
regenerate_icons()
else
to_chat(usr, "There is nothing to remove from its [remove_from].")
return
+ if("collar")
+ if(pcollar)
+ usr.put_in_hands(pcollar)
+ pcollar = null
+ update_corgi_fluff()
+ regenerate_icons()
show_inv(usr)
//Adding things to inventory
else if(href_list["add_inv"])
- if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr)))
- return
var/add_to = href_list["add_inv"]
switch(add_to)
+ if("collar")
+ add_collar(usr.get_active_held_item(), usr)
+ update_corgi_fluff()
+
if(BODY_ZONE_HEAD)
place_on_head(usr.get_active_held_item(),usr)
@@ -229,7 +247,7 @@
show_inv(usr)
else
- ..()
+ return ..()
//Corgis are supposed to be simpler, so only a select few objects can actually be put
//to be compatible with them. The objects are below.
@@ -560,7 +578,7 @@
icon_state = "void_puppy"
icon_living = "void_puppy"
icon_dead = "void_puppy_dead"
- nofur = 1
+ nofur = TRUE
unsuitable_atmos_damage = 0
minbodytemp = TCMB
maxbodytemp = T0C + 40
diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm
index 8df0ee83fe..c24dc6857a 100644
--- a/code/modules/mob/living/simple_animal/friendly/pet.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pet.dm
@@ -2,21 +2,30 @@
icon = 'icons/mob/pets.dmi'
mob_size = MOB_SIZE_SMALL
mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
- var/obj/item/clothing/neck/petcollar/pcollar
- var/collar_type
- var/unique_pet = FALSE
blood_volume = BLOOD_VOLUME_NORMAL
+ var/unique_pet = FALSE // if the mob can be renamed
+ var/obj/item/clothing/neck/petcollar/pcollar
+ var/collar_type //if the mob has collar sprites, define them.
+
+/mob/living/simple_animal/pet/handle_atom_del(atom/A)
+ if(A == pcollar)
+ pcollar = null
+ return ..()
+
+/mob/living/simple_animal/pet/proc/add_collar(obj/item/clothing/neck/petcollar/P, mob/user)
+ if(QDELETED(P) || pcollar)
+ return
+ if(!user.transferItemToLoc(P, src))
+ return
+ pcollar = P
+ regenerate_icons()
+ to_chat(user, "You put the [P] around [src]'s neck.")
+ if(P.tagname && !unique_pet)
+ fully_replace_character_name(null, "\proper [P.tagname]")
/mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar && collar_type)
- var/obj/item/clothing/neck/petcollar/P = O
- pcollar = P.type
- regenerate_icons()
- to_chat(user, "You put the [P] around [src]'s neck.")
- if(P.tagname && !unique_pet)
- real_name = "\proper [P.tagname]"
- name = real_name
- qdel(P)
+ add_collar(O, user)
return
if(istype(O, /obj/item/newspaper))
@@ -35,12 +44,16 @@
pcollar = new(src)
regenerate_icons()
+/mob/living/simple_animal/pet/Destroy()
+ QDEL_NULL(pcollar)
+ return ..()
+
/mob/living/simple_animal/pet/revive(full_heal = 0, admin_revive = 0)
- if(..())
+ . = ..()
+ if(.)
if(collar_type)
collar_type = "[initial(collar_type)]"
regenerate_icons()
- . = TRUE
/mob/living/simple_animal/pet/death(gibbed)
..(gibbed)
@@ -50,7 +63,8 @@
/mob/living/simple_animal/pet/gib()
if(pcollar)
- new pcollar(drop_location())
+ pcollar.forceMove(drop_location())
+ pcollar = null
..()
/mob/living/simple_animal/pet/regenerate_icons()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index a07e46a289..301b270e36 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -41,6 +41,9 @@
QDEL_NULL(internal)
. = ..()
+/mob/living/simple_animal/hostile/megafauna/prevent_content_explosion()
+ return TRUE
+
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
if(health > 0)
return
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 4fdf431fa0..fc53483eda 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -181,94 +181,85 @@
*/
/mob/living/simple_animal/parrot/show_inv(mob/user)
user.set_machine(src)
- var/dat = "
Inventory of [name]
"
- if(ears)
- dat += "
Headset: [ears] (Remove)"
- else
- dat += "
Headset: Nothing"
- user << browse(dat, "window=mob[real_name];size=325x500")
- onclose(user, "mob[real_name]")
+ var/dat = "
Inventory of [name]
"
+ dat += "
Headset: [ears]" : "add_inv=ears'>Nothing"]"
+
+ user << browse(dat, "window=mob[REF(src)];size=325x500")
+ onclose(user, "window=mob[REF(src)]")
/mob/living/simple_animal/parrot/Topic(href, href_list)
-
- //Can the usr physically do this?
- if(usr.incapacitated() || !usr.Adjacent(loc))
+ if(!(iscarbon(usr) || iscyborg(usr)) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ usr << browse(null, "window=mob[REF(src)]")
+ usr.unset_machine()
return
- //Is the usr's mob type able to do this? (lolaliens)
- if(ishuman(usr) || ismonkey(usr) || iscyborg(usr) || isalienadult(usr))
+ //Removing from inventory
+ if(href_list["remove_inv"])
+ var/remove_from = href_list["remove_inv"]
+ switch(remove_from)
+ if("ears")
+ if(!ears)
+ to_chat(usr, "There is nothing to remove from its [remove_from]!")
+ return
+ if(!stat)
+ say("[available_channels.len ? "[pick(available_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
+ ears.forceMove(drop_location())
+ ears = null
+ for(var/possible_phrase in speak)
+ if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys)
+ possible_phrase = copytext(possible_phrase,3)
- //Removing from inventory
- if(href_list["remove_inv"])
- var/remove_from = href_list["remove_inv"]
- switch(remove_from)
- if("ears")
- if(ears)
- if(!stat)
- if(available_channels.len)
- src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
- else
- src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
- ears.forceMove(src.loc)
- ears = null
- for(var/possible_phrase in speak)
- if(copytext(possible_phrase,1,3) in GLOB.department_radio_keys)
- possible_phrase = copytext(possible_phrase,3)
- else
- to_chat(usr, "There is nothing to remove from its [remove_from]!")
+ //Adding things to inventory
+ else if(href_list["add_inv"])
+ var/add_to = href_list["add_inv"]
+ if(!usr.get_active_held_item())
+ to_chat(usr, "You have nothing in your hand to put on its [add_to]!")
+ return
+ switch(add_to)
+ if("ears")
+ if(ears)
+ to_chat(usr, "It's already wearing something!")
+ return
+ else
+ var/obj/item/item_to_add = usr.get_active_held_item()
+ if(!item_to_add)
return
- //Adding things to inventory
- else if(href_list["add_inv"])
- var/add_to = href_list["add_inv"]
- if(!usr.get_active_held_item())
- to_chat(usr, "You have nothing in your hand to put on its [add_to]!")
- return
- switch(add_to)
- if("ears")
- if(ears)
- to_chat(usr, "It's already wearing something!")
+ if( !istype(item_to_add, /obj/item/radio/headset) )
+ to_chat(usr, "This object won't fit!")
return
- else
- var/obj/item/item_to_add = usr.get_active_held_item()
- if(!item_to_add)
- return
- if( !istype(item_to_add, /obj/item/radio/headset) )
- to_chat(usr, "This object won't fit!")
- return
+ var/obj/item/radio/headset/headset_to_add = item_to_add
- var/obj/item/radio/headset/headset_to_add = item_to_add
+ if(!usr.transferItemToLoc(headset_to_add, src))
+ return
+ ears = headset_to_add
+ to_chat(usr, "You fit the headset onto [src].")
- if(!usr.transferItemToLoc(headset_to_add, src))
- return
- src.ears = headset_to_add
- to_chat(usr, "You fit the headset onto [src].")
+ clearlist(available_channels)
+ for(var/ch in headset_to_add.channels)
+ switch(ch)
+ if("Engineering")
+ available_channels.Add(":e")
+ if("Command")
+ available_channels.Add(":c")
+ if("Security")
+ available_channels.Add(":s")
+ if("Science")
+ available_channels.Add(":n")
+ if("Medical")
+ available_channels.Add(":m")
+ if("Supply")
+ available_channels.Add(":u")
+ if("Service")
+ available_channels.Add(":v")
- clearlist(available_channels)
- for(var/ch in headset_to_add.channels)
- switch(ch)
- if("Engineering")
- available_channels.Add(":e")
- if("Command")
- available_channels.Add(":c")
- if("Security")
- available_channels.Add(":s")
- if("Science")
- available_channels.Add(":n")
- if("Medical")
- available_channels.Add(":m")
- if("Supply")
- available_channels.Add(":u")
- if("Service")
- available_channels.Add(":v")
-
- if(headset_to_add.translate_binary)
- available_channels.Add(":b")
- else
- ..()
+ if(headset_to_add.translate_binary)
+ available_channels.Add(":b")
+ else
+ return ..()
/*
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index ebb34fe77a..07985215d8 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -61,7 +61,7 @@
break
if(Target in view(1,src))
- if(issilicon(Target))
+ if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them.
if(!Atkcool)
Atkcool = 1
spawn(45)
@@ -600,7 +600,8 @@
phrases += "[M]... friend..."
if (nutrition < get_hunger_nutrition())
phrases += "[M]... feed me..."
- say (pick(phrases))
+ if(!stat)
+ say (pick(phrases))
/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it
if (is_adult)
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index 96e84a1754..a3e2f48b75 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -48,34 +48,58 @@
var/mob/living/simple_animal/slime/S = owner
S.Feed()
-/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M)
+/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M, silent = FALSE)
if(!Adjacent(M))
- return 0
+ return FALSE
if(buckled)
Feedstop()
- return 0
+ return FALSE
+
+ if(issilicon(M))
+ return FALSE
+
+ if(isanimal(M))
+ var/mob/living/simple_animal/S = M
+ if(S.damage_coeff[TOX] <= 0 && S.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us.
+ if(silent)
+ return FALSE
+ to_chat(src, "[pick("This subject is incompatible", \
+ "This subject does not have life energy", "This subject is empty", \
+ "I am not satisified", "I can not feed from this subject", \
+ "I do not feel nourished", "This subject is not food")]!")
+ return FALSE
if(isslime(M))
+ if(silent)
+ return FALSE
to_chat(src, "I can't latch onto another slime...")
- return 0
+ return FALSE
if(docile)
+ if(silent)
+ return FALSE
to_chat(src, "I'm not hungry anymore...")
- return 0
+ return FALSE
if(stat)
+ if(silent)
+ return FALSE
to_chat(src, "I must be conscious to do this...")
- return 0
+ return FALSE
if(M.stat == DEAD)
+ if(silent)
+ return FALSE
to_chat(src, "This subject does not have a strong enough life energy...")
- return 0
+ return FALSE
if(locate(/mob/living/simple_animal/slime) in M.buckled_mobs)
+ if(silent)
+ return FALSE
to_chat(src, "Another slime is already feeding on this subject...")
- return 0
- return 1
+ return FALSE
+ return TRUE
/mob/living/simple_animal/slime/proc/Feedon(mob/living/M)
M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon())
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 251739c935..930656228d 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -91,14 +91,15 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
if(!totalMembers.len)
return
- for(var/X in totalMembers)
- var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type.
- if(!A.pipe_vision_img)
- A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir)
- A.pipe_vision_img.plane = ABOVE_HUD_PLANE
- pipes_shown += A.pipe_vision_img
- if(client)
- client.images += A.pipe_vision_img
+ if(client)
+ for(var/X in totalMembers)
+ var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type.
+ if(in_view_range(client.mob, A))
+ if(!A.pipe_vision_img)
+ A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir)
+ A.pipe_vision_img.plane = ABOVE_HUD_PLANE
+ client.images += A.pipe_vision_img
+ pipes_shown += A.pipe_vision_img
movement_type |= VENTCRAWLING
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index c98a0440e3..334136cc33 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -18,8 +18,8 @@ It is possible to destroy the net by the occupant or someone else.
can_buckle = 1
buckle_lying = 0
buckle_prevents_pull = TRUE
- var/mob/living/carbon/affecting//Who it is currently affecting, if anyone.
- var/mob/living/carbon/master//Who shot web. Will let this person know if the net was successful or failed.
+ var/mob/living/carbon/affecting //Who it is currently affecting, if anyone.
+ var/mob/living/carbon/master //Who shot web. Will let this person know if the net was successful or failed.
var/check = 15//30 seconds before teleportation. Could be extended I guess.
var/success = FALSE
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 41f7b8af83..61355ca89b 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -7,28 +7,26 @@
//If there's only one valid target, let's actually try to capture it, rather than forcing
//the user to fiddle with the dialog displaying a list of one
//Also, let's make this smarter and not list mobs you can't currently net.
- var/Candidates[]
- for(var/mob/mob in oview(H))
- if(!mob.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
- //to_chat(H, "[C.p_they(TRUE)] will bring no honor to your Clan!")
+ var/list/candidates
+ for(var/mob/M in oview(H))
+ if(!M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
continue
- if(locate(/obj/structure/energy_net) in get_turf(mob))//Check if they are already being affected by an energy net.
- //to_chat(H, "[C.p_they(TRUE)] are already trapped inside an energy net!")
- continue
- for(var/turf/T in getline(get_turf(H), get_turf(mob)))
- if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
- //to_chat(H, "You may not use an energy net through solid obstacles!")
+ for(var/obj/structure/energy_net/E in get_turf(M))//Check if they are already being affected by an energy net.
+ if(E.affecting == M)
continue
- Candidates+=mob
+ LAZYADD(candidates, M)
- if(Candidates.len == 1)
- C = Candidates[1]
+ if(!LAZYLEN(candidates))
+ return FALSE
+
+ if(candidates.len == 1)
+ C = candidates[1]
else
- C = input("Select who to capture:","Capture who?",null) as null|mob in Candidates
+ C = input("Select who to capture:","Capture who?",null) as null|mob in candidates
if(QDELETED(C)||!(C in oview(H)))
- return 0
+ return FALSE
if(!ninjacost(200,N_STEALTH_CANCEL))
H.Beam(C,"n_beam",time=15)
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index 2a298d39b1..4b08ccf608 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -1,4 +1,4 @@
-
+
/obj/item/paperplane
name = "paper plane"
desc = "Paper, folded in the shape of a plane."
@@ -122,7 +122,7 @@
to_chat(user, "Alt-click [src] to fold it into a paper plane.")
/obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I)
- if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK))
return
to_chat(user, "You fold [src] into the shape of a plane!")
user.temporarilyRemoveItemFromInventory(src)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 6125ac9b82..a5900aa196 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -25,7 +25,6 @@
pressure_resistance = 2
grind_results = list("iron" = 2, "iodine" = 1)
var/colour = "black" //what colour the ink is!
- var/traitor_unlock_degrees = 0
var/degrees = 0
var/font = PEN_FONT
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index a04ed08611..40f71b81d4 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -90,7 +90,7 @@
/obj/machinery/power/emitter/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_FLIP ,null,CALLBACK(src, .proc/can_be_rotated))
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
/obj/machinery/power/emitter/proc/can_be_rotated(mob/user,rotation_type)
if (anchored)
@@ -495,4 +495,4 @@
#undef EMITTER_UNWRENCHED
#undef EMITTER_WRENCHED
-#undef EMITTER_WELDED
\ No newline at end of file
+#undef EMITTER_WELDED
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index d87f9821ef..7b2ea9398e 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -653,6 +653,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
else
L.show_message("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns.", 2)
+//Do not blow up our internal radio
+/obj/machinery/power/supermatter_crystal/contents_explosion(severity, target)
+ return
+
+/obj/machinery/power/supermatter_crystal/prevent_content_explosion()
+ return TRUE
+
/obj/machinery/power/supermatter_crystal/engine
is_main_engine = TRUE
diff --git a/code/modules/projectiles/ammunition/caseless/_caseless.dm b/code/modules/projectiles/ammunition/caseless/_caseless.dm
index 154d269cd9..a6b65f79e3 100644
--- a/code/modules/projectiles/ammunition/caseless/_caseless.dm
+++ b/code/modules/projectiles/ammunition/caseless/_caseless.dm
@@ -6,9 +6,10 @@
/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
if (..()) //successfully firing
moveToNullspace()
- return 1
+ QDEL_NULL(src)
+ return TRUE
else
- return 0
+ return FALSE
/obj/item/ammo_casing/caseless/update_icon()
..()
diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm
index 0b74f6ff8c..bc693d96bc 100644
--- a/code/modules/projectiles/ammunition/caseless/rocket.dm
+++ b/code/modules/projectiles/ammunition/caseless/rocket.dm
@@ -1,7 +1,15 @@
-/obj/item/ammo_casing/caseless/a84mm
- desc = "An 84mm anti-armour rocket."
+/obj/item/ammo_casing/caseless/rocket
+ name = "\improper PM-9HE"
+ desc = "An 84mm High Explosive rocket. Fire at people and pray."
caliber = "84mm"
- icon_state = "s-casing-live"
+ icon_state = "srm-8"
+ projectile_type = /obj/item/projectile/bullet/a84mm_he
+
+/obj/item/ammo_casing/caseless/rocket/hedp
+ name = "\improper PM-9HEDP"
+ desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward mechs."
+ caliber = "84mm"
+ icon_state = "84mm-hedp"
projectile_type = /obj/item/projectile/bullet/a84mm
/obj/item/ammo_casing/caseless/a75
diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
index 12325a0299..79a005ee8a 100644
--- a/code/modules/projectiles/boxes_magazines/internal/grenade.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
@@ -11,7 +11,7 @@
max_ammo = 1
/obj/item/ammo_box/magazine/internal/rocketlauncher
- name = "grenade launcher internal magazine"
- ammo_type = /obj/item/ammo_casing/caseless/a84mm
+ name = "rocket launcher internal magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/rocket
caliber = "84mm"
max_ammo = 1
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 542e4ecffa..fb3ed19f82 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -32,9 +32,10 @@
var/fire_delay = 0 //rate of fire for burst firing and semi auto
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
var/semicd = 0 //cooldown handler
- var/weapon_weight = WEAPON_LIGHT
+ var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy
var/spread = 0 //Spread induced by the gun itself.
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ var/inaccuracy_modifier = 1
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
@@ -170,7 +171,7 @@
return
if(weapon_weight == WEAPON_HEAVY && user.get_inactive_held_item())
- to_chat(user, "You need both hands free to fire [src]!")
+ to_chat(user, "You need both hands free to fire \the [src]!")
return
//DUAL (or more!) WIELDING
@@ -422,7 +423,7 @@
if(alight)
alight.Remove(user)
-/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params)
+/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
if(!ishuman(user) || !ishuman(target))
return
@@ -438,7 +439,7 @@
semicd = TRUE
- if(!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)
+ if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
if(user)
if(user == target)
user.visible_message("[user] decided not to shoot.")
@@ -538,3 +539,13 @@
if(A == chambered)
chambered = null
update_icon()
+
+/obj/item/gun/proc/getinaccuracy(mob/living/user)
+ if(!iscarbon(user))
+ return FALSE
+ else
+ var/mob/living/carbon/holdingdude = user
+ if(istype(holdingdude) && holdingdude.combatmode)
+ return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier)
+ else
+ return ((weapon_weight * 25) * inaccuracy_modifier)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 157cf1f03f..1117bc1000 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -7,6 +7,7 @@
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
var/obj/item/ammo_box/magazine/magazine
var/casing_ejector = TRUE //whether the gun ejects the chambered casing
+ var/magazine_wording = "magazine"
/obj/item/gun/ballistic/Initialize()
. = ..()
@@ -57,7 +58,7 @@
if (!magazine && istype(AM, mag_type))
if(user.transferItemToLoc(AM, src))
magazine = AM
- to_chat(user, "You load a new magazine into \the [src].")
+ to_chat(user, "You load a new [magazine_wording] into \the [src].")
if(magazine.ammo_count())
playsound(src, "gun_insert_full_magazine", 70, 1)
if(!chambered)
@@ -72,7 +73,7 @@
to_chat(user, "You cannot seem to get \the [src] out of your hands!")
return
else if (magazine)
- to_chat(user, "There's already a magazine in \the [src].")
+ to_chat(user, "There's already a [magazine_wording] in \the [src].")
if(istype(A, /obj/item/suppressor))
var/obj/item/suppressor/S = A
if(!can_suppress)
@@ -222,7 +223,7 @@
/obj/item/suppressor
name = "suppressor"
- desc = "A universal syndicate small-arms suppressor for maximum espionage."
+ desc = "A syndicate small-arms suppressor for maximum espionage."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "suppressor"
w_class = WEIGHT_CLASS_TINY
@@ -231,6 +232,4 @@
/obj/item/suppressor/specialoffer
name = "cheap suppressor"
- desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits all weapons."
- icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "suppressor"
+ desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits some weapons."
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index aacdd46059..f6356dce99 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -74,25 +74,92 @@
update_icon()
chamber_round()
-/obj/item/gun/ballistic/automatic/atlauncher
- desc = "A pre-loaded, single shot anti-armour launcher."
- name = "anti-armour grenade launcher"
+/obj/item/gun/ballistic/rocketlauncher
+ name = "\improper PML-9"
+ desc = "A reusable rocket propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel."
icon_state = "rocketlauncher"
item_state = "rocketlauncher"
mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher
fire_sound = 'sound/weapons/rocketlaunch.ogg'
w_class = WEIGHT_CLASS_BULKY
can_suppress = FALSE
+ pin = /obj/item/firing_pin/implant/pindicate
burst_size = 1
fire_delay = 0
- select = 0
- actions_types = list()
+ inaccuracy_modifier = 0.7
casing_ejector = FALSE
weapon_weight = WEAPON_HEAVY
+ magazine_wording = "rocket"
-/obj/item/gun/ballistic/automatic/atlauncher/attack_self()
- return
+/obj/item/gun/ballistic/rocketlauncher/unrestricted
+ pin = /obj/item/firing_pin
-/obj/item/gun/ballistic/automatic/atlauncher/update_icon()
- ..()
- icon_state = "rocketlauncher[magazine ? "-[get_ammo(1)]" : ""]"
\ No newline at end of file
+/obj/item/gun/ballistic/rocketlauncher/handle_atom_del(atom/A)
+ if(A == chambered)
+ chambered = null
+ if(!QDELETED(magazine))
+ QDEL_NULL(magazine)
+ if(A == magazine)
+ magazine = null
+ if(!QDELETED(chambered))
+ QDEL_NULL(chambered)
+ update_icon()
+ return ..()
+
+/obj/item/gun/ballistic/rocketlauncher/can_shoot()
+ return chambered?.BB
+
+/obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user)
+ return //too difficult to remove the rocket with TK
+
+/obj/item/gun/ballistic/rocketlauncher/attack_self(mob/living/user)
+ if(magazine)
+ var/obj/item/ammo_casing/AC = chambered
+ if(AC)
+ if(!user.put_in_hands(AC))
+ AC.bounce_away(FALSE, NONE)
+ to_chat(user, "You remove \the [AC] from \the [src]!")
+ playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE)
+ chambered = null
+ else
+ to_chat(user, "There's no [magazine_wording] in [src].")
+ update_icon()
+
+/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
+ if(magazine && istype(A, /obj/item/ammo_casing))
+ if(user.temporarilyRemoveItemFromInventory(A))
+ if(!chambered)
+ to_chat(user, "You load a new [A] into \the [src].")
+ playsound(src, "gun_insert_full_magazine", 70, 1)
+ chamber_round()
+ update_icon()
+ return TRUE
+ else
+ to_chat(user, "You cannot seem to get \the [A] out of your hands!")
+
+/obj/item/gun/ballistic/rocketlauncher/update_icon()
+ icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
+
+/obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user)
+ user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \
+ "You aim [src] at the ground to perform a bisnasty rocket jump...")
+ if(can_shoot())
+ user.notransform = TRUE
+ playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, 1, 5)
+ animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING)
+ sleep(70)
+ animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING)
+ sleep(5)
+ user.notransform = FALSE
+ process_fire(user, user, TRUE)
+ if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good.
+ user.gib()
+ return MANUAL_SUICIDE
+ else
+ sleep(5)
+ shoot_with_empty_chamber(user)
+ sleep(20)
+ user.visible_message("[user] looks about the room realizing [user.p_theyre()] still there. [user.p_they(TRUE)] proceed to shove [src] down their throat and choke [user.p_them()]self with it!", \
+ "You look around after realizing you're still here, then proceed to choke yourself to death with [src]!")
+ sleep(20)
+ return OXYLOSS
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index c6f0956880..6e2c9dc62a 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -243,7 +243,7 @@
/obj/item/gun/energy/printer
name = "cyborg lmg"
- desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source."
+ desc = "A LMG that fires 3D-printed flechettes. They are slowly resupplied using the cyborg's internal power source."
icon_state = "l6closed0"
icon = 'icons/obj/guns/projectile.dmi'
cell_type = "/obj/item/stock_parts/cell/secborg"
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index 6518b2a4d5..e15810c6bb 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -9,13 +9,14 @@
return TRUE
/obj/item/projectile/bullet/a84mm
- name ="anti-armour rocket"
+ name ="\improper HEDP rocket"
desc = "USE A WEEL GUN"
- icon_state= "atrocket"
+ icon_state= "84mm-hedp"
damage = 80
var/anti_armour_damage = 200
armour_penetration = 100
dismemberment = 100
+ ricochets_max = 0
/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
..()
@@ -29,17 +30,17 @@
S.take_overall_damage(anti_armour_damage*0.75, anti_armour_damage*0.25)
return TRUE
-/obj/item/projectile/bullet/srmrocket
- name ="SRM-8 Rocket"
+/obj/item/projectile/bullet/a84mm_he
+ name ="\improper HE missile"
desc = "Boom."
icon_state = "missile"
damage = 30
ricochets_max = 0 //it's a MISSILE
-/obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0)
+/obj/item/projectile/bullet/a84mm_he/on_hit(atom/target, blocked=0)
..()
if(!isliving(target)) //if the target isn't alive, so is a wall or something
explosion(target, 0, 1, 2, 4)
else
explosion(target, 0, 0, 2, 4)
- return TRUE
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index d10e57783d..fa9d60a219 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -51,7 +51,8 @@
//these become available once upgraded.
var/list/upgrade_reagents = list(
"oil",
- "ammonia"
+ "ammonia",
+ "ash"
)
var/list/upgrade_reagents2 = list(
@@ -248,13 +249,8 @@
work_animation()
. = TRUE
if("eject")
- if(beaker)
- beaker.forceMove(drop_location())
- if(Adjacent(usr) && !issilicon(usr))
- usr.put_in_hands(beaker)
- beaker = null
- update_icon()
- . = TRUE
+ replace_beaker(usr)
+ . = TRUE //no afterattack
if("dispense_recipe")
if(!is_operational() || QDELETED(cell))
return
@@ -267,7 +263,7 @@
if(beaker && dispensable_reagents.Find(r_id)) // but since we verify we have the reagent, it'll be fine
var/datum/reagents/R = beaker.reagents
var/free = R.maximum_volume - R.total_volume
- var/actual = min(round(chemicals_to_dispense[key], res), (cell.charge * powerefficiency)*10, free)
+ var/actual = min(max(chemicals_to_dispense[key], res), (cell.charge * powerefficiency)*10, free)
if(actual)
if(!cell.use(actual / powerefficiency))
say("Not enough energy to complete operation!")
@@ -320,14 +316,12 @@
return
if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container())
var/obj/item/reagent_containers/B = I
- . = 1 //no afterattack
- if(beaker)
- to_chat(user, "A container is already loaded into [src]!")
- return
+ . = TRUE //no afterattack
if(!user.transferItemToLoc(B, src))
return
- beaker = B
+ replace_beaker(user, B)
to_chat(user, "You add [B] to [src].")
+ updateUsrDialog()
update_icon()
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag))
to_chat(user, "You can't load [I] into [src]!")
@@ -379,7 +373,17 @@
dispensable_reagents |= upgrade_reagents3
powerefficiency = round(newpowereff, 0.01)
-
+/obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
+ if(beaker)
+ beaker.forceMove(drop_location())
+ if(user && Adjacent(user) && !issiliconoradminghost(user))
+ user.put_in_hands(beaker)
+ if(new_beaker)
+ beaker = new_beaker
+ else
+ beaker = null
+ update_icon()
+ return TRUE
/obj/machinery/chem_dispenser/on_deconstruction()
cell = null
@@ -415,6 +419,12 @@
final_list += list(avoid_assoc_duplicate_keys(fuck[1],key_list) = text2num(fuck[2]))
return final_list
+/obj/machinery/chem_dispenser/AltClick(mob/living/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+ replace_beaker(user)
+ return
+
/obj/machinery/chem_dispenser/drinks/Initialize()
. = ..()
AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE)
@@ -478,9 +488,16 @@
"tomatojuice",
"lemonjuice",
"menthol"
- ) //prevents the soda machine from obtaining chemical upgrades. .
- upgrade_reagents = null
- upgrade_reagents2 = null
+ )
+ upgrade_reagents = list(
+ "mushroomhallucinogen",
+ "nothing",
+ "cryoxadone"
+ )
+ upgrade_reagents2 = list(
+ "banana",
+ "berryjuice"
+ )
upgrade_reagents3 = null
emagged_reagents = list(
"thirteenloko",
@@ -532,19 +549,21 @@
"creme_de_menthe",
"creme_de_cacao",
"triple_sec",
- "sake"
- )//prevents the booze machine from obtaining chemical upgrades.
- upgrade_reagents = null
+ "sake",
+ "applejack"
+ )
+ upgrade_reagents = list(
+ "ethanol",
+ "fernet"
+ )
upgrade_reagents2 = null
upgrade_reagents3 = null
emagged_reagents = list(
- "ethanol",
"iron",
"alexander",
"clownstears",
"minttoxin",
"atomicbomb",
- "fernet",
"aphro",
"aphro+"
)
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index e4c6966cff..a17b1e8190 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -28,13 +28,23 @@
else
icon_state = "mixer0b"
-/obj/machinery/chem_heater/proc/eject_beaker(mob/user)
+/obj/machinery/chem_heater/AltClick(mob/living/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+ replace_beaker(user)
+ return
+
+/obj/machinery/chem_heater/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
beaker.forceMove(drop_location())
- if(Adjacent(user) && !issilicon(user))
+ if(user && Adjacent(user) && !issiliconoradminghost(user))
user.put_in_hands(beaker)
+ if(new_beaker)
+ beaker = new_beaker
+ else
beaker = null
update_icon()
+ return TRUE
/obj/machinery/chem_heater/RefreshParts()
heater_coefficient = 0.1
@@ -58,21 +68,19 @@
return
if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container())
- . = 1 //no afterattack
- if(beaker)
- to_chat(user, "A container is already loaded into [src]!")
+ . = TRUE //no afterattack
+ var/obj/item/reagent_containers/B = I
+ if(!user.transferItemToLoc(B, src))
return
-
- if(!user.transferItemToLoc(I, src))
- return
- beaker = I
- to_chat(user, "You add [I] to [src].")
+ replace_beaker(user, B)
+ to_chat(user, "You add [B] to [src].")
+ updateUsrDialog()
update_icon()
return
return ..()
/obj/machinery/chem_heater/on_deconstruction()
- eject_beaker()
+ replace_beaker()
return ..()
/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
@@ -122,5 +130,5 @@
target_temperature = CLAMP(target, 0, 1000)
if("eject")
on = FALSE
- eject_beaker(usr)
+ replace_beaker(usr)
. = TRUE
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 6327c5ba3a..aeed5ffc37 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -60,16 +60,6 @@
else
icon_state = "mixer0"
-/obj/machinery/chem_master/proc/eject_beaker(mob/user)
- if(beaker)
- beaker.forceMove(drop_location())
- if(Adjacent(user) && !issilicon(user))
- user.put_in_hands(beaker)
- else
- adjust_item_drop_location(beaker)
- beaker = null
- update_icon()
-
/obj/machinery/chem_master/blob_act(obj/structure/blob/B)
if (prob(50))
qdel(src)
@@ -85,36 +75,49 @@
return
if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container())
- . = 1 // no afterattack
+ . = TRUE // no afterattack
if(panel_open)
to_chat(user, "You can't use the [src.name] while its panel is opened!")
return
- if(beaker)
- to_chat(user, "A container is already loaded into [src]!")
+ var/obj/item/reagent_containers/B = I
+ if(!user.transferItemToLoc(B, src))
return
- if(!user.transferItemToLoc(I, src))
- return
-
- beaker = I
- to_chat(user, "You add [I] to [src].")
- src.updateUsrDialog()
+ replace_beaker(user, B)
+ to_chat(user, "You add [B] to [src].")
+ updateUsrDialog()
update_icon()
-
else if(!condi && istype(I, /obj/item/storage/pill_bottle))
if(bottle)
to_chat(user, "A pill bottle is already loaded into [src]!")
return
if(!user.transferItemToLoc(I, src))
return
-
bottle = I
to_chat(user, "You add [I] into the dispenser slot.")
- src.updateUsrDialog()
+ updateUsrDialog()
else
return ..()
+/obj/machinery/chem_master/AltClick(mob/living/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+ replace_beaker(user)
+ return
+
+/obj/machinery/chem_master/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
+ if(beaker)
+ beaker.forceMove(drop_location())
+ if(user && Adjacent(user) && !issiliconoradminghost(user))
+ user.put_in_hands(beaker)
+ if(new_beaker)
+ beaker = new_beaker
+ else
+ beaker = null
+ update_icon()
+ return TRUE
+
/obj/machinery/chem_master/on_deconstruction()
- eject_beaker()
+ replace_beaker(usr)
if(bottle)
bottle.forceMove(drop_location())
adjust_item_drop_location(bottle)
@@ -164,7 +167,7 @@
return
switch(action)
if("eject")
- eject_beaker(usr)
+ replace_beaker(usr)
. = TRUE
if("ejectp")
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 5c39cd9db2..1847f1f722 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -19,6 +19,12 @@
var/speed = 1
var/list/holdingitems
+ var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine")
+ var/static/radial_eject = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject")
+ var/static/radial_grind = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_grind")
+ var/static/radial_juice = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_juice")
+ var/static/radial_mix = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_mix")
+
/obj/machinery/reagentgrinder/Initialize()
. = ..()
holdingitems = list()
@@ -51,7 +57,6 @@
if(A == beaker)
beaker = null
update_icon()
- updateUsrDialog()
if(holdingitems[A])
holdingitems -= A
@@ -67,6 +72,18 @@
else
icon_state = "juicer0"
+/obj/machinery/reagentgrinder/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
+ if(beaker)
+ beaker.forceMove(drop_location())
+ if(user && Adjacent(user) && !issiliconoradminghost(user))
+ user.put_in_hands(beaker)
+ if(new_beaker)
+ beaker = new_beaker
+ else
+ beaker = null
+ update_icon()
+ return TRUE
+
/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
//You can only screw open empty grinder
if(!beaker && !length(holdingitems) && default_deconstruction_screwdriver(user, icon_state, icon_state, I))
@@ -82,17 +99,14 @@
return TRUE
if (istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container())
- if (!beaker)
- if(!user.transferItemToLoc(I, src))
- to_chat(user, "[I] is stuck to your hand!")
- return TRUE
- to_chat(user, "You slide [I] into [src].")
- beaker = I
- update_icon()
- updateUsrDialog()
- else
- to_chat(user, "There's already a container inside [src].")
- return TRUE //no afterattack
+ var/obj/item/reagent_containers/B = I
+ . = TRUE
+ if(!user.transferItemToLoc(B, src))
+ return
+ replace_beaker(user, B)
+ to_chat(user, "You add [B] to [src].")
+ update_icon()
+ return
if(holdingitems.len >= limit)
to_chat(user, "[src] is filled to capacity!")
@@ -108,8 +122,6 @@
to_chat(user, "You empty [I] into [src].")
else
to_chat(user, "You fill [src] to the brim.")
-
- updateUsrDialog()
return TRUE
if(!I.grind_results && !I.juice_results)
@@ -125,104 +137,89 @@
if(user.transferItemToLoc(I, src))
to_chat(user, "You add [I] to [src].")
holdingitems[I] = TRUE
- updateUsrDialog()
return FALSE
/obj/machinery/reagentgrinder/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave
. = ..()
- var/is_chamber_empty = FALSE
- var/is_beaker_ready = FALSE
- var/processing_chamber = ""
- var/beaker_contents = ""
- var/dat = ""
- if(!operating)
- for (var/i in holdingitems)
- var/obj/item/O = i
- processing_chamber += "\A [O.name]
"
+ if(operating || !user.canUseTopic(src, !issilicon(user)))
+ return
- if (!processing_chamber)
- is_chamber_empty = TRUE
- processing_chamber = "Nothing."
- if (!beaker)
- beaker_contents = "No beaker attached.
"
- else
- is_beaker_ready = TRUE
- beaker_contents = "The beaker contains:
"
- var/anything = FALSE
- for(var/datum/reagent/R in beaker.reagents.reagent_list)
- anything = TRUE
- beaker_contents += "[R.volume] - [R.name]
"
- if(!anything)
- beaker_contents += "Nothing
"
+ var/list/options = list()
- dat = {"
- Processing chamber contains:
- [processing_chamber]
- [beaker_contents]
- "}
- if (is_beaker_ready)
- if(!is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
- dat += "Grind the reagents
"
- dat += "Juice the reagents
"
- else if (beaker.reagents.total_volume)
- dat += "Mix the reagents
"
- if(length(holdingitems))
- dat += "Eject the reagents
"
- if(beaker)
- dat += "Detach the beaker
"
+ if(beaker || length(holdingitems))
+ options["eject"] = radial_eject
+
+ if(isAI(user))
+ if(stat & NOPOWER)
+ return
+ options["examine"] = radial_examine
+
+ // if there is no power or it's broken, the procs will fail but the buttons will still show
+ if(length(holdingitems))
+ options["grind"] = radial_grind
+ options["juice"] = radial_juice
+ else if(beaker?.reagents.total_volume)
+ options["mix"] = radial_mix
+
+ var/choice
+
+ if(length(options) < 1)
+ return
+ if(length(options) == 1)
+ for(var/key in options)
+ choice = key
else
- dat += "Please wait..."
+ choice = show_radial_menu(user, src, options, require_near = !issilicon(user))
- var/datum/browser/popup = new(user, "reagentgrinder", "All-In-One Grinder")
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
- popup.open(1)
- return
+ // post choice verification
+ if(operating || (isAI(user) && stat & NOPOWER) || !user.canUseTopic(src, !issilicon(user)))
+ return
-/obj/machinery/reagentgrinder/Topic(href, href_list)
- if(..())
- return
- var/mob/user = usr
- if(!user.canUseTopic(src))
- return
- if(stat & (NOPOWER|BROKEN))
- return
- user.set_machine(src)
- if(operating)
- updateUsrDialog()
- return
- switch(href_list["action"])
- if ("grind")
+ switch(choice)
+ if("eject")
+ eject(user)
+ if("grind")
grind(user)
if("juice")
juice(user)
if("mix")
mix(user)
- if("eject")
- eject(user)
- if("detach")
- detach(user)
- updateUsrDialog()
+ if("examine")
+ examine(user)
-/obj/machinery/reagentgrinder/proc/detach(mob/user)
- if(!beaker)
+/obj/machinery/reagentgrinder/examine(mob/user)
+ . = ..()
+ if(!in_range(user, src) && !issilicon(user) && !isobserver(user))
+ to_chat(user, "You're too far away to examine [src]'s contents and display!")
return
- beaker.forceMove(drop_location())
- if(Adjacent(user) && !issilicon(user))
- user.put_in_hands(beaker)
- beaker = null
- update_icon()
- updateUsrDialog()
+
+ if(operating)
+ to_chat(user, "\The [src] is operating.")
+ return
+
+ if(beaker || length(holdingitems))
+ to_chat(user, "\The [src] contains:")
+ if(beaker)
+ to_chat(user, "- \A [beaker].")
+ for(var/i in holdingitems)
+ var/obj/item/O = i
+ to_chat(user, "- \A [O.name].")
+
+ if(!(stat & (NOPOWER|BROKEN)))
+ to_chat(user, "The status display reads:")
+ to_chat(user, "- Grinding reagents at [speed*100]%.")
+ if(beaker)
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ to_chat(user, "- [R.volume] units of [R.name].")
/obj/machinery/reagentgrinder/proc/eject(mob/user)
- if(!length(holdingitems))
- return
for(var/i in holdingitems)
var/obj/item/O = i
O.forceMove(drop_location())
holdingitems -= O
- updateUsrDialog()
+ if(beaker)
+ replace_beaker(user)
/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O)
holdingitems -= O
@@ -240,7 +237,6 @@
/obj/machinery/reagentgrinder/proc/operate_for(time, silent = FALSE, juicing = FALSE)
shake_for(time / speed)
- updateUsrDialog()
operating = TRUE
if(!silent)
if(!juicing)
@@ -251,11 +247,10 @@
/obj/machinery/reagentgrinder/proc/stop_operating()
operating = FALSE
- updateUsrDialog()
/obj/machinery/reagentgrinder/proc/juice()
power_change()
- if(!beaker || (beaker && (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)))
+ if(!beaker || stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
return
operate_for(50, juicing = TRUE)
for(var/obj/item/i in holdingitems)
@@ -274,7 +269,7 @@
/obj/machinery/reagentgrinder/proc/grind()
power_change()
- if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ if(!beaker || stat & (NOPOWER|BROKEN) || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
return
operate_for(60)
for(var/i in holdingitems)
@@ -296,13 +291,13 @@
/obj/machinery/reagentgrinder/proc/mix(mob/user)
//For butter and other things that would change upon shaking or mixing
power_change()
- if(!beaker)
+ if(!beaker || stat & (NOPOWER|BROKEN))
return
operate_for(50, juicing = TRUE)
addtimer(CALLBACK(src, /obj/machinery/reagentgrinder/proc/mix_complete), 50)
/obj/machinery/reagentgrinder/proc/mix_complete()
- if(beaker && beaker.reagents.total_volume)
+ if(beaker?.reagents.total_volume)
//Recipe to make Butter
var/butter_amt = FLOOR(beaker.reagents.get_reagent_amount("milk") / MILK_TO_BUTTER_COEFF, 1)
beaker.reagents.remove_reagent("milk", MILK_TO_BUTTER_COEFF * butter_amt)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 80e195d5ac..211fddca26 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -333,7 +333,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
id = "grappa"
description = "A fine Italian brandy, for when regular wine just isn't alcoholic enough for you."
color = "#F8EBF1"
- boozepwr = 45
+ boozepwr = 60
taste_description = "classy bitter sweetness"
glass_icon_state = "grappa"
glass_name = "glass of grappa"
@@ -379,6 +379,11 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Hooch"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
+ if(M.mind && M.mind.assigned_role == "Assistant")
+ M.heal_bodypart_damage(1,1)
+ . = TRUE
+ return ..() || .
/datum/reagent/consumable/ethanol/ale
name = "Ale"
@@ -633,25 +638,48 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#664300" // rgb: 102, 67, 0
boozepwr = 90 //THE FIST OF THE LAW IS STRONG AND HARD
quality = DRINK_GOOD
- metabolization_rate = 0.8
+ metabolization_rate = 0.5
taste_description = "JUSTICE"
glass_icon_state = "beepskysmashglass"
glass_name = "Beepsky Smash"
glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
+ overdose_threshold = 40
+ var/datum/brain_trauma/special/beepsky/B
+
+/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M)
+ if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE))
+ metabolization_rate = 0.8
+ if(!HAS_TRAIT(M, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ B = new()
+ M.gain_trauma(B, TRAUMA_RESILIENCE_ABSOLUTE)
+ ..()
/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/M)
- if(HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE))
- M.Stun(30, 0) //this realistically does nothing to prevent chainstunning but will cause them to recover faster once it's out of their system
- else
- M.Stun(40, 0)
+ M.Jitter(2)
+ if(HAS_TRAIT(M, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ M.adjustStaminaLoss(-10, 0)
+ if(prob(20))
+ new /datum/hallucination/items_other(M)
+ if(prob(10))
+ new /datum/hallucination/stray_bullet(M)
+ ..()
+ . = TRUE
+
+/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/M)
+ if(B)
+ QDEL_NULL(B)
return ..()
+/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/M)
+ if(!HAS_TRAIT(M, TRAIT_LAW_ENFORCEMENT_METABOLISM))
+ M.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC)
+
/datum/reagent/consumable/ethanol/irish_cream
name = "Irish Cream"
id = "irishcream"
description = "Whiskey-imbued cream, what else would you expect from the Irish?"
color = "#664300" // rgb: 102, 67, 0
- boozepwr = 70
+ boozepwr = 50
quality = DRINK_NICE
taste_description = "creamy alcohol"
glass_icon_state = "irishcreamglass"
@@ -947,7 +975,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
id = "red_mead"
description = "The true Viking drink! Even though it has a strange red color."
color = "#C73C00" // rgb: 199, 60, 0
- boozepwr = 51 //Red drinks are stronger
+ boozepwr = 31 //Red drinks are stronger
quality = DRINK_GOOD
taste_description = "sweet and salty alcohol"
glass_icon_state = "red_meadglass"
@@ -960,7 +988,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "A Viking drink, though a cheap one."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 1 * REAGENTS_METABOLISM
- boozepwr = 50
+ boozepwr = 30
quality = DRINK_NICE
taste_description = "sweet, sweet alcohol"
glass_icon_state = "meadglass"
@@ -1319,32 +1347,49 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/neurotoxin
name = "Neurotoxin"
- id = "neurotoxin"
description = "A strong neurotoxin that puts the subject into a death-like state."
color = "#2E2E61" // rgb: 46, 46, 97
- boozepwr = 0 //custom drunk effect
+ boozepwr = 50
quality = DRINK_VERYGOOD
taste_description = "a numbing sensation"
+ metabolization_rate = 1 * REAGENTS_METABOLISM
glass_icon_state = "neurotoxinglass"
glass_name = "Neurotoxin"
glass_desc = "A drink that is guaranteed to knock you silly."
+/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
+ return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
+
/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/M)
- M.Knockdown(60, 1, 0)
+ M.set_drugginess(50)
M.dizziness +=2
- switch(current_cycle)
- if(15 to 45)
- M.slurring = max(M.slurring,50)
- M.slurring += 3
- if(45 to 55)
- if(prob(50))
- M.confused = max(M.confused+3,0)
- if(55 to 200)
- M.set_drugginess(55)
- if(200 to INFINITY)
- M.adjustToxLoss(2, 0)
+ M.adjustBrainLoss(1*REM, 150)
+ if(prob(20))
+ M.adjustStaminaLoss(10)
+ M.drop_all_held_items()
+ to_chat(M, "You cant feel your hands!")
+ if(current_cycle > 5)
+ if(prob(20))
+ var/t = pickt()
+ ADD_TRAIT(M, t, type)
+ M.adjustStaminaLoss(10)
+ if(current_cycle > 30)
+ M.adjustBrainLoss(2*REM)
+ if(current_cycle > 50 && prob(15))
+ if(!M.undergoing_cardiac_arrest() && M.can_heartattack())
+ M.set_heartattack(TRUE)
+ if(M.stat == CONSCIOUS)
+ M.visible_message("[M] clutches at [M.p_their()] chest as if [M.p_their()] heart stopped!")
+ . = TRUE
+ ..()
+
+/datum/reagent/consumable/ethanol/neurotoxin/on_mob_end_metabolize(mob/living/carbon/M)
+ REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_ARM, type)
+ REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_ARM, type)
+ REMOVE_TRAIT(M, TRAIT_PARALYSIS_R_LEG, type)
+ REMOVE_TRAIT(M, TRAIT_PARALYSIS_L_LEG, type)
+ M.adjustStaminaLoss(10)
..()
- . = 1
/datum/reagent/consumable/ethanol/hippies_delight
name = "Hippie's Delight"
@@ -1468,7 +1513,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though."
/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M)
- if(M.mind && M.mind.assigned_role in list("Security Officer", "Detective", "Head of Security", "Warden", "Lawyer")) //Securidrink in line with the screwderiver for engineers or nothing for mimes.
+ if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes.
M.heal_bodypart_damage(1, 1)
M.adjustBruteLoss(-2,0)
. = 1
@@ -1487,7 +1532,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "Now you are become law, destroyer of clowns."
/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M)
- if(M.mind && M.mind.assigned_role in list("Security Officer", "Detective", "Head of Security", "Warden", "Lawyer")) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG..
+ if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG..
M.heal_bodypart_damage(2,2,2)
M.adjustBruteLoss(-5,0)
M.adjustOxyLoss(-5,0)
@@ -1826,6 +1871,230 @@ All effects don't start immediately, but rather get worse over time; the rate is
. = TRUE
..()
+/datum/reagent/consumable/ethanol/blank_paper
+ name = "Blank Paper"
+ id = "blank_paper"
+ description = "A bubbling glass of blank paper. Just looking at it makes you feel fresh."
+ nutriment_factor = 1 * REAGENTS_METABOLISM
+ color = "#DCDCDC" // rgb: 220, 220, 220
+ boozepwr = 20
+ quality = DRINK_GOOD
+ taste_description = "bubbling possibility"
+ glass_icon_state = "blank_paper"
+ glass_name = "glass of blank paper"
+ glass_desc = "A fizzy cocktail for those looking to start fresh."
+
+/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M)
+ if(ishuman(M) && M.job == "Mime")
+ M.heal_bodypart_damage(1,1)
+ . = 1
+ return ..()
+
+/datum/reagent/consumable/ethanol/champagne //How the hell did we not have champagne already!?
+ name = "Champagne"
+ id = "champagne"
+ description = "A sparkling wine known for its ability to strike fast and hard."
+ color = "#ffffc1"
+ boozepwr = 40
+ taste_description = "auspicious occasions and bad decisions"
+ glass_icon_state = "champagne_glass"
+ glass_name = "Champagne"
+ glass_desc = "The flute clearly displays the slowly rising bubbles."
+
+/datum/reagent/consumable/ethanol/wizz_fizz
+ name = "Wizz Fizz"
+ id = "wizz_fizz"
+ description = "A magical potion, fizzy and wild! However the taste, you will find, is quite mild."
+ color = "#4235d0" //Just pretend that the triple-sec was blue curacao.
+ boozepwr = 50
+ quality = DRINK_GOOD
+ taste_description = "friendship! It is magic, after all"
+ glass_icon_state = "wizz_fizz"
+ glass_name = "Wizz Fizz"
+ glass_desc = "The glass bubbles and froths with an almost magical intensity."
+
+/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M)
+ //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting
+ if(M?.mind?.has_antag_datum(/datum/antagonist/wizard))
+ M.heal_bodypart_damage(1,1,1)
+ M.adjustOxyLoss(-1,0)
+ M.adjustToxLoss(-1,0)
+ return ..()
+
+/datum/reagent/consumable/ethanol/bug_spray
+ name = "Bug Spray"
+ id = "bug_spray"
+ description = "A harsh, acrid, bitter drink, for those who need something to brace themselves."
+ color = "#33ff33"
+ boozepwr = 50
+ quality = DRINK_GOOD
+ taste_description = "the pain of ten thousand slain mosquitos"
+ glass_icon_state = "bug_spray"
+ glass_name = "Bug Spray"
+ glass_desc = "Your eyes begin to water as the sting of alcohol reaches them."
+
+/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M)
+//Bugs should not drink Bug spray.
+ if(ismoth(M) || isflyperson(M))
+ M.adjustToxLoss(1,0)
+ return ..()
+
+/datum/reagent/consumable/ethanol/bug_spray/on_mob_add(mob/living/carbon/M)
+ if(ismoth(M) || isflyperson(M))
+ M.emote("scream")
+ return ..()
+
+/datum/reagent/consumable/ethanol/applejack
+ name = "Applejack"
+ id = "applejack"
+ description = "The perfect beverage for when you feel the need to horse around."
+ color = "#ff6633"
+ boozepwr = 20
+ taste_description = "an honest day's work at the orchard"
+ glass_icon_state = "applejack_glass"
+ glass_name = "Applejack"
+ glass_desc = "You feel like you could drink this all neight."
+
+/datum/reagent/consumable/ethanol/jack_rose
+ name = "Jack Rose"
+ id = "jack_rose"
+ description = "A light cocktail perfect for sipping with a slice of pie."
+ color = "#ff6633"
+ boozepwr = 15
+ quality = DRINK_NICE
+ taste_description = "a sweet and sour slice of apple"
+ glass_icon_state = "jack_rose"
+ glass_name = "Jack Rose"
+ glass_desc = "Enough of these, and you really will start to suppose your toeses are roses."
+
+/datum/reagent/consumable/ethanol/turbo
+ name = "Turbo"
+ id = "turbo"
+ description = "A turbulent cocktail associated with outlaw hoverbike racing. Not for the faint of heart."
+ color = "#e94c3a"
+ boozepwr = 85
+ quality = DRINK_VERYGOOD
+ taste_description = "the outlaw spirit"
+ glass_icon_state = "turbo"
+ glass_name = "Turbo"
+ glass_desc = "A turbulent cocktail for outlaw hoverbikers."
+
+/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M)
+ if(prob(4))
+ to_chat(M, "[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")
+ M.adjustStaminaLoss(-M.drunkenness * 0.25)
+ return ..()
+
+/datum/reagent/consumable/ethanol/old_timer
+ name = "Old Timer"
+ id = "old_timer"
+ description = "An archaic potation enjoyed by old coots of all ages."
+ color = "#996835"
+ boozepwr = 35
+ quality = DRINK_NICE
+ taste_description = "simpler times"
+ glass_icon_state = "old_timer"
+ glass_name = "Old Timer"
+ glass_desc = "WARNING! May cause premature aging!"
+
+/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M)
+ if(prob(20))
+ if(ishuman(M))
+ var/mob/living/carbon/human/N = M
+ N.age += 1
+ if(N.age > 70)
+ N.facial_hair_color = "ccc"
+ N.hair_color = "ccc"
+ N.update_hair()
+ if(N.age > 100)
+ N.become_nearsighted(id)
+ if(N.gender == MALE)
+ N.facial_hair_style = "Beard (Very Long)"
+ N.update_hair()
+
+ if(N.age > 969) //Best not let people get older than this or i might incur G-ds wrath
+ M.visible_message("[M] becomes older than any man should be.. and crumbles into dust!")
+ M.dust(0,1,0)
+
+ return ..()
+
+/datum/reagent/consumable/ethanol/rubberneck
+ name = "Rubberneck"
+ id = "rubberneck"
+ description = "A quality rubberneck should not contain any gross natural ingredients."
+ color = "#ffe65b"
+ boozepwr = 60
+ quality = DRINK_GOOD
+ taste_description = "artifical fruityness"
+ glass_icon_state = "rubberneck"
+ glass_name = "Rubberneck"
+ glass_desc = "A popular drink amongst those adhering to an all synthetic diet."
+
+/datum/reagent/consumable/ethanol/duplex
+ name = "Duplex"
+ id = "duplex"
+ description = "An inseparable combination of two fruity drinks."
+ color = "#50e5cf"
+ boozepwr = 25
+ quality = DRINK_NICE
+ taste_description = "green apples and blue raspberries"
+ glass_icon_state = "duplex"
+ glass_name = "Duplex"
+ glass_desc = "To imbibe one component separately from the other is consider a great faux pas."
+
+/datum/reagent/consumable/ethanol/trappist
+ name = "Trappist Beer"
+ id = "trappist"
+ description = "A strong dark ale brewed by space-monks."
+ color = "#390c00"
+ boozepwr = 40
+ quality = DRINK_VERYGOOD
+ taste_description = "dried plums and malt"
+ glass_icon_state = "trappistglass"
+ glass_name = "Trappist Beer"
+ glass_desc = "boozy Catholicism in a glass."
+
+/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M)
+ if(M.mind.isholy)
+ M.adjustFireLoss(-2.5, 0)
+ M.jitteriness = max(0, M.jitteriness-1)
+ M.stuttering = max(0, M.stuttering-1)
+ return ..()
+
+/datum/reagent/consumable/ethanol/blazaam
+ name = "Blazaam"
+ id = "blazaam"
+ description = "A strange drink that few people seem to remember existing. Doubles as a Berenstain remover."
+ boozepwr = 70
+ quality = DRINK_FANTASTIC
+ taste_description = "alternate realities"
+ glass_icon_state = "blazaamglass"
+ glass_name = "Blazaam"
+ glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover."
+ var/stored_teleports = 0
+
+/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M)
+ if(M.drunkenness > 40)
+ if(stored_teleports)
+ do_teleport(M, get_turf(M), rand(1,3))
+ stored_teleports--
+ if(prob(10))
+ stored_teleports += rand(2,6)
+ if(prob(70))
+ M.vomit()
+ return ..()
+
+/datum/reagent/consumable/ethanol/planet_cracker
+ name = "Planet Cracker"
+ id = "planet_cracker"
+ description = "This jubilant drink celebrates humanity's triumph over the alien menace. May be offensive to non-human crewmembers."
+ boozepwr = 50
+ quality = DRINK_FANTASTIC
+ taste_description = "triumph with a hint of bitterness"
+ glass_icon_state = "planet_cracker"
+ glass_name = "Planet Cracker"
+ glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy."
+
/datum/reagent/consumable/ethanol/fruit_wine
name = "Fruit Wine"
id = "fruit_wine"
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 6d0d1e13c6..4e40233713 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -213,15 +213,15 @@
glass_desc = "White and nutritious goodness!"
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
- if(M.getBruteLoss() && prob(20))
- M.heal_bodypart_damage(1,0, 0)
+ if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
+ M.heal_bodypart_damage(1.5,0, 0)
. = 1
+ else
+ if(M.getBruteLoss() && prob(20))
+ M.heal_bodypart_damage(1,0, 0)
+ . = 1
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 2)
- var/datum/dna/Mdna = M.has_dna()
- if(Mdna && Mdna.species && (Mdna.species.id == "plasmaman" || Mdna.species.id == "skeleton"))
- M.heal_bodypart_damage(1,0, 0)
- . = 1
..()
/datum/reagent/consumable/soymilk
@@ -305,6 +305,16 @@
..()
. = 1
+/datum/reagent/consumable/lemonade
+ name = "Lemonade"
+ id = "lemonade"
+ description = "Sweet, tangy lemonade. Good for the soul."
+ quality = DRINK_NICE
+ taste_description = "sunshine and summertime"
+ glass_icon_state = "lemonpitcher"
+ glass_name = "pitcher of lemonade"
+ glass_desc = "This drink leaves you feeling nostalgic for some reason."
+
/datum/reagent/consumable/tea/arnold_palmer
name = "Arnold Palmer"
id = "arnold_palmer"
@@ -498,6 +508,34 @@
/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M)
M.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
..()
+
+/datum/reagent/consumable/grey_bull
+ name = "Grey Bull"
+ id = "grey_bull"
+ description = "Grey Bull, it gives you gloves!"
+ color = "#EEFF00" // rgb: 238, 255, 0
+ quality = DRINK_VERYGOOD
+ taste_description = "carbonated oil"
+ glass_icon_state = "grey_bull_glass"
+ glass_name = "glass of Grey Bull"
+ glass_desc = "Surprisingly it isnt grey."
+
+/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, id)
+
+/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, id)
+ ..()
+
+/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/M)
+ M.Jitter(20)
+ M.dizziness +=1
+ M.drowsyness = 0
+ M.AdjustSleeping(-40, FALSE)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
+ ..()
+
/datum/reagent/consumable/sodawater
name = "Soda Water"
id = "sodawater"
@@ -719,6 +757,11 @@
glass_name = "glass of grape juice"
glass_desc = "It's grape (soda)!"
+/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
+ ..()
+
+
/datum/reagent/consumable/milk/chocolate_milk
name = "Chocolate Milk"
id = "chocolate_milk"
@@ -746,6 +789,65 @@
glass_name = "glass of grenadine"
glass_desc = "Delicious flavored syrup."
+/datum/reagent/consumable/parsnipjuice
+ name = "Parsnip Juice"
+ id = "parsnipjuice"
+ description = "Why..."
+ color = "#FFA500"
+ taste_description = "parsnip"
+ glass_name = "glass of parsnip juice"
+
+/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
+ name = "Peach Juice"
+ id = "peachjuice"
+ description = "Just peachy."
+ color = "#E78108"
+ taste_description = "peaches"
+ glass_name = "glass of peach juice"
+
+/datum/reagent/consumable/cream_soda
+ name = "Cream Soda"
+ id = "cream_soda"
+ description = "A classic space-American vanilla flavored soft drink."
+ color = "#dcb137"
+ quality = DRINK_VERYGOOD
+ taste_description = "fizzy vanilla"
+ glass_icon_state = "cream_soda"
+ glass_name = "Cream Soda"
+ glass_desc = "A classic space-American vanilla flavored soft drink."
+
+/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
+ ..()
+
+/datum/reagent/consumable/red_queen
+ name = "Red Queen"
+ id = "red_queen"
+ description = "DRINK ME."
+ color = "#e6ddc3"
+ quality = DRINK_GOOD
+ taste_description = "wonder"
+ glass_icon_state = "red_queen"
+ glass_name = "Red Queen"
+ glass_desc = "DRINK ME."
+ var/current_size = 1
+
+/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H)
+ if(prob(75))
+ return ..()
+ var/newsize = pick(0.5, 0.75, 1, 1.50, 2)
+ H.resize = newsize/current_size
+ current_size = newsize
+ H.update_transform()
+ if(prob(40))
+ H.emote("sneeze")
+ ..()
+
+/datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/M)
+ M.resize = 1/current_size
+ M.update_transform()
+ ..()
+
/datum/reagent/consumable/pinkmilk
name = "Strawberry Milk"
id = "pinkmilk"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 38db62fd2a..7efa13898d 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -433,11 +433,19 @@
taste_description = "childhood whimsy"
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M)
- if(ishuman(M) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
+ if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM))
M.heal_bodypart_damage(1,1, 0)
. = 1
..()
+/datum/reagent/consumable/peanut_butter
+ name = "Peanut Butter"
+ id = "peanut_butter"
+ description = "A popular food paste made from ground dry-roasted peanuts."
+ color = "#C29261"
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+ taste_description = "peanuts"
+
/datum/reagent/consumable/cornoil
name = "Corn Oil"
id = "cornoil"
@@ -714,6 +722,24 @@
color = "#eef442" // rgb: 238, 244, 66
taste_description = "mournful honking"
+/datum/reagent/consumable/astrotame
+ name = "Astrotame"
+ id = "astrotame"
+ description = "A space age artifical sweetener."
+ nutriment_factor = 0
+ metabolization_rate = 2 * REAGENTS_METABOLISM
+ reagent_state = SOLID
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ taste_mult = 8
+ taste_description = "sweetness"
+ overdose_threshold = 17
+
+/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M)
+ if(M.disgust < 80)
+ M.adjust_disgust(10)
+ ..()
+ . = TRUE
+
/datum/reagent/consumable/secretsauce
name = "secret sauce"
id = "secret_sauce"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 890403691e..4ccd2e6b9f 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -261,7 +261,7 @@
qdel(R)
T.Bless()
-/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
+/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
name = "Unholy Water"
id = "unholywater"
description = "Something that shouldn't exist on this plane of existence."
@@ -280,7 +280,7 @@
M.AdjustStun(-40, 0)
M.AdjustKnockdown(-40, 0)
M.adjustStaminaLoss(-10, 0)
- M.adjustToxLoss(-2, 0)
+ M.adjustToxLoss(-2, 0, TRUE)
M.adjustOxyLoss(-2, 0)
M.adjustBruteLoss(-2, 0)
M.adjustFireLoss(-2, 0)
@@ -1879,4 +1879,4 @@
if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly.
P.length += added_length
P.update()
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index d9a4e3a843..6bd165f23e 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -887,3 +887,64 @@
/datum/reagent/toxin/mimesbane/on_mob_end_metabolize(mob/living/L)
REMOVE_TRAIT(L, TRAIT_EMOTEMUTE, id)
+
+/datum/reagent/toxin/bonehurtingjuice //oof ouch
+ name = "Bone Hurting Juice"
+ id = "bonehurtingjuice"
+ description = "A strange substance that looks a lot like water. Drinking it is oddly tempting. Oof ouch."
+ color = "#AAAAAA77" //RGBA: 170, 170, 170, 77
+ toxpwr = 0
+ taste_description = "bone hurting"
+ overdose_threshold = 20
+
+/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M)
+ M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice)
+
+/datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M)
+ M.adjustStaminaLoss(7.5, 0)
+ if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
+ M.adjustBruteLoss(3.5, 0)
+ if(prob(12))
+ switch(rand(1, 3))
+ if(1)
+ var/list/possible_says = list("oof.", "ouch!", "my bones.", "oof ouch.", "oof ouch my bones.")
+ M.say(pick(possible_says), forced = /datum/reagent/toxin/bonehurtingjuice)
+ if(2)
+ var/list/possible_mes = list("oofs softly.", "looks like their bones hurt.", "grimaces, as though their bones hurt.")
+ M.say("*custom " + pick(possible_mes), forced = /datum/reagent/toxin/bonehurtingjuice)
+ if(3)
+ to_chat(M, "Your bones hurt!")
+ return ..()
+
+/datum/reagent/toxin/bonehurtingjuice/overdose_process(mob/living/carbon/M)
+ if(prob(6) && iscarbon(M)) //big oof
+ var/selected_part
+ switch(rand(1, 4)) //God help you if the same limb gets picked twice quickly.
+ if(1)
+ selected_part = BODY_ZONE_L_ARM
+ if(2)
+ selected_part = BODY_ZONE_R_ARM
+ if(3)
+ selected_part = BODY_ZONE_L_LEG
+ if(4)
+ selected_part = BODY_ZONE_R_LEG
+ var/obj/item/bodypart/bp = M.get_bodypart(selected_part)
+ if(M.dna.species.type != /datum/species/skeleton || M.dna.species.type != /datum/species/plasmaman || M.dna.species.type != /datum/species/golem/bone) //We're so sorry skeletons, you're so misunderstood
+ if(bp)
+ bp.receive_damage(0, 0, 200)
+ playsound(M, get_sfx("desceration"), 50, TRUE, -1)
+ M.visible_message("[M]'s bones hurt too much!!", "Your bones hurt too much!!")
+ M.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice)
+ else //SUCH A LUST FOR REVENGE!!!
+ to_chat(M, "A phantom limb hurts!")
+ M.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice)
+ else //you just want to socialize
+ if(bp)
+ playsound(M, get_sfx("desceration"), 50, TRUE, -1)
+ M.visible_message("[M] rattles loudly and flails around!!", "Your bones hurt so much that your missing muscles spasm!!")
+ M.say("OOF!!", forced=/datum/reagent/toxin/bonehurtingjuice)
+ bp.receive_damage(200, 0, 0) //But I don't think we should
+ else
+ to_chat(M, "Your missing arm aches from wherever you left it.")
+ M.emote("sigh")
+ return ..()
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 29863c2b90..b29a1c6809 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -64,8 +64,8 @@
strengthdiv = 8
for(var/mob/living/simple_animal/revenant/R in get_hearers_in_view(7,get_turf(holder.my_atom)))
var/deity
- if(SSreligion.deity)
- deity = SSreligion.deity
+ if(GLOB.deity)
+ deity = GLOB.deity
else
deity = "Christ"
to_chat(R, "The power of [deity] compels you!")
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index db5f7b198c..8edca91a91 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -216,7 +216,7 @@
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
- T.visible_message("The slime extract begins to vibrate adorably!")
+ T.visible_message("The slime extract starts to feel extremely cold!")
addtimer(CALLBACK(src, .proc/freeze, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
@@ -227,7 +227,8 @@
if(holder && holder.my_atom)
var/turf/open/T = get_turf(holder.my_atom)
if(istype(T))
- T.atmos_spawn_air("nitrogen=50;TEMP=2.7")
+ var/datum/gas/gastype = /datum/gas/nitrogen
+ T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7")
/datum/chemical_reaction/slime/slimefireproof
name = "Slime Fireproof"
@@ -370,6 +371,11 @@
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder)
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
+ if(slime.docile) //Undoes docility, but doesn't make rabid.
+ slime.visible_message("[slime] forgets its training, becoming wild once again!")
+ slime.docile = FALSE
+ slime.update_name()
+ continue
slime.rabid = 1
slime.visible_message("The [slime] is driven into a frenzy!")
..()
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index 22e21b1db0..726175a6c6 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -119,3 +119,10 @@
id = "mimesbane"
results = list("mimesbane" = 3)
required_reagents = list("radium" = 1, "mutetoxin" = 1, "nothing" = 1)
+
+/datum/chemical_reaction/bonehurtingjuice
+ name = "Bone Hurting Juice"
+ id = "bonehurtingjuice"
+ results = list("bonehurtingjuice" = 5)
+ required_reagents = list("mutagen" = 1, "itching_powder" = 3, "milk" = 1)
+ mix_message = "The mixture suddenly becomes clear and looks a lot like water. You feel a strong urge to drink it."
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 9bc6bef8a5..9d10b9356a 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -53,7 +53,7 @@
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
. = ..()
- if((!proximity) || !check_allowed_items(target,target_self=1))
+ if((!proximity) || !spillable || !check_allowed_items(target,target_self=1))
return
if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it.
diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm
index 780a1bc97d..65a435a309 100644
--- a/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm
+++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_all_misc.dm
@@ -21,6 +21,14 @@
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_ALL
+/datum/design/board/minesweeper
+ name = "Computer Design (Minesweeper Arcade Machine)"
+ desc = "Allows for the construction of circuit boards used to build a new Minesweeper machine."
+ id = "arcade_minesweeper"
+ build_path = /obj/item/circuitboard/computer/arcade/minesweeper
+ category = list("Computer Boards")
+ departmental_flags = DEPARTMENTAL_FLAG_ALL
+
/datum/design/board/slot_machine
name = "Computer Design (Slot Machine)"
desc = "Allows for the construction of circuit boards used to build a new slot machine."
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index 3ee7d344dc..7ccc41c232 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -219,7 +219,7 @@
/datum/design/mech_missile_rack
name = "Exosuit Weapon (SRM-8 Missile Rack)"
- desc = "Allows for the construction of SRM-8 Missile Rack."
+ desc = "Allows for the construction of an SRM-8 Missile Rack."
id = "mech_missile_rack"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm
index 8ddf975c54..c2cbb5685e 100644
--- a/code/modules/research/designs/smelting_designs.dm
+++ b/code/modules/research/designs/smelting_designs.dm
@@ -7,7 +7,7 @@
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/plasteel
category = list("initial", "Stock Parts")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SECURITY
maxstack = 50
/datum/design/plastitanium_alloy
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 03c0582245..214ef36afe 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -330,8 +330,8 @@
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/suppressor
- name = "Universal Suppressor"
- desc = "A reverse-engineered universal suppressor that fits on most small arms with threaded barrels."
+ name = "Suppressor"
+ desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels."
id = "suppressor"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index ab314cb33c..d3a268047e 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -70,9 +70,13 @@
rogue_types = list(/datum/nanite_program/brain_decay)
/datum/nanite_program/brain_heal/check_conditions()
- if(!host_mob.getBrainLoss())
- return FALSE
- return ..()
+ if(iscarbon(host_mob))
+ var/mob/living/carbon/C = host_mob
+ if(length(C.get_traumas()))
+ return ..()
+ if(host_mob.getBrainLoss())
+ return ..()
+ return FALSE
/datum/nanite_program/brain_heal/active_effect()
host_mob.adjustBrainLoss(-1, TRUE)
@@ -187,10 +191,14 @@
rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire)
/datum/nanite_program/brain_heal_advanced/check_conditions()
- if(!host_mob.getBrainLoss())
- return FALSE
- return ..()
-
+ if(iscarbon(host_mob))
+ var/mob/living/carbon/C = host_mob
+ if(length(C.get_traumas()))
+ return ..()
+ if(host_mob.getBrainLoss())
+ return ..()
+ return FALSE
+
/datum/nanite_program/brain_heal_advanced/active_effect()
host_mob.adjustBrainLoss(-2, TRUE)
if(iscarbon(host_mob) && prob(10))
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 881c830e5e..ff55a87dfa 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -186,6 +186,7 @@ Chilling extracts:
/obj/item/slimecross/chilling/sepia/do_effect(mob/user)
user.visible_message("[src] shatters, freezing time itself!")
+ allies -= user //support class
new /obj/effect/timestop(get_turf(user), 2, 300, allies)
..()
@@ -267,7 +268,7 @@ Chilling extracts:
addtimer(CALLBACK(src, .proc/boom), 50)
/obj/item/slimecross/chilling/oil/proc/boom()
- explosion(get_turf(src), -1, -1, 3, 10) //Large radius, but mostly light damage.
+ explosion(get_turf(src), -1, -1, 10, 0) //Large radius, but mostly light damage, and no flash.
qdel(src)
/obj/item/slimecross/chilling/black
@@ -307,4 +308,4 @@ Chilling extracts:
user.visible_message("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!")
for(var/obj/machinery/door/airlock/door in area)
new /obj/effect/forcefield/slimewall/rainbow(door.loc)
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 76d444da18..85819da52a 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -633,6 +633,12 @@
to_chat(user, "The slime is dead!")
return
+ if(M.rabid) //Stops being rabid, but doesn't become truly docile.
+ to_chat(M, "You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.")
+ to_chat(user, "You feed the slime the potion, calming its rabid rage.")
+ M.rabid = FALSE
+ qdel(src)
+ return
M.docile = 1
M.nutrition = 700
to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.")
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 161ea3ac62..92a637ce43 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -81,7 +81,11 @@
/obj/item/stack/sheet/cloth = /datum/species/golem/cloth,
/obj/item/stack/sheet/mineral/adamantine = /datum/species/golem/adamantine,
/obj/item/stack/sheet/plastic = /datum/species/golem/plastic,
- /obj/item/stack/tile/brass = /datum/species/golem/clockwork)
+ /obj/item/stack/tile/brass = /datum/species/golem/clockwork,
+ /obj/item/stack/tile/bronze = /datum/species/golem/bronze,
+ /obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard,
+ /obj/item/stack/sheet/leather = /datum/species/golem/leather,
+ /obj/item/stack/sheet/bone = /datum/species/golem/bone)
if(istype(I, /obj/item/stack))
var/obj/item/stack/O = I
diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm
index 86132cf834..1258b9f4b8 100644
--- a/code/modules/shuttle/assault_pod.dm
+++ b/code/modules/shuttle/assault_pod.dm
@@ -35,7 +35,9 @@
/obj/item/assault_pod/attack_self(mob/living/user)
var/target_area
- target_area = input("Area to land", "Select a Landing Zone", target_area) in GLOB.teleportlocs
+ target_area = input("Area to land", "Select a Landing Zone", target_area) as null|anything in GLOB.teleportlocs
+ if(!target_area)
+ return
var/area/picked_area = GLOB.teleportlocs[target_area]
if(!src || QDELETED(src))
return
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index d41fd6a79b..020b4b29ab 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -199,7 +199,7 @@
. = ..()
-/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null)
+/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null, silent = FALSE)
if(!isnum(set_coefficient))
var/security_num = seclevel2num(get_security_level())
switch(security_num)
@@ -228,7 +228,8 @@
else
SSshuttle.emergencyLastCallLoc = null
- priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority")
+ if(!silent)
+ priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority")
/obj/docking_port/mobile/emergency/cancel(area/signalOrigin)
if(mode != SHUTTLE_CALL)
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index bc1fc980bb..13686e2069 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -42,6 +42,7 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/ballistic/revolver/grenadelauncher,
/obj/item/gun/ballistic/revolver/golden,
/obj/item/gun/ballistic/automatic/sniper_rifle,
+ /obj/item/gun/ballistic/rocketlauncher,
/obj/item/gun/medbeam,
/obj/item/gun/energy/laser/scatter,
/obj/item/gun/energy/gravity_gun))
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 0302dd2cae..ea336bea19 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -46,7 +46,7 @@
/obj/item/organ/cyberimp/chest/reviver
name = "Reviver implant"
- desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
+ desc = "This implant will attempt to revive and heal you if you lose consciousness. For the faint of heart!"
icon_state = "chest_implant"
implant_color = "#AD0000"
slot = ORGAN_SLOT_HEART_AID
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index 0e3793d2e4..0ba6fd7fcd 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -103,3 +103,23 @@
desc = "A single use autosurgeon that contains a penis. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/genital/penis
+
+/obj/item/autosurgeon/testicles
+ desc = "A single use autosurgeon that contains a set of testicles. A screwdriver can be used to remove it, but implants can't be placed back in."
+ uses = 1
+ starting_organ = /obj/item/organ/genital/testicles
+
+/obj/item/autosurgeon/vagina
+ desc = "A single use autosurgeon that contains a vagina. A screwdriver can be used to remove it, but implants can't be placed back in."
+ uses = 1
+ starting_organ = /obj/item/organ/genital/vagina
+
+/obj/item/autosurgeon/breasts
+ desc = "A single use autosurgeon that contains a set of breasts. A screwdriver can be used to remove it, but implants can't be placed back in."
+ uses = 1
+ starting_organ = /obj/item/organ/genital/breasts
+
+/obj/item/autosurgeon/womb
+ desc = "A single use autosurgeon that contains a womb. A screwdriver can be used to remove it, but implants can't be placed back in."
+ uses = 1
+ starting_organ = /obj/item/organ/genital/womb
\ No newline at end of file
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index b0a2f38c46..8e191a41a9 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -94,3 +94,9 @@
H.dna.features["ears"] = "None"
H.dna.species.mutant_bodyparts -= "ears"
H.update_body()
+
+/obj/item/organ/ears/bronze
+ name = "tin ears"
+ desc = "The robust ears of a bronze golem. "
+ damage_multiplier = 0.1 //STRONK
+ bang_protect = 1 //Fear me weaklings.
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 64be29c339..ef358c48da 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -288,51 +288,52 @@
gas_breathed = breath_gases[/datum/gas/stimulum]
if (gas_breathed > gas_stimulation_min)
var/existing = H.reagents.get_reagent_amount("stimulum")
- H.reagents.add_reagent("stimulum",max(0, 1 - existing))
+ H.reagents.add_reagent("stimulum", max(0, 5 - existing))
breath_gases[/datum/gas/stimulum]-=gas_breathed
// Miasma
if (breath_gases[/datum/gas/miasma])
var/miasma_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/miasma])
+ if(miasma_pp > MINIMUM_MOLES_DELTA_TO_MOVE)
- //Miasma sickness
- if(prob(0.5 * miasma_pp))
- var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
- miasma_disease.name = "Unknown"
- miasma_disease.try_infect(owner)
+ //Miasma sickness
+ if(prob(0.05 * miasma_pp))
+ var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
+ miasma_disease.name = "Unknown"
+ miasma_disease.try_infect(owner)
- // Miasma side effects
- switch(miasma_pp)
- if(1 to 5)
- // At lower pp, give out a little warning
- SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
- if(prob(5))
- to_chat(owner, "There is an unpleasant smell in the air.")
- if(5 to 15)
- //At somewhat higher pp, warning becomes more obvious
- if(prob(15))
- to_chat(owner, "You smell something horribly decayed inside this room.")
- SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
- if(15 to 30)
- //Small chance to vomit. By now, people have internals on anyway
- if(prob(5))
- to_chat(owner, "The stench of rotting carcasses is unbearable!")
- SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
- owner.vomit()
- if(30 to INFINITY)
- //Higher chance to vomit. Let the horror start
- if(prob(15))
- to_chat(owner, "The stench of rotting carcasses is unbearable!")
- SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
- owner.vomit()
- else
- SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
+ // Miasma side effects
+ switch(miasma_pp)
+ if(1 to 5)
+ // At lower pp, give out a little warning
+ SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
+ if(prob(5))
+ to_chat(owner, "There is an unpleasant smell in the air.")
+ if(5 to 15)
+ //At somewhat higher pp, warning becomes more obvious
+ if(prob(15))
+ to_chat(owner, "You smell something horribly decayed inside this room.")
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell)
+ if(15 to 30)
+ //Small chance to vomit. By now, people have internals on anyway
+ if(prob(5))
+ to_chat(owner, "The stench of rotting carcasses is unbearable!")
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
+ owner.vomit()
+ if(30 to INFINITY)
+ //Higher chance to vomit. Let the horror start
+ if(prob(15))
+ to_chat(owner, "The stench of rotting carcasses is unbearable!")
+ SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench)
+ owner.vomit()
+ else
+ SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "smell")
- // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds
- // Then again, this is a purely hypothetical scenario and hardly reachable
- owner.adjust_disgust(0.1 * miasma_pp)
+ // In a full miasma atmosphere with 101.34 pKa, about 10 disgust per breath, is pretty low compared to threshholds
+ // Then again, this is a purely hypothetical scenario and hardly reachable
+ owner.adjust_disgust(0.1 * miasma_pp)
- breath_gases[/datum/gas/miasma]-=gas_breathed
+ breath_gases[/datum/gas/miasma]-=gas_breathed
// Clear out moods when no miasma at all
else
@@ -442,3 +443,14 @@
heat_level_1_threshold = 400 // better adapted for heat, obv. Lavaland standard is 300
heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3
+/obj/item/organ/lungs/slime
+ name = "vacuole"
+ desc = "A large organelle designed to store oxygen and other important gasses."
+
+ safe_toxins_max = 0 //We breathe this to gain POWER.
+
+/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
+ . = ..()
+ if (breath.gases[/datum/gas/plasma])
+ var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma])
+ owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm
index 2e91879006..b008682745 100644
--- a/code/modules/uplink/uplink_devices.dm
+++ b/code/modules/uplink/uplink_devices.dm
@@ -57,4 +57,3 @@
/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20)
. = ..()
AddComponent(/datum/component/uplink, owner, TRUE, FALSE, null, tc_amount)
- traitor_unlock_degrees = 360
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 3018ebf03c..905c710e6a 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -85,18 +85,18 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
return pick(4;0.75,2;0.5,1;0.25)
/datum/uplink_item/proc/purchase(mob/user, datum/component/uplink/U)
- var/atom/A = spawn_item(item, user)
+ var/atom/A = spawn_item(item, user, U)
if(purchase_log_vis && U.purchase_log)
U.purchase_log.LogPurchase(A, src, cost)
-/datum/uplink_item/proc/spawn_item(spawn_item, mob/user)
- if(!spawn_item)
+/datum/uplink_item/proc/spawn_item(spawn_path, mob/user, datum/component/uplink/U)
+ if(!spawn_path)
return
var/atom/A
- if(ispath(spawn_item))
- A = new spawn_item(get_turf(user))
+ if(ispath(spawn_path))
+ A = new spawn_path(get_turf(user))
else
- A = spawn_item
+ A = spawn_path
if(ishuman(user) && istype(A, /obj/item))
var/mob/living/carbon/human/H = user
if(H.put_in_hands(A))
@@ -117,23 +117,23 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/bundles_TC/chemical
name = "Bioterror bundle"
- desc = "For the madman: Contains Bioterror spray, Bioterror grenade, chemicals, syringe gun, box of syringes,\
- Donksoft assault rifle, and some darts. Remember: Seal suit and equip internals before use."
+ desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \
+ box of syringes, Donksoft assault rifle, and some riot darts. Remember: Seal suit and equip internals before use."
item = /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
cost = 30 // normally 42
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/bulldog
name = "Bulldog bundle"
- desc = "Lean and mean: Optimised for people that want to get up close and personal. Contains the popular \
- Bulldog shotgun, two 12g drums, and a pair of Thermal imaging goggles."
+ desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \
+ Bulldog shotgun, a 12g buckshot drum, a 12g taser slug drum and a pair of Thermal imaging goggles."
item = /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle
cost = 13 // normally 16
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/c20r
name = "C-20r bundle"
- desc = "Old faithful: The classic C-20r, bundled with two magazines, and a (surplus) suppressor at discount price."
+ desc = "Old Faithful: The classic C-20r, bundled with two magazines, and a (surplus) suppressor at discount price."
item = /obj/item/storage/backpack/duffelbag/syndie/c20rbundle
cost = 14 // normally 16
include_modes = list(/datum/game_mode/nuclear)
@@ -147,8 +147,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/bundles_TC/medical
name = "Medical bundle"
- desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a Donksoft machine gun, \
- a box of ammo, and a pair of magboots to rescue your friends in no-gravity environments."
+ desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \
+ a Donksoft LMG, a box of riot darts and a pair of magboots to rescue your friends in no-gravity environments."
item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
cost = 15 // normally 20
include_modes = list(/datum/game_mode/nuclear)
@@ -170,15 +170,18 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/bundles_TC/sniper
name = "Sniper bundle"
- desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollow-point \
- a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie."
+ desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \
+ two soporific knockout magazines, a free surplus supressor, and a sharp-looking tactical turtleneck suit. \
+ We'll throw in a free red tie if you order NOW."
item = /obj/item/storage/briefcase/sniperbundle
cost = 20 // normally 26
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/firestarter
name = "Spetsnaz Pyro bundle"
- desc = "For systematic suppression of carbon lifeforms in close range: Contains a specialist Pyrotechnic equipment, foreign pistol, two magazines, a pipebomb, and a stimulant syringe."
+ desc = "For systematic suppression of carbon lifeforms in close quarters: Contains a lethal New Russian backpack spray, Elite hardsuit, \
+ Stechkin APS pistol, two magazines, a minibomb and a stimulant syringe. \
+ Order NOW and comrade Boris will throw in an extra tracksuit."
item = /obj/item/storage/backpack/duffelbag/syndie/firestarter
cost = 30
include_modes = list(/datum/game_mode/nuclear)
@@ -187,7 +190,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Syndicate Bundle"
desc = "Syndicate Bundles are specialized groups of items that arrive in a plain box. \
These items are collectively worth more than 20 telecrystals, but you do not know which specialization \
- you will receive."
+ you will receive. May contain discontinued and/or exotic items."
item = /obj/item/storage/box/syndicate
cost = 20
exclude_modes = list(/datum/game_mode/nuclear)
@@ -216,7 +219,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
var/list/uplink_items = get_uplink_items(SSticker && SSticker.mode? SSticker.mode : null, FALSE)
var/crate_value = starting_crate_value
- var/obj/structure/closet/crate/C = spawn_item(/obj/structure/closet/crate, user)
+ var/obj/structure/closet/crate/C = spawn_item(/obj/structure/closet/crate, user, U)
if(U.purchase_log)
U.purchase_log.LogPurchase(C, src, cost)
while(crate_value)
@@ -287,6 +290,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous
category = "Conspicuous and Dangerous Weapons"
+/datum/uplink_item/dangerous/rawketlawnchair
+ name = "84mm Rocket Propelled Grenade Launcher"
+ desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \
+ Guaranteed to send your target out with a bang or your money back!"
+ item = /obj/item/gun/ballistic/rocketlauncher
+ cost = 8
+ surplus = 30
+ include_modes = list(/datum/game_mode/nuclear)
+
/datum/uplink_item/dangerous/antitank
name = "Anti Tank Pistol"
desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all), \
@@ -327,7 +339,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/bioterror
name = "Biohazardous Chemical Sprayer"
- desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
+ desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \
Use with extreme caution, to prevent exposure to yourself and your fellow operatives."
item = /obj/item/reagent_containers/spray/chemsprayer/bioterror
@@ -418,7 +430,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 30
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/badass/rapid
+/datum/uplink_item/dangerous/rapid
name = "Gloves of the North Star"
desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
item = /obj/item/clothing/gloves/rapid
@@ -427,7 +439,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/guardian
name = "Holoparasites"
desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
- organic host as a home base and source of fuel."
+ organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
item = /obj/item/storage/box/syndie_kit/guardian
cost = 15
refundable = TRUE
@@ -450,7 +462,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/carbine
name = "M-90gl Carbine"
desc = "A fully-loaded, specialized three-round burst carbine that fires 5.56mm ammunition from a 30 round magazine \
- with a togglable 40mm under-barrel grenade launcher."
+ with a toggleable 40mm underbarrel grenade launcher."
item = /obj/item/gun/ballistic/automatic/m90
cost = 18
surplus = 50
@@ -490,7 +502,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/revolver
name = "Syndicate Revolver"
- desc = "A brutally simple syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
+ desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
item = /obj/item/gun/ballistic/revolver/syndie
cost = 13
surplus = 50
@@ -498,7 +510,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/foamsmg
name = "Toy Submachine Gun"
- desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
+ desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine."
item = /obj/item/gun/ballistic/automatic/c20r/toy
cost = 5
surplus = 0
@@ -514,7 +526,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
/datum/uplink_item/dangerous/foampistol
- name = "Toy Gun with Riot Darts"
+ name = "Toy Pistol with Riot Darts"
desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade \
darts effective at incapacitating a target."
item = /obj/item/gun/ballistic/automatic/toy/pistol/riot
@@ -594,7 +606,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/stealthy_weapons/romerol_kit
name = "Romerol"
- desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
+ desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. \
+ On death, these nodules take control of the dead body, causing limited revivification, \
+ along with slurred speech, aggression, and the ability to infect others with this agent."
item = /obj/item/storage/box/syndie_kit/romerol
cost = 25
cant_discount = TRUE
@@ -604,7 +618,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Sleepy Pen"
desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a \
strong anesthetic and a chemical that prevents the target from speaking. \
- The pen holds one dose of the mixture, and can be refilled. Note that before the target \
+ The pen holds one dose of the mixture, and can be refilled with any chemicals. Note that before the target \
falls asleep, they will be able to move and act."
item = /obj/item/pen/sleepy
cost = 4
@@ -618,9 +632,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
include_modes = list(/datum/game_mode/nuclear/clown_ops)
/datum/uplink_item/stealthy_weapons/suppressor
- name = "Universal Suppressor"
- desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the \
- shots of the weapon for increased stealth and superior ambushing capability."
+ name = "Suppressor"
+ desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. \
+ It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns."
item = /obj/item/suppressor
cost = 1
surplus = 10
@@ -655,21 +669,24 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/ammo/pistolap
name = "10mm Armour Piercing Magazine"
- desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds are less effective at injuring the target but penetrate protective gear."
+ desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \
+ These rounds are less effective at injuring the target but penetrate protective gear."
item = /obj/item/ammo_box/magazine/m10mm/ap
cost = 2
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
/datum/uplink_item/ammo/pistolhp
name = "10mm Hollow Point Magazine"
- desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. These rounds are more damaging but ineffective against armour."
+ desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \
+ These rounds are more damaging but ineffective against armour."
item = /obj/item/ammo_box/magazine/m10mm/hp
cost = 3
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
/datum/uplink_item/ammo/pistolfire
name = "10mm Incendiary Magazine"
- desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with incendiary rounds which ignite the target."
+ desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \
+ Loaded with incendiary rounds which inflict little damage, but ignite the target."
item = /obj/item/ammo_box/magazine/m10mm/fire
cost = 2
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
@@ -706,7 +723,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/ammo/shotgun/meteor
name = "12g Meteorslug Shells"
desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \
- Great for blasting airlocks off their frames."
+ Great for blasting airlocks off their frames and knocking down enemies."
item = /obj/item/ammo_box/magazine/m12g/meteor
include_modes = list(/datum/game_mode/nuclear)
@@ -750,13 +767,12 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
name = ".45 Ammo Duffel Bag"
desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price."
item = /obj/item/storage/backpack/duffelbag/syndie/ammo/smg
- cost = 20
+ cost = 20 //instead of 27 TC
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/smg
name = ".45 SMG Magazine"
- desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun. \
- These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
+ desc = "An additional 24-round .45 magazine suitable for use with the C-20r submachine gun."
item = /obj/item/ammo_box/magazine/smgm45
cost = 3
include_modes = list(/datum/game_mode/nuclear)
@@ -786,7 +802,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/ammo/carbine
name = "5.56mm Toploader Magazine"
desc = "An additional 30-round 5.56mm magazine; suitable for use with the M-90gl carbine. \
- These bullets pack less punch than 1.95mm rounds, but they still offer more power than .45 ammo."
+ These bullets pack less punch than 7.12x82mm rounds, but they still offer more power than .45 ammo."
item = /obj/item/ammo_box/magazine/m556
cost = 4
include_modes = list(/datum/game_mode/nuclear)
@@ -799,7 +815,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/ammo/machinegun/basic
name = "1.95x129mm Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \
- By the time you need to use this, you'll already be on a pile of corpses."
+ By the time you need to use this, you'll already be standing on a pile of corpses"
item = /obj/item/ammo_box/magazine/mm195x129
/datum/uplink_item/ammo/machinegun/ap
@@ -821,9 +837,25 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn."
item = /obj/item/ammo_box/magazine/mm195x129/incen
+/datum/uplink_item/ammo/rocket
+ include_modes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/ammo/rocket/basic
+ name = "84mm HE Rocket"
+ desc = "A low-yield anti-personnel HE rocket. Gonna take you out in style!"
+ item = /obj/item/ammo_casing/caseless/rocket
+ cost = 4
+
+/datum/uplink_item/ammo/rocket/hedp
+ name = "84mm HEDP Rocket"
+ desc = "A high-yield HEDP rocket; extremely effective against armored targets, as well as surrounding personnel. \
+ Strike fear into the hearts of your enemies."
+ item = /obj/item/ammo_casing/caseless/rocket/hedp
+ cost = 6
+
/datum/uplink_item/ammo/pistolaps
name = "9mm Handgun Magazine"
- desc = "An additional 15-round 9mm magazine, compatible with the Stetchkin APS pistol, found in the Spetsnaz Pyro bundle."
+ desc = "An additional 15-round 9mm magazine, compatible with the Stechkin APS pistol, found in the Spetsnaz Pyro bundle."
item = /obj/item/ammo_box/magazine/pistolm9mm
cost = 2
include_modes = list(/datum/game_mode/nuclear)
@@ -847,7 +879,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/ammo/toydarts
name = "Box of Riot Darts"
- desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
+ desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!"
item = /obj/item/ammo_box/foambox/riot
cost = 2
surplus = 0
@@ -871,7 +903,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
category = "Grenades and Explosives"
/datum/uplink_item/explosives/bioterrorfoam
- name = "Chemical Foam Grenade"
+ name = "Bioterror Foam Grenade"
desc = "A powerful chemical foam grenade which creates a deadly torrent of foam that will mute, blind, confuse, \
mutate, and irritate carbon lifeforms. Specially brewed by Tiger Cooperative chemical weapons specialists \
using additional spore toxin. Ensure suit is sealed before use."
@@ -901,7 +933,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/explosives/c4
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, sabotage equipment, or connect \
- an assembly to it in order to alter the way it detonates. It has a modifiable timer with a \
+ an assembly to it in order to alter the way it detonates. It can be attached to almost all objects and has a modifiable timer with a \
minimum setting of 10 seconds."
item = /obj/item/grenade/plastic/c4
cost = 1
@@ -915,8 +947,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/explosives/x4bag
name = "Bag of X-4 explosives"
- desc = "Contains 3 X-4 plastic explosives. Similar, but more powerful than C-4. X-4 can be placed on a solid surface, such as a wall or window, and it will \
- blast through the wall, injuring anything on the opposite side, while being safer to the user. For when you want a wider, deeper, hole."
+ desc = "Contains 3 X-4 shaped plastic explosives. Similar to C4, but with a stronger blast that is directional instead of circular. \
+ X-4 can be placed on a solid surface, such as a wall or window, and it will blast through the wall, injuring anything on the opposite side, while being safer to the user. \
+ For when you want a controlled explosion that leaves a wider, deeper, hole."
item = /obj/item/storage/backpack/duffelbag/syndie/x4
cost = 4 //
cant_discount = TRUE
@@ -937,16 +970,15 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
name = "Detomatix PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you four opportunities to \
detonate PDAs of crewmembers who have their message feature enabled. \
- The concussive effect from the explosion will knock the recipient out for a short period, and deafen \
- them for longer. Beware, it has a chance to detonate your PDA."
+ The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer."
item = /obj/item/cartridge/virus/syndicate
cost = 5
restricted = TRUE
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
- desc = "A box that contains two EMP grenades and an EMP implant. Useful to disrupt communication, \
- security's energy weapons, and silicon lifeforms when you're in a tight spot."
+ desc = "A box that contains five EMP grenades and an EMP implant with three uses. Useful to disrupt communications, \
+ security's energy weapons and silicon lifeforms when you're in a tight spot."
item = /obj/item/storage/box/syndie_kit/emp
cost = 2
@@ -963,7 +995,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/explosives/grenadier
name = "Grenadier's belt"
- desc = "A belt of a large variety of lethally dangerous and destructive grenades."
+ desc = "A belt containing 26 lethally dangerous and destructive grenades. Comes with an extra multitool and screwdriver."
item = /obj/item/storage/belt/grenade/full
include_modes = list(/datum/game_mode/nuclear)
cost = 22
@@ -1050,7 +1082,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/support/reinforcement/assault_borg
name = "Syndicate Assault Cyborg"
- desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel."
+ desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \
+ Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar."
item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
refundable = TRUE
cost = 65
@@ -1058,17 +1091,18 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/support/reinforcement/medical_borg
name = "Syndicate Medical Cyborg"
- desc = "A combat medic cyborg, with potent healing reagents and a medical beam gun, but limited offensive potential."
+ desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \
+ It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \
+ Thanks to its organ storage bag, it can perform surgery as well as any humanoid."
item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
refundable = TRUE
cost = 35
restricted = TRUE
/datum/uplink_item/support/gygax
- name = "Gygax Exosuit"
+ name = "Dark Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \
- for hit-and-run style attacks. This model lacks a method of space propulsion, and therefore it is \
- advised to utilize the drop pod if you wish to make use of it."
+ for hit-and-run style attacks. Features an incendiary carbine, flash bang launcher, teleporter, ion thrusters and a Tesla energy array."
item = /obj/mecha/combat/gygax/dark/loaded
cost = 80
@@ -1081,8 +1115,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/support/mauler
name = "Mauler Exosuit"
- desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring, \
- and deployable smoke."
+ desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \
+ and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array."
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 140
@@ -1111,7 +1145,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/stealthy_tools/chameleon
name = "Chameleon Kit"
- desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more!"
+ desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
+ Due to budget cuts, the shoes don't provide protection against slipping."
item = /obj/item/storage/box/syndie_kit/chameleon
cost = 2
exclude_modes = list(/datum/game_mode/nuclear)
@@ -1125,7 +1160,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/stealthy_tools/codespeak_manual
name = "Codespeak Manual"
- desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited used."
+ desc = "Syndicate agents can be trained to use a series of codewords to convey complex information, which sounds like random concepts and drinks to anyone listening. \
+ This manual teaches you this Codespeak. You can also hit someone else with the manual in order to teach them. This is the deluxe edition, which has unlimited uses."
item = /obj/item/codespeak_manual/unlimited
cost = 3
@@ -1141,12 +1177,31 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/stealthy_tools/emplight
name = "EMP Flashlight"
- desc = "A small, self-charging, short-ranged EMP device disguised as a flashlight. \
- Useful for disrupting headsets, cameras, and borgs during stealth operations."
+ desc = "A small, self-recharging, short-ranged EMP device disguised as a working flashlight. \
+ Useful for disrupting headsets, cameras, doors, lockers and borgs during stealth operations. \
+ Attacking a target with this flashlight will direct an EM pulse at it and consumes a charge."
item = /obj/item/flashlight/emp
cost = 2
surplus = 30
+/datum/uplink_item/stealthy_tools/failsafe
+ name = "Failsafe Uplink Code"
+ desc = "When entered the uplink will self-destruct immidiately."
+ item = /obj/effect/gibspawner/generic
+ cost = 1
+ surplus = 0
+ restricted = TRUE
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
+/datum/uplink_item/stealthy_tools/failsafe/spawn_item(spawn_path, mob/user, datum/component/uplink/U)
+ if(!U)
+ return
+ U.failsafe_code = U.generate_code()
+ to_chat(user, "The new failsafe code for this uplink is now : [U.failsafe_code].")
+ if(user.mind)
+ user.mind.store_memory("Failsafe code for [U.parent] : [U.failsafe_code]")
+ return U.parent //For log icon
+
/datum/uplink_item/stealthy_tools/mulligan
name = "Mulligan"
desc = "Screwed up and have security on your tail? This handy syringe will give you a completely new identity \
@@ -1173,7 +1228,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/stealthy_tools/jammer
name = "Radio Jammer"
- desc = "This device will disrupt any nearby outgoing radio communication when activated."
+ desc = "This device will disrupt any nearby outgoing radio communication when activated. Does not affect binary chat."
item = /obj/item/jammer
cost = 5
@@ -1204,7 +1259,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/suits/space_suit
name = "Syndicate Space Suit"
- desc = "This red and black syndicate space suit is less encumbering than Nanotrasen variants, \
+ desc = "This red and black Syndicate space suit is less encumbering than Nanotrasen variants, \
fits inside bags, and has a weapon slot. Nanotrasen crew members are trained to report red space suit \
sightings, however."
item = /obj/item/storage/box/syndie_kit/space
@@ -1212,7 +1267,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/suits/hardsuit
name = "Syndicate Hardsuit"
- desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring and a built in jetpack \
+ desc = "The feared suit of a Syndicate nuclear agent. Features slightly better armoring and a built in jetpack \
that runs off standard atmospheric tanks. Toggling the suit in and out of \
combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \
Additionally the suit is collapsible, making it small enough to fit within a backpack. \
@@ -1223,8 +1278,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/suits/hardsuit/elite
name = "Elite Syndicate Hardsuit"
- desc = "An upgraded, elite version of the syndicate hardsuit. It features fireproofing, and also \
- provides the user with superior armor and mobility compared to the standard syndicate hardsuit."
+ desc = "An upgraded, elite version of the Syndicate hardsuit. It features fireproofing, and also \
+ provides the user with superior armor and mobility compared to the standard Syndicate hardsuit."
item = /obj/item/clothing/suit/space/hardsuit/syndi/elite
cost = 8
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -1232,7 +1287,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/suits/hardsuit/shielded
name = "Shielded Syndicate Hardsuit"
- desc = "An upgraded version of the standard syndicate hardsuit. It features a built-in energy shielding system. \
+ desc = "An upgraded version of the standard Syndicate hardsuit. It features a built-in energy shielding system. \
The shields can handle up to three impacts within a short duration and will rapidly recharge while not under fire."
item = /obj/item/clothing/suit/space/hardsuit/shielded/syndi
cost = 30
@@ -1245,15 +1300,15 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/cutouts
name = "Adaptive Cardboard Cutouts"
- desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \
- crayon for changing their appearances."
+ desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. \
+ This pack contains three as well as a crayon for changing their appearances."
item = /obj/item/storage/box/syndie_kit/cutouts
cost = 1
surplus = 20
/datum/uplink_item/device_tools/assault_pod
name = "Assault Pod Targeting Device"
- desc = "Use to select the landing zone of your assault pod."
+ desc = "Use this to select the landing zone of your assault pod."
item = /obj/item/assault_pod
cost = 30
surplus = 0
@@ -1298,8 +1353,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/camera_bug
name = "Camera Bug"
- desc = "Enables you to view all cameras on the network and track a target. Bugging cameras allows you \
- to disable them remotely."
+ desc = "Enables you to view all cameras on the main network, set up motion alerts and track a target. \
+ Bugging cameras allows you to disable them remotely."
item = /obj/item/camera_bug
cost = 1
surplus = 90
@@ -1326,7 +1381,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/fakenucleardisk
name = "Decoy Nuclear Authentication Disk"
- desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. Don't try to give this to us to complete your objective, we know better!"
+ desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \
+ Don't try to give this to us to complete your objective, we know better!"
item = /obj/item/disk/nuclear/fake
cost = 1
surplus = 1
@@ -1334,7 +1390,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/frame
name = "F.R.A.M.E. PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five PDA viruses which \
- when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \
+ when used cause the targeted PDA to become a new uplink with zero TCs, and immediately become unlocked. \
You will receive the unlock code upon activating the virus, and the new uplink may be charged with \
telecrystals normally."
item = /obj/item/cartridge/virus/frame
@@ -1343,7 +1399,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/toolbox
name = "Full Syndicate Toolbox"
- desc = "The syndicate toolbox is a suspicious black and red. It comes loaded with a full tool set including a \
+ desc = "The Syndicate toolbox is a suspicious black and red. It comes loaded with a full tool set including a \
multitool and combat gloves that are resistant to shocks and heat."
item = /obj/item/storage/toolbox/syndicate
cost = 1
@@ -1366,7 +1422,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/medgun
name = "Medbeam Gun"
desc = "A wonder of Syndicate engineering, the Medbeam gun, or Medi-Gun enables a medic to keep his fellow \
- operatives in the fight, even while under fire."
+ operatives in the fight, even while under fire. Don't cross the streams!"
item = /obj/item/gun/medbeam
cost = 15
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
@@ -1388,9 +1444,9 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/powersink
name = "Power Sink"
- desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \
+ desc = "When screwed to wiring attached to a power grid and activated, this large device lights up and places excessive \
load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \
- traditional bags and boxes."
+ traditional bags and boxes. Caution: Will explode if the powernet contains sufficient amounts of energy."
item = /obj/item/powersink
cost = 6
@@ -1399,7 +1455,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a \
powerful burst of radiation, which, after a short delay, can incapacitate all but the most protected \
of humanoids. It has two settings: intensity, which controls the power of the radiation, \
- and wavelength, which controls how long the radiation delay is."
+ and wavelength, which controls the delay before the effect kicks in."
item = /obj/item/healthanalyzer/rad_laser
cost = 3
@@ -1414,7 +1470,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
desc = "This first aid kit is a suspicious brown and red. Included is a combat stimulant injector \
- for rapid healing, a medical HUD for quick identification of injured personnel, \
+ for rapid healing, a medical night vision HUD for quick identification of injured personnel, \
and other supplies helpful for a field medic."
item = /obj/item/storage/firstaid/tactical
cost = 4
@@ -1429,7 +1485,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/surgerybag_adv
name = "Advanced Syndicate Surgery Duffel Bag"
- desc = "The Syndicate surgery duffel bag is a toolkit containing all newest surgery tools, surgical drapes, \
+ desc = "The Syndicate surgery duffel bag is a toolkit containing all advanced surgery tools, surgical drapes, \
a Syndicate brand MMI, a straitjacket, a muzzle, and a full Syndicate Combat Medic Kit."
item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv
cost = 10
@@ -1445,7 +1501,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/syndietome
name = "Syndicate Tome"
- desc = "Using rare artifacts acquired at great cost, the syndicate has reverse engineered \
+ desc = "Using rare artifacts acquired at great cost, the Syndicate has reverse engineered \
the seemingly magical books of a certain cult. Though lacking the esoteric abilities \
of the originals, these inferior copies are still quite useful, being able to provide \
both weal and woe on the battlefield, even if they do occasionally bite off a finger."
@@ -1464,7 +1520,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/potion
name = "Syndicate Sentience Potion"
item = /obj/item/slimepotion/slime/sentience/nuclear
- desc = "A potion recovered at great risk by undercover syndicate operatives and then subsequently modified with syndicate technology. Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
+ desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \
+ Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors."
cost = 2
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
restricted = TRUE
@@ -1478,7 +1535,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
desc = "An implant injected into the body, and later activated at the user's will. It will inject a chemical \
- cocktail which has a mild healing effect along with removing all stuns and increasing movement speed."
+ cocktail which removes all incapacitating effects, lets the user run faster and has a mild healing effect."
item = /obj/item/storage/box/syndie_kit/imp_adrenal
cost = 8
player_minimum = 25
@@ -1517,28 +1574,30 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/implants/radio
name = "Internal Syndicate Radio Implant"
- desc = "An implant injected into the body, allowing the use of an internal syndicate radio. Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
+ desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \
+ Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
item = /obj/item/storage/box/syndie_kit/imp_radio
cost = 4
restricted = TRUE
/datum/uplink_item/implants/reviver
name = "Reviver Implant"
- desc = "This implant will attempt to revive you if you lose consciousness. Comes with an autosurgeon."
+ desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon."
item = /obj/item/autosurgeon/reviver
cost = 8
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/implants/stealthimplant
name = "Stealth Implant"
- desc = "This one-of-a-kind implant will make you almost invisible if you play your cards right."
+ desc = "This one-of-a-kind implant will make you almost invisible as long as you don't don't excessively move around. \
+ On activation, it will conceal you inside a chameleon cardboard box that is only revealed once someone bumps into it."
item = /obj/item/implanter/stealth
cost = 8
/datum/uplink_item/implants/storage
name = "Storage Implant"
desc = "An implant injected into the body, and later activated at the user's will. It will open a small bluespace \
- pocket capable of storing two items."
+ pocket capable of storing two regular-sized items."
item = /obj/item/storage/box/syndie_kit/imp_storage
cost = 8
@@ -1551,7 +1610,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/implants/uplink
name = "Uplink Implant"
- desc = "An implant injected into the body, and later activated at the user's will. Has no telecrystals, must be charged by the use of physical telecrystals. Undetectable (except via surgery), and excellent for escaping confinement."
+ desc = "An implant injected into the body, and later activated at the user's will. Has no telecrystals and must be charged by the use of physical telecrystals. \
+ Undetectable (except via surgery), and excellent for escaping confinement."
item = /obj/item/storage/box/syndie_kit/imp_uplink
cost = 4
// An empty uplink is kinda useless.
@@ -1610,7 +1670,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
with a minimum of 60 seconds, and can be bolted to the floor with a wrench to prevent \
movement. The bomb is bulky and cannot be moved; upon ordering this item, a smaller beacon will be \
transported to you that will teleport the actual bomb to it upon activation. Note that this bomb can \
- be defused, and some crew may attempt to do so."
+ be defused, and some crew may attempt to do so. \
+ The bomb core can be pried out and manually detonated with other explosives."
item = /obj/item/sbeacondrop/clownbomb
cost = 15
restricted_roles = list("Clown")
@@ -1638,7 +1699,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/role_restricted/haunted_magic_eightball
name = "Haunted Magic Eightball"
- desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking."
+ desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. \
+ Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking."
item = /obj/item/toy/eightball/haunted
cost = 2
restricted_roles = list("Curator")
@@ -1657,14 +1719,16 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/role_restricted/explosive_hot_potato
name = "Exploding Hot Potato"
- desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."
+ desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \
+ The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."
item = /obj/item/hot_potato/syndicate
cost = 4
restricted_roles = list("Cook", "Botanist", "Clown", "Mime")
/datum/uplink_item/role_restricted/ez_clean_bundle
name = "EZ Clean Grenade Bundle"
- desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. The acid only affects carbon-based creatures."
+ desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \
+ The acid only affects carbon-based creatures."
item = /obj/item/storage/box/syndie_kit/ez_clean
cost = 6
surplus = 20
@@ -1679,7 +1743,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/role_restricted/mimery
name = "Guide to Advanced Mimery Series"
- desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
+ desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. \
+ Obviously only works for Mimes."
cost = 12
item = /obj/item/storage/box/syndie_kit/mimery
restricted_roles = list("Mime")
@@ -1694,7 +1759,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/role_restricted/pressure_mod
name = "Kinetic Accelerator Pressure Mod"
- desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
+ desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. \
+ Occupies 35% mod capacity."
item = /obj/item/borg/upgrade/modkit/indoors
cost = 5 //you need two for full damage, so total of 10 for maximum damage
limited_stock = 2 //you can't use more than two!
@@ -1702,7 +1768,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/role_restricted/kitchen_gun
name = "Kitchen Gun (TM)"
- desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!"
+ desc = "A revolutionary .45 caliber cleaning solution! Say goodbye to daily stains and dirty surfaces with Kitchen Gun (TM)! \
+ Just five shots from Kitchen Gun (TM), and it'll sparkle like new! Includes two extra ammunition clips!"
cost = 10
surplus = 40
restricted_roles = list("Cook", "Janitor")
@@ -1717,7 +1784,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/role_restricted/magillitis_serum
name = "Magillitis Serum Autoinjector"
- desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
+ desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \
+ Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas."
item = /obj/item/reagent_containers/hypospray/magillitis
cost = 15
restricted_roles = list("Geneticist", "Chief Medical Officer")
@@ -1767,7 +1835,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/badass/costumes/obvious_chameleon
name = "Broken Chameleon Kit"
- desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! Please note that this kit did NOT pass quality control."
+ desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
+ Please note that this kit did NOT pass quality control."
item = /obj/item/storage/box/syndie_kit/chameleon/broken
/datum/uplink_item/badass/costumes
@@ -1777,7 +1846,8 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/badass/costumes/centcom_official
name = "CentCom Official Costume"
- desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. Radio headset does not include key. No gun included."
+ desc = "Ask the crew to \"inspect\" their nuclear disk and weapons system, and then when they decline, pull out a fully automatic rifle and gun down the Captain. \
+ Radio headset does not include encryption key. No gun included."
item = /obj/item/storage/box/syndie_kit/centcom_costume
/datum/uplink_item/badass/costumes/clown
@@ -1785,10 +1855,10 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
desc = "Nothing is more terrifying than clowns with fully automatic weaponry."
item = /obj/item/storage/backpack/duffelbag/clown/syndie
-/datum/uplink_item/badass/durasteel_toolbox
- name = "Durasteel Toolbox"
+/datum/uplink_item/badass/plastitanium_toolbox
+ name = "Plastitanium Toolbox"
desc = "A very high impact toolbox. Excels at destroying stationary structures."
- item = /obj/item/storage/toolbox/durasteel
+ item = /obj/item/storage/toolbox/plastitanium
cost = 2 //18 damage on mobs, 50 on objects, 4.5 stam/hit
/datum/uplink_item/badass/balloon
diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm
index a5ba06e6fb..137242c547 100644
--- a/code/modules/vehicles/wheelchair.dm
+++ b/code/modules/vehicles/wheelchair.dm
@@ -45,7 +45,7 @@
var/datum/component/riding/D = GetComponent(/datum/component/riding)
//1.5 (movespeed as of this change) multiplied by 6.7 gets ABOUT 10 (rounded), the old constant for the wheelchair that gets divided by how many arms they have
//if that made no sense this simply makes the wheelchair speed change along with movement speed delay
- D.vehicle_move_delay = round(CONFIG_GET(number/movedelay/run_delay) * 6.7) / min(user.get_num_arms(), 2)
+ D.vehicle_move_delay = round((CONFIG_GET(number/movedelay/run_delay) * 4) / min(user.get_num_arms(), 2), world.tick_lag)
return ..()
/obj/vehicle/ridden/wheelchair/Moved()
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 735967440f..55cd0a196e 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -33,6 +33,9 @@
/obj/item/reagent_containers/food/drinks/beer = 6)
contraband = list(/obj/item/reagent_containers/food/drinks/mug/tea = 12,
/obj/item/reagent_containers/food/drinks/bottle/fernet = 5)
+ premium = list(/obj/item/reagent_containers/glass/bottle/ethanol = 4,
+ /obj/item/reagent_containers/food/drinks/bottle/champagne = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/trappist = 5)
product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
req_access = list(ACCESS_BAR)
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index f61c392ff7..3da3398aad 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -16,7 +16,8 @@
contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,
- /obj/item/reagent_containers/food/drinks/soda_cans/air = 1)
+ /obj/item/reagent_containers/food/drinks/soda_cans/air = 1,
+ /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1)
refill_canister = /obj/item/vending_refill/cola
/obj/item/vending_refill/cola
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm
index 33e839c039..749a3b7c2b 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/drinnerware.dm
@@ -11,6 +11,7 @@
/obj/item/clothing/suit/apron/chef = 2,
/obj/item/reagent_containers/food/condiment/pack/ketchup = 5,
/obj/item/reagent_containers/food/condiment/pack/hotsauce = 5,
+ /obj/item/reagent_containers/food/condiment/pack/astrotame = 5,
/obj/item/reagent_containers/food/condiment/saltshaker = 5,
/obj/item/reagent_containers/food/condiment/peppermill = 5,
/obj/item/reagent_containers/glass/bowl = 30)
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index 9aa11c7bfb..4594048256 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -23,6 +23,7 @@
/obj/item/seeds/lime = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
+ /obj/item/seeds/peanutseed = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
/obj/item/seeds/poppy = 3,
diff --git a/html/changelogs/AutoChangeLog-pr-8581.yml b/html/changelogs/AutoChangeLog-pr-8581.yml
new file mode 100644
index 0000000000..90433ecb88
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8581.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Reskinnable PDAs. A related game preference."
+ - refactor: "Refactoring the pda, pda painter, obj reskinning and chameleon pda a bit to support this feature."
+ - imageadd: "more PDA sprites and ported reskins."
diff --git a/html/changelogs/AutoChangeLog-pr-8632.yml b/html/changelogs/AutoChangeLog-pr-8632.yml
new file mode 100644
index 0000000000..b2f74869c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8632.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - rscadd: "Traitor codewords are now highlighted for traitors."
diff --git a/html/changelogs/AutoChangeLog-pr-8663.yml b/html/changelogs/AutoChangeLog-pr-8663.yml
new file mode 100644
index 0000000000..3f5aeacd3c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8663.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, and the PB&J sandwich.
+The peanuts contain a little bit of extractable cooking oil (similarly to soy beans) and can be microwaved or dried in a drying rack to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut butter, required to make those sandwiches."
diff --git a/html/changelogs/AutoChangeLog-pr-8681.yml b/html/changelogs/AutoChangeLog-pr-8681.yml
new file mode 100644
index 0000000000..1cd5f04124
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8681.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (Original PRs by Tortellini Tony and BuffEngineering)"
+delete-after: True
+changes:
+ - bugfix: "E-cigs will continue to display their setting after being emagged."
+ - bugfix: "Vapes now come out of the mouth.
+fix Fixes an E-cig initialize() runtime."
diff --git a/html/changelogs/AutoChangeLog-pr-8708.yml b/html/changelogs/AutoChangeLog-pr-8708.yml
new file mode 100644
index 0000000000..0929c2ee6c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8708.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - spellcheck: "Ironic"
diff --git a/html/changelogs/AutoChangeLog-pr-8709.yml b/html/changelogs/AutoChangeLog-pr-8709.yml
new file mode 100644
index 0000000000..4aa6fd9b1d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8709.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "A bunch of minor issues with xenobiology are no more!"
diff --git a/html/changelogs/AutoChangeLog-pr-8720.yml b/html/changelogs/AutoChangeLog-pr-8720.yml
new file mode 100644
index 0000000000..81684baeac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8720.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (Credits to Kmc2000 for the original PR)"
+delete-after: True
+changes:
+ - rscadd: "Porting in MRE boxes from Yogstation. But be careful, eating possibly expired MREs found in maintenance comes with an unrealistically large (actually small) chance of food poisoning. Otherwise just bail out and order actually safe-to-eat MREs from cargo for 2000 credits."
diff --git a/html/changelogs/AutoChangeLog-pr-8726.yml b/html/changelogs/AutoChangeLog-pr-8726.yml
new file mode 100644
index 0000000000..49da4299ce
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8726.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "Changed bible heal proc, halving the healed damage and increasing brain damage 5x in exchange for a much wider array of items to protect you from it."
diff --git a/html/changelogs/AutoChangeLog-pr-8727.yml b/html/changelogs/AutoChangeLog-pr-8727.yml
new file mode 100644
index 0000000000..b1ca5f0d51
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8727.yml
@@ -0,0 +1,5 @@
+author: "Ghommie (original PRs by Jujumatic and PKPenguin321, respectively)"
+delete-after: True
+changes:
+ - rscadd: "Minesweeper Arcade machines. The higher the difficulty setting, the better the prizes will be."
+ - rscadd: "Also keep your eye out for another new (and rare) arcade game!"
diff --git a/html/changelogs/AutoChangeLog-pr-8728.yml b/html/changelogs/AutoChangeLog-pr-8728.yml
new file mode 100644
index 0000000000..2e860e737f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8728.yml
@@ -0,0 +1,6 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - tweak: "Moved around some chems from emag list into upgrades."
+ - balance: "Added some fun chems to dispensers."
+ - bugfix: "Gave dispensers old tg functionality."
diff --git a/html/changelogs/AutoChangeLog-pr-8729.yml b/html/changelogs/AutoChangeLog-pr-8729.yml
new file mode 100644
index 0000000000..a72f624352
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8729.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by AffectedArc07)"
+delete-after: True
+changes:
+ - tweak: "Religion is now a globalvar instead of being a subsystem for some reason"
diff --git a/html/changelogs/AutoChangeLog-pr-8730.yml b/html/changelogs/AutoChangeLog-pr-8730.yml
new file mode 100644
index 0000000000..d0204f2830
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8730.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PRs by Tlaltecuhtli and nicbn)"
+delete-after: True
+changes:
+ - rscadd: "alt click to eject beakers from chem masters + chem dispensers + grinders + chem heaters"
+ - rscadd: "hit chem master + chem dispenser + chem heaters with a beaker and if its loaded with another it swaps em"
+ - rscadd: "All-In-One Blender UI uses a radial menu now. You can see the contents and reagents by examining."
diff --git a/html/changelogs/AutoChangeLog-pr-8731.yml b/html/changelogs/AutoChangeLog-pr-8731.yml
new file mode 100644
index 0000000000..0728c12124
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8731.yml
@@ -0,0 +1,9 @@
+author: "Ghommie (original PRs by nicbn and coiax)"
+delete-after: True
+changes:
+ - rscadd: "Microwave UI uses a radial menu now. You can see the contents by examining."
+ - rscadd: "Microwaves have a single wire accessible when open, the activation wire.
+When cut, the microwave will no longer function, when pulsed, the microwave
+will turn on."
+ - rscadd: "Stabilized dark purple extracts now cook items in your hands, rather than dropping
+the cooked item on the floor."
diff --git a/html/changelogs/AutoChangeLog-pr-8737.yml b/html/changelogs/AutoChangeLog-pr-8737.yml
new file mode 100644
index 0000000000..d8e868df33
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8737.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes CWC construct shells being visible as ghost role to latejoiners."
diff --git a/html/changelogs/AutoChangeLog-pr-8738.yml b/html/changelogs/AutoChangeLog-pr-8738.yml
new file mode 100644
index 0000000000..f0e48a77b5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8738.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by ShizCalev)"
+delete-after: True
+changes:
+ - bugfix: "Pineapple haters/lovers will get/no longer get pineapple pizzas respectively from infinite pizza boxes."
diff --git a/html/changelogs/AutoChangeLog-pr-8739.yml b/html/changelogs/AutoChangeLog-pr-8739.yml
new file mode 100644
index 0000000000..0c25a1a649
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8739.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "Leather, cardboard, bronze & bone golems!"
+ - rscadd: "Bone hurting juice and interactions with plasmamen, skeletons & bone golems!"
diff --git a/html/changelogs/AutoChangeLog-pr-8740.yml b/html/changelogs/AutoChangeLog-pr-8740.yml
new file mode 100644
index 0000000000..1966f34331
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8740.yml
@@ -0,0 +1,5 @@
+author: "Ghommie (original PR by Denton)"
+delete-after: True
+changes:
+ - tweak: "Nanotrasen has started shipping more types of bedsheets to its stations."
+ - rscadd: "Added in Runtime, Pirate and Gondola bedsheets. The second one can also be found in some pirate ships, while the last can be crafted from gondola hides."
diff --git a/html/changelogs/AutoChangeLog-pr-8741.yml b/html/changelogs/AutoChangeLog-pr-8741.yml
new file mode 100644
index 0000000000..be803933ae
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8741.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by AffectedArc07 and Shazbot)"
+delete-after: True
+changes:
+ - imageadd: "Added 8 new sock styles"
diff --git a/html/changelogs/AutoChangeLog-pr-8742.yml b/html/changelogs/AutoChangeLog-pr-8742.yml
new file mode 100644
index 0000000000..03428fc8d1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8742.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Donner item"
diff --git a/html/changelogs/AutoChangeLog-pr-8744.yml b/html/changelogs/AutoChangeLog-pr-8744.yml
new file mode 100644
index 0000000000..2979a4a842
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8744.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "atmos helmet visual bug"
diff --git a/html/changelogs/AutoChangeLog-pr-8745.yml b/html/changelogs/AutoChangeLog-pr-8745.yml
new file mode 100644
index 0000000000..6feaa2eadd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8745.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "Ported addition of new CAS cards."
+ - bugfix: "Ported a fix for CAS."
diff --git a/html/changelogs/AutoChangeLog-pr-8747.yml b/html/changelogs/AutoChangeLog-pr-8747.yml
new file mode 100644
index 0000000000..c8a4689c60
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8747.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Luna's Gauntlets"
diff --git a/html/changelogs/AutoChangeLog-pr-8750.yml b/html/changelogs/AutoChangeLog-pr-8750.yml
new file mode 100644
index 0000000000..a3ff5e8a91
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8750.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Fixes brain damage/trauma healing nanites so they actually work while there are only traumas."
diff --git a/html/changelogs/AutoChangeLog-pr-8753.yml b/html/changelogs/AutoChangeLog-pr-8753.yml
new file mode 100644
index 0000000000..04fd009e2f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8753.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "Ported the inability for non-station AI to interact with station z-level."
diff --git a/html/changelogs/AutoChangeLog-pr-8755.yml b/html/changelogs/AutoChangeLog-pr-8755.yml
new file mode 100644
index 0000000000..a1c4742802
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8755.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - tweak: "tweaked the Genital character creation layout to look better"
+ - bugfix: "fixed having balls/womb when you don't have the linked organ at character creation"
+ - bugfix: "fixed being able to squeeze semen directly from your balls. Probably."
diff --git a/html/changelogs/AutoChangeLog-pr-8756.yml b/html/changelogs/AutoChangeLog-pr-8756.yml
new file mode 100644
index 0000000000..8d78c6d5e8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8756.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "HoS mains can now peacefully sleep in their office."
diff --git a/html/changelogs/AutoChangeLog-pr-8760.yml b/html/changelogs/AutoChangeLog-pr-8760.yml
new file mode 100644
index 0000000000..78812c5c05
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8760.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "rebalanced lingy dingy powery gamey"
diff --git a/html/changelogs/AutoChangeLog-pr-8761.yml b/html/changelogs/AutoChangeLog-pr-8761.yml
new file mode 100644
index 0000000000..4ee792c3a6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8761.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "melee and block harm"
+ - bugfix: "sprites*"
diff --git a/html/changelogs/AutoChangeLog-pr-8762.yml b/html/changelogs/AutoChangeLog-pr-8762.yml
new file mode 100644
index 0000000000..e248589b1b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8762.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "new sprites for the flechette gun, its magazines and the toy ray gun"
diff --git a/html/changelogs/AutoChangeLog-pr-8764.yml b/html/changelogs/AutoChangeLog-pr-8764.yml
new file mode 100644
index 0000000000..ad5b82505a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8764.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "holster doing holster things"
diff --git a/html/changelogs/AutoChangeLog-pr-8765.yml b/html/changelogs/AutoChangeLog-pr-8765.yml
new file mode 100644
index 0000000000..2cac0773ad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8765.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "Merges the end-of-shift and its shuttle autocall announcements into one."
+ - bugfix: "Prevents the end-of-shift shuttle from being recalled (even if to no avail)."
diff --git a/html/changelogs/AutoChangeLog-pr-8766.yml b/html/changelogs/AutoChangeLog-pr-8766.yml
new file mode 100644
index 0000000000..33c2a47a71
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8766.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes being able to teleport papers to your location with TK."
diff --git a/html/changelogs/AutoChangeLog-pr-8767.yml b/html/changelogs/AutoChangeLog-pr-8767.yml
new file mode 100644
index 0000000000..ce01bf471b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8767.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed some monkey-code shenanigeans making items sometimes disappear from pickpocketing."
diff --git a/html/changelogs/AutoChangeLog-pr-8768.yml b/html/changelogs/AutoChangeLog-pr-8768.yml
new file mode 100644
index 0000000000..de8338b545
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8768.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "New sprites for the some pda cartridges."
diff --git a/html/changelogs/AutoChangeLog-pr-8773.yml b/html/changelogs/AutoChangeLog-pr-8773.yml
new file mode 100644
index 0000000000..6cc39f8184
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8773.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - tweak: "Podpeople now have customization options."
diff --git a/html/changelogs/AutoChangeLog-pr-8775.yml b/html/changelogs/AutoChangeLog-pr-8775.yml
new file mode 100644
index 0000000000..51e8a15b13
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8775.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "The crew monitor's entry for the Quartermaster will now appear bolded, while HoP's will be of the same color of the service/unknown/other jobs."
diff --git a/html/changelogs/AutoChangeLog-pr-8776.yml b/html/changelogs/AutoChangeLog-pr-8776.yml
new file mode 100644
index 0000000000..bd3d30677a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8776.yml
@@ -0,0 +1,11 @@
+author: "Ghommie (original PRs by ShizCalev, coiax and Tlaltecuhtli)"
+delete-after: True
+changes:
+ - bugfix: "Caks will no longer override the bonus reagents provided in a donut when frosting them."
+ - bugfix: "Caks can no longer create frosted frosted jelly donuts."
+ - bugfix: "Jelly donuts will no longer lose their vitamins when they're frosted."
+ - bugfix: "Fixed chaos donuts potentially doubling the amount of reagents added when microwaved with something else."
+ - bugfix: "Donuts now always contain 1 sprinkles as was stated on the wiki. Frosted donuts have a chance at adding an extra sprinkle."
+ - code_imp: "Improved the code for ensuring that security members enjoy donuts and security-themed alcoholic drinks."
+ - balance: "neurotoxin doesnt insta stun but gives you limb paralysis overtime and heart attacks if it stays in for too long and it is also alcholic"
+ - balance: "beepsky smash now summons imaginary beepskys that deal stamina damage instead of outright stunning"
diff --git a/html/changelogs/AutoChangeLog-pr-8778.yml b/html/changelogs/AutoChangeLog-pr-8778.yml
new file mode 100644
index 0000000000..1fa8446e6a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8778.yml
@@ -0,0 +1,16 @@
+author: "Ghommie (original PRs by carshalash, GranpaWalton, BebeYoshi & Hexmaniacosanna, Fire Chance, Ordonis, Krysonism and OnlineGirlfriend)"
+delete-after: True
+changes:
+ - tweak: "Reduced booze power of Mead, Red Mead, and Irish Cream."
+ - tweak: "Increased booze power of Grappa."
+ - rscadd: "Added a new premium drink to the soda machine called \"Grey Bull\" which gives temporary shock resistance"
+ - rscadd: "A new drink called Blank Paper was added to the bar menu, it was made by a mime and it represents a new start."
+ - rscadd: "Adds a variety of fine alcoholic beverages for discerning patrons of the bar: Wizz Fizz, Bug Spray, Champagne, Applejack, Jack Rose, Turbo, Old Timer, Rubberneck, Duplex, Trappist Beer, Blazaam and Planet Cracker!"
+ - rscadd: "Also more nonalcoholic drinks: Cream Soda, Lemonade and Red Queen."
+ - rscadd: "Packs of a novel artificial sweetener have been added to the kitchen vendor."
+ - rscadd: "Bottles of trappist beer and champagne are now available in the premium seection of the booze-o-mat."
+ - rscadd: "Juicing parsnips now yields parsnip juice."
+ - rscadd: "Maintenance peaches."
+ - bugfix: "Grape soda now cools you down like other sodas."
+ - tweak: "tweaked the Arnold Palmer recipe, it now uses lemonade."
+ - imageadd: "Added new drink, bottle, vomit and peach can sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-8779.yml b/html/changelogs/AutoChangeLog-pr-8779.yml
new file mode 100644
index 0000000000..b5e90f7ecb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8779.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "Roundstart carbon jetpacks now have full_speed FALSE."
diff --git a/html/changelogs/AutoChangeLog-pr-8781.yml b/html/changelogs/AutoChangeLog-pr-8781.yml
new file mode 100644
index 0000000000..12bd5ccdf0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8781.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - tweak: "Adds plasteel to medical and security techfabs."
diff --git a/html/changelogs/AutoChangeLog-pr-8783.yml b/html/changelogs/AutoChangeLog-pr-8783.yml
new file mode 100644
index 0000000000..5b283b9b21
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8783.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "emergency pods' storage will now properly work."
diff --git a/html/changelogs/AutoChangeLog-pr-8784.yml b/html/changelogs/AutoChangeLog-pr-8784.yml
new file mode 100644
index 0000000000..7d6d9d4739
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8784.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Donor item"
diff --git a/html/changelogs/AutoChangeLog-pr-8790.yml b/html/changelogs/AutoChangeLog-pr-8790.yml
new file mode 100644
index 0000000000..0c0e6cd116
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8790.yml
@@ -0,0 +1,6 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - rscadd: "It's now possible to forcefully eject the occupants of a dogborg's sleeper by using a crowbar on them. This action is instant."
+ - tweak: "Resist values for dogborg sleepers have been adjusted. The baseline has been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds."
+ - tweak: "It now takes 10 full seconds to insert people into your sleeper. This should hopefully give people some more room to breathe and react to a dogborg attempting to sleeper someone either for no reason or in a way that violates law 2."
diff --git a/html/changelogs/AutoChangeLog-pr-8793.yml b/html/changelogs/AutoChangeLog-pr-8793.yml
new file mode 100644
index 0000000000..82a113c94d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8793.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "The PDA skin preference will now properly save up."
+ - tweak: "Changed the default PDA icon var to match the default PDA skin preference."
diff --git a/html/changelogs/AutoChangeLog-pr-8794.yml b/html/changelogs/AutoChangeLog-pr-8794.yml
new file mode 100644
index 0000000000..612a3e655b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8794.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixing the `(pointless) badassary` category appearing between the `dangerous and conspicious` and `stealthy and inconspicious` categories."
+ - bugfix: "Combat gloves plus now properly use the combat gloves sprite."
diff --git a/html/changelogs/AutoChangeLog-pr-8797.yml b/html/changelogs/AutoChangeLog-pr-8797.yml
new file mode 100644
index 0000000000..40c7afc570
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8797.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542, original by @Tlaltecuhtli"
+delete-after: True
+changes:
+ - bugfix: "alt clicking the emitter now rotates it instead of only flipping"
diff --git a/html/changelogs/AutoChangeLog-pr-8798.yml b/html/changelogs/AutoChangeLog-pr-8798.yml
new file mode 100644
index 0000000000..367aadad80
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8798.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542, original by Arkatos"
+delete-after: True
+changes:
+ - rscadd: "Action buttons can now be dragged onto each other to swap places"
diff --git a/html/changelogs/AutoChangeLog-pr-8799.yml b/html/changelogs/AutoChangeLog-pr-8799.yml
new file mode 100644
index 0000000000..73d3f590ba
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8799.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Promiscuous Organs crate, pills to lewd crate and testicles to maints"
diff --git a/html/changelogs/AutoChangeLog-pr-8800.yml b/html/changelogs/AutoChangeLog-pr-8800.yml
new file mode 100644
index 0000000000..7b397ec23e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8800.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542, original by Skoglol"
+delete-after: True
+changes:
+ - rscadd: "Heaters/freezers now support ctrl clicking to turn on and alt clicking to min/max target temperature."
diff --git a/html/changelogs/AutoChangeLog-pr-8801.yml b/html/changelogs/AutoChangeLog-pr-8801.yml
new file mode 100644
index 0000000000..e1089f2f1d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8801.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542, original by NewSta"
+delete-after: True
+changes:
+ - tweak: "updated the miasma canister sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-8802.yml b/html/changelogs/AutoChangeLog-pr-8802.yml
new file mode 100644
index 0000000000..b97119c32d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8802.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PRs by ShizCalev, MrDoombringer, AnturK, bgobandit, 81Denton and actioninja)"
+delete-after: True
+changes:
+ - rscadd: "Failsafe codes for uplinks are now available for purchase."
+ - rscadd: "Nuke Ops now have the ability to purchase a usable RPG, the PML-9, as well as a couple different types of rockets for it. you can also suicide rocket jump with them!"
+ - spellcheck: "Improved Uplink item descriptions and formatting."
diff --git a/html/changelogs/AutoChangeLog-pr-8805.yml b/html/changelogs/AutoChangeLog-pr-8805.yml
new file mode 100644
index 0000000000..8abefd9ce2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8805.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "supply display are now properly on the wall"
diff --git a/html/changelogs/AutoChangeLog-pr-8819.yml b/html/changelogs/AutoChangeLog-pr-8819.yml
new file mode 100644
index 0000000000..0b750fccb6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8819.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "Added public autolathes to all maps."
diff --git a/html/changelogs/AutoChangeLog-pr-8820.yml b/html/changelogs/AutoChangeLog-pr-8820.yml
new file mode 100644
index 0000000000..3e83e29cc3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8820.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by variableundefined)"
+delete-after: True
+changes:
+ - bugfix: "Cancel button to assault pod destination selector."
diff --git a/html/changelogs/AutoChangeLog-pr-8821.yml b/html/changelogs/AutoChangeLog-pr-8821.yml
new file mode 100644
index 0000000000..f45caba949
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8821.yml
@@ -0,0 +1,7 @@
+author: "Ghommie (original PRs by ShizCalev)"
+delete-after: True
+changes:
+ - tweak: "Corgi collars can now be removed!"
+ - tweak: "Updated the corgi & parrot inventory panels to use the same formatting as other mobs"
+ - bugfix: "Fixed corgi inventory panels not closing properly."
+ - bugfix: "Fixed the parrot inventory panel not closing properly if you're not able to interact with it."
diff --git a/html/changelogs/AutoChangeLog-pr-8823.yml b/html/changelogs/AutoChangeLog-pr-8823.yml
new file mode 100644
index 0000000000..b334bfbd7e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8823.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (Original PR by tralezab)"
+delete-after: True
+changes:
+ - bugfix: "Fixes an issue with spontaneous appendicitis picking incompatible mob biotypes."
diff --git a/html/changelogs/AutoChangeLog-pr-8824.yml b/html/changelogs/AutoChangeLog-pr-8824.yml
new file mode 100644
index 0000000000..6a12573112
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8824.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by Mickyan)"
+delete-after: True
+changes:
+ - bugfix: "Fixed being unable to smother people using the damp rag"
diff --git a/html/changelogs/AutoChangeLog-pr-8825.yml b/html/changelogs/AutoChangeLog-pr-8825.yml
new file mode 100644
index 0000000000..a56be4e2ab
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8825.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PR by MrDoomBringer, AnturK and YPOQ)"
+delete-after: True
+changes:
+ - bugfix: "Explosions will no longer damage wizards in rod form, the supermatter monitoring radio and megafauna GPS."
+ - bugfix: "Supplypods no longer detonate their contents."
+ - bugfix: "Fixed silicon items (e.g. cyborg modules) being destroyed by explosion epicenters."
diff --git a/html/changelogs/AutoChangeLog-pr-8826.yml b/html/changelogs/AutoChangeLog-pr-8826.yml
new file mode 100644
index 0000000000..3f7520b84e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8826.yml
@@ -0,0 +1,9 @@
+author: "Ghommie (original PR by Skoglol)"
+delete-after: True
+changes:
+ - code_imp: "New helper proc for alt-click turf listing, bypasses any interaction overrides."
+ - code_imp: "Ghosts and revenants now use the new proc."
+ - bugfix: "Ghosts can no longer toggleopen sleepers, adjust skateboard speed or close laptops"
+ - bugfix: "Revenant can now alt-click turf to list contents."
+ - tweak: "Revenant now slightly less nosy, use shift click to examine."
+ - tweak: "Alt-clicking the same turf again no longer closes the turf listing tab."
diff --git a/html/changelogs/AutoChangeLog-pr-8827.yml b/html/changelogs/AutoChangeLog-pr-8827.yml
new file mode 100644
index 0000000000..e1aaadd698
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8827.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by ninjanomnom)"
+delete-after: True
+changes:
+ - bugfix: "Gaps between sounds in some looping sound effects should no longer happen as much under heavy server lag."
diff --git a/html/changelogs/AutoChangeLog-pr-8828.yml b/html/changelogs/AutoChangeLog-pr-8828.yml
new file mode 100644
index 0000000000..4278a14ae1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8828.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by Skoglol)"
+delete-after: True
+changes:
+ - bugfix: "Reduced ventcrawl lag greatly."
diff --git a/html/changelogs/AutoChangeLog-pr-8834.yml b/html/changelogs/AutoChangeLog-pr-8834.yml
new file mode 100644
index 0000000000..0b7a7b30c5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8834.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes the space ninja's energy netting."
diff --git a/html/changelogs/AutoChangeLog-pr-8835.yml b/html/changelogs/AutoChangeLog-pr-8835.yml
new file mode 100644
index 0000000000..cf646b879b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8835.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - tweak: "consistency in hop and cap berets"
diff --git a/html/changelogs/AutoChangeLog-pr-8841.yml b/html/changelogs/AutoChangeLog-pr-8841.yml
new file mode 100644
index 0000000000..8bb73dac26
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8841.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Adding one pAI to the wizard shuttle and ERT prep room"
diff --git a/html/changelogs/AutoChangeLog-pr-8844.yml b/html/changelogs/AutoChangeLog-pr-8844.yml
new file mode 100644
index 0000000000..05f0f2fb22
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8844.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes the rocket launcher being unreloadable."
+ - balance: "Buffed its accuracy a bit."
+ - tweak: "Replaced the grenade launcher emagged minesweeper loot with the rocket launcher like it was originally supposed to be."
diff --git a/html/changelogs/AutoChangeLog-pr-8858.yml b/html/changelogs/AutoChangeLog-pr-8858.yml
new file mode 100644
index 0000000000..6fc057f88d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8858.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Made unholy water healtoxinlover"
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index dce76f58b5..6a1a35f326 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
index 128a3b243c..089c0ff3f8 100644
Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ
diff --git a/icons/misc/minesweeper_tiles/eight.png b/icons/misc/minesweeper_tiles/eight.png
new file mode 100644
index 0000000000..3a5c4179ef
Binary files /dev/null and b/icons/misc/minesweeper_tiles/eight.png differ
diff --git a/icons/misc/minesweeper_tiles/empty.png b/icons/misc/minesweeper_tiles/empty.png
new file mode 100644
index 0000000000..8a4fb536bb
Binary files /dev/null and b/icons/misc/minesweeper_tiles/empty.png differ
diff --git a/icons/misc/minesweeper_tiles/five.png b/icons/misc/minesweeper_tiles/five.png
new file mode 100644
index 0000000000..dacf837f9b
Binary files /dev/null and b/icons/misc/minesweeper_tiles/five.png differ
diff --git a/icons/misc/minesweeper_tiles/flag.png b/icons/misc/minesweeper_tiles/flag.png
new file mode 100644
index 0000000000..e71d8685ed
Binary files /dev/null and b/icons/misc/minesweeper_tiles/flag.png differ
diff --git a/icons/misc/minesweeper_tiles/four.png b/icons/misc/minesweeper_tiles/four.png
new file mode 100644
index 0000000000..17a2bdfeb4
Binary files /dev/null and b/icons/misc/minesweeper_tiles/four.png differ
diff --git a/icons/misc/minesweeper_tiles/hidden.png b/icons/misc/minesweeper_tiles/hidden.png
new file mode 100644
index 0000000000..8d34a2a7f3
Binary files /dev/null and b/icons/misc/minesweeper_tiles/hidden.png differ
diff --git a/icons/misc/minesweeper_tiles/mine.png b/icons/misc/minesweeper_tiles/mine.png
new file mode 100644
index 0000000000..e16c89c2a8
Binary files /dev/null and b/icons/misc/minesweeper_tiles/mine.png differ
diff --git a/icons/misc/minesweeper_tiles/minehit.png b/icons/misc/minesweeper_tiles/minehit.png
new file mode 100644
index 0000000000..f0c9699d97
Binary files /dev/null and b/icons/misc/minesweeper_tiles/minehit.png differ
diff --git a/icons/misc/minesweeper_tiles/one.png b/icons/misc/minesweeper_tiles/one.png
new file mode 100644
index 0000000000..a84e6010a3
Binary files /dev/null and b/icons/misc/minesweeper_tiles/one.png differ
diff --git a/icons/misc/minesweeper_tiles/seven.png b/icons/misc/minesweeper_tiles/seven.png
new file mode 100644
index 0000000000..10d71c427e
Binary files /dev/null and b/icons/misc/minesweeper_tiles/seven.png differ
diff --git a/icons/misc/minesweeper_tiles/six.png b/icons/misc/minesweeper_tiles/six.png
new file mode 100644
index 0000000000..fe2ba800f4
Binary files /dev/null and b/icons/misc/minesweeper_tiles/six.png differ
diff --git a/icons/misc/minesweeper_tiles/three.png b/icons/misc/minesweeper_tiles/three.png
new file mode 100644
index 0000000000..1c128d88ee
Binary files /dev/null and b/icons/misc/minesweeper_tiles/three.png differ
diff --git a/icons/misc/minesweeper_tiles/two.png b/icons/misc/minesweeper_tiles/two.png
new file mode 100644
index 0000000000..ff74af5c82
Binary files /dev/null and b/icons/misc/minesweeper_tiles/two.png differ
diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi
index dd8a6fb869..30927d3608 100644
Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index 5f6cfe5234..d974d0ca6c 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index f49a27fda4..3bb3874d35 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi
index e9d0dd0d2b..3f29410f98 100644
Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi
index dda17156fe..2c3f291e43 100644
Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index fbfa039451..5f0b665ff4 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi
index 3463065bc7..5eb270d23f 100644
Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index b3b2f7703c..42c32f134a 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index 25e7d2c6d0..5e6725cec7 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 24ede3c513..6282e555fa 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index 9a51635b81..ee42e95dd2 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi
index 73dcad452b..1cc99e09e9 100644
Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 2970de757b..568adb69b3 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index f9660c6b38..eb4f5813c8 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index a32d0234d6..dc3aca6b19 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi
index c40dfaaa22..cd7fc1742b 100644
Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index c348fb4f8f..f64dfd4740 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 9861a2e618..92b5203f5d 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi
index 9fc1520175..63cf069186 100644
Binary files a/icons/obj/hydroponics/growing_vegetables.dmi and b/icons/obj/hydroponics/growing_vegetables.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 054aa47bbd..a1ab5b08e5 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 4c898aecd3..5a2088c332 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 241bb46b98..7d184c6459 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/pda_alt.dmi b/icons/obj/pda_alt.dmi
new file mode 100644
index 0000000000..4f03d2c574
Binary files /dev/null and b/icons/obj/pda_alt.dmi differ
diff --git a/icons/obj/pda_modern.dmi b/icons/obj/pda_modern.dmi
new file mode 100644
index 0000000000..26c3b9ce16
Binary files /dev/null and b/icons/obj/pda_modern.dmi differ
diff --git a/icons/obj/pda_rugged.dmi b/icons/obj/pda_rugged.dmi
new file mode 100644
index 0000000000..84c8ffd1f9
Binary files /dev/null and b/icons/obj/pda_rugged.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index bff1b631c3..ad1d34836d 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 9467e8f818..9037bfc0d0 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/modular_citadel/code/controllers/subsystem/shuttle.dm b/modular_citadel/code/controllers/subsystem/shuttle.dm
index bb4592f819..ce3f062bdd 100644
--- a/modular_citadel/code/controllers/subsystem/shuttle.dm
+++ b/modular_citadel/code/controllers/subsystem/shuttle.dm
@@ -1,6 +1,7 @@
-/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 3 hours has passed.
- if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //3 hours
- SSshuttle.emergency.request()
- priority_announce("The shift has come to an end and the shuttle called.")
+/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 2 hours have passed.
+ if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //2 hours
+ SSshuttle.emergency.request(silent = TRUE)
+ priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, 'sound/ai/shuttlecalled.ogg', "Priority")
log_game("Round time limit reached. Shuttle has been auto-called.")
message_admins("Round time limit reached. Shuttle called.")
+ emergencyNoRecall = TRUE
diff --git a/modular_citadel/code/game/objects/items/devices/PDA/PDA.dm b/modular_citadel/code/game/objects/items/devices/PDA/PDA.dm
deleted file mode 100644
index d26cf28778..0000000000
--- a/modular_citadel/code/game/objects/items/devices/PDA/PDA.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-//Overrides TG's PDA sprites with Cit's PDA sprites. Remind me to turn this into a pref somewhere down the line.
-
-/obj/item/pda
- icon = 'modular_citadel/icons/obj/pda.dmi'
diff --git a/modular_citadel/code/game/objects/items/holy_weapons.dm b/modular_citadel/code/game/objects/items/holy_weapons.dm
index 204a27f3fa..3ecc6cc31b 100644
--- a/modular_citadel/code/game/objects/items/holy_weapons.dm
+++ b/modular_citadel/code/game/objects/items/holy_weapons.dm
@@ -11,8 +11,8 @@
/obj/item/nullrod/rosary/Initialize()
.=..()
- if(SSreligion.religion)
- deity_name = SSreligion.deity
+ if(GLOB.religion)
+ deity_name = GLOB.deity
/obj/item/nullrod/rosary/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M))
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 0b86d58208..1e6b4d62d4 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -11,7 +11,7 @@
var/sack_size = BALLS_SACK_SIZE_DEF
fluid_id = "semen"
producing = TRUE
- can_masturbate_with = TRUE
+ can_masturbate_with = FALSE
masturbation_verb = "massage"
can_climax = TRUE
var/sent_full_message = TRUE //defaults to 1 since they're full to start
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index d8168d01a6..347f1fffea 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -404,3 +404,34 @@ datum/gear/darksabresheath
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/commjacket
ckeywhitelist = list("sadisticbatter")
+
+/datum/gear/mw2_russian_para
+ name = "Russian Paratrooper Jumper"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/mw2_russian_para
+ ckeywhitelist = list("investigator77")
+
+/datum/gear/longblackgloves
+ name = "Luna's Gauntlets"
+ category = SLOT_GLOVES
+ path = /obj/item/clothing/gloves/longblackgloves
+ ckeywhitelist = list("bigmanclancy")
+
+/datum/gear/trendy_fit
+ name = "Trendy Fit"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/trendy_fit
+ ckeywhitelist = list("midgetdragon")
+
+/datum/gear/singery
+ name = "Yellow Performer Outfit"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/singery
+ ckeywhitelist = list("maxlynchy")
+
+/datum/gear/csheet
+ name = "NT Bedsheet"
+ category = SLOT_NECK
+ path = /obj/item/bedsheet/captain
+ ckeywhitelist = list("tikibomb")
+
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 0338a4f48e..4fd628f9d3 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -417,7 +417,6 @@
icon_state = "flagcape"
item_state = "flagcape"
-
/obj/item/clothing/shoes/lucky
name = "Lucky Jackboots"
icon = 'icons/obj/custom.dmi'
@@ -504,4 +503,28 @@
alternate_worn_icon = 'icons/mob/custom_w.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
+/obj/item/clothing/suit/mw2_russian_para
+ name = "Russian Paratrooper Jumper"
+ desc = "A Russian made old paratrooper jumpsuit, has many pockets for easy storage of gear from a by gone era. As bulky as it looks, its shockingly light!"
+ icon_state = "mw2_russian_para"
+ item_state = "mw2_russian_para"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+/obj/item/clothing/gloves/longblackgloves
+ name = "Luna's Gauntlets"
+ desc = "These gloves seem to have a coating of slime fluid on them, you should possibly return them to their rightful owner."
+ icon_state = "longblackgloves"
+ item_state = "longblackgloves"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+
+/obj/item/clothing/under/trendy_fit
+ name = "Trendy Fitting Clothing"
+ desc = "An outfit straight from the boredom of space, its the type of thing only someone trying to entertain themselves on the way to their next destination would wear."
+ icon_state = "trendy_fit"
+ item_state = "trendy_fit"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm b/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
index 2bfd63a25d..78e18fdb5e 100644
--- a/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
+++ b/modular_citadel/code/modules/mob/living/simple_animal/simplemob_vore_values.dm
@@ -41,6 +41,10 @@
devourable = TRUE
digestable = TRUE
+/mob/living/simple_animal/kiwi
+ devourable = TRUE
+ digestable = TRUE
+
//STATION PETS
/mob/living/simple_animal/pet
devourable = TRUE
@@ -65,7 +69,6 @@
/mob/living/simple_animal/sloth
devourable = TRUE
digestable = TRUE
- feeding = TRUE
/mob/living/simple_animal/parrot
devourable = TRUE
@@ -84,57 +87,48 @@
/mob/living/simple_animal/hostile/lizard
devourable = TRUE
digestable = TRUE
+ feeding = TRUE
+ vore_active = TRUE
+ isPredator = TRUE
+ vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/alien
- devourable = TRUE
- digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/bear
- devourable = TRUE
- digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/poison/giant_spider
- devourable = TRUE
- digestable = TRUE
feeding = TRUE
vore_active = TRUE
+ isPredator = TRUE
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/retaliate/poison/snake
- devourable = TRUE
- digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/gorilla
- devourable = TRUE
- digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/asteroid/goliath
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
+ feeding = TRUE //for pet Goliaths I guess or something.
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_DIGEST
/mob/living/simple_animal/hostile/carp
- devourable = TRUE
- digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
diff --git a/modular_citadel/code/modules/projectiles/gun.dm b/modular_citadel/code/modules/projectiles/gun.dm
index ea8af7c74c..317f68b4c4 100644
--- a/modular_citadel/code/modules/projectiles/gun.dm
+++ b/modular_citadel/code/modules/projectiles/gun.dm
@@ -9,13 +9,3 @@
return 0
else
return ..()
-
-/obj/item/gun/proc/getinaccuracy(mob/living/user)
- if(!iscarbon(user))
- return 0
- else
- var/mob/living/carbon/holdingdude = user
- if(istype(holdingdude) && holdingdude.combatmode)
- return max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0)
- else
- return weapon_weight * 25
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
index a58a7fc825..4b7972d0a7 100755
--- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
@@ -16,6 +16,7 @@
"purple hypovial" = "hypovial-p",
"black hypovial" = "hypovial-t"
)
+ always_reskinnable = TRUE
/obj/item/reagent_containers/glass/bottle/vial/Initialize()
. = ..()
@@ -29,17 +30,6 @@
/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change()
update_icon()
-/obj/item/reagent_containers/glass/bottle/vial/reskin_obj(mob/M) //Makes the vials completely reskinnable, and renames them - overrides /obj/proc/reskin_obj
- if(!LAZYLEN(unique_reskin))
- return
- var/choice = input(M,"Do you wish to recolour your [src]?","Vial Recolour") as null|anything in unique_reskin
- if(!QDELETED(src) && choice && !current_skin && !M.incapacitated() && in_range(M,src))
- if(!unique_reskin[choice])
- return
- icon_state = unique_reskin[choice]
- name = choice
- to_chat(M, "[src] is now skinned as '[choice].'")
-
/obj/item/reagent_containers/glass/bottle/vial/update_icon()
cut_overlays()
if(reagents.total_volume)
diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dm
index e561b106d8..c0ddaceaf7 100644
--- a/modular_citadel/code/modules/research/techweb/all_nodes.dm
+++ b/modular_citadel/code/modules/research/techweb/all_nodes.dm
@@ -19,7 +19,7 @@
display_name = "Games and Toys"
description = "For the slackers on the station."
prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
+ design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
export_price = 5000
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi
index a96f18c3ce..e321f8ae47 100644
Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ
diff --git a/modular_citadel/icons/obj/guns/cit_guns.dmi b/modular_citadel/icons/obj/guns/cit_guns.dmi
index 8154a753e0..cc04fbcb14 100644
Binary files a/modular_citadel/icons/obj/guns/cit_guns.dmi and b/modular_citadel/icons/obj/guns/cit_guns.dmi differ
diff --git a/modular_citadel/icons/obj/pda.dmi b/modular_citadel/icons/obj/pda.dmi
deleted file mode 100644
index 5404b908c6..0000000000
Binary files a/modular_citadel/icons/obj/pda.dmi and /dev/null differ
diff --git a/sound/arcade/minesweeper_boardpress.ogg b/sound/arcade/minesweeper_boardpress.ogg
new file mode 100644
index 0000000000..a928a7498d
Binary files /dev/null and b/sound/arcade/minesweeper_boardpress.ogg differ
diff --git a/sound/arcade/minesweeper_emag1.ogg b/sound/arcade/minesweeper_emag1.ogg
new file mode 100644
index 0000000000..4601f8df89
Binary files /dev/null and b/sound/arcade/minesweeper_emag1.ogg differ
diff --git a/sound/arcade/minesweeper_emag2.ogg b/sound/arcade/minesweeper_emag2.ogg
new file mode 100644
index 0000000000..84cb5c2e25
Binary files /dev/null and b/sound/arcade/minesweeper_emag2.ogg differ
diff --git a/sound/arcade/minesweeper_explosion1.ogg b/sound/arcade/minesweeper_explosion1.ogg
new file mode 100644
index 0000000000..f8272722fd
Binary files /dev/null and b/sound/arcade/minesweeper_explosion1.ogg differ
diff --git a/sound/arcade/minesweeper_explosion2.ogg b/sound/arcade/minesweeper_explosion2.ogg
new file mode 100644
index 0000000000..aabd43851d
Binary files /dev/null and b/sound/arcade/minesweeper_explosion2.ogg differ
diff --git a/sound/arcade/minesweeper_explosion3.ogg b/sound/arcade/minesweeper_explosion3.ogg
new file mode 100644
index 0000000000..22aa309d9d
Binary files /dev/null and b/sound/arcade/minesweeper_explosion3.ogg differ
diff --git a/sound/arcade/minesweeper_menuselect.ogg b/sound/arcade/minesweeper_menuselect.ogg
new file mode 100644
index 0000000000..b9e0b765dc
Binary files /dev/null and b/sound/arcade/minesweeper_menuselect.ogg differ
diff --git a/sound/arcade/minesweeper_startup.ogg b/sound/arcade/minesweeper_startup.ogg
new file mode 100644
index 0000000000..c51d473d60
Binary files /dev/null and b/sound/arcade/minesweeper_startup.ogg differ
diff --git a/sound/arcade/minesweeper_win.ogg b/sound/arcade/minesweeper_win.ogg
new file mode 100644
index 0000000000..214f1925b0
Binary files /dev/null and b/sound/arcade/minesweeper_win.ogg differ
diff --git a/sound/arcade/minesweeper_winfail.ogg b/sound/arcade/minesweeper_winfail.ogg
new file mode 100644
index 0000000000..878f153063
Binary files /dev/null and b/sound/arcade/minesweeper_winfail.ogg differ
diff --git a/sound/effects/gong.ogg b/sound/effects/gong.ogg
new file mode 100644
index 0000000000..4d12f5d0d2
Binary files /dev/null and b/sound/effects/gong.ogg differ
diff --git a/sound/magic/RATTLEMEBONES.ogg b/sound/magic/RATTLEMEBONES.ogg
new file mode 100644
index 0000000000..d42cf51253
Binary files /dev/null and b/sound/magic/RATTLEMEBONES.ogg differ
diff --git a/sound/magic/RATTLEMEBONES2.ogg b/sound/magic/RATTLEMEBONES2.ogg
new file mode 100644
index 0000000000..7265a06aab
Binary files /dev/null and b/sound/magic/RATTLEMEBONES2.ogg differ
diff --git a/sound/vehicles/rocketlaunch.ogg b/sound/vehicles/rocketlaunch.ogg
new file mode 100644
index 0000000000..d0ee9c7248
Binary files /dev/null and b/sound/vehicles/rocketlaunch.ogg differ
diff --git a/sound/weapons/whipgrab.ogg b/sound/weapons/whipgrab.ogg
new file mode 100644
index 0000000000..3b17632056
Binary files /dev/null and b/sound/weapons/whipgrab.ogg differ
diff --git a/strings/cas_black.txt b/strings/cas_black.txt
index b63e33cdf2..734222d1fd 100644
--- a/strings/cas_black.txt
+++ b/strings/cas_black.txt
@@ -1,13 +1,13 @@
Today, Security killed ____.
Security, the clown's breaking into ____.
-The Chaplain is worshiping the Church of _____.
+Our last Chaplain believed in nothing but _____.
What angered the gods this time?
Why didn't engineering set up the singularity?
What does the traitor steal this time?
Cargo: There's a galaxy-wide shortage of _______.
I don't care what they called me back on the station, I'm not a traitor. I'm a man of _________.
The Syndicate is offering crew members _________ to defect.
-Cargo ordered a crate full of _____.
+What is Nanotrasen's highest-priority bounty?
What is the gray tide protesting this time?
If the Space Gods didn't want _________ they wouldn't have given us __________.
Why was the death squad sent in?
@@ -30,11 +30,10 @@ What made the nuclear operatives fluke?
Why did the Chief Engineer disable comms?
Every spaceman receives an internals box and ________.
What brought the space orgy to a grinding halt?
-Scientists are no longer allowed to make _____.
+Scientists are no longer allowed to make ______.
What was the clown's best joke?
The HoP is now hiring assistants for __________.
What happens when you emag an emag?
-Our gang doesn't wear uniforms. Our gang wears ___________.
No matter how many lizards you have, _____ is never acceptable.
No, the AI's second law is NOT to serve _____.
First CentCom came for the ________. Now they're coming for the __________.
@@ -109,5 +108,12 @@ The auxiliary base was disabled after landing in the middle of _______.
Xenobiologists have found slimes to be exceptionally responsive to _______.
Why did the captain give me a medal?
The curator's new exhibit is devoted solely to _________.
-There's no ______ on the new escape shuttle, but there is plenty of _________!
-What made me sell my soul to the devil?
\ No newline at end of file
+What made me sell my soul to the devil?
+The engineers are testing an experimental supermatter setup involving _________.
+I'm __________ in the streets, __________ in the sheets.
+What's my family heirloom?
+The Lawyer was fired for messaging the entire station a picture of ___________.
+On Lavaland, it is rumored that ashwalkers roam, worshipping _________.
+How did the traitor die a glorious death?
+Nanotrasen's new state-of-the-art emergency shuttle was repurposed from _________ and _________.
+What caused my brain trauma?
\ No newline at end of file
diff --git a/strings/cas_white.txt b/strings/cas_white.txt
index 8cf224d1db..3e229862a2 100644
--- a/strings/cas_white.txt
+++ b/strings/cas_white.txt
@@ -2,6 +2,7 @@ Those motherfucking carp.
Having sex in the maintenance tunnels.
Space 'Nam.
Space lesbians.
+Space NEETs.
Space Hitler.
Space Asshole.
Ragin' mages.
@@ -57,7 +58,6 @@ Defusing a syndicate bomb with another bomb.
Going braindead mid-murder.
A petsplosion.
Meat spikes.
-Collecting the crew's brains.
Lopping off the Captain's johnson and shooting it out a pneumatic cannon.
The secret monkey technique.
Putting the pAI's doorjack where it don't belong.
@@ -84,7 +84,6 @@ Paranoia.
Putting the boots to him, medium style.
ERP-seeking meteors.
Paperwork HoPs.
-A sexy clown.
Rampant vending machines.
The prisoner transfer center.
Nations.
@@ -186,7 +185,6 @@ A big, black shadowling dick.
Emagging.
Dead lizard storage.
Dermal armor.
-Energy balls.
Fisting somebody until they gib.
Alternate uses for defibrillator paddles.
Breaking spacetime with thousands of bluespace tomatoes.
@@ -197,7 +195,7 @@ Plasmaman strippers.
A Quartermaster who WON'T STOP ordering guns.
Space lag.
Polishing the captain's laser rifle.
-That one asshole double agent.
+That one asshole nuke op.
A surprise visit from Nanotrasen's CEO.
The bleeding, dismembered, beautiful corpse of the clown.
A glass of ...what?
@@ -220,20 +218,18 @@ Welderbombing.
Validhunting.
Nar'Sie making love to Lord Singulo.
Fun.
-Crashing the stock market.
HONK!
-Enough morphine to put the entire station down.
+Enough morphine to make the entire station comatose.
A defective comdom.
Cleanbot.
A beaker of dried space carp penis.
An Ian storm.
-voxtest2.
Nuking it from orbit.
My senpAI.
Harmbatonning.
A Nanotrasen D-Notice.
TALKING MIMES.
-The lusty xenomorph maid,
+The lusty xenomorph maid.
Using assistants as human shields.
Sentient securitrons.
Piloting the station into the nearest sun.
@@ -247,11 +243,11 @@ Medbay stutterwhores.
The scrubbers uncontrollably spewing cum.
The lawyer's job.
Emoting slowly drawing a gun, then slowly cocking the trigger, then slowly preparing to shoot...
-NAR-SIE HAS RISEN.
+NAR'SIE HAS RISEN.
Pierrot's Throat.
A clown bomb.
Space bees?
-The entire engineering team having unprotected group sex.
+Driving the clown car full speed into the engine.
IC in OOC.
The best cookie.
The wizard with his staff inserted into his anus.
@@ -276,9 +272,8 @@ Draconic.
Riding borgs, cowgirl style.
The Voice of God.
Overpowered stuns.
-Unironically reading library smut.
+Unironically enjoying library smut.
Spiritual journeys with BZ.
-Freon.
Deep-fried body parts.
Suit sensor unit gas chambers.
Moonlighting.
@@ -294,4 +289,14 @@ Mindswap.
Potassium in the toilet bowls.
Giving head to the heads.
A lizard wearing cat ears.
-DOOR STUCK!!
+Precious clown gold.
+Dabbing on a pile of corpses.
+Tactical chairs.
+The sweet, forbidden meat of the gondola.
+Turning tricks for holocredits.
+A captain that doesn't secure the disk.
+A positive moodlet.
+A sexy clown.
+Razoring the wings off the moths.
+Wiring the ethereals into the powernet.
+Well-aged miasma.
\ No newline at end of file
diff --git a/strings/traumas.json b/strings/traumas.json
index f83a023491..81b4fbe902 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -132,7 +132,8 @@
"ahelp help security powergaming with mindshields???",
";,g absorbing @pick(roles)",
";chemist can u @pick(create_verbs) holy @pick(mellens) for @pick(s_roles)???!!",
- "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!"
+ "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!",
+ "@pick(semicolon)POST REBOOT MESSAGE LOLOL FUCK FUCK FUCK YOU"
],
"mutations": [
@@ -295,4 +296,4 @@
"bluh daymon",
"wizzerd"
]
-}
\ No newline at end of file
+}
diff --git a/tgstation.dme b/tgstation.dme
index 31169e9f1b..72a4d7cba1 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -256,7 +256,6 @@
#include "code\controllers\subsystem\ping.dm"
#include "code\controllers\subsystem\radiation.dm"
#include "code\controllers\subsystem\radio.dm"
-#include "code\controllers\subsystem\religion.dm"
#include "code\controllers\subsystem\research.dm"
#include "code\controllers\subsystem\server_maint.dm"
#include "code\controllers\subsystem\shuttle.dm"
@@ -445,8 +444,8 @@
#include "code\datums\helper_datums\icon_snapshot.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
+#include "code\datums\looping_sounds\_looping_sound.dm"
#include "code\datums\looping_sounds\item_sounds.dm"
-#include "code\datums\looping_sounds\looping_sound.dm"
#include "code\datums\looping_sounds\machinery_sounds.dm"
#include "code\datums\looping_sounds\weather.dm"
#include "code\datums\martial\boxing.dm"
@@ -495,6 +494,7 @@
#include "code\datums\wires\autolathe.dm"
#include "code\datums\wires\emitter.dm"
#include "code\datums\wires\explosive.dm"
+#include "code\datums\wires\microwave.dm"
#include "code\datums\wires\mulebot.dm"
#include "code\datums\wires\particle_accelerator.dm"
#include "code\datums\wires\r_n_d.dm"
@@ -639,6 +639,10 @@
#include "code\game\machinery\computer\station_alert.dm"
#include "code\game\machinery\computer\telecrystalconsoles.dm"
#include "code\game\machinery\computer\teleporter.dm"
+#include "code\game\machinery\computer\arcade\battle.dm"
+#include "code\game\machinery\computer\arcade\minesweeper.dm"
+#include "code\game\machinery\computer\arcade\misc_arcade.dm"
+#include "code\game\machinery\computer\arcade\orion_trail.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
#include "code\game\machinery\doors\airlock_types.dm"
@@ -1715,6 +1719,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peanuts.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
#include "code\modules\hydroponics\grown\pumpkin.dm"
@@ -2882,7 +2887,6 @@
#include "modular_citadel\code\game\objects\items\vending_items.dm"
#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm"
#include "modular_citadel\code\game\objects\items\devices\aicard.dm"
-#include "modular_citadel\code\game\objects\items\devices\PDA\PDA.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"