Merge branch 'Citadel-Station-13:master' into WanderingFox95-TribalOverhaul

This commit is contained in:
WanderingFox95
2021-09-19 21:32:03 +02:00
committed by GitHub
706 changed files with 34176 additions and 17253 deletions
+3 -3
View File
@@ -11,7 +11,7 @@
var/check_flags = 0
var/required_mobility_flags = MOBILITY_USE
var/processing = FALSE
var/obj/screen/movable/action_button/button = null
var/atom/movable/screen/movable/action_button/button = null
var/buttontooltipstyle = ""
var/transparent_when_unavailable = TRUE
var/use_target_appearance = FALSE
@@ -159,7 +159,7 @@
button.color = rgb(255,255,255,255)
return 1
/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE)
/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE)
if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force))
current_button.cut_overlays()
current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state))
@@ -821,7 +821,7 @@
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "storage_gather_switch"
/datum/action/item_action/storage_gather_mode/ApplyIcon(obj/screen/movable/action_button/current_button)
/datum/action/item_action/storage_gather_mode/ApplyIcon(atom/movable/screen/movable/action_button/current_button)
. = ..()
var/old_layer = target.layer
var/old_plane = target.plane
+60
View File
@@ -0,0 +1,60 @@
/datum/atmosphere
var/gas_string
var/id
var/list/base_gases // A list of gases to always have
var/list/normal_gases // A list of allowed gases:base_amount
var/list/restricted_gases // A list of allowed gases like normal_gases but each can only be selected a maximum of one time
var/restricted_chance = 10 // Chance per iteration to take from restricted gases
var/minimum_pressure
var/maximum_pressure
var/minimum_temp
var/maximum_temp
/datum/atmosphere/New()
generate_gas_string()
/datum/atmosphere/proc/generate_gas_string()
var/list/spicy_gas = restricted_gases.Copy()
var/target_pressure = rand(minimum_pressure, maximum_pressure)
var/pressure_scale = target_pressure / maximum_pressure
// First let's set up the gasmix and base gases for this template
// We make the string from a gasmix in this proc because gases need to calculate their pressure
var/datum/gas_mixture/gasmix = new
gasmix.set_temperature(rand(minimum_temp, maximum_temp))
for(var/i in base_gases)
gasmix.set_moles(i, base_gases[i])
// Now let the random choices begin
var/gastype
var/amount
while(gasmix.return_pressure() < target_pressure)
if(!prob(restricted_chance) || !length(spicy_gas))
gastype = pick(normal_gases)
amount = normal_gases[gastype]
else
gastype = pick(spicy_gas)
amount = spicy_gas[gastype]
spicy_gas -= gastype //You can only pick each restricted gas once
amount *= rand(50, 200) / 100 // Randomly modifes the amount from half to double the base for some variety
amount *= pressure_scale // If we pick a really small target pressure we want roughly the same mix but less of it all
amount = CEILING(amount, 0.1)
gasmix.adjust_moles(gastype, amount)
// That last one put us over the limit, remove some of it
if(gasmix.return_pressure() > target_pressure)
var/moles_to_remove = (1 - target_pressure / gasmix.return_pressure()) * gasmix.total_moles()
gasmix.adjust_moles(gastype, -moles_to_remove)
gasmix.set_moles(gastype, FLOOR(gasmix.get_moles(gastype), 0.1))
// Now finally lets make that string
var/list/gas_string_builder = list()
for(var/id in gasmix.get_gases())
gas_string_builder += "[id]=[gasmix.get_moles(id)]"
gas_string_builder += "TEMP=[gasmix.return_temperature()]"
gas_string = gas_string_builder.Join(";")
+48
View File
@@ -0,0 +1,48 @@
// Atmos types used for planetary airs
/datum/atmosphere/lavaland
id = LAVALAND_DEFAULT_ATMOS
base_gases = list(
GAS_O2=5,
GAS_N2=10,
)
normal_gases = list(
GAS_O2=10,
GAS_N2=10,
GAS_CO2=10,
)
restricted_gases = list(
GAS_BZ=0.1,
GAS_METHYL_BROMIDE=0.1,
)
restricted_chance = 30
minimum_pressure = HAZARD_LOW_PRESSURE + 10
maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1
minimum_temp = BODYTEMP_COLD_DAMAGE_LIMIT + 1
maximum_temp = 320
/datum/atmosphere/icemoon
id = ICEMOON_DEFAULT_ATMOS
base_gases = list(
GAS_O2=5,
GAS_N2=10,
)
normal_gases = list(
GAS_O2=10,
GAS_N2=10,
GAS_CO2=10,
)
restricted_gases = list(
GAS_METHYL_BROMIDE=0.1,
)
restricted_chance = 10
minimum_pressure = HAZARD_LOW_PRESSURE + 10
maximum_pressure = LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1
minimum_temp = 180
maximum_temp = 180
+1 -1
View File
@@ -47,7 +47,7 @@
"These words keep echoing in your mind. You find yourself completely fascinated by them.")]</span>")
to_chat(owner, "<span class='boldwarning'>You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\
as long as you act like the words are your highest priority.</span>")
var/obj/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /obj/screen/alert/hypnosis)
var/atom/movable/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /atom/movable/screen/alert/hypnosis)
hypno_alert.desc = "\"[hypnotic_phrase]\"... your mind seems to be fixated on this concept."
..()
+33
View File
@@ -264,3 +264,36 @@
speak_dejavu += speech_args[SPEECH_MESSAGE]
else
speak_dejavu += speech_args[SPEECH_MESSAGE]
/datum/brain_trauma/mild/redacted
name = "Confidentiality Trauma"
desc = "Patient's language neurons seem to be warped in a strange manner, resulting in them being unable to speak properly."
scan_desc = "<b>\[REDACTED]</b>"
gain_text = "<span class='warning'>You feel the need to <b>\[REDACTED]</b></span>"
lose_text = "<span class='notice'>You no longer feel the need to <b>\[REDACTED]</b>.</span>"
/datum/brain_trauma/mild/redacted/handle_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
if(message)
var/list/message_split = splittext(message, " ")
var/list/new_message = list()
for(var/word in message_split)
var/suffix = ""
var/suffix_foundon = 0
for(var/potential_suffix in list("." , "," , ";" , "!" , ":" , "?"))
suffix_foundon = findtext(word, potential_suffix, -length(potential_suffix))
if(suffix_foundon)
suffix = potential_suffix
break
if(suffix_foundon)
word = copytext(word, 1, suffix_foundon)
word = html_decode(word)
if(prob(25))
word = pick(list("<b>\[REDACTED]</b>", "<b>\[CLASSIFIED]</b>", "<b>\[EXPUNGED]</b>"))
new_message += word + suffix
message = jointext(new_message, " ")
speech_args[SPEECH_MESSAGE] = trim(message)
+1 -1
View File
@@ -164,7 +164,7 @@
/datum/brain_trauma/severe/monophobia/on_life()
..()
if(check_alone())
stress = min(stress + 0.5, 100)
stress = min(stress + 0.25, 100)
if(stress > 10 && (prob(5)))
stress_reaction()
else
+4 -4
View File
@@ -18,7 +18,7 @@
playing.play(watcher)
qdel(playing)
/obj/screen/cinematic
/atom/movable/screen/cinematic
icon = 'icons/effects/station_explosion.dmi'
icon_state = "station_intact"
plane = SPLASHSCREEN_PLANE
@@ -32,7 +32,7 @@
var/list/watching = list() //List of clients watching this
var/list/locked = list() //Who had mob_transforming set during the cinematic
var/is_global = FALSE //Global cinematics will override mob-specific ones
var/obj/screen/cinematic/screen
var/atom/movable/screen/cinematic/screen
var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc)
var/cleanup_time = 300 //How long for the final screen to remain
var/stop_ooc = TRUE //Turns off ooc when played globally.
@@ -74,7 +74,7 @@
ooc_toggled = TRUE
toggle_ooc(FALSE)
//Place /obj/screen/cinematic into everyone's screens, prevent them from moving
//Place /atom/movable/screen/cinematic into everyone's screens, prevent them from moving
for(var/MM in watchers)
var/mob/M = MM
show_to(M, M.client)
@@ -101,7 +101,7 @@
if(!C)
return
watching += C
M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop)
M.overlay_fullscreen("cinematic",/atom/movable/screen/fullscreen/cinematic_backdrop)
C.screen += screen
//Sound helper
+1
View File
@@ -71,6 +71,7 @@
R.update_icon()
to_chat(user, "<span class='info'>You strengthen [R], improving its resistance against melee, bullet and laser damage.</span>")
else
SEND_SIGNAL(O, COMSIG_ARMOR_PLATED, amount, maxamount)
to_chat(user, "<span class='info'>You strengthen [O], improving its resistance against melee attacks.</span>")
+5 -5
View File
@@ -7,7 +7,7 @@
var/mode_flags = COMBAT_MODE_INACTIVE
var/combatmessagecooldown
var/lastmousedir
var/obj/screen/combattoggle/hud_icon
var/atom/movable/screen/combattoggle/hud_icon
var/hud_loc
/datum/component/combat_mode/Initialize(hud_loc = ui_combat_toggle)
@@ -178,18 +178,18 @@
safe_disable_combat_mode(source)
/// The screen button.
/obj/screen/combattoggle
/atom/movable/screen/combattoggle
name = "toggle combat mode"
icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
icon_state = "combat_off"
var/mutable_appearance/flashy
var/combat_on = FALSE ///Wheter combat mode is enabled or not, so we don't have to store a reference.
/obj/screen/combattoggle/Click()
/atom/movable/screen/combattoggle/Click()
if(hud && usr == hud.mymob)
SEND_SIGNAL(hud.mymob, COMSIG_TOGGLE_COMBAT_MODE)
/obj/screen/combattoggle/update_icon_state()
/atom/movable/screen/combattoggle/update_icon_state()
var/mob/living/user = hud?.mymob
if(!user)
return
@@ -200,7 +200,7 @@
else
icon_state = "combat_off"
/obj/screen/combattoggle/update_overlays()
/atom/movable/screen/combattoggle/update_overlays()
. = ..()
var/mob/living/carbon/user = hud?.mymob
if(!(user?.client))
+3 -3
View File
@@ -5,10 +5,10 @@
/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL)
var/datum/hud/H = user.hud_used
for(var/huds in H.static_inventory)
if(istype(huds, /obj/screen/craft))
if(istype(huds, /atom/movable/screen/craft))
return
//We don't want to be stacking multiple crafting huds on relogs
var/obj/screen/craft/C = new()
var/atom/movable/screen/craft/C = new()
C.icon = H.ui_style
H.static_inventory += C
CL.screen += C
@@ -323,7 +323,7 @@
Deletion.Cut(Deletion.len)
qdel(DL)
/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user)
/datum/component/personal_crafting/proc/component_ui_interact(atom/movable/screen/craft/image, location, control, params, user)
if(user == parent)
ui_interact(user)
@@ -1,8 +1,8 @@
//This file is for glass working types of things!
/obj/item/glasswork
name = "This is a bug report it!"
desc = "Failer to code. Contact your local bug remover..."
name = "this is a bug!"
desc = "Uh oh, the coders did a fucky wucky! Contact your local code monkey and tell them about this!"
icon = 'icons/obj/glassworks.dmi'
w_class = WEIGHT_CLASS_SMALL
force = 1
@@ -11,45 +11,45 @@
tool_behaviour = null
/obj/item/glasswork/glasskit
name = "Glass working tools"
desc = "A lovely belt of most the tools you will need to shape, mold, and refine glass into more advanced shapes."
name = "glasswork tools"
desc = "A set of most the tools you will need to shape, mold, and refine glass into more advanced shapes."
icon_state = "glass_tools"
tool_behaviour = TOOL_GLASS_CUT //Cutting takes 20 ticks
/obj/item/glasswork/blowing_rod
name = "Glass working blow rod"
desc = "A hollow metal stick made for glass blowing."
name = "glassblowing rod"
desc = "A hollow metal rod made for blowing glass."
icon_state = "blowing_rods_unused"
tool_behaviour = TOOL_BLOW //Rods take 5 ticks
/obj/item/glasswork/glass_base //Welding takes 30 ticks
name = "Glass fodder sheet"
desc = "A sheet of glass set aside for glass working"
name = "glass fodder sheet"
desc = "A sheet of glass set aside for glass working."
icon_state = "glass_base"
var/next_step = null
var/rod = /obj/item/glasswork/blowing_rod
/obj/item/tea_plate
name = "Tea Plate"
name = "tea saucer"
desc = "A polished plate for a tea cup. How fancy!"
icon = 'icons/obj/glass_ware.dmi'
icon_state = "tea_plate"
/obj/item/tea_cup
name = "Tea Cup"
desc = "A glass cup made for fake tea!"
name = "tea cup"
desc = "A glass cup made for sipping tea!"
icon = 'icons/obj/glass_ware.dmi'
icon_state = "tea_plate"
//////////////////////Chem Disk/////////////////////
//Two Steps //
//Sells for 300 cr, takes 10 glass shets //
//Usefull for chem spliting //
//Useful for chem spliting //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/dish
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a small glass dish. Needs to be cut with some tools."
name = "glass fodder sheet (dish)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a small glass dish. It needs to be cut with some glassworking tools."
next_step = /obj/item/glasswork/glass_base/dish_part1
/obj/item/glasswork/glass_base/dish/attackby(obj/item/I, mob/user, params)
@@ -60,8 +60,8 @@
qdel(src)
/obj/item/glasswork/glass_base/dish_part1
name = "Half chem dish sheet"
desc = "A sheet of glass cut in half, looks like it still needs some more cutting down"
name = "half glass fodder sheet (dish)"
desc = "A sheet of glass cut in half. It looks like it still needs some more cutting down."
icon_state = "glass_base_half"
next_step = /obj/item/reagent_containers/glass/beaker/glass_dish
@@ -75,12 +75,12 @@
//////////////////////Lens//////////////////////////
//Six Steps //
//Sells for 1600 cr, takes 15 glass shets //
//Usefull for selling and later crafting //
//Useful for selling and later crafting //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/glass_lens
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a small glass lens. Needs to be cut with some tools."
name = "glass fodder sheet (lens)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a glass lens. It needs to be cut with some glassworking tools."
next_step = /obj/item/glasswork/glass_base/glass_lens_part1
/obj/item/glasswork/glass_base/glass_lens/attackby(obj/item/I, mob/user, params)
@@ -91,8 +91,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glass_lens_part1
name = "Glass fodder sheet"
desc = "Cut glass ready to be heated. Needs to be heated with some tools."
name = "half glass fodder sheet (lens)"
desc = "Cut glass ready to be heated with something very hot."
icon_state = "glass_base_half"
next_step = /obj/item/glasswork/glass_base/glass_lens_part2
@@ -104,8 +104,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glass_lens_part2
name = "Glass fodder sheet"
desc = "Cut glass that has been heated. Needs to be heated more with some tools."
name = "heated half glass fodder sheet (lens)"
desc = "Cut glass that has been heated once already and is ready to be heated again."
icon_state = "glass_base_heat"
next_step = /obj/item/glasswork/glass_base/glass_lens_part3
@@ -117,8 +117,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glass_lens_part3
name = "Glass fodder sheet"
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be placed onto a blow tube."
name = "heated glass blob (lens)"
desc = "Cut glass that has been heated into a blob. It needs to be attached to a glassblowing rod."
icon_state = "glass_base_molding"
next_step = /obj/item/glasswork/glass_base/glass_lens_part4
@@ -131,8 +131,8 @@
qdel(I)
/obj/item/glasswork/glass_base/glass_lens_part4
name = "Glass fodder sheet"
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be cut off onto a blow tube."
name = "glassblowing rod (lens)"
desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools."
icon_state = "blowing_rods_inuse"
next_step = /obj/item/glasswork/glass_base/glass_lens_part5
@@ -145,8 +145,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glass_lens_part5
name = "Unpolished glass lens"
desc = "A small unpolished glass lens. Could be polished with some cloth."
name = "unpolished glass lens"
desc = "An unpolished glass lens. It needs to be polished with some dry cloth."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "glass_optics"
next_step = /obj/item/glasswork/glass_base/glass_lens_part6
@@ -159,8 +159,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glass_lens_part6
name = "Unrefined glass lens"
desc = "A small polished glass lens. Just needs to be refined with some sandstone."
name = "unrefined glass lens"
desc = "A polished glass lens. It needs to be refined with some sandstone."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "glass_optics"
next_step = /obj/item/glasswork/glass_base/lens
@@ -174,12 +174,12 @@
//////////////////////Spouty Flask//////////////////
//Four Steps //
//Sells for 1200 cr, takes 20 glass shets //
//Usefull for selling and chemical things //
//Useful for selling and chemical things //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/spouty
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a spout beaker. Needs to be cut with some tools."
name = "Glass fodder sheet (spout)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a spouty flask. It needs to heated with something very hot."
next_step = /obj/item/glasswork/glass_base/spouty_part2
/obj/item/glasswork/glass_base/spouty/attackby(obj/item/I, mob/user, params)
@@ -190,8 +190,8 @@
qdel(src)
/obj/item/glasswork/glass_base/spouty_part2
name = "Glass fodder sheet"
desc = "Cut glass that has been heated. Needs to be heated with some tools."
name = "glass fodder sheet (spout)"
desc = "Cut glass ready to be heated with something very hot."
icon_state = "glass_base_half"
next_step = /obj/item/glasswork/glass_base/spouty_part3
@@ -203,8 +203,8 @@
qdel(src)
/obj/item/glasswork/glass_base/spouty_part3
name = "Glass fodder sheet"
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be placed onto a blow tube."
name = "heated glass blob (spout)"
desc = "Cut glass that has been heated into a blob. It needs to be attached to a glassblowing rod."
icon_state = "glass_base_molding"
next_step = /obj/item/glasswork/glass_base/spouty_part4
@@ -217,8 +217,8 @@
qdel(I)
/obj/item/glasswork/glass_base/spouty_part4
name = "Glass fodder sheet"
desc = "Cut glass that has been heated into a blob of hot glass. Needs to be cut off onto a blow tube."
name = "glassblowing rod (spout)"
desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools."
icon_state = "blowing_rods_inuse"
next_step = /obj/item/reagent_containers/glass/beaker/flask/spouty
@@ -233,12 +233,12 @@
//////////////////////Small Bulb Flask//////////////
//Two Steps //
//Sells for 600 cr, takes 5 glass shets //
//Usefull for selling and chemical things //
//Useful for selling and chemical things //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/flask_small
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a small flask. Needs to be heated with some tools."
name = "glass fodder sheet (small flask)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a small flask. It needs to heated with something very hot."
next_step = /obj/item/glasswork/glass_base/flask_small_part1
/obj/item/glasswork/glass_base/flask_small/attackby(obj/item/I, mob/user, params)
@@ -249,8 +249,8 @@
qdel(src)
/obj/item/glasswork/glass_base/flask_small_part1
name = "Metled glass"
desc = "A blob of metled glass, this one is ideal for a small flask. Needs to be blown with some tools."
name = "heated glass blob (small flask)"
desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod."
icon_state = "glass_base_molding"
next_step = /obj/item/glasswork/glass_base/flask_small_part2
@@ -263,8 +263,8 @@
qdel(I)
/obj/item/glasswork/glass_base/flask_small_part2
name = "Metled glass"
desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools."
name = "glassblowing rod (small flask)"
desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools."
icon_state = "blowing_rods_inuse"
next_step = /obj/item/reagent_containers/glass/beaker/flask
@@ -279,12 +279,12 @@
//////////////////////Large Bulb Flask//////////////
//Two Steps //
//Sells for 1000 cr, takes 15 glass shets //
//Usefull for selling and chemical things //
//Useful for selling and chemical things //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/flask_large
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a large flask. Needs to be heated with some tools."
name = "glass fodder sheet (large flask)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a large flask. It needs to heated with something very hot."
next_step = /obj/item/glasswork/glass_base/flask_large_part1
/obj/item/glasswork/glass_base/flask_large/attackby(obj/item/I, mob/user, params)
@@ -295,8 +295,8 @@
qdel(src)
/obj/item/glasswork/glass_base/flask_large_part1
name = "Metled glass"
desc = "A blob of metled glass, this one is ideal for a large flask. Needs to be blown with some tools."
name = "heated glass blob (large flask)"
desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod."
icon_state = "glass_base_molding"
next_step = /obj/item/glasswork/glass_base/flask_large_part2
@@ -309,8 +309,8 @@
qdel(I)
/obj/item/glasswork/glass_base/flask_large_part2
name = "Metled glass"
desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools."
name = "glassblowing rod (small flask)"
desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools."
icon_state = "blowing_rods_inuse"
next_step = /obj/item/reagent_containers/glass/beaker/flask/large
@@ -325,12 +325,12 @@
//////////////////////Tea Plates////////////////////
//Three Steps //
//Sells for 1000 cr, takes 5 glass shets //
//Usefull for selling and chemical things //
//Useful for selling and chemical things //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/tea_plate
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a tea plate, how fancy! Needs to be heated with some tools."
name = "glass fodder sheet (tea saucer)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a tea saucer. It needs to heated with something very hot."
next_step = /obj/item/glasswork/glass_base/tea_plate1
/obj/item/glasswork/glass_base/tea_plate/attackby(obj/item/I, mob/user, params)
@@ -341,8 +341,8 @@
qdel(src)
/obj/item/glasswork/glass_base/tea_plate1
name = "Metled glass"
desc = "A blob of metled glass, this one is ideal for a tea plate. Needs to be blown with some tools."
name = "heated glass blob (tea saucer)"
desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod."
icon_state = "glass_base_molding"
next_step = /obj/item/glasswork/glass_base/tea_plate2
@@ -355,8 +355,8 @@
qdel(I)
/obj/item/glasswork/glass_base/tea_plate2
name = "Metled glass"
desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools."
name = "glassblowing rod (tea saucer)"
desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools."
icon_state = "blowing_rods_inuse"
next_step = /obj/item/glasswork/glass_base/tea_plate3
@@ -369,8 +369,8 @@
qdel(src)
/obj/item/glasswork/glass_base/tea_plate3
name = "Disk of glass"
desc = "A disk of glass that can be cant be used for much. Needs to be polished with some cloth."
name = "unpolished glass saucer (tea saucer)"
desc = "An unpolished glass saucer. It needs to be polished with some dry cloth."
icon_state = "glass_base_half"
next_step = /obj/item/tea_plate
@@ -384,12 +384,12 @@
//////////////////////Tea Cup///////////////////////
//Four Steps //
//Sells for 1600 cr, takes 6 glass shets //
//Usefull for selling and chemical things //
//Useful for selling and chemical things //
////////////////////////////////////////////////////
/obj/item/glasswork/glass_base/tea_cup
name = "Glass fodder sheet"
desc = "A set of glass sheets set aside for glass working, this one is ideal for a tea cup, how fancy! Needs to be heated with some tools."
name = "glass fodder sheet (tea cup)"
desc = "A set of glass sheets set aside for glass working. This one is ideal for a tea cup. It needs to heated with something very hot."
next_step = /obj/item/glasswork/glass_base/tea_cup1
/obj/item/glasswork/glass_base/tea_cup/attackby(obj/item/I, mob/user, params)
@@ -400,8 +400,8 @@
qdel(src)
/obj/item/glasswork/glass_base/tea_cup1
name = "Metled glass"
desc = "A blob of metled glass, this one is ideal for a tea cup. Needs to be blown with some tools."
name = "heated glass blob (tea cup)"
desc = "Glass that has been heated into a blob. It needs to be attached to a glassblowing rod."
icon_state = "glass_base_molding"
next_step = /obj/item/glasswork/glass_base/tea_cup2
@@ -414,8 +414,8 @@
qdel(I)
/obj/item/glasswork/glass_base/tea_cupe2
name = "Metled glass"
desc = "A blob of metled glass on the end of a blowing rod. Needs to be cut off with some tools."
name = "glassblowing rod (tea cup)"
desc = "A hollow metal rod made for blowing glass. There is a blob of shapen glass at the end of it that needs to be cut off with some glassworking tools."
icon_state = "blowing_rods_inuse"
next_step = /obj/item/glasswork/glass_base/tea_cup3
@@ -428,8 +428,8 @@
qdel(src)
/obj/item/glasswork/glass_base/tea_cup3
name = "Disk of glass"
desc = "A bowl of glass that can be cant be used for much. Needs to be polished with some cloth."
name = "unpolished glass cup (tea cup)"
desc = "An unpolished glass cup. It needs to be polished with some dry cloth."
icon_state = "glass_base_half"
next_step = /obj/item/glasswork/glass_base/tea_cup4
@@ -441,8 +441,8 @@
qdel(src)
/obj/item/glasswork/glass_base/tea_cup4
name = "Disk of glass"
desc = "A bowl of polished glass that can be cant be used for much. Needs some more glass to make a handle."
name = "polished glass cup (tea cup)"
desc = "A polished glass cup. It needs some extra glass to form a handle."
icon_state = "glass_base_half"
next_step = /obj/item/tea_cup
@@ -1,15 +1,15 @@
//This file is for crafting using a lens!
/obj/item/glasswork/glass_base/lens
name = "Optical lens"
desc = "Good for selling or crafting, by itself its useless"
name = "optical lens"
desc = "A glass lens. Useless by itself, but may prove useful in making something with a focus."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "glass_optics"
//Laser pointers - 2600
/obj/item/glasswork/glass_base/laserpointer_shell
name = "Laser pointer assembly"
desc = "Good for selling or crafting, by itself its useless. Needs a power capactor."
name = "laser pointer assembly"
desc = "An empty hull of a laser pointer. It's missing a capacitor."
icon_state = "laser_case"
icon = 'icons/obj/glass_ware.dmi'
next_step = /obj/item/glasswork/glass_base/laserpointer_shell_1
@@ -21,8 +21,8 @@
qdel(src)
/obj/item/glasswork/glass_base/laserpointer_shell_1
name = "Laser pointer assembly"
desc = "Good for selling or crafting, by itself its useless. Needs a glass lens."
name = "powered laser pointer assembly"
desc = "A laser pointer hull with a capacitor inside of it. It's missing a lens."
icon_state = "laser_wire"
icon_state = "laser_case"
next_step = /obj/item/glasswork/glass_base/laserpointer_shell_2
@@ -34,8 +34,8 @@
qdel(src)
/obj/item/glasswork/glass_base/laserpointer_shell_2
name = "Laser pointer assembly"
desc = "Good for selling or crafting, by itself its useless. Needs to be screwed together."
name = "near-complete laser pointer assembly"
desc = "A laser pointer hull with a capacitor and a lens inside of it. It needs to be screwed together."
icon_state = "laser_wire"
icon_state = "laser_case"
next_step = /obj/item/laser_pointer/blue/handmade
@@ -50,8 +50,8 @@
//NERD SHIT - 5000
/obj/item/glasswork/glass_base/glasses_frame
name = "Glasses Frame"
desc = "Good for crafting a pare of glasses, by itself its useless. Just add a pare of lens."
name = "glasses frame"
desc = "A pair of glasses without the lenses. You could probably add them yourself, though."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "frames"
next_step = /obj/item/glasswork/glass_base/glasses_frame_1
@@ -64,8 +64,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glasses_frame_1
name = "Glasses Frame"
desc = "Good for crafting a pare of glasses, by itself its useless. Just add a the other lens."
name = "glasses frame"
desc = "A pair of shoddily-assembled glasses with only one lens. You could probably add the second one yourself, though."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "frames_1"
next_step = /obj/item/glasswork/glass_base/glasses_frame_2
@@ -78,8 +78,8 @@
qdel(src)
/obj/item/glasswork/glass_base/glasses_frame_2
name = "Glasses Frame"
desc = "Good for crafting a pare of glasses, by itself its useless. Just adjust the pices into the frame with a screwdriver."
name = "glasses frame"
desc = "A pair of hastily-assembled unfitted glasses with both lenses intact. Use a screwdriver to fit them."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "frames_2"
next_step = /obj/item/glasswork/glasses
@@ -92,7 +92,7 @@
qdel(src)
/obj/item/glasswork/glasses
name = "Handmade Glasses"
desc = "Handmade glasses that have not been polished at all making them useless. Selling them could still be worth a few credits."
name = "handmade glasses"
desc = "A pair of poorly-assembled glasses clearly produced by someone with no qualifications in making glasses. They're smudged, ugly, and don't even fit you. They might be worth some money, though."
icon = 'icons/obj/glass_ware.dmi'
icon_state = "frames_2"
+1 -1
View File
@@ -142,7 +142,7 @@
if(harmful)
victim.visible_message("<span class='danger'>[weapon] embeds itself in [victim]'s [limb.name]!</span>",ignored_mobs=victim)
to_chat(victim, "<span class='userdanger'>[weapon] embeds itself in your [limb.name]!</span>")
victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
victim.throw_alert("embeddedobject", /atom/movable/screen/alert/embeddedobject)
playsound(victim,'sound/weapons/bladeslice.ogg', 40)
weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody!
damage = weapon.w_class * impact_pain_mult
+1 -1
View File
@@ -13,7 +13,7 @@
var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets
var/list/datum/mood_event/mood_events = list()
var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much?
var/obj/screen/mood/screen_obj
var/atom/movable/screen/mood/screen_obj
var/datum/skill_modifier/bad_mood/malus
var/datum/skill_modifier/great_mood/bonus
var/static/malus_id = 0
+1 -1
View File
@@ -90,7 +90,7 @@
return
SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_END, orbiter, refreshing)
UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED)
orbiter.SpinAnimation(0, 0)
orbiter.SpinAnimation(0, 0, parallel = FALSE)
if(istype(orbiters[orbiter],/matrix)) //This is ugly.
orbiter.transform = orbiters[orbiter]
orbiters -= orbiter
@@ -135,6 +135,8 @@
var/obj/item/I = AM
var/mob/M = parent.loc
I.dropped(M)
I.item_flags &= ~IN_STORAGE
I.remove_outline()
if(new_location)
AM.forceMove(new_location) // exited comsig will handle removal reset.
//We don't want to call this if the item is being destroyed
@@ -180,6 +182,7 @@
I.forceMove(parent.drop_location())
return FALSE
I.on_enter_storage(master)
I.item_flags |= IN_STORAGE
refresh_mob_views()
I.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt
if(M)
+6 -3
View File
@@ -423,6 +423,9 @@
var/atom/A = parent
if(ismob(M)) //all the check for item manipulation are in other places, you can safely open any storages as anything and its not buggy, i checked
A.add_fingerprint(M)
if(istype(A, /obj/item))
var/obj/item/I = A
I.remove_outline() //Removes the outline when we drag
if(!over_object)
return FALSE
if(ismecha(M.loc)) // stops inventory actions in a mech
@@ -435,15 +438,15 @@
RevenantThrow(over_object, M, source)
return
if(!M.incapacitated())
if(!istype(over_object, /obj/screen))
if(!istype(over_object, /atom/movable/screen))
dump_content_at(over_object, M)
return
if(A.loc != M)
return
playsound(A, "rustle", 50, 1, -5)
A.do_jiggle()
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(istype(over_object, /atom/movable/screen/inventory/hand))
var/atom/movable/screen/inventory/hand/H = over_object
M.putItemFromInventoryInHandIfPossible(A, H.held_index)
return
A.add_fingerprint(M)
+11 -11
View File
@@ -20,8 +20,8 @@
. = list()
var/list/accessible_contents = accessible_items()
var/adjusted_contents = length(accessible_contents)
var/obj/screen/storage/close/ui_close
var/obj/screen/storage/boxes/ui_boxes
var/atom/movable/screen/storage/close/ui_close
var/atom/movable/screen/storage/boxes/ui_boxes
//Numbered contents display
var/list/datum/numbered_display/numbered_contents
@@ -62,7 +62,7 @@
for(var/obj/O in accessible_items())
if(QDELETED(O))
continue
var/obj/screen/storage/item_holder/D = new(null, src, O)
var/atom/movable/screen/storage/item_holder/D = new(null, src, O)
D.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip"
D.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]"
O.maptext = ""
@@ -81,9 +81,9 @@
*/
/datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns)
. = list()
var/obj/screen/storage/left/ui_left
var/obj/screen/storage/continuous/ui_continuous
var/obj/screen/storage/close/ui_close
var/atom/movable/screen/storage/left/ui_left
var/atom/movable/screen/storage/continuous/ui_continuous
var/atom/movable/screen/storage/close/ui_close
// Generate ui_item_blocks for missing ones and render+orient.
var/list/atom/contents = accessible_items()
@@ -137,7 +137,7 @@
for(var/i in percentage_by_item)
I = i
var/percent = percentage_by_item[I]
var/obj/screen/storage/volumetric_box/center/B = new /obj/screen/storage/volumetric_box/center(null, src, I)
var/atom/movable/screen/storage/volumetric_box/center/B = new /atom/movable/screen/storage/volumetric_box/center(null, src, I)
var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)
var/addrow = FALSE
if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1))
@@ -255,22 +255,22 @@
* Gets our ui_boxes, making it if it doesn't exist.
*/
/datum/component/storage/proc/get_ui_boxes()
return new /obj/screen/storage/boxes(null, src)
return new /atom/movable/screen/storage/boxes(null, src)
/**
* Gets our ui_left, making it if it doesn't exist.
*/
/datum/component/storage/proc/get_ui_left()
return new /obj/screen/storage/left(null, src)
return new /atom/movable/screen/storage/left(null, src)
/**
* Gets our ui_close, making it if it doesn't exist.
*/
/datum/component/storage/proc/get_ui_close()
return new /obj/screen/storage/close(null, src)
return new /atom/movable/screen/storage/close(null, src)
/**
* Gets our ui_continuous, making it if it doesn't exist.
*/
/datum/component/storage/proc/get_ui_continuous()
return new /obj/screen/storage/continuous(null, src)
return new /atom/movable/screen/storage/continuous(null, src)
+3 -3
View File
@@ -370,7 +370,7 @@
user.emote("scream")
user.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped) // oopsie indeed!
shake_camera(user, 7, 7)
user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash)
user.clear_fullscreen("flash", 4.5)
if(94 to 98)
@@ -381,7 +381,7 @@
user.gain_trauma_type(BRAIN_TRAUMA_MILD)
user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9)
shake_camera(user, 6, 6)
user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash)
user.clear_fullscreen("flash", 3.5)
if(84 to 93)
@@ -394,7 +394,7 @@
user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9)
user.DefaultCombatKnockdown(40)
shake_camera(user, 5, 5)
user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash)
user.clear_fullscreen("flash", 2.5)
if(64 to 83)
+3 -2
View File
@@ -10,6 +10,7 @@
var/mob/living/L = parent
if(L.incapacitated() || L.lying)
return
var/matrix/otransform = matrix(L.transform) //make a copy of the current transform
animate(L, pixel_z = 4, time = 0)
animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2)
animate(pixel_z = 0, transform = matrix(), time = 0)
animate(pixel_z = 0, transform = turn(L.transform, pick(-12, 0, 12)), time=2) //waddle.
animate(pixel_z = 0, transform = otransform, time = 0) //return to previous transform.
+5 -1
View File
@@ -57,9 +57,13 @@
*/
var/list/cooldowns
#ifdef TESTING
#ifdef REFERENCE_TRACKING
var/running_find_references
var/last_find_references = 0
#ifdef REFERENCE_TRACKING_DEBUG
///Stores info about where refs are found, used for sanity checks and testing
var/list/found_refs
#endif
#endif
#ifdef DATUMVAR_DEBUGGING_MODE
@@ -159,9 +159,9 @@
/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
if(!istype(C))
return
C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
C.reagents.metabolize(C, SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
if(triple_metabolism)
C.reagents.metabolize(C, can_overdose=TRUE)
C.reagents.metabolize(C, SSMOBS_DT, 0, can_overdose=TRUE)
C.overeatduration = max(C.overeatduration - 2, 0)
var/lost_nutrition = 9 - (reduced_hunger * 5)
C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed
@@ -47,7 +47,7 @@ Bonus
M.adjustOxyLoss(-7, 0)
M.losebreath = max(0, M.losebreath - 4)
if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
M.blood_volume += 1
M.adjust_integration_blood(1)
else
if(prob(base_message_chance))
to_chat(M, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
@@ -32,10 +32,8 @@ BONUS
var/mob/living/M = A.affected_mob
switch(A.stage)
if(5)
var/static/list/banned_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/invisible, /datum/reagent/colorful_reagent/crayonpowder/white)
var/color = pick(subtypesof(/datum/reagent/colorful_reagent/crayonpowder) - banned_reagents)
if(M.reagents.total_volume <= (M.reagents.maximum_volume/10)) // no flooding humans with 1000 units of colorful reagent
M.reagents.add_reagent(color, 5)
M.reagents.add_reagent(/datum/reagent/colorful_reagent, 5)
else
if (prob(50)) // spam
M.visible_message("<span class='warning'>[M] looks rather vibrant...</span>", "<span class='notice'>The colors, man, the colors...</span>")
+8
View File
@@ -386,6 +386,14 @@
qdel(language_holder)
var/species_holder = initial(mrace.species_language_holder)
language_holder = new species_holder(src)
var/mob/living/carbon/human/H = src
//provide the user's additional language to the new language holder even if they change species
if(H.additional_language && H.additional_language != "None")
var/language_entry = GLOB.roundstart_languages[H.additional_language]
if(language_entry)
grant_language(language_entry, TRUE, TRUE)
update_atom_languages()
/mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE)
+1 -1
View File
@@ -1,5 +1,5 @@
/datum/element/trash
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
element_flags = ELEMENT_DETACH
/datum/element/trash/Attach(datum/target)
. = ..()
@@ -0,0 +1,32 @@
/**
Stack End Detector.
Can detect if a given code stack has exited, used by the mc for stack overflow detection.
**/
/datum/stack_end_detector
var/datum/weakref/_WF
var/datum/stack_canary/_canary
/datum/stack_end_detector/New()
_canary = new()
_WF = WEAKREF(_canary)
/** Prime the stack overflow detector.
Store the return value of this proc call in a proc level var.
Can only be called once.
**/
/datum/stack_end_detector/proc/prime_canary()
if (!_canary)
CRASH("Prime_canary called twice")
. = _canary
_canary = null
/// Returns true if the stack is still going. Calling before the canary has been primed also returns true
/datum/stack_end_detector/proc/check()
return !!_WF.resolve()
/// Stack canary. Will go away if the stack it was primed by is ended by byond for return or stack overflow reasons.
/datum/stack_canary
/// empty proc to avoid warnings about unused variables. Call this proc on your canary in the stack it's watching.
/datum/stack_canary/proc/use_variable()
+11 -3
View File
@@ -6,10 +6,12 @@
var/body
var/headers
var/url
/// If present response body will be saved to this file.
var/output_file
var/_raw_response
/datum/http_request/proc/prepare(method, url, body = "", list/headers)
/datum/http_request/proc/prepare(method, url, body = "", list/headers, output_file)
if (!length(headers))
headers = ""
else
@@ -19,15 +21,16 @@
src.url = url
src.body = body
src.headers = headers
src.output_file = output_file
/datum/http_request/proc/execute_blocking()
_raw_response = rustg_http_request_blocking(method, url, body, headers)
_raw_response = rustg_http_request_blocking(method, url, body, headers, build_options())
/datum/http_request/proc/begin_async()
if (in_progress)
CRASH("Attempted to re-use a request object.")
id = rustg_http_request_async(method, url, body, headers)
id = rustg_http_request_async(method, url, body, headers, build_options())
if (isnull(text2num(id)))
stack_trace("Proc error: [id]")
@@ -35,6 +38,11 @@
else
in_progress = TRUE
/datum/http_request/proc/build_options()
if(output_file)
return json_encode(list("output_filename"=output_file,"body_filename"=null))
return null
/datum/http_request/proc/is_complete()
if (isnull(id))
return TRUE
+4 -1
View File
@@ -10,11 +10,14 @@
// And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var
// Helper similar to image()
/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF")
/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, color = "#FFFFFF")
var/mutable_appearance/MA = new()
MA.icon = icon
MA.icon_state = icon_state
MA.layer = layer
MA.plane = plane
MA.alpha = alpha
MA.appearance_flags |= appearance_flags
MA.color = color
return MA
+1 -1
View File
@@ -6,5 +6,5 @@
/datum/numbered_display/New(obj/item/sample, _number = 1, datum/component/storage/parent)
if(!istype(sample))
qdel(src)
sample_object = new /obj/screen/storage/item_holder(null, parent, sample)
sample_object = new /atom/movable/screen/storage/item_holder(null, parent, sample)
number = _number
+53 -12
View File
@@ -35,6 +35,14 @@
cost = 10
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/library
name = "Lavaland Library"
id = "llibrary"
description = "A once grand library, now lost to the confines of lavaland."
suffix = "lavaland_surface_library.dmm"
cost = 5
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/seed_vault
name = "Seed Vault"
id = "seed-vault"
@@ -79,6 +87,20 @@
suffix = "lavaland_surface_animal_hospital.dmm"
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/hotsprings
name = "Hot Springs"
id = "lhotsprings"
description = "Just relax and take a dip! Lavaland's finest hot springs await!"
suffix = "lavaland_surface_hotsprings.dmm"
/datum/map_template/ruin/lavaland/engioutpost
name = "Engineer Outpost"
id = "lengioutpost"
description = "Blown up by an unfortunate accident."
suffix = "lavaland_surface_engioutpost.dmm"
cost = 10
allow_duplicates = FALSE
/datum/map_template/ruin/lavaland/sin
cost = 10
allow_duplicates = FALSE
@@ -115,6 +137,24 @@
suffix = "lavaland_surface_sloth.dmm"
// Generates nothing but atmos runtimes and salt
/datum/map_template/ruin/lavaland/sin/lust
name = "Ruin of Lust"
id = "llust"
description = "Not exactly what you expected."
suffix = "lavaland_surface_lust.dmm"
/datum/map_template/ruin/lavaland/sin/wrath
name = "Ruin of Wrath"
id = "lwrath"
description = "You'll fight and fight and just keep fighting."
suffix = "lavaland_surface_wrath.dmm"
/datum/map_template/ruin/lavaland/bathhouse
name = "Bath House"
id = "lbathhouse"
description = "A taste of paradise, locked in the hell of Lavaland."
suffix = "lavaland_surface_bathhouse.dmm"
/datum/map_template/ruin/lavaland/ratvar
name = "Dead God"
id = "ratvar"
@@ -132,19 +172,20 @@
/datum/map_template/ruin/lavaland/blood_drunk_miner
name = "Blood-Drunk Miner"
id = "blooddrunk"
description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them."
suffix = "lavaland_surface_blooddrunk1.dmm"
description = "An insane, beastly miner contemplating stone tiles..."
always_place = TRUE
allow_duplicates = FALSE //will only spawn one variant of the ruin
/datum/map_template/ruin/lavaland/blood_drunk_miner/guidance
name = "Blood-Drunk Miner (Guidance)"
suffix = "lavaland_surface_blooddrunk2.dmm"
/datum/map_template/ruin/lavaland/blood_drunk_miner/hunter
name = "Blood-Drunk Miner (Hunter)"
suffix = "lavaland_surface_blooddrunk3.dmm"
allow_duplicates = FALSE
id = "blooddrunk"
/datum/map_template/ruin/lavaland/blood_drunk_miner/New()
if(prob(25))
suffix = "lavaland_surface_blooddrunk1.dmm"
else if(prob(34))
suffix = "lavaland_surface_blooddrunk2.dmm"
else if(prob(50))
suffix = "lavaland_surface_blooddrunk3.dmm"
else
suffix = "lavaland_surface_mining_site.dmm"
. = ..()
/datum/map_template/ruin/lavaland/ufo_crash
name = "UFO Crash"
+30 -30
View File
@@ -3,9 +3,9 @@
/datum/status_effect/shadow_mend
id = "shadow_mend"
duration = 30
alert_type = /obj/screen/alert/status_effect/shadow_mend
alert_type = /atom/movable/screen/alert/status_effect/shadow_mend
/obj/screen/alert/status_effect/shadow_mend
/atom/movable/screen/alert/status_effect/shadow_mend
name = "Shadow Mend"
desc = "Shadowy energies wrap around your wounds, sealing them at a price. After healing, you will slowly lose health every three seconds for thirty seconds."
icon_state = "shadow_mend"
@@ -29,9 +29,9 @@
id = "void_price"
duration = 300
tick_interval = 30
alert_type = /obj/screen/alert/status_effect/void_price
alert_type = /atom/movable/screen/alert/status_effect/void_price
/obj/screen/alert/status_effect/void_price
/atom/movable/screen/alert/status_effect/void_price
name = "Void Price"
desc = "Black tendrils cinch tightly against you, digging wicked barbs into your flesh."
icon_state = "shadow_mend"
@@ -46,17 +46,17 @@
duration = 200
tick_interval = 0 //tick as fast as possible
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/vanguard
alert_type = /atom/movable/screen/alert/status_effect/vanguard
var/datum/progressbar/progbar
var/stamhealed = 0 //How much stamina did we regenerate?
/obj/screen/alert/status_effect/vanguard
/atom/movable/screen/alert/status_effect/vanguard
name = "Vanguard"
desc = "You're absorbing stuns aswell as quickly regenerating stamina, but be careful: 50% of stamina restored and 25% of stuns absorbed will affect you after this effect ends."
icon_state = "vanguard"
alerttooltipstyle = "clockcult"
/obj/screen/alert/status_effect/vanguard/MouseEntered(location,control,params)
/atom/movable/screen/alert/status_effect/vanguard/MouseEntered(location,control,params)
var/mob/living/L = usr
var/datum/status_effect/vanguard_shield/E = attached_effect
if(istype(L)) //this is probably more safety than actually needed
@@ -118,9 +118,9 @@
/datum/status_effect/inathneqs_endowment
id = "inathneqs_endowment"
duration = 150
alert_type = /obj/screen/alert/status_effect/inathneqs_endowment
alert_type = /atom/movable/screen/alert/status_effect/inathneqs_endowment
/obj/screen/alert/status_effect/inathneqs_endowment
/atom/movable/screen/alert/status_effect/inathneqs_endowment
name = "Inath-neq's Endowment"
desc = "Adrenaline courses through you as the Resonant Cogwheel's energy shields you from all harm!"
icon_state = "inathneqs_endowment"
@@ -149,7 +149,7 @@
/datum/status_effect/cyborg_power_regen
id = "power_regen"
duration = 100
alert_type = /obj/screen/alert/status_effect/power_regen
alert_type = /atom/movable/screen/alert/status_effect/power_regen
var/power_to_give = 0 //how much power is gained each tick
/datum/status_effect/cyborg_power_regen/on_creation(mob/living/new_owner, new_power_per_tick)
@@ -157,7 +157,7 @@
if(. && isnum(new_power_per_tick))
power_to_give = new_power_per_tick
/obj/screen/alert/status_effect/power_regen
/atom/movable/screen/alert/status_effect/power_regen
name = "Power Regeneration"
desc = "You are quickly regenerating power!"
icon_state = "power_regen"
@@ -174,16 +174,16 @@
id = "his_grace"
duration = -1
tick_interval = 4
alert_type = /obj/screen/alert/status_effect/his_grace
alert_type = /atom/movable/screen/alert/status_effect/his_grace
var/bloodlust = 0
/obj/screen/alert/status_effect/his_grace
/atom/movable/screen/alert/status_effect/his_grace
name = "His Grace"
desc = "His Grace hungers, and you must feed Him."
icon_state = "his_grace"
alerttooltipstyle = "hisgrace"
/obj/screen/alert/status_effect/his_grace/MouseEntered(location,control,params)
/atom/movable/screen/alert/status_effect/his_grace/MouseEntered(location,control,params)
desc = initial(desc)
var/datum/status_effect/his_grace/HG = attached_effect
desc += "<br><font size=3><b>Current Bloodthirst: [HG.bloodlust]</b></font>\
@@ -225,7 +225,7 @@
/datum/status_effect/wish_granters_gift //Fully revives after ten seconds.
id = "wish_granters_gift"
duration = 50
alert_type = /obj/screen/alert/status_effect/wish_granters_gift
alert_type = /atom/movable/screen/alert/status_effect/wish_granters_gift
/datum/status_effect/wish_granters_gift/on_apply()
to_chat(owner, "<span class='notice'>Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...</span>")
@@ -236,7 +236,7 @@
owner.revive(full_heal = TRUE, admin_revive = TRUE)
owner.visible_message("<span class='warning'>[owner] appears to wake from the dead, having healed all wounds!</span>", "<span class='notice'>You have regenerated.</span>")
/obj/screen/alert/status_effect/wish_granters_gift
/atom/movable/screen/alert/status_effect/wish_granters_gift
name = "Wish Granter's Immortality"
desc = "You are being resurrected!"
icon_state = "wish_granter"
@@ -274,7 +274,7 @@
id = "blooddrunk"
duration = 10
tick_interval = 0
alert_type = /obj/screen/alert/status_effect/blooddrunk
alert_type = /atom/movable/screen/alert/status_effect/blooddrunk
var/last_health = 0
var/last_bruteloss = 0
var/last_fireloss = 0
@@ -283,7 +283,7 @@
var/last_cloneloss = 0
var/last_staminaloss = 0
/obj/screen/alert/status_effect/blooddrunk
/atom/movable/screen/alert/status_effect/blooddrunk
name = "Blood-Drunk"
desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect
icon_state = "blooddrunk"
@@ -430,7 +430,7 @@
/datum/status_effect/fleshmend
id = "fleshmend"
duration = 100
alert_type = /obj/screen/alert/status_effect/fleshmend
alert_type = /atom/movable/screen/alert/status_effect/fleshmend
/datum/status_effect/fleshmend/tick()
if(owner.on_fire)
@@ -453,7 +453,7 @@
QDEL_LIST(C.all_scars)
/obj/screen/alert/status_effect/fleshmend
/atom/movable/screen/alert/status_effect/fleshmend
name = "Fleshmend"
desc = "Our wounds are rapidly healing. <i>This effect is prevented if we are on fire.</i>"
icon_state = "fleshmend"
@@ -562,7 +562,7 @@
var/mob/living/simple_animal/SM = L
SM.adjustHealth(-3.5, forced = TRUE)
/obj/screen/alert/status_effect/regenerative_core
/atom/movable/screen/alert/status_effect/regenerative_core
name = "Reinforcing Tendrils"
desc = "You can move faster than your broken body could normally handle!"
icon_state = "regenerative_core"
@@ -572,7 +572,7 @@
id = "Regenerative Core"
duration = 1 MINUTES
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/regenerative_core
alert_type = /atom/movable/screen/alert/status_effect/regenerative_core
var/heal_amount = 25
/datum/status_effect/regenerative_core/on_apply()
@@ -597,9 +597,9 @@
id = "Anatomic Panacea"
duration = 100
tick_interval = 10
alert_type = /obj/screen/alert/status_effect/panacea
alert_type = /atom/movable/screen/alert/status_effect/panacea
/obj/screen/alert/status_effect/panacea
/atom/movable/screen/alert/status_effect/panacea
name = "Panacea"
desc = "We purge the impurities from our body."
icon_state = "panacea"
@@ -774,7 +774,7 @@
status_type = STATUS_EFFECT_REFRESH
duration = 15 SECONDS
examine_text = "<span class='notice'>They don't seem to be all here.</span>"
alert_type = /obj/screen/alert/status_effect/crucible_soul
alert_type = /atom/movable/screen/alert/status_effect/crucible_soul
var/turf/location
/datum/status_effect/crucible_soul/on_apply()
@@ -796,7 +796,7 @@
id = "Blessing of Dusk and Dawn"
status_type = STATUS_EFFECT_REFRESH
duration = 60 SECONDS
alert_type =/obj/screen/alert/status_effect/duskndawn
alert_type =/atom/movable/screen/alert/status_effect/duskndawn
/datum/status_effect/duskndawn/on_apply()
. = ..()
@@ -813,7 +813,7 @@
status_type = STATUS_EFFECT_REFRESH
duration = 60 SECONDS
tick_interval = 1 SECONDS
alert_type = /obj/screen/alert/status_effect/marshal
alert_type = /atom/movable/screen/alert/status_effect/marshal
/datum/status_effect/marshal/on_apply()
. = ..()
@@ -849,17 +849,17 @@
carbie.blood_volume += carbie.blood_volume >= BLOOD_VOLUME_NORMAL ? 0 : heal_amt*3
/obj/screen/alert/status_effect/crucible_soul
/atom/movable/screen/alert/status_effect/crucible_soul
name = "Blessing of Crucible Soul"
desc = "You phased through the reality, you are halfway to your final destination..."
icon_state = "crucible"
/obj/screen/alert/status_effect/duskndawn
/atom/movable/screen/alert/status_effect/duskndawn
name = "Blessing of Dusk and Dawn"
desc = "Many things hide beyond the horizon, with Owl's help i managed to slip past sun's guard and moon's watch."
icon_state = "duskndawn"
/obj/screen/alert/status_effect/marshal
/atom/movable/screen/alert/status_effect/marshal
name = "Blessing of Wounded Soldier"
desc = "Some people seek power through redemption, one thing many people don't know is that battle is the ultimate redemption and wounds let you bask in eternal glory."
icon_state = "wounded_soldier"
+37 -20
View File
@@ -58,7 +58,7 @@
//SLEEPING
/datum/status_effect/incapacitating/sleeping
id = "sleeping"
alert_type = /obj/screen/alert/status_effect/asleep
alert_type = /atom/movable/screen/alert/status_effect/asleep
needs_update_stat = TRUE
var/mob/living/carbon/carbon_owner
var/mob/living/carbon/human/human_owner
@@ -122,7 +122,7 @@
owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/off_balance)
return ..()
/obj/screen/alert/status_effect/asleep
/atom/movable/screen/alert/status_effect/asleep
name = "Asleep"
desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are."
icon_state = "asleep"
@@ -139,7 +139,7 @@
/datum/status_effect/mesmerize
id = "Mesmerize"
alert_type = /obj/screen/alert/status_effect/mesmerized
alert_type = /atom/movable/screen/alert/status_effect/mesmerized
/datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration)
. = ..()
@@ -156,7 +156,7 @@
duration = set_duration
. = ..()
/obj/screen/alert/status_effect/mesmerized
/atom/movable/screen/alert/status_effect/mesmerized
name = "Mesmerized"
desc = "You can't tear your sight from who is in front of you... their gaze is simply too enthralling.."
icon = 'icons/mob/actions/bloodsucker.dmi'
@@ -199,15 +199,32 @@
movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode
stamdmg_per_ds = 1
/datum/status_effect/vtec_disabled
id = "vtec_disable"
tick = FALSE
/datum/status_effect/vtec_disabled/on_creation(mob/living/new_owner, set_duration)
if(isnum(set_duration))
duration = set_duration
. = ..()
if(iscyborg(owner))
var/mob/living/silicon/robot/R = owner
R.vtec_disabled = TRUE
/datum/status_effect/vtec_disabled/on_remove()
if(iscyborg(owner))
var/mob/living/silicon/robot/R = owner
R.vtec_disabled = FALSE
return ..()
//OTHER DEBUFFS
/datum/status_effect/his_wrath //does minor damage over time unless holding His Grace
id = "his_wrath"
duration = -1
tick_interval = 4
alert_type = /obj/screen/alert/status_effect/his_wrath
alert_type = /atom/movable/screen/alert/status_effect/his_wrath
/obj/screen/alert/status_effect/his_wrath
/atom/movable/screen/alert/status_effect/his_wrath
name = "His Wrath"
desc = "You fled from His Grace instead of feeding Him, and now you suffer."
icon_state = "his_grace"
@@ -226,11 +243,11 @@
duration = 70
tick_interval = 0 //tick as fast as possible
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/belligerent
alert_type = /atom/movable/screen/alert/status_effect/belligerent
var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run
var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists
/obj/screen/alert/status_effect/belligerent
/atom/movable/screen/alert/status_effect/belligerent
name = "Belligerent"
desc = "<b><font color=#880020>Kneel, her-eti'c.</font></b>"
icon_state = "belligerent"
@@ -751,7 +768,7 @@
/datum/status_effect/necropolis_curse/proc/apply_curse(set_curse)
curse_flags |= set_curse
if(curse_flags & CURSE_BLINDING)
owner.overlay_fullscreen("curse", /obj/screen/fullscreen/curse, 1)
owner.overlay_fullscreen("curse", /atom/movable/screen/fullscreen/curse, 1)
/datum/status_effect/necropolis_curse/proc/remove_curse(remove_curse)
if(remove_curse & CURSE_BLINDING)
@@ -810,7 +827,7 @@
status_type = STATUS_EFFECT_UNIQUE
tick_interval = 5
duration = 100
alert_type = /obj/screen/alert/status_effect/kindle
alert_type = /atom/movable/screen/alert/status_effect/kindle
var/old_health
var/old_oxyloss
@@ -839,7 +856,7 @@
owner.visible_message("<span class='warning'>The light in [owner]'s eyes fades!</span>", \
"<span class='boldannounce'>You snap out of your daze!</span>")
/obj/screen/alert/status_effect/kindle
/atom/movable/screen/alert/status_effect/kindle
name = "Dazzling Lights"
desc = "Blinding light dances in your vision, stunning and silencing you. <i>Any damage taken will shorten the light's effects!</i>"
icon_state = "kindle"
@@ -852,7 +869,7 @@
status_type = STATUS_EFFECT_UNIQUE
duration = 600
examine_text = "<span class='warning'>SUBJECTPRONOUN is drenched in thick, blue ichor!</span>"
alert_type = /obj/screen/alert/status_effect/ichorial_stain
alert_type = /atom/movable/screen/alert/status_effect/ichorial_stain
/datum/status_effect/ichorial_stain/on_apply()
. = ..()
@@ -865,7 +882,7 @@
owner.visible_message("<span class='danger'>The blue ichor on [owner]'s body dries out!</span>", \
"<span class='boldnotice'>The ichor on your body is dry - you can now be revived by vitality matrices again!</span>")
/obj/screen/alert/status_effect/ichorial_stain
/atom/movable/screen/alert/status_effect/ichorial_stain
name = "Ichorial Stain"
desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices."
icon_state = "ichorial_stain"
@@ -891,7 +908,7 @@
/datum/status_effect/strandling //get it, strand as in durathread strand + strangling = strandling hahahahahahahahahahhahahaha i want to die
id = "strandling"
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/strandling
alert_type = /atom/movable/screen/alert/status_effect/strandling
/datum/status_effect/strandling/on_apply()
ADD_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron")
@@ -901,13 +918,13 @@
REMOVE_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron")
return ..()
/obj/screen/alert/status_effect/strandling
/atom/movable/screen/alert/status_effect/strandling
name = "Choking strand"
desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand."
icon_state = "his_grace"
alerttooltipstyle = "hisgrace"
/obj/screen/alert/status_effect/strandling/Click(location, control, params)
/atom/movable/screen/alert/status_effect/strandling/Click(location, control, params)
. = ..()
to_chat(mob_viewer, "<span class='notice'>You attempt to remove the durathread strand from around your neck.</span>")
if(do_after(mob_viewer, 35, null, mob_viewer))
@@ -944,9 +961,9 @@
tick_interval = 10
examine_text = "<span class='warning'>SUBJECTPRONOUN seems slow and unfocused.</span>"
var/stun = TRUE
alert_type = /obj/screen/alert/status_effect/trance
alert_type = /atom/movable/screen/alert/status_effect/trance
/obj/screen/alert/status_effect/trance
/atom/movable/screen/alert/status_effect/trance
name = "Trance"
desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..."
icon_state = "high"
@@ -1052,7 +1069,7 @@
id = "dna_melt"
duration = 600
status_type = STATUS_EFFECT_REPLACE
alert_type = /obj/screen/alert/status_effect/dna_melt
alert_type = /atom/movable/screen/alert/status_effect/dna_melt
var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now
/datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove)
@@ -1067,7 +1084,7 @@
H.something_horrible(kill_either_way)
return ..()
/obj/screen/alert/status_effect/dna_melt
/atom/movable/screen/alert/status_effect/dna_melt
name = "Genetic Breakdown"
desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate."
icon_state = "dna_melt"
+2 -2
View File
@@ -2,11 +2,11 @@
id = "frozen"
duration = 100
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/freon
alert_type = /atom/movable/screen/alert/status_effect/freon
var/icon/cube
var/can_melt = TRUE
/obj/screen/alert/status_effect/freon
/atom/movable/screen/alert/status_effect/freon
name = "Frozen Solid"
desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!"
icon_state = "frozen"
+2 -2
View File
@@ -48,7 +48,7 @@
get_kill()
return ..()
/obj/screen/alert/status_effect/in_love
/atom/movable/screen/alert/status_effect/in_love
name = "In Love"
desc = "You feel so wonderfully in love!"
icon_state = "in_love"
@@ -57,7 +57,7 @@
id = "in_love"
duration = -1
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/in_love
alert_type = /atom/movable/screen/alert/status_effect/in_love
var/mob/living/date
/datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/love_interest)
+6 -4
View File
@@ -5,15 +5,17 @@
/datum/status_effect
var/id = "effect" //Used for screen alerts.
var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means.
/// do we tick()?
var/tick = TRUE
var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second.
var/next_tick //The scheduled time for the next tick.
var/mob/living/owner //The mob affected by the status effect.
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
var/alert_type = /atom/movable/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
/// If this is TRUE, the user will have sprint forcefully disabled while this is active.
var/blocks_sprint = FALSE
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
var/atom/movable/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
/// How many of the effect can be on one mob, and what happens when you try to add another
var/status_type = STATUS_EFFECT_UNIQUE
@@ -32,7 +34,7 @@
duration = world.time + duration
next_tick = world.time + tick_interval
if(alert_type)
var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
var/atom/movable/screen/alert/status_effect/A = owner.throw_alert(id, alert_type)
A.attached_effect = src //so the alert can reference us, if it needs to
linked_alert = A //so we can reference the alert, if we need to
START_PROCESSING(SSstatus_effects, src)
@@ -98,7 +100,7 @@
// ALERT HOOK //
////////////////
/obj/screen/alert/status_effect
/atom/movable/screen/alert/status_effect
name = "Curse of Mundanity"
desc = "You don't feel any different..."
var/datum/status_effect/attached_effect
+6 -6
View File
@@ -1,13 +1,13 @@
// The shattered remnants of your broken limbs fill you with determination!
/obj/screen/alert/status_effect/determined
/atom/movable/screen/alert/status_effect/determined
name = "Determined"
desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!"
icon_state = "regenerative_core"
/datum/status_effect/determined
id = "determined"
alert_type = /obj/screen/alert/status_effect/determined
alert_type = /atom/movable/screen/alert/status_effect/determined
/datum/status_effect/determined/on_apply()
. = ..()
@@ -21,7 +21,7 @@
id = "limp"
status_type = STATUS_EFFECT_REPLACE
tick_interval = 10
alert_type = /obj/screen/alert/status_effect/limp
alert_type = /atom/movable/screen/alert/status_effect/limp
var/msg_stage = 0//so you dont get the most intense messages immediately
/// The left leg of the limping person
var/obj/item/bodypart/l_leg/left
@@ -49,7 +49,7 @@
UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB))
return ..()
/obj/screen/alert/status_effect/limp
/atom/movable/screen/alert/status_effect/limp
name = "Limping"
desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least splinted!"
@@ -99,11 +99,11 @@
/////////////////////////
// wound alert
/obj/screen/alert/status_effect/wound
/atom/movable/screen/alert/status_effect/wound
name = "Wounded"
desc = "Your body has sustained serious damage, click here to inspect yourself."
/obj/screen/alert/status_effect/wound/Click()
/atom/movable/screen/alert/status_effect/wound/Click()
var/mob/living/carbon/C = usr
C.check_self_for_injuries()
+17
View File
@@ -162,3 +162,20 @@
gain_text = "<span class='notice'>You feel like munching on a can of soda.</span>"
lose_text = "<span class='notice'>You no longer feel like you should be eating trash.</span>"
mob_trait = TRAIT_TRASHCAN
/datum/quirk/colorist
name = "Colorist"
desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair."
value = 0
medical_record_text = "Patient enjoys dyeing their hair with pretty colors."
/datum/quirk/colorist/on_spawn()
var/mob/living/carbon/human/H = quirk_holder
var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder))
H.equip_to_slot(spraycan, SLOT_IN_BACKPACK)
H.regenerate_icons()
/datum/quirk/colorist/post_add()
var/mob/living/carbon/human/H = quirk_holder
SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H)
to_chat(quirk_holder, "<span class='boldnotice'>You brought some extra dye with you! It's in your bag if you forgot.</span>")
@@ -18,7 +18,7 @@
area_type = /area
protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer,
/area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle, /area/security/prison/safe, /area/security/prison/toilet)
/area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle)
target_trait = ZTRAIT_STATION
immunity_type = "rad"
+12
View File
@@ -329,3 +329,15 @@
to_chat(L, "<span class='warning'>You need an attachable assembly!</span>")
#undef MAXIMUM_EMP_WIRES
//gremlins
/datum/wires/proc/npc_tamper(mob/living/L)
if(!wires.len)
return
var/wire_to_screw = pick(wires)
if(is_color_cut(wire_to_screw) || prob(50)) //CutWireColour() proc handles both cutting and mending wires. If the wire is already cut, always mend it back. Otherwise, 50% to cut it and 50% to pulse it
cut(wire_to_screw)
else
pulse(wire_to_screw, L)
+1 -1
View File
@@ -124,7 +124,7 @@
for(var/mob/dead/observer/O in GLOB.player_list)
if(O.key == expected_key)
if(O.client?.address == addr)
new /obj/screen/splash(O.client, TRUE)
new /atom/movable/screen/splash(O.client, TRUE)
break
/datum/world_topic/adminmsg
+1 -1
View File
@@ -136,7 +136,7 @@
SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb)
victim.emote("pain")
if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds
victim.throw_alert("wound", /obj/screen/alert/status_effect/wound)
victim.throw_alert("wound", /atom/movable/screen/alert/status_effect/wound)
var/demoted
if(old_wound)