[MIRROR] various map related features (#11724)

Co-authored-by: Olive <49600480+zeskorion@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-09-22 05:08:26 -07:00
committed by GitHub
parent ef9f5f2499
commit 94900aedc0
23 changed files with 518 additions and 9 deletions

View File

@@ -9,6 +9,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
anchored = TRUE
density = FALSE
var/random = FALSE //For random tummels- spits the micro out at a random location.
var/magic = FALSE //For events and stuff, if true, this tunnel will show up in the list regardless of whether it's in valid range, of if you're in a tunnel with this var, all tunnels of the same faction will show up redardless of range
micro_target = TRUE
@@ -278,6 +279,9 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
/obj/structure/micro_tunnel/magic
magic = TRUE
/obj/structure/micro_tunnel/random
random = TRUE
/obj/Initialize(mapload)
. = ..()
if(micro_target)

View File

@@ -26,8 +26,8 @@
/obj/effect/decal/cleanable/blood/oil/streak,
/obj/effect/decal/cleanable/bug_remains,
/obj/effect/decal/remains/mouse,
/obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/blood/splatter,
/obj/effect/decal/cleanable/vomit/old,
/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/cleanable/ash,
/obj/effect/decal/cleanable/generic,
/obj/effect/decal/cleanable/flour,

View File

@@ -0,0 +1,17 @@
/obj/structure/dummystairs
name = "stairs"
desc = "A short set of stairs"
icon = 'icons/obj/dummystairs.dmi'
icon_state = "stair"
anchored = TRUE
density = FALSE
layer = 2.5
/obj/structure/dummystairs/bronzeledge
icon_state = "stair_bronze"
/obj/structure/dummystairs/greyledge
icon_state = "stair_grey"
/obj/structure/dummystairs/hazardledge
icon_state = "stair_hazard"

View File

@@ -243,3 +243,14 @@
qdel(src)
return
return
/obj/structure/railing/overhang/hazard
name = "hazardous ledge"
desc = "An overhang made of a steel. It's painted with vibrant hazard markings."
icon = 'icons/obj/railing.dmi'
icon_modifier = "hazard_"
icon_state = "hazard_railing0"
/obj/structure/railing/overhang/hazard/nanite
icon_modifier = "inactive_"
icon_state = "inactive_railing0"

View File

@@ -1293,3 +1293,65 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/arrows
name = "floor arrows"
icon_state = "arrows"
//cetus plaques
/obj/effect/floor_decal/cetus/cetus1
name = "cetus1"
icon_state = "cetus1"
/obj/effect/floor_decal/cetus/cetus2
name = "cetus2"
icon_state = "cetus2"
/obj/effect/floor_decal/cetus/cetus3
name = "cetus3"
icon_state = "cetus3"
/obj/effect/floor_decal/cetus/cetus4
name = "cetus4"
icon_state = "cetus4"
/obj/effect/floor_decal/cetus/cetus5
name = "cetus5"
icon_state = "cetus5"
/obj/effect/floor_decal/cetus/cetus6
name = "cetus6"
icon_state = "cetus6"
/obj/effect/floor_decal/cetus/cetus7
name = "cetus7"
icon_state = "cetus7"
/obj/effect/floor_decal/cetus/cetus8
name = "cetus8"
icon_state = "cetus8"
/obj/effect/floor_decal/cetus/cetus9
name = "cetus9"
icon_state = "cetus9"
/obj/effect/floor_decal/cetus/andromeda1
name = "andromeda1"
icon_state = "andromeda1"
/obj/effect/floor_decal/cetus/andromeda2
name = "andromeda2"
icon_state = "andromeda2"
/obj/effect/floor_decal/cetus/andromeda3
name = "andromeda3"
icon_state = "andromeda3"
/obj/effect/floor_decal/cetus/andromeda4
name = "andromeda4"
icon_state = "andromeda4"
/obj/effect/floor_decal/cetus/andromeda5
name = "andromeda5"
icon_state = "andromeda5"
/obj/effect/floor_decal/cetus/andromeda6
name = "andromeda6"
icon_state = "andromeda6"

View File

@@ -1,6 +1,8 @@
/datum/turf_initializer/maintenance/InitializeTurf(var/turf/simulated/T)
if(T.density)
return
if(!T.can_dirty)
return
// Quick and dirty check to avoid placing things inside windows
if(locate(/obj/structure/grille, T))
return
@@ -58,3 +60,21 @@
if(dir == EAST)
new /obj/effect/decal/cleanable/cobweb2(T)
return
/datum/turf_initializer/maintenance/shallow/InitializeTurf(var/turf/simulated/dirty)
if(dirty.density)
return
if(!dirty.can_dirty)
return
// Quick and dirty check to avoid placing things inside windows
if(locate(/obj/structure/grille, dirty))
return
var/cardinal_turfs = dirty.CardinalTurfs()
dirty.dirt = rand(10, 50) + rand(10, 50)
// If a neighbor is dirty, then we get dirtier.
var/how_dirty = dirty_neighbors(cardinal_turfs)
for(var/i = 0; i < how_dirty; i++)
dirty.dirt += rand(0,10)
dirty.update_dirt()

View File

@@ -0,0 +1,345 @@
GLOBAL_LIST_BOILERPLATE(nanite_turfs, /turf/simulated/floor/water/digestive_enzymes/nanites)
//half of this code is ripped from digestive enzymes themselves, with runtimes and such trimmed
/turf/simulated/floor/water/digestive_enzymes/nanites //i just wanted to map, why has it come to making such terrible crimes against humanity
name = "nanite-infested tiles."
desc = "This section of reinforced plating appears to host a colony of nanites between the tiles"
icon = 'icons/turf/nanitegoo.dmi'
icon_state = "composite"
water_icon = 'icons/turf/nanitegoo.dmi'
water_state = "goo_inactive"
under_state = "reinforced"
depth = 0
movement_cost = 0
mobstuff = FALSE
footstep = FOOTSTEP_PLATING
barefootstep = FOOTSTEP_HARD_BAREFOOT
clawfootstep = FOOTSTEP_HARD_CLAW
watercolor = "black"
reagent_type = REAGENT_ID_LIQUIDPROTEAN
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
temperature = T20C
var/digesting = FALSE
var/digest_synth = FALSE
var/digest_robot = FALSE
var/active = FALSE
var/usesmes = TRUE
var/datum/weakref/moblink
var/datum/weakref/linkedsmes //when the nanites digest something, it becomes power in an SMES
var/id = null
/turf/simulated/floor/water/digestive_enzymes/nanites/Initialize(mapload)
. = ..()
for(var/obj/machinery/power/smes/tolink in GLOB.smeses)
if(!tolink)
continue
if(!get_area(tolink))
continue
if(get_area(tolink) == get_area(src))
linkedsmes = WEAKREF(tolink)
/turf/simulated/floor/water/digestive_enzymes/nanites/attack_hand(mob/user)
var/mob/living/nutrienttarget = moblink?.resolve()
var/obj/machinery/power/smes/smes = linkedsmes?.resolve()
if(check_target() && (user != nutrienttarget))//prioritize this here, so mobs can turn the turf off
return ..()
if(ishuman(user))
if(smes || isAI(nutrienttarget))
return ..()
var/mob/living/carbon/human/checker = user
if(checker.nif)//Proteans have NIFS
var/choice1 = tgui_input_list(user, "Do you wish interface with \the [src]", "Desired state", list("On", "Off"))
switch(choice1)
if("On")
var/choice2 = tgui_input_list(user, "Which entities do you wish for \the [src] to recycle?", "Desired targets", list("None", "All", "Organics and Cyborgs", "Organics and Synthetics", "Only Organics"))
if(checker.isSynthetic())
to_chat(checker, span_warning("With you in control, \the [src] will not attempt to recycle your body, no matter the setting you pick"))
else
to_chat(checker, span_warning("You realize there is no way for the simplistic [src] to ignore your form, if you set it to recycle."))
user.visible_message(span_warning("\The [user] inspects \the [src]"), span_warning("You begin to interface with \the [src]."))
if(do_after(user, 30, src))
moblink = WEAKREF(user)
switch(choice2)
if("None")
moblink = WEAKREF(user)
toggle_all(TRUE)
if("All")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE, TRUE, TRUE)
if("Organics and Cyborgs")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE, TRUE)
if("Organics and Synthetics")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE, FALSE, TRUE)
if("Only Organics")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE)
if("Off")
if(active)
user.visible_message(span_warning("\The [user] inspects \the [src]"), span_warning("You begin to interface with \the [src]."))
if(do_after(user, 30, src))
toggle_all(FALSE)
return ..()
/turf/simulated/floor/water/digestive_enzymes/nanites/attack_ai(mob/user)
var/mob/living/nutrienttarget = moblink?.resolve()
var/obj/machinery/power/smes/smes = linkedsmes?.resolve()
if(isrobot(user) && !isshell(user))
if(smes || isAI(nutrienttarget))
return ..()
if(check_target() && user != nutrienttarget)
return ..()
if(isAI(user) || isshell(user))// AI have priority
if(check_target())
if(isAI(nutrienttarget) && user != nutrienttarget)//first come first serve, for AI
if(isshell(user))
return ..()
if(!locate(user) in range(1, src))// AI can always control adjacent nanite tiles
return ..()
var/choice1 = tgui_input_list(user, "Do you wish interface with \the [src]", "Desired state", list("On", "Off"))
switch(choice1)
if("On")
var/choice2 = tgui_input_list(user, "Which entities do you wish for [src] to recycle?", "Desired targets", list("None", "All", "Organics and Cyborgs", "Organics and Synthetics", "Only Organics"))
to_chat(user, span_warning("With you in control, \the [src] will not attempt to recycle your body, no matter the setting you pick"))
switch(choice2)
if("None")
moblink = WEAKREF(user)
toggle_all(TRUE)
if("All")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE, TRUE, TRUE)
if("Organics and Cyborgs")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE, TRUE)
if("Organics and Synthetics")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE, FALSE, TRUE)
if("Only Organics")
moblink = WEAKREF(user)
toggle_all(TRUE, TRUE)
if("Off")
if(active)
toggle_all(FALSE)
/turf/simulated/floor/water/digestive_enzymes/nanites/can_digest(atom/movable/AM) //copypasting the entire proc because we use an SMES instead of a linked mob
. = FALSE
var/mob/living/nutrienttarget = moblink?.resolve()
if(!active)
return FALSE
if(!check_target())
return FALSE
if(!digesting)
return FALSE
if(AM.loc != src)
return FALSE
if(isitem(AM))
var/obj/item/targetitem = AM
if(targetitem.unacidable || targetitem.throwing || targetitem.is_incorporeal() || !targetitem)
return FALSE
var/food = FALSE
if(istype(targetitem,/obj/item/reagent_containers/food))
food = TRUE
if(prob(95)) //Give people a chance to pick them up
return TRUE
targetitem.visible_message(span_warning("\The [targetitem] sizzles..."))
var/yum = targetitem.digest_act() //Glorp
if(istype(targetitem , /obj/item/card))
yum = 0 //No, IDs do not have infinite nutrition, thank you
if(yum)
if(food)
yum += 50
give_nutrients(yum)
return TRUE
if(isliving(AM))
var/mob/living/targetmob = AM
if(targetmob.unacidable || !targetmob.digestable || targetmob.buckled || targetmob.hovering || targetmob.throwing || targetmob.is_incorporeal())
return FALSE
if(isrobot(targetmob))
if(!digest_robot)
return FALSE
if(targetmob == nutrienttarget)
return FALSE
if(ishuman(targetmob))
var/mob/living/carbon/human/targethuman = targetmob
if(targethuman.isSynthetic())
if(!digest_synth)
return FALSE
if(targetmob == nutrienttarget)
return FALSE
if(!targethuman.pl_suit_protected())
return TRUE
if(targethuman.resting && !targethuman.pl_head_protected())
return TRUE
return TRUE
/turf/simulated/floor/water/digestive_enzymes/nanites/proc/check_target()//check if the target is in the area, or if this is a
var/mob/living/nutrienttarget = moblink?.resolve()
var/obj/machinery/power/smes/smes = linkedsmes?.resolve()
if(nutrienttarget)
if(nutrienttarget.client && !nutrienttarget.stat)
if(smes && isAI(nutrienttarget))
return nutrienttarget
if(get_area(nutrienttarget))
if(get_area(nutrienttarget) == get_area(src))
return nutrienttarget
toggle_all(FALSE)
return FALSE
/turf/simulated/floor/water/digestive_enzymes/nanites/digest_stuff(atom/movable/AM) //copypasting the entire proc because we use an SMES instead of a linked mob
. = FALSE
var/damage = 2
var/list/stuff = list()
var/nutrients = 0
for(var/thing in src)
if(can_digest(thing))
stuff |= thing
if(!stuff.len)
return FALSE
var/thing = pick(stuff) //We only think about one thing at a time, otherwise things get wacky
. = TRUE
if(iscarbon(thing))
var/mob/living/carbon/targetcarbon = thing
if(!targetcarbon)
return
if(targetcarbon.stat == DEAD)
targetcarbon.unacidable = TRUE //Don't touch this one again, we're gonna delete it in a second
targetcarbon.release_vore_contents()
for(var/obj/item/targetitem in targetcarbon)
if(istype(targetitem, /obj/item/organ/internal/mmi_holder/posibrain))
var/obj/item/organ/internal/mmi_holder/MMI = targetitem
MMI.removed()
if(istype(targetitem, /obj/item/organ))
targetitem.unacidable = TRUE
continue
if(istype(targetitem, /obj/item/implant/backup) || istype(targetitem, /obj/item/nif))
continue
targetcarbon.drop_from_inventory(targetitem)
var/how_much = targetcarbon.mob_size + targetcarbon.nutrition
if(!targetcarbon.ckey)
how_much = how_much / 10 //Braindead mobs are worth less
nutrients += how_much
targetcarbon.mind?.vore_death = TRUE
GLOB.prey_digested_roundstat++
qdel(targetcarbon) //glorp
return
targetcarbon.adjustFireLoss(damage)
var/how_much = (damage * targetcarbon.size_multiplier) * targetcarbon.get_digestion_nutrition_modifier()
if(!targetcarbon.ckey)
how_much = how_much / 10 //Braindead mobs are worth less
nutrients += how_much
if(targetcarbon.bloodstr.get_reagent_amount(REAGENT_ID_NUMBENZYME) < 2) //best play it safe with digestion pain
targetcarbon.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,4)
nutrients += how_much
else if (isliving(thing))
var/mob/living/targetmob = thing
if(!targetmob)
return
if(targetmob.stat == DEAD)
targetmob.unacidable = TRUE //Don't touch this one again, we're gonna delete it in a second
targetmob.release_vore_contents()
var/how_much = targetmob.mob_size + targetmob.nutrition
if(!targetmob.ckey)
how_much = how_much / 10 //Braindead mobs are worth less
nutrients += how_much
qdel(targetmob) //gloop
return
targetmob.adjustFireLoss(damage)
var/how_much = (damage * targetmob.size_multiplier) * targetmob.get_digestion_nutrition_modifier()
if(!targetmob.ckey)
how_much = how_much / 10 //Braindead mobs are worth less
nutrients += how_much
give_nutrients(nutrients)
/turf/simulated/floor/water/digestive_enzymes/nanites/proc/give_nutrients(var/amt)
var/mob/living/nutrienttarget = moblink?.resolve()
var/obj/machinery/power/smes/smes = linkedsmes?.resolve()
if(smes)
smes.charge += (amt * 20)
return
if(nutrienttarget)
if(ishuman(nutrienttarget))
var/mob/living/carbon/human/targetcarbon = nutrienttarget
if(targetcarbon.isSynthetic())
targetcarbon.nutrition = targetcarbon.nutrition+(10 * amt * (1-min(targetcarbon.species.synthetic_food_coeff, 0.9)))
return
if(isrobot(nutrienttarget))
var/mob/living/silicon/robot/targetrobot = nutrienttarget
if(targetrobot.cell)
targetrobot.cell.give(amt * 20)
return
/turf/simulated/floor/water/digestive_enzymes/nanites/return_air_for_internal_lifeform(var/mob/living/targetmob)
if(!can_digest(targetmob))
return return_air() //Nanites should always be nonlethal until the AI turns on digestion
return ..()
/turf/simulated/floor/water/digestive_enzymes/nanites/proc/toggle_all(var/on = TRUE, var/digest = FALSE, var/robot = FALSE, var/synth = FALSE)
var/mob/living/nutrienttarget = moblink?.resolve()
for(var/turf/simulated/floor/water/digestive_enzymes/nanites/nanites in GLOB.nanite_turfs)
if(nanites.id == id)
nanites.moblink = null
if(on)
nanites.moblink = WEAKREF(nutrienttarget)
nanites.select_state(on, digest, robot, synth)
/turf/simulated/floor/water/digestive_enzymes/nanites/proc/select_state(var/on = TRUE, var/digest = FALSE, var/robot = FALSE, var/synth = FALSE)
if(!on)
name = "nanite-infested tiles."
desc = "This section of reinforced plating appears to host a colony of nanites between the tiles"
depth = 0
movement_cost = 0
footstep = FOOTSTEP_PLATING
barefootstep = FOOTSTEP_HARD_BAREFOOT
clawfootstep = FOOTSTEP_HARD_CLAW
water_state = "goo_inactive"
digesting = FALSE
digest_synth = FALSE
digest_robot = FALSE
active = FALSE
for(var/obj/structure/railing/overhang/hazard/nanite/R in src)
R.icon_modifier = "inactive_"
R.icon_state = "inactive_railing0"
for(var/obj/structure/railing/overhang/hazard/nanite/R in range(src, 1))
R.update_icon()
for(var/obj/structure/dummystairs/hazardledge/stairs in src)
stairs.icon_state = "stair_hazard"
stairs.update_icon()
update_icon()
return
name = "nanite goop."
desc = "A deep pool of pulsating, possibly deadly nanite goop."
depth = 2
movement_cost = 16 //twice as difficult as deep water to navigate
footstep = FOOTSTEP_WATER
barefootstep = FOOTSTEP_WATER
clawfootstep = FOOTSTEP_WATER
water_state = "goo_active"
digesting = digest
digest_synth = synth
digest_robot = robot
active = TRUE
for(var/obj/structure/railing/overhang/hazard/nanite/R in src)
R.icon_modifier = "active_"
R.icon_state = "active_railing0"
for(var/obj/structure/railing/overhang/hazard/nanite/R in range(src, 1))
R.update_icon()
for(var/obj/structure/dummystairs/hazardledge/stairs in src)
depth = 1
movement_cost = 8
stairs.icon_state = "stair_hazard_nanite"
stairs.update_icon()
for(var/atom/AM in src)
Entered(AM)
update_icon()
/turf/simulated/floor/water/digestive_enzymes/nanites/Destroy()
moblink = null
linkedsmes = null
return ..()

View File

@@ -22,6 +22,8 @@
var/reagent_type = REAGENT_ID_WATER
// var/datum/looping_sound/water/soundloop CHOMPEdit: Removing soundloop for now.
var/watercolor = null
/turf/simulated/floor/water/Initialize(mapload)
. = ..()
update_icon()

View File

@@ -212,6 +212,8 @@
if(T.movement_cost && !flying) //If you are flying you are probably not affected by the terrain on the ground.
var/turf_move_cost = T.movement_cost
if(locate(/obj/structure/catwalk) in T) //catwalks prevent turfs from slowing your
return 0
if(istype(T, /turf/simulated/floor/water))
if(species.water_movement)
turf_move_cost = CLAMP(turf_move_cost + species.water_movement, HUMAN_LOWEST_SLOWDOWN, 15)

View File

@@ -705,13 +705,31 @@
H.adjustToxLoss(amount)
/datum/species/proc/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary)
if(soft_landing)
if(planetary || !istype(H))
return FALSE
var/turf/landing = get_turf(hit_atom)
if(!istype(landing))
return FALSE
if(planetary || !istype(H))
return FALSE
//commented out, as this turf doesn't exist upstream
/*if(istype(landing, /turf/simulated/floor/boxing))
if(!silent)
to_chat(H, span_notice("\The [landing] cushions your fall."))
landing.visible_message(span_infoplain(span_bold("\The [H]") + " 's fall is cushioned by \The [landing]."))
playsound(H, "rustle", 25, 1)
if(!soft_landing)
H.Weaken(10)
return TRUE*/
//end edit
if(istype(landing, /turf/simulated/floor/water))
var/turf/simulated/floor/water/W = landing
if(W.depth)
if(!silent)
to_chat(H, span_notice("You splash down into \the [landing]."))
landing.visible_message(span_infoplain(span_bold("\The [H]") + " splashes down into \The [landing]."))
playsound(H, "'sound/effects/slosh.ogg'", 25, 5)
return TRUE
var/turf/landing = get_turf(hit_atom)
if(!istype(landing))
return FALSE
if(soft_landing)
if(!silent)
to_chat(H, span_notice("You manage to lower impact of the fall and land safely."))

View File

@@ -281,12 +281,23 @@
var_changes = list("water_breather" = 1, "water_movement" = -4) //Negate shallow water. Half the speed in deep water.
allowed_species = list(SPECIES_HANNER, SPECIES_CUSTOM) //So it only shows up for custom species and hanner
custom_only = FALSE
excludes = list(/datum/trait/positive/good_swimmer, /datum/trait/negative/bad_swimmer, /datum/trait/positive/aquatic/plus)
/datum/trait/positive/aquatic/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..()
add_verb(H, /mob/living/carbon/human/proc/water_stealth)
add_verb(H, /mob/living/carbon/human/proc/underwater_devour)
/datum/trait/positive/aquatic/plus
name = "Aquatic 2"
desc = "You can breathe under water and can traverse water more efficiently than most aquatic humanoids. Additionally, you can eat others in the water."
cost = 2
custom_only = FALSE
var_changes = list("water_breather" = 1, "water_movement" = -4, "swim_mult" = 0.5) //Negate shallow water. Half the speed in deep water.
allowed_species = list(SPECIES_HANNER, SPECIES_CUSTOM) //So it only shows up for custom species and hanner
custom_only = FALSE
excludes = list(/datum/trait/positive/good_swimmer, /datum/trait/negative/bad_swimmer, /datum/trait/positive/aquatic)
/datum/trait/positive/cocoon_tf
name = "Cocoon Spinner"
desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire."

View File

@@ -1199,6 +1199,10 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
var/atom/A = loc // We'd better be swimming and on a turf
var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve
I.color = A.color
if(istype(A, /turf/simulated/floor/water))
var/turf/simulated/floor/water/underwater = A
if(underwater.watercolor)
I.color = underwater.watercolor
overlays_standing[MOB_WATER_LAYER] = I
apply_layer(MOB_WATER_LAYER)

View File

@@ -1432,6 +1432,7 @@
water_icon = 'icons/turf/stomach_vr.dmi'
water_state = "enzyme_shallow"
under_state = "flesh_floor"
watercolor = "green"
reagent_type = REAGENT_ID_SACID //why not
outdoors = FALSE

View File

@@ -671,6 +671,13 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
/datum/nifsoft/malware
)
/obj/item/nif/glitch/bad
name = "odd NIF"
desc = "A NIF of a very dubious origin."
durability = 100
bioadap = FALSE
////////////////////////////////
// Special Promethean """surgery"""
/obj/item/nif/attack(mob/living/M, mob/living/user, var/target_zone)

View File

@@ -304,6 +304,7 @@ GLOBAL_LIST_EMPTY(light_type_cache)
/obj/machinery/light/small/emergency
light_type = /obj/item/light/bulb/red
nightshift_allowed = FALSE
/obj/machinery/light/small/emergency/flicker
auto_flicker = TRUE

View File

@@ -23,6 +23,8 @@
var/turf/base_turf
//Name of the shuttle, null for generic waypoint
var/shuttle_restricted
//does it use docking codes?
var/use_docking_codes = TRUE
/obj/effect/shuttle_landmark/Initialize(mapload)
. = ..()
@@ -54,7 +56,7 @@
log_mapping("Could not find docking controller for shuttle waypoint '[name]', docking tag was '[docking_tag]'.")
if(using_map.use_overmap)
var/obj/effect/overmap/visitable/location = get_overmap_sector(z)
if(location && location.docking_codes)
if(location && location.docking_codes && use_docking_codes)
docking_controller.docking_codes = location.docking_codes
/obj/effect/shuttle_landmark/forceMove()

BIN
icons/obj/dummystairs.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 162 KiB

BIN
icons/turf/nanitegoo.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1893,6 +1893,7 @@
#include "code\game\objects\structures\dogbed.dm"
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\droppod.dm"
#include "code\game\objects\structures\dummystairs.dm"
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\fence.dm"
@@ -2063,6 +2064,7 @@
#include "code\game\turfs\simulated\floor_types_eris.dm"
#include "code\game\turfs\simulated\floor_types_vr.dm"
#include "code\game\turfs\simulated\lava.dm"
#include "code\game\turfs\simulated\nanogoop.dm"
#include "code\game\turfs\simulated\underwater.dm"
#include "code\game\turfs\simulated\wall_attacks.dm"
#include "code\game\turfs\simulated\wall_icon.dm"