mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
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:
committed by
GitHub
parent
476c526c69
commit
e5b7eb9559
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
Reference in New Issue
Block a user