Space ruin: The sieged lab, a submap extravaganza. (#28393)

* Space ruin: The sieged lab, a submap extravaganza.

* fix airlock access

* fix skiff, make whole lab teleproof for now

* indestructible rivet command room

* add strategically placed helpful items/spawners

* fix gun rack placement

* no butchering on harbinger murder

* small adjustments

* esword drop as a treat, m90 seems excessive

* make boss door obvious

* Lots of map/boss fixes

* Update everything for razor wire, try and unfuck some weird AI behavior

* stupid mines

* sort and fix comments for different ruin categories

* always place ruin for TM

* first batch of fixes

* reinforce hard rock walls

* tweaks

* improve hard rock design

* tiny cleanups

* singleton out med and sci rooms

* kitchen rework updatepath

* run updatepaths

* update maplint exceptions
This commit is contained in:
warriorstar-orion
2025-04-08 14:16:28 -04:00
committed by GitHub
parent 476c526c69
commit e5b7eb9559
24 changed files with 10987 additions and 42 deletions
@@ -0,0 +1,177 @@
/obj/effect/map_effect/marker/mapmanip/submap/extract/ruin/sieged_lab/vert_hallway
name = "Sieged Lab, Vertical Hallway"
color = COLOR_CYAN
/obj/effect/map_effect/marker/mapmanip/submap/insert/ruin/sieged_lab/vert_hallway
name = "Sieged Lab, Vertical Hallway"
color = COLOR_CYAN
/obj/effect/map_effect/marker/mapmanip/submap/extract/ruin/sieged_lab/horiz_hallway
name = "Sieged Lab, Horizontal hallway"
/obj/effect/map_effect/marker/mapmanip/submap/insert/ruin/sieged_lab/horiz_hallway
name = "Sieged Lab, Horizontal hallway"
/obj/effect/map_effect/marker/mapmanip/submap/extract/ruin/sieged_lab/medium_room
name = "Sieged Lab, Medium room"
color = COLOR_LIME
/obj/effect/map_effect/marker/mapmanip/submap/insert/ruin/sieged_lab/medium_room
name = "Sieged Lab, Medium room"
color = COLOR_LIME
/obj/effect/map_effect/marker/mapmanip/submap/extract/ruin/sieged_lab/wide_room
name = "Sieged Lab, Wide room"
color = COLOR_SUN
/obj/effect/map_effect/marker/mapmanip/submap/insert/ruin/sieged_lab/wide_room
name = "Sieged Lab, Wide room"
color = COLOR_SUN
// MARK: SYNDICATE BOSS
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate
name = "Syndicate Harbinger"
desc = "A blood-crazed, murderous Syndicate fanatic."
icon = 'icons/mob/simple_human.dmi'
icon_state = "syndicate_harbinger"
icon_living = "syndicate_harbinger"
speak_emote = list("snarls")
projectiletype = /obj/item/projectile/bullet/heavybullet
projectilesound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
internal_gps = null
faction = list("syndicate", "spawned_corpse")
attack_action_types = list(/datum/action/innate/megafauna_attack/dash)
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
var/doors_opened = FALSE
pixel_x = 0
medal_type = null
score_type = null
crusher_loot = list()
health = 750
maxHealth = 750
rapid_melee = 3
wander = FALSE
move_force = MOVE_FORCE_DEFAULT
loot = list(/obj/item/organ/internal/cyberimp/arm/razorwire/harbinger)
death_simplemob_representation = /obj/effect/temp_visual/dir_setting/syndicate_harbinger_death
/obj/item/melee/razorwire/harbinger
force = 15
/obj/item/melee/razorwire/harbinger/Initialize(mapload)
. = ..()
icon_state = "razorwire"
item_state = "razorwire"
update_icon()
/obj/item/organ/internal/cyberimp/arm/razorwire/harbinger
contents = newlist(/obj/item/melee/razorwire/harbinger)
/obj/effect/temp_visual/dir_setting/syndicate_harbinger_death
icon = 'icons/mob/simple_human.dmi'
icon_state = "syndicate_harbinger"
duration = 15
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate/transform_weapon()
return
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate/devour(mob/living/L)
// Gibbing seems a bit unfair
LoseTarget()
return FALSE
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate/butcher(mob/living/L)
// Gibbing seems a bit unfair
LoseTarget()
return FALSE
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/CanAttack(atom/the_target)
. = ..()
if(isliving(the_target))
var/mob/living/L = the_target
if(L.stat == DEAD)
return FALSE // wtf why is this not already the case
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate/Initialize(mapload)
. = ..()
qdel(miner_saw)
miner_saw = new/obj/item/melee/razorwire/harbinger(src)
set_light(2, 2, COLOR_RED)
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate/DestroyPathToTarget()
if(!doors_opened)
for(var/turf/T in RANGE_TURFS(8, src))
for(var/obj/machinery/door/airlock/airlock in T)
airlock.open(forced = TRUE)
airlock.lock(forced = TRUE)
doors_opened = TRUE
// No turf/window smashing for this guy
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/syndicate/DestroyObjectsInDirection(direction)
var/turf/T = get_step(targets_from, direction)
if(QDELETED(T))
return
for(var/obj/O in T.contents)
if(!O.Adjacent(targets_from))
continue
if((ismachinery(O) || isstructure(O)) && O.density && environment_smash >= ENVIRONMENT_SMASH_STRUCTURES && !O.IsObscured())
O.attack_animal(src)
return
// MARK: LOOT
// Hacky solution for allowing us to have random spawns
// but make sure we don't spawn the same kind of tech
// level research paper twice on the ruin.
GLOBAL_LIST_INIT(ruin_sieged_lab_research_loot, list(
"materials",
"engineering",
"plasmatech",
"powerstorage",
"bluespace",
"biotech",
"combat",
"magnets",
"programming"
))
/obj/item/paper/sieged_lab_research_paper
/obj/item/paper/sieged_lab_research_paper/Initialize(mapload)
. = ..()
if(!length(GLOB.ruin_sieged_lab_research_loot))
log_debug("Ran out of research tech levels for sieged lab loot")
return INITIALIZE_HINT_QDEL
var/tech_level = rand(7, 9)
var/tech_name = pick_n_take(GLOB.ruin_sieged_lab_research_loot)
origin_tech = "[tech_name]=[tech_level]"
name = "research notes - [tech_name] [tech_level]"
/obj/effect/spawner/random/sieged_lab/research_paper
name = "sieged lab loot research paper spawner"
loot = list(
/obj/item/paper/sieged_lab_research_paper
)
/obj/machinery/door/airlock/bloody
icon_state = "closed_bloody"
closed_icon_state = "closed_bloody"
opening_icon_state = "opening_bloody"
closing_icon_state = "closing_bloody"
airlock_material = "_" // sentinel value so we don't try adding fillers of any kind
/obj/effect/spawner/random/mine
name = "50pc landmine"
icon = 'icons/effects/random_spawners.dmi'
icon_state = "mine"
loot = list(/obj/effect/mine/sieged_lab)
spawn_loot_chance = 50
/obj/effect/mine/sieged_lab
name = "mine"
/obj/effect/mine/sieged_lab/mineEffect(mob/living/victim)
explosion(loc, 1, 0, 0, 1) // devastate the tile you are on, but leave everything else untouched
+44 -1
View File
@@ -233,7 +233,7 @@
if(mob_species)
H.set_species(mob_species)
if(random)
H.real_name = random_name(H.gender, H.dna.species)
H.real_name = random_name(H.gender, H.dna.species.name)
if(husk)
H.Drain()
@@ -311,6 +311,11 @@
roundstart = FALSE
instant = TRUE
/obj/effect/mob_spawn/human/corpse/create(ckey, flavour, name, mob/user)
var/mob/corpse = ..()
corpse.faction |= "spawned_corpse"
return corpse
/obj/effect/mob_spawn/human/corpse/damaged
brute_damage = 1000
@@ -417,6 +422,12 @@
id_job = "Assistant"
outfit = /datum/outfit/job/assistant
/obj/effect/mob_spawn/human/corpse/random_species/assistant
name = "Assistant"
mob_name = "Assistant"
id_job = "Assistant"
outfit = /datum/outfit/job/assistant
//Yes you guess it, they have disease in corpse.
/obj/effect/mob_spawn/human/corpse/assistant/beesease_infection
disease = /datum/disease/beesease
@@ -552,6 +563,12 @@
id_job = "Medical Doctor"
outfit = /datum/outfit/job/doctor
/obj/effect/mob_spawn/human/corpse/random_species/doctor
name = "Doctor"
mob_name = "Medical Doctor"
id_job = "Medical Doctor"
outfit = /datum/outfit/job/doctor
//Engineer corpse.
/obj/effect/mob_spawn/human/corpse/engineer
name = "Engineer"
@@ -559,6 +576,25 @@
id_job = "Engineer"
outfit = /datum/outfit/job/engineer
/obj/effect/mob_spawn/human/corpse/random_species/engineer
name = "Engineer"
mob_name = "Engineer"
id_job = "Engineer"
outfit = /datum/outfit/job/engineer
/datum/outfit/job/officer/nerfed
suit_store = null
bio_chips = null
l_pocket = null
l_ear = null
id = null
/obj/effect/mob_spawn/human/corpse/random_species/security_officer
name = "Security Officer"
mob_name = "Security Officer"
id_job = "Security Officer"
outfit = /datum/outfit/job/officer/nerfed
//Mime corpse.
/obj/effect/mob_spawn/human/corpse/mime
name = "Mime"
@@ -599,6 +635,12 @@
id_job = "Scientist"
outfit = /datum/outfit/job/scientist
/obj/effect/mob_spawn/human/corpse/random_species/scientist
name = "Scientist"
mob_name = "Scientist"
id_job = "Scientist"
outfit = /datum/outfit/job/scientist
/obj/effect/mob_spawn/human/corpse/skeleton
name = "skeletal remains"
mob_name = "skeleton"
@@ -643,6 +685,7 @@
/datum/species/grey,
/datum/species/diona,
)
del_types |= /obj/item/card/id
return ..()
@@ -61,6 +61,7 @@ Difficulty: Medium
/datum/action/innate/megafauna_attack/transform_weapon)
initial_traits = list() // Don't want to inherit flight from parent type /megafauna/
var/death_simplemob_representation = /obj/effect/temp_visual/dir_setting/miner_death
/obj/item/gps/internal/miner
icon_state = null
@@ -140,7 +141,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death()
if(health > 0)
return
new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir)
new death_simplemob_representation(loc, dir)
return ..()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc)
@@ -157,6 +158,16 @@ Difficulty: Medium
transform_stop_attack = FALSE
return ..()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/proc/butcher(mob/living/L)
visible_message("<span class='danger'>[src] butchers [L]!</span>",
"<span class='userdanger'>You butcher [L], restoring your health!</span>")
if(!is_station_level(z) || client) //NPC monsters won't heal while on station
if(guidance)
adjustHealth(-L.maxHealth)
else
adjustHealth(-(L.maxHealth * 0.5))
L.gib()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget()
if(client)
transform_stop_attack = FALSE
@@ -166,14 +177,7 @@ Difficulty: Medium
if(isliving(target))
var/mob/living/L = target
if(L.stat == DEAD)
visible_message("<span class='danger'>[src] butchers [L]!</span>",
"<span class='userdanger'>You butcher [L], restoring your health!</span>")
if(!is_station_level(z) || client) //NPC monsters won't heal while on station
if(guidance)
adjustHealth(-L.maxHealth)
else
adjustHealth(-(L.maxHealth * 0.5))
L.gib()
butcher(L)
return TRUE
changeNext_move(CLICK_CD_MELEE)
miner_saw.melee_attack_chain(src, target)
+3
View File
@@ -452,6 +452,9 @@
/obj/machinery/power/smes/engineering
charge = 0.08e6 // Engineering starts with some charge for singulo
/obj/machinery/power/smes/empty
charge = 0
/obj/machinery/power/smes/magical
name = "magical power storage unit"
desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Magically produces power."