Uploading all files.

This commit is contained in:
Quotefox
2019-09-23 18:26:34 +02:00
commit 7091cdbe8c
7779 changed files with 2601004 additions and 0 deletions
+164
View File
@@ -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"