Tg port 2 15 (#230)

* defines/helpers

* globalvars, onclick, controllers

* datums and game

* woooooooooorld. Uh. dm

* modules sans mobs client admin

* modules/admin

* pref shit

* modules/mob

* icon updates

* extra things

* Cherrypicked fixes from open PRs

* metastation.tgm fix

* a better meta fix

* reverts async breakings
This commit is contained in:
Poojawa
2017-02-15 03:35:32 -06:00
committed by GitHub
parent fd3923d684
commit fc2dbcd9fe
192 changed files with 10451 additions and 160669 deletions
+2 -2
View File
@@ -4,10 +4,10 @@
/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want)
name = "NICE NAME" (not required but makes things really nice)
icon = "ICON FILENAME" (defaults to areas.dmi)
icon = 'ICON FILENAME' (defaults to 'icons/turf/areas.dmi')
icon_state = "NAME OF ICON" (defaults to "unknown" (blank))
requires_power = 0 (defaults to 1)
music = "music/music.ogg" (defaults to "music/music.ogg")
music = null (defaults to nothing, look in sound/ambience for music)
NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0
+6 -6
View File
@@ -126,32 +126,32 @@
/area/awaymission/centcomAway/general
name = "XCC-P5831"
music = "music/ambigen3.ogg"
music = 'sound/ambience/ambigen3.ogg'
/area/awaymission/centcomAway/maint
name = "XCC-P5831 Maintenance"
icon_state = "away1"
music = "music/ambisin1.ogg"
music = 'sound/ambience/ambisin1.ogg'
/area/awaymission/centcomAway/thunderdome
name = "XCC-P5831 Thunderdome"
icon_state = "away2"
music = "music/ambisin2.ogg"
music = 'sound/ambience/ambisin2.ogg'
/area/awaymission/centcomAway/cafe
name = "XCC-P5831 Kitchen Arena"
icon_state = "away3"
music = "music/ambisin3.ogg"
music = 'sound/ambience/ambisin3.ogg'
/area/awaymission/centcomAway/courtroom
name = "XCC-P5831 Courtroom"
icon_state = "away4"
music = "music/ambisin4.ogg"
music = 'sound/ambience/ambisin4.ogg'
/area/awaymission/centcomAway/hangar
name = "XCC-P5831 Hangars"
icon_state = "away4"
music = "music/ambigen5.ogg"
music = 'sound/ambience/ambigen5.ogg'
/*Cabin areas*/
-1
View File
@@ -5,7 +5,6 @@
//icon = "ICON FILENAME"
//icon_state = "NAME OF ICON"
requires_power = 0
music = "music/music.ogg"
/area/hell/trial1
name = "Hell Trial1"
+17 -5
View File
@@ -24,6 +24,7 @@
glide_size = 8
appearance_flags = TILE_BOUND
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
var/floating = FALSE
/atom/movable/SDQL_update(const/var_name, new_value)
if(var_name == "step_x" || var_name == "step_y" || var_name == "step_size" || var_name == "bound_x" || var_name == "bound_y" || var_name == "bound_width" || var_name == "bound_height")
@@ -140,7 +141,6 @@
if(destination)
if(pulledby)
pulledby.stop_pulling()
var/atom/oldloc = loc
var/same_loc = oldloc == destination
var/area/old_area = get_area(oldloc)
@@ -158,10 +158,10 @@
if(destarea && old_area != destarea)
destarea.Entered(src, oldloc)
for(var/atom/movable/AM in destination)
if(AM == src)
continue
AM.Crossed(src)
for(var/atom/movable/AM in destination)
if(AM == src)
continue
AM.Crossed(src)
Moved(oldloc, 0)
return 1
@@ -418,3 +418,15 @@
return FALSE
acted_explosions += ex_id
return TRUE
/atom/movable/proc/float(on)
if(throwing)
return
if(on && !floating)
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
sleep(10)
animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
floating = TRUE
else if (!on && floating)
animate(src, pixel_y = initial(pixel_y), time = 10)
floating = FALSE
@@ -51,8 +51,10 @@
name = "dull sigil"
desc = "A dull, barely-visible golden sigil. It's as though light was carved into the ground."
icon = 'icons/effects/clockwork_effects.dmi'
clockwork_desc = "A sigil that will stun the first non-servant to cross it. Nar-Sie's dogs will be knocked down."
clockwork_desc = "A sigil that will stun the next non-Servant to cross it."
icon_state = "sigildull"
layer = HIGH_SIGIL_LAYER
alpha = 60
color = "#FAE48C"
sigil_name = "Sigil of Transgression"
@@ -78,8 +80,9 @@
desc = "A luminous golden sigil. Something about it really bothers you."
clockwork_desc = "A sigil that will enslave the first person to cross it, provided they remain on it for seven seconds."
icon_state = "sigilsubmission"
color = "#FAE48C"
layer = LOW_SIGIL_LAYER
alpha = 125
color = "#FAE48C"
stat_affected = UNCONSCIOUS
resist_string = "glows faintly yellow"
var/convert_time = 70
@@ -148,8 +151,8 @@
clockwork_desc = "A sigil that will enslave any person who crosses it, provided they remain on it for seven seconds. \n\
It can convert a mindshielded target once before disppearing, but can convert any number of non-implanted targets."
icon_state = "sigiltransgression"
color = "#A97F1B"
alpha = 200
color = "#A97F1B"
glow_light = 4 //bright light
glow_falloff = 3
delete_on_finish = FALSE
@@ -172,8 +175,8 @@
desc = "A glowing orange sigil. The air around it feels staticky."
clockwork_desc = "A sigil that will serve as a battery for clockwork structures."
icon_state = "sigiltransmission"
color = "#EC8A2D"
alpha = 50
color = "#EC8A2D"
resist_string = "glows faintly"
sigil_name = "Sigil of Transmission"
affects_servants = TRUE
@@ -189,7 +192,11 @@
/obj/effect/clockwork/sigil/transmission/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='[power_charge ? "brass":"alloy"]'>It is storing <b>[ratvar_awakens ? "INFINITY":"[power_charge]"]W</b> of power.</span>"
var/structure_number = 0
for(var/obj/structure/destructible/clockwork/powered/P in range(SIGIL_ACCESS_RANGE, src))
structure_number++
user << "<span class='[power_charge ? "brass":"alloy"]'>It is storing <b>[ratvar_awakens ? "INFINITY":"[power_charge]"]W</b> of power, \
and <b>[structure_number]</b> Clockwork Structure[structure_number == 1 ? "":"s"] [structure_number == 1 ? "is":"are"] in range.</span>"
if(iscyborg(user))
user << "<span class='brass'>You can recharge from the [sigil_name] by crossing it.</span>"
@@ -264,8 +271,9 @@
desc = "A faint blue sigil. Looking at it makes you feel protected."
clockwork_desc = "A sigil that will drain non-Servants that remain on it. Servants that remain on it will be healed if it has any vitality drained."
icon_state = "sigilvitality"
color = "#123456"
layer = SIGIL_LAYER
alpha = 75
color = "#123456"
affects_servants = TRUE
stat_affected = DEAD
resist_string = "glows shimmering yellow"
@@ -27,7 +27,7 @@
name = "Nezbere, the Brass Eidolon"
desc = "A towering colossus clad in nigh-impenetrable brass armor. Its gaze is stern yet benevolent, even upon you."
clockwork_desc = "One of Ratvar's four generals. Nezbere is responsible for the design, testing, and creation of everything in Ratvar's domain, and his loyalty to Ratvar knows no bounds. \
It is said that Ratvar once asked him to destroy the plans for a weapon Nezbere had made that could have harmed him and Nezbere responded by not only destroying the plans, \
It is said that Ratvar once asked him to destroy the plans for a weapon Nezbere had made that could have harmed him, and Nezbere responded by not only destroying the plans, \
but by taking his own life so that the device could never be replicated. Nezbere's zealotry is unmatched."
icon = 'icons/effects/340x428.dmi'
icon_state = "nezbere"
@@ -47,7 +47,7 @@
/obj/effect/clockwork/general_marker/nzcrentr
name = "Nzcrentr, the Eternal Thunderbolt"
desc = "A terrifying spiked construct crackling with limitless energy."
desc = "A terrifying spiked construct crackling with perpetual lightning."
clockwork_desc = "One of Ratvar's four generals. Before becoming one of Ratvar's generals, Nzcrentr sook out any and all sentient life to slaughter it for sport. \
Nzcrentr was coerced by Ratvar into entering a shell constructed by Nezbere, ostensibly made to grant Nzcrentr more power. In reality, the shell was made to trap and control it. \
Nzcrentr now serves loyally, though even one of Nezbere's finest creations was not enough to totally eliminate its will."
@@ -44,12 +44,14 @@
if((!clockcult_user || !is_servant_of_ratvar(src)) && cell && cell.charge)
. = min(cell.charge, 250)
cell.use(.)
src << "<span class='userdanger'>ERROR: Power loss detected!</span>"
if(prob(20))
src << "<span class='userdanger'>ERROR: Power loss detected!</span>"
spark_system.start()
/obj/mecha/power_drain(clockcult_user)
if((!clockcult_user || !occupant || occupant && !is_servant_of_ratvar(occupant)) && cell && cell.charge)
. = min(cell.charge, 250)
cell.use(.)
occupant_message("<span class='userdanger'>Power loss detected!</span>")
if(prob(20))
occupant_message("<span class='userdanger'>Power loss detected!</span>")
spark_system.start()
@@ -45,6 +45,15 @@
servant_of_ratvar_messages = list("The eye flickers before falling dark." = FALSE, "You feel watched." = FALSE, "\"...\"" = FALSE)
w_class = WEIGHT_CLASS_NORMAL
/obj/item/clockwork/component/belligerent_eye/lens_gem
name = "lens gem"
desc = "A tiny pinkish gem. It catches the light oddly, almost glowing."
clockwork_desc = "The gem from an interdiction lens. <b>Serviceable as a substitute for a belligerent eye.</b>"
icon_state = "lens_gem"
cultist_message = "The gem turns black and cold for a moment before its normal glow returns."
servant_of_ratvar_messages = list("\"Disgusting failure.\"" = TRUE, "You feel scrutinized." = FALSE, "\"Weaklings.\"" = TRUE, "\"Pathetic defenses.\"" = TRUE)
w_class = WEIGHT_CLASS_TINY
/obj/item/clockwork/component/vanguard_cogwheel
name = "vanguard cogwheel"
desc = "A sturdy brass cog with a faintly glowing blue gem in its center."
@@ -54,14 +63,14 @@
servant_of_ratvar_messages = list("\"Be safe, child.\"" = FALSE, "You feel unexplainably comforted." = FALSE, "\"Never forget: Pain is temporary. What you do for the Justiciar is eternal.\"" = FALSE)
message_span = "inathneq"
/obj/item/clockwork/component/vanguard_cogwheel/pinion_lock
name = "pinion lock"
desc = "A dented and scratched gear. It's very heavy."
clockwork_desc = "A broken gear lock for pinion airlocks. <b>Serviceable as a substitute for a vanguard cogwheel.</b>"
icon_state = "pinion_lock"
cultist_message = "The gear grows warm in your hands."
servant_of_ratvar_messages = list("The lock isn't getting any lighter." = FALSE, "\"Damaged gears are better than broken bodies.\"" = TRUE, \
"\"It's a shame it can't be reused.\"" = TRUE)
/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. <b>Serviceable as a substitute for a vanguard cogwheel.</b>"
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, \
"\"Better these machines break than you do.\"" = TRUE)
w_class = WEIGHT_CLASS_NORMAL
/obj/item/clockwork/component/geis_capacitor
@@ -74,6 +83,15 @@
"\"The fact that Ratvar has to depend on simpletons like you is appalling.\"" = FALSE)
message_span = "sevtug"
/obj/item/clockwork/component/geis_capacitor/fallen_armor
name = "fallen armor"
desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you."
clockwork_desc = "The armor from a former clockwork marauder. <b>Serviceable as a substitute for a geis capacitor.</b>"
icon_state = "fallen_armor"
cultist_message = "Red flame sputters from the mask's eye before winking out."
servant_of_ratvar_messages = list("A piece of armor hovers away from the others for a moment." = FALSE, "Red flame appears in the cuirass before sputtering out." = FALSE)
w_class = WEIGHT_CLASS_NORMAL
/obj/item/clockwork/component/geis_capacitor/antennae
name = "mania motor antennae"
desc = "A pair of dented and bent antennae. They constantly emit a static hiss."
@@ -100,17 +118,16 @@
icon_state = "smashed_anime_fragment"
cultist_message = "The shards vibrate in your hands for a moment."
servant_of_ratvar_messages = list("\"...still fight...\"" = FALSE, "\"...where am I...?\"" = FALSE, "\"...put me... slab...\"" = FALSE)
message_span = "heavy_brass"
w_class = WEIGHT_CLASS_NORMAL
/obj/item/clockwork/component/replicant_alloy/fallen_armor
name = "fallen armor"
desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you."
clockwork_desc = "The armor from a former clockwork marauder. <b>Serviceable as a substitute for replicant alloy.</b>"
icon_state = "fallen_armor"
cultist_message = "Red flame sputters from the mask's eye before winking out."
servant_of_ratvar_messages = list("A piece of armor hovers away from the others for a moment." = FALSE, "Red flame appears in the cuirass before sputtering out." = FALSE)
message_span = "heavy_brass"
/obj/item/clockwork/component/replicant_alloy/replication_plate
name = "replication plate"
desc = "A flat, heavy disc of metal with a triangular formation on its surface."
clockwork_desc = "The replication plate from a tinkerer's daemon. <b>Serviceable as a substitute for replicant alloy.</b>"
icon_state = "replication_plate"
cultist_message = "The plate shudders in your hands, as though trying to get away."
servant_of_ratvar_messages = list("\"Put this in a slab and get back to work.\"" = FALSE, "\"Worse servants than you have held these.\"" = TRUE, \
"\"It would be wise to protect these better, friend.\"" = TRUE)
w_class = WEIGHT_CLASS_NORMAL
/obj/item/clockwork/component/hierophant_ansible
@@ -183,3 +200,9 @@
randomsinglesprite = TRUE
randomspritemax = 3
icon_state = "shard_small"
/obj/item/clockwork/alloy_shards/pinion_lock
name = "pinion lock"
desc = "A dented and scratched gear. It's very heavy."
clockwork_desc = "A broken gear lock for pinion airlocks. Can be proselytized for additional power."
icon_state = "pinion_lock"
@@ -304,8 +304,8 @@
for(var/mob/living/M in living_mob_list)
if(is_servant_of_ratvar(M) && (ishuman(M) || issilicon(M)))
servants++
if(servants > 5)
servants -= 5
if(servants > SCRIPT_SERVANT_REQ)
servants -= SCRIPT_SERVANT_REQ
production_time += min(SLAB_SERVANT_SLOWDOWN * servants, SLAB_SLOWDOWN_MAXIMUM)
var/production_text_addon = ""
if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM)
@@ -54,6 +54,7 @@
/obj/item/device/mmi/posibrain/soul_vessel/attack(mob/living/target, mob/living/carbon/human/user)
if(!is_servant_of_ratvar(user) || !ishuman(target) || used || (brainmob && brainmob.key))
..()
return
if(is_servant_of_ratvar(target))
user << "<span class='nezbere'>\"It would be more wise to revive your allies, friend.\"</span>"
return
@@ -13,7 +13,7 @@
attack_sound = 'sound/weapons/bladeslice.ogg'
weather_immunities = list("lava")
movement_type = FLYING
loot = list(/obj/item/clockwork/component/replicant_alloy/fallen_armor)
loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
var/true_name = "Meme Master 69" //Required to call forth the marauder
var/global/list/possible_true_names = list("Servant", "Warden", "Serf", "Page", "Usher", "Knave", "Vassal", "Escort")
var/mob/living/host //The mob that the marauder is living inside of
@@ -176,13 +176,13 @@
/datum/clockwork_scripture/create_object/sigil_of_transmission
descname = "Structure Battery"
name = "Sigil of Transmission"
desc = "Scribes a sigil beneath the invoker which stores power to power clockwork structures."
desc = "Places a sigil that stores energy to power clockwork structures."
invocations = list("Divinity...", "...power our creations!")
channel_time = 70
consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2)
whispered = TRUE
object_path = /obj/effect/clockwork/sigil/transmission
creator_message = "<span class='brass'>A sigil silently appears below you. It will automatically power clockwork structures adjecent to it.</span>"
creator_message = "<span class='brass'>A sigil silently appears below you. It will automatically power clockwork structures near it.</span>"
usage_tip = "Cyborgs can charge from this sigil by remaining over it for 5 seconds."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
@@ -194,7 +194,7 @@
//Interdiction Lens: Creates a powerful totem that disables radios and cameras and drains power into nearby sigils of transmission.
/datum/clockwork_scripture/create_object/interdiction_lens
descname = "Structure, Disables Machinery"
descname = "Structure, Area Sabotage, Power Generator"
name = "Interdiction Lens"
desc = "Creates a clockwork totem that sabotages nearby machinery and funnels drained power into nearby Sigils of Transmission or the area's APC."
invocations = list("May this totem...", "...shroud the false suns!")
@@ -216,14 +216,14 @@
//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume power or replicant alloy.
/datum/clockwork_scripture/create_object/mending_motor
descname = "Structure, Repairs Other Structures"
descname = "Powered Structure, Repairs Other Structures"
name = "Mending Motor"
desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires power to function."
desc = "Creates a mechanized prism that will rapidly repair damaged clockwork constructs, converted cyborgs, and clockwork structures."
invocations = list("May this prism...", "...mend our dents and scratches!")
channel_time = 80
consumed_components = list(VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 1)
object_path = /obj/structure/destructible/clockwork/powered/mending_motor
creator_message = "<span class='brass'>You form a mending motor, which will consume power to mend constructs and structures.</span>"
creator_message = "<span class='brass'>You form a mending motor, which will rapidly repair damaged clockwork constructs, converted cyborgs, and clockwork structures.</span>"
observer_message = "<span class='warning'>An onyx prism forms in midair and sprouts tendrils to support itself!</span>"
invokers_required = 2
multiple_invokers_used = TRUE
@@ -238,9 +238,9 @@
//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 = "Structure, Area Denial"
descname = "Powered Structure, Area Denial"
name = "Mania Motor"
desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-servant humans. It will also try to convert humans directly adjecent to the motor."
desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-Servant humans. It will also try to convert humans directly adjecent to the motor."
invocations = list("May this transmitter...", "...break the will of all who oppose us!")
channel_time = 80
consumed_components = list(GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1)
@@ -249,7 +249,7 @@
observer_message = "<span class='warning'>A two-pronged machine rises from the ground!</span>"
invokers_required = 2
multiple_invokers_used = TRUE
usage_tip = "Eligible human servants next to the motor will be converted at an additional power cost. It will also cure hallucinations and brain damage in nearby servants."
usage_tip = "Eligible non-Servant humans next to the motor will be converted at an additional power cost. It will also cure hallucinations and brain damage in nearby Servants."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
primary_component = GEIS_CAPACITOR
@@ -260,9 +260,10 @@
//Tinkerer's Daemon: Creates an efficient machine that rapidly produces components at a power cost.
/datum/clockwork_scripture/create_object/tinkerers_daemon
descname = "Structure, Component Generator"
descname = "Powered Structure, Component Generator"
name = "Tinkerer's Daemon"
desc = "Creates a tinkerer's daemon which can rapidly collect components. It will only function if it has sufficient power, is outnumbered by servants by a ratio of 5:1, and there is at least one existing cache."
desc = "Creates a tinkerer's daemon which can rapidly collect components. It will only function if it has sufficient power, is outnumbered by Servants by a ratio of 5:1, \
and there is at least one existing cache."
invocations = list("May this generator...", "...collect Engine parts that yet hold greatness!")
channel_time = 80
consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 1, REPLICANT_ALLOY = 3)
@@ -294,9 +295,9 @@
//Clockwork Obelisk: Creates a powerful obelisk that can be used to broadcast messages or open a gateway to any servant or clockwork obelisk at a power cost.
/datum/clockwork_scripture/create_object/clockwork_obelisk
descname = "Structure, Teleportation Hub"
descname = "Powered Structure, Teleportation Hub"
name = "Clockwork Obelisk"
desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living servant or clockwork obelisk."
desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living Servant or clockwork obelisk."
invocations = list("May this obelisk...", "...take us to all places!")
channel_time = 80
consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 3)
@@ -253,14 +253,15 @@
/datum/clockwork_scripture/create_object/tinkerers_cache
descname = "Necessary Structure, Shares Components"
name = "Tinkerer's Cache"
desc = "Forms a cache that can store an infinite amount of components. All caches are linked and will provide components to slabs."
desc = "Forms a cache that can store an infinite amount of components. All caches are linked and will provide components to slabs. \
Striking a cache with a slab will transfer that slab's components to the global cache."
invocations = list("Constructing...", "...a cache!")
channel_time = 50
consumed_components = list(BELLIGERENT_EYE = 0, VANGUARD_COGWHEEL = 0, GEIS_CAPACITOR = 0, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 0)
object_path = /obj/structure/destructible/clockwork/cache
creator_message = "<span class='brass'>You form a tinkerer's cache, which is capable of storing components, which will automatically be used by slabs.</span>"
observer_message = "<span class='warning'>A hollow brass spire rises and begins to blaze!</span>"
usage_tip = "Slabs will draw components from the global cache after the slab's own repositories, making caches very efficient."
usage_tip = "Slabs will draw components from the global cache after the slab's own repositories, making caches extremely useful."
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = REPLICANT_ALLOY
@@ -299,17 +300,17 @@
/datum/clockwork_scripture/create_object/sigil_of_transgression
descname = "Trap, Stunning"
name = "Sigil of Transgression"
desc = "Wards a tile with a sigil. The next person to cross the sigil will be smitten and unable to move. Nar-Sian cultists are stunned altogether."
invocations = list("Divinity, dazzle...", "...those who tresspass here!")
desc = "Wards a tile with a sigil, which will stun the next non-Servant to cross it."
invocations = list("Divinity, smite...", "...those who tresspass here!")
channel_time = 50
consumed_components = list(HIEROPHANT_ANSIBLE = 1)
whispered = TRUE
object_path = /obj/effect/clockwork/sigil/transgression
creator_message = "<span class='brass'>A sigil silently appears below you. The next non-servant to cross it will be immobilized.</span>"
creator_message = "<span class='brass'>A sigil silently appears below you. The next non-Servant to cross it will be stunned.</span>"
usage_tip = "The sigil, while fairly powerful in its stun, does not induce muteness in its victim."
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
sort_priority = 10
quickbind = TRUE
quickbind_desc = "Creates a Sigil of Transgression, which will stun the first non-Servant to cross it."
quickbind_desc = "Creates a Sigil of Transgression, which will stun the next non-Servant to cross it."
@@ -6,11 +6,11 @@
/datum/clockwork_scripture/invoke_inathneq
descname = "Area Invulnerability"
name = "Invoke Inath-neq, the Resonant Cogwheel"
desc = "Taps the limitless power of Inath-neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all servants in range for fifteen seconds."
desc = "Taps the limitless power of Inath-neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all Servants in range for fifteen seconds."
invocations = list("I call upon you, Vanguard!!", "Let the Resonant Cogs turn once more!!", "Grant me and my allies the strength to vanquish our foes!!")
channel_time = 100
consumed_components = list(VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3)
usage_tip = "Those affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity."
usage_tip = "Servants affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity."
tier = SCRIPTURE_REVENANT
primary_component = VANGUARD_COGWHEEL
sort_priority = 2
@@ -124,7 +124,7 @@
return FALSE
if(!slab.no_cost && ratvar_awakens)
invoker << "<span class='nezbere'>\"[text2ratvar("Our master is here already. You do not require my help, friend.")]\"</span>\n\
<span class='warning'>Nezbere will not grant his power while Ratvar's dwarfs his own!</span>"
<span class='warning'>There is no need for Nezbere's assistance while Ratvar is risen!</span>"
return FALSE
return TRUE
@@ -165,8 +165,8 @@
/datum/clockwork_scripture/invoke_nzcrentr
descname = "Area Lightning Blast"
name = "Invoke Nzcrentr, the Eternal Thunderbolt"
desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \
seconds, anyone near you will be struck by a devastating lightning bolt."
desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. Nzcrentr will grant you a tiny fraction of its boundless power. After several seconds, all non-Servants near you \
will be struck by devastating lightning bolts."
invocations = list("I call upon you, Amperage!!", "Let your energy flow through me!!", "Let your boundless power shatter stars!!")
channel_time = 100
consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 6)
@@ -187,7 +187,7 @@
clockwork_generals_invoked["nzcrentr"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
hierophant_message("<span class='nzcrentr_large'>[text2ratvar("Amperage: \"[invoker.real_name] has called forth my power. Hope [invoker.p_they()] [invoker.p_do()] not shatter under it!")]\"</span>", FALSE, invoker)
invoker.visible_message("<span class='warning'>[invoker] begins to radiate a blinding light!</span>", \
"<span class='nzcrentr'>\"[text2ratvar("The boss says it's okay to do this. Don't blame me if you die from it.")]\"</span>\n \
"<span class='nzcrentr'>\"[text2ratvar("The boss says it's okay to do this. Don't blame me if you die from it.")]\"</span>\n\
<span class='userdanger'>You feel limitless power surging through you!</span>")
playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
sleep(2)
@@ -197,7 +197,7 @@
sleep(88)
if(invoker)
invoker.visible_message("<span class='warning'>Massive bolts of energy emerge from across [invoker]'s body!</span>", \
"<span class='nzcrentr'>\"[text2ratvar("I told you you wouldn't be able to handle it.")]\"</span>\n \
"<span class='nzcrentr'>\"[text2ratvar("I told you you wouldn't be able to handle it.")]\"</span>\n\
<span class='userdanger'>TOO... MUCH! CAN'T... TAKE IT!</span>")
playsound(invoker, 'sound/magic/lightningbolt.ogg', 100, 0)
if(invoker.stat == CONSCIOUS)
@@ -6,12 +6,12 @@
/datum/clockwork_scripture/create_object/ocular_warden
descname = "Structure, Turret"
name = "Ocular Warden"
desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range."
desc = "Forms an automatic short-range turret which will automatically attack nearby unrestrained non-Servants that can see it."
invocations = list("Guardians...", "...of the Engine...", "...defend us!")
channel_time = 120
consumed_components = list(BELLIGERENT_EYE = 1, REPLICANT_ALLOY = 1)
object_path = /obj/structure/destructible/clockwork/ocular_warden
creator_message = "<span class='brass'>You form an ocular warden, which will focus its searing gaze upon nearby unenlightened.</span>"
creator_message = "<span class='brass'>You form an ocular warden, which will automatically attack nearby unrestrained non-Servants that can see it.</span>"
observer_message = "<span class='warning'>A brass eye takes shape and slowly rises into the air, its red iris glaring!</span>"
usage_tip = "Although powerful, the warden is very fragile and should optimally be placed behind barricades."
tier = SCRIPTURE_SCRIPT
@@ -23,7 +23,7 @@
quickbind_desc = "Creates an Ocular Warden, which will automatically attack nearby unrestrained non-Servants that can see it."
/datum/clockwork_scripture/create_object/ocular_warden/check_special_requirements()
for(var/obj/structure/destructible/clockwork/ocular_warden/W in range(3, invoker))
for(var/obj/structure/destructible/clockwork/ocular_warden/W in range(OCULAR_WARDEN_EXCLUSION_RANGE, invoker))
invoker << "<span class='neovgre'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" //fluff message
return FALSE
return ..()
@@ -52,7 +52,7 @@
/datum/clockwork_scripture/create_object/vitality_matrix
descname = "Trap, Damage to Healing"
name = "Vitality Matrix"
desc = "Scribes a sigil beneath the invoker which drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much Vitality all \
desc = "Places a sigil that drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much Vitality all \
Matrices have drained from non-Servants. Dead Servants can be revived by this sigil if there is vitality equal to the target Servant's non-oxygen damage."
invocations = list("Divinity...", "...steal their life...", "...for these shells!")
channel_time = 60
@@ -11,7 +11,8 @@
max_integrity = 150
obj_integrity = 150
break_message = "<span class='warning'>The obelisk falls to the ground, undamaged!</span>"
debris = list(/obj/item/clockwork/alloy_shards/small = 3, \
debris = list(/obj/item/clockwork/alloy_shards/small = 4, \
/obj/item/clockwork/alloy_shards/medium = 2, \
/obj/item/clockwork/component/hierophant_ansible/obelisk = 1)
var/hierophant_cost = MIN_CLOCKCULT_POWER //how much it costs to broadcast with large text
var/gateway_cost = 2000 //how much it costs to open a gateway
@@ -8,8 +8,11 @@
active_icon = "interdiction_lens_active"
inactive_icon = "interdiction_lens"
unanchored_icon = "interdiction_lens_unwrenched"
break_message = "<span class='warning'>The lens flares a blinding violet before shattering!</span>"
break_message = "<span class='warning'>The lens flares a blinding violet before the totem beneath it shatters!</span>"
break_sound = 'sound/effects/Glassbr3.ogg'
debris = list(/obj/item/clockwork/alloy_shards/small = 2, \
/obj/item/clockwork/alloy_shards/large = 2, \
/obj/item/clockwork/component/belligerent_eye/lens_gem = 1)
var/recharging = 0 //world.time when the lens was last used
var/recharge_time = 1200 //if it drains no power and affects no objects, it turns off for two minutes
var/disabled = FALSE //if it's actually usable
@@ -8,11 +8,11 @@
inactive_icon = "mania_motor_inactive"
unanchored_icon = "mania_motor_unwrenched"
construction_value = 20
max_integrity = 80
obj_integrity = 80
max_integrity = 100
obj_integrity = 100
break_message = "<span class='warning'>The antenna break off, leaving a pile of shards!</span>"
debris = list(/obj/item/clockwork/alloy_shards/large = 1, \
/obj/item/clockwork/alloy_shards/small = 3, \
debris = list(/obj/item/clockwork/alloy_shards/large = 2, \
/obj/item/clockwork/alloy_shards/small = 2, \
/obj/item/clockwork/component/geis_capacitor/antennae = 1)
var/mania_cost = 150
var/convert_cost = 150
@@ -62,30 +62,7 @@
var/turf/T = get_turf(src)
var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected
var/efficiency = get_efficiency_mod()
for(var/mob/living/carbon/human/H in view(1, src))
if(is_servant_of_ratvar(H) || H.null_rod_check() || H.stat == DEAD)
continue
if(!H.Adjacent(src))
H << "<span class='sevtug'>\"[text2ratvar(pick(close_messages))]\"</span>"
continue
if(try_use_power(convert_cost))
H.playsound_local(T, hum, 80, 1)
if(!H.stat)
if(H.getBrainLoss() < 100)
H.adjustBrainLoss(30 * efficiency)
H.visible_message("<span class='warning'>[H] reaches out and touches [src].</span>", "<span class='sevtug'>You touch [src] involuntarily.</span>")
else
H.Paralyse(3)
else if(is_eligible_servant(H))
H << "<span class='sevtug'>\"[text2ratvar("You are mine and his, now.")]\"</span>"
add_servant_of_ratvar(H)
H.Paralyse(5)
else
H << "<span class='sevtug'>\"[text2ratvar(pick(convert_messages))]\"</span>"
else
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
for(var/mob/living/carbon/human/H in range(10, src))
for(var/mob/living/carbon/human/H in viewers(7, src))
if(is_servant_of_ratvar(H)) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion
var/brainloss = H.getBrainLoss()
if(brainloss)
@@ -98,14 +75,34 @@
H.dizziness = 0
if(H.confused)
H.confused = 0
else if(!H.null_rod_check() && H.stat == CONSCIOUS)
else if(!H.null_rod_check() && H.stat != DEAD)
var/distance = 0 + get_dist(T, get_turf(H))
var/falloff_distance = min((110) - distance * 10, 80)
var/sound_distance = falloff_distance * 0.5
var/targetbrainloss = H.getBrainLoss()
if(distance >= 4 && prob(falloff_distance * 0.5))
if(distance > 3 && prob(falloff_distance * 0.5))
H << "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>"
H.playsound_local(T, hum, sound_distance, 1)
if(distance <= 1)
if(!H.Adjacent(src))
H << "<span class='sevtug'>\"[text2ratvar(pick(close_messages))]\"</span>"
H.playsound_local(T, hum, sound_distance, 1)
else if(!try_use_power(convert_cost))
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
else
H.playsound_local(T, hum, 80, 1)
if(!H.stat)
if(H.getBrainLoss() < 100)
H.adjustBrainLoss(20 * efficiency)
H.visible_message("<span class='warning'>[H] reaches out and touches [src].</span>", "<span class='sevtug'>You touch [src] involuntarily.</span>")
else
H.Paralyse(3)
else if(is_eligible_servant(H))
H << "<span class='sevtug'>\"[text2ratvar("You are mine and his, now.")]\"</span>"
add_servant_of_ratvar(H)
H.Paralyse(5)
else
H.playsound_local(T, hum, sound_distance, 1)
switch(distance)
if(0 to 3)
if(prob(falloff_distance * 0.5))
@@ -113,31 +110,31 @@
H << "<span class='sevtug_small'>\"[text2ratvar(pick(mania_messages))]\"</span>"
else
H << "<span class='sevtug'>\"[text2ratvar(pick(compel_messages))]\"</span>"
if(targetbrainloss <= 50)
H.adjustBrainLoss((50 * efficiency) - targetbrainloss) //got too close had brain eaten
H.adjust_drugginess(Clamp(7 * efficiency, 0, 100 - H.druggy))
H.hallucination = min(H.hallucination + (7 * efficiency), 100)
H.dizziness = min(H.dizziness + (3 * efficiency), 45)
H.confused = min(H.confused + (3 * efficiency), 45)
if(4 to 5)
if(targetbrainloss <= 50)
H.adjustBrainLoss(1 * efficiency)
H.adjust_drugginess(Clamp(5 * efficiency, 0, 80 - H.druggy))
H.hallucination = min(H.hallucination + (5 * efficiency), 80)
H.dizziness = min(H.dizziness + (2 * efficiency), 30)
H.confused = min(H.confused + (2 * efficiency), 30)
if(6 to 7)
if(targetbrainloss <= 30)
H.adjustBrainLoss(1 * efficiency)
H.adjust_drugginess(Clamp(2 * efficiency, 0, 60 - H.druggy))
H.hallucination = min(H.hallucination + (2 * efficiency), 60)
H.dizziness = min(H.dizziness + (2 * efficiency), 15)
H.confused = min(H.confused + (2 * efficiency), 15)
if(8 to 9)
if(targetbrainloss <= 40)
H.adjustBrainLoss(3 * efficiency)
H.adjust_drugginess(Clamp(7 * efficiency, 0, 50 - H.druggy))
H.hallucination = min(H.hallucination + (7 * efficiency), 50)
H.dizziness = min(H.dizziness + (3 * efficiency), 20)
H.confused = min(H.confused + (3 * efficiency), 20)
if(3 to 5)
if(targetbrainloss <= 20)
H.adjustBrainLoss(2 * efficiency)
H.adjust_drugginess(Clamp(5 * efficiency, 0, 25 - H.druggy))
H.hallucination = min(H.hallucination + (5 * efficiency), 25)
H.dizziness = min(H.dizziness + (2 * efficiency), 10)
H.confused = min(H.confused + (2 * efficiency), 10)
if(5 to 6)
if(targetbrainloss <= 10)
H.adjustBrainLoss(1 * efficiency)
H.adjust_drugginess(Clamp(2 * efficiency, 0, 40 - H.druggy))
H.hallucination = min(H.hallucination + (2 * efficiency), 40)
if(10 to INFINITY)
H.adjust_drugginess(Clamp(2 * efficiency, 0, 20 - H.druggy))
H.hallucination = min(H.hallucination + (2 * efficiency), 20)
H.dizziness = min(H.dizziness + (2 * efficiency), 5)
H.confused = min(H.confused + (2 * efficiency), 5)
if(6 to 7)
if(targetbrainloss <= 5)
H.adjustBrainLoss(1 * efficiency)
H.adjust_drugginess(Clamp(2 * efficiency, 0, 10 - H.druggy))
H.hallucination = min(H.hallucination + (2 * efficiency), 10)
if(7 to INFINITY)
H.adjust_drugginess(Clamp(2 * efficiency, 0, 5 - H.druggy))
H.hallucination = min(H.hallucination + (2 * efficiency), 5)
@@ -10,11 +10,11 @@
construction_value = 20
max_integrity = 125
obj_integrity = 125
break_message = "<span class='warning'>The prism collapses with a heavy thud!</span>"
debris = list(/obj/item/clockwork/alloy_shards/small = 5, \
break_message = "<span class='warning'>The prism falls to the ground with a heavy thud!</span>"
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 = 1)
/obj/item/clockwork/component/vanguard_cogwheel/onyx_prism = 1)
var/heal_attempts = 4
var/heal_cost = MIN_CLOCKCULT_POWER*2
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
@@ -2,7 +2,7 @@
/obj/structure/destructible/clockwork/ocular_warden
name = "ocular warden"
desc = "A large brass eye with tendrils trailing below it and a wide red iris."
clockwork_desc = "A fragile turret that will deal sustained damage to any non-faithful it sees."
clockwork_desc = "A fragile turret which will automatically attack nearby unrestrained non-Servants that can see it."
icon_state = "ocular_warden"
unanchored_icon = "ocular_warden_unwrenched"
obj_integrity = 25
@@ -39,7 +39,7 @@
user << "<span class='warning'>[src] is too damaged to unsecure!</span>"
return FAILED_UNFASTEN
else
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(3, src))
for(var/obj/structure/destructible/clockwork/ocular_warden/W in orange(OCULAR_WARDEN_EXCLUSION_RANGE, src))
if(!silent)
user << "<span class='neovgre'>You sense another ocular warden too near this location. Activating this one this close would cause them to fight.</span>"
return FAILED_UNFASTEN
@@ -10,10 +10,10 @@
max_integrity = 100
obj_integrity = 100
construction_value = 20
break_message = "<span class='warning'>The daemon shatters into millions of pieces!</span>"
debris = list(/obj/item/clockwork/alloy_shards/large = 2, \
/obj/item/clockwork/alloy_shards/medium = 4, \
/obj/item/clockwork/alloy_shards/small = 6)
break_message = "<span class='warning'>The daemon shatters into millions of pieces, leaving only a disc of metal!</span>"
debris = list(/obj/item/clockwork/alloy_shards/medium = 1, \
/obj/item/clockwork/alloy_shards/small = 6, \
/obj/item/clockwork/component/replicant_alloy/replication_plate = 1)
var/image/daemon_glow
var/image/component_glow
var/component_id_to_produce
+1 -1
View File
@@ -286,7 +286,7 @@
var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
SSshuttle.emergency.setTimer(timer)
user << "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>"
playsound(user.loc, "sound/effects/Glassbr1.ogg", 50, 1)
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 50, 1)
qdel(src)
sleep(20)
var/global/list/curses
+3 -3
View File
@@ -507,7 +507,7 @@
feedback_add_details("wizard_spell_learned",log_name)
rightandwrong(0, user, 25)
active = 1
playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1)
playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1)
user << "<span class='notice'>You have cast summon guns!</span>"
return 1
@@ -525,7 +525,7 @@
feedback_add_details("wizard_spell_learned",log_name)
rightandwrong(1, user, 25)
active = 1
playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1)
playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1)
user << "<span class='notice'>You have cast summon magic!</span>"
return 1
@@ -545,7 +545,7 @@
feedback_add_details("wizard_spell_learned",log_name)
summonevents()
times++
playsound(get_turf(user),"sound/magic/CastSummon.ogg",50,1)
playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1)
user << "<span class='notice'>You have cast summon events.</span>"
return 1
@@ -175,7 +175,10 @@
name = "circuit board (Xenobiology Console)"
build_path = /obj/machinery/computer/camera_advanced/xenobio
origin_tech = "programming=3;bio=3"
/obj/item/weapon/circuitboard/computer/base_construction
name = "circuit board (Aux Mining Base Construction Console)"
build_path = /obj/machinery/computer/camera_advanced/base_construction
origin_tech = "programming=3;engineering=3"
/obj/item/weapon/circuitboard/computer/aiupload
name = "AI Upload (Computer Board)"
build_path = /obj/machinery/computer/upload/ai
@@ -127,7 +127,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
make_announcement(usr)
/* if("crossserver")
if("crossserver")
if(authenticated==2)
if(CM.lastTimeUsed + 600 > world.time)
usr << "<span class='warning'>Arrays recycling. Please stand by.</span>"
@@ -142,7 +142,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
log_say("[key_name(usr)] has sent a message to the other server: [input]")
message_admins("[key_name_admin(usr)] has sent a message to the other server.")
CM.lastTimeUsed = world.time
*/
if("purchase_menu")
state = STATE_PURCHASE
@@ -144,7 +144,7 @@
/obj/machinery/computer/gulag_teleporter_computer/proc/teleport(mob/user)
log_game("[user]([user.ckey] teleported [prisoner]([prisoner.ckey]) to the Labor Camp ([beacon.x], [beacon.y], [beacon.z]) for [id.goal] points.")
teleporter.handle_prisoner(id, temporary_record)
playsound(loc, "sound/weapons/emitter.ogg", 50, 1)
playsound(loc, 'sound/weapons/emitter.ogg', 50, 1)
prisoner.forceMove(get_turf(beacon))
prisoner.Weaken(2) // small travel dizziness
prisoner << "<span class='warning'>The teleportation makes you a little dizzy.</span>"
+1 -1
View File
@@ -489,7 +489,7 @@
new/obj/item/stack/tile/brass(T, 4)
else
new/obj/item/clockwork/alloy_shards(T)
new/obj/item/clockwork/component/vanguard_cogwheel/pinion_lock(T)
new/obj/item/clockwork/alloy_shards/pinion_lock(T)
qdel(src)
/obj/machinery/door/airlock/clockwork/proc/attempt_construction(obj/item/I, mob/living/user)
+1 -1
View File
@@ -96,7 +96,7 @@
return
var/area/A = get_area(src)
A.firealert(src)
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75, 0)
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75, 1)
/obj/machinery/firealarm/proc/alarm_in(time)
addtimer(CALLBACK(src, .proc/alarm), time)
@@ -569,6 +569,28 @@
/obj/machinery/porta_turret/ai/assess_perp(mob/living/carbon/human/perp)
return 10 //AI turrets shoot at everything not in their faction
/obj/machinery/porta_turret/aux_base
name = "perimeter defense turret"
desc = "A plasma cutter turret calibrated to defend outposts against non-humanoid fauna."
req_access = list() //Can be disabled/enabled by any humanoid!
installation = null
lethal_projectile = /obj/item/projectile/plasma
lethal_projectile_sound = 'sound/weapons/plasma_cutter.ogg'
mode = TURRET_LETHAL //It would be useless in stun mode anyway
faction = "neutral" //Minebots, medibots, etc that should not be shot.
/obj/machinery/porta_turret/aux_base/assess_perp(mob/living/carbon/human/perp)
return 0 //Never shoot humanoids. You are on your own if Ashwalkers or the like attack!
/obj/machinery/porta_turret/aux_base/setup()
return
/obj/machinery/porta_turret/aux_base/New()
..()
cover.name = name
cover.desc = desc
////////////////////////
//Turret Control Panel//
////////////////////////
+58 -34
View File
@@ -728,6 +728,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6)
premium = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1)
refill_canister = /obj/item/weapon/vending_refill/cola
//This one's from bay12
@@ -917,40 +918,63 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/sailor=1,
/obj/item/clothing/shoes/megaboots=1,
/obj/item/clothing/gloves/megagloves=1,
/obj/item/clothing/head/helmet/megahelmet=1,
/obj/item/clothing/shoes/megaboots=1,
/obj/item/clothing/gloves/megagloves=1,
/obj/item/clothing/head/helmet/megahelmet=1,
/obj/item/clothing/under/mega=1,
/obj/item/clothing/shoes/protoboots=1,
/obj/item/clothing/gloves/protogloves=1,
/obj/item/clothing/head/helmet/protohelmet = 1,
/obj/item/clothing/shoes/protoboots=1,
/obj/item/clothing/gloves/protogloves=1,
/obj/item/clothing/head/helmet/protohelmet = 1,
/obj/item/clothing/under/proto = 1,
/obj/item/clothing/shoes/megaxboots = 1,
/obj/item/clothing/gloves/megaxgloves = 1,
/obj/item/clothing/head/helmet/megaxhelmet = 1,
/obj/item/clothing/shoes/megaxboots = 1,
/obj/item/clothing/gloves/megaxgloves = 1,
/obj/item/clothing/head/helmet/megaxhelmet = 1,
/obj/item/clothing/under/megax = 1,
/obj/item/clothing/shoes/joeboots = 1,
/obj/item/clothing/gloves/joegloves = 1,
/obj/item/clothing/shoes/joeboots = 1,
/obj/item/clothing/gloves/joegloves = 1,
/obj/item/clothing/head/helmet/joehelmet = 1,
/obj/item/clothing/under/joe = 1,
/obj/item/clothing/under/vault = 1,
/obj/item/clothing/under/roll = 1,
/obj/item/clothing/head/clownpiece = 1,
/obj/item/clothing/under/clownpiece = 1,
/obj/item/clothing/suit/clownpiece = 1)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 2,/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/gloves/anchor_arms = 1,
/obj/item/clothing/suit/kaminacape = 1,
/obj/item/clothing/under/soldieruniform = 1, /obj/item/clothing/head/stalhelm = 1, /obj/item/clothing/suit/soldiercoat = 1,
/obj/item/clothing/under/officeruniform = 1, /obj/item/clothing/head/naziofficer = 1, /obj/item/clothing/suit/officercoat = 1,
/obj/item/clothing/head/panzer = 1,
/obj/item/clothing/under/russobluecamooutfit = 1, /obj/item/clothing/head/russobluecamohat = 1,
/obj/item/clothing/suit/russofurcoat = 1, /obj/item/clothing/head/russofurhat = 1,
/obj/item/clothing/under/rottensuit = 1, /obj/item/clothing/shoes/rottenshoes = 1,
/obj/item/clothing/head/helmet/biker = 1, /obj/item/clothing/under/bikersuit = 1, /obj/item/clothing/gloves/bikergloves = 1,
/obj/item/clothing/under/jacketsuit = 1, /obj/item/clothing/head/helmet/richard = 1,
/obj/item/clothing/under/vault13 = 1)
premium = list(/obj/item/clothing/suit/pirate/captain = 2, /obj/item/clothing/head/pirate/captain = 2, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1, /obj/item/weapon/skub = 1)
/obj/item/clothing/head/clownpiece = 1,
/obj/item/clothing/under/clownpiece = 1,
/obj/item/clothing/suit/clownpiece = 1
)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
/obj/item/weapon/gun/magic/wand = 2,
/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/gloves/anchor_arms = 1,
/obj/item/clothing/suit/kaminacape = 1,
/obj/item/clothing/under/soldieruniform = 1,
/obj/item/clothing/head/stalhelm = 1,
/obj/item/clothing/suit/soldiercoat = 1,
/obj/item/clothing/under/officeruniform = 1,
/obj/item/clothing/head/naziofficer = 1,
/obj/item/clothing/suit/officercoat = 1,
/obj/item/clothing/head/panzer = 1,
/obj/item/clothing/under/russobluecamooutfit = 1,
/obj/item/clothing/head/russobluecamohat = 1,
/obj/item/clothing/suit/russofurcoat = 1,
/obj/item/clothing/head/russofurhat = 1,
/obj/item/clothing/under/rottensuit = 1,
/obj/item/clothing/shoes/rottenshoes = 1,
/obj/item/clothing/head/helmet/biker = 1,
/obj/item/clothing/under/bikersuit = 1,
/obj/item/clothing/gloves/bikergloves = 1,
/obj/item/clothing/under/jacketsuit = 1,
/obj/item/clothing/head/helmet/richard = 1,
/obj/item/clothing/under/vault13 = 1
)
premium = list(/obj/item/clothing/suit/pirate/captain = 2,
/obj/item/clothing/head/pirate/captain = 2,
/obj/item/clothing/head/helmet/roman = 1,
/obj/item/clothing/head/helmet/roman/legionaire = 1,
/obj/item/clothing/under/roman = 1,
/obj/item/clothing/shoes/roman = 1,
/obj/item/weapon/shield/riot/roman = 1,
/obj/item/weapon/skub = 1
)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
/obj/machinery/vending/dinnerware
@@ -1062,14 +1086,14 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/suit/jacket/letterman_red=1, /obj/item/clothing/under/wintercasualwear=1, /obj/item/clothing/under/casualwear=1, /obj/item/clothing/under/casualhoodie=1,
/obj/item/clothing/under/casualhoodie/skirt=1)
contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=2,/obj/item/clothing/suit/jacket/letterman_syndie=1,/obj/item/clothing/under/jabroni=1, /obj/item/clothing/suit/vapeshirt=1, /obj/item/clothing/under/geisha=1,
/obj/item/clothing/under/wedding/bride_orange=1,
/obj/item/clothing/under/wedding/bride_purple=1,
/obj/item/clothing/under/wedding/bride_blue=1,
/obj/item/clothing/under/wedding/bride_red=1,
/obj/item/clothing/under/wedding/bride_white=1,
/obj/item/clothing/under/wedding/bride_orange=1,
/obj/item/clothing/under/wedding/bride_purple=1,
/obj/item/clothing/under/wedding/bride_blue=1,
/obj/item/clothing/under/wedding/bride_red=1,
/obj/item/clothing/under/wedding/bride_white=1,
/obj/item/clothing/under/keyholesweater=1,
/obj/item/clothing/suit/doshjacket=1,
/obj/item/clothing/under/squatter_outfit = 1,
/obj/item/clothing/suit/doshjacket=1,
/obj/item/clothing/under/squatter_outfit = 1,
/obj/item/clothing/head/squatter_hat = 1)
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/neck/necklace/dope=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
refill_canister = /obj/item/weapon/vending_refill/clothing
+1 -1
View File
@@ -245,7 +245,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
desc = "A weapon for combat exosuits. A mime invention, field tests have shown that targets cannot even scream before going down."
fire_sound = "sound/weapons/Gunshot_silenced.ogg"
fire_sound = 'sound/weapons/Gunshot_silenced.ogg'
icon_state = "mecha_mime"
equip_cooldown = 30
projectile = /obj/item/projectile/bullet/mime
+1 -1
View File
@@ -1050,4 +1050,4 @@ var/year_integer = text2num(year) // = 2013???
/obj/mecha/update_remote_sight(mob/living/user)
if(occupant_sight_flags)
if(user == occupant)
user.sight |= occupant_sight_flags
user.sight |= occupant_sight_flags
+1 -1
View File
@@ -174,4 +174,4 @@
cargo -= O
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
user << "<span class='warning'>You fail to push [O] out of [src]!</span>"
user << "<span class='warning'>You fail to push [O] out of [src]!</span>"
@@ -87,7 +87,7 @@
/obj/item/clothing/gloves/color/fyellow = 1,
/obj/item/clothing/head/hardhat = 1,
/obj/item/clothing/head/hardhat/red = 1,
/obj/item/clothing/head/that{throwforce = 1; throwing = 1} = 1,
/obj/item/clothing/head/that{throwforce = 1;} = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/head/welding = 1,
/obj/item/clothing/mask/gas = 15,
+2 -2
View File
@@ -104,7 +104,7 @@ var/explosionid = 1
for(var/obj/structure/blob/B in T)
cached_exp_block[T] += B.explosion_block
CHECK_TICK
//flash mobs
if(flash_range)
for(var/mob/living/L in viewers(flash_range, epicenter))
@@ -179,7 +179,7 @@ var/explosionid = 1
var/took = (world.timeofday-start)/10
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
if(Debug2)
world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds."
log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.")
//Machines which report explosions.
for(var/array in doppler_arrays)
+13 -14
View File
@@ -192,24 +192,23 @@ var/global/list/datum/stack_recipe/reinforced_glass_recipes = list ( \
var/mob/living/carbon/human/H = AM
if(PIERCEIMMUNE in H.dna.species.species_traits)
return
if(H.dna.species.id == "slime")
return
if(H.dna.species.id == "jelly")
if(H.dna.species.id == "slime" || "jelly")
return
var/picked_def_zone = pick("l_leg", "r_leg")
var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone)
if(!istype(O))
return
var/feetCover = (H.wear_suit && H.wear_suit.body_parts_covered & FEET) || (H.w_uniform && H.w_uniform.body_parts_covered & FEET)
if(!H.shoes && !feetCover)
H.apply_damage(5, BRUTE, picked_def_zone)
if(cooldown < world.time - 10) //cooldown to avoid message spam.
if(!H.incapacitated())
H.visible_message("<span class='danger'>[H] steps in the broken glass!</span>", \
"<span class='userdanger'>You step in the broken glass!</span>")
else
H.visible_message("<span class='danger'>[H] slides on the broken glass!</span>", \
"<span class='userdanger'>You slide on the broken glass!</span>")
if(H.shoes || feetCover || H.movement_type & FLYING || H.buckled)
return
H.apply_damage(5, BRUTE, picked_def_zone)
if(cooldown < world.time - 10) //cooldown to avoid message spam.
if(!H.incapacitated())
H.visible_message("<span class='danger'>[H] steps in the broken glass!</span>", \
"<span class='userdanger'>You step in the broken glass!</span>")
else
H.visible_message("<span class='danger'>[H] slides on the broken glass!</span>", \
"<span class='userdanger'>You slide on the broken glass!</span>")
cooldown = world.time
H.Weaken(3)
cooldown = world.time
H.Weaken(3)
@@ -189,6 +189,8 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
null, \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
null, \
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \
)
/obj/item/stack/sheet/cloth
+2 -6
View File
@@ -766,12 +766,8 @@
else if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!remove_item_from_storage(M))
M.temporarilyRemoveItemFromInventory(src, TRUE)
if(!M.put_in_hand(src, H.held_index))
qdel(src)
return
usr << "<span class='notice'>You pick up the deck.</span>"
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
usr << "<span class='notice'>You pick up the deck.</span>"
else
usr << "<span class='warning'>You can't reach it from here!</span>"
+1 -1
View File
@@ -609,4 +609,4 @@ var/global/list/RPD_recipes=list(
#undef METER_MODE
#undef DISPOSALS_MODE
#undef CATEGORY_ATMOS
#undef CATEGORY_DISPOSALS
#undef CATEGORY_DISPOSALS
+2 -6
View File
@@ -93,13 +93,9 @@
/obj/item/weapon/defibrillator/MouseDrop(obj/over_object)
if(ismob(src.loc))
var/mob/M = src.loc
if(istype(over_object, /obj/screen/inventory/hand))
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!M.temporarilyRemoveItemFromInventory(src))
return
if(!M.put_in_hand(src, H.held_index))
qdel(src) //wewie
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
/obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params)
if(W == paddles)
@@ -220,10 +220,10 @@
possessed = TRUE
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
var/mob/dead/observer/theghost = null
if(candidates.len)
if(LAZYLEN(candidates))
theghost = pick(candidates)
var/mob/living/simple_animal/shade/S = new(src)
S.real_name = name
@@ -20,6 +20,9 @@
if(requires_sharpness && !I.sharpness)
user << "<span class='notice'>You can only sharpen items that are already sharp, such as knives.</span>"
return
if(istype(I, /obj/item/weapon/melee/energy))
user << "<span class='notice'>You don't think \the [I] will be the thing getting modified if you use it on \the [src].</span>"
return
if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff
var/obj/item/weapon/twohanded/TH = I
if(TH.force_wielded >= max)
@@ -581,6 +581,12 @@
new /obj/item/stack/medical/ointment(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
/obj/item/weapon/storage/box/hug/survival/New()
..()
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/tank/internals/emergency_oxygen(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
/obj/item/ammo_casing/shotgun/rubbershot
/obj/item/weapon/storage/box/rubbershot
@@ -60,10 +60,10 @@
..()
if(empty) return
icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
for(var/i in 1 to 3)
for(var/i in 1 to 4)
new /obj/item/weapon/reagent_containers/syringe/charcoal(src)
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/pill/charcoal(src)
for(var/i in 1 to 2)
new /obj/item/weapon/storage/pill_bottle/charcoal(src)
new /obj/item/device/healthanalyzer(src)
return
@@ -138,21 +138,14 @@
var/mob/M = usr
if(!istype(over_object, /obj/screen) || !Adjacent(M))
return ..()
if(!M.restrained() && !M.stat && istype(over_object, /obj/screen/inventory/hand))
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!M.temporarilyRemoveItemFromInventory(src))
return
if(!M.put_in_hand(src,H.held_index))
qdel(src)
return
src.add_fingerprint(usr)
return
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
add_fingerprint(usr)
if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
if(usr.s_active)
usr.s_active.close(usr)
src.show_to(usr)
return
return
/obj/item/weapon/storage/box/silver_sulf
name = "box of silver sulfadiazine patches"
@@ -45,7 +45,7 @@
show_to(M)
return
if(!M.restrained() && !M.stat)
if(!M.incapacitated())
if(!istype(over_object, /obj/screen))
return content_can_dump(over_object, M)
@@ -54,14 +54,9 @@
playsound(loc, "rustle", 50, 1, -5)
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!M.temporarilyRemoveItemFromInventory(src))
return
if(!M.put_in_hand(src,H.held_index))
qdel(src)
return
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
add_fingerprint(usr)
@@ -85,10 +85,7 @@
var/mob/M = src.loc
if(istype(M) && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
if(!M.temporarilyRemoveItemFromInventory(src))
return
M.put_in_hand(src, H.held_index)
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
/obj/item/weapon/watertank/attackby(obj/item/W, mob/user, params)
if(W == noz)
+2 -2
View File
@@ -297,7 +297,7 @@
return (BRUTELOSS)
/obj/item/weapon/wirecutters/power/attack_self(mob/user)
playsound(get_turf(user),"sound/items/change_jaws.ogg",50,1)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/weapon/crowbar/power/pryjaws = new /obj/item/weapon/crowbar/power
user << "<span class='notice'>You attach the pry jaws to [src].</span>"
qdel(src)
@@ -735,7 +735,7 @@
return (BRUTELOSS)
/obj/item/weapon/crowbar/power/attack_self(mob/user)
playsound(get_turf(user),"sound/items/change_jaws.ogg",50,1)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/weapon/wirecutters/power/cutjaws = new /obj/item/weapon/wirecutters/power
user << "<span class='notice'>You attach the cutting jaws to [src].</span>"
qdel(src)
+2 -2
View File
@@ -496,7 +496,7 @@
/obj/item/weapon/twohanded/required/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message("<span class='danger'>Ranged attacks just make [owner] angrier!</span>")
playsound(src, pick("sound/weapons/bulletflyby.ogg","sound/weapons/bulletflyby2.ogg","sound/weapons/bulletflyby3.ogg"), 75, 1)
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
return 1
return 0
@@ -613,7 +613,7 @@
if(prob(final_block_chance))
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message("<span class='danger'>[owner] deflects [attack_text] with [src]!</span>")
playsound(src, pick("sound/weapons/bulletflyby.ogg","sound/weapons/bulletflyby2.ogg","sound/weapons/bulletflyby3.ogg"), 75, 1)
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
return 1
else
owner.visible_message("<span class='danger'>[owner] parries [attack_text] with [src]!</span>")
@@ -51,8 +51,8 @@
/obj/item/weapon/vending_refill/cola
machine_name = "Robust Softdrinks"
icon_state = "refill_cola"
charges = list(20, 2, 0)//of 60 standard, 6 contraband
init_charges = list(20, 2, 0)
charges = list(20, 2, 1)//of 60 standard, 6 contraband, 1 premium
init_charges = list(20, 2, 1)
/obj/item/weapon/vending_refill/cigarette
machine_name = "ShadyCigs Deluxe"
+1 -1
View File
@@ -388,7 +388,7 @@ var/highlander_claymores = 0
throw_speed = 0
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = "sound/weapons/chainsawhit.ogg"
hitsound = 'sound/weapons/chainsawhit.ogg'
/obj/item/weapon/mounted_chainsaw/dropped()
..()
+1 -1
View File
@@ -73,7 +73,7 @@
if(alert)
var/area/alarmed = get_area(src)
alarmed.burglaralert(src)
playsound(src, "sound/effects/alert.ogg", 50, 1)
playsound(src, 'sound/effects/alert.ogg', 50, 1)
/*
@@ -57,7 +57,7 @@
..()
var/area/A = get_area(src)
if(A)
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK)
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE)
//Timeless prisons: Spawns in Wish Granter prisons in lavaland. Ghosts become age-old users of the Wish Granter and are advised to seek repentance for their past.
/obj/effect/mob_spawn/human/exile
@@ -113,7 +113,7 @@
mob_species = species
var/area/A = get_area(src)
if(A)
notify_ghosts("\A [initial(species.id)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK)
notify_ghosts("\A [initial(species.id)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE)
if(has_owner && creator)
flavour_text = "You are a golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \
Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost."
@@ -81,7 +81,7 @@
return
if(user.pulling != L)
return
playsound(src.loc, "sound/effects/splat.ogg", 25, 1)
playsound(src.loc, 'sound/effects/splat.ogg', 25, 1)
L.visible_message("<span class='danger'>[user] slams [L] onto the meat spike!</span>", "<span class='userdanger'>[user] slams you onto the meat spike!</span>", "<span class='italics'>You hear a squishy wet noise.</span>")
L.loc = src.loc
L.emote("scream")
@@ -0,0 +1,90 @@
/obj/structure/life_candle
name = "life candle"
desc = "You are dead. Insert quarter to continue."
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
var/icon_state_active = "candle1_lit"
var/icon_state_inactive = "candle1"
anchored = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/lit_luminosity = 2
var/list/datum/mind/linked_minds = list()
// If the body is destroyed, what do we spawn for them
var/mob_type = /mob/living/carbon/human
// If the respawned person is given a specific outfit
var/datum/outfit/outfit
// How long until we respawn them after their death.
var/respawn_time = 50
var/respawn_sound = 'sound/magic/Staff_animation.ogg'
/obj/structure/life_candle/attack_hand(mob/user)
if(!user.mind)
return
if(user.mind in linked_minds)
user.visible_message("<span class='notice'>[user] reaches out and pinches the flame of [src].</span>", "<span class='warning'>You sever the connection between yourself and [src].</span>")
linked_minds -= user.mind
else
user.visible_message("<span class='notice'>[user] touches [src]. It seems to respond to their presence!</span>", "<span class='warning'>You create a connection between you and [src].</span>")
linked_minds |= user.mind
update_icon()
float(linked_minds.len)
if(linked_minds.len)
START_PROCESSING(SSobj, src)
SetLuminosity(lit_luminosity)
else
STOP_PROCESSING(SSobj, src)
SetLuminosity(0)
/obj/structure/life_candle/update_icon()
if(linked_minds.len)
icon_state = icon_state_active
else
icon_state = icon_state_inactive
/obj/structure/life_candle/examine(mob/user)
. = ..()
if(linked_minds.len)
user << "[src] is active, and linked to [linked_minds.len] souls."
else
user << "It is static, still, unmoving."
/obj/structure/life_candle/process()
if(!linked_minds.len)
STOP_PROCESSING(SSobj, src)
return
for(var/m in linked_minds)
var/datum/mind/mind = m
if(!mind.current || (mind.current && mind.current.stat == DEAD))
addtimer(CALLBACK(src, .proc/respawn, mind), respawn_time, TIMER_UNIQUE)
/obj/structure/life_candle/proc/respawn(datum/mind/mind)
var/turf/T = get_turf(src)
var/mob/living/body
if(mind.current)
if(mind.current.stat != DEAD)
return
else
body = mind.current
if(!body)
body = new mob_type(T)
var/mob/ghostie = mind.get_ghost(TRUE)
if(ghostie.client && ghostie.client.prefs)
ghostie.client.prefs.copy_to(body)
mind.transfer_to(body)
else
body.forceMove(T)
body.revive(1,1)
mind.grab_ghost(TRUE)
body.flash_act()
if(ishuman(body) && istype(outfit))
outfit.equip(body)
playsound(T, respawn_sound, 50, 1)
+10 -15
View File
@@ -24,6 +24,7 @@
var/list/decals
var/requires_activation //add to air processing after initialize?
var/changing_turf = FALSE
/turf/SDQL_update(const/var_name, new_value)
if(var_name == "x" || var_name == "y" || var_name == "z")
@@ -50,12 +51,16 @@
/turf/proc/Initalize_Atmos(times_fired)
CalculateAdjacentTurfs()
/turf/Destroy()
/turf/Destroy(force)
if(!changing_turf)
stack_trace("Incorrect turf deletion")
changing_turf = FALSE
SSair.remove_from_active(src)
visibilityChanged()
initialized = FALSE
requires_activation = FALSE
..()
return QDEL_HINT_HARDDEL_NOW
return QDEL_HINT_IWILLGC
/turf/attack_hand(mob/user)
user.Move_Pulled(src)
@@ -188,24 +193,14 @@
return
if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
return src
var/old_blueprint_data = blueprint_data
SSair.remove_from_active(src)
var/list/old_checkers = proximity_checkers
var/old_ex_level = explosion_level
var/old_ex_id = explosion_id
Destroy() //❄
changing_turf = TRUE
qdel(src) //Just get the side effects and call Destroy
var/turf/W = new path(src)
W.proximity_checkers = old_checkers
W.explosion_level = old_ex_level
W.explosion_id = old_ex_id
if(!defer_change)
W.AfterChange(ignore_air)
W.blueprint_data = old_blueprint_data
return W
/turf/proc/AfterChange(ignore_air = FALSE) //called after a turf has been replaced in ChangeTurf()