The Cult's Master, [owner], has fallen in the [A]!")
-
-
+ to_chat(M, "The Cult's Master, [owner], has fallen in \the [A]!")
+
/datum/status_effect/cult_master/tick()
if(owner.stat != DEAD && !alive)
alive = TRUE
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 08d51be262..5fe037042f 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -17,7 +17,7 @@
B.leave_victim()
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(0)
+ C.vomit(0, toxic = TRUE)
to_chat(user, "A parasite exits our form.")
var/list/bad_organs = list(
user.getorgan(/obj/item/organ/body_egg),
@@ -31,7 +31,7 @@
O.Remove(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(0)
+ C.vomit(0, toxic = TRUE)
O.forceMove(get_turf(user))
user.reagents.add_reagent("mutadone", 10)
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm b/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm
index 3862791f8c..5faf3ee832 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/scripture_checks.dm
@@ -64,5 +64,5 @@
/proc/change_construction_value(amount)
GLOB.clockwork_construction_value += amount
-/proc/can_recite_scripture(mob/living/L)
- return (is_servant_of_ratvar(L) && L.stat == CONSCIOUS && L.can_speak_vocal() && (GLOB.ratvar_awakens || (ishuman(L) || issilicon(L))))
+/proc/can_recite_scripture(mob/living/L, can_potentially)
+ return (is_servant_of_ratvar(L) && (can_potentially || (L.stat == CONSCIOUS && L.can_speak_vocal())) && (GLOB.ratvar_awakens || (ishuman(L) || issilicon(L))))
diff --git a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm
index 7550aea74f..f30483a6af 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clock_components.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clock_components.dm
@@ -69,7 +69,7 @@
/obj/item/clockwork/component/vanguard_cogwheel/onyx_prism
name = "onyx prism"
desc = "An onyx prism with a small aperture. It's very heavy."
- clockwork_desc = "A broken prism from a mending motor. Serviceable as a substitute for a vanguard cogwheel."
+ clockwork_desc = "A broken prism from a prolonging prism. Serviceable as a substitute for a vanguard cogwheel."
icon_state = "onyx_prism"
cultist_message = "The prism grows painfully hot in your hands."
servant_of_ratvar_messages = list("The prism isn't getting any lighter." = FALSE, "\"So... you haven't failed yet. Have hope, child.\"" = TRUE, \
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm
index 3b0c220b87..13cb65f081 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm
@@ -37,7 +37,7 @@
user.visible_message("As [user] puts [src] on, it flickers off their head!", "The helmet flickers off your head, leaving only nausea!")
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(20, 1, 1, 0, 1)
+ C.vomit(20)
else
to_chat(user, "\"Do you have a hole in your head? You're about to.\"")
to_chat(user, "The helmet tries to drive a spike through your head as you scramble to remove it!")
@@ -98,7 +98,7 @@
user.visible_message("As [user] puts [src] on, it flickers off their body!", "The curiass flickers off your body, leaving only nausea!")
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(20, 1, 1, 0, 1)
+ C.vomit(20)
else
to_chat(user, "\"I think this armor is too hot for you to handle.\"")
to_chat(user, "The curiass emits a burst of flame as you scramble to get it off!")
@@ -159,7 +159,7 @@
user.visible_message("As [user] puts [src] on, it flickers off their arms!", "The gauntlets flicker off your arms, leaving only nausea!")
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(10, 1, 1, 0, 1)
+ C.vomit()
else
to_chat(user, "\"Did you like having arms?\"")
to_chat(user, "The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!")
@@ -209,7 +209,7 @@
user.visible_message("As [user] puts [src] on, it flickers off their feet!", "The treads flicker off your feet, leaving only nausea!")
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.vomit(10, 1, 1, 0, 1)
+ C.vomit()
else
to_chat(user, "\"Let's see if you can dance with these.\"")
to_chat(user, "The treads turn searing hot as you scramble to get them off!")
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
index c3e40692c2..5844b69413 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
@@ -214,6 +214,38 @@
quickbind_desc = "Creates an Interdiction Lens, which drains power into nearby Sigils of Transmission."
+//Prolonging Prism: Creates a prism that will delay the shuttle at a power cost
+/datum/clockwork_scripture/create_object/prolonging_prism
+ descname = "Powered Structure, Delay Emergency Shuttles"
+ name = "Prolonging Prism"
+ desc = "Creates a mechanized prism which will delay the arrival of an emergency shuttle by 2 minutes at a massive power cost."
+ invocations = list("May this prism...", "...grant us time to enact his will!")
+ channel_time = 80
+ consumed_components = list(VANGUARD_COGWHEEL = 5, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2)
+ object_path = /obj/structure/destructible/clockwork/powered/prolonging_prism
+ creator_message = "You form a prolonging prism, which will delay the arrival of an emergency shuttle at a massive power cost."
+ observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!"
+ invokers_required = 2
+ multiple_invokers_used = TRUE
+ usage_tip = "The power cost to delay a shuttle increases based on CV and the number of times activated."
+ tier = SCRIPTURE_APPLICATION
+ one_per_tile = TRUE
+ primary_component = VANGUARD_COGWHEEL
+ sort_priority = 7
+ quickbind = TRUE
+ quickbind_desc = "Creates a Prolonging Prism, which will delay the arrival of an emergency shuttle by 2 minutes at a massive power cost."
+
+/datum/clockwork_scripture/create_object/prolonging_prism/check_special_requirements()
+ if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ to_chat(invoker, "\"It is too late to construct one of these, champion.\"")
+ return FALSE
+ var/turf/T = get_turf(invoker)
+ if(!T || T.z != ZLEVEL_STATION)
+ to_chat(invoker, "\"You must be on the station to construct one of these, champion.\"")
+ return FALSE
+ return ..()
+
+
//Mania Motor: Creates a malevolent transmitter that will broadcast the whispers of Sevtug into the minds of nearby nonservants, causing a variety of mental effects at a power cost.
/datum/clockwork_scripture/create_object/mania_motor
descname = "Powered Structure, Area Denial"
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
index b49b0c5819..2560e36cd4 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -122,8 +122,8 @@
/datum/clockwork_scripture/ranged_ability/geis_prep/run_scripture()
var/servants = 0
if(!GLOB.ratvar_awakens)
- for(var/mob/living/M in GLOB.all_clockwork_mobs)
- if(ishuman(M) || issilicon(M))
+ for(var/mob/living/M in GLOB.living_mob_list)
+ if(can_recite_scripture(M, TRUE))
servants++
if(servants > SCRIPT_SERVANT_REQ)
whispered = FALSE
@@ -153,8 +153,8 @@
/datum/clockwork_scripture/geis/run_scripture()
var/servants = 0
if(!GLOB.ratvar_awakens)
- for(var/mob/living/M in GLOB.all_clockwork_mobs)
- if(ishuman(M) || issilicon(M))
+ for(var/mob/living/M in GLOB.living_mob_list)
+ if(can_recite_scripture(M, TRUE))
servants++
if(target.buckled)
target.buckled.unbuckle_mob(target, TRUE)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm b/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm
new file mode 100644
index 0000000000..28cc82ff2e
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_structures/prolonging_prism.dm
@@ -0,0 +1,140 @@
+//Prolonging Prism: A prism that consumes power to delay the shuttle
+/obj/structure/destructible/clockwork/powered/prolonging_prism
+ name = "prolonging prism"
+ desc = "A dark onyx prism, held in midair by spiraling tendrils of stone."
+ clockwork_desc = "A powerful prism that will delay the arrival of an emergency shuttle."
+ icon_state = "prolonging_prism_inactive"
+ active_icon = "prolonging_prism"
+ inactive_icon = "prolonging_prism_inactive"
+ unanchored_icon = "prolonging_prism_unwrenched"
+ construction_value = 20
+ max_integrity = 125
+ obj_integrity = 125
+ break_message = "The prism falls to the ground with a heavy thud!"
+ debris = list(/obj/item/clockwork/alloy_shards/small = 3, \
+ /obj/item/clockwork/alloy_shards/medium = 1, \
+ /obj/item/clockwork/alloy_shards/large = 1, \
+ /obj/item/clockwork/component/vanguard_cogwheel/onyx_prism = 1)
+ var/static/list/component_refund = list(VANGUARD_COGWHEEL = 2, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 1)
+ var/static/delay_cost = 2500
+ var/static/delay_cost_increase = 750
+ var/static/delay_remaining = 0
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/examine(mob/user)
+ ..()
+ if(is_servant_of_ratvar(user) || isobserver(user))
+ if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ to_chat(user, "An emergency shuttle has arrived and this prism is no longer useful; attempt to activate it to gain a partial refund of components used.")
+ else
+ var/efficiency = get_efficiency_mod()
+ var/efficiency_time = get_efficiency_mod(TRUE)
+ to_chat(user, "It requires at least [get_delay_cost() * efficiency]W of power to attempt to delay the arrival of an emergency shuttle by \
+ [2 * efficiency_time] minutes.")
+ to_chat(user, "This cost increases by [delay_cost_increase * 0.1]W for every 10 CV and [delay_cost_increase]W for every previous \
+ activation.")
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/forced_disable(bad_effects)
+ if(active)
+ if(bad_effects)
+ try_use_power(MIN_CLOCKCULT_POWER*4)
+ visible_message("[src] emits an airy chuckling sound and falls dark!")
+ toggle()
+ return TRUE
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/attack_hand(mob/living/user)
+ if(user.canUseTopic(src, !issilicon(user), NO_DEXTERY) && is_servant_of_ratvar(user))
+ if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE)
+ to_chat(user, "You break [src] apart, refunding some of the components used.")
+ for(var/i in component_refund)
+ generate_cache_component(i, src)
+ take_damage(max_integrity)
+ return 0
+ if(active)
+ return 0
+ var/turf/T = get_turf(src)
+ if(!T || T.z != ZLEVEL_STATION)
+ to_chat(user, "[src] must be on the station to function!")
+ return 0
+ if(SSshuttle.emergency.mode != SHUTTLE_CALL)
+ to_chat(user, "No emergency shuttles are attempting to arrive at the station!")
+ return 0
+ var/efficiency = get_efficiency_mod()
+ if(!try_use_power(get_delay_cost() * efficiency))
+ to_chat(user, "[src] needs more power to function!")
+ return 0
+ delay_cost += delay_cost_increase
+ delay_remaining += PRISM_DELAY_DURATION
+ toggle(0, user)
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/process()
+ var/turf/own_turf = get_turf(src)
+ if(SSshuttle.emergency.mode != SHUTTLE_CALL || delay_remaining <= 0 || !own_turf || own_turf.z != ZLEVEL_STATION)
+ forced_disable(FALSE)
+ return
+ . = ..()
+ var/delay_amount = 40
+ delay_remaining -= delay_amount
+ var/efficiency = get_efficiency_mod()
+ SSshuttle.emergency.setTimer(SSshuttle.emergency.timeLeft(1) + (delay_amount * efficiency))
+ var/highest_y
+ var/highest_x
+ var/lowest_y
+ var/lowest_x
+ var/list/prism_turfs = list()
+ for(var/t in SSshuttle.emergency.ripple_area(SSshuttle.getDock("emergency_home")))
+ prism_turfs[t] = TRUE
+ var/turf/T = t
+ if(!highest_y || T.y > highest_y)
+ highest_y = T.y
+ if(!highest_x || T.x > highest_x)
+ highest_x = T.x
+ if(!lowest_y || T.y < lowest_y)
+ lowest_y = T.y
+ if(!lowest_x || T.x < lowest_x)
+ lowest_x = T.x
+ var/mean_y = Lerp(lowest_y, highest_y)
+ var/mean_x = Lerp(lowest_x, highest_x)
+ if(prob(50))
+ mean_y = Ceiling(mean_y)
+ else
+ mean_y = Floor(mean_y)
+ if(prob(50))
+ mean_x = Ceiling(mean_x)
+ else
+ mean_x = Floor(mean_x)
+ var/turf/semi_random_center_turf = locate(mean_x, mean_y, ZLEVEL_STATION)
+ for(var/t in getline(src, semi_random_center_turf))
+ prism_turfs[t] = TRUE
+ var/placement_style = prob(50)
+ for(var/t in prism_turfs)
+ var/turf/T = t
+ if(placement_style)
+ if(IsOdd(T.x + T.y))
+ seven_random_hexes(T, efficiency)
+ else if(prob(50 * efficiency))
+ new /obj/effect/temp_visual/ratvar/prolonging_prism(T)
+ else
+ if(IsEven(T.x + T.y))
+ seven_random_hexes(T, efficiency)
+ else if(prob(50 * efficiency))
+ new /obj/effect/temp_visual/ratvar/prolonging_prism(T)
+ CHECK_TICK //we may be going over a hell of a lot of turfs
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/proc/get_delay_cost()
+ return Floor((GLOB.clockwork_construction_value * delay_cost_increase * 0.01) + delay_cost, MIN_CLOCKCULT_POWER)
+
+/obj/structure/destructible/clockwork/powered/prolonging_prism/proc/seven_random_hexes(turf/T, efficiency)
+ var/static/list/hex_states = list("prismhex1", "prismhex2", "prismhex3", "prismhex4", "prismhex5", "prismhex6", "prismhex7")
+ var/mutable_appearance/hex_combo
+ for(var/n in hex_states) //BUILD ME A HEXAGON
+ if(prob(50 * efficiency))
+ if(!hex_combo)
+ hex_combo = mutable_appearance('icons/effects/64x64.dmi', n, RIPPLE_LAYER)
+ else
+ hex_combo.overlays += mutable_appearance('icons/effects/64x64.dmi', n, RIPPLE_LAYER)
+ if(hex_combo) //YOU BUILT A HEXAGON
+ hex_combo.pixel_x = -16
+ hex_combo.pixel_y = -16
+ hex_combo.mouse_opacity = 0
+ hex_combo.plane = GAME_PLANE
+ new /obj/effect/temp_visual/ratvar/prolonging_prism(T, hex_combo)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
index 722ff99c25..c0f149cdef 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -49,7 +49,7 @@
/obj/structure/destructible/clockwork/massive/ratvar/Bump(atom/A)
var/turf/T = get_turf(A)
if(T == loc)
- T = get_step(A, A.dir) //please don't run into a window like a bird, ratvar
+ T = get_step(T, dir) //please don't run into a window like a bird, ratvar
forceMove(T)
/obj/structure/destructible/clockwork/massive/ratvar/Process_Spacemove()
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 9620d30063..61ad770968 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -81,17 +81,12 @@
popup.open()
return 1
-/mob/living/proc/cult_master()
- set category = "Cultist"
- set name = "Assert Leadership"
- pollCultists(src) // This proc handles the distribution of cult master actions
-
/datum/action/innate/cult/mastervote
name = "Assert Leadership"
button_icon_state = "cultvote"
/datum/action/innate/cult/mastervote/IsAvailable()
- if(GLOB.cult_vote_called)
+ if(GLOB.cult_vote_called || !ishuman(owner))
return FALSE
return ..()
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index f90d100724..e39887fca4 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -523,7 +523,7 @@
to_chat(M, "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.")
M.Stun(5)
sleep(30)
- M.vomit(50)
+ M.vomit(10, distance = 5)
if(ORION_TRAIL_FLUX)
if(prob(75))
M.Weaken(3)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 2d3765a934..7da4eb0a1c 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(pipeID2State, list(
if(istype(user, /mob/living/carbon))
var/mob/living/carbon/C = user
for(var/i=1 to 20)
- C.vomit(0,1,0,4,0)
+ C.vomit(0, TRUE, FALSE, 4, FALSE)
if(prob(20))
C.spew_organ()
sleep(5)
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index af5e04b5bd..e2becf458e 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -17,10 +17,12 @@
var/obj/effect/countdown/transformer/countdown
var/mob/living/silicon/ai/masterAI
-/obj/machinery/transformer/New()
+/obj/machinery/transformer/Initialize()
// On us
- ..()
+ . = ..()
+ new /obj/machinery/conveyor/auto(locate(x - 1, y, z), WEST)
new /obj/machinery/conveyor/auto(loc, WEST)
+ new /obj/machinery/conveyor/auto(locate(x + 1, y, z), WEST)
countdown = new(src)
countdown.start()
@@ -116,19 +118,3 @@
if(R)
R.SetLockdown(0)
R.notify_ai(NEW_BORG)
-
-/obj/machinery/transformer/conveyor/New()
- ..()
- var/turf/T = loc
- if(T)
- // Spawn Conveyor Belts
-
- //East
- var/turf/east = locate(T.x + 1, T.y, T.z)
- if(isfloorturf(east))
- new /obj/machinery/conveyor/auto(east, WEST)
-
- // West
- var/turf/west = locate(T.x - 1, T.y, T.z)
- if(isfloorturf(west))
- new /obj/machinery/conveyor/auto(west, WEST)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ba1717485e..3fe719c9f2 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -960,7 +960,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/seeds/cabbage = 3,/obj/item/seeds/carrot = 3,/obj/item/seeds/cherry = 3,/obj/item/seeds/chanter = 3,
/obj/item/seeds/chili = 3,/obj/item/seeds/cocoapod = 3,/obj/item/seeds/coffee = 3,/obj/item/seeds/corn = 3,
/obj/item/seeds/eggplant = 3,/obj/item/seeds/grape = 3,/obj/item/seeds/grass = 3,/obj/item/seeds/lemon = 3,
- /obj/item/seeds/lime = 3,/obj/item/seeds/orange = 3,/obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3,
+ /obj/item/seeds/lime = 3,/obj/item/seeds/onion = 3,/obj/item/seeds/orange = 3,/obj/item/seeds/potato = 3,/obj/item/seeds/poppy = 3,
/obj/item/seeds/pumpkin = 3,/obj/item/seeds/replicapod = 3,/obj/item/seeds/wheat/rice = 3,/obj/item/seeds/soya = 3,/obj/item/seeds/sunflower = 3,
/obj/item/seeds/tea = 3,/obj/item/seeds/tobacco = 3,/obj/item/seeds/tomato = 3,
/obj/item/seeds/tower = 3,/obj/item/seeds/watermelon = 3,/obj/item/seeds/wheat = 3,/obj/item/seeds/whitebeet = 3)
diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm
index 1eae2a3c64..2f591daf19 100644
--- a/code/game/objects/effects/temporary_visuals/clockcult.dm
+++ b/code/game/objects/effects/temporary_visuals/clockcult.dm
@@ -146,6 +146,20 @@
pixel_y = rand(-10, 10)
animate(src, alpha = 0, time = 3, easing = EASE_OUT)
+/obj/effect/temp_visual/ratvar/prolonging_prism
+ icon = 'icons/effects/64x64.dmi'
+ icon_state = "prismhex1"
+ layer = RIPPLE_LAYER
+ pixel_y = -16
+ pixel_x = -16
+ duration = 30
+
+/obj/effect/temp_visual/ratvar/prolonging_prism/Initialize(mapload, set_appearance)
+ . = ..()
+ if(set_appearance)
+ appearance = set_appearance
+ animate(src, alpha = 0, time = duration, easing = BOUNCE_EASING)
+
/obj/effect/temp_visual/ratvar/spearbreak
icon = 'icons/effects/64x64.dmi'
icon_state = "ratvarspearbreak"
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 64af889af6..381b69b44f 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -269,13 +269,15 @@
return
if(!in_range(src, user))
return
+ if(is_cyborg)
+ return
else
if(zero_amount())
return
//get amount from user
var/min = 0
var/max = src.get_amount()
- var/stackmaterial = round(input(user,"How many sheets do you wish to take out of this stack? (Maximum [max]") as num)
+ var/stackmaterial = round(input(user,"How many sheets do you wish to take out of this stack? (Maximum [max])") as num)
if(stackmaterial == null || stackmaterial <= min || stackmaterial >= src.get_amount())
return
else
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 1cbbf37846..58fc87a490 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -125,8 +125,8 @@ obj/item/weapon/construction
var/canRturf = 0
var/ranged = FALSE
var/airlock_type = /obj/machinery/door/airlock
+ var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use
var/window_type = /obj/structure/window/fulltile
-
var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available
var/list/conf_access = null
var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses.
@@ -266,8 +266,10 @@ obj/item/weapon/construction
airlock_type = /obj/machinery/door/airlock/external
if("High Security")
airlock_type = /obj/machinery/door/airlock/highsecurity
+ airlock_glass = FALSE
else
airlock_type = /obj/machinery/door/airlock
+ airlock_glass = FALSE
if("Glass")
if(advanced_airlock_setting == 1)
@@ -289,10 +291,13 @@ obj/item/weapon/construction
airlock_type = /obj/machinery/door/airlock/glass_research
if("Mining")
airlock_type = /obj/machinery/door/airlock/glass_mining
+ airlock_glass = TRUE
else
airlock_type = /obj/machinery/door/airlock/glass
+ airlock_glass = TRUE
else
airlock_type = /obj/machinery/door/airlock
+ airlock_glass = FALSE
/obj/item/weapon/construction/rcd/proc/rcd_create(atom/A, mob/user)
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
old mode 100644
new mode 100755
index 3a04008a98..8ea4e7a5d1
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -23,7 +23,7 @@
//variables for prebuilt flamethrowers
var/create_full = FALSE
var/create_with_tank = FALSE
- var/igniter_type = /obj/item/device/assembly/igniter
+ var/igniter_type = /obj/item/device/assembly/igniter
/obj/item/weapon/flamethrower/Destroy()
if(weldtool)
@@ -145,7 +145,7 @@
if(!status)
to_chat(user, "Secure the igniter first!")
return
- to_chat(user, "You ignite [src]!")
+ to_chat(user, "You [lit ? "extinguish" : "ignite"] [src]!")
lit = !lit
if(lit)
START_PROCESSING(SSobj, src)
@@ -238,4 +238,4 @@
return
/obj/item/device/assembly/igniter/proc/ignite_turf(obj/item/weapon/flamethrower/F,turf/open/location,release_amount = 0.05)
- F.default_ignite(location,release_amount)
\ No newline at end of file
+ F.default_ignite(location,release_amount)
diff --git a/code/game/objects/items/weapons/inducer.dm b/code/game/objects/items/weapons/inducer.dm
index fdd44795ad..c2a35feabf 100644
--- a/code/game/objects/items/weapons/inducer.dm
+++ b/code/game/objects/items/weapons/inducer.dm
@@ -128,6 +128,7 @@
user.visible_message("[user] recharged \the [A]!","You recharged \the [A]!")
recharging = FALSE
return TRUE
+ recharging = FALSE
/obj/item/weapon/inducer/attack(mob/M, mob/user)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 09a076a293..c42c4bb3a5 100755
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -58,8 +58,8 @@
origin_tech = "materials=5;engineering=5;abductor=3"
/obj/item/weapon/wrench/power
- name = "Hand Drill"
- desc ="A simple powered drill with a bolt bit"
+ name = "hand drill"
+ desc = "A simple powered hand drill. It's fitted with a bolt bit."
icon_state = "drill_bolt"
item_state = "drill"
usesound = 'sound/items/drill_use.ogg'
@@ -182,8 +182,8 @@
toolspeed = 0.1
/obj/item/weapon/screwdriver/power
- name = "Hand Drill"
- desc = "A simple hand drill with a screwdriver bit attached."
+ name = "hand drill"
+ desc = "A simple powered hand drill. It's fitted with a screw bit."
icon_state = "drill_screw"
item_state = "drill"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
@@ -283,8 +283,8 @@
toolspeed = 0.5
/obj/item/weapon/wirecutters/power
- name = "Jaws of Life"
- desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
+ name = "jaws of life"
+ desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head."
icon_state = "jaws_cutter"
item_state = "jawsoflife"
origin_tech = "materials=2;engineering=2"
@@ -714,8 +714,8 @@
toolspeed = 0.5
/obj/item/weapon/crowbar/power
- name = "Jaws of Life"
- desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head"
+ name = "jaws of life"
+ desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head."
icon_state = "jaws_pry"
item_state = "jawsoflife"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index e1531b4ef7..7068f3c2f2 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -234,6 +234,7 @@
throw_range = 3
hitsound = 'sound/items/trayhit1.ogg'
hit_reaction_chance = 50
+ materials = list(MAT_METAL = 2000)
var/break_chance = 5 //Likely hood of smashing the chair.
var/obj/structure/chair/origin_type = /obj/structure/chair
@@ -317,6 +318,7 @@
max_integrity = 70
hitsound = 'sound/weapons/genhit1.ogg'
origin_type = /obj/structure/chair/wood
+ materials = null
break_chance = 50
/obj/item/chair/wood/narsie_act()
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 4b912923a2..1f6426753b 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -23,7 +23,9 @@
if(RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5)
if(RCD_WINDOWGRILLE)
- return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 10)
+ if(the_rcd.window_type == /obj/structure/window/reinforced/fulltile)
+ return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 12)
+ else return list("mode" = RCD_WINDOWGRILLE, "delay" = 20, "cost" = 8)
return FALSE
/obj/structure/grille/rcd_act(mob/user, var/obj/item/weapon/construction/rcd/the_rcd, passed_mode)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 62d0adfef7..67dacc7b44 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -190,7 +190,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
// Make sure we don't delete the actual morgue and its tray
var/list/conts = GetAllContents() - src - connected
- if(conts.len <= 1)
+ if(!conts.len)
audible_message("You hear a hollow crackle.")
return
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index c1993677f3..2fb5b03aca 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -206,11 +206,13 @@
if(RCD_FLOORWALL)
return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 16)
if(RCD_AIRLOCK)
- return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16)
+ if(the_rcd.airlock_glass)
+ return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20)
+ else return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16)
if(RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33)
if(RCD_WINDOWGRILLE)
- return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 4)
+ return list("mode" = RCD_WINDOWGRILLE, "delay" = 10, "cost" = 4)
return FALSE
/turf/open/floor/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index bac25e68c0..e25ce336bb 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -173,7 +173,10 @@
switch(the_rcd.mode)
if(RCD_FLOORWALL)
- return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2)
+ var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
+ if(L)
+ return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1)
+ else return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3)
return FALSE
/turf/open/space/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index cdfee917c2..ae47fd8e85 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -66,7 +66,10 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
/client/proc/customiseSNPC, /* Customise any interactive crewmembers in the world */
/client/proc/resetSNPC, /* Resets any interactive crewmembers in the world */
- /client/proc/open_shuttle_manipulator /* Opens shuttle manipulator UI */
+ /client/proc/open_shuttle_manipulator, /* Opens shuttle manipulator UI */
+ /client/proc/deadchat,
+ /client/proc/toggleprayers,
+ /client/proc/toggleadminhelpsound
)
GLOBAL_PROTECT(admin_verbs_ban)
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_ban_panel,/client/proc/stickybanpanel))
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index dcdf1538fe..badca3ec43 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -506,7 +506,7 @@
for(var/datum/mind/N in SSticker.mode.cult)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][N.has_antag_datum(ANTAG_DATUM_CULT_MASTER) ? " \[Master\]" : ""][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
dat += ""
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index aba21d69f8..2f089e793b 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -480,7 +480,8 @@
if(minutes > GLOB.CMinutes)
mins = minutes - GLOB.CMinutes
mins = input(usr,"How long (in minutes)? (Default: 1440)","Ban time",mins ? mins : 1440) as num|null
- if(!mins)
+ if(mins <= 0)
+ to_chat(usr, "[mins] is not a valid duration.")
return
minutes = GLOB.CMinutes + mins
duration = GetExp(minutes)
@@ -914,7 +915,8 @@
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
if("Yes")
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
- if(!mins)
+ if(mins <= 0)
+ to_chat(usr, "[mins] is not a valid duration.")
return
var/reason = input(usr,"Please State Reason.","Reason") as message|null
if(!reason)
@@ -1109,7 +1111,8 @@
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
if("Yes")
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
- if(!mins)
+ if(mins <= 0)
+ to_chat(usr, "[mins] is not a valid duration.")
return
var/reason = input(usr,"Please State Reason.","Reason") as message|null
if(!reason)
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 18e883d7f2..6f19cf90ee 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -612,8 +612,8 @@ GLOBAL_PROTECT(VVpixelmovement)
if (O.vv_edit_var(variable, var_new) == FALSE)
to_chat(src, "Your edit was rejected by the object.")
return
- log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]")
- log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
- var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]"
+ log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
+ log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
+ var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
message_admins(msg)
admin_ticket_log(O, msg)
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 2a039cd5bf..36b3e95d10 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -9,13 +9,16 @@ Pipes -> Pipelines
Pipelines + Other Objects -> Pipe network
*/
+#define PIPE_VISIBLE_LEVEL 2
+#define PIPE_HIDDEN_LEVEL 1
+
/obj/machinery/atmospherics
anchored = 1
idle_power_usage = 0
active_power_usage = 0
power_channel = ENVIRON
on_blueprints = TRUE
- layer = GAS_PIPE_LAYER //under wires
+ layer = GAS_PIPE_HIDDEN_LAYER //under wires
resistance_flags = FIRE_PROOF
obj_integrity = 200
max_integrity = 200
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm
index 0e9ad562de..e2850984bd 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_devices.dm
@@ -4,6 +4,7 @@
initialize_directions = SOUTH|NORTH
use_power = 1
device_type = BINARY
+ layer = GAS_PUMP_LAYER
/obj/machinery/atmospherics/components/binary/SetInitDirections()
switch(dir)
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm
index ad9d80efc4..12f22c47bc 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_devices.dm
@@ -4,6 +4,7 @@
initialize_directions = SOUTH|NORTH|WEST
use_power = 1
device_type = TRINARY
+ layer = GAS_FILTER_LAYER
var/flipped = 0
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 51e97eb5a4..f9eedade4c 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -7,6 +7,7 @@
obj_integrity = 350
max_integrity = 350
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 30, acid = 30)
+ layer = ABOVE_WINDOW_LAYER
var/on = FALSE
state_open = FALSE
@@ -155,7 +156,7 @@
var/turf/T = get_turf(src)
if(occupant)
var/mob/living/mob_occupant = occupant
- if(mob_occupant.health >= 100) // Don't bother with fully healed people.
+ if(mob_occupant.health >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people.
on = FALSE
update_icon()
playsound(T, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors.
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm b/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm
index 15ae3eb88f..d1caa8d44b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm
@@ -4,7 +4,8 @@
density = 1
name = "generator input"
- desc = "Placeholder"
+ desc = "An input for a generator."
+ layer = LOW_OBJ_LAYER
var/update_cycle
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
index f0079a5962..30ff1ebc30 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
@@ -7,6 +7,8 @@
can_unwrench = 1
+ layer = LOW_OBJ_LAYER
+
var/obj/machinery/atmospherics/components/unary/heat_exchanger/partner = null
var/update_cycle
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index a03a6952c4..326e4794b6 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -16,6 +16,7 @@
var/datum/radio_frequency/radio_connection
level = 1
+ layer = GAS_SCRUBBER_LAYER
/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy()
if(SSradio)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm b/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm
index 27d6c2296f..7853e2c4b3 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm
@@ -7,6 +7,7 @@
dir = SOUTH
initialize_directions = SOUTH
+ layer = GAS_SCRUBBER_LAYER
var/on = 0
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
index 4b4122c654..8dee9dc8e7 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
@@ -7,6 +7,7 @@
var/obj/machinery/portable_atmospherics/connected_device
use_power = 0
level = 0
+ layer = GAS_FILTER_LAYER
/obj/machinery/atmospherics/components/unary/portables_connector/New()
..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
index af070c4091..4ed7387b69 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
@@ -9,6 +9,7 @@
var/volume = 10000 //in liters, 1 meters by 1 meters by 2 meters
density = 1
var/gas_type = 0
+ layer = ABOVE_WINDOW_LAYER
/obj/machinery/atmospherics/components/unary/tank/New()
..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 26f02a43ef..1f9b119ce7 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -1,7 +1,8 @@
/obj/machinery/atmospherics/components/unary/thermomachine
name = "thermomachine"
desc = "Heats or cools gas in connected pipes."
- icon_state = "cold_map"
+ icon = 'icons/obj/Cryogenic2.dmi'
+ icon_state = "freezer"
var/icon_state_on = "cold_on"
var/icon_state_open = "cold_off"
density = TRUE
@@ -9,7 +10,8 @@
obj_integrity = 300
max_integrity = 300
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30)
-
+ layer = OBJ_LAYER
+
var/on = FALSE
var/min_temperature = 0
var/max_temperature = 0
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 8edf06fbdf..04beaf28d2 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -13,6 +13,7 @@
can_unwrench = 1
welded = 0
level = 1
+ layer = GAS_SCRUBBER_LAYER
var/id_tag = null
var/on = 0
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 87800e0b37..906e586bdd 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -11,6 +11,7 @@
can_unwrench = 1
welded = 0
level = 1
+ layer = GAS_SCRUBBER_LAYER
var/id_tag = null
var/on = 0
diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm
index 106d169339..66b831c477 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold.dm
@@ -38,13 +38,13 @@
//Colored pipes, use these for mapping
/obj/machinery/atmospherics/pipe/manifold/general
- name="pipe"
/obj/machinery/atmospherics/pipe/manifold/general/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/general/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/scrubbers
name="scrubbers pipe"
@@ -52,10 +52,11 @@
color=rgb(255,0,0)
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/supply
name="air supply pipe"
@@ -63,10 +64,11 @@
color=rgb(0,0,255)
/obj/machinery/atmospherics/pipe/manifold/supply/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/supply/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/supplymain
name="main air supply pipe"
@@ -74,47 +76,96 @@
color=rgb(130,43,272)
/obj/machinery/atmospherics/pipe/manifold/supplymain/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/yellow
pipe_color=rgb(255,198,0)
color=rgb(255,198,0)
/obj/machinery/atmospherics/pipe/manifold/yellow/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/yellow/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/cyan
pipe_color=rgb(0,256,249)
color=rgb(0,256,249)
/obj/machinery/atmospherics/pipe/manifold/cyan/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/cyan/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/green
pipe_color=rgb(30,256,0)
color=rgb(30,256,0)
/obj/machinery/atmospherics/pipe/manifold/green/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/green/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold/orange
- pipe_color=rgb(255,127,39)
- color=rgb(255,127,39)
+ pipe_color=rgb(255,129,25)
+ color=rgb(255,129,25)
/obj/machinery/atmospherics/pipe/manifold/orange/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold/orange/hidden
- level = 1
\ No newline at end of file
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold/purple
+ pipe_color=rgb(128,0,182)
+ color=rgb(128,0,182)
+
+/obj/machinery/atmospherics/pipe/manifold/purple/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold/purple/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold/dark
+ pipe_color=rgb(69,69,69)
+ color=rgb(69,69,69)
+
+/obj/machinery/atmospherics/pipe/manifold/dark/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold/dark/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold/violet
+ pipe_color=rgb(64,0,128)
+ color=rgb(64,0,128)
+
+/obj/machinery/atmospherics/pipe/manifold/violet/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold/violet/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold/brown
+ pipe_color=rgb(178,100,56)
+ color=rgb(178,100,56)
+
+/obj/machinery/atmospherics/pipe/manifold/brown/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold/brown/hidden
+ level = PIPE_HIDDEN_LEVEL
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
index b9624e89cb..1c969caa28 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
@@ -29,13 +29,13 @@
//Colored pipes, use these for mapping
/obj/machinery/atmospherics/pipe/manifold4w/general
- name="pipe"
/obj/machinery/atmospherics/pipe/manifold4w/general/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/general/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers
name="scrubbers pipe"
@@ -43,10 +43,12 @@
color=rgb(255,0,0)
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/supply
name="air supply pipe"
@@ -54,10 +56,11 @@
color=rgb(0,0,255)
/obj/machinery/atmospherics/pipe/manifold4w/supply/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/supplymain
name="main air supply pipe"
@@ -65,47 +68,96 @@
color=rgb(130,43,272)
/obj/machinery/atmospherics/pipe/manifold4w/supplymain/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/yellow
pipe_color=rgb(255,198,0)
color=rgb(255,198,0)
/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/yellow/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/cyan
pipe_color=rgb(0,256,249)
color=rgb(0,256,249)
/obj/machinery/atmospherics/pipe/manifold4w/cyan/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/green
pipe_color=rgb(30,256,0)
color=rgb(30,256,0)
/obj/machinery/atmospherics/pipe/manifold4w/green/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/green/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/manifold4w/orange
- pipe_color=rgb(255,127,39)
- color=rgb(255,127,39)
+ pipe_color=rgb(255,129,25)
+ color=rgb(255,129,25)
/obj/machinery/atmospherics/pipe/manifold4w/orange/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold4w/purple
+ pipe_color=rgb(128,0,182)
+ color=rgb(128,0,182)
+
+/obj/machinery/atmospherics/pipe/manifold4w/purple/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold4w/purple/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold4w/dark
+ pipe_color=rgb(69,69,69)
+ color=rgb(69,69,69)
+
+/obj/machinery/atmospherics/pipe/manifold4w/dark/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold4w/dark/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold4w/violet
+ pipe_color=rgb(64,0,128)
+ color=rgb(64,0,128)
+
+/obj/machinery/atmospherics/pipe/manifold4w/violet/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold4w/violet/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/manifold4w/brown
+ pipe_color=rgb(178,100,56)
+ color=rgb(178,100,56)
+
+/obj/machinery/atmospherics/pipe/manifold4w/brown/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/manifold4w/brown/hidden
+ level = PIPE_HIDDEN_LEVEL
\ No newline at end of file
diff --git a/code/modules/atmospherics/machinery/pipes/simple.dm b/code/modules/atmospherics/machinery/pipes/simple.dm
index 984c006b74..5ac9ac31e6 100644
--- a/code/modules/atmospherics/machinery/pipes/simple.dm
+++ b/code/modules/atmospherics/machinery/pipes/simple.dm
@@ -40,13 +40,13 @@ The regular pipe you see everywhere, including bent ones.
//Colored pipes, use these for mapping
/obj/machinery/atmospherics/pipe/simple/general
- name="pipe"
/obj/machinery/atmospherics/pipe/simple/general/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/general/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/scrubbers
name="scrubbers pipe"
@@ -54,10 +54,11 @@ The regular pipe you see everywhere, including bent ones.
color=rgb(255,0,0)
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/supply
name="air supply pipe"
@@ -65,10 +66,11 @@ The regular pipe you see everywhere, including bent ones.
color=rgb(0,0,255)
/obj/machinery/atmospherics/pipe/simple/supply/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/supply/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/supplymain
name="main air supply pipe"
@@ -76,47 +78,96 @@ The regular pipe you see everywhere, including bent ones.
color=rgb(130,43,272)
/obj/machinery/atmospherics/pipe/simple/supplymain/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/yellow
pipe_color=rgb(255,198,0)
color=rgb(255,198,0)
/obj/machinery/atmospherics/pipe/simple/yellow/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/yellow/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/cyan
pipe_color=rgb(0,256,249)
color=rgb(0,256,249)
/obj/machinery/atmospherics/pipe/simple/cyan/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/cyan/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/green
pipe_color=rgb(30,256,0)
color=rgb(30,256,0)
/obj/machinery/atmospherics/pipe/simple/green/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/green/hidden
- level = 1
+ level = PIPE_HIDDEN_LEVEL
/obj/machinery/atmospherics/pipe/simple/orange
- pipe_color=rgb(255,127,39)
- color=rgb(255,127,39)
+ pipe_color=rgb(255,129,25)
+ color=rgb(255,129,25)
/obj/machinery/atmospherics/pipe/simple/orange/visible
- level = 2
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
/obj/machinery/atmospherics/pipe/simple/orange/hidden
- level = 1
\ No newline at end of file
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/simple/purple
+ pipe_color=rgb(128,0,182)
+ color=rgb(128,0,182)
+
+/obj/machinery/atmospherics/pipe/simple/purple/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/simple/purple/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/simple/dark
+ pipe_color=rgb(69,69,69)
+ color=rgb(69,69,69)
+
+/obj/machinery/atmospherics/pipe/simple/dark/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/simple/dark/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/simple/violet
+ pipe_color=rgb(64,0,128)
+ color=rgb(64,0,128)
+
+/obj/machinery/atmospherics/pipe/simple/violet/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/simple/violet/hidden
+ level = PIPE_HIDDEN_LEVEL
+
+/obj/machinery/atmospherics/pipe/simple/brown
+ pipe_color=rgb(178,100,56)
+ color=rgb(178,100,56)
+
+/obj/machinery/atmospherics/pipe/simple/brown/visible
+ level = PIPE_VISIBLE_LEVEL
+ layer = GAS_PIPE_VISIBLE_LAYER
+
+/obj/machinery/atmospherics/pipe/simple/brown/hidden
+ level = PIPE_HIDDEN_LEVEL
\ No newline at end of file
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index 06f2d6d019..395fd3c305 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -69,7 +69,7 @@
// Plasteel. Lightweight, strong and contains some plasma too.
/datum/export/stack/plasteel
- cost = 85
+ cost = 305 // 2000u of plasma + 2000u of metal.
message = "of plasteel"
export_types = list(/obj/item/stack/sheet/plasteel)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 6c09b82402..4c3c6572a2 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1249,13 +1249,13 @@
/datum/supply_pack/materials/plasteel20
name = "20 Plasteel Sheets"
- cost = 3000
+ cost = 7500
contains = list(/obj/item/stack/sheet/plasteel/twenty)
crate_name = "plasteel sheets crate"
/datum/supply_pack/materials/plasteel50
name = "50 Plasteel Sheets"
- cost = 5000
+ cost = 16500
contains = list(/obj/item/stack/sheet/plasteel/fifty)
crate_name = "plasteel sheets crate"
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index d7fcd8a148..ea7f24e211 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -490,7 +490,7 @@ GLOBAL_LIST(external_rsc_urls)
return
if(!account_join_date)
account_join_date = "Error"
- var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),COALESCE(INET_ATON('[world.internet_address]'), 0),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')")
+ var/datum/DBQuery/query_log_connection = SSdbcore.NewQuery("INSERT INTO `[format_table_name("connection_log")]` (`id`,`datetime`,`server_ip`,`server_port`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')),'[world.port]','[sql_ckey]',INET_ATON('[sql_ip]'),'[sql_computerid]')")
query_log_connection.Execute()
if(new_player)
player_age = -1
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 50eae80877..430e91a356 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -625,7 +625,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
else if(src.dir == WEST)
del src.currentimage
src.currentimage = new /image(left,src)
- to_chat(my_target, currentimage)
+ SEND_IMAGE(my_target, currentimage)
/obj/effect/fake_attacker/proc/attack_loop()
@@ -669,7 +669,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc)
O.name = "blood"
var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1)
- to_chat(target, I)
+ SEND_IMAGE(target, I)
QDEL_IN(O, 300)
@@ -786,7 +786,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
new /obj/effect/hallucination/items_other(src.loc,src)
if("sounds")
//Strange audio
- //to_chat(src, "Strange Audio")
switch(rand(1,20))
if(1) playsound_local(null,'sound/machines/airlock.ogg', 15, 1)
if(2)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 95d3a7993b..5ab7f62d65 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -182,7 +182,7 @@
/obj/item/weapon/reagent_containers/food/snacks/proc/slice(accuracy, obj/item/weapon/W, mob/user)
if((slices_num <= 0 || !slices_num) || !slice_path) //is the food sliceable?
- return 0
+ return FALSE
if ( \
!isturf(src.loc) || \
@@ -191,7 +191,7 @@
!(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \
)
to_chat(user, "You cannot slice [src] here! You need a table or at least a tray.")
- return 1
+ return FALSE
var/slices_lost = 0
if (accuracy >= IS_SHARP_ACCURATE)
@@ -211,6 +211,7 @@
var/obj/item/weapon/reagent_containers/food/snacks/slice = new slice_path (loc)
initialize_slice(slice, reagents_per_slice)
qdel(src)
+ return TRUE
/obj/item/weapon/reagent_containers/food/snacks/proc/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice)
slice.create_reagents(slice.volume)
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 7cfce5419d..3cce0f46c9 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -475,4 +475,13 @@
icon_state = "butter"
list_reagents = list("nutriment" = 5)
filling_color = "#FFD700"
- tastes = list("butter" = 1)
\ No newline at end of file
+ tastes = list("butter" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/onionrings
+ name = "onion rings"
+ desc = "Onion slices coated in batter."
+ icon_state = "onionrings"
+ list_reagents = list("nutriment" = 3)
+ filling_color = "#C0C9A0"
+ gender = PLURAL
+ tastes = list("batter" = 3, "onion" = 1)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index aa60840cd0..168dc120e0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -15,8 +15,7 @@
var/max_n_of_items = 10 // whatever fat fuck made this a global var needs to look at themselves in the mirror sometime
var/efficiency = 0
-
-// see code/modules/food/recipes_microwave.dm for recipes
+//Microwaving doesn't use recipes, instead it calls the microwave_act of the objects. For food, this creates something based on the food's cooked_type
/*******************
* Initialising
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 4a2f0948d9..14486a867e 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -126,8 +126,6 @@
input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip
output = /obj/item/weapon/reagent_containers/food/snacks/roastparsnip
-
-
/* mobs */
/datum/food_processor_process/mob/process_food(loc, what, processor)
..()
diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm
new file mode 100644
index 0000000000..07b7deea38
--- /dev/null
+++ b/code/modules/hydroponics/grown/onion.dm
@@ -0,0 +1,72 @@
+/obj/item/seeds/onion
+ name = "pack of onion seeds"
+ desc = "These seeds grow into onions."
+ icon_state = "seed-onion"
+ species = "onion"
+ plantname = "Onion Sprouts"
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion
+ lifespan = 20
+ maturation = 3
+ production = 4
+ yield = 6
+ endurance = 25
+ growthstages = 3
+ weed_chance = 3
+ growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
+ mutatelist = list(/obj/item/seeds/onion/red)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/onion
+ seed = /obj/item/seeds/onion
+ name = "onion"
+ desc = "Nothing to cry over."
+ icon_state = "onion"
+ filling_color = "#C0C9A0"
+ bitesize_mod = 2
+ tastes = list("onions" = 1)
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice
+ slices_num = 2
+
+/obj/item/seeds/onion/red
+ name = "pack of red onion seeds"
+ desc = "For growing exceptionally potent onions."
+ icon_state = "seed-onionred"
+ species = "onion_red"
+ plantname = "Red Onion Sprouts"
+ weed_chance = 1
+ product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1, "tearjuice" = 0.05)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
+ seed = /obj/item/seeds/onion/red
+ name = "red onion"
+ desc = "Purple despite the name."
+ icon_state = "onion_red"
+ filling_color = "#C29ACF"
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/onion/slice(accuracy, obj/item/weapon/W, mob/user)
+ var/datum/effect_system/smoke_spread/chem/S = new //Since the onion is destroyed when it's sliced,
+ var/splat_location = get_turf(src) //we need to set up the smoke beforehand
+ S.attach(splat_location)
+ S.set_up(reagents, 0, splat_location, 0)
+ if(..())
+ S.start()
+ return TRUE
+ qdel(S)
+
+/obj/item/weapon/reagent_containers/food/snacks/onion_slice
+ name = "onion slices"
+ desc = "Rings, not for wearing."
+ icon_state = "onionslice"
+ list_reagents = list("nutriment" = 5, "vitamin" = 2)
+ filling_color = "#C0C9A0"
+ gender = PLURAL
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/onionrings
+
+/obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
+ name = "red onion slices"
+ desc = "They shine like exceptionally low quality amethyst."
+ icon_state = "onionslice_red"
+ filling_color = "#C29ACF"
+ list_reagents = list("nutriment" = 5, "vitamin" = 2, "tearjuice" = 2.5)
\ No newline at end of file
diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm
index 63457a1ce9..dd5cd53690 100644
--- a/code/modules/lighting/lighting_source.dm
+++ b/code/modules/lighting/lighting_source.dm
@@ -270,6 +270,8 @@
source_turf.luminosity = Ceiling(light_range)
for(T in view(Ceiling(light_range), source_turf))
for (thing in T.get_corners(source_turf))
+ if(!thing)
+ continue
C = thing
corners[C] = 0
turfs += T
@@ -291,6 +293,8 @@
LAZYINITLIST(effect_str)
if (needs_update == LIGHTING_VIS_UPDATE)
for (thing in corners - effect_str) // New corners
+ if(!thing)
+ continue
C = thing
LAZYADD(C.affecting, src)
if (!C.active)
@@ -300,6 +304,8 @@
else
L = corners - effect_str
for (thing in L) // New corners
+ if(!thing)
+ continue
C = thing
LAZYADD(C.affecting, src)
if (!C.active)
@@ -308,6 +314,8 @@
APPLY_CORNER(C)
for (thing in corners - L) // Existing corners
+ if(!thing)
+ continue
C = thing
if (!C.active)
effect_str[C] = 0
@@ -316,6 +324,8 @@
L = effect_str - corners
for (thing in L) // Old, now gone, corners.
+ if(!thing)
+ continue
C = thing
REMOVE_CORNER(C)
LAZYREMOVE(C.affecting, src)
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
index ca6866c48e..49e89685ee 100644
--- a/code/modules/lighting/lighting_turf.dm
+++ b/code/modules/lighting/lighting_turf.dm
@@ -24,6 +24,8 @@
var/datum/lighting_corner/C
var/thing
for (thing in corners)
+ if(!thing)
+ continue
C = thing
C.update_active()
@@ -45,6 +47,8 @@
var/datum/lighting_corner/C
var/datum/light_source/S
for (thing in corners)
+ if(!thing)
+ continue
C = thing
if (!C.active) // We would activate the corner, calculate the lighting for it.
for (thing in C.affecting)
@@ -61,6 +65,8 @@
var/thing
var/datum/lighting_corner/L
for (thing in corners)
+ if(!thing)
+ continue
L = thing
totallums += L.lum_r + L.lum_b + L.lum_g
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index fb3bbbd032..9d8b5aa5dd 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -1,3 +1,8 @@
+
+#define GIBTONITE_QUALITY_HIGH 3
+#define GIBTONITE_QUALITY_MEDIUM 2
+#define GIBTONITE_QUALITY_LOW 1
+
/**********************Mineral ores**************************/
/obj/item/weapon/ore
@@ -184,10 +189,11 @@
item_state = "Gibtonite ore"
w_class = WEIGHT_CLASS_BULKY
throw_range = 0
- var/primed = 0
+ var/primed = FALSE
var/det_time = 100
- var/quality = 1 //How pure this gibtonite is, determines the explosion produced by it and is derived from the det_time of the rock wall it was taken from, higher value = better
+ var/quality = GIBTONITE_QUALITY_LOW //How pure this gibtonite is, determines the explosion produced by it and is derived from the det_time of the rock wall it was taken from, higher value = better
var/attacher = "UNKNOWN"
+ var/det_timer
/obj/item/weapon/twohanded/required/gibtonite/Destroy()
qdel(wires)
@@ -213,10 +219,12 @@
return
if(primed)
if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) || istype(I, /obj/item/device/multitool))
- primed = 0
+ primed = FALSE
+ if(det_timer)
+ deltimer(det_timer)
user.visible_message("The chain reaction was stopped! ...The ore's quality looks diminished.", "You stopped the chain reaction. ...The ore's quality looks diminished.")
icon_state = "Gibtonite ore"
- quality = 1
+ quality = GIBTONITE_QUALITY_LOW
return
..()
@@ -237,8 +245,8 @@
/obj/item/weapon/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
if(!primed)
+ primed = TRUE
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
- primed = 1
icon_state = "Gibtonite active"
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -260,14 +268,18 @@
else
user.visible_message("[user] strikes \the [src], causing a chain reaction!", "You strike \the [src], causing a chain reaction.")
log_game("[key_name(user)] has primed a [name] for detonation at [A][COORD(bombturf)]")
- if(primed)
- if(quality == 3)
- explosion(src.loc,2,4,9,adminlog = notify_admins)
- if(quality == 2)
- explosion(src.loc,1,2,5,adminlog = notify_admins)
- if(quality == 1)
- explosion(src.loc,-1,1,3,adminlog = notify_admins)
- qdel(src)
+ det_timer = addtimer(CALLBACK(src, .proc/detonate, notify_admins), det_time, TIMER_STOPPABLE)
+
+/obj/item/weapon/twohanded/required/gibtonite/proc/detonate(notify_admins)
+ if(primed)
+ switch(quality)
+ if(GIBTONITE_QUALITY_HIGH)
+ explosion(src,2,4,9,adminlog = notify_admins)
+ if(GIBTONITE_QUALITY_MEDIUM)
+ explosion(src,1,2,5,adminlog = notify_admins)
+ if(GIBTONITE_QUALITY_LOW)
+ explosion(src,0,1,3,adminlog = notify_admins)
+ qdel(src)
/obj/item/weapon/ore/Initialize()
..()
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 493f50c97c..ec61f4f7fb 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -28,6 +28,11 @@
else
return ..()
+/obj/structure/ore_box/examine(mob/living/user)
+ if(Adjacent(user) && istype(user))
+ show_contents(user)
+ . = ..()
+
/obj/structure/ore_box/attack_hand(mob/user)
if(Adjacent(user))
show_contents(user)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 06145235a0..e72c8a10a1 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -379,10 +379,6 @@
return
return TRUE
-/mob/living/carbon/proc/is_mouth_covered(head_only = 0, mask_only = 0)
- if( (!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) )
- return 1
-
/mob/living/carbon/get_standard_pixel_y_offset(lying = 0)
if(lying)
return -6
@@ -450,7 +446,7 @@
return 0
return ..()
-/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0)
+/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE)
if(dna && dna.species && NOHUNGER in dna.species.species_traits)
return 1
@@ -476,6 +472,9 @@
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
var/turf/T = get_turf(src)
+ if(!blood)
+ nutrition -= lost_nutrition
+ adjustToxLoss(-3)
for(var/i=0 to distance)
if(blood)
if(T)
@@ -485,8 +484,6 @@
else
if(T)
T.add_vomit_floor(src, toxic)//toxic barf looks different
- nutrition -= lost_nutrition
- adjustToxLoss(-3)
T = get_step(T, dir)
if (is_blocked_turf(T))
break
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 57caa35c42..91e75034b4 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -35,6 +35,18 @@
number += E.bang_protect
return number
+/mob/living/carbon/is_mouth_covered(head_only = 0, mask_only = 0)
+ if( (!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)) )
+ return TRUE
+
+/mob/living/carbon/is_eyes_covered(check_glasses = 1, check_head = 1, check_mask = 1)
+ if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
+ return TRUE
+ if(check_head && head && (head.flags_cover & HEADCOVERSEYES))
+ return TRUE
+ if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
+ return TRUE
+
/mob/living/carbon/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
var/obj/item/bodypart/affecting = get_bodypart(def_zone)
if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
@@ -305,8 +317,9 @@
Weaken(stun_pwr*effect_amount)
if(istype(ears) && (deafen_pwr || damage_pwr))
- ears.ear_damage += damage_pwr * effect_amount
- ears.deaf = max(ears.deaf, deafen_pwr * effect_amount)
+ var/ear_damage = damage_pwr * effect_amount
+ var/deaf = max(ears.deaf, deafen_pwr * effect_amount)
+ adjustEarDamage(ear_damage,deaf)
if(ears.ear_damage >= 15)
to_chat(src, "Your ears start to ring badly!")
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 0620ebd062..e7cfd666de 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -66,12 +66,21 @@
var/obj/item/weapon/storage/wallet/wallet = wear_id
var/obj/item/device/pda/pda = wear_id
var/obj/item/weapon/card/id/id = wear_id
+ var/obj/item/device/modular_computer/tablet/tablet = wear_id
if(istype(wallet))
id = wallet.front_id
if(istype(id))
. = id.registered_name
else if(istype(pda))
. = pda.owner
+ else if(istype(tablet))
+ var/obj/item/weapon/computer_hardware/card_slot/card_slot = tablet.all_components[MC_CARD]
+ if(card_slot && (card_slot.stored_card2 || card_slot.stored_card))
+ if(card_slot.stored_card2) //The second card is the one used for authorization in the ID changing program, so we prioritize it here for consistency
+ . = card_slot.stored_card2.registered_name
+ else
+ if(card_slot.stored_card)
+ . = card_slot.stored_card.registered_name
if(!.)
. = if_no_id //to prevent null-names making the mob unclickable
return
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 7324e156a4..18c0c9ca4b 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -282,9 +282,9 @@
//Puke if toxloss is too high
if(!stat)
if(getToxLoss() >= 45 && nutrition > 20)
- lastpuke ++
- if(lastpuke >= 25) // about 25 second delay I guess
- vomit(20, 0, 1, 0, 1, 1)
+ lastpuke += prob(50)
+ if(lastpuke >= 50) // about 25 second delay I guess
+ vomit(20, toxic = TRUE)
lastpuke = 0
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index cf92de53e1..c1d26bb677 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1509,19 +1509,24 @@
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !(RESISTHOT in species_traits))
//Body temperature is too hot.
+ var/burn_damage
switch(H.bodytemperature)
if(360 to 400)
H.throw_alert("temp", /obj/screen/alert/hot, 1)
- H.apply_damage(HEAT_DAMAGE_LEVEL_1*heatmod, BURN)
+ burn_damage = HEAT_DAMAGE_LEVEL_1
if(400 to 460)
H.throw_alert("temp", /obj/screen/alert/hot, 2)
- H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN)
+ burn_damage = HEAT_DAMAGE_LEVEL_2
if(460 to INFINITY)
H.throw_alert("temp", /obj/screen/alert/hot, 3)
if(H.on_fire)
- H.apply_damage(HEAT_DAMAGE_LEVEL_3*heatmod, BURN)
+ burn_damage = HEAT_DAMAGE_LEVEL_3
else
- H.apply_damage(HEAT_DAMAGE_LEVEL_2*heatmod, BURN)
+ burn_damage = HEAT_DAMAGE_LEVEL_2
+ burn_damage *= heatmod
+ if((prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans
+ H.emote("scream")
+ H.apply_damage(burn_damage, BURN)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(GLOB.mutations_list[COLDRES] in H.dna.mutations))
switch(H.bodytemperature)
if(200 to 260)
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 5c56a34a20..0718a1bfdc 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -17,7 +17,7 @@
var/datum/reagent/consumable/nutri_check = chem
if(nutri_check.nutriment_factor > 0)
var/turf/pos = get_turf(H)
- H.vomit(0, 0, 0, 1, 1)
+ H.vomit(0, FALSE, FALSE, 2, TRUE)
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
H.visible_message("[H] vomits on the floor!", \
"You throw up on the floor!")
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 239d901e5c..fb581f0239 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -8,20 +8,26 @@
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT)
mutant_organs = list(/obj/item/organ/tongue/zombie)
+ var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
/datum/species/zombie/infectious
name = "Infectious Zombie"
id = "memezombies"
limbs_id = "zombie"
mutanthands = /obj/item/zombie_hand
- no_equip = list(slot_wear_mask, slot_head)
armor = 20 // 120 damage to KO a zombie, which kills it
speedmod = 2
mutanteyes = /obj/item/organ/eyes/night_vision/zombie
+/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
+ . = min(2, amount)
+
/datum/species/zombie/infectious/spec_life(mob/living/carbon/C)
. = ..()
C.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW
+ C.heal_overall_damage(4,4)
+ if(prob(4))
+ playsound(C, pick(spooks), 50, TRUE, 10)
if(C.InCritical())
C.death()
// Zombies only move around when not in crit, they instantly
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 839535f6c7..a05eb7b9d3 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -25,7 +25,7 @@
/mob/living/proc/getarmor(def_zone, type)
return 0
-//this returns the mob's protection against eye damage (number between -1 and 2)
+//this returns the mob's protection against eye damage (number between -1 and 2) from bright lights
/mob/living/proc/get_eye_protection()
return 0
@@ -33,6 +33,12 @@
/mob/living/proc/get_ear_protection()
return 0
+/mob/living/proc/is_mouth_covered(head_only = 0, mask_only = 0)
+ return FALSE
+
+/mob/living/proc/is_eyes_covered(check_glasses = 1, check_head = 1, check_mask = 1)
+ return FALSE
+
/mob/living/proc/on_hit(obj/item/projectile/P)
return
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 1608098ce7..6610c09968 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -171,7 +171,7 @@
var/icon/small_img = icon(temp_img) //Icon() is needed or else temp_img will be rescaled too >.>
var/icon/ic = icon('icons/obj/items.dmi',"photo")
small_img.Scale(8, 8)
- ic.Blend(small_img,ICON_OVERLAY, 10, 13)
+ ic.Blend(small_img,ICON_OVERLAY, 13, 13)
p.icon = ic
toner -= 5
busy = 1
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index e2447d6e4a..c5e18ccd5a 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -533,7 +533,6 @@
cut_overlays()
if(displayed)
add_overlay(getFlatIcon(displayed))
- add_overlay("frame-overlay")
/obj/item/wallframe/picture/after_attach(obj/O)
..()
@@ -591,13 +590,12 @@
/obj/structure/sign/picture_frame/attack_hand(mob/user)
if(framed)
- framed.show()
+ framed.show(user)
/obj/structure/sign/picture_frame/update_icon()
cut_overlays()
if(framed)
add_overlay(getFlatIcon(framed))
- add_overlay("frame-overlay")
/obj/structure/sign/picture_frame/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 34bf7b7f2f..5b00261fcf 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -33,7 +33,7 @@ By design, d1 is the smallest direction and d2 is the highest
icon_state = "0-1"
var/d1 = 0 // cable direction 1 (see above)
var/d2 = 1 // cable direction 2 (see above)
- layer = WIRE_LAYER //Above pipes, which are at GAS_PIPE_LAYER
+ layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER
var/cable_color = "red"
var/obj/item/stack/cable_coil/stored
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index f5d62ba611..c200f75488 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -1,6 +1,6 @@
/obj/machinery/power/emitter
- name = "Emitter"
- desc = "A heavy duty industrial laser.\nAlt-click to rotate it clockwise."
+ name = "emitter"
+ desc = "A heavy-duty industrial laser, often used in containment fields and power generation.\nAlt-click to rotate it clockwise."
icon = 'icons/obj/singularity.dmi'
icon_state = "emitter"
var/icon_state_on = "emitter_+a"
diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm
index d568b83e80..3a344ac94a 100644
--- a/code/modules/procedural_mapping/mapGenerators/repair.dm
+++ b/code/modules/procedural_mapping/mapGenerators/repair.dm
@@ -6,7 +6,7 @@
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/place(turf/T)
if(isclosedturf(T) && !ignore_wall)
return FALSE
- return TRUE
+ return ..()
/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten
ignore_wall = TRUE
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 550b27cd11..f0db6e5dba 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -532,6 +532,44 @@
color = "#DFDFDF"
taste_description = "mayonnaise"
+/datum/reagent/consumable/tearjuice
+ name = "Tear Juice"
+ id = "tearjuice"
+ description = "A blinding substance extracted from certain onions."
+ color = "#c0c9a0"
+ taste_description = "bitterness"
+
+/datum/reagent/consumable/tearjuice/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(!istype(M))
+ return
+ var/unprotected = FALSE
+ switch(method)
+ if(INGEST)
+ unprotected = TRUE
+ if(INJECT)
+ unprotected = FALSE
+ else //Touch or vapor
+ if(!M.is_mouth_covered() && !M.is_eyes_covered())
+ unprotected = TRUE
+ if(unprotected)
+ if(!M.getorganslot("eye_sight")) //can't blind somebody with no eyes
+ to_chat(M, "Your eye sockets feel wet.")
+ else
+ if(!M.eye_blurry)
+ to_chat(M, "Tears well up in your eyes!")
+ M.blind_eyes(2)
+ M.blur_eyes(5)
+ ..()
+
+/datum/reagent/consumable/tearjuice/on_mob_life(mob/living/M)
+ ..()
+ if(M.eye_blurry) //Don't worsen vision if it was otherwise fine
+ M.blur_eyes(4)
+ if(prob(10))
+ to_chat(M, "Your eyes sting!")
+ M.blind_eyes(2)
+
+
////Lavaland Flora Reagents////
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 11db7e8d68..4ac608e680 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -662,7 +662,7 @@
.=..()
if(current_cycle >=11 && prob(min(50,current_cycle)) && ishuman(M))
var/mob/living/carbon/human/H = M
- H.vomit(lost_nutrition = 10, blood = prob(10), stun = prob(50), distance = rand(0,4), message = TRUE, toxic = prob(30))
+ H.vomit(10, prob(10), prob(50), rand(0,4), TRUE, prob(30))
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
if(R != src)
H.reagents.remove_reagent(R.id,1)
@@ -672,7 +672,7 @@
if(current_cycle >=33 && prob(15) && ishuman(M))
var/mob/living/carbon/human/H = M
H.spew_organ()
- H.vomit(lost_nutrition = 0, blood = 1, stun = 1, distance = 4)
+ H.vomit(0, TRUE, TRUE, 4)
to_chat(H, "You feel something lumpy come up as you vomit.")
/datum/reagent/toxin/curare
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index be13516d3c..b7029ab3ad 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -55,7 +55,7 @@
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
- desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."
+ desc = "A highly pressurized water tank made to hold gargantuan amounts of water."
icon_state = "water_high" //I was gonna clean my room...
tank_volume = 100000
@@ -107,7 +107,7 @@
reagents.trans_to(W, W.max_fuel)
user.visible_message("[user] refills [user.p_their()] [W.name].", "You refill [W].")
playsound(src, 'sound/effects/refill.ogg', 50, 1)
- update_icon()
+ W.update_icon()
else
user.visible_message("[user] catastrophically fails at refilling [user.p_their()] [W.name]!", "That was stupid of you.")
var/message_admins = "[key_name_admin(user)] triggered a fueltank explosion via welding tool."
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index a8527f035b..edccdbf0f9 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -763,7 +763,6 @@
name = "Flash"
desc = "When a problem arises, SCIENCE is the solution."
id = "sflash"
- req_tech = list("magnets" = 3, "combat" = 2)
build_type = MECHFAB
materials = list(MAT_METAL = 750, MAT_GLASS = 750)
construction_time = 100
diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm
index 9367b38da7..5c9c0f6831 100644
--- a/code/modules/research/designs/smelting_designs.dm
+++ b/code/modules/research/designs/smelting_designs.dm
@@ -4,7 +4,7 @@
name = "Plasma + Iron alloy"
id = "plasteel"
build_type = SMELTER
- materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
+ materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/plasteel
category = list("initial")
@@ -13,7 +13,7 @@
name = "Plasma + Titanium alloy"
id = "plastitanium"
build_type = SMELTER
- materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT / 2, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT / 2)
+ materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_PLASMA = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/mineral/plastitanium
category = list("initial")
diff --git a/code/modules/server_tools/server_tools.dm b/code/modules/server_tools/server_tools.dm
index b14ba065eb..05c36930ad 100644
--- a/code/modules/server_tools/server_tools.dm
+++ b/code/modules/server_tools/server_tools.dm
@@ -5,7 +5,7 @@ GLOBAL_PROTECT(reboot_mode)
return params[SERVICE_WORLD_PARAM]
/world/proc/ExportService(command)
- return shell("python code/modules/server_tools/nudge.py \"[command]\"") == 0
+ return RunningService() && shell("python code/modules/server_tools/nudge.py \"[command]\"") == 0
/world/proc/IRCBroadcast(msg)
ExportService("[SERVICE_REQUEST_IRC_BROADCAST] [msg]")
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index a166be04a4..37d4a72276 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -277,7 +277,7 @@
else if((findtext(message, vomit_words)))
cooldown = COOLDOWN_STUN
for(var/mob/living/carbon/C in listeners)
- C.vomit(10 * power_multiplier)
+ C.vomit(10 * power_multiplier, distance = power_multiplier)
//SILENCE
else if((findtext(message, silence_words)))
diff --git a/html/changelogs/AutoChangeLog-pr-1463.yml b/html/changelogs/AutoChangeLog-pr-1463.yml
new file mode 100644
index 0000000000..4bd1dafa91
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1463.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - rscdel: "Cyborgs can no longer alt-click their material stacks to split them"
diff --git a/html/changelogs/AutoChangeLog-pr-1464.yml b/html/changelogs/AutoChangeLog-pr-1464.yml
new file mode 100644
index 0000000000..eef63289ff
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1464.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "Cremators now still work when there's only one thing in them"
diff --git a/html/changelogs/AutoChangeLog-pr-1465.yml b/html/changelogs/AutoChangeLog-pr-1465.yml
new file mode 100644
index 0000000000..148ba9dacd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1465.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - bugfix: "The ORM now uses the intended amount of resources when making alloys"
diff --git a/html/changelogs/AutoChangeLog-pr-1469.yml b/html/changelogs/AutoChangeLog-pr-1469.yml
new file mode 100644
index 0000000000..40807e7224
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1469.yml
@@ -0,0 +1,4 @@
+author: "oranges"
+delete-after: True
+changes:
+ - rscadd: "Added stungloves to the brain damage lines"
diff --git a/html/changelogs/AutoChangeLog-pr-1472.yml b/html/changelogs/AutoChangeLog-pr-1472.yml
new file mode 100644
index 0000000000..c86699c300
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1472.yml
@@ -0,0 +1,5 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "Added Prolonging Prism as an application scripture.
+balance: Prolonging Prism will delay the arrival of an emergency shuttle by 2 minutes at the cost of 2500W of power plus 75W for every 10 CV and 750W for every previous activation. In addition to the high cost, it very obviously affects the shuttle dock and leaves an obvious trail to the prism."
diff --git a/html/changelogs/AutoChangeLog-pr-1579.yml b/html/changelogs/AutoChangeLog-pr-1579.yml
new file mode 100644
index 0000000000..e4c9b97693
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1579.yml
@@ -0,0 +1,4 @@
+author: "Tacolizard"
+delete-after: True
+changes:
+ - bugfix: "Flamethrowers no longer say they're being ignited when you extinguish them"
diff --git a/html/changelogs/AutoChangeLog-pr-1619.yml b/html/changelogs/AutoChangeLog-pr-1619.yml
new file mode 100644
index 0000000000..7ba55f1784
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1619.yml
@@ -0,0 +1,4 @@
+author: "MrStonedOne and Lummox JR"
+delete-after: True
+changes:
+ - bugfix: "Fixed icon scaling and size preferences not loading (Technically size preferences were loading because byond saves that locally, but that's not reliable because ss13 shares a hub)"
diff --git a/html/changelogs/AutoChangeLog-pr-1627.yml b/html/changelogs/AutoChangeLog-pr-1627.yml
new file mode 100644
index 0000000000..83ff3839ef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1627.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscdel: "Cultists must be human to run for Cult Master status."
diff --git a/html/changelogs/AutoChangeLog-pr-1629.yml b/html/changelogs/AutoChangeLog-pr-1629.yml
new file mode 100644
index 0000000000..0e38b47fdf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1629.yml
@@ -0,0 +1,5 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - spellcheck: "The names of the hand drill, jaws of life, and emitter are now lowercase."
+ - spellcheck: "The descriptions of the hand drill, jaws of life, and emitter have been changed to be more descriptive and less lengthy."
diff --git a/html/changelogs/AutoChangeLog-pr-1634.yml b/html/changelogs/AutoChangeLog-pr-1634.yml
new file mode 100644
index 0000000000..a9aa70e1fc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1634.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - rscadd: "The botany vending machine now has a stock of onion seeds"
diff --git a/html/changelogs/AutoChangeLog-pr-1635.yml b/html/changelogs/AutoChangeLog-pr-1635.yml
new file mode 100644
index 0000000000..babfac7849
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1635.yml
@@ -0,0 +1,4 @@
+author: "Tacolizard"
+delete-after: True
+changes:
+ - rscdel: "Flashes no longer have a tech requirement"
diff --git a/html/changelogs/AutoChangeLog-pr-1639.yml b/html/changelogs/AutoChangeLog-pr-1639.yml
new file mode 100644
index 0000000000..b85743479e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1639.yml
@@ -0,0 +1,4 @@
+author: "optional name here"
+delete-after: True
+changes:
+ - bugfix: "Cryo cells work properly on mobs with varying max health values."
diff --git a/html/changelogs/AutoChangeLog-pr-1645.yml b/html/changelogs/AutoChangeLog-pr-1645.yml
new file mode 100644
index 0000000000..c505c6e736
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1645.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "NT now provides education on the proper response for experiencing the excrutiating pain of varying degree burns (You scream when burning)"
diff --git a/html/changelogs/AutoChangeLog-pr-1646.yml b/html/changelogs/AutoChangeLog-pr-1646.yml
new file mode 100644
index 0000000000..b25886e9ce
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1646.yml
@@ -0,0 +1,8 @@
+author: "RandomMarine"
+delete-after: True
+changes:
+ - tweak: "RCDs now always use matter consistent with the material needed when building."
+ - tweak: "Floors now cost 3 or 1 matter to build, based on if a lattice exists on the tile."
+ - tweak: "Reinforced windows cost 12 matter. Normal windows cost 8 matter. (Both up/down from 10)"
+ - tweak: "Glass airlocks cost 20 matter."
+ - tweak: "RCDs are faster at building grilles and plain glass windows."
diff --git a/html/changelogs/AutoChangeLog-pr-1650.yml b/html/changelogs/AutoChangeLog-pr-1650.yml
new file mode 100644
index 0000000000..6200fd1c5b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1650.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - rscadd: "Tablets with IDs in them now show the ID's name when examining someone with that tablet in their ID slot, similar to a PDA would."
diff --git a/html/changelogs/AutoChangeLog-pr-1654.yml b/html/changelogs/AutoChangeLog-pr-1654.yml
new file mode 100644
index 0000000000..4d2a21b60a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1654.yml
@@ -0,0 +1,4 @@
+author: "optional name here"
+delete-after: True
+changes:
+ - bugfix: "Puny windows will no longer stop the progress of Ratvar."
diff --git a/html/changelogs/AutoChangeLog-pr-1655.yml b/html/changelogs/AutoChangeLog-pr-1655.yml
new file mode 100644
index 0000000000..e3ad6e3ca2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1655.yml
@@ -0,0 +1,4 @@
+author: "Jay"
+delete-after: True
+changes:
+ - tweak: "Increases round time to a total of three hours. Two and a half before the call then another fifteen for the shuttle to arrive totaling at three."
diff --git a/html/changelogs/AutoChangeLog-pr-1658.yml b/html/changelogs/AutoChangeLog-pr-1658.yml
new file mode 100644
index 0000000000..24b5ee810a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1658.yml
@@ -0,0 +1,4 @@
+author: "optional name here"
+delete-after: True
+changes:
+ - rscadd: "1D4 into Lavaland Mining base crate."
diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi
index 361cfff40c..d80b077988 100644
Binary files a/icons/effects/64x64.dmi and b/icons/effects/64x64.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index e7c0e8d263..863f447e93 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 070d3531a2..9fc1520175 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 55a06a36fa..0aff0a2cbd 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 34c2c270a8..18bd0cc4e9 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 3c39e386b2..3757957d9a 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/interface/menu.dm b/interface/menu.dm
index b85af86fb4..c49067391e 100644
--- a/interface/menu.dm
+++ b/interface/menu.dm
@@ -68,10 +68,11 @@ GLOBAL_LIST_EMPTY(menulist)
var/atom/verb/verbpath = Get_checked(C)
if (!verbpath || !(verbpath in typesof("[type]/verb")))
return
+
if (copytext(verbpath.name,1,2) == "@")
- winset(C, null, "command = [copytext(verbpath.name,2)]")
+ winset(C, null, list2params(list("command" = copytext(verbpath.name,2))))
else
- winset(C, null, "command = [replacetext(verbpath.name, " ", "-")]")
+ winset(C, null, list2params(list("command" = replacetext(verbpath.name, " ", "-"))))
/datum/verbs/menu/Icon/Size
checkbox = CHECKBOX_GROUP
diff --git a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json
index 8312ad3095..ce3e726dbc 100644
--- a/strings/brain_damage_lines.json
+++ b/strings/brain_damage_lines.json
@@ -111,7 +111,8 @@
"kamelien",
"eksrey",
"glowey skin",
- "fungal tb"
+ "fungal tb",
+ "stun gloves"
],
"george": [
diff --git a/tgstation.dme b/tgstation.dme
index 11a60bddb3..c796ed4e6b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -469,6 +469,7 @@
#include "code\game\gamemodes\clock_cult\clock_structures\interdiction_lens.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\mania_motor.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\ocular_warden.dm"
+#include "code\game\gamemodes\clock_cult\clock_structures\prolonging_prism.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\ratvar_the_clockwork_justicar.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\taunting_trail.dm"
#include "code\game\gamemodes\clock_cult\clock_structures\tinkerers_cache.dm"
@@ -1423,6 +1424,7 @@
#include "code\modules\hydroponics\grown\misc.dm"
#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\potato.dm"
#include "code\modules\hydroponics\grown\pumpkin.dm"
#include "code\modules\hydroponics\grown\random.dm"
diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php
index c2f888603a..e9cd6af2fb 100644
--- a/tools/github_webhook_processor.php
+++ b/tools/github_webhook_processor.php
@@ -216,7 +216,7 @@ function handle_pr($payload) {
return;
}
- $msg = 'Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).'';
+ $msg = '['.$payload['pull_request']['base']['repo']['full_name'].'] Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).'';
sendtoallservers('?announce='.urlencode($msg), $payload);
}