mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
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:
@@ -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"
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -419,3 +419,6 @@
|
||||
|
||||
ghostize(0)
|
||||
qdel(src)
|
||||
|
||||
/mob/living/silicon/has_vision()
|
||||
return 0 //NOT REAL EYES
|
||||
|
||||
431
code/modules/mob/living/simple_animal/aliens/statue.dm
Normal file
431
code/modules/mob/living/simple_animal/aliens/statue.dm
Normal 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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
"}
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -86,3 +86,6 @@
|
||||
|
||||
/area/submap/cave/BlastMine1
|
||||
name = "Blast Mine 1"
|
||||
|
||||
/area/submap/crashedcontainmentshuttle
|
||||
name = "Crashed Containment Shuttle"
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user