From 5d73584fa3a23a9dcc4f16fb66ea1aa8a04b522e Mon Sep 17 00:00:00 2001 From: drexample Date: Tue, 15 May 2018 01:21:04 +0300 Subject: [PATCH] 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 --- code/game/objects/items/poi_items.dm | 13 +- code/modules/mob/living/bot/bot.dm | 3 + code/modules/mob/living/living.dm | 6 +- code/modules/mob/living/silicon/silicon.dm | 3 + .../mob/living/simple_animal/aliens/statue.dm | 431 ++++++++++++++++++ code/modules/paperwork/photography.dm | 33 +- .../mountains/crashedcontainmentshuttle.dmm | 118 +++++ .../surface_submaps/mountains/mountains.dm | 9 + .../mountains/mountains_areas.dm | 5 +- polaris.dme | 1 + 10 files changed, 618 insertions(+), 4 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/aliens/statue.dm create mode 100644 maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index 8d11e747f6..64eaa2977e 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -51,4 +51,15 @@ /obj/item/poi/brokenoldreactor/Destroy() processing_objects -= src - return ..() \ No newline at end of file + 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" + ..() diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 6e8805d17a..bf52dbcfec 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -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 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9ede47aa1f..33db48993d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1015,7 +1015,7 @@ default behaviour is: if(lying != lying_prev) lying_prev = lying update_transform() - + return canmove // Adds overlays for specific modifiers. @@ -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) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 602be39e87..62400289d7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -419,3 +419,6 @@ ghostize(0) qdel(src) + +/mob/living/silicon/has_vision() + return 0 //NOT REAL EYES diff --git a/code/modules/mob/living/simple_animal/aliens/statue.dm b/code/modules/mob/living/simple_animal/aliens/statue.dm new file mode 100644 index 0000000000..f468403a30 --- /dev/null +++ b/code/modules/mob/living/simple_animal/aliens/statue.dm @@ -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, "You cannot move, there are eyes on you!") + 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("[user] tries to banish [src] with [O]!") + if(do_after(user, 15, src)) + if(banishable) + visible_message("[src] crumbles into dust!") + gib() + else + visible_message("[src] is too strong to be banished!") + 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, "You cannot move, there are eyes on you!") + 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("Your eyes feel very heavy.", "You blink suddenly!", "Your eyes close involuntarily!")) + 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, "You cannot attack, there are eyes on you!") + 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 = "You glare your eyes." + 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 = "You glare your eyes." + 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, "You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!") + 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("[src] fades. Maybe it will spark another time.") + +/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, "You are \a [S], brought into existence on [station_name()] by [usr]! Obey all their orders.") + S.mind.assigned_role = "The Statue" + visible_message("The slab suddenly takes the shape of a humanoid!") + 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("The slab suddenly takes the shape of a humanoid!") + S.creator = user + qdel(src) \ No newline at end of file diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index c8b78cfd65..c0870afda3 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -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("Something starts to slowly manifest from the picture!") + 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("The photo turns into \a [S]!") + 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("Something starts to slowly manifest from the picture!") + 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("The photo turns into \a [S]!") + qdel(p) if(copy_id) p.id = id diff --git a/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm b/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm new file mode 100644 index 0000000000..4ffd4a2fab --- /dev/null +++ b/maps/submaps/surface_submaps/mountains/crashedcontainmentshuttle.dmm @@ -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 +"} diff --git a/maps/submaps/surface_submaps/mountains/mountains.dm b/maps/submaps/surface_submaps/mountains/mountains.dm index c661b94bec..dd409e0e62 100644 --- a/maps/submaps/surface_submaps/mountains/mountains.dm +++ b/maps/submaps/surface_submaps/mountains/mountains.dm @@ -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 + diff --git a/maps/submaps/surface_submaps/mountains/mountains_areas.dm b/maps/submaps/surface_submaps/mountains/mountains_areas.dm index 2555b558f9..3baf48c75c 100644 --- a/maps/submaps/surface_submaps/mountains/mountains_areas.dm +++ b/maps/submaps/surface_submaps/mountains/mountains_areas.dm @@ -85,4 +85,7 @@ name = "Supply Drop 1" /area/submap/cave/BlastMine1 - name = "Blast Mine 1" \ No newline at end of file + name = "Blast Mine 1" + +/area/submap/crashedcontainmentshuttle + name = "Crashed Containment Shuttle" \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index ce47b37d77..47766cdfce 100644 --- a/polaris.dme +++ b/polaris.dme @@ -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"