mirror of
https://github.com/KabKebab/GS13.git
synced 2026-08-30 00:21:24 +01:00
Uploading all files.
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
|
||||
|
||||
/obj/structure/fans/tiny/invisible //For blocking air in ruin doorways
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
|
||||
//lavaland_surface_seed_vault.dmm
|
||||
//Seed Vault
|
||||
|
||||
/obj/effect/spawner/lootdrop/seed_vault
|
||||
name = "seed vault seeds"
|
||||
lootcount = 1
|
||||
|
||||
loot = list(/obj/item/seeds/gatfruit = 10,
|
||||
/obj/item/seeds/cherry/bomb = 10,
|
||||
/obj/item/seeds/berry/glow = 10,
|
||||
/obj/item/seeds/sunflower/moonflower = 8
|
||||
)
|
||||
|
||||
/obj/item/disk/design_disk/plant_disk
|
||||
name = "Plant Disk Blueprints"
|
||||
desc = "A disk to be uploaded into the autolathen for more plant disks."
|
||||
icon_state = "datadisk1"
|
||||
max_blueprints = 1
|
||||
|
||||
/obj/item/disk/design_disk/plant_disk/Initialize()
|
||||
. = ..()
|
||||
var/datum/design/diskplantgene/P = new
|
||||
blueprints[1] = P
|
||||
|
||||
//Free Golems
|
||||
|
||||
/obj/item/disk/design_disk/golem_shell
|
||||
name = "Golem Creation Disk"
|
||||
desc = "A gift from the Liberator."
|
||||
icon_state = "datadisk1"
|
||||
max_blueprints = 1
|
||||
|
||||
/obj/item/disk/design_disk/golem_shell/Initialize()
|
||||
. = ..()
|
||||
var/datum/design/golem_shell/G = new
|
||||
blueprints[1] = G
|
||||
|
||||
/datum/design/golem_shell
|
||||
name = "Golem Shell Construction"
|
||||
desc = "Allows for the construction of a Golem Shell."
|
||||
id = "golem"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 40000)
|
||||
build_path = /obj/item/golem_shell
|
||||
category = list("Imported")
|
||||
|
||||
/obj/item/golem_shell
|
||||
name = "incomplete free 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."
|
||||
var/shell_type = /obj/effect/mob_spawn/human/golem
|
||||
var/has_owner = FALSE //if the resulting golem obeys someone
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/golem_shell/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
var/static/list/golem_shell_species_types = list(
|
||||
/obj/item/stack/sheet/metal = /datum/species/golem,
|
||||
/obj/item/stack/sheet/glass = /datum/species/golem/glass,
|
||||
/obj/item/stack/sheet/plasteel = /datum/species/golem/plasteel,
|
||||
/obj/item/stack/sheet/mineral/sandstone = /datum/species/golem/sand,
|
||||
/obj/item/stack/sheet/mineral/plasma = /datum/species/golem/plasma,
|
||||
/obj/item/stack/sheet/mineral/diamond = /datum/species/golem/diamond,
|
||||
/obj/item/stack/sheet/mineral/gold = /datum/species/golem/gold,
|
||||
/obj/item/stack/sheet/mineral/silver = /datum/species/golem/silver,
|
||||
/obj/item/stack/sheet/mineral/uranium = /datum/species/golem/uranium,
|
||||
/obj/item/stack/sheet/mineral/bananium = /datum/species/golem/bananium,
|
||||
/obj/item/stack/sheet/mineral/titanium = /datum/species/golem/titanium,
|
||||
/obj/item/stack/sheet/mineral/plastitanium = /datum/species/golem/plastitanium,
|
||||
/obj/item/stack/sheet/mineral/abductor = /datum/species/golem/alloy,
|
||||
/obj/item/stack/sheet/mineral/wood = /datum/species/golem/wood,
|
||||
/obj/item/stack/sheet/bluespace_crystal = /datum/species/golem/bluespace,
|
||||
/obj/item/stack/sheet/runed_metal = /datum/species/golem/runic,
|
||||
/obj/item/stack/medical/gauze = /datum/species/golem/cloth,
|
||||
/obj/item/stack/sheet/cloth = /datum/species/golem/cloth,
|
||||
/obj/item/stack/sheet/mineral/adamantine = /datum/species/golem/adamantine,
|
||||
/obj/item/stack/sheet/plastic = /datum/species/golem/plastic,
|
||||
/obj/item/stack/tile/brass = /datum/species/golem/clockwork,
|
||||
/obj/item/stack/tile/bronze = /datum/species/golem/bronze,
|
||||
/obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard,
|
||||
/obj/item/stack/sheet/leather = /datum/species/golem/leather,
|
||||
/obj/item/stack/sheet/bone = /datum/species/golem/bone)
|
||||
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/O = I
|
||||
var/species = golem_shell_species_types[O.merge_type]
|
||||
if(species)
|
||||
if(O.use(10))
|
||||
to_chat(user, "You finish up the golem shell with ten sheets of [O].")
|
||||
new shell_type(get_turf(src), species, user)
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "You need at least ten sheets to finish a golem.")
|
||||
else
|
||||
to_chat(user, "You can't build a golem out of this kind of material.")
|
||||
|
||||
//made with xenobiology, the golem obeys its creator
|
||||
/obj/item/golem_shell/servant
|
||||
name = "incomplete servant golem shell"
|
||||
shell_type = /obj/effect/mob_spawn/human/golem/servant
|
||||
|
||||
///Syndicate Listening Post
|
||||
|
||||
/obj/effect/mob_spawn/human/lavaland_syndicate
|
||||
name = "Syndicate Bioweapon Scientist"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
job_description = "Off-station Syndicate Scientist"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
flavour_text = "<span class='big bold'>You are a syndicate agent,</span><b> employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Continue your research as best you can, and try to keep a low profile. <font size=6>DON'T</font> abandon the base without good cause.</b> The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!</b>"
|
||||
outfit = /datum/outfit/lavaland_syndicate
|
||||
assignedrole = "Lavaland Syndicate"
|
||||
|
||||
/obj/effect/mob_spawn/human/lavaland_syndicate/special(mob/living/new_spawn)
|
||||
new_spawn.grant_language(/datum/language/codespeak)
|
||||
|
||||
/datum/outfit/lavaland_syndicate
|
||||
name = "Lavaland Syndicate Agent"
|
||||
name = "Off-station Syndicate Agent"
|
||||
r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/toggle/labcoat
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
back = /obj/item/storage/backpack
|
||||
r_pocket = /obj/item/gun/ballistic/automatic/pistol
|
||||
id = /obj/item/card/id/syndicate/anyone
|
||||
implants = list(/obj/item/implant/weapons_auth)
|
||||
|
||||
/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H)
|
||||
H.faction |= ROLE_SYNDICATE
|
||||
|
||||
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
|
||||
name = "Syndicate Comms Agent"
|
||||
job_description = "Off-station Syndicate Comms Agent"
|
||||
flavour_text = "<span class='big bold'>You are a syndicate agent,</span><b> employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. <b>Monitor enemy activity as best you can, and try to keep a low profile. <font size=6>DON'T</font> abandon the base without good cause.</b> Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!</b>"
|
||||
outfit = /datum/outfit/lavaland_syndicate/comms
|
||||
|
||||
/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize()
|
||||
. = ..()
|
||||
if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie.
|
||||
new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/datum/outfit/lavaland_syndicate/comms
|
||||
name = "Lavaland Syndicate Comms Agent"
|
||||
r_hand = /obj/item/melee/transforming/energy/sword/saber
|
||||
mask = /obj/item/clothing/mask/chameleon/gps
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
|
||||
/obj/item/clothing/mask/chameleon/gps/Initialize()
|
||||
. = ..()
|
||||
new /obj/item/gps/internal/lavaland_syndicate_base(src)
|
||||
|
||||
/obj/item/gps/internal/lavaland_syndicate_base
|
||||
gpstag = "Encrypted Signal"
|
||||
@@ -0,0 +1,7 @@
|
||||
//////lavaland clown planet papers
|
||||
|
||||
/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape
|
||||
info = "If you dare not continue down this path of madness, escape can be found through the chute in this room."
|
||||
|
||||
/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope
|
||||
info = "Abandon hope, all ye who enter here."
|
||||
@@ -0,0 +1,9 @@
|
||||
//lavaland_surface_pizzaparty.dmm
|
||||
|
||||
/obj/effect/spawner/lootdrop/pizzaparty
|
||||
name = "pizza bomb spawner"
|
||||
loot = list(/obj/item/pizzabox/margherita = 3,
|
||||
/obj/item/pizzabox/meat = 3,
|
||||
/obj/item/pizzabox/mushroom = 3,
|
||||
/obj/item/pizzabox/bomb = 1)
|
||||
lootdoubles = FALSE
|
||||
@@ -0,0 +1,353 @@
|
||||
/obj/effect/sliding_puzzle
|
||||
name = "Sliding puzzle generator"
|
||||
icon = 'icons/obj/items_and_weapons.dmi' //mapping
|
||||
icon_state = "syndballoon"
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
anchored = TRUE
|
||||
var/list/elements
|
||||
var/floor_type = /turf/open/floor/vault
|
||||
var/finished = FALSE
|
||||
var/reward_type = /obj/item/reagent_containers/food/snacks/cookie
|
||||
var/element_type = /obj/structure/puzzle_element
|
||||
var/auto_setup = TRUE
|
||||
var/empty_tile_id
|
||||
|
||||
//Gets the turf where the tile with given id should be
|
||||
/obj/effect/sliding_puzzle/proc/get_turf_for_id(id)
|
||||
var/turf/center = get_turf(src)
|
||||
switch(id)
|
||||
if(1)
|
||||
return get_step(center,NORTHWEST)
|
||||
if(2)
|
||||
return get_step(center,NORTH)
|
||||
if(3)
|
||||
return get_step(center,NORTHEAST)
|
||||
if(4)
|
||||
return get_step(center,WEST)
|
||||
if(5)
|
||||
return center
|
||||
if(6)
|
||||
return get_step(center,EAST)
|
||||
if(7)
|
||||
return get_step(center,SOUTHWEST)
|
||||
if(8)
|
||||
return get_step(center,SOUTH)
|
||||
if(9)
|
||||
return get_step(center,SOUTHEAST)
|
||||
|
||||
/obj/effect/sliding_puzzle/Initialize(mapload)
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/effect/sliding_puzzle/LateInitialize()
|
||||
if(auto_setup)
|
||||
setup()
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/check_setup_location()
|
||||
for(var/id in 1 to 9)
|
||||
var/turf/T = get_turf_for_id(id)
|
||||
if(!T)
|
||||
return FALSE
|
||||
if(istype(T,/turf/closed/indestructible))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/validate()
|
||||
if(finished)
|
||||
return
|
||||
|
||||
if(elements.len < 8) //Someone broke it
|
||||
qdel(src)
|
||||
|
||||
//Check if everything is in place
|
||||
for(var/id in 1 to 9)
|
||||
var/target_turf = get_turf_for_id(id)
|
||||
var/obj/structure/puzzle_element/E = locate() in target_turf
|
||||
if(id == empty_tile_id && !E) // This location should be empty.
|
||||
continue
|
||||
if(!E || E.id != id) //wrong tile or no tile at all
|
||||
return
|
||||
//Ding ding
|
||||
finish()
|
||||
|
||||
/obj/effect/sliding_puzzle/Destroy()
|
||||
if(LAZYLEN(elements))
|
||||
for(var/obj/structure/puzzle_element/E in elements)
|
||||
E.source = null
|
||||
elements.Cut()
|
||||
return ..()
|
||||
|
||||
#define COLLAPSE_DURATION 7
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/finish()
|
||||
finished = TRUE
|
||||
for(var/mob/M in range(7,src))
|
||||
shake_camera(M, COLLAPSE_DURATION , 1)
|
||||
for(var/obj/structure/puzzle_element/E in elements)
|
||||
E.collapse()
|
||||
|
||||
dispense_reward()
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/dispense_reward()
|
||||
new reward_type(get_turf(src))
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/is_solvable()
|
||||
var/list/current_ordering = list()
|
||||
for(var/obj/structure/puzzle_element/E in elements_in_order())
|
||||
current_ordering += E.id
|
||||
|
||||
var/swap_tally = 0
|
||||
for(var/i in 1 to current_ordering.len)
|
||||
var/checked_value = current_ordering[i]
|
||||
for(var/j in i to current_ordering.len)
|
||||
if(current_ordering[j] < checked_value)
|
||||
swap_tally++
|
||||
|
||||
return swap_tally % 2 == 0
|
||||
|
||||
//swap two tiles in same row
|
||||
/obj/effect/sliding_puzzle/proc/make_solvable()
|
||||
var/first_tile_id = 1
|
||||
var/other_tile_id = 2
|
||||
if(empty_tile_id == 1 || empty_tile_id == 2) //Can't swap with empty one so just grab some in second row
|
||||
first_tile_id = 4
|
||||
other_tile_id = 5
|
||||
|
||||
var/turf/T1 = get_turf_for_id(first_tile_id)
|
||||
var/turf/T2 = get_turf_for_id(other_tile_id)
|
||||
|
||||
var/obj/structure/puzzle_element/E1 = locate() in T1
|
||||
var/obj/structure/puzzle_element/E2 = locate() in T2
|
||||
|
||||
E1.forceMove(T2)
|
||||
E2.forceMove(T1)
|
||||
|
||||
/proc/cmp_xy_desc(atom/movable/A,atom/movable/B)
|
||||
if(A.y > B.y)
|
||||
return -1
|
||||
if(A.y < B.y)
|
||||
return 1
|
||||
if(A.x > B.x)
|
||||
return 1
|
||||
if(A.x < B.x)
|
||||
return -1
|
||||
return 0
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/elements_in_order()
|
||||
return sortTim(elements,cmp=/proc/cmp_xy_desc)
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/get_base_icon()
|
||||
var/icon/I = new('icons/obj/puzzle.dmi')
|
||||
var/list/puzzles = icon_states(I)
|
||||
var/puzzle_state = pick(puzzles)
|
||||
var/icon/P = new('icons/obj/puzzle.dmi',puzzle_state)
|
||||
return P
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/setup()
|
||||
//First we slice the 96x96 icon into 32x32 pieces
|
||||
var/list/puzzle_pieces = list() //id -> icon list
|
||||
|
||||
var/width = 3
|
||||
var/height = 3
|
||||
var/list/left_ids = list()
|
||||
var/tile_count = width * height
|
||||
|
||||
//Generate per tile icons
|
||||
var/icon/base_icon = get_base_icon()
|
||||
|
||||
for(var/id in 1 to tile_count)
|
||||
var/y = width - round((id - 1) / width)
|
||||
var/x = ((id - 1) % width) + 1
|
||||
|
||||
var/x_start = 1 + (x - 1) * world.icon_size
|
||||
var/x_end = x_start + world.icon_size - 1
|
||||
var/y_start = 1 + ((y - 1) * world.icon_size)
|
||||
var/y_end = y_start + world.icon_size - 1
|
||||
|
||||
var/icon/T = new(base_icon)
|
||||
T.Crop(x_start,y_start,x_end,y_end)
|
||||
puzzle_pieces["[id]"] = T
|
||||
left_ids += id
|
||||
|
||||
//Setup random empty tile
|
||||
empty_tile_id = pick_n_take(left_ids)
|
||||
var/turf/empty_tile_turf = get_turf_for_id(empty_tile_id)
|
||||
empty_tile_turf.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR)
|
||||
var/mutable_appearance/MA = new(puzzle_pieces["[empty_tile_id]"])
|
||||
MA.layer = empty_tile_turf.layer + 0.1
|
||||
empty_tile_turf.add_overlay(MA)
|
||||
|
||||
elements = list()
|
||||
var/list/empty_spots = left_ids.Copy()
|
||||
for(var/spot_id in empty_spots)
|
||||
var/turf/T = get_turf_for_id(spot_id)
|
||||
T = T.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR)
|
||||
var/obj/structure/puzzle_element/E = new element_type(T)
|
||||
elements += E
|
||||
var/chosen_id = pick_n_take(left_ids)
|
||||
E.puzzle_icon = puzzle_pieces["[chosen_id]"]
|
||||
E.source = src
|
||||
E.id = chosen_id
|
||||
E.set_puzzle_icon()
|
||||
|
||||
if(!is_solvable())
|
||||
make_solvable()
|
||||
|
||||
/obj/structure/puzzle_element
|
||||
name = "mysterious pillar"
|
||||
desc = "puzzling..."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "puzzle_pillar"
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
var/id = 0
|
||||
var/obj/effect/sliding_puzzle/source
|
||||
var/icon/puzzle_icon
|
||||
|
||||
/obj/structure/puzzle_element/Move(nloc, dir)
|
||||
if(!isturf(nloc) || moving_diagonally || get_dist(get_step(src,dir),get_turf(source)) > 1)
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/puzzle_element/proc/set_puzzle_icon()
|
||||
cut_overlays()
|
||||
if(puzzle_icon)
|
||||
//Need to scale it down a bit to fit the static border
|
||||
var/icon/C = new(puzzle_icon)
|
||||
C.Scale(19,19)
|
||||
var/mutable_appearance/puzzle_small = new(C)
|
||||
puzzle_small.layer = layer + 0.1
|
||||
puzzle_small.pixel_x = 7
|
||||
puzzle_small.pixel_y = 7
|
||||
add_overlay(puzzle_small)
|
||||
|
||||
/obj/structure/puzzle_element/Destroy()
|
||||
if(source)
|
||||
source.elements -= src
|
||||
source.validate()
|
||||
return ..()
|
||||
|
||||
//Set the full image on the turf and delete yourself
|
||||
/obj/structure/puzzle_element/proc/collapse()
|
||||
var/turf/T = get_turf(src)
|
||||
var/mutable_appearance/MA = new(puzzle_icon)
|
||||
MA.layer = T.layer + 0.1
|
||||
T.add_overlay(MA)
|
||||
//Some basic shaking animation
|
||||
for(var/i in 1 to COLLAPSE_DURATION)
|
||||
animate(src, pixel_x=rand(-5,5), pixel_y=rand(-2,2), time=1)
|
||||
QDEL_IN(src,COLLAPSE_DURATION)
|
||||
|
||||
/obj/structure/puzzle_element/Moved()
|
||||
. = ..()
|
||||
source.validate()
|
||||
|
||||
//Admin abuse version so you can pick the icon before it sets up
|
||||
/obj/effect/sliding_puzzle/admin
|
||||
auto_setup = FALSE
|
||||
var/icon/puzzle_icon
|
||||
var/puzzle_state
|
||||
|
||||
/obj/effect/sliding_puzzle/admin/get_base_icon()
|
||||
var/icon/I = new(puzzle_icon,puzzle_state)
|
||||
return I
|
||||
|
||||
//Ruin version
|
||||
/obj/effect/sliding_puzzle/lavaland
|
||||
reward_type = /obj/structure/closet/crate/necropolis/puzzle
|
||||
|
||||
/obj/effect/sliding_puzzle/lavaland/dispense_reward()
|
||||
if(prob(25))
|
||||
//If it's not roaming somewhere else already.
|
||||
var/mob/living/simple_animal/hostile/megafauna/bubblegum/B = locate() in GLOB.mob_list
|
||||
if(!B)
|
||||
reward_type = /mob/living/simple_animal/hostile/megafauna/bubblegum
|
||||
return ..()
|
||||
|
||||
//Prison cube version
|
||||
/obj/effect/sliding_puzzle/prison
|
||||
auto_setup = FALSE //This will be done by cube proc
|
||||
var/mob/living/prisoner
|
||||
element_type = /obj/structure/puzzle_element/prison
|
||||
|
||||
/obj/effect/sliding_puzzle/prison/get_base_icon()
|
||||
if(!prisoner)
|
||||
CRASH("Prison cube without prisoner")
|
||||
prisoner.setDir(SOUTH)
|
||||
var/icon/I = getFlatIcon(prisoner)
|
||||
I.Scale(96,96)
|
||||
return I
|
||||
|
||||
/obj/effect/sliding_puzzle/prison/Destroy()
|
||||
if(prisoner)
|
||||
to_chat(prisoner,"<span class='userdanger'>With the cube broken by force, you can feel your body falling apart.</span>")
|
||||
prisoner.death()
|
||||
qdel(prisoner)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/sliding_puzzle/prison/dispense_reward()
|
||||
prisoner.forceMove(get_turf(src))
|
||||
prisoner.notransform = FALSE
|
||||
prisoner = null
|
||||
|
||||
//Some armor so it's harder to kill someone by mistake.
|
||||
/obj/structure/puzzle_element/prison
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50)
|
||||
|
||||
/obj/structure/puzzle_element/prison/relaymove(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/prisoncube
|
||||
name = "Prison Cube"
|
||||
desc = "Dusty cube with humanoid imprint on it."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "prison_cube"
|
||||
|
||||
/obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
if(!proximity_flag || !isliving(target))
|
||||
return
|
||||
var/mob/living/victim = target
|
||||
var/mob/living/carbon/carbon_victim = victim
|
||||
//Handcuffed or unconcious
|
||||
if(istype(carbon_victim) && carbon_victim.handcuffed || victim.stat != CONSCIOUS)
|
||||
if(!puzzle_imprison(target))
|
||||
to_chat(user,"<span class='warning'>[src] does nothing.</span>")
|
||||
return
|
||||
to_chat(user,"<span class='warning'>You trap [victim] in the prison cube!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user,"<span class='notice'>[src] only accepts restrained or unconcious prisoners.</span>")
|
||||
|
||||
/proc/puzzle_imprison(mob/living/prisoner)
|
||||
var/turf/T = get_turf(prisoner)
|
||||
var/obj/effect/sliding_puzzle/prison/cube = new(T)
|
||||
if(!cube.check_setup_location())
|
||||
qdel(cube)
|
||||
return FALSE
|
||||
|
||||
//First grab the prisoner and move them temporarily into the generator so they won't get thrown around.
|
||||
prisoner.notransform = TRUE
|
||||
prisoner.forceMove(cube)
|
||||
to_chat(prisoner,"<span class='userdanger'>You're trapped by the prison cube! You will remain trapped until someone solves it.</span>")
|
||||
|
||||
//Clear the area from objects (and cube user)
|
||||
var/list/things_to_throw = list()
|
||||
for(var/atom/movable/AM in range(1,T))
|
||||
if(!AM.anchored)
|
||||
things_to_throw += AM
|
||||
|
||||
for(var/atom/movable/AM in things_to_throw)
|
||||
var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(AM, T)))
|
||||
AM.throw_at(throwtarget, 2, 3)
|
||||
|
||||
//Create puzzle itself
|
||||
cube.prisoner = prisoner
|
||||
cube.setup()
|
||||
|
||||
//Move them into random block
|
||||
var/obj/structure/puzzle_element/E = pick(cube.elements)
|
||||
prisoner.forceMove(E)
|
||||
return TRUE
|
||||
@@ -0,0 +1,5 @@
|
||||
/////////// lavaland slot ruin items
|
||||
|
||||
/obj/item/paper/fluff/stations/lavaland/sloth/note
|
||||
name = "note from sloth"
|
||||
desc = "have not gotten around to finishing my cursed item yet sorry - sloth"
|
||||
@@ -0,0 +1,22 @@
|
||||
//////lavaland surface papers
|
||||
|
||||
/obj/item/paper/fluff/stations/lavaland/surface/henderson_report
|
||||
name = "Important Notice - Mrs. Henderson"
|
||||
info = "Nothing of interest to report."
|
||||
|
||||
//ratvar
|
||||
|
||||
/obj/structure/dead_ratvar
|
||||
name = "hulking wreck"
|
||||
desc = "The remains of a monstrous war machine."
|
||||
icon = 'icons/obj/lavaland/dead_ratvar.dmi'
|
||||
icon_state = "dead_ratvar"
|
||||
flags_1 = ON_BORDER_1
|
||||
appearance_flags = 0
|
||||
layer = FLY_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
bound_width = 416
|
||||
bound_height = 64
|
||||
pixel_y = -10
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
@@ -0,0 +1,22 @@
|
||||
//lavaland_surface_syndicate_base1.dmm
|
||||
|
||||
/obj/machinery/vending/syndichem
|
||||
name = "\improper SyndiChem"
|
||||
desc = "A vending machine full of grenades and grenade accessories. Sponsored by DonkCo(tm)."
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
products = list(/obj/item/stack/cable_coil/random = 5,
|
||||
/obj/item/assembly/igniter = 20,
|
||||
/obj/item/assembly/prox_sensor = 5,
|
||||
/obj/item/assembly/signaler = 5,
|
||||
/obj/item/assembly/timer = 5,
|
||||
/obj/item/assembly/voice = 5,
|
||||
/obj/item/assembly/health = 5,
|
||||
/obj/item/assembly/infra = 5,
|
||||
/obj/item/grenade/chem_grenade = 5,
|
||||
/obj/item/grenade/chem_grenade/large = 5,
|
||||
/obj/item/grenade/chem_grenade/pyro = 5,
|
||||
/obj/item/grenade/chem_grenade/cryo = 5,
|
||||
/obj/item/grenade/chem_grenade/adv_release = 5,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater = 1)
|
||||
product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning."
|
||||
resistance_flags = FIRE_PROOF
|
||||
@@ -0,0 +1,42 @@
|
||||
#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/lavaland/ash_walker
|
||||
name = "necropolis tendril nest"
|
||||
desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..."
|
||||
icon_state = "ash_walker_nest"
|
||||
icon_living = "ash_walker_nest"
|
||||
icon_dead = "ash_walker_nest"
|
||||
faction = list("ashwalker")
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
loot = list(/obj/effect/collapse)
|
||||
var/meat_counter = 6
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/death()
|
||||
new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs)))
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/Life()
|
||||
consume()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/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)
|
||||
for(var/obj/item/W in H)
|
||||
if(!H.dropItemToGround(W))
|
||||
qdel(W)
|
||||
if(ismegafauna(H))
|
||||
meat_counter += 20
|
||||
else
|
||||
meat_counter++
|
||||
H.gib()
|
||||
adjustHealth(-maxHealth * 0.05)//restores 5% hp of tendril
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/ash_walker/spawn_mob()
|
||||
if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD)
|
||||
new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(GLOB.alldirs)))
|
||||
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
|
||||
@@ -0,0 +1,410 @@
|
||||
//The necropolis gate is used to call forth Legion from the Necropolis.
|
||||
/obj/structure/necropolis_gate
|
||||
name = "necropolis gate"
|
||||
desc = "A massive stone gateway."
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "gate_full"
|
||||
flags_1 = ON_BORDER_1
|
||||
appearance_flags = 0
|
||||
layer = TABLE_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
light_range = 8
|
||||
light_color = LIGHT_COLOR_LAVA
|
||||
var/open = FALSE
|
||||
var/changing_openness = FALSE
|
||||
var/locked = FALSE
|
||||
var/static/mutable_appearance/top_overlay
|
||||
var/static/mutable_appearance/door_overlay
|
||||
var/static/mutable_appearance/dais_overlay
|
||||
var/obj/structure/opacity_blocker/sight_blocker
|
||||
var/sight_blocker_distance = 1
|
||||
|
||||
/obj/structure/necropolis_gate/Initialize()
|
||||
. = ..()
|
||||
setDir(SOUTH)
|
||||
var/turf/sight_blocker_turf = get_turf(src)
|
||||
if(sight_blocker_distance)
|
||||
for(var/i in 1 to sight_blocker_distance)
|
||||
if(!sight_blocker_turf)
|
||||
break
|
||||
sight_blocker_turf = get_step(sight_blocker_turf, NORTH)
|
||||
if(sight_blocker_turf)
|
||||
sight_blocker = new (sight_blocker_turf) //we need to block sight in a different spot than most things do
|
||||
sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance)
|
||||
icon_state = "gate_bottom"
|
||||
top_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_top")
|
||||
top_overlay.layer = EDGED_TURF_LAYER
|
||||
add_overlay(top_overlay)
|
||||
door_overlay = mutable_appearance('icons/effects/96x96.dmi', "door")
|
||||
door_overlay.layer = EDGED_TURF_LAYER
|
||||
add_overlay(door_overlay)
|
||||
dais_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_dais")
|
||||
dais_overlay.layer = CLOSED_TURF_LAYER
|
||||
add_overlay(dais_overlay)
|
||||
|
||||
/obj/structure/necropolis_gate/Destroy(force)
|
||||
if(force)
|
||||
qdel(sight_blocker, TRUE)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/structure/necropolis_gate/singularity_pull()
|
||||
return 0
|
||||
|
||||
/obj/structure/necropolis_gate/CanPass(atom/movable/mover, turf/target)
|
||||
if(get_dir(loc, target) == dir)
|
||||
return !density
|
||||
return 1
|
||||
|
||||
/obj/structure/necropolis_gate/CheckExit(atom/movable/O, target)
|
||||
if(get_dir(O.loc, target) == dir)
|
||||
return !density
|
||||
return 1
|
||||
|
||||
/obj/structure/opacity_blocker
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "gate_blocker"
|
||||
layer = EDGED_TURF_LAYER
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
opacity = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/opacity_blocker/singularity_pull()
|
||||
return 0
|
||||
|
||||
/obj/structure/opacity_blocker/Destroy(force)
|
||||
if(force)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/structure/necropolis_gate/attack_hand(mob/user)
|
||||
if(locked)
|
||||
to_chat(user, "<span class='boldannounce'>It's [open ? "stuck open":"locked"].</span>")
|
||||
return
|
||||
toggle_the_gate(user)
|
||||
return ..()
|
||||
|
||||
/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user, legion_damaged)
|
||||
if(changing_openness)
|
||||
return
|
||||
changing_openness = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
if(open)
|
||||
new /obj/effect/temp_visual/necropolis(T)
|
||||
visible_message("<span class='boldwarning'>The door slams closed!</span>")
|
||||
sleep(1)
|
||||
playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 80000)
|
||||
sleep(1)
|
||||
density = TRUE
|
||||
sleep(1)
|
||||
var/turf/sight_blocker_turf = get_turf(src)
|
||||
if(sight_blocker_distance)
|
||||
for(var/i in 1 to sight_blocker_distance)
|
||||
if(!sight_blocker_turf)
|
||||
break
|
||||
sight_blocker_turf = get_step(sight_blocker_turf, NORTH)
|
||||
if(sight_blocker_turf)
|
||||
sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance)
|
||||
sight_blocker.forceMove(sight_blocker_turf)
|
||||
sleep(2.5)
|
||||
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, TRUE, frequency = 15000)
|
||||
add_overlay(door_overlay)
|
||||
open = FALSE
|
||||
else
|
||||
cut_overlay(door_overlay)
|
||||
new /obj/effect/temp_visual/necropolis/open(T)
|
||||
sleep(2)
|
||||
visible_message("<span class='warning'>The door starts to grind open...</span>")
|
||||
playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 20000)
|
||||
sleep(22)
|
||||
sight_blocker.forceMove(src)
|
||||
sleep(5)
|
||||
density = FALSE
|
||||
sleep(5)
|
||||
open = TRUE
|
||||
changing_openness = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/necropolis_gate/locked
|
||||
locked = TRUE
|
||||
|
||||
GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate)
|
||||
/obj/structure/necropolis_gate/legion_gate
|
||||
desc = "A tremendous, impossibly large gateway, set into a massive tower of stone."
|
||||
sight_blocker_distance = 2
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/Initialize()
|
||||
. = ..()
|
||||
GLOB.necropolis_gate = src
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/Destroy(force)
|
||||
if(force)
|
||||
if(GLOB.necropolis_gate == src)
|
||||
GLOB.necropolis_gate = null
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user)
|
||||
if(!open && !changing_openness)
|
||||
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 || open || changing_openness || 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)
|
||||
sleep(50)
|
||||
return ..()
|
||||
|
||||
/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user, legion_damaged)
|
||||
if(open)
|
||||
return
|
||||
. = ..()
|
||||
if(.)
|
||||
locked = TRUE
|
||||
var/turf/T = get_turf(src)
|
||||
visible_message("<span class='userdanger'>Something horrible emerges from the Necropolis!</span>")
|
||||
if(legion_damaged)
|
||||
message_admins("Legion took damage while the necropolis gate was closed, and has released itself!")
|
||||
log_game("Legion took damage while the necropolis gate was closed and released itself.")
|
||||
else
|
||||
message_admins("[user ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!")
|
||||
log_game("[user ? key_name(user) : "Unknown"] released Legion.")
|
||||
|
||||
var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg')
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.z == z)
|
||||
to_chat(M, "<span class='userdanger'>Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.</span>")
|
||||
M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, S = legion_sound)
|
||||
flash_color(M, flash_color = "#FF0000", flash_time = 50)
|
||||
var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor")
|
||||
notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP)
|
||||
|
||||
/obj/effect/temp_visual/necropolis
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "door_closing"
|
||||
appearance_flags = 0
|
||||
duration = 6
|
||||
layer = EDGED_TURF_LAYER
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/temp_visual/necropolis/open
|
||||
icon_state = "door_opening"
|
||||
duration = 38
|
||||
|
||||
/obj/structure/necropolis_arch
|
||||
name = "necropolis arch"
|
||||
desc = "A massive arch over the necropolis gate, set into a massive tower of stone."
|
||||
icon = 'icons/effects/160x160.dmi'
|
||||
icon_state = "arch_full"
|
||||
appearance_flags = 0
|
||||
layer = TABLE_LAYER
|
||||
anchored = TRUE
|
||||
pixel_x = -64
|
||||
pixel_y = -40
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/open = FALSE
|
||||
var/static/mutable_appearance/top_overlay
|
||||
|
||||
/obj/structure/necropolis_arch/Initialize()
|
||||
. = ..()
|
||||
icon_state = "arch_bottom"
|
||||
top_overlay = mutable_appearance('icons/effects/160x160.dmi', "arch_top")
|
||||
top_overlay.layer = EDGED_TURF_LAYER
|
||||
add_overlay(top_overlay)
|
||||
|
||||
/obj/structure/necropolis_arch/singularity_pull()
|
||||
return 0
|
||||
|
||||
/obj/structure/necropolis_arch/Destroy(force)
|
||||
if(force)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
#define STABLE 0 //The tile is stable and won't collapse/sink when crossed.
|
||||
#define COLLAPSE_ON_CROSS 1 //The tile is unstable and will temporary become unusable when crossed.
|
||||
#define DESTROY_ON_CROSS 2 //The tile is nearly broken and will permanently become unusable when crossed.
|
||||
#define UNIQUE_EFFECT 3 //The tile has some sort of unique effect when crossed.
|
||||
//stone tiles for boss arenas
|
||||
/obj/structure/stone_tile
|
||||
name = "stone tile"
|
||||
icon = 'icons/turf/boss_floors.dmi'
|
||||
icon_state = "pristine_tile1"
|
||||
layer = ABOVE_OPEN_TURF_LAYER
|
||||
anchored = TRUE
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/tile_key = "pristine_tile"
|
||||
var/tile_random_sprite_max = 24
|
||||
var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed
|
||||
var/fallen = FALSE //If the tile is unusable
|
||||
var/falling = FALSE //If the tile is falling
|
||||
|
||||
/obj/structure/stone_tile/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = "[tile_key][rand(1, tile_random_sprite_max)]"
|
||||
|
||||
/obj/structure/stone_tile/Destroy(force)
|
||||
if(force || fallen)
|
||||
. = ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
/obj/structure/stone_tile/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/structure/stone_tile/Crossed(atom/movable/AM)
|
||||
if(falling || fallen)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(!islava(T) && !ischasm(T)) //nothing to sink or fall into
|
||||
return
|
||||
var/obj/item/I
|
||||
if(istype(AM, /obj/item))
|
||||
I = AM
|
||||
var/mob/living/L
|
||||
if(isliving(AM))
|
||||
L = AM
|
||||
switch(fall_on_cross)
|
||||
if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS)
|
||||
if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.movement_type & FLYING) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah!
|
||||
collapse()
|
||||
if(UNIQUE_EFFECT)
|
||||
crossed_effect(AM)
|
||||
|
||||
/obj/structure/stone_tile/proc/collapse()
|
||||
falling = TRUE
|
||||
var/break_that_sucker = fall_on_cross == DESTROY_ON_CROSS
|
||||
playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE)
|
||||
Shake(-1, -1, 25)
|
||||
sleep(5)
|
||||
if(break_that_sucker)
|
||||
playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE)
|
||||
else
|
||||
playsound(src, 'sound/mecha/mechmove04.ogg', 50, TRUE)
|
||||
animate(src, alpha = 0, pixel_y = pixel_y - 3, time = 5)
|
||||
fallen = TRUE
|
||||
if(break_that_sucker)
|
||||
QDEL_IN(src, 10)
|
||||
else
|
||||
addtimer(CALLBACK(src, .proc/rebuild), 55)
|
||||
|
||||
/obj/structure/stone_tile/proc/rebuild()
|
||||
pixel_x = initial(pixel_x)
|
||||
pixel_y = initial(pixel_y) - 5
|
||||
animate(src, alpha = initial(alpha), pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 30)
|
||||
sleep(30)
|
||||
falling = FALSE
|
||||
fallen = FALSE
|
||||
|
||||
/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM)
|
||||
return
|
||||
|
||||
/obj/structure/stone_tile/block
|
||||
name = "stone block"
|
||||
icon_state = "pristine_block1"
|
||||
tile_key = "pristine_block"
|
||||
tile_random_sprite_max = 4
|
||||
|
||||
/obj/structure/stone_tile/slab
|
||||
name = "stone slab"
|
||||
icon_state = "pristine_slab1"
|
||||
tile_key = "pristine_slab"
|
||||
tile_random_sprite_max = 4
|
||||
|
||||
/obj/structure/stone_tile/center
|
||||
name = "stone center tile"
|
||||
icon_state = "pristine_center1"
|
||||
tile_key = "pristine_center"
|
||||
tile_random_sprite_max = 4
|
||||
|
||||
/obj/structure/stone_tile/surrounding
|
||||
name = "stone surrounding slab"
|
||||
icon_state = "pristine_surrounding1"
|
||||
tile_key = "pristine_surrounding"
|
||||
tile_random_sprite_max = 2
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile
|
||||
name = "stone surrounding tile"
|
||||
icon_state = "pristine_surrounding_tile1"
|
||||
tile_key = "pristine_surrounding_tile"
|
||||
tile_random_sprite_max = 2
|
||||
|
||||
//cracked stone tiles
|
||||
/obj/structure/stone_tile/cracked
|
||||
name = "cracked stone tile"
|
||||
icon_state = "cracked_tile1"
|
||||
tile_key = "cracked_tile"
|
||||
|
||||
/obj/structure/stone_tile/block/cracked
|
||||
name = "cracked stone block"
|
||||
icon_state = "cracked_block1"
|
||||
tile_key = "cracked_block"
|
||||
|
||||
/obj/structure/stone_tile/slab/cracked
|
||||
name = "cracked stone slab"
|
||||
icon_state = "cracked_slab1"
|
||||
tile_key = "cracked_slab"
|
||||
tile_random_sprite_max = 1
|
||||
|
||||
/obj/structure/stone_tile/center/cracked
|
||||
name = "cracked stone center tile"
|
||||
icon_state = "cracked_center1"
|
||||
tile_key = "cracked_center"
|
||||
|
||||
/obj/structure/stone_tile/surrounding/cracked
|
||||
name = "cracked stone surrounding slab"
|
||||
icon_state = "cracked_surrounding1"
|
||||
tile_key = "cracked_surrounding"
|
||||
tile_random_sprite_max = 1
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/cracked
|
||||
name = "cracked stone surrounding tile"
|
||||
icon_state = "cracked_surrounding_tile1"
|
||||
tile_key = "cracked_surrounding_tile"
|
||||
|
||||
//burnt stone tiles
|
||||
/obj/structure/stone_tile/burnt
|
||||
name = "burnt stone tile"
|
||||
icon_state = "burnt_tile1"
|
||||
tile_key = "burnt_tile"
|
||||
|
||||
/obj/structure/stone_tile/block/burnt
|
||||
name = "burnt stone block"
|
||||
icon_state = "burnt_block1"
|
||||
tile_key = "burnt_block"
|
||||
|
||||
/obj/structure/stone_tile/slab/burnt
|
||||
name = "burnt stone slab"
|
||||
icon_state = "burnt_slab1"
|
||||
tile_key = "burnt_slab"
|
||||
|
||||
/obj/structure/stone_tile/center/burnt
|
||||
name = "burnt stone center tile"
|
||||
icon_state = "burnt_center1"
|
||||
tile_key = "burnt_center"
|
||||
|
||||
/obj/structure/stone_tile/surrounding/burnt
|
||||
name = "burnt stone surrounding slab"
|
||||
icon_state = "burnt_surrounding1"
|
||||
tile_key = "burnt_surrounding"
|
||||
|
||||
/obj/structure/stone_tile/surrounding_tile/burnt
|
||||
name = "burnt stone surrounding tile"
|
||||
icon_state = "burnt_surrounding_tile1"
|
||||
tile_key = "burnt_surrounding_tile"
|
||||
|
||||
#undef STABLE
|
||||
#undef COLLAPSE_ON_CROSS
|
||||
#undef DESTROY_ON_CROSS
|
||||
#undef UNIQUE_EFFECT
|
||||
@@ -0,0 +1,145 @@
|
||||
//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 = TRUE
|
||||
density = TRUE
|
||||
var/win_prob = 5
|
||||
|
||||
/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user)
|
||||
if(!istype(user))
|
||||
return
|
||||
if(obj_flags & IN_USE)
|
||||
return
|
||||
obj_flags |= IN_USE
|
||||
user.adjustCloneLoss(20)
|
||||
if(user.stat)
|
||||
to_chat(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 [user.p_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)
|
||||
addtimer(CALLBACK(src, .proc/determine_victor, user), 50)
|
||||
|
||||
/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user)
|
||||
icon_state = "slots1"
|
||||
obj_flags &= ~IN_USE
|
||||
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)
|
||||
to_chat(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)
|
||||
to_chat(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/Initialize()
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/collapse), 600)
|
||||
|
||||
/obj/structure/cursed_money/proc/collapse()
|
||||
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)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] opens the bag and \
|
||||
and removes a die. The bag then vanishes.</span>",
|
||||
"<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/turf/T = get_turf(user)
|
||||
var/obj/item/dice/d20/fate/one_use/critical_fail = new(T)
|
||||
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 = TRUE
|
||||
density = TRUE
|
||||
icon_state = "blob"
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
color = rgb(145, 150, 0)
|
||||
|
||||
/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
|
||||
if(ishuman(mover))
|
||||
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 TRUE
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.</span>")
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/morph))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/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 [user.p_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)
|
||||
var/list/levels = SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)
|
||||
var/turf/dest
|
||||
if (levels.len)
|
||||
dest = locate(T.x, T.y, pick(levels))
|
||||
|
||||
T.ChangeTurf(/turf/open/chasm)
|
||||
var/turf/open/chasm/C = T
|
||||
C.set_target(dest)
|
||||
C.drop(user)
|
||||
|
||||
//can't be bothered to do sloth right now, will make later
|
||||
|
||||
/obj/item/kitchen/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 = "knife"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
force = 18
|
||||
throwforce = 10
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/kitchen/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
if(!istype(user))
|
||||
return
|
||||
if(ishuman(AM))
|
||||
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'>[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] <i>sooo</i> much better than you. Not anymore, [H.p_they()] won't.</span>")
|
||||
@@ -0,0 +1,5 @@
|
||||
/////////// djstation items
|
||||
|
||||
/obj/item/paper/fluff/ruins/djstation
|
||||
name = "paper - 'DJ Listening Outpost'"
|
||||
info = "<B>Welcome new owner!</B><BR><BR>You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:<br><ol><li>Equip yourself with a multitool</li><li>Use the multitool on the relay.</li><li>Turn it on. It has already been configured for you to listen on.</li></ol> Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.<br><ul><li>145.9 - Common Channel</li><li>144.7 - Private AI Channel</li><li>135.9 - Security Channel</li><li>135.7 - Engineering Channel</li><li>135.5 - Medical Channel</li><li>135.3 - Command Channel</li><li>135.1 - Science Channel</li><li>134.9 - Service Channel</li><li>134.7 - Supply Channel</li>"
|
||||
@@ -0,0 +1,19 @@
|
||||
/////////// thederelict items
|
||||
|
||||
/obj/item/paper/fluff/ruins/thederelict/equipment
|
||||
info = "If the equipment breaks there should be enough spare parts in our engineering storage near the north east solar array."
|
||||
name = "Equipment Inventory"
|
||||
|
||||
/obj/item/paper/fluff/ruins/thederelict/syndie_mission
|
||||
name = "Mission Objectives"
|
||||
info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features. <br><br><b>Objective #1</b>. Kill the God damn AI in a fire blast that it rocks the station. <b>Success!</b> <br><b>Objective #2</b>. Escape alive. <b>Failed.</b>"
|
||||
|
||||
/obj/item/paper/fluff/ruins/thederelict/nukie_objectives
|
||||
name = "Objectives of a Nuclear Operative"
|
||||
info = "<b>Objective #1</b>: Destroy the station with a nuclear device."
|
||||
|
||||
/obj/item/paper/crumpled/bloody/ruins/thederelict/unfinished
|
||||
name = "unfinished paper scrap"
|
||||
desc = "Looks like someone started shakily writing a will in space common, but were interrupted by something bloody..."
|
||||
info = "I, Victor Belyakov, do hereby leave my _- "
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/////////// asteroid4 items
|
||||
|
||||
/obj/item/paper/fluff/ruins/asteroid4/extraction
|
||||
info = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
|
||||
@@ -0,0 +1,8 @@
|
||||
/////////// bigderelict1 items
|
||||
|
||||
/obj/item/paper/crumpled/ruins/bigderelict1/manifest
|
||||
info = "<i>A crumpled piece of manifest paper, out of the barely legible pen writing, you can see something about a warning involving whatever was originally in the crate.</i>"
|
||||
|
||||
/obj/item/paper/crumpled/ruins/bigderelict1/coward
|
||||
icon_state = "scrap_bloodied"
|
||||
info = "If anyone finds this, please, don't let my kids know I died a coward.."
|
||||
@@ -0,0 +1,169 @@
|
||||
//caravan ambush
|
||||
|
||||
/obj/item/wrench/caravan
|
||||
color = "#ff0000"
|
||||
desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster."
|
||||
name = "experimental wrench"
|
||||
toolspeed = 0.3
|
||||
|
||||
/obj/item/screwdriver/caravan
|
||||
color = "#ff0000"
|
||||
desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster."
|
||||
name = "experimental screwdriver"
|
||||
toolspeed = 0.3
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/wirecutters/caravan
|
||||
color = "#ff0000"
|
||||
desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster."
|
||||
name = "experimental wirecutters"
|
||||
toolspeed = 0.3
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/crowbar/red/caravan
|
||||
color = "#ff0000"
|
||||
desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster."
|
||||
name = "experimental crowbar"
|
||||
toolspeed = 0.3
|
||||
|
||||
/obj/machinery/computer/shuttle/caravan
|
||||
|
||||
/obj/item/circuitboard/computer/caravan
|
||||
build_path = /obj/machinery/computer/shuttle/caravan
|
||||
|
||||
/obj/item/circuitboard/computer/caravan/trade1
|
||||
build_path = /obj/machinery/computer/shuttle/caravan/trade1
|
||||
|
||||
/obj/item/circuitboard/computer/caravan/pirate
|
||||
build_path = /obj/machinery/computer/shuttle/caravan/pirate
|
||||
|
||||
/obj/item/circuitboard/computer/caravan/syndicate1
|
||||
build_path = /obj/machinery/computer/shuttle/caravan/syndicate1
|
||||
|
||||
/obj/item/circuitboard/computer/caravan/syndicate2
|
||||
build_path = /obj/machinery/computer/shuttle/caravan/syndicate2
|
||||
|
||||
/obj/item/circuitboard/computer/caravan/syndicate3
|
||||
build_path = /obj/machinery/computer/shuttle/caravan/syndicate3
|
||||
|
||||
/obj/machinery/computer/shuttle/caravan/trade1
|
||||
name = "Small Freighter Shuttle Console"
|
||||
desc = "Used to control the Small Freighter."
|
||||
circuit = /obj/item/circuitboard/computer/caravan/trade1
|
||||
shuttleId = "caravantrade1"
|
||||
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;caravantrade1_custom;caravantrade1_ambush"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize()
|
||||
. = ..()
|
||||
GLOB.jam_on_wardec += src
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Destroy()
|
||||
GLOB.jam_on_wardec -= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/trade1
|
||||
name = "Small Freighter Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Small Freighter."
|
||||
shuttleId = "caravantrade1"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "caravantrade1_custom"
|
||||
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1)
|
||||
view_range = 14
|
||||
x_offset = -5
|
||||
y_offset = -5
|
||||
designate_time = 100
|
||||
|
||||
/obj/machinery/computer/shuttle/caravan/pirate
|
||||
name = "Pirate Cutter Shuttle Console"
|
||||
desc = "Used to control the Pirate Cutter."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
light_color = LIGHT_COLOR_RED
|
||||
circuit = /obj/item/circuitboard/computer/caravan/pirate
|
||||
shuttleId = "caravanpirate"
|
||||
possible_destinations = "caravanpirate_custom;caravanpirate_ambush"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/pirate
|
||||
name = "Pirate Cutter Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Pirate Cutter."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
shuttleId = "caravanpirate"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "caravanpirate_custom"
|
||||
jumpto_ports = list("caravanpirate_ambush" = 1)
|
||||
view_range = 14
|
||||
x_offset = 3
|
||||
y_offset = -6
|
||||
|
||||
/obj/machinery/computer/shuttle/caravan/syndicate1
|
||||
name = "Syndicate Fighter Shuttle Console"
|
||||
desc = "Used to control the Syndicate Fighter."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
light_color = LIGHT_COLOR_RED
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
circuit = /obj/item/circuitboard/computer/caravan/syndicate1
|
||||
shuttleId = "caravansyndicate1"
|
||||
possible_destinations = "caravansyndicate1_custom;caravansyndicate1_ambush;caravansyndicate1_listeningpost"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate1
|
||||
name = "Syndicate Fighter Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Syndicate Fighter."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
shuttleId = "caravansyndicate1"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "caravansyndicate1_custom"
|
||||
jumpto_ports = list("caravansyndicate1_ambush" = 1, "caravansyndicate1_listeningpost" = 1)
|
||||
view_range = 7
|
||||
x_offset = 2
|
||||
y_offset = 0
|
||||
|
||||
/obj/machinery/computer/shuttle/caravan/syndicate2
|
||||
name = "Syndicate Fighter Shuttle Console"
|
||||
desc = "Used to control the Syndicate Fighter."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
light_color = LIGHT_COLOR_RED
|
||||
circuit = /obj/item/circuitboard/computer/caravan/syndicate2
|
||||
shuttleId = "caravansyndicate2"
|
||||
possible_destinations = "caravansyndicate2_custom;caravansyndicate2_ambush;caravansyndicate1_listeningpost"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate2
|
||||
name = "Syndicate Fighter Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Syndicate Fighter."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
shuttleId = "caravansyndicate2"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "caravansyndicate2_custom"
|
||||
jumpto_ports = list("caravansyndicate2_ambush" = 1, "caravansyndicate1_listeningpost" = 1)
|
||||
view_range = 7
|
||||
x_offset = 0
|
||||
y_offset = 2
|
||||
|
||||
/obj/machinery/computer/shuttle/caravan/syndicate3
|
||||
name = "Syndicate Drop Ship Console"
|
||||
desc = "Used to control the Syndicate Drop Ship."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
light_color = LIGHT_COLOR_RED
|
||||
circuit = /obj/item/circuitboard/computer/caravan/syndicate3
|
||||
shuttleId = "caravansyndicate3"
|
||||
possible_destinations = "caravansyndicate3_custom;caravansyndicate3_ambush;caravansyndicate3_listeningpost"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate3
|
||||
name = "Syndicate Drop Ship Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Syndicate Drop Ship."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
shuttleId = "caravansyndicate3"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "caravansyndicate3_custom"
|
||||
jumpto_ports = list("caravansyndicate3_ambush" = 1, "caravansyndicate3_listeningpost" = 1)
|
||||
view_range = 10
|
||||
x_offset = -1
|
||||
y_offset = -3
|
||||
@@ -0,0 +1,35 @@
|
||||
/obj/item/paper/fluff/ruins/exp_cloning/manual
|
||||
name = "paper - 'H-11 Cloning Apparatus Manual"
|
||||
info = {"<h4>Getting Started</h4>
|
||||
Congratulations, you are testing the H-11 experimental cloning device!<br>
|
||||
Using the H-11 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the clone option to initiate cloning!<br>
|
||||
<b>That's all there is to it!</b><br>
|
||||
<i>Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.</i><br>
|
||||
<p>The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times are roughly 90 seconds.
|
||||
The cloning pod may be unlocked early after initial maturation is complete.</p><br>
|
||||
<i>Please note that resulting clones will have a DEVELOPMENTAL DEFECT as a result of genetic drift. We hope to reduce this through further testing.<br>
|
||||
Clones may also experience memory loss and radical changes in personality as a result of the cloning process.</i><br>
|
||||
<br>
|
||||
<font size=1>This technology produced under license from Thinktronic Systems, LTD.</font>"}
|
||||
|
||||
/obj/item/paper/fluff/ruins/exp_cloning/log
|
||||
name = "experiment log"
|
||||
info = {"<h4>Day 1</h4>
|
||||
We are very excited to be part of the first crew of the SC Irmanda!<br>
|
||||
This ship is made to test an innovative FTL technology. I had some concerns at first, \
|
||||
but the engineers assure me that it is safe and there is absolutely no risk of the external wings breaking off from the acceleration.<br>
|
||||
We've been tasked with testing the latest model of the Thinktronic Cloning Pod. We'll stay in dock for a week before launching, but we're going to get started right away. \
|
||||
If the engine is as fast as they say, we might not have the time to run all the routine tests on the cloned subject!<br>
|
||||
<br>
|
||||
<h4>Day 2</h4>
|
||||
We cloned an unknown corpse that was given to us by the medical crew. The genetic replication is good enough to let the subject survive outside of the pod, \
|
||||
but the cellular damage remains a concern for his long-term survival. For safety we will be keeping him in quarantine.<br>
|
||||
We left him some books, but clearly we were too optimistic about his mental faculties. His brain seems to suffer from the same cloning decay that was caused by \
|
||||
the previous models. We will run further tests to see if there are improvements.<br>
|
||||
<h4>Day 4</h4>
|
||||
It seems we'll be launching even sooner than expected! Apparently the press is starting to lose interest, so we have to cut short the pre-flight checks \
|
||||
and give them something to talk about. Hopefully this will end up with increased funding...<br>
|
||||
The crew has all been invited to the main hall, where we have seats for the initial FTL acceleration. Unfortunately the clone cannot leave the quarantine room \
|
||||
without risking infection, so we will strap him into the bed and hope for the best. We can grow another clone if anything goes wrong, anyway.
|
||||
<br>
|
||||
<i>Professor Galen Linkovich</i>"}
|
||||
@@ -0,0 +1,4 @@
|
||||
/////////// crashedclownship items
|
||||
|
||||
/obj/item/paper/fluff/ruins/crashedclownship/true_nation
|
||||
info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
|
||||
@@ -0,0 +1,40 @@
|
||||
// crashedship / packer ship
|
||||
|
||||
//Areas
|
||||
|
||||
/area/awaymission/BMPship
|
||||
name = "BMP Asteroids"
|
||||
icon_state = "away"
|
||||
|
||||
|
||||
/area/awaymission/BMPship/Aft
|
||||
name = "Aft Block"
|
||||
icon_state = "away1"
|
||||
requires_power = TRUE
|
||||
|
||||
/area/awaymission/BMPship/Midship
|
||||
name = "Midship Block"
|
||||
icon_state = "away2"
|
||||
requires_power = TRUE
|
||||
|
||||
/area/awaymission/BMPship/Fore
|
||||
name = "Fore Block"
|
||||
icon_state = "away3"
|
||||
requires_power = TRUE
|
||||
|
||||
|
||||
// crashedship items
|
||||
|
||||
/obj/item/paper/fluff/ruins/crashedship/scribbled
|
||||
name = "scribbled note"
|
||||
info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"
|
||||
|
||||
|
||||
/obj/item/paper/fluff/ruins/crashedship/captains_log
|
||||
name = "Captain's log entry"
|
||||
info = "I'm no scientist, but judging from the design and components, it seems to be some kind of teleporter. This thing is gonna be worth a lot of cash to the right man. The boys are excited, as they have every right to be, and I've let them crack into that case of beer we got. I normally wouldn't allow such a thing, but this is a time for celebration! It's not like a couple drinks will hurt anything."
|
||||
|
||||
/obj/item/paper/fluff/ruins/crashedship/old_diary
|
||||
name = "Old Diary"
|
||||
info = "DEAR DIARY: So we was doing our typical route when the captain says we've been picking up weird signals on some backwater planet. Madsen wanted to stay on course but he ain't the captain, so we went out of the way to check it out. There was lots of rocks on the way, but we got to the planet fine. Found a big fancy camp with nobody around and this big metal donut thing with NT stamps all over it right in the middle. Case of beer too. Captain reckons we can pass it off to some buyer in the Syndicate. Ingram says it's bad luck and that someone is going to come look for it but it sounds like better money than selling bad meat to jerky companies."
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
/////////// deepstorage items
|
||||
|
||||
/obj/item/paper/fluff/ruins/deepstorage/water_concern
|
||||
name = "water concerns"
|
||||
info = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"
|
||||
|
||||
/obj/item/paper/fluff/ruins/deepstorage/hydro_notice
|
||||
name = "hydroponics notice"
|
||||
info = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"
|
||||
|
||||
/obj/item/paper/fluff/ruins/deepstorage/recycling_notice
|
||||
name = "recycling notice"
|
||||
info = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/////////// listening station
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports
|
||||
info = "Nothing of interest to report."
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/july
|
||||
name = "july report"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/august
|
||||
name = "august report"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/september
|
||||
name = "september report"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/october
|
||||
name = "october report"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/november
|
||||
name = "november report"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/june
|
||||
name = "june report"
|
||||
info = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/may
|
||||
name = "may report"
|
||||
info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/reports/april
|
||||
name = "april report"
|
||||
info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/receipt
|
||||
name = "receipt"
|
||||
info = "1 x Stechkin pistol - $600<br>1 x silencer - $200<br>shipping charge - $4360<br>total - $5160"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/odd_report
|
||||
name = "odd report"
|
||||
info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. -DonkCo Operative #451"
|
||||
|
||||
/obj/item/paper/fluff/ruins/listeningstation/briefing
|
||||
name = "mission briefing"
|
||||
info = "<b>Mission Details</b>: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/////////// miracle ruin
|
||||
|
||||
/obj/item/storage/backpack/satchel/flat/secret/miracle_ruin
|
||||
reward_all_of_these = list(/obj/item/gun/energy/pulse/prize)
|
||||
@@ -0,0 +1,53 @@
|
||||
/////////// Oldstation items
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation
|
||||
name = "Cryo Awakening Alert"
|
||||
info = "<B>**WARNING**</B><BR><BR>Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.<BR><BR>Immediate Objectives<br><br>1: Activate emergency power generator<br>2: Lift station lockdown on the bridge<br><br>Please locate the 'Damage Report' on the bridge for a detailed situation report."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/damagereport
|
||||
name = "Damage Report"
|
||||
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Intact. Loss of oxygen to eastern side of main corridor.<br><br><b>Delta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protosuit
|
||||
name = "B01-RIG Hardsuit Report"
|
||||
info = "<b>*Prototype Hardsuit*</b><br><br>The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united Earth government powered military \
|
||||
exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by an operator.<br><br>The B01 however suffers \
|
||||
a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \
|
||||
resulting in the user being unable to see long distances.<br><br>The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protohealth
|
||||
name = "Health Analyser Report"
|
||||
info = "<b>*Health Analyser*</b><br><br>The portable Health Analyser is essentially a handheld variant of a health analyser. Years of research have concluded with this device which is \
|
||||
capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \
|
||||
can understand.<br><br>The health analyser is expected to go into full production as standard issue medical kit."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protogun
|
||||
name = "K14 Energy Gun Report"
|
||||
info = "<b>*K14-Multiphase Energy Gun*</b><br><br>The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \
|
||||
than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.<br><br>The weapon still suffers several drawbacks, its alternative, \
|
||||
non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \
|
||||
will form the backbone of our Energy weapon catalogue.<br><br>The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \
|
||||
'disable' setting in an attempt to bypass the ammo issues."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protosing
|
||||
name = "Singularity Generator"
|
||||
info = "<b>*Singularity Generator*</b><br><br>Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \
|
||||
ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction.. Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \
|
||||
operational.<br><br>The Singularity aims to alter this, a functional Singularity is essentially a controlled Black Hole, a Black Hole that generates far more power than Fusion or Fission \
|
||||
generators can ever hope to produce. "
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/protoinv
|
||||
name = "Laboratory Inventory"
|
||||
info = "<b>*Inventory*</b><br><br>(1) Prototype Hardsuit<br><br>(1)Health Analyser<br><br>(1)Prototype Energy Gun<br><br>(1)Singularity Generation Disk<br><br><b>DO NOT REMOVE WITHOUT \
|
||||
THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION</b>"
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/report
|
||||
name = "Crew Reawakening Report"
|
||||
info = "Artificial Program's report to surviving crewmembers.<br><br>Crew were placed into cryostasis on March 10th, 2445.<br><br>Crew were awoken from cryostasis around June, 2557.<br><br> \
|
||||
<b>SIGNIFICANT EVENTS OF NOTE</b><br>1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \
|
||||
radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.<br><br>2: A data burst from a nearby Nanotrasen Space \
|
||||
Station was received, this data burst contained research data that has been uploaded to our RnD labs.<br><br>3: Unknown invasion force has occupied Delta station."
|
||||
|
||||
/obj/item/paper/fluff/ruins/oldstation/generator_manual
|
||||
name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual"
|
||||
info = "You can barely make out a faded sentence... <br><br> Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid."
|
||||
@@ -0,0 +1,28 @@
|
||||
/////////// originalcontent items
|
||||
|
||||
/obj/item/paper/crumpled/ruins/originalcontent
|
||||
desc = "<i>Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings.</i>"
|
||||
|
||||
/obj/item/paper/pamphlet/ruin/originalcontent
|
||||
icon = 'icons/obj/fluff.dmi'
|
||||
|
||||
/obj/item/paper/pamphlet/ruin/originalcontent/stickman
|
||||
name = "Painting - 'BANG'"
|
||||
info = "<i>This picture depicts a crudely-drawn stickman firing a crudely-drawn gun.</i>"
|
||||
icon_state = "painting4"
|
||||
|
||||
/obj/item/paper/pamphlet/ruin/originalcontent/treeside
|
||||
name = "Painting - 'Treeside'"
|
||||
info = "<i>This picture depicts a sunny day on a lush hillside, set under a shaded tree.</i>"
|
||||
icon_state = "painting1"
|
||||
|
||||
/obj/item/paper/pamphlet/ruin/originalcontent/pennywise
|
||||
name = "Painting - 'Pennywise'"
|
||||
info = "<i>This picture depicts a smiling clown. Something doesn't feel right about this..</i>"
|
||||
icon_state = "painting3"
|
||||
|
||||
/obj/item/paper/pamphlet/ruin/originalcontent/yelling
|
||||
name = "Painting - 'Hands-On-Face'"
|
||||
info = "<i>This picture depicts a man yelling on a bridge for no apparent reason.</i>"
|
||||
icon_state = "painting2"
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/////////// spacehotel items
|
||||
|
||||
|
||||
/obj/item/paper/fluff/ruins/spacehotel/notice
|
||||
name = "!NOTICE!"
|
||||
info = "<bold>!NOTICE!</bold><br><br><center>We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.</center>"
|
||||
|
||||
/obj/item/paper/pamphlet/ruin/spacehotel
|
||||
name = "hotel pamphlet"
|
||||
info = "<center><b>The Twin Nexus Hotel</center></b><br><center><i>A place of Sanctuary</i></center><br><br><center>Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff stride to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information.</center>"
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/////////// ruined whiteship
|
||||
|
||||
/obj/item/circuitboard/computer/white_ship/ruin
|
||||
build_path = /obj/machinery/computer/shuttle/white_ship/ruin
|
||||
|
||||
/obj/machinery/computer/shuttle/white_ship/ruin
|
||||
shuttleId = "whiteship_ruin"
|
||||
circuit = /obj/item/circuitboard/computer/white_ship/ruin
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/ruin
|
||||
shuttleId = "whiteship_ruin"
|
||||
|
||||
Reference in New Issue
Block a user