Adds the Statue - A hostile mob, that moves only when you don't see it (#5108)

* Statue

* Statue done!

* Testing map removed

* Grammar fix + ignoring creator

* Fixed typos, change range to oview, thanks to Atermonera

* made changes that I missed

* Nightvision handling

* diverse blind messages + requested changes

* Bugfixes, added isSynthetic to bots

* commentaries + PoI

* Finalized POI and statue

* removed misclick
This commit is contained in:
drexample
2018-05-15 01:21:04 +03:00
committed by Atermonera
parent 48c30ec026
commit 5d73584fa3
10 changed files with 618 additions and 4 deletions

View File

@@ -52,3 +52,14 @@
/obj/item/poi/brokenoldreactor/Destroy()
processing_objects -= src
return ..()
//Crashed Cargo Shuttle PoI
/obj/structure/largecrate/animal/crashedshuttle
name = "SCP"
/obj/structure/largecrate/animal/crashedshuttle/New()
held_type = pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble)
name = pick("Spicy Crust Pizzeria", "Soap and Care Products", "Sally's Computer Parts", "Steve's Chocolate Pastries", "Smith & Christian's Plastics","Standard Containers & Packaging Co.", "Sanitary Chemical Purgation (LTD)")
name += " delivery crate"
..()

View File

@@ -383,3 +383,6 @@
else return !D.check_access(ID) // it's a real, air blocking door
return 0
/mob/living/bot/isSynthetic() //Robots are synthetic, no?
return 1

View File

@@ -1198,3 +1198,7 @@ default behaviour is:
/mob/living/proc/make_hud_overlays()
return
/mob/living/proc/has_vision()
return !(eye_blind || (disabilities & BLIND) || stat || blinded)

View File

@@ -419,3 +419,6 @@
ghostize(0)
qdel(src)
/mob/living/silicon/has_vision()
return 0 //NOT REAL EYES

View File

@@ -0,0 +1,431 @@
// A mob which only moves when it isn't being watched by living beings.
//Weeping angels/SCP-173 hype
//Horrible shitcoding and stolen code adaptations below. You have been warned.
/mob/living/simple_animal/hostile/statue
name = "statue" // matches the name of the statue with the flesh-to-stone spell
desc = "An incredibly lifelike marble carving. Its eyes seems to follow you..." // same as an ordinary statue with the added "eye following you" description
icon = 'icons/obj/statue.dmi'
tt_desc = "angelum weepicus"
icon_state = "human_male"
icon_living = "human_male"
icon_dead = "human_male"
intelligence_level = SA_HUMANOID
stop_automated_movement = 1
var/annoyance = 30 //stop staring you creep
var/respond = 1
var/banishable = 0
faction = "statue"
mob_size = MOB_HUGE
response_help = "touches"
response_disarm = "pushes"
environment_smash = 2
can_be_antagged = 1
speed = -1
maxHealth = 50000
health = 50000
status_flags = CANPUSH
// investigates = 1
a_intent = I_HURT
density = 1
mob_bump_flag = HEAVY
mob_push_flags = ~HEAVY
mob_swap_flags = ~HEAVY
harm_intent_damage = 60
melee_damage_lower = 50
melee_damage_upper = 70
attacktext = "clawed"
attack_sound = 'sound/hallucinations/growl1.ogg'
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 9000
run_at_them = 0
move_to_delay = 0 // Very fast
animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue.
see_in_dark = 13
view_range = 35 //So it can run at the victim when out of the view
melee_miss_chance = 0
see_invisible = SEE_INVISIBLE_NOLIGHTING
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
var/last_hit = 0
var/cannot_be_seen = 1
var/mob/living/creator = null
// No movement while seen code.
/mob/living/simple_animal/hostile/statue/New(loc)
..()
// Give spells
add_spell(new/spell/aoe_turf/flicker_lights)
add_spell(new/spell/aoe_turf/blindness)
add_spell(new/spell/aoe_turf/shatter)
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
return 0
return ..()
/mob/living/simple_animal/hostile/statue/attackby(var/obj/item/O as obj, var/mob/user as mob) //banishing the statue is a risky job
if(istype(O, /obj/item/weapon/nullrod))
visible_message("<span class='warning'>[user] tries to banish [src] with [O]!</span>")
if(do_after(user, 15, src))
if(banishable)
visible_message("<span class='warning'>[src] crumbles into dust!</span>")
gib()
else
visible_message("<span class='warning'>[src] is too strong to be banished!</span>")
Paralyse(rand(8,15))
/mob/living/simple_animal/hostile/statue/death()
new /obj/item/stack/material/marble(loc)
/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc)
if(can_be_seen(NewLoc))
if(client)
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
return 0
return ..()
/mob/living/simple_animal/hostile/statue/Life()
..()
handle_target()
handleAnnoyance()
if(target_mob) //if there's a victim, statue will use its powers
if((annoyance + 4) < 800)
annoyance += 4
else if ((annoyance - 2) > 0)
annoyance -= 2
/mob/living/simple_animal/hostile/statue/proc/handle_target()
if(target_mob) // If we have a target and we're AI controlled
var/mob/watching = can_be_seen()
// If they're not our target
if(watching && (watching != target_mob))
// This one is closer.
if(get_dist(watching, src) > get_dist(target_mob, src))
LoseTarget()
target_mob = watching
/mob/living/simple_animal/hostile/statue/proc/handleAnnoyance()
if(respond) //so it won't blind people 24/7
respond = 0
if (annoyance > 30)
AI_blind()
annoyance -= 30
if (prob(30) && annoyance > 30)
var/turf/T = get_turf(loc)
if(T.get_lumcount() * 10 > 1.5)
AI_flash()
annoyance -= 30
spawn(20)
respond = 1
/mob/living/simple_animal/hostile/statue/proc/AI_blind()
for(var/mob/living/L in oviewers(12, src)) //the range is so big, because it tries to keep out of sight and can't reengage if you get too far
if (prob(70))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if (H.species == "Diona" || H.species == "Promethean" || H == creator)// can't blink and organic
return
to_chat(L, pick("<span class='notice'>Your eyes feel very heavy.</span>", "<span class='notice'>You blink suddenly!</span>", "<span class='notice'>Your eyes close involuntarily!</span>"))
L.Blind(2)
return
/mob/living/simple_animal/hostile/statue/proc/AI_flash()
if (prob(60))
visible_message("The statue slowly points at the light.")
for(var/obj/machinery/light/L in oview(12, src))
L.flicker()
return
/mob/living/simple_animal/hostile/statue/proc/AI_mirrorshmash()
for(var/obj/structure/mirror/M in oview(4, src))
if ((!M.shattered )||(!M.glass))
visible_message("The statue slowly points at the mirror!")
sleep(5)
M.shatter()
return
/mob/living/simple_animal/hostile/statue/AttackTarget()
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
return
else
spawn(3) //a small delay
..()
/mob/living/simple_animal/hostile/statue/DoPunch(var/atom/A) //had to redo that, since it's supposed to target only head and upper body
if(!Adjacent(A)) // They could've moved in the meantime.
return FALSE
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
for(var/datum/modifier/M in modifiers)
if(!isnull(M.outgoing_melee_damage_percent))
damage_to_do *= M.outgoing_melee_damage_percent
// SA attacks can be blocked with shields.
if(ishuman(A))
var/mob/living/carbon/human/H = A
H.adjustBruteLossByPart(damage_to_do*0.9, pick(BP_HEAD, BP_TORSO))
playsound(src, attack_sound, 75, 1)
else if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound)
playsound(src, attack_sound, 75, 1)
return TRUE
/mob/living/simple_animal/hostile/statue/face_atom()
if(!can_be_seen(get_turf(loc)))
..()
/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination)
if(!cannot_be_seen)
return null
var/turf/T = get_turf(loc)
/* if(T && destination && T.lighting_overlay)
if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right?
return null
if(T == destination)
destination = null*/
// loop for viewers.
var/list/check_list = list(src)
if(destination)
check_list += destination
//&& (M.see_in_dark > 5)
// This loop will, at most, loop twice.
for(var/atom/check in check_list)
for(var/mob/living/M in viewers(world.view + 1, check) - src)
if(M != creator)
if(!(M.sdisabilities & BLIND) || !(M.blinded)) //if not blinded
if(M.has_vision() && !M.isSynthetic()) //is able to see the statue
if(T && destination && T.lighting_overlay) // Check for darkness
if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right? WRONG! Damn cats.
if(M.see_in_dark > 5)
return M
return null
return M
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
if(M.occupant && M.occupant.client && M.occupant != creator)
if(M.occupant.has_vision() && !M.occupant.isSynthetic())
return M.occupant
for(var/obj/structure/mirror/M in view(3, check)) //Weeping angels hate mirrors. Probably because they're ugly af
if ((!M.shattered )||(!M.glass))
annoyance += 3
if (prob(5) && (ai_inactive == 0))
AI_mirrorshmash()
annoyance -= 50
return src //if it sees the mirror, it sees itself, right?
return null
// Cannot talk
/mob/living/simple_animal/hostile/statue/say()
return 0
// Turn to dust when gibbed
/mob/living/simple_animal/hostile/statue/gib()
dust()
// Stop attacking clientless mobs
/mob/living/simple_animal/hostile/statue/proc/CanAttack(atom/the_target) //ignore clientless mobs
if(isliving(the_target))
var/mob/living/L = the_target
if(!L.client && !L.ckey)
return 0
return ..()
// Statue powers
// Flicker lights
/spell/aoe_turf/flicker_lights
name = "Flicker Lights"
desc = "You will trigger a large amount of lights around you to flicker."
spell_flags = 0
charge_max = 400
range = 10
/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/light/L in T)
L.flicker()
return
//Blind AOE
/spell/aoe_turf/blindness
name = "Blindness"
desc = "Your prey will be momentarily blind for you to advance on them."
message = "<span class='notice'>You glare your eyes.</span>"
charge_max = 250
spell_flags = 0
range = 10
/spell/aoe_turf/blindness/cast(list/targets, mob/living/simple_animal/hostile/statue/user = usr)
for(var/mob/living/L in targets)
if(L == user || L == user.creator)
continue
var/turf/T = get_turf(L.loc)
if(T && T in targets)
L.Blind(4)
return
/spell/aoe_turf/shatter
name = "Shatter mirrors!"
desc = "That handsome devil has to wait. You have people to make into corpses."
message = "<span class='notice'>You glare your eyes.</span>"
charge_max = 300
spell_flags = 0
range = 8
/spell/aoe_turf/shatter/cast(list/targets, mob/user = usr)
spawn(50)
for(var/obj/structure/mirror/M in view(5, src))
if ((!M.shattered )||(!M.glass))
M.shatter()
return
/mob/living/simple_animal/hostile/statue/verb/toggle_darkness()
set name = "Toggle Darkness"
set desc = "You ARE the darkness."
set category = "Abilities"
seedarkness = !seedarkness
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness)
to_chat(src,"You [seedarkness ? "now" : "no longer"] see darkness.")
/mob/living/simple_animal/hostile/statue/restrained()
. = ..()
if(can_be_seen(loc))
return 1
/mob/living/simple_animal/hostile/statue/ListTargets(dist = view_range)
var/list/L = mobs_in_xray_view(dist, src)
for(var/obj/mecha/M in mechas_list)
if ((M.z == src.z) && (get_dist(src, M) <= dist) && (isInSight(src,M)))
L += M
if(creator)
L -= creator
return L
/obj/item/cursed_marble //slime cube copypaste
name = "marble slab"
desc = "A peculiar slab of marble, radiating with dark energy."
icon = 'icons/obj/stacks.dmi'
icon_state = "sheet-marble"
description_info = "Summons the Statue - a mysterious powerful creature, that can move only when unsurveyed by living eyes."
var/searching = 0
/obj/item/cursed_marble/attack_self(mob/user as mob)
if(!searching)
to_chat(user, "<span class='warning'>You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!</span>")
icon_state = "sheet-snowbrick"
searching = 1
request_player()
spawn(60 SECONDS)
reset_search()
/obj/item/cursed_marble/proc/request_player()
for(var/mob/observer/dead/O in player_list)
if(!O.MayRespawn())
continue
if(O.client)
if(O.client.prefs.be_special & BE_ALIEN)
question(O.client)
/obj/item/cursed_marble/proc/question(var/client/C)
spawn(0)
if(!C)
return
var/response = alert(C, "Someone is requesting a soul for the statue. Would you like to play as one?", "Statue request", "Yes", "No", "Never for this round")
if(response == "Yes")
response = alert(C, "Are you sure you want to play as the statue?", "Statue request", "Yes", "No")
if(!C || 2 == searching)
return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if(response == "Never for this round")
C.prefs.be_special ^= BE_ALIEN
/obj/item/cursed_marble/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
icon_state = "sheet-marble"
if(searching == 1)
searching = 0
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
M.show_message("<span class='warning'>[src] fades. Maybe it will spark another time.</span>")
/obj/item/cursed_marble/proc/transfer_personality(var/mob/candidate)
announce_ghost_joinleave(candidate, 0, "They are a statue now.")
src.searching = 2
var/mob/living/simple_animal/hostile/statue/S = new(get_turf(src))
S.client = candidate.client
to_chat(S, "<b>You are \a [S], brought into existence on [station_name()] by [usr]! Obey all their orders.</b>")
S.mind.assigned_role = "The Statue"
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
qdel(src)
/obj/item/cursed_marble/verb/crush() //if there's no ghosts to respond to your request/you want to use the statue for malicious stuff
set name = "Crush the marble slab"
set category = "Object"
set src in usr
summonmob(usr)
/obj/item/cursed_marble/proc/summonmob(mob/user as mob)
if(searching == 0)
var/choice = alert(user, "Are you sure you want to crush the marble? (this will spawn a clientless version of the statue, hostile to everyone, but you)", "Crush it?", "Yes", "No")
if(choice)
if(choice == "Yes")
var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue(get_turf(user))
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
S.creator = user
qdel(src)

View File

@@ -33,11 +33,14 @@ var/global/photo_count = 0
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/icon/tiny
var/cursed = 0
var/photo_size = 3
/obj/item/weapon/photo/New()
id = photo_count++
/obj/item/weapon/photo/attack_self(mob/user as mob)
user.examinate(src)
@@ -233,6 +236,11 @@ var/global/photo_count = 0
mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. "
else
mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]."
for(var/mob/living/simple_animal/hostile/statue/S in the_turf)
if(S)
mob_detail += "You can see \a [S] on the photo. Its stare makes you feel uneasy." //"That which holds the image of an angel, becomes itself an angel."
return mob_detail
/obj/item/device/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
@@ -274,7 +282,21 @@ var/global/photo_count = 0
y_c--
x_c = x_c - size
var/obj/item/weapon/photo/p = createpicture(target, user, turfs, mobs, flag)
if(findtext(mobs, "Its stare makes you feel uneasy"))
p.cursed = 1
user.visible_message("<span class='userdanger'>Something starts to slowly manifest from the picture!</span>")
spawn(150)
var/turf/T = get_turf(p)
var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue/(T)
S.banishable = 1//At least you can get rid of those bastards
T.visible_message("<span class='userdanger'>The photo turns into \a [S]!</span>")
qdel(p)
printpicture(user, p)
/obj/item/device/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag)
@@ -298,7 +320,6 @@ var/global/photo_count = 0
p.pixel_x = rand(-10, 10)
p.pixel_y = rand(-10, 10)
p.photo_size = size
return p
/obj/item/device/camera/proc/printpicture(mob/user, obj/item/weapon/photo/p)
@@ -318,6 +339,16 @@ var/global/photo_count = 0
p.pixel_y = pixel_y
p.photo_size = photo_size
p.scribble = scribble
p.cursed = cursed
if(p.cursed)
var/turf/T = get_turf(p)
T.visible_message("<span class='userdanger'>Something starts to slowly manifest from the picture!</span>")
spawn(150)
T = get_turf(p) //second time, because the photo could've moved
var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue/(T)
S.banishable = 1//At least you can get rid of those bastards
T.visible_message("<span class='userdanger'>The photo turns into \a [S]!</span>")
qdel(p)
if(copy_id)
p.id = id

View File

@@ -0,0 +1,118 @@
"aa" = (/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"ab" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/submap/crashedcontainmentshuttle)
"ac" = (/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
"ad" = (/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"ae" = (/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"af" = (/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"ag" = (/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"ah" = (/obj/structure/grille,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"ai" = (/obj/random/landmine,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aj" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"ak" = (/obj/structure/door_assembly/door_assembly_ext{anchored = 1},/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"al" = (/obj/structure/lattice,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"am" = (/obj/item/weapon/material/shard,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"an" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"ao" = (/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"ap" = (/obj/item/stack/rods,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aq" = (/obj/structure/door_assembly/door_assembly_ext,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"ar" = (/obj/structure/grille,/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"as" = (/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"at" = (/obj/structure/loot_pile/maint/technical,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"au" = (/obj/item/stack/rods,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"av" = (/obj/structure/closet/walllocker/emerglocker/east,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aw" = (/obj/structure/frame,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"ax" = (/obj/item/frame/mirror,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
"ay" = (/obj/effect/decal/mecha_wreckage/gygax{anchored = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"az" = (/obj/effect/gibspawner/generic,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aA" = (/obj/structure/closet/medical_wall,/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
"aB" = (/obj/structure/largecrate/animal/crashedshuttle,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"aC" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aD" = (/obj/structure/shuttle/engine/propulsion{dir = 8},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aE" = (/obj/structure/extinguisher_cabinet,/turf/simulated/shuttle/wall/dark,/area/submap/crashedcontainmentshuttle)
"aF" = (/obj/machinery/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"aG" = (/obj/item/weapon/circuitboard/broken,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aH" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"aI" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"aJ" = (/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"aK" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/material/shard{icon_state = "medium"},/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"aL" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aM" = (/obj/structure/frame,/obj/item/weapon/circuitboard/broken,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aN" = (/obj/structure/table/steel_reinforced,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aO" = (/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/frame,/obj/item/weapon/circuitboard/broken,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"aP" = (/turf/simulated/floor/outdoors/rocks,/area/submap/crashedcontainmentshuttle)
"aQ" = (/obj/item/clothing/suit/space/cult,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aR" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aS" = (/obj/structure/door_assembly/door_assembly_highsecurity{anchored = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aT" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"aU" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"aV" = (/obj/effect/decal/remains/robot,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aW" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"aX" = (/obj/structure/door_assembly/door_assembly_ext{anchored = 1},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aY" = (/obj/effect/decal/remains/human,/obj/effect/gibspawner/human,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"aZ" = (/obj/item/clothing/head/helmet/space/cult,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bb" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bc" = (/obj/structure/door_assembly,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"bd" = (/obj/item/weapon/material/knife/ritual,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"be" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/decal/remains/human,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bf" = (/obj/structure/grille,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bg" = (/obj/effect/gibspawner/generic,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bh" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"bi" = (/obj/item/weapon/circuitboard/broken,/obj/effect/decal/remains/human,/obj/item/weapon/gun/energy/laser,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bj" = (/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"bk" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bl" = (/obj/effect/decal/remains/robot,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"bm" = (/obj/effect/decal/cleanable/liquid_fuel,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bn" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"bo" = (/obj/effect/decal/cleanable/blood/drip,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bp" = (/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"bq" = (/obj/item/weapon/circuitboard/broken,/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"br" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"bs" = (/obj/structure/table/steel_reinforced,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"bt" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"},/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bv" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"bw" = (/obj/item/weapon/material/knife/ritual,/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"bx" = (/turf/simulated/shuttle/wall/dark/no_join,/area/submap/crashedcontainmentshuttle)
"by" = (/obj/random/landmine,/obj/random/landmine,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bz" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/helmet/space/cult,/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"bA" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"bB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"bC" = (/obj/effect/decal/cleanable/liquid_fuel,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bD" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/random/landmine,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bE" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bF" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
"bG" = (/obj/structure/reagent_dispensers/fueltank,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bH" = (/obj/structure/closet/crate{name = "landmines crate"; opened = 1},/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bI" = (/obj/random/landmine,/turf/simulated/shuttle/floor/black,/area/submap/crashedcontainmentshuttle)
"bJ" = (/obj/random/landmine,/turf/simulated/floor/plating,/area/submap/crashedcontainmentshuttle)
"bK" = (/obj/random/landmine,/turf/simulated/shuttle/floor/yellow,/area/submap/crashedcontainmentshuttle)
"bL" = (/obj/effect/decal/cleanable/blood,/obj/random/landmine,/turf/simulated/shuttle/floor/red,/area/submap/crashedcontainmentshuttle)
"bM" = (/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/remains/human,/obj/item/weapon/flame/lighter/random,/turf/template_noop,/area/submap/crashedcontainmentshuttle)
"bN" = (/obj/structure/toilet{dir = 8},/obj/effect/gibspawner/generic,/obj/effect/decal/remains/human,/obj/item/weapon/card/id/syndicate{age = "\\42"; blood_type = "\\O+"; desc = "A strange ID card."; dna_hash = "\[REDACTED]"; fingerprint_hash = "\\------"; name = "Aaron Presley's ID Card(Delivery Service) "; registered_name = "Aaron Presley"; sex = "\\Male"},/turf/simulated/shuttle/floor/white,/area/submap/crashedcontainmentshuttle)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaahaaaaaaaianaaaaaaaaaaaaaaajaaaaaaaa
aaaaabacaaaaaaaaaaaaaaaaalaaaPaPaaamaaaaaaaaaaaaaa
aaaaacaaaaadaaaaaaaaaialaPaPaPadaPaaaaaaapaaaaaaaa
aaaaaaaaauaqakaracacataCacacananacabaaaaaaaaaaaaaa
aaaDaGaaadaoaaadadaiaGbHbyayadadaWacabaaaaaaaaaaaa
aaaQaaaRacaaadadaValbIbybIazbbadaNacanbJaaaaaaaaaa
aaaaaYaZbdalalaladadadbIadadauadaNaAaeaTanaaaaapaa
acaaaaaaaladauadadadacacaSacanadavacbhaeaeahaaaaaa
aPadaDaRacadadadbiadacbjafafacadadadbKbpaHaraaaaaa
aaaPadaaacaMadbkadbbacbvaBbwacaLadaSbKbqaHaoalaaaa
aPbxaDaRacaWadbbadbbanblbLbzanadbbasaebraFaIaabeaa
aPaPaaaaaaaabEazadadanacacacaEadadahaebpaHaoaabfaa
aPaPadaaaJalbIadadaPaPadadadadadadacaeaeaeahaaaaaa
adaaaaaaaaaoadadaPaPaPadacanacbcacacaTbsacacaaaaaa
aPacaaaaamaladaWaPaPbbadaAbAaUbFaOacacacabaPaaaaaa
aPaPaaaPacadadadadadadawaxbBagbnbNanabaPaPaaaaaaaa
aaaaaGaRaaacaXalaoaKanananacacaranabaPaPaabgaaaaaa
acaaaaaaaPaPaaaoaaaaalalaPaPaPalaPaPaaaaaaaaaaaaaa
aaaGaaaaaaacaaaaadaaaabmaaboaaaaaaaaaaaaaaaaaaaaaa
aabtaabgaaataaaaaaaabDbmboaabmbgaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaadaLaaaabmbGbMbmbmaaaaaaaaaaaaaaaaaaaa
aaaaadadaaaaaaacaPbCbmbmbmaaaiaaaaaaaaaaaaaaaaaaaa
aaaaaaadaaaaaaaPaPaaaaaabmaaaaaaaaaaaaaaaaaaaaaaaa
"}

View File

@@ -30,6 +30,7 @@
#include "SwordCave.dmm"
#include "SupplyDrop1.dmm"
#include "BlastMine1.dmm"
#include "crashedcontainmentshuttle.dmm"
#endif
// The 'mountains' is the mining z-level, and has a lot of caves.
@@ -184,6 +185,13 @@
cost = 10
allow_duplicates = TRUE
/datum/map_template/surface/mountains/normal/crashedcontainmentshuttle
name = "Crashed Cargo Shuttle"
desc = "A severely damaged military shuttle, its cargo seems to remain intact."
mappath = 'maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm'
cost = 30
/**************
* Deep Caves *
**************/
@@ -257,3 +265,4 @@
desc = "An abandoned blast mining site, seems that local wildlife has moved in."
mappath = 'maps/submaps/surface_submaps/mountains/BlastMine1.dmm'
cost = 20

View File

@@ -86,3 +86,6 @@
/area/submap/cave/BlastMine1
name = "Blast Mine 1"
/area/submap/crashedcontainmentshuttle
name = "Crashed Containment Shuttle"

View File

@@ -1884,6 +1884,7 @@
#include "code\modules\mob\living\simple_animal\aliens\hivebot.dm"
#include "code\modules\mob\living\simple_animal\aliens\mimic.dm"
#include "code\modules\mob\living\simple_animal\aliens\shade.dm"
#include "code\modules\mob\living\simple_animal\aliens\statue.dm"
#include "code\modules\mob\living\simple_animal\animals\bat.dm"
#include "code\modules\mob\living\simple_animal\animals\bear.dm"
#include "code\modules\mob\living\simple_animal\animals\carp.dm"