Merge branch 'master' into abductor-update
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T)
|
||||
return isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T)
|
||||
return isclosedturf(T) || isgroundlessturf(T)
|
||||
|
||||
/obj/effect/decal/ex_act(severity, target)
|
||||
qdel(src)
|
||||
|
||||
@@ -9,4 +9,17 @@
|
||||
/obj/effect/turf_decal/weather/snow/corner
|
||||
name = "snow corner piece"
|
||||
icon = 'icons/turf/snow.dmi'
|
||||
icon_state = "snow_corner"
|
||||
icon_state = "snow_corner"
|
||||
|
||||
/obj/effect/turf_decal/weather/dirt
|
||||
name = "dirt siding"
|
||||
icon = 'icons/turf/decals.dmi'
|
||||
icon_state = "dirt_side"
|
||||
|
||||
/obj/effect/turf_decal/weather/sand
|
||||
name = "sand siding"
|
||||
icon = 'icons/misc/beach.dmi'
|
||||
icon_state = "sand_side"
|
||||
|
||||
/obj/effect/turf_decal/weather/sand/light
|
||||
icon_state = "lightsand_side"
|
||||
|
||||
@@ -57,6 +57,9 @@
|
||||
/obj/effect/abstract/singularity_act()
|
||||
return
|
||||
|
||||
/obj/effect/abstract/has_gravity(turf/T)
|
||||
return FALSE
|
||||
|
||||
/obj/effect/dummy/singularity_pull()
|
||||
return
|
||||
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling.
|
||||
var/body_coloring = ""
|
||||
if(source_mob)
|
||||
dna_to_add = source_mob.get_blood_dna_list() //ez pz
|
||||
if(!issilicon(source_mob))
|
||||
dna_to_add = source_mob.get_blood_dna_list() //ez pz
|
||||
if(ishuman(source_mob))
|
||||
var/mob/living/carbon/human/H = source_mob
|
||||
if(H.dna.species.use_skintones)
|
||||
@@ -51,15 +52,11 @@
|
||||
body_coloring = "#[skintone2hex(H.skin_tone)]"
|
||||
else
|
||||
body_coloring = "#[H.dna.features["mcolor"]]"
|
||||
qdel(H)
|
||||
else
|
||||
dna_to_add = temp_mob.get_blood_dna_list()
|
||||
qdel(temp_mob)
|
||||
else if(!issilicon(temp_mob))
|
||||
dna_to_add = temp_mob.get_blood_dna_list()
|
||||
qdel(temp_mob)
|
||||
else
|
||||
qdel(temp_mob)
|
||||
qdel(temp_mob)
|
||||
else
|
||||
dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it.
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
S.directive = directive
|
||||
if(player_spiders)
|
||||
S.playable_spider = TRUE
|
||||
notify_ghosts("Spider [S.name] can be controlled", null, enter_link="<a href=?src=[REF(S)];activate=1>(Click to play)</a>", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER)
|
||||
notify_ghosts("Spider [S.name] can be controlled", null, enter_link="<a href=?src=[REF(S)];activate=1>(Click to play)</a>", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER, ignore_dnr_observers = TRUE)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
@@ -202,7 +202,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
var/list/boostable_nodes = techweb_item_boost_check(src)
|
||||
if (boostable_nodes)
|
||||
for(var/id in boostable_nodes)
|
||||
var/datum/techweb_node/node = SSresearch.techweb_nodes[id]
|
||||
var/datum/techweb_node/node = SSresearch.techweb_node_by_id(id)
|
||||
if(!node)
|
||||
continue
|
||||
research_msg += sep
|
||||
research_msg += node.display_name
|
||||
sep = ", "
|
||||
|
||||
@@ -163,6 +163,8 @@ RLD
|
||||
var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses.
|
||||
var/delay_mod = 1
|
||||
var/canRturf = FALSE //Variable for R walls to deconstruct them
|
||||
var/adjacency_check = TRUE //Wheter it checks if the tool has to be in our hands or not. Wsed for the aux base construction drone's internal RCD
|
||||
|
||||
|
||||
/obj/item/construction/rcd/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..</span>")
|
||||
@@ -273,7 +275,7 @@ RLD
|
||||
/obj/item/construction/rcd/proc/check_menu(mob/living/user)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(user.incapacitated() || !user.Adjacent(src))
|
||||
if(user.incapacitated() || (adjacency_check && !user.Adjacent(src)))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -286,7 +288,7 @@ RLD
|
||||
"SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"),
|
||||
"WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest")
|
||||
)
|
||||
var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check, tooltips = TRUE)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(computerdirs)
|
||||
@@ -345,13 +347,13 @@ RLD
|
||||
"External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass)
|
||||
)
|
||||
|
||||
var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
|
||||
var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(airlockcat)
|
||||
if("Solid")
|
||||
if(advanced_airlock_setting == 1)
|
||||
var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
|
||||
var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(airlockpaint)
|
||||
@@ -396,7 +398,7 @@ RLD
|
||||
|
||||
if("Glass")
|
||||
if(advanced_airlock_setting == 1)
|
||||
var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
|
||||
var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(airlockpaint)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
src.Insert(loc)
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC)
|
||||
owner.med_hud_set_status()
|
||||
|
||||
@@ -990,3 +990,12 @@
|
||||
name = "Ore Silo (Machine Board)"
|
||||
build_path = /obj/machinery/ore_silo
|
||||
req_components = list()
|
||||
|
||||
/obj/item/circuitboard/machine/autobottler
|
||||
name = "Auto-Bottler (Machine Board)"
|
||||
build_path = /obj/machinery/rnd/production/protolathe/department/autobottler //Manips make you print things cheaper, even chems
|
||||
req_components = list(/obj/item/stock_parts/matter_bin = 5,
|
||||
/obj/item/stack/sheet/glass = 2,
|
||||
/obj/item/stock_parts/capacitor = 1,
|
||||
/obj/item/stack/cable_coil = 5,
|
||||
/obj/item/reagent_containers/glass/beaker = 6) //So it can hold lots of chems
|
||||
@@ -140,7 +140,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
|
||||
var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins
|
||||
var/new_icon = GLOB.pda_reskins[choice]
|
||||
if(QDELETED(src) || isnull(new_icon) || new_icon == icon || M.incapacitated() || !in_range(M,src))
|
||||
if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
|
||||
return
|
||||
icon = new_icon
|
||||
update_icon(FALSE, TRUE)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
/obj/item/pda/clown/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, .proc/AfterSlip))
|
||||
AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING|SLIP_WHEN_JOGGING, CALLBACK(src, .proc/AfterSlip))
|
||||
|
||||
/obj/item/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
|
||||
if (istype(M) && (M.real_name != owner))
|
||||
|
||||
@@ -697,7 +697,7 @@ Code:
|
||||
|
||||
if(href_list["mule"]) //MULEbots are special snowflakes, and need different args due to how they work.
|
||||
|
||||
active_bot.bot_control(command= href_list["mule"], user= usr, pda= 1)
|
||||
active_bot.bot_control(href_list["mule"], usr, TRUE)
|
||||
|
||||
if(!host_pda)
|
||||
return
|
||||
@@ -772,4 +772,4 @@ Code:
|
||||
return ""
|
||||
|
||||
//This is called for special abilities of cartridges
|
||||
/obj/item/cartridge/proc/special(mov/living/user, list/params)
|
||||
/obj/item/cartridge/proc/special(mob/living/user, list/params)
|
||||
|
||||
@@ -15,6 +15,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
|
||||
/obj/item/gps/examine(mob/user)
|
||||
..()
|
||||
var/turf/curr = get_turf(src)
|
||||
to_chat(user, "The screen says: [get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])")
|
||||
to_chat(user, "<span class='notice'>Alt-click to switch it [tracking ? "off":"on"].</span>")
|
||||
|
||||
/obj/item/gps/Initialize()
|
||||
|
||||
@@ -651,7 +651,7 @@ SLIME SCANNER
|
||||
|
||||
/proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src)
|
||||
var/icon = target
|
||||
user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(src))] [target].", "<span class='notice'>You use the analyzer on [icon2html(icon, user)] [target].</span>")
|
||||
user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "<span class='notice'>You use the analyzer on [icon2html(icon, user)] [target].</span>")
|
||||
to_chat(user, "<span class='boldnotice'>Results of analysis of [icon2html(icon, user)] [target].</span>")
|
||||
|
||||
var/list/airs = islist(mixture) ? mixture : list(mixture)
|
||||
|
||||
@@ -1,7 +1,19 @@
|
||||
/obj/item/implant/tracking
|
||||
name = "tracking implant"
|
||||
desc = "Track with this."
|
||||
activated = 0
|
||||
activated = FALSE
|
||||
var/lifespan_postmortem = 10 MINUTES //for how many deciseconds after user death will the implant work?
|
||||
var/allow_teleport = TRUE //will people implanted with this act as teleporter beacons?
|
||||
|
||||
/obj/item/implant/tracking/c38
|
||||
name = "TRAC implant"
|
||||
desc = "A smaller tracking implant that supplies power for only a few minutes."
|
||||
var/lifespan = 5 MINUTES //how many deciseconds does the implant last?
|
||||
allow_teleport = FALSE
|
||||
|
||||
/obj/item/implant/tracking/c38/Initialize()
|
||||
. = ..()
|
||||
QDEL_IN(src, lifespan)
|
||||
|
||||
/obj/item/implant/tracking/Initialize()
|
||||
. = ..()
|
||||
@@ -45,7 +57,7 @@
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Tracking Beacon<BR>
|
||||
<b>Life:</b> 10 minutes after death of host<BR>
|
||||
<b>Important Notes:</b> None<BR>
|
||||
<b>Important Notes:</b> Implant also works as a teleporter beacon.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Continuously transmits low power signal. Useful for tracking.<BR>
|
||||
|
||||
@@ -260,7 +260,7 @@
|
||||
function pageloaded(myframe) {
|
||||
document.getElementById("loading").style.display = "none";
|
||||
myframe.style.display = "inline";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<p id='loading'>You start skimming through the manual...</p>
|
||||
<iframe width='100%' height='97%' onload="pageloaded(this)" src="[wikiurl]/[page_link]?printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
|
||||
@@ -295,7 +295,7 @@
|
||||
function pageloaded(myframe) {
|
||||
document.getElementById("loading").style.display = "none";
|
||||
myframe.style.display = "block";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<p id='loading'>You start skimming through the manual...</p>
|
||||
<iframe width='100%' height='97%' onload="pageloaded(this)" src="[wikiurl]/[page_link]" frameborder="0" id="main_frame"></iframe>
|
||||
|
||||
@@ -265,7 +265,7 @@
|
||||
if (B && !QDELETED(B))
|
||||
H.internal_organs -= B
|
||||
qdel(B)
|
||||
new /obj/effect/gibspawner/generic(get_turf(H), H.dna)
|
||||
H.spawn_gibs()
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/attack_self(mob/user)
|
||||
|
||||
@@ -558,6 +558,37 @@
|
||||
item_state = "almaz"
|
||||
squeak_override = list('modular_citadel/sound/voice/raptor_purr.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/garou
|
||||
icon_state = "garou"
|
||||
item_state = "garou"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/augments
|
||||
icon_state = "augments"
|
||||
item_state = "augments"
|
||||
squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //I have no mouth and I must weh
|
||||
attack_verb = list("hugged", "patted", "snugged", "booped")
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/xekov
|
||||
icon_state = "xekov"
|
||||
item_state = "xekov"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/greg
|
||||
icon_state = "greg"
|
||||
item_state = "greg"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/sin
|
||||
icon_state = "sin"
|
||||
item_state = "sin"
|
||||
desc = "An adorable stuffed toy that resembles a lizardperson.. It faintly smells of sulfur."
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/ends
|
||||
icon_state = "ends"
|
||||
item_state = "ends"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/lyssa
|
||||
icon_state = "lyssa"
|
||||
item_state = "lyssa"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie
|
||||
name = "snake plushie"
|
||||
desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing."
|
||||
@@ -715,6 +746,14 @@
|
||||
item_state = "bhijn"
|
||||
attack_verb = list("closed", "reworked", "merged")
|
||||
|
||||
/obj/item/toy/plush/aiplush
|
||||
name = "AI plushie"
|
||||
desc = "A little stuffed toy AI core... it appears to be malfunctioning."
|
||||
icon_state = "exo"
|
||||
item_state = "exo"
|
||||
attack_verb = list("hacked", "detonated", "overloaded")
|
||||
squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/bird
|
||||
name = "bird plushie"
|
||||
desc = "An adorable stuffed plushie that resembles an avian."
|
||||
@@ -862,6 +901,18 @@
|
||||
item_state = "redwood"
|
||||
attack_verb = list("ordered", "bapped", "reprimanded")
|
||||
|
||||
/obj/item/toy/plush/mammal/marisol
|
||||
desc = "An adorable stuffed toy resembling a demi-wolf security officer."
|
||||
icon_state = "marisol"
|
||||
item_state = "marisol"
|
||||
attack_verb = list("arrested", "harmbattoned", "lasered")
|
||||
|
||||
/obj/item/toy/plush/mammal/minty
|
||||
desc = "An adorable stuffed toy resembling some sort of crew member. It smells like mint.."
|
||||
icon_state = "minty"
|
||||
item_state = "minty"
|
||||
attack_verb = list("freshened", "brushed")
|
||||
|
||||
/obj/item/toy/plush/mammal/dog
|
||||
desc = "An adorable stuffed toy that resembles a canine."
|
||||
icon_state = "katlin"
|
||||
@@ -929,8 +980,8 @@
|
||||
|
||||
/obj/item/toy/plush/catgirl/skylar
|
||||
desc = "An adorable stuffed toy that resembles a degenerate."
|
||||
icon_state = "skylar"
|
||||
item_state = "skylar"
|
||||
icon_state = "skylar2"
|
||||
item_state = "skylar2"
|
||||
attack_verb = list("powergamed", "merged", "tabled")
|
||||
squeak_override = list('sound/effects/meow1.ogg' = 1)
|
||||
|
||||
@@ -942,15 +993,15 @@
|
||||
desc = "A masked stuffed toy that resembles a feline scientist."
|
||||
icon_state = "trilby"
|
||||
item_state = "trilby"
|
||||
attack_verb = list("pred", "coded", "remembered")
|
||||
attack_verb = list("PR'd", "coded", "remembered")
|
||||
|
||||
/obj/item/toy/plush/catgirl/fermis
|
||||
name = "medcat plushie"
|
||||
desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people."
|
||||
icon_state = "fermis"
|
||||
item_state = "fermis"
|
||||
attack_verb = list("cuddled", "petpatted", "wigglepurred")
|
||||
squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1)
|
||||
name = "medcat plushie"
|
||||
desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people."
|
||||
icon_state = "fermis"
|
||||
item_state = "fermis"
|
||||
attack_verb = list("cuddled", "petpatted", "wigglepurred")
|
||||
squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/catgirl/mariaf
|
||||
desc = "An adorable stuffed toy that resembles a very tall cat girl."
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
* Runed Metal (cult)
|
||||
* Brass (clockwork cult)
|
||||
* Bronze (bake brass)
|
||||
* Cotton/Duracotton
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -186,31 +187,37 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
|
||||
*/
|
||||
GLOBAL_LIST_INIT(wood_recipes, list ( \
|
||||
new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
|
||||
new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
|
||||
new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
|
||||
new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \
|
||||
null, \
|
||||
new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
|
||||
new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
|
||||
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
|
||||
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
|
||||
null, \
|
||||
new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("plywood chair", /obj/structure/chair/comfy/plywood, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null, \
|
||||
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("rustic wooden door", /obj/structure/mineral_door/woodrustic, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null, \
|
||||
new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE),\
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
|
||||
new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
|
||||
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
|
||||
new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
|
||||
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
|
||||
new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),\
|
||||
new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = TRUE, on_floor = TRUE),\
|
||||
new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
|
||||
new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
|
||||
null, \
|
||||
new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
|
||||
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/mineral/wood
|
||||
@@ -272,6 +279,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
|
||||
resistance_flags = FLAMMABLE
|
||||
force = 0
|
||||
throwforce = 0
|
||||
pull_effort = 90
|
||||
is_fabric = TRUE
|
||||
loom_result = /obj/item/stack/sheet/silk
|
||||
merge_type = /obj/item/stack/sheet/cloth
|
||||
|
||||
/obj/item/stack/sheet/cloth/Initialize(mapload, new_amount, merge = TRUE)
|
||||
@@ -281,6 +291,22 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
|
||||
/obj/item/stack/sheet/cloth/ten
|
||||
amount = 10
|
||||
|
||||
/obj/item/stack/sheet/cloth/thirty
|
||||
amount = 30
|
||||
|
||||
/obj/item/stack/sheet/silk
|
||||
name = "silk"
|
||||
desc = "A long soft material. This one is just made out of cotton rather then any spiders or wyrms"
|
||||
singular_name = "silk sheet"
|
||||
icon_state = "sheet-silk"
|
||||
item_state = "sheet-cloth"
|
||||
novariants = TRUE
|
||||
merge_type = /obj/item/stack/sheet/silk
|
||||
|
||||
//obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE)
|
||||
// recipes = GLOB.silk_recipes
|
||||
// return ..()
|
||||
|
||||
//Durathread fuck slash-asterisk comments
|
||||
GLOBAL_LIST_INIT(durathread_recipes, list ( \
|
||||
new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40),
|
||||
@@ -649,6 +675,12 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
|
||||
pull_effort = 30
|
||||
loom_result = /obj/item/stack/sheet/cloth
|
||||
|
||||
/obj/item/stack/sheet/cotton/ten
|
||||
amount = 10
|
||||
|
||||
/obj/item/stack/sheet/cotton/thirty
|
||||
amount = 30
|
||||
|
||||
/obj/item/stack/sheet/cotton/durathread
|
||||
name = "raw durathread bundle"
|
||||
desc = "A bundle of raw durathread ready to be spun on the loom."
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
desc = "A large pillow depicting a girl in a compromising position. Featuring as many dimensions as you."
|
||||
icon = 'icons/obj/daki.dmi'
|
||||
icon_state = "daki_base"
|
||||
slot_flags = SLOT_BACK
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
var/cooldowntime = 20
|
||||
var/static/list/dakimakura_options = list("Callie","Casca","Chaika","Elisabeth","Foxy Grandpa","Haruko","Holo","Ian","Jolyne","Kurisu","Marie","Mugi","Nar'Sie","Patchouli","Plutia","Rei","Reisen","Naga","Squid","Squigly","Tomoko","Toriel","Umaru","Yaranaika","Yoko") //Kurisu is the ideal girl." - Me, Logos.
|
||||
|
||||
|
||||
@@ -288,7 +288,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
|
||||
generate_rubber_toolbox_icon()
|
||||
icon = GLOB.rubber_toolbox_icons[icon_state]
|
||||
AddComponent(/datum/component/bouncy)
|
||||
. = ..()
|
||||
|
||||
/obj/item/storage/toolbox/proc/generate_rubber_toolbox_icon()
|
||||
var/icon/new_icon = icon(icon, icon_state)
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
|
||||
|
||||
L.Knockdown(stunpwr)
|
||||
L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
|
||||
L.adjustStaminaLoss(stunpwr*0.1)//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
|
||||
L.apply_effect(EFFECT_STUTTER, stunforce)
|
||||
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
|
||||
if(user)
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
continue
|
||||
var/mob/living/M = W.imp_in
|
||||
if (M.stat == DEAD)
|
||||
if (M.timeofdeath + 6000 < world.time)
|
||||
if (M.timeofdeath + W.lifespan_postmortem < world.time)
|
||||
continue
|
||||
|
||||
var/turf/tr = get_turf(M)
|
||||
|
||||
@@ -1293,8 +1293,8 @@
|
||||
var/toysound = 'sound/machines/click.ogg'
|
||||
|
||||
/obj/item/toy/figure/New()
|
||||
desc = "A \"Space Life\" brand [src]."
|
||||
..()
|
||||
desc = "A \"Space Life\" brand [src]."
|
||||
..()
|
||||
|
||||
/obj/item/toy/figure/attack_self(mob/user as mob)
|
||||
if(cooldown <= world.time)
|
||||
@@ -1517,3 +1517,18 @@
|
||||
|
||||
/obj/item/toy/dummy/GetVoice()
|
||||
return doll_name
|
||||
|
||||
/obj/item/toy/seashell
|
||||
name = "seashell"
|
||||
desc = "May you always have a shell in your pocket and sand in your shoes. Whatever that's supposed to mean."
|
||||
icon = 'icons/misc/beach.dmi'
|
||||
icon_state = "shell1"
|
||||
var/static/list/possible_colors = list("" = 2, COLOR_PURPLE_GRAY = 1, COLOR_OLIVE = 1, COLOR_PALE_BLUE_GRAY = 1, COLOR_RED_GRAY = 1)
|
||||
|
||||
/obj/item/toy/seashell/Initialize()
|
||||
. = ..()
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
icon_state = "shell[rand(1,3)]"
|
||||
color = pickweight(possible_colors)
|
||||
setDir(pick(GLOB.cardinals))
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
update_icon()
|
||||
PopulateContents()
|
||||
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
|
||||
take_contents()
|
||||
addtimer(CALLBACK(src, .proc/take_contents), 0)
|
||||
if(secure)
|
||||
lockerelectronics = new(src)
|
||||
lockerelectronics.accesses = req_access
|
||||
|
||||
@@ -61,6 +61,11 @@
|
||||
..()
|
||||
for(var/i = 0, i < 4, i++)
|
||||
new /obj/item/reagent_containers/food/snacks/meat/slab/monkey(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/meat/open
|
||||
req_access = null
|
||||
locked = FALSE
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/fridge
|
||||
name = "refrigerator"
|
||||
|
||||
@@ -73,6 +78,10 @@
|
||||
for(var/i = 0, i < 2, i++)
|
||||
new /obj/item/storage/fancy/egg_box(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/fridge/open
|
||||
req_access = null
|
||||
locked = FALSE
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/money
|
||||
name = "freezer"
|
||||
desc = "This contains cold hard cash."
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
if (prob(40))
|
||||
new /obj/item/storage/toolbox/emergency(src)
|
||||
|
||||
switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 4, "delete" = 1)))
|
||||
switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 5)))
|
||||
if ("small")
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/tank/internals/emergency_oxygen(src)
|
||||
@@ -49,9 +49,7 @@
|
||||
if ("nothing")
|
||||
// doot
|
||||
|
||||
// teehee
|
||||
if ("delete")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/*
|
||||
* Fire Closet
|
||||
|
||||
@@ -182,3 +182,59 @@
|
||||
icon_state = "snowlegion"
|
||||
anchored = TRUE
|
||||
deconstructible = FALSE
|
||||
|
||||
/obj/structure/fluff/big_chain
|
||||
name = "giant chain"
|
||||
desc = "A towering link of chains leading up to the ceiling."
|
||||
icon = 'icons/effects/32x96.dmi'
|
||||
icon_state = "chain"
|
||||
layer = ABOVE_OBJ_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
deconstructible = FALSE
|
||||
|
||||
/obj/structure/fluff/railing
|
||||
name = "railing"
|
||||
desc = "Basic railing meant to protect idiots like you from falling."
|
||||
icon = 'icons/obj/fluff.dmi'
|
||||
icon_state = "railing"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
deconstructible = FALSE
|
||||
|
||||
/obj/structure/fluff/railing/corner
|
||||
icon_state = "railing_corner"
|
||||
density = FALSE
|
||||
|
||||
/obj/structure/fluff/beach_towel
|
||||
name = "beach towel"
|
||||
desc = "A towel decorated in various beach-themed designs."
|
||||
icon = 'icons/obj/fluff.dmi'
|
||||
icon_state = "railing"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
deconstructible = FALSE
|
||||
|
||||
/obj/structure/fluff/beach_umbrella
|
||||
name = "beach umbrella"
|
||||
desc = "A fancy umbrella designed to keep the sun off beach-goers."
|
||||
icon = 'icons/obj/fluff.dmi'
|
||||
icon_state = "brella"
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
deconstructible = FALSE
|
||||
|
||||
/obj/structure/fluff/beach_umbrella/security
|
||||
icon_state = "hos_brella"
|
||||
|
||||
/obj/structure/fluff/beach_umbrella/science
|
||||
icon_state = "rd_brella"
|
||||
|
||||
/obj/structure/fluff/beach_umbrella/engine
|
||||
icon_state = "ce_brella"
|
||||
|
||||
/obj/structure/fluff/beach_umbrella/cap
|
||||
icon_state = "cap_brella"
|
||||
|
||||
/obj/structure/fluff/beach_umbrella/syndi
|
||||
icon_state = "syndi_brella"
|
||||
|
||||
@@ -66,7 +66,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, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER)
|
||||
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER, ignore_dnr_observers = TRUE)
|
||||
|
||||
/datum/outfit/ashwalker
|
||||
name ="Ashwalker"
|
||||
@@ -133,7 +133,7 @@
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(!mapload && A)
|
||||
notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM)
|
||||
notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM, ignore_dnr_observers = TRUE)
|
||||
if(has_owner && creator)
|
||||
flavour_text = "<span class='big bold'>You are a Golem.</span><b> 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.</b>"
|
||||
@@ -372,7 +372,7 @@
|
||||
flavour_text = "<span class='big bold'>You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil.</span><b> Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell.</b>"
|
||||
var/area/A = get_area(src)
|
||||
if(!mapload && A)
|
||||
notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE)
|
||||
notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
|
||||
objectives = "Be [owner.name]'s friend, and keep [owner.name] alive, so you don't get sent back to hell."
|
||||
spell = summoning_spell
|
||||
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
number_of_rods = 2
|
||||
smooth = SMOOTH_TRUE
|
||||
canSmoothWith = null
|
||||
obj_flags = CAN_BE_HIT | BLOCK_Z_FALL
|
||||
|
||||
/obj/structure/lattice/catwalk/deconstruction_hints(mob/user)
|
||||
to_chat(user, "<span class='notice'>The supporting rods look like they could be <b>cut</b>.</span>")
|
||||
|
||||
@@ -104,12 +104,12 @@
|
||||
playing = FALSE
|
||||
hearing_mobs = null
|
||||
return
|
||||
if(!lentext(note))
|
||||
if(!length(note))
|
||||
continue
|
||||
var/cur_note = text2ascii(note) - 96
|
||||
if(cur_note < 1 || cur_note > 7)
|
||||
continue
|
||||
for(var/i=2 to lentext(note))
|
||||
for(var/i=2 to length(note))
|
||||
var/ni = copytext(note,i,i+1)
|
||||
if(!text2num(ni))
|
||||
if(ni == "#" || ni == "b" || ni == "n")
|
||||
@@ -209,7 +209,7 @@
|
||||
lines.Cut(MUSIC_MAXLINES + 1)
|
||||
var/linenum = 1
|
||||
for(var/l in lines)
|
||||
if(lentext(l) > MUSIC_MAXLINECHARS)
|
||||
if(length(l) > MUSIC_MAXLINECHARS)
|
||||
to_chat(usr, "Line [linenum] too long!")
|
||||
lines.Remove(l)
|
||||
else
|
||||
@@ -236,11 +236,11 @@
|
||||
if(!in_range(instrumentObj, usr))
|
||||
return
|
||||
|
||||
if(lentext(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
|
||||
if(length(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
|
||||
var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
|
||||
if(cont == "no")
|
||||
break
|
||||
while(lentext(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
|
||||
while(length(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
|
||||
ParseSong(t)
|
||||
|
||||
else if(href_list["help"])
|
||||
@@ -272,7 +272,7 @@
|
||||
return
|
||||
if(lines.len > MUSIC_MAXLINES)
|
||||
return
|
||||
if(lentext(newline) > MUSIC_MAXLINECHARS)
|
||||
if(length(newline) > MUSIC_MAXLINECHARS)
|
||||
newline = copytext(newline, 1, MUSIC_MAXLINECHARS)
|
||||
lines.Add(newline)
|
||||
|
||||
@@ -287,7 +287,7 @@
|
||||
var/content = html_encode(input("Enter your line: ", instrumentObj.name, lines[num]) as text|null)
|
||||
if(!content || !in_range(instrumentObj, usr))
|
||||
return
|
||||
if(lentext(content) > MUSIC_MAXLINECHARS)
|
||||
if(length(content) > MUSIC_MAXLINECHARS)
|
||||
content = copytext(content, 1, MUSIC_MAXLINECHARS)
|
||||
if(num > lines.len || num < 1)
|
||||
return
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
name = "bar"
|
||||
desc = "A direction sign, pointing out which way the Bar is."
|
||||
icon_state = "direction_bar"
|
||||
/obj/structure/sign/directions/cafe
|
||||
|
||||
/obj/structure/sign/directions/cafe
|
||||
name = "cafe"
|
||||
desc = "A direction sign, pointing out which way the Cafe is."
|
||||
icon_state = "direction_cafe"
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
#define STAIR_TERMINATOR_AUTOMATIC 0
|
||||
#define STAIR_TERMINATOR_NO 1
|
||||
#define STAIR_TERMINATOR_YES 2
|
||||
|
||||
// dir determines the direction of travel to go upwards (due to lack of sprites, currently only 1 and 2 make sense)
|
||||
// stairs require /turf/open/openspace as the tile above them to work
|
||||
// multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain
|
||||
|
||||
/obj/structure/stairs
|
||||
name = "stairs"
|
||||
icon = 'icons/obj/stairs.dmi'
|
||||
icon_state = "stairs"
|
||||
anchored = TRUE
|
||||
|
||||
var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace
|
||||
var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC
|
||||
var/turf/listeningTo
|
||||
|
||||
/obj/structure/stairs/Initialize(mapload)
|
||||
if(force_open_above)
|
||||
force_open_above()
|
||||
build_signal_listener()
|
||||
update_surrounding()
|
||||
return ..()
|
||||
|
||||
/obj/structure/stairs/Destroy()
|
||||
listeningTo = null
|
||||
return ..()
|
||||
|
||||
/obj/structure/stairs/Move() //Look this should never happen but...
|
||||
. = ..()
|
||||
if(force_open_above)
|
||||
build_signal_listener()
|
||||
update_surrounding()
|
||||
|
||||
/obj/structure/stairs/proc/update_surrounding()
|
||||
update_icon()
|
||||
for(var/i in GLOB.cardinals)
|
||||
var/turf/T = get_step(get_turf(src), i)
|
||||
var/obj/structure/stairs/S = locate() in T
|
||||
if(S)
|
||||
S.update_icon()
|
||||
|
||||
/obj/structure/stairs/Uncross(atom/movable/AM, turf/newloc)
|
||||
if(!newloc || !AM)
|
||||
return ..()
|
||||
if(!isobserver(AM) && isTerminator() && (get_dir(src, newloc) == dir))
|
||||
stair_ascend(AM)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/structure/stairs/Cross(atom/movable/AM)
|
||||
if(isTerminator() && (get_dir(src, AM) == dir))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/structure/stairs/update_icon()
|
||||
if(isTerminator())
|
||||
icon_state = "stairs_t"
|
||||
else
|
||||
icon_state = "stairs"
|
||||
|
||||
/obj/structure/stairs/proc/stair_ascend(atom/movable/AM)
|
||||
var/turf/checking = get_step_multiz(get_turf(src), UP)
|
||||
if(!istype(checking))
|
||||
return
|
||||
if(!checking.zPassIn(AM, UP, get_turf(src)))
|
||||
return
|
||||
var/turf/target = get_step_multiz(get_turf(src), (dir|UP))
|
||||
if(istype(target) && !target.can_zFall(AM, null, get_step_multiz(target, DOWN))) //Don't throw them into a tile that will just dump them back down.
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
var/pulling = L.pulling
|
||||
if(pulling)
|
||||
L.pulling.forceMove(target)
|
||||
L.forceMove(target)
|
||||
L.start_pulling(pulling)
|
||||
else
|
||||
AM.forceMove(target)
|
||||
|
||||
/obj/structure/stairs/vv_edit_var(var_name, var_value)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(var_name != NAMEOF(src, force_open_above))
|
||||
return
|
||||
if(!var_value)
|
||||
if(listeningTo)
|
||||
UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW)
|
||||
listeningTo = null
|
||||
else
|
||||
build_signal_listener()
|
||||
force_open_above()
|
||||
|
||||
/obj/structure/stairs/proc/build_signal_listener()
|
||||
if(listeningTo)
|
||||
UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW)
|
||||
var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP)
|
||||
RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_new)
|
||||
listeningTo = T
|
||||
|
||||
/obj/structure/stairs/proc/force_open_above()
|
||||
var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP)
|
||||
if(T && !istype(T))
|
||||
T.ChangeTurf(/turf/open/openspace)
|
||||
|
||||
/obj/structure/stairs/proc/on_multiz_new(turf/source, dir)
|
||||
if(dir == UP)
|
||||
var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP)
|
||||
if(T && !istype(T))
|
||||
T.ChangeTurf(/turf/open/openspace)
|
||||
|
||||
/obj/structure/stairs/intercept_zImpact(atom/movable/AM, levels = 1)
|
||||
. = ..()
|
||||
if(isTerminator())
|
||||
. |= FALL_INTERCEPTED | FALL_NO_MESSAGE
|
||||
|
||||
/obj/structure/stairs/proc/isTerminator() //If this is the last stair in a chain and should move mobs up
|
||||
if(terminator_mode != STAIR_TERMINATOR_AUTOMATIC)
|
||||
return (terminator_mode == STAIR_TERMINATOR_YES)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return FALSE
|
||||
var/turf/them = get_step(T, dir)
|
||||
if(!them)
|
||||
return FALSE
|
||||
for(var/obj/structure/stairs/S in them)
|
||||
if(S.dir == dir)
|
||||
return FALSE
|
||||
return TRUE
|
||||
Reference in New Issue
Block a user