New Away Site: Hiskyn Treasure Trove (#21324)

EDIT: This is complete and no longer a work in progress. I've tried to
make sure that everything is tested and working properly but if there
are issues please let me know.

This away site is intended to be a high risk, high reward, encounter.
I'm also attempting to increase its replayability by incorporating a
number of sections and submaps that will be newly generated each time.

Things added or changed:
- Additional traps and environmental hazards.
- Lava is now more deadly. It used to only set you on fire, now it will
burn you appropriately.
- Minor sprite fixes for uncommon elements for easier mapping; throwers,
step triggers.
- Map and associated files, submap json, landmarks, areas, ect.

---------

Signed-off-by: Evandorf <ej_denton@msn.com>
Co-authored-by: Kano <89972582+kano-dot@users.noreply.github.com>
This commit is contained in:
Evandorf
2025-10-16 20:04:28 +00:00
committed by GitHub
co-authored by Kano
parent 868f199131
commit 4e2d34df8f
27 changed files with 184717 additions and 174 deletions
@@ -63,6 +63,11 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.apply_radiation(5)
STOP_PROCESSING(SSprocessing, src)
/obj/effect/decal/cleanable/greenglow/radioactive/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)
/obj/effect/decal/cleanable/greenglow/radioactive/process()
SSradiation.radiate(src, 25)
@@ -109,6 +109,8 @@
/* Tosses things in a certain direction */
/obj/effect/step_trigger/thrower
icon = 'icons/mob/screen/generic.dmi'
icon_state = "dir_arrow"
var/direction = SOUTH // the direction of throw
var/tiles = 3 // if 0: forever until atom hits a stopper
var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
@@ -207,6 +207,9 @@
var/explosion_size = 3
var/spread_range = 7
/obj/item/landmine/frag/deployed
deployed = TRUE
/obj/item/landmine/frag/trigger(mob/living/triggerer)
spark(src, 3, GLOB.alldirs)
fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,TRUE)
@@ -304,6 +307,9 @@
/obj/item/landmine/phoron
icon_state = "phoronlandmine"
/obj/item/landmine/phoron/deployed
deployed = TRUE
/obj/item/landmine/phoron/trigger(mob/living/triggerer)
spark(src, 3, GLOB.alldirs)
for (var/turf/simulated/floor/target in range(1,src))
@@ -322,6 +328,9 @@
/obj/item/landmine/n2o
icon_state = "phoronlandmine"
/obj/item/landmine/n2o/deployed
deployed = TRUE
/obj/item/landmine/n2o/trigger(mob/living/L)
spark(src, 3, GLOB.alldirs)
for (var/turf/simulated/floor/target in range(1,src))
@@ -338,6 +347,9 @@
/obj/item/landmine/emp
icon_state = "emplandmine"
/obj/item/landmine/emp/deployed
deployed = TRUE
/obj/item/landmine/emp/trigger(mob/living/triggerer)
spark(src, 3, GLOB.alldirs)
empulse(src.loc, 2, 4)
+24 -25
View File
@@ -209,29 +209,28 @@
desc = "This is a random soap."
icon = 'icons/obj/soap.dmi'
icon_state = "soap"
/obj/random/soap/item_to_spawn()
return pick(/obj/item/soap, \
/obj/item/soap/nanotrasen, \
/obj/item/soap/deluxe,\
/obj/item/soap/space_soap,\
/obj/item/soap/space_soap,\
/obj/item/soap/water_soap,\
/obj/item/soap/fire_soap,\
/obj/item/soap/rainbow_soap,\
/obj/item/soap/diamond_soap,\
/obj/item/soap/uranium_soap,\
/obj/item/soap/silver_soap,\
/obj/item/soap/brown_soap,\
/obj/item/soap/white_soap,\
/obj/item/soap/grey_soap,\
/obj/item/soap/pink_soap,\
/obj/item/soap/purple_soap,\
/obj/item/soap/blue_soap,\
/obj/item/soap/cyan_soap,\
/obj/item/soap/green_soap,\
/obj/item/soap/yellow_soap,\
/obj/item/soap/orange_soap,\
/obj/item/soap/red_soap,\
/obj/item/soap/golden_soap,\
spawnlist = list(
/obj/item/soap,
/obj/item/soap/nanotrasen,
/obj/item/soap/deluxe,
/obj/item/soap/space_soap,
/obj/item/soap/space_soap,
/obj/item/soap/water_soap,
/obj/item/soap/fire_soap,
/obj/item/soap/rainbow_soap,
/obj/item/soap/diamond_soap,
/obj/item/soap/uranium_soap,
/obj/item/soap/silver_soap,
/obj/item/soap/brown_soap,
/obj/item/soap/white_soap,
/obj/item/soap/grey_soap,
/obj/item/soap/pink_soap,
/obj/item/soap/purple_soap,
/obj/item/soap/blue_soap,
/obj/item/soap/cyan_soap,
/obj/item/soap/green_soap,
/obj/item/soap/yellow_soap,
/obj/item/soap/orange_soap,
/obj/item/soap/red_soap,
/obj/item/soap/golden_soap,
)
+52 -1
View File
@@ -256,7 +256,7 @@
/obj/item/trap/punji/attack_mob(mob/living/L)
//Reveal the trap, if not already visible
hide(FALSE)
invisibility = 0
//Select a target zone
var/target_zone
@@ -352,6 +352,57 @@
deployed = TRUE
anchored = TRUE
/obj/item/trap/punji/deployed/hidden
invisibility = INVISIBILITY_MAXIMUM
/obj/item/trap/jagged_rock
name = "treacherous rock"
desc = "A jagged and dangerous outcropping."
icon = 'icons/obj/flora/rocks_grey.dmi'
icon_state = "basalt"
anchored = TRUE
invisibility = 0
/obj/item/trap/jagged_rock/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
if(isliving(arrived))
var/mob/living/L = arrived
attack_mob(L)
update_icon()
/obj/item/trap/jagged_rock/attack_mob(mob/living/L)
//Select a target zone
var/target_zone
if(L.lying)
target_zone = pick(BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_L_HAND, BP_L_ARM, BP_R_HAND, BP_R_ARM)
else
target_zone = pick(BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG)
//Try to apply the damage
var/success = L.apply_damage(50, DAMAGE_BRUTE, target_zone, used_weapon = src, armor_pen = activated_armor_penetration)
//Apply weakness, so the victim doesn't walk immediately back out of the trap
L.Weaken(10)
//If successfully applied, give the message
if(success)
//Give a simple message and return if it's not a human
if(!ishuman(L))
L.visible_message(SPAN_DANGER("[L] slams into \the [src]!"))
return
var/mob/living/carbon/human/human = L
var/obj/item/organ/organ = human.get_organ(target_zone)
if(isipc(L) || isrobot(L))
playsound(src, 'sound/weapons/smash.ogg', 100, TRUE)
else
playsound(src, 'sound/weapons/heavysmash.ogg', 100, TRUE)
human.visible_message(SPAN_DANGER("\The [human] slams into \the [src]!"),
SPAN_WARNING(FONT_LARGE(SPAN_DANGER("You crash on \the [src], feel your body crumble, and something sharp penetrate your [organ.name]!"))),
SPAN_WARNING("<b>You feel your body crumble, and something sharp penetrate your [organ.name]!</b>"))
/**
* # Animal trap
*
+14 -8
View File
@@ -438,14 +438,11 @@
/obj/random/smalltank
name = "random small tank"
icon_state = "airtank"
/obj/random/smalltank/item_to_spawn()
if (prob(40))
return /obj/item/tank/emergency_oxygen
else if (prob(60))
return /obj/item/tank/emergency_oxygen/engi
else
return /obj/item/tank/emergency_oxygen/double
problist = list(
/obj/item/tank/emergency_oxygen = 3,
/obj/item/tank/emergency_oxygen/engi = 2,
/obj/item/tank/emergency_oxygen/double = 1,
)
/obj/random/pottedplant
name = "random potted plant, big"
@@ -641,3 +638,12 @@
/obj/random/med_stack = 1,
/obj/item/reagent_containers/glass/bottle/ammonia = 1,
)
/obj/random/holoturret
name = "random holoturret"
desc = "This is a random turret item. It could be active or simply a statue."
icon_state = "holoturret"
problist = list(
/obj/machinery/porta_turret/hologram = 1,
/obj/structure/unathi_statue/warrior/right = 1,
)
+2 -13
View File
@@ -22,27 +22,19 @@
return INITIALIZE_HINT_QDEL
// this function should return a specific item to spawn
/obj/random/proc/item_to_spawn()
return 0
/obj/random/proc/post_spawn(obj/thing)
LOG_DEBUG("random_obj: [DEBUG_REF(src)] registered itself as having post_spawn, but did not override post_spawn()!")
// creates the random item
/obj/random/proc/spawn_item()
if (spawnlist)
if(spawnlist)
var/itemtype = pick(spawnlist)
. = new itemtype(loc)
else if (problist)
if(problist)
var/itemtype = pickweight(problist)
. = new itemtype(loc)
else
var/itemtype = item_to_spawn()
. = new itemtype(loc)
if (!.)
LOG_DEBUG("random_obj: [DEBUG_REF(src)] returned null item!")
@@ -51,6 +43,3 @@
desc = "This item type is used to randomly spawn a given object at round-start"
icon_state = "x3"
var/spawn_object = null
/obj/random/single/item_to_spawn()
return ispath(spawn_object) ? spawn_object : text2path(spawn_object)
+9
View File
@@ -246,3 +246,12 @@
E.charge_cost *= 2
E.self_recharge = 0
E.reliability = 90
/obj/random/mine
name = "random deployed mine"
desc = "This will choose from a number of available mines and they will be active at start."
icon_state = "landmine"
spawnlist = list(
/obj/item/landmine/frag/deployed,
/obj/item/landmine/emp/deployed,
)