[s] Lavaland Patch (#18398)

* Commit squash before update to master

* Removed repathing and slot machine shenanigans

* Legion spawn changes

* Map edits, round II

* Some changes

* Removes map changes, hopefully

* Conflicts 1

* Updates the maps

* Conflicts 2

* How about now?

* Remaps the colossus arena

* Restores old colossus spawning
This commit is contained in:
Xhuis
2016-06-16 23:00:09 -04:00
committed by KorPhaeron
parent 8c9308acca
commit 75d9e4174f
24 changed files with 664 additions and 524 deletions

View File

@@ -220,8 +220,10 @@
},
/area/ruin/powered)
"aF" = (
/obj/machinery/door/unpowered/shuttle,
/turf/open/floor/plating{
/obj/machinery/door/unpowered/shuttle{
name = "Restroom"
},
/turf/open/floor/plasteel/bar{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
@@ -257,10 +259,7 @@
},
/area/ruin/powered)
"aM" = (
/obj/effect/mob_spawn/human/doctor/alive{
flavour_text = "You were putting in your hours as a vet in the local animal hospital when a massive bluespace translocation shunted you across the galaxy. Can you survive on this desolate wasteland..?";
id_job = "Veterinarian"
},
/obj/effect/mob_spawn/human/doctor/alive/lavaland,
/turf/open/floor/plasteel/blue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1
@@ -384,6 +383,10 @@
"bd" = (
/obj/structure/table/glass,
/obj/item/weapon/storage/box/gloves,
/obj/item/weapon/storage/box/masks{
pixel_x = 3;
pixel_y = 3
},
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
@@ -530,7 +533,7 @@
"bv" = (
/obj/effect/mob_spawn/mouse{
dir = 4;
flavour_text = "You're a mousey! You're getting pretty old as mice go, and you haven't been feeling well as of late. Your master loves you a lot so he took you to this place so you can get better! You can't wait to see him again!";
flavour_text = "<font size=3><b>Y</b></font><b>ou're a mousey! You're getting pretty old as mice go, and you haven't been feeling well as of late. Your master loves you a lot so he took you to this place so you can get better! You can't wait to see him again!<b>";
mob_name = "Stallman Jr."
},
/turf/open/floor/plasteel/white{
@@ -546,9 +549,9 @@
"bx" = (
/obj/machinery/door/airlock/medical{
name = "Patient Room";
req_access_txt = "5"
req_access_txt = "0"
},
/turf/open/floor/plating{
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
@@ -641,8 +644,10 @@
},
/area/ruin/powered)
"bJ" = (
/obj/machinery/door/airlock/glass_large,
/turf/open/floor/plating{
/obj/machinery/door/airlock/glass_large{
name = "Ian's Pet Care"
},
/turf/open/floor/plasteel{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
@@ -673,7 +678,7 @@
"bN" = (
/obj/effect/mob_spawn/cow{
dir = 4;
flavour_text = "You're a cow. You've lived a pampered life as a prized show heifer, a real blue-ribbon winner. After showing signs of a minor respiratory infection, your master took you to the hospital right away. He'd better come back soon, you're getting quite impatient.";
flavour_text = "<font size=3><b>Y</b></font><b>ou're a cow. You've lived a pampered life as a prized show heifer, a real blue-ribbon winner. After showing signs of a minor respiratory infection, your master took you to the hospital right away. He'd better come back soon. You're getting quite impatient.</b>";
mob_name = "Flossie"
},
/turf/open/floor/plasteel/white{
@@ -706,7 +711,10 @@
"bR" = (
/obj/structure/table,
/obj/machinery/cell_charger,
/obj/item/weapon/melee/baton/cattleprod,
/obj/item/weapon/melee/baton/cattleprod{
desc = "On-the-fly rabies treatment.";
name = "cattle prod"
},
/obj/item/weapon/stock_parts/cell/high,
/turf/open/floor/plasteel/blue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
@@ -802,13 +810,66 @@
},
/area/ruin/powered)
"cf" = (
/obj/machinery/sleeper{
icon_state = "sleeper-open";
dir = 4
/obj/structure/closet/l3closet,
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/turf/open/floor/plasteel/blue/side{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
dir = 1
/area/ruin/powered)
"cm" = (
/obj/machinery/door/unpowered/shuttle{
name = "Tool Storage"
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
"cl" = (
/obj/machinery/door/unpowered/shuttle{
name = "Safety Supplies"
},
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
"ck" = (
/obj/machinery/door/unpowered/shuttle{
name = "Medical Supplies"
},
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
"cj" = (
/obj/machinery/door/unpowered/shuttle{
name = "Morgue"
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
"ci" = (
/obj/machinery/door/unpowered/shuttle{
desc = "There's a note wedged in the seam saying something about directing pizza here.";
name = "Staff Entrance"
},
/turf/open/floor/plating{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
"ch" = (
/obj/machinery/door/unpowered/shuttle{
name = "Emergency Care"
},
/turf/open/floor/plasteel/white{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
"cg" = (
/obj/machinery/door/unpowered/shuttle{
name = "Break Room"
},
/turf/open/floor/plasteel/cmo{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/ruin/powered)
@@ -942,7 +1003,7 @@ ae
ae
ae
aE
aF
ci
ae
aE
aT
@@ -974,11 +1035,11 @@ ay
ae
aK
aK
aF
cj
aU
aZ
bg
aF
cj
aK
bp
by
@@ -1061,7 +1122,7 @@ ae
ai
as
as
aF
cg
aK
aP
ae
@@ -1094,11 +1155,11 @@ as
ae
aM
aK
aF
ck
ao
bb
ao
aF
ck
aK
aK
aK
@@ -1133,7 +1194,7 @@ bl
bt
aK
aK
aU
aK
aJ
aJ
ab
@@ -1154,11 +1215,11 @@ as
ae
aM
aK
aF
cl
ao
bc
ao
aF
cl
aK
aK
aK
@@ -1181,7 +1242,7 @@ ae
am
as
as
aF
cg
aK
aP
ae
@@ -1215,7 +1276,7 @@ aH
aL
aP
ae
aV
cf
bd
bj
ae
@@ -1271,10 +1332,10 @@ cc
ce
ao
ao
aF
ch
aK
aK
aF
cm
aX
be
bk

View File

@@ -0,0 +1,45 @@
//Fluff structures serve no purpose and exist only for enriching the environment. They can be destroyed with a wrench.
/obj/structure/fluff
name = "fluff structure"
desc = "Fluffier than a sheep. This shouldn't exist."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "minibar"
anchored = TRUE
density = FALSE
opacity = 0
/obj/structure/fluff/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/wrench))
user.visible_message("<span class='notice'>[user] starts disassembling [src]...</span>", "<span class='notice'>You start disassembling [src]...</span>")
playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
if(!do_after(user, 50, target = src))
return 0
user.visible_message("<span class='notice'>[user] disassembles [src]!</span>", "<span class='notice'>You break down [src] into scrap metal.</span>")
playsound(user, 'sound/items/Deconstruct.ogg', 50, 1)
new/obj/item/stack/sheet/metal(get_turf(src))
qdel(src)
return
..()
/obj/structure/fluff/empty_terrarium //Empty terrariums are created when a preserved terrarium in a lavaland seed vault is activated.
name = "empty terrarium"
desc = "An ancient machine that seems to be used for storing plant matter. Its hatch is ajar."
icon = 'icons/obj/lavaland/spawners.dmi'
icon_state = "terrarium_open"
density = TRUE
/obj/structure/fluff/empty_sleeper //Empty sleepers are created by a good few ghost roles in lavaland.
name = "empty sleeper"
desc = "An open sleeper. It looks as though it would be awaiting another patient, were it not broken."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper-open"
/obj/structure/fluff/empty_sleeper/syndicate
icon_state = "sleeper_s-open"
/obj/structure/fluff/empty_cryostasis_sleeper //Empty cryostasis sleepers are created when a malfunctioning cryostasis sleeper in a lavaland shelter is activated
name = "empty cryostasis sleeper"
desc = "Although comfortable, this sleeper won't function as anything but a bed ever again."
icon = 'icons/obj/lavaland/spawners.dmi'
icon_state = "cryostasis_sleeper_open"

View File

@@ -0,0 +1,235 @@
//Objects that spawn ghosts in as a certain role when they click on it, i.e. away mission bartenders.
//Preserved terrarium/seed vault: Spawns in seed vault structures in lavaland. Ghosts become plantpeople and are advised to begin growing plants in the room near them.
/obj/effect/mob_spawn/human/seed_vault
name = "preserved terrarium"
desc = "An ancient machine that seems to be used for storing plant matter. The glass is obstructed by a mat of vines."
mob_name = "a lifebringer"
icon = 'icons/obj/lavaland/spawners.dmi'
icon_state = "terrarium"
density = TRUE
roundstart = FALSE
death = FALSE
mob_species = /datum/species/pod
flavour_text = "<font size=3><b>Y</b></font><b>ou are a sentient ecosystem - an example of the mastery over life that your creators possessed. Your masters, benevolent as they were, created uncounted \
seed vaults and spread them across the universe to every planet they could chart. You are in one such seed vault. Your goal is to cultivate and spread life wherever it will go while waiting \
for contact from your creators. Estimated time of last contact: Deployment, 5x10^3 millennia ago.</b>"
/obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn)
var/plant_name = pick("Tomato", "Potato", "Brocolli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Bannana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \
"Venus", "Sprout","Cocao", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
new_spawn.real_name = plant_name
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.underwear = "Nude" //You're a plant, partner
H.update_body()
/obj/effect/mob_spawn/human/seed_vault/Destroy()
new/obj/structure/fluff/empty_terrarium(get_turf(src))
..()
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
/obj/effect/mob_spawn/human/ash_walker
name = "ash walker egg"
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
mob_name = "an ash walker"
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
icon_state = "large_egg"
mob_species = /datum/species/lizard/ashwalker
helmet = /obj/item/clothing/head/helmet/gladiator
uniform = /obj/item/clothing/under/gladiator
roundstart = FALSE
death = FALSE
anchored = 0
density = 0
flavour_text = "<font size=3><b>Y</b></font><b>ou are an ash walker. Your tribe worships <span class='danger'>the Necropolis</span>. The wastes are sacred ground, its monsters a blessed bounty. \
You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest.</b>"
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
new_spawn.real_name = random_unique_lizard_name(gender)
new_spawn << "<b>Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Glory to the Necropolis!</b>"
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.underwear = "Nude"
H.update_body()
/obj/effect/mob_spawn/human/ash_walker/New()
..()
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)
//Timeless prisons: Spawns in Wish Granter prisons in lavaland. Ghosts become age-old users of the Wish Granter and are advised to seek repentance for their past.
/obj/effect/mob_spawn/human/exile
name = "timeless prison"
desc = "Although this stasis pod looks medicinal, it seems as though it's meant to preserve something for a very long time."
mob_name = "a penitent exile"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
mob_species = /datum/species/shadow
flavour_text = "<font size=3><b>Y</b></font>ou are cursed. Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you did so, \
it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland.</b>"
/obj/effect/mob_spawn/human/exile/Destroy()
new/obj/structure/fluff/empty_sleeper(get_turf(src))
..()
/obj/effect/mob_spawn/human/exile/special(mob/living/new_spawn)
new_spawn.real_name = "[new_spawn.real_name] ([rand(0,999)])"
var/wish = rand(1,4)
switch(wish)
if(1)
new_spawn << "<b>You wished to kill, and kill you did. You've lost track of how many, but the spark of excitement that murder once held has winked out. You feel only regret.</b>"
if(2)
new_spawn << "<b>You wished for unending wealth, but no amount of money was worth this existence. Maybe charity might redeem your soul?</b>"
if(3)
new_spawn << "<b>You wished for power. Little good it did you, cast out of the light. You are the [gender == MALE ? "king" : "queen"] of a hell that holds no subjects. You feel only remorse.</b>"
if(4)
new_spawn << "<b>You wished for immortality, even as your friends lay dying behind you. No matter how many times you cast yourself into the lava, you awaken in this room again within a few days. There is no escape.</b>"
//Golem shells: Spawns in Free Golem ships in lavaland. Ghosts become mineral golems and are advised to spread personal freedom.
/obj/effect/mob_spawn/human/golem
name = "inert golem shell"
desc = "A humanoid shape, empty, lifeless, and full of potential."
mob_name = "a free golem"
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
mob_species = /datum/species/golem
roundstart = FALSE
death = FALSE
anchored = 0
density = 0
flavour_text = "<font size=3><b>Y</b></font><b>ou are a Free Golem. Your family worships <span class='danger'>The Liberator</span>. In his infinite and divine wisdom, he set your clan free to \
travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \
golems, so that no golem may ever be forced to serve again.</b>"
/obj/effect/mob_spawn/human/golem/New()
..()
var/area/A = get_area(src)
if(A)
notify_ghosts("A golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK)
/obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn)
var/golem_surname = pick(golem_names)
// 3% chance that our golem has a human surname, because
// cultural contamination
if(prob(3))
golem_surname = pick(last_names)
var/datum/species/X = mob_species
var/golem_forename = initial(X.id)
// The id of golem species is either their material "diamond","gold",
// or just "golem" for the plain ones. So we're using it for naming.
if(golem_forename == "golem")
golem_forename = "iron"
new_spawn.real_name = "[capitalize(golem_forename)] [golem_surname]"
// This means golems have names like Iron Forge, or Diamond Quarry
// also a tiny chance of being called "Plasma Meme"
// which is clearly a feature
new_spawn << "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked."
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.set_cloned_appearance()
/obj/effect/mob_spawn/human/golem/adamantine
name = "dust-caked golem shell"
desc = "A humanoid shape, empty, lifeless, and full of potential."
mob_name = "a free golem"
anchored = 1
density = 1
mob_species = /datum/species/golem/adamantine
//Malfunctioning cryostasis sleepers: Spawns in makeshift shelters in lavaland. Ghosts become hermits with knowledge of how they got to where they are now.
/obj/effect/mob_spawn/human/hermit
name = "malfunctiong cryostasis sleeper"
desc = "A humming sleeper with a silhoutted occupant inside. Its stasis function is broken and it's likely being used as a bed."
mob_name = "a stranded hermit"
icon = 'icons/obj/lavaland/spawners.dmi'
icon_state = "cryostasis_sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<font size=3><b>Y</b></font><b>ou've been stranded in this godless prison of a planet for longer than you can remember. Each day you barely scrape by, and between the terrible \
conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... "
/obj/effect/mob_spawn/human/hermit/New()
var/arrpee = rand(1,4)
switch(arrpee)
if(1)
flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \
only one pod left when you got to the escape bay. You took it and launched it alone, and the crowd of terrified faces crowding at the airlock door as your pod's engines burst to \
life and sent you to this hell are forever branded into your memory.</b>"
uniform = /obj/item/clothing/under/assistantformal
shoes = /obj/item/clothing/shoes/sneakers/black
back = /obj/item/weapon/storage/backpack
if(2)
flavour_text += "you're an exile from the Tiger Cooperative. Their technological fanaticism drove you to question the power and beliefs of the Exolitics, and they saw you as a \
heretic and subjected you to hours of horrible torture. You were hours away from execution when a high-ranking friend of yours in the Cooperative managed to secure you a pod, \
scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since.</b>"
uniform = /obj/item/clothing/under/rank/prisoner
shoes = /obj/item/clothing/shoes/sneakers/orange
back = /obj/item/weapon/storage/backpack
if(3)
flavour_text += "you were a doctor on one of Nanotrasen's space stations, but you left behind that damn corporation's tyranny and everything it stood for. From a metaphorical hell \
to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there.</b>"
uniform = /obj/item/clothing/under/rank/medical
suit = /obj/item/clothing/suit/toggle/labcoat
back = /obj/item/weapon/storage/backpack/medic
shoes = /obj/item/clothing/shoes/sneakers/black
if(4)
flavour_text += "you were always joked about by your friends for \"not playing with a full deck\", as they so <i>kindly</i> put it. It seems that they were right when you, on a tour \
at one of Nanotrasen's state-of-the-art research facilities, were in one of the escape pods alone and saw the red button. It was big and shiny, and it caught your eye. You pressed \
it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now.</b>"
uniform = /obj/item/clothing/under/color/grey/glorf
shoes = /obj/item/clothing/shoes/sneakers/black
back = /obj/item/weapon/storage/backpack
..()
/obj/effect/mob_spawn/human/hermit/Destroy()
new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src))
..()
//Broken rejuvenation pod: Spawns in animal hospitals in lavaland. Ghosts become disoriented interns and are advised to search for help.
/obj/effect/mob_spawn/human/doctor/alive/lavaland
name = "broken rejuvenation pod"
desc = "A small sleeper typically used to instantly restore minor wounds. This one seems broken, and its occupant is comatose."
mob_name = "a translocated vet"
flavour_text = "<font size=3><b>W</b></font><b>hat...? Where are you? Where are the others? This is still the animal hospital - you should know, you've been an intern here for weeks - but \
everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; you see them right now. So where is \
everyone? Where did they go? What happened to the hospital? And is that <i>smoke</i> you smell? You need to find someone else. Maybe they can tell you what happened.</b>"
//Prisoner containment sleeper: Spawns in crashed prison ships in lavaland. Ghosts become escaped prisoners and are advised to find a way out of the mess they've gotten themselves into.
/obj/effect/mob_spawn/human/prisoner_transport
name = "prisoner containment sleeper"
desc = "A sleeper designed to put its occupant into a deep coma, unbreakable until the sleeper turns off. This one's glass is cracked and you can see a pale, sleeping face staring out."
mob_name = "an escaped prisoner"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper_s"
uniform = /obj/item/clothing/under/rank/prisoner
mask = /obj/item/clothing/mask/breath
shoes = /obj/item/clothing/shoes/sneakers/orange
pocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
roundstart = FALSE
death = FALSE
flavour_text = "<font size=3><b>G</b></font><b>ood. It seems as though your ship crashed. You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \
though fate has other plans for you. You remember that you were convicted of "
/obj/effect/mob_spawn/human/prisoner_transport/New()
var/list/crimes = list("murder", "larceny", "embezzlement", "unionization", "dereliction of duty", "kidnapping", "gross incompetence", "grand theft", "collaboration with the Syndicate", \
"worship of a forbidden deity", "interspecies relations", "mutiny")
flavour_text += "[pick(crimes)]. but regardless of that, it seems like your crime doesn't matter now. You don't know where you are, but you know that it's out to kill you, and you're not going \
to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]</b>."
..()
/obj/effect/mob_spawn/human/prisoner_transport/Destroy()
new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
..()

View File

@@ -497,24 +497,6 @@
uniform = /obj/item/clothing/under/color/grey
shoes = /obj/item/clothing/shoes/combat
///Prisoner
/obj/effect/mob_spawn/human/prisoner_transport
name = "prisoner sleeper"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
uniform = /obj/item/clothing/under/rank/prisoner
mask = /obj/item/clothing/mask/breath
shoes = /obj/item/clothing/shoes/sneakers/orange
pocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
roundstart = FALSE
death = FALSE
flavour_text = {"You were a prisoner, sentenced to hard labour in one of Nanotrasen's harsh gulags, but judging by the explosive crash you just survived, fate may have other plans for. First thing is first though: Find a way to survive this mess."}
/obj/effect/mob_spawn/human/prisoner_transport/special(mob/living/new_spawn)
var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting your manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
new_spawn << "You were convincted of: [crime]."
//For ghost bar.
/obj/effect/mob_spawn/human/alive/space_bar_patron
name = "Bar cryogenics"

View File

@@ -7,12 +7,15 @@
var/name = "storm"
var/start_up_time = 300 //30 seconds
var/start_up_message = "The wind begins to pick up."
var/start_up_sound
var/duration = 120 //2 minutes
var/duration_lower = 120
var/duration_upper = 120
var/duration_sound
var/duration_message = "A storm has started!"
var/wind_down = 300 // 30 seconds
var/wind_down_message = "The storm is passing."
var/wind_down_sound
var/target_z = 1
var/exclude_walls = TRUE
@@ -35,8 +38,9 @@
update_areas()
for(var/mob/M in player_list)
if(M.z == target_z)
M << "<span class='danger'><B>[start_up_message]</B></span>"
M << "<span class='warning'><B>[start_up_message]</B></span>"
if(start_up_sound)
M << start_up_sound
sleep(start_up_time)
stage = MAIN_STAGE
weather_main()
@@ -46,7 +50,9 @@
update_areas()
for(var/mob/M in player_list)
if(M.z == target_z)
M << "<span class='danger'><B>[duration_message]</B></span>"
M << "<span class='userdanger'><i>[duration_message]</i></span>"
if(duration_sound)
M << duration_sound
if(purely_aesthetic)
sleep(duration*10)
else //Storm effects
@@ -66,7 +72,8 @@
for(var/mob/M in player_list)
if(M.z == target_z)
M << "<span class='danger'><B>[wind_down_message]</B></span>"
if(wind_down_sound)
M << wind_down_sound
sleep(wind_down)
stage = END_STAGE

View File

@@ -41,7 +41,7 @@
duration_upper = 60 //1 minute
duration_message = "This isn't average everyday darkness... this is advanced darkness!"
wind_down = 100 // 10 seconds
wind_down_message = "The darkness is receding. Thank god."
wind_down_message = "The darkness recedes."
purely_aesthetic = TRUE
target_z = 1
@@ -68,12 +68,15 @@
/datum/weather/ash_storm
name = "ash storm"
start_up_time = 300 //30 seconds
start_up_message = "The wind begins to pick up. Seek shelter."
start_up_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter."
start_up_sound = 'sound/lavaland/ash_storm_windup.ogg'
duration_lower = 60 //1 minute
duration_upper = 150 //2.5 minutes
duration_message = "An ash storm has started! Get inside!"
duration_message = "Smoldering clouds of scorching ash billow down around you! Get inside!"
duration_sound = 'sound/lavaland/ash_storm_start.ogg'
wind_down = 300 // 30 seconds
wind_down_message = "The storm begins to fade. Should be safe to go outside again."
wind_down_message = "The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now."
wind_down_sound = 'sound/lavaland/ash_storm_end.ogg'
target_z = ZLEVEL_LAVALAND
area_type = /area/lavaland/surface/outdoors
@@ -88,8 +91,8 @@
/datum/weather/ash_storm/false_alarm //No storm, just light ember fall
purely_aesthetic = TRUE
duration_overlay = "light_ash"
duration_message = "Looks like the storm just missed the mining area. False alarm."
wind_down_message = "The ash fall starts to trail off."
duration_message = "<span class='notice'>Gentle ashfall surrounds you like grotesque snow. The storm seems to have passed you by.</span>"
wind_down_message = "The ashfall quietly slows, then stops. Another layer of hardened soot to the volcanic rock beneath you."
/datum/weather/ash_storm/storm_act(mob/living/L)
if(immunity_type in L.weather_immunities)

View File

@@ -263,7 +263,8 @@
/turf/open/floor/plating/asteroid/airless/cave/volcanic
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 10, /mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30,
/mob/living/simple_animal/hostile/spawner/lavaland = 2, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, /mob/living/simple_animal/hostile/megafauna/dragon = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 2, /mob/living/simple_animal/hostile/megafauna/colossus = 2)
/mob/living/simple_animal/hostile/spawner/lavaland = 2, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
/mob/living/simple_animal/hostile/megafauna/dragon = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 2, /mob/living/simple_animal/hostile/megafauna/colossus = 2)
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = "o2=14;n2=23;TEMP=300"
@@ -587,7 +588,7 @@
if(istype(H.belt, /obj/item/device/wormhole_jaunter))
var/obj/item/device/wormhole_jaunter/J = H.belt
// To freak out any bystanders
visible_message("[H] falls into [src]!")
visible_message("<span class='boldwarning'>[H] falls into [src]!</span>")
J.chasm_react(H)
return
if(H.dna.species && (FLYING in H.dna.species.specflags))
@@ -599,9 +600,10 @@
/*visible_message("[AM] falls into [src]!")
qdel(AM)*/
AM.forceMove(locate(drop_x, drop_y, drop_z))
AM.visible_message("[AM] falls from above!")
AM.visible_message("<span class='boldwarning'>[AM] falls from above!</span>", "<span class='userdanger'>GAH! Ah... where are you?</span>")
if(istype(AM, /mob/living))
var/mob/living/L = AM
L.Weaken(5)
L.adjustBruteLoss(30)
/turf/open/chasm/straight_down/New()
@@ -625,7 +627,20 @@
/turf/open/chasm/straight_down/lava_land_surface/drop(atom/movable/AM)
if(!AM.invisibility)
visible_message("[AM] falls into [src]!")
AM.visible_message("<span class='boldwarning'>[AM] falls into [src]!</span>", "<span class='userdanger'>You stumble and stare into an abyss before you. It stares back, and you fall \
into the enveloping dark.</span>")
if(isliving(AM))
var/mob/living/L = AM
L.notransform = TRUE
L.Stun(10)
L.resting = TRUE
animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10)
for(var/i in 1 to 5)
AM.pixel_y--
sleep(2)
if(isrobot(AM))
var/mob/living/silicon/robot/S = AM
qdel(S.mmi)
qdel(AM)
/turf/closed/mineral/volcanic/lava_land_surface

View File

@@ -29,7 +29,7 @@
loot = list(/obj/machinery/smartfridge/black_box)
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
deathmessage = "disintegrates, leaving a glowing core."
deathmessage = "disintegrates, leaving a glowing core in its wake."
death_sound = 'sound/magic/demon_dies.ogg'
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
var/anger_modifier = 0
@@ -114,7 +114,7 @@
/mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral()
visible_message("<span class='cult'><font size=5>\"<b>Die</b>\"</font></span>")
visible_message("<span class='cult'><font size=5>\"<b>Die.</b>\"</font></span>")
sleep(10)
spawn()
@@ -220,55 +220,6 @@
playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 200, 1)
/mob/living/simple_animal/hostile/megafauna/colossus/proc/seeking_laser()
visible_message("<span class='cult'><font size=5>\"<b>You can't run.</b>\"</font></span>")
var/obj/effect/overlay/temp/seeking_beam/B = new(get_turf(src))
B.target = target
B.firer = src
/obj/effect/overlay/temp/seeking_beam
name = "disintegration ball"
desc = "Get out of the way!"
icon = 'icons/effects/effects.dmi'
icon_state = "shield-cult"
density = 1
luminosity = 1
var/target
var/firer
duration = 100
/obj/effect/overlay/temp/seeking_beam/New()
..()
spawn()
while(loc)
step_towards(src, target)
sleep(1)
/obj/effect/overlay/temp/seeking_beam/process()
step_towards(src, target)
/obj/effect/overlay/temp/seeking_beam/Crossed(AM as mob|obj)
..()
collision(AM)
/obj/effect/overlay/temp/seeking_beam/Bumped(AM as mob|obj)
..()
collision(AM)
/obj/effect/overlay/temp/seeking_beam/Bump(AM as mob|obj)
..()
collision(AM)
/obj/effect/overlay/temp/seeking_beam/proc/collision(AM as mob|obj)
if(AM == firer)
return
if(isliving(AM))
var/mob/living/M = AM
visible_message("<span class='danger'>[M] is disintegrated by the disintegration ball!</span>")
M.dust()
else if(istype(AM, /obj/item))
var/obj/item/I = AM
I.burn()
/obj/item/projectile/colossus
name ="death bolt"

View File

@@ -42,7 +42,7 @@
A.faction = faction
ranged_cooldown = world.time + ranged_cooldown_time
else
visible_message("<span class='danger'>[src] charges!</span>")
visible_message("<span class='warning'><b>[src] charges!</b></span>")
SpinAnimation(speed = 20, loops = 5)
ranged = 0
retreat_distance = 0
@@ -81,7 +81,7 @@
L.target = target
visible_message("<span class='danger'>[src] splits!</span>")
visible_message("<span class='boldannounce'>[src] splits in twain!</span>")
else
var/last_legion = TRUE
for(var/mob/living/simple_animal/hostile/megafauna/legion/other in mob_list)
@@ -148,4 +148,4 @@
storm_cooldown = world.time + 600
else
user << "You can't seem to control the weather here."
user << "You can't seem to control the weather here."

View File

@@ -711,7 +711,7 @@
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher
name = "watcher"
desc = "Its stare causes victims to freeze from the inside."
desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body."
icon = 'icons/mob/lavaland/watcher.dmi'
icon_state = "watcher"
icon_living = "watcher"
@@ -721,7 +721,7 @@
throw_message = "bounces harmlessly off of"
melee_damage_lower = 15
melee_damage_upper = 15
attacktext = "stares into the soul of"
attacktext = "impales"
a_intent = "harm"
speak_emote = list("telepathically cries")
attack_sound = 'sound/weapons/bladeslice.ogg'
@@ -734,7 +734,7 @@
/mob/living/simple_animal/hostile/asteroid/goliath/beast
name = "goliath"
desc = "A massive beast that uses long tentacles to ensare its prey, threatening them is not advised under any conditions."
desc = "A hulking, armor-plated beast with long tendrils arching from its back."
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
icon_state = "goliath"
icon_living = "goliath"
@@ -774,7 +774,7 @@
var/mob/living/carbon/human/stored_mob
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed)
visible_message("<span class='warning'>[src] wails as in anger as they are driven from their form!</span>")
visible_message("<span class='warning'>The skulls on [src] wail in anger as they flee from their dying host!</span>")
if(stored_mob)
stored_mob.loc = get_turf(src)
stored_mob.adjustBruteLoss(1000)
@@ -1007,14 +1007,14 @@
/obj/effect/collapse/New()
..()
visible_message("<B><span class='danger'>The tendril writhes in pain and anger and the earth around it begins to split! Get back!</span></B>")
visible_message("<span class='danger'>A chest falls clear of the tendril!</span>")
visible_message("<span class='boldannounce'>The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!</span>")
visible_message("<span class='warning'>Something falls free of the tendril!</span>")
playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1)
spawn(50)
for(var/mob/M in range(7,src))
shake_camera(M, 15, 1)
playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1)
visible_message("<B><span class='danger'>The tendril collapes!</span></B>")
visible_message("<span class='boldannounce'>The tendril falls inward, the ground around it widening into a yawning chasm!</span>")
for(var/turf/T in range(2,src))
if(!T.density)
T.ChangeTurf(/turf/open/chasm/straight_down/lava_land_surface)

View File

@@ -1,40 +1,4 @@
/obj/structure/lavaland_door
name = "necropolis gate"
desc = "An imposing, seemingly impenetrable door."
icon = 'icons/effects/96x96.dmi'
icon_state = "door"
anchored = 1
density = 1
bound_width = 96
bound_height = 96
burn_state = LAVA_PROOF
luminosity = 1
var/boss = FALSE
/obj/structure/lavaland_door/attack_hand(mob/user)
if(boss)
return
for(var/mob/living/simple_animal/hostile/megafauna/legion/L in mob_list)
return
var/safety = alert(user, "Are you sure you want to do this? You and everyone else on lavaland will likely die.", "Knock on the door?", "Proceed", "Abort")
if(safety == "Abort" || !in_range(src, user) || !src || boss || user.incapacitated())
return
boss = TRUE
user << "You knock on the door."
playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
visible_message("<span class='danger'>Legion emerges from the Necropolis!</span>")
message_admins("[key_name_admin(user)] has summoned Legion.")
log_game("[key_name(user)] summoned Legion.")
new /mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH))
/obj/structure/lavaland_door/singularity_pull()
return 0
/obj/structure/lavaland_door/Destroy(force)
if(force)
. = ..()
else
return QDEL_HINT_LETMELIVE
//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
/obj/machinery/lavaland_controller
name = "weather control machine"
@@ -48,7 +12,11 @@
if(ongoing_weather || weather_cooldown > world.time)
return
weather_cooldown = world.time + rand(3500, 6500)
var/datum/weather/ash_storm/LAVA = new /datum/weather/ash_storm
var/datum/weather/ash_storm/LAVA
if(prob(10)) //10% chance for the ash storm to miss the area entirely
LAVA = new /datum/weather/ash_storm/false_alarm
else
LAVA = new /datum/weather/ash_storm
ongoing_weather = LAVA
LAVA.weather_start_up()
ongoing_weather = null
@@ -75,364 +43,3 @@
/obj/item/seeds/berry/glow = 10,
/obj/item/seeds/sunflower/moonflower = 8
)
/obj/effect/mob_spawn/human/seed_vault
name = "vault creature sleeper"
mob_name = "Vault Creature"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
mob_species = /datum/species/pod
flavour_text = {"You are a strange, artificial creature. Your creators were a highly advanced and benevolent race, and launched many seed vaults into the stars, hoping to aid fledgling civilizations. You are to tend to the vault and await the arrival of sentient species. You've been waiting quite a while though..."}
/obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn)
var/plant_name = pick("Tomato", "Potato", "Brocolli", "Carrot", "Deathcap", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Bannana", "Moss", "Flower", "Bloom", "Spore", "Root", "Bark", "Glowshroom", "Petal", "Leaf", "Venus", "Sprout","Cocao", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
new_spawn.real_name = plant_name
//Greed
/obj/structure/cursed_slot_machine
name = "greed's slot machine"
desc = "High stakes, high rewards."
icon = 'icons/obj/economy.dmi'
icon_state = "slots1"
anchored = 1
density = 1
var/win_prob = 5
/obj/structure/cursed_slot_machine/attack_hand(mob/living/carbon/human/user)
if(!istype(user))
return
if(in_use)
return
in_use = TRUE
user << "<span class='danger'><B>You feel your very life draining away as you pull the lever...it'll be worth it though, right?</B></span>"
user.adjustCloneLoss(20)
if(user.stat)
user.gib()
icon_state = "slots2"
sleep(50)
icon_state = "slots1"
in_use = FALSE
if(prob(win_prob))
new /obj/item/weapon/dice/d20/fate/one_use(get_turf(src))
if(user)
user << "You hear laughter echoing around you as the machine fades away. In it's place...more gambling."
qdel(src)
else
if(user)
user << "<span class='danger'>Looks like you didn't win anything this time...next time though, right?</span>"
//Gluttony
/obj/effect/gluttony
name = "gluttony's wall"
desc = "Only those who truly indulge may pass."
anchored = 1
density = 1
icon_state = "blob"
icon = 'icons/mob/blob.dmi'
/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mover
if(H.nutrition >= NUTRITION_LEVEL_FAT)
return 1
else
H << "<span class='danger'><B>You're not gluttonous enough to pass this barrier!</B></span>"
else
return 0
//Pride
/obj/structure/mirror/magic/pride
name = "pride's mirror"
desc = "Pride cometh before the..."
icon_state = "magic_mirror"
/obj/structure/mirror/magic/pride/curse(mob/user)
user.visible_message("<span class='danger'><B>The ground splits beneath [user] as their hand leaves the mirror!</B></span>")
var/turf/T = get_turf(user)
T.ChangeTurf(/turf/open/chasm/straight_down)
var/turf/open/chasm/straight_down/C = T
C.drop(user)
//Sloth - I'll finish this item later
//Envy
/obj/item/weapon/knife/envy
name = "envy's knife"
desc = "Their success will be yours."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
item_state = "render"
force = 18
throwforce = 10
w_class = 3
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity)
..()
if(!proximity)
return
if(!istype(user))
return
if(istype(AM, /mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
if(user.real_name != H.dna.real_name)
user.real_name = H.dna.real_name
H.dna.transfer_identity(user, transfer_SE=1)
user.updateappearance(mutcolor_update=1)
user.domutcheck()
user << "You assume the face of [H]. Are you satisfied?"
///Ash Walkers
/mob/living/simple_animal/hostile/spawner/ash_walker
name = "ash walker nest"
desc = "A nest built around a necropolis tendril. The eggs seem to grow unnaturally fast..."
icon = 'icons/mob/nest.dmi'
icon_state = "ash_walker_nest"
icon_living = "ash_walker_nest"
faction = list("ashwalker")
health = 200
maxHealth = 200
loot = list(/obj/effect/gibspawner, /obj/item/device/assembly/signaler/anomaly)
del_on_death = 1
var/meat_counter
/mob/living/simple_animal/hostile/spawner/ash_walker/Life()
..()
if(!stat)
consume()
spawn_mob()
/mob/living/simple_animal/hostile/spawner/ash_walker/proc/consume()
for(var/mob/living/H in view(src,1)) //Only for corpse right next to/on same tile
if(H.stat)
visible_message("<span class='warning'>Tendrils reach out from \the [src.name] pulling [H] in! Blood seeps over the eggs as [H] is devoured.</span>")
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
if(istype(H,/mob/living/simple_animal/hostile/megafauna/dragon))
meat_counter += 20
else
meat_counter ++
for(var/obj/item/W in H)
H.unEquip(W)
H.gib()
/mob/living/simple_animal/hostile/spawner/ash_walker/spawn_mob()
if(meat_counter >= 2)
new /obj/effect/mob_spawn/human/ash_walker(get_step(src.loc, SOUTH))
visible_message("<span class='danger'>An egg is ready to hatch!</span>")
meat_counter -= 2
/obj/effect/mob_spawn/human/ash_walker
name = "ash walker egg"
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
icon_state = "large_egg"
mob_species = /datum/species/lizard/ashwalker
helmet = /obj/item/clothing/head/helmet/gladiator
uniform = /obj/item/clothing/under/gladiator
roundstart = FALSE
death = FALSE
anchored = 0
density = 0
flavour_text = {"<B>You are an Ash Walker. Your tribe worships <span class='danger'>the necropolis</span>. The wastes are sacred ground, its monsters a blessed bounty. You have seen lights in the distance though, the arrival of outsiders seeking to destroy the land. Fresh sacrifices.</B>"}
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
new_spawn.real_name = random_unique_lizard_name(gender)
new_spawn << "Drag corpses to your nest to feed the young, and spawn more Ash Walkers. Bring glory to the tribe!"
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.underwear = "Nude"
H.update_body()
/obj/effect/mob_spawn/human/ash_walker/New()
..()
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)
//Wishgranter Exile
/obj/effect/mob_spawn/human/exile
name = "exile sleeper"
mob_name = "Penitent Exile"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
mob_species = /datum/species/shadow
flavour_text = {"You are cursed! Many years ago you risked it all to reach the Wish Granter, siezing it's power for yourself and leaving your friends for dead.. Though your wish came true, it did so at a price, and you've been doomed to wander these wastes ever since. You seek only to atone now, to somehow redeem yourself, and finally be released. You've seen ships landing in the distance. Perhaps now is the time to make things right?"}
/obj/effect/mob_spawn/human/exile/special(mob/living/new_spawn)
new_spawn.real_name = "[new_spawn.real_name] ([rand(0,999)])"
var/wish = rand(1,4)
switch(wish)
if(1)
new_spawn << "You wished to kill, and kill you did. You've lost track of the number and murder long lost it's spark of excitement. You feel only regret."
if(2)
new_spawn << "You wished for unending wealth, but no amount of money was worth this existence. Maybe charity might redeem your soul?"
if(3)
new_spawn << "You wished for power. Little good it did you, cast out of the light. You are a king, but ruling over a miserable wasteland. You feel only remorse."
if(4)
new_spawn << "You wished for immortality, even as your friends lay dying behind you. No matter how many times you cast yourself into the lava, you awaken in this room again within a few days. You are overwhelmed with guilt."
//Free Golems
/obj/item/weapon/disk/design_disk/golem_shell
name = "Golem Creation Disk"
desc = "A gift from the Liberator."
icon_state = "datadisk1"
/obj/item/weapon/disk/design_disk/golem_shell/New()
..()
var/datum/design/golem_shell/G = new
blueprint = G
/datum/design/golem_shell
name = "Golem Shell Construction"
desc = "Allows for the construction of a Golem Shell."
id = "golem"
req_tech = list("materials" = 12)
build_type = AUTOLATHE
materials = list(MAT_METAL = 40000)
build_path = /obj/item/golem_shell
category = list("Imported")
/obj/item/golem_shell
name = "incomplete golem shell"
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
desc = "The incomplete body of a golem. Add ten sheets of any mineral to finish."
/obj/item/golem_shell/attackby(obj/item/I, mob/user, params)
..()
var/species
if(istype(I, /obj/item/stack/sheet))
var/obj/item/stack/sheet/O = I
if(istype(O, /obj/item/stack/sheet/metal))
species = /datum/species/golem
if(istype(O, /obj/item/stack/sheet/mineral/plasma))
species = /datum/species/golem/plasma
if(istype(O, /obj/item/stack/sheet/mineral/diamond))
species = /datum/species/golem/diamond
if(istype(O, /obj/item/stack/sheet/mineral/gold))
species = /datum/species/golem/gold
if(istype(O, /obj/item/stack/sheet/mineral/silver))
species = /datum/species/golem/silver
if(istype(O, /obj/item/stack/sheet/mineral/uranium))
species = /datum/species/golem/uranium
if(species)
if(O.use(10))
user << "You finish up the golem shell with ten sheets of [O]."
var/obj/effect/mob_spawn/human/golem/G = new(get_turf(src))
G.mob_species = species
qdel(src)
else
user << "You need at least ten sheets to finish a golem."
else
user << "You can't build a golem out of this kind of material."
/obj/effect/mob_spawn/human/golem
name = "completed golem shell"
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
mob_species = /datum/species/golem
roundstart = FALSE
death = FALSE
anchored = 0
density = 0
flavour_text = {"<B>You are a Free Golem. Your family worships <span class='danger'>The Liberator</span>. In his infinite and divine wisdom, he set your clan free to travel the stars with a single declaration; 'Yeah go do whatever.' Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn golems, so that no golem may ever be forced to serve again.</B>"}
/obj/effect/mob_spawn/human/golem/New()
..()
var/area/A = get_area(src)
if(A)
notify_ghosts("A golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK)
/obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn)
var/golem_surname = pick(golem_names)
// 3% chance that our golem has a human surname, because
// cultural contamination
if(prob(3))
golem_surname = pick(last_names)
var/datum/species/X = mob_species
var/golem_forename = initial(X.id)
// The id of golem species is either their material "diamond","gold",
// or just "golem" for the plain ones. So we're using it for naming.
if(golem_forename == "golem")
golem_forename = "iron"
new_spawn.real_name = "[capitalize(golem_forename)] [golem_surname]"
// This means golems have names like Iron Forge, or Diamond Quarry
// also a tiny chance of being called "Plasma Meme"
// which is clearly a feature
new_spawn << "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked."
if(ishuman(new_spawn))
var/mob/living/carbon/human/H = new_spawn
H.set_cloned_appearance()
/obj/effect/mob_spawn/human/golem/adamantine
name = "golem sleeper"
mob_name = "Free Golem"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
anchored = 1
density = 1
mob_species = /datum/species/golem/adamantine
//Hermit
/obj/effect/mob_spawn/human/hermit
name = "hermit sleeper"
mob_name = "Hermit"
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = {"Doomed to walk this eternal hellscape due to means you barely remember at this point, every day is a struggle for survival as you barely scrape by in your makeshift housing."}
/obj/effect/mob_spawn/human/hermit/New()
var/arrpee = rand(1,4)
switch(arrpee)
if(1)
flavour_text = {"You were the sole survivor of a raid-party's onslaught on a small orbital tradestation. You were forced to early-eject your pod to escape, the horrifed faces of the remaining crew when the raiders blew apart the room's airlock forever ingrained in your mind."}
uniform = /obj/item/clothing/under/assistantformal
shoes = /obj/item/clothing/shoes/sneakers/black
back = /obj/item/weapon/storage/backpack
if(2)
flavour_text = {"A castaway from a far-off civilization, banished for crimes of heresy against the church. You awoke from hypersleep your pod crashlanding into this hellscape, only the essentials left to make a new life for yourself."}
uniform = /obj/item/clothing/under/rank/prisoner
shoes = /obj/item/clothing/shoes/sneakers/orange
back = /obj/item/weapon/storage/backpack
if(3)
flavour_text = {"A runaway from the tyranny of Nanotrasen and everything all these damnned corporations stand for. From a metaphorical hell to a literal one, you do your best to put your station-life behind you to try and survive in this harsh land."}
uniform = /obj/item/clothing/under/rank/medical
suit = /obj/item/clothing/suit/toggle/labcoat
back = /obj/item/weapon/storage/backpack/medic
shoes = /obj/item/clothing/shoes/sneakers/black
if(4)
flavour_text = {"You weren't exactly the sharpest tool in the shed, hitting that big red button on the escape pod wondering what it'd do. Whether this 'special' attribute of yours is a defect of cloning or just genuine stupidity, the fact you've survived this long in a literal hellhole is enough to make Darwin roll in his grave."}
uniform = /obj/item/clothing/under/color/grey/glorf
shoes = /obj/item/clothing/shoes/sneakers/black
back = /obj/item/weapon/storage/backpack

View File

@@ -0,0 +1,39 @@
#define ASH_WALKER_SPAWN_THRESHOLD 2
//The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm
/mob/living/simple_animal/hostile/spawner/ash_walker
name = "ash walker nest"
desc = "A nest built around a necropolis tendril. The eggs seem to grow unnaturally fast..."
icon = 'icons/mob/nest.dmi'
icon_state = "ash_walker_nest"
icon_living = "ash_walker_nest"
faction = list("ashwalker")
health = 200
maxHealth = 200
loot = list(/obj/effect/gibspawner, /obj/item/device/assembly/signaler/anomaly)
del_on_death = 1
var/meat_counter
/mob/living/simple_animal/hostile/spawner/ash_walker/Life()
..()
if(!stat)
consume()
spawn_mob()
/mob/living/simple_animal/hostile/spawner/ash_walker/proc/consume()
for(var/mob/living/H in view(src,1)) //Only for corpse right next to/on same tile
if(H.stat)
visible_message("<span class='warning'>Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.</span>")
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
if(istype(H,/mob/living/simple_animal/hostile/megafauna/dragon))
meat_counter += 20
else
meat_counter ++
for(var/obj/item/W in H)
H.unEquip(W)
H.gib()
/mob/living/simple_animal/hostile/spawner/ash_walker/spawn_mob()
if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD)
new /obj/effect/mob_spawn/human/ash_walker(get_step(src.loc, SOUTH))
visible_message("<span class='danger'>One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!</span>")
meat_counter -= ASH_WALKER_SPAWN_THRESHOLD

View File

@@ -0,0 +1,63 @@
//The necropolis gate is used to call forth Legion from the Necropolis.
/obj/structure/lavaland_door
name = "necropolis gate"
desc = "A tremendous and impossibly large gateway, bored into dense bedrock."
icon = 'icons/effects/96x96.dmi'
icon_state = "door"
anchored = 1
density = 1
opacity = 1
bound_width = 96
bound_height = 96
pixel_x = -32
bound_x = -32
burn_state = LAVA_PROOF
luminosity = 1
var/boss = FALSE
var/is_anyone_home = FALSE
/obj/structure/lavaland_door/attack_hand(mob/user)
for(var/mob/living/simple_animal/hostile/megafauna/legion/L in mob_list)
return
if(is_anyone_home)
return
var/safety = alert(user, "You think this might be a bad idea...", "Knock on the door?", "Proceed", "Abort")
if(safety == "Abort" || !in_range(src, user) || !src || is_anyone_home || user.incapacitated())
return
user.visible_message("<span class='warning'>[user] knocks on [src]...</span>", "<span class='boldannounce'>You tentatively knock on [src]...</span>")
playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, 1)
is_anyone_home = TRUE
sleep(50)
if(boss)
user << "<span class='notice'>There's no response.</span>"
is_anyone_home = FALSE
return 0
boss = TRUE
visible_message("<span class='warning'>Locks along the door begin clicking open from within...</span>")
var/volume = 60
for(var/i in 1 to 3)
playsound(src, 'sound/items/Deconstruct.ogg', volume, 0)
volume += 20
sleep(10)
sleep(10)
visible_message("<span class='userdanger'>Something horrible emerges from the Necropolis!</span>")
message_admins("[key_name_admin(user)] has summoned Legion!")
log_game("[key_name(user)] summoned Legion.")
for(var/mob/M in player_list)
if(M.z == z)
M << "<span class='userdanger'>Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has come.</span>"
M << 'sound/creatures/legion_spawn.ogg'
if(M.client)
flash_color(M, color = "#FF0000", time = 50)
notify_ghosts("Legion has been summoned in the [get_area(src)]!", source = src, action = NOTIFY_ORBIT)
is_anyone_home = FALSE
new/mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH))
/obj/structure/lavaland_door/singularity_pull()
return 0
/obj/structure/lavaland_door/Destroy(force)
if(force)
. = ..()
else
return QDEL_HINT_LETMELIVE

View File

@@ -0,0 +1,126 @@
//These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...)
/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate.
name = "greed's slot machine"
desc = "High stakes, high rewards."
icon = 'icons/obj/economy.dmi'
icon_state = "slots1"
anchored = 1
density = 1
var/win_prob = 5
/obj/structure/cursed_slot_machine/attack_hand(mob/living/carbon/human/user)
if(!istype(user))
return
if(in_use)
return
in_use = TRUE
user.adjustCloneLoss(20)
if(user.stat)
user << "<span class='userdanger'>No... just one more try...</span>"
user.gib()
else
user.visible_message("<span class='warning'>[user], pulls [src]'s lever with a glint in their eyes!</span>", "<span class='warning'>You feel a draining as you pull the lever, but you \
know it'll be worth it.</span>")
icon_state = "slots2"
playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, 0)
sleep(50)
icon_state = "slots1"
in_use = FALSE
if(prob(win_prob))
playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, 0)
new/obj/structure/cursed_money(get_turf(src))
if(user)
user << "<span class='boldwarning'>You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.</span>"
qdel(src)
else
if(user)
user << "<span class='boldwarning'>Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?</span>"
/obj/structure/cursed_money
name = "bag of money"
desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!"
icon = 'icons/obj/storage.dmi'
icon_state = "moneybag"
anchored = FALSE
density = TRUE
/obj/structure/cursed_money/New()
spawn(600)
if(src)
visible_message("<span class='warning'>[src] falls in on itself, canvas rotting away and contents vanishing.</span>")
qdel(src)
/obj/structure/cursed_money/attack_hand(mob/living/user)
user.visible_message("<span class='boldwarning'>You open the bag...!</span>\n<span class='danger'>And see a bag full of dice. Confused, you take one... and the bag vanishes.</span>")
var/obj/item/weapon/dice/d20/fate/one_use/critical_fail = new(get_turf(user))
user.put_in_hands(critical_fail)
qdel(src)
/obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through.
name = "gluttony's wall"
desc = "Only those who truly indulge may pass."
anchored = 1
density = 1
icon_state = "blob"
icon = 'icons/mob/blob.dmi'
color = rgb(145, 150, 0)
/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target, height=0)//So bullets will fly over and stuff.
if(height==0)
return 1
if(istype(mover, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mover
if(H.nutrition >= NUTRITION_LEVEL_FAT)
H.visible_message("<span class='warning'>[H] pushes through [src]!</span>", "<span class='notice'>You've seen and eaten worse than this.</span>")
return 1
else
H << "<span class='warning'>You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.</span>"
else
return 0
/obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin.
name = "pride's mirror"
desc = "Pride cometh before the..."
icon_state = "magic_mirror"
/obj/structure/mirror/magic/pride/curse(mob/user)
user.visible_message("<span class='danger'><B>The ground splits beneath [user] as their hand leaves the mirror!</B></span>", \
"<span class='notice'>Perfect. Much better! Now <i>nobody</i> will be able to resist yo-</span>")
var/turf/T = get_turf(user)
T.ChangeTurf(/turf/open/chasm/straight_down)
var/turf/open/chasm/straight_down/C = T
C.drop(user)
//can't be bothered to do sloth right now, will make later
/obj/item/weapon/knife/envy //Envy's knife: Found in the Envy ruin. Attackers take on the appearance of whoever they strike.
name = "envy's knife"
desc = "Their success will be yours."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
item_state = "render"
force = 18
throwforce = 10
w_class = 3
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity)
..()
if(!proximity)
return
if(!istype(user))
return
if(istype(AM, /mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
if(user.real_name != H.dna.real_name)
user.real_name = H.dna.real_name
H.dna.transfer_identity(user, transfer_SE=1)
user.updateappearance(mutcolor_update=1)
user.domutcheck()
user.visible_message("<span class='warning'>[user]'s appearance shifts into [H]'s!</span>", \
"<span class='boldannounce'>They think they're <i>sooo</i> much better than you. Not anymore, they won't.</span>")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 KiB

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -53,6 +53,7 @@ h1.alert, h2.alert {color: #000000;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 3;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.greenannounce {color: #00ff00; font-weight: bold;}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -734,6 +734,8 @@
#include "code\game\objects\structures\false_walls.dm"
#include "code\game\objects\structures\fireaxe.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
#include "code\game\objects\structures\ghost_role_spawners.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guncase.dm"
@@ -1683,6 +1685,9 @@
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\ruin_areas.dm"
#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
#include "code\modules\security_levels\keycard_authentication.dm"
#include "code\modules\security_levels\security_levels.dm"
#include "code\modules\shuttle\assault_pod.dm"