Merge remote-tracking branch 'upstream/master' into fireflash-fixes

This commit is contained in:
joep van der velden
2021-08-15 10:14:43 +02:00
1099 changed files with 63152 additions and 89162 deletions
+1 -1
View File
@@ -458,7 +458,7 @@
ME2.Uses--
if(ME2.Uses <= 0) // give the notification that the slime core is dead
for(var/mob/living/M in seen)
to_chat(M, "<span class='notice'>[bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.</span>")
to_chat(M, "<span class='notice'>[bicon(my_atom)] [my_atom]'s power is consumed in the reaction.</span>")
ME2.name = "used slime extract"
ME2.desc = "This extract has been used up."
@@ -571,7 +571,7 @@
cell.update_icon()
cell.loc = get_turf(src)
cell = null
to_chat(user, "<span class='notice'>You remove the cell from the [src].</span>")
to_chat(user, "<span class='notice'>You remove the cell from [src].</span>")
update_icon()
return
..()
@@ -88,7 +88,7 @@
return
if(panel_open)
to_chat(user, "<span class='warning'>You can't use the [name] while it's panel is opened!</span>")
to_chat(user, "<span class='warning'>You can't use [src] while it's panel is opened!</span>")
return TRUE
if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks/drinkingglass))
@@ -246,7 +246,7 @@
if(!operating)
for (var/obj/item/O in holdingitems)
processing_chamber += "\A [O.name]<BR>"
processing_chamber += "\A [html_encode(O.name)]<BR>"
if (!processing_chamber)
is_chamber_empty = 1
@@ -39,7 +39,7 @@
M.SetParalysis(0, FALSE)
M.SetSilence(0, FALSE)
M.SetHallucinate(0)
REMOVE_TRAITS_NOT_IN(M, list(ROUNDSTART_TRAIT))
REMOVE_TRAITS_NOT_IN(M, list(ROUNDSTART_TRAIT, SPECIES_TRAIT))
M.SetDizzy(0)
M.SetDrowsy(0)
M.SetStuttering(0)
@@ -688,6 +688,25 @@
M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
return ..()
/datum/reagent/consumable/ethanol/adminfreeze
name = "Admin Freeze"
id = "adminfreeze"
description = "Ultimate Punishment."
reagent_state = LIQUID
color = "#30F0FF" // rgb: 048, 240, 255
dizzy_adj = 4
alcohol_perc = 1.5 // oof
drink_icon = "adminfreeze"
drink_name = "Admin Freeze"
drink_desc = "The ultimate punishment."
taste_description = "a series of bad decisions"
/datum/reagent/consumable/ethanol/adminfreeze/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume)
..()
if(method == REAGENT_INGEST)
M.apply_status_effect(/datum/status_effect/freon/watcher)
M.adjust_bodytemperature(-110)
/datum/reagent/consumable/ethanol/barefoot
name = "Barefoot"
id = "barefoot"
@@ -181,11 +181,11 @@
volume = ..()
M.apply_damage(0.4 * volume, BURN)
if(M.reagents)
if(M.reagents.has_reagent("teslium") && prob(0.6 * volume))
if(M.reagents.has_reagent("blob_teslium") && prob(0.6 * volume))
M.electrocute_act((0.5 * volume), "the blob's electrical discharge", 1, SHOCK_NOGLOVES)
M.reagents.del_reagent("teslium")
M.reagents.del_reagent("blob_teslium")
return //don't add more teslium after you shock it out of someone.
M.reagents.add_reagent("teslium", 0.125 * volume) // a little goes a long way
M.reagents.add_reagent("blob_teslium", 0.125 * volume) // a little goes a long way
/datum/reagent/blob/proc/send_message(mob/living/M)
var/totalmessage = message
@@ -640,18 +640,18 @@
/datum/reagent/rotatium/on_mob_life(mob/living/carbon/M)
if(M.hud_used)
if(current_cycle >= 20 && current_cycle % 20 == 0)
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
var/atom/movable/plane_master_controller/pm_controller = M.hud_used.plane_master_controllers[PLANE_MASTERS_GAME]
var/rotation = min(round(current_cycle / 20), 89) // By this point the player is probably puking and quitting anyway
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1)
for(var/key in pm_controller.controlled_planes)
animate(pm_controller.controlled_planes[key], transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1)
animate(transform = matrix(-rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING)
return ..()
/datum/reagent/rotatium/on_mob_delete(mob/living/M)
if(M && M.hud_used)
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
if(M?.hud_used)
var/atom/movable/plane_master_controller/pm_controller = M.hud_used.plane_master_controllers[PLANE_MASTERS_GAME]
for(var/key in pm_controller.controlled_planes)
animate(pm_controller.controlled_planes[key], transform = matrix(), time = 5, easing = QUAD_EASING)
..()
//////////////////////////////
@@ -774,8 +774,7 @@
if(M.getBruteLoss() + M.getFireLoss() + M.getCloneLoss() >= 150)
M.delayed_gib()
return
var/mob/dead/observer/ghost = M.get_ghost(TRUE)
if(ghost && !ghost.can_reenter_corpse) // DNR or AntagHUD
if(!M.ghost_can_reenter())
M.visible_message("<span class='warning'>[M] twitches slightly, but is otherwise unresponsive!</span>")
return
@@ -1011,7 +1010,7 @@
reagent_state = LIQUID
color = "#FFDCFF"
taste_description = "stability"
var/list/drug_list = list("crank","methamphetamine","space_drugs","psilocybin","ephedrine","epinephrine","stimulants","bath_salts","lsd","thc")
var/list/drug_list = list("crank", "methamphetamine", "space_drugs", "synaptizine", "psilocybin", "ephedrine", "epinephrine", "stimulants", "stimulative_agent", "bath_salts", "lsd", "thc")
/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
@@ -133,7 +133,6 @@
color = "#A8A8A8" // rgb: 168, 168, 168
taste_description = "a CPU"
/datum/reagent/copper
name = "Copper"
id = "copper"
@@ -141,6 +140,13 @@
color = "#6E3B08" // rgb: 110, 59, 8
taste_description = "copper"
/datum/reagent/copper/reaction_obj(obj/O, volume)
if(istype(O, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
volume = round(min(volume, M.amount), 1)
new /obj/item/stack/tile/brass(get_turf(M), volume)
M.use(volume)
/datum/reagent/chromium
name = "Chromium"
id = "chromium"
@@ -445,7 +451,7 @@
if(!istype(C))
return
if(C.mind)
if(C.mind.assigned_role == "Clown" || C.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD)
if(C.mind.assigned_role == "Clown")
to_chat(C, "<span class='notice'>Whatever that was, it feels great!</span>")
else if(C.mind.assigned_role == "Mime")
to_chat(C, "<span class='warning'>You feel nauseous.</span>")
@@ -463,7 +469,7 @@
var/update_flags = STATUS_UPDATE_NONE
if(prob(10))
M.emote("giggle")
if(M?.mind.assigned_role == "Clown" || M?.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD)
if(M?.mind.assigned_role == "Clown")
update_flags |= M.adjustBruteLoss(-1.5 * REAGENTS_EFFECT_MULTIPLIER) //Screw those pesky clown beatings!
else
M.AdjustDizzy(10, 0, 500)
@@ -29,7 +29,7 @@
/datum/reagent/consumable/drink/apple_pocalypse/on_mob_life(mob/living/M)
if(prob(1))
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 1, 0)
goonchem_vortex(T, TRUE, 0, TRUE) // Ignore the 0 volume
to_chat(M, "<span class='notice'>You briefly feel super-massive, like a black hole. Probably just your imagination...</span>")
return ..()
@@ -119,7 +119,7 @@
/datum/reagent/consumable/drink/grape_granade/on_mob_life(mob/living/M)
if(prob(1))
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 0, 0)
goonchem_vortex(T, FALSE, 0, TRUE) // Ignore the 0 volume
M.emote("burp")
to_chat(M, "<span class='notice'>You feel ready to burst! Oh wait, just a burp...</span>")
else if(prob(25))
@@ -1228,15 +1228,19 @@
color = "#20324D" //RGB: 32, 50, 77
metabolization_rate = 0.2
var/shock_timer = 0
//The random values assigned to the high and low number for the random time for shocks
var/shock_high = 30
var/shock_low = 5
var/use_chaotic_random = TRUE //Do you change the random number every cycle, or after shock is triggered
var/chosen_timer = 15 //The timer chosen last cycle, or every time they are shocked
process_flags = ORGANIC | SYNTHETIC
taste_description = "electricity"
/datum/reagent/teslium/on_mob_life(mob/living/M)
shock_timer++
if(shock_timer >= rand(5,30)) //Random shocks are wildly unpredictable
shock_timer = 0
M.electrocute_act(rand(5, 20), "Teslium in their body", 1, SHOCK_NOGLOVES) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
shock_proc(M)
return ..()
/datum/reagent/teslium/on_mob_add(mob/living/M)
@@ -1251,6 +1255,24 @@
H.physiology.siemens_coeff *= 0.5
..()
/datum/reagent/teslium/proc/shock_proc(mob/living/M)
if(use_chaotic_random)
chosen_timer = rand(shock_low, shock_high)
if(shock_timer >= chosen_timer)
shock_timer = 0
M.electrocute_act(rand(5, 20), "Teslium in their body", 1, SHOCK_NOGLOVES) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
chosen_timer = rand(shock_low, shock_high) //It needs to be randomised here for blob teslium, and randoming it here doesn't affect normal
/datum/reagent/teslium/blob //This version has it's shocks much less frequently, while retaining the shock multiplier
id = "blob_teslium"
shock_low = 10
use_chaotic_random = FALSE
/datum/reagent/teslium/blob/on_mob_add(mob/living/M)
..()
chosen_timer = rand(10, 30)
/datum/reagent/gluttonytoxin
name = "Gluttony's Blessing"
id = "gluttonytoxin"
@@ -57,30 +57,19 @@
taste_description = "floor cleaner"
/datum/reagent/space_cleaner/reaction_obj(obj/O, volume)
if(is_cleanable(O))
var/obj/effect/decal/cleanable/blood/B = O
if(!(istype(B) && B.off_floor))
qdel(O)
if(istype(O, /obj/effect))
var/obj/effect/E = O
if(E.is_cleanable())
var/obj/effect/decal/cleanable/blood/B = E
if(!(istype(B) && B.off_floor))
qdel(E)
else
if(O.simulated)
O.color = initial(O.color)
O.clean_blood()
/datum/reagent/space_cleaner/reaction_turf(turf/T, volume)
if(volume >= 1)
var/floor_only = TRUE
for(var/obj/effect/decal/cleanable/C in T)
var/obj/effect/decal/cleanable/blood/B = C
if(istype(B) && B.off_floor)
floor_only = FALSE
else
qdel(C)
T.color = initial(T.color)
if(floor_only)
T.clean_blood()
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(5, 10))
T.clean(volume >= 1)
/datum/reagent/space_cleaner/reaction_mob(mob/living/M, method=REAGENT_TOUCH, volume)
M.clean_blood()
@@ -265,16 +254,11 @@
M.SetConfused(0)
return
if(iscultist(M))
SSticker.mode.remove_cultist(M.mind)
SSticker.mode.remove_cultist(M.mind, TRUE, TRUE)
holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.SetJitter(0)
M.SetStuttering(0)
M.SetConfused(0)
if(ishuman(M)) // Unequip all cult clothing
var/mob/living/carbon/human/H = M
for(var/I in H.contents)
if(is_type_in_list(I, CULT_CLOTHING))
H.unEquip(I)
return
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80))
var/mob/living/carbon/V = M
+23 -4
View File
@@ -53,18 +53,37 @@
for(var/j = 1, j <= rand(1, 3), j++)
step(S, pick(NORTH,SOUTH,EAST,WEST))
/proc/goonchem_vortex(turf/T, setting_type, volume)
if(setting_type)
/**
* Throws or pulls objects to/from a chem reaction
*
* Scales the amount of objects thrown with the volume, unless ignore_volume is TRUE
*
* Arguments:
* * T - The turf to use as the throw from/to point
* * pull - Do we want to pull objects towards T (TRUE) or push them away from it (FALSE)
* * volume - The volume of reagents. Used to scale the effect is ignore_volume = FALSE
* * ignore_volume - Do we want to ignore the volume of reagents and just throw regardless
*/
/proc/goonchem_vortex(turf/T, pull, volume, ignore_volume = FALSE)
if(pull)
new /obj/effect/temp_visual/implosion(T)
playsound(T, 'sound/effects/whoosh.ogg', 25, 1) //credit to Robinhood76 of Freesound.org for this.
else
new /obj/effect/temp_visual/shockwave(T)
playsound(T, 'sound/effects/bang.ogg', 25, 1)
for(var/atom/movable/X in view(2 + setting_type + (volume > 30 ? 1 : 0), T))
// PARADISE EDIT: Allow only a certain amount of atoms to be pulled per unit
var/units_per_atom = 5
var/atoms_to_move = round(volume / units_per_atom)
var/moved_count = 0
// The ternary below isnt exactly needed, but it makes code more readable because `pull` is a bool
for(var/atom/movable/X in view(2 + (pull ? 1 : 0) + (volume > 30 ? 1 : 0), T))
if(istype(X, /obj/effect))
continue //stop pulling smoke and hotspots please
if(X && !X.anchored && X.move_resist <= MOVE_FORCE_DEFAULT)
if(setting_type)
if(pull)
X.throw_at(T, 20 + round(volume * 2), 1 + round(volume / 10))
else
X.throw_at(get_edge_target_turf(T, get_dir(T, X)), 20 + round(volume * 2), 1 + round(volume / 10))
moved_count++
if((moved_count >= atoms_to_move) && !ignore_volume)
break
@@ -443,6 +443,15 @@
result_amount = 4
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/chemical_reaction/adminfreeze
name = "Admin Freeze"
id = "adminfreeze"
result = "adminfreeze"
required_reagents = list("neurotoxin" = 1, "toxinsspecial" = 1, "fernet" = 1, "moonshine" = 1, "morphine" = 1)
min_temp = T0C + 100
result_amount = 5
mix_sound = 'sound/effects/adminhelp.ogg'
/datum/chemical_reaction/barefoot
name = "Barefoot"
id = "barefoot"
@@ -104,7 +104,7 @@
var/turf/T = get_turf(holder.my_atom)
if(!T)
return
goonchem_vortex(T, 0, created_volume)
goonchem_vortex(T, FALSE, created_volume)
/datum/chemical_reaction/sorium_explosion/sorium
name = "sorium_vortex"
@@ -133,7 +133,7 @@
var/turf/simulated/T = get_turf(holder.my_atom)
if(!T)
return
goonchem_vortex(T, 1, created_volume)
goonchem_vortex(T, TRUE, created_volume)
/datum/chemical_reaction/ldm_implosion/liquid_dark_matter
name = "LDM Vortex"
@@ -432,7 +432,7 @@
slime.update_name()
continue
slime.rabid = 1
slime.visible_message("<span class='danger'>The [slime] is driven into a frenzy!</span>")
slime.visible_message("<span class='danger'>[slime] is driven into a frenzy!</span>")
/datum/chemical_reaction/slimespeed
@@ -563,7 +563,7 @@
SSblackbox.record_feedback("tally", "slime_cores_used", 1, type)
if(holder.my_atom)
var/obj/item/stack/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom))
BC.visible_message("<span class='notice'>The [BC.name] appears out of thin air!</span>")
BC.visible_message("<span class='notice'>[BC] appears out of thin air!</span>")
//Cerulean
/datum/chemical_reaction/slimepsteroid2
@@ -115,7 +115,7 @@
/obj/item/reagent_containers/dropper/precision/viral_injector/attack(mob/living/M, mob/living/user, def_zone)
if(M.can_inject(user, TRUE))
to_chat(user, "<span class='warning'>You stab [M] with the [src].</span>")
to_chat(user, "<span class='warning'>You stealthily stab [M] with [src].</span>")
if(reagents.total_volume && M.reagents)
var/list/injected = list()
for(var/datum/reagent/R in reagents.reagent_list)
@@ -60,7 +60,7 @@
return
if(get_dist(get_turf(src), get_turf(injection_target)) > 1)
to_chat(injection_target, "<span class='userdanger'>The [src]'s' needle is ripped out of you!</span>")
to_chat(injection_target, "<span class='userdanger'>[src]'s needle is ripped out of you!</span>")
injection_target.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
end_processing()
return
@@ -18,7 +18,8 @@
return FALSE
bitesize = 0
if(M.eat(src, user))
user.drop_item()
if(user.get_active_hand() == src)
user.drop_item() // Only drop if they're holding the patch directly
forceMove(M)
LAZYADD(M.processing_patches, src)
return TRUE
@@ -78,6 +78,8 @@
for(var/atom/T in get_turf(D))
D.reagents.reaction(T)
sleep(3)
if(QDELETED(D))
return
qdel(D)
@@ -131,6 +133,9 @@
volume = 50
list_reagents = list("cleaner" = 50)
/obj/item/reagent_containers/spray/cleaner/drone/cyborg_recharge(coeff, emagged)
reagents.check_and_add("cleaner", volume, 3 * coeff)
//spray tan
/obj/item/reagent_containers/spray/spraytan
name = "spray tan"
+32 -21
View File
@@ -3,14 +3,19 @@
desc = "..."
icon = 'icons/obj/objects.dmi'
icon_state = "watertank"
density = 1
anchored = 0
density = TRUE
anchored = TRUE
pressure_resistance = 2*ONE_ATMOSPHERE
container_type = DRAINABLE | AMOUNT_VISIBLE
max_integrity = 300
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
var/lastrigger = "" // The last person to rig this fuel tank - Stored with the object. Only the last person matter for investigation
/// How much this dispenser can hold (In units)
var/tank_volume = 1000
/// The ID of the reagent that the dispenser uses
var/reagent_id = "water"
/// The last person to rig this fuel tank - Stored with the object. Only the last person matters for investigation
var/lastrigger = ""
/// Can this tank be unwrenched
var/can_be_unwrenched = TRUE
/// If the dispenser is being blown up already. Used to avoid multiple boom calls due to itself exploding etc
var/went_boom = FALSE
@@ -30,6 +35,19 @@
create_reagents(tank_volume)
reagents.add_reagent(reagent_id, tank_volume)
/obj/structure/reagent_dispensers/wrench_act(mob/user, obj/item/I)
if(!can_be_unwrenched)
return
. = TRUE
if(!I.tool_use_check(user, 0))
return
default_unfasten_wrench(user, I)
/obj/structure/reagent_dispensers/examine(mob/user)
. = ..()
if(can_be_unwrenched)
. += "<span class='notice'>The wheels look like they can be <b>[anchored ? "unlocked" : "locked in place"]</b> with a <b>wrench</b>."
/obj/structure/reagent_dispensers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
if(reagents)
@@ -214,8 +232,8 @@
name = "pepper spray refiller"
desc = "Contains condensed capsaicin for use in law \"enforcement.\""
icon_state = "pepper"
anchored = 1
density = 0
density = FALSE
can_be_unwrenched = FALSE
reagent_id = "condensedcapsaicin"
/obj/structure/reagent_dispensers/water_cooler
@@ -223,7 +241,6 @@
desc = "A machine that dispenses liquid to drink."
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"
anchored = 1
tank_volume = 500
reagent_id = "water"
var/paper_cups = 25 //Paper cups left from the cooler
@@ -242,12 +259,6 @@
user.put_in_hands(S)
paper_cups--
/obj/structure/reagent_dispensers/water_cooler/wrench_act(mob/user, obj/item/I)
. = TRUE
if(!I.tool_use_check(user, 0))
return
default_unfasten_wrench(user, I, 40)
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
desc = "Beer is liquid bread, it's good for you..."
@@ -271,22 +282,22 @@
name = "virus food dispenser"
desc = "A dispenser of low-potency virus mutagenic."
icon_state = "virus_food"
anchored = 1
density = 0
can_be_unwrenched = FALSE
density = FALSE
reagent_id = "virusfood"
/obj/structure/reagent_dispensers/spacecleanertank
name = "space cleaner refiller"
desc = "Refills space cleaner bottles."
icon_state = "cleaner"
anchored = 1
density = 0
can_be_unwrenched = FALSE
density = FALSE
tank_volume = 5000
reagent_id = "cleaner"
/obj/structure/reagent_dispensers/fueltank/chem
icon_state = "fuel_chem"
anchored = 1
density = 0
accepts_rig = 0
can_be_unwrenched = FALSE
density = FALSE
accepts_rig = FALSE
tank_volume = 1000