From 3c35b7d13ab08d0bb91d04e21855cfef2eafbb35 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Fri, 15 Jun 2018 18:41:19 -0700 Subject: [PATCH 1/2] Folders props, and adds the laser prism, receptor, and sealed doors. (#5337) * Re-bases props, and adds the laser prism. * Ver 1 of Puzzle Lock and Doors * Doors * Fix door hiccup I made, modify Prism --- .../structures/{ => props}/alien_props.dm | 9 - .../objects/structures/props/beam_prism.dm | 215 ++++++++++++++++++ .../structures/props/projectile_lock.dm | 53 +++++ code/game/objects/structures/props/prop.dm | 18 ++ .../objects/structures/props/puzzledoor.dm | 92 ++++++++ icons/obj/props/prism.dmi | Bin 0 -> 19706 bytes icons/obj/props/projectile_lock.dmi | Bin 0 -> 182 bytes vorestation.dme | 6 +- 8 files changed, 383 insertions(+), 10 deletions(-) rename code/game/objects/structures/{ => props}/alien_props.dm (90%) create mode 100644 code/game/objects/structures/props/beam_prism.dm create mode 100644 code/game/objects/structures/props/projectile_lock.dm create mode 100644 code/game/objects/structures/props/prop.dm create mode 100644 code/game/objects/structures/props/puzzledoor.dm create mode 100644 icons/obj/props/prism.dmi create mode 100644 icons/obj/props/projectile_lock.dmi diff --git a/code/game/objects/structures/alien_props.dm b/code/game/objects/structures/props/alien_props.dm similarity index 90% rename from code/game/objects/structures/alien_props.dm rename to code/game/objects/structures/props/alien_props.dm index eb8ae9d19f..fa11e27b15 100644 --- a/code/game/objects/structures/alien_props.dm +++ b/code/game/objects/structures/props/alien_props.dm @@ -6,15 +6,6 @@ icon = 'icons/obj/abductor.dmi' density = TRUE anchored = TRUE - var/interaction_message = null - -/obj/structure/prop/alien/attack_hand(mob/living/user) // Used to tell the player that this isn't useful for anything. - if(!istype(user)) - return FALSE - if(!interaction_message) - return ..() - else - to_chat(user, interaction_message) /obj/structure/prop/alien/computer name = "alien console" diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm new file mode 100644 index 0000000000..44df2eb68b --- /dev/null +++ b/code/game/objects/structures/props/beam_prism.dm @@ -0,0 +1,215 @@ +//A series(?) of prisms for PoIs. The base one only works for beams. + +/obj/structure/prop/prism + name = "prismatic turret" + desc = "A raised, externally powered 'turret'. It seems to have a massive crystal ring around its base." + description_info = "This device is capable of redirecting any beam projectile." + icon = 'icons/obj/props/prism.dmi' + icon_state = "prism" + density = TRUE + anchored = TRUE + + layer = 3.1 //Layer over projectiles. + plane = -10 //Layer over projectiles. + + var/rotation_lock = 0 // Can you rotate the prism at all? + var/free_rotate = 1 // Does the prism rotate in any direction, or only in the eight standard compass directions? + var/external_control_lock = 0 // Does the prism only rotate from the controls of an external switch? + var/degrees_from_north = 0 // How far is it rotated clockwise? + var/compass_directions = list("North" = 0, "South" = 180, "East" = 90, "West" = 270, "Northwest" = 315, "Northeast" = 45, "Southeast" = 135, "Southwest" = 225) + var/interaction_sound = 'sound/mecha/mechmove04.ogg' + + var/redirect_type = /obj/item/projectile/beam + + var/dialID = null + var/obj/structure/prop/prismcontrol/remote_dial = null + + interaction_message = "The prismatic turret seems to be able to rotate." + +/obj/structure/prop/prism/initialize() + if(degrees_from_north) + animate(src, transform = turn(NORTH, degrees_from_north), time = 3) + +/obj/structure/prop/prism/Destroy() + if(remote_dial) + remote_dial.my_turrets -= src + remote_dial = null + ..() + +/obj/structure/prop/prism/proc/reset_rotation() + var/degrees_to_rotate = -1 * degrees_from_north + animate(src, transform = turn(src.transform, degrees_to_rotate), time = 2) + +/obj/structure/prop/prism/attack_hand(mob/living/user) + ..() + + if(rotation_lock) + to_chat(user, "\The [src] is locked at its current bearing.") + return + if(external_control_lock) + to_chat(user, "\The [src]'s motors resist your efforts to rotate it. You may need to find some form of controller.") + return + + var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") + if(confirm == "No") + visible_message(\ + "[user.name] decides not to try turning \the [src].",\ + "You decide not to try turning \the [src].") + return + + var/new_bearing + if(free_rotate) + new_bearing = input("What bearing do you want to rotate \the [src] to?", "[name]") as num + new_bearing = round(new_bearing) + if(new_bearing <= -1 || new_bearing > 360) + to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.") + return + else + var/choice = input("What point do you want to set \the [src] to?", "[name]") as null|anything in compass_directions + new_bearing = round(compass_directions[choice]) + + var/rotate_degrees = new_bearing - degrees_from_north + + if(new_bearing == 360) // Weird artifact. + new_bearing = 0 + degrees_from_north = new_bearing + + var/two_stage = 0 + if(rotate_degrees == 180 || rotate_degrees == -180) + two_stage = 1 + var/multiplier = pick(-1, 1) + rotate_degrees = multiplier * (rotate_degrees / 2) + + playsound(src, interaction_sound, 50, 1) + if(two_stage) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + spawn(3) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + else + animate(src, transform = turn(src.transform, rotate_degrees), time = 6) //Can't update transform because it will reset the angle. + +/obj/structure/prop/prism/proc/rotate_auto(var/new_bearing) + if(rotation_lock) + visible_message("\The [src] shudders.") + playsound(src, 'sound/effects/clang.ogg', 50, 1) + return + + visible_message("\The [src] rotates to a bearing of [new_bearing].") + + var/rotate_degrees = new_bearing - degrees_from_north + + if(new_bearing == 360) + new_bearing = 0 + degrees_from_north = new_bearing + + var/two_stage = 0 + if(rotate_degrees == 180 || rotate_degrees == -180) + two_stage = 1 + var/multiplier = pick(-1, 1) + rotate_degrees = multiplier * (rotate_degrees / 2) + + playsound(src, interaction_sound, 50, 1) + if(two_stage) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + spawn(3) + animate(src, transform = turn(src.transform, rotate_degrees), time = 3) + else + animate(src, transform = turn(src.transform, rotate_degrees), time = 6) + +/obj/structure/prop/prism/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj, redirect_type)) + visible_message("\The [src] redirects \the [Proj]!") + flick("[initial(icon_state)]+glow", src) + + var/new_x = (1 * round(10 * cos(degrees_from_north - 90))) + x //Vectors vectors vectors. + var/new_y = (-1 * round(10 * sin(degrees_from_north - 90))) + y + var/turf/curloc = get_turf(src) + + Proj.penetrating += 1 // Needed for the beam to get out of the turret. + + Proj.redirect(new_x, new_y, curloc, null) + +/obj/structure/prop/prism/incremental + free_rotate = 0 + description_info = "This device is capable of redirecting any beam projectile, but only locks to specific positions in rotation." + +/obj/structure/prop/prism/incremental/externalcont + external_control_lock = 1 + description_info = "This device is capable of redirecting any beam projectile, but can only be rotated by a control dial to specific positions." + +/obj/structure/prop/prism/externalcont + external_control_lock = 1 + description_info = "This device is capable of redirecting any beam projectile, but can only be rotated by an external control dial." + +/obj/structure/prop/prismcontrol + name = "prismatic dial" + desc = "A large dial with a crystalline ring." + icon = 'icons/obj/props/prism.dmi' + icon_state = "dial" + density = FALSE + anchored = TRUE + + interaction_message = "The dial pulses as your hand nears it." + var/list/my_turrets = list() + var/dialID = null + +/obj/structure/prop/prismcontrol/attack_hand(mob/living/user) + ..() + + var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") + if(confirm == "No") + visible_message(\ + "[user.name] decides not to try turning \the [src].",\ + "You decide not to try turning \the [src].") + return + + if(!my_turrets || !my_turrets.len) + to_chat(user, "\The [src] doesn't seem to do anything.") + return + + var/free_rotate = 1 + var/list/compass_directions = list() + for(var/obj/structure/prop/prism/P in my_turrets) + if(!P.free_rotate) //Doesn't use bearing, it uses compass points. + free_rotate = 0 + compass_directions |= P.compass_directions + + var/new_bearing + if(free_rotate) + new_bearing = input("What bearing do you want to rotate \the [src] to?", "[name]") as num + new_bearing = round(new_bearing) + if(new_bearing <= -1 || new_bearing > 360) + to_chat(user, "Rotating \the [src] [new_bearing] degrees would be a waste of time.") + return + else + var/choice = input("What point do you want to set \the [src] to?", "[name]") as null|anything in compass_directions + new_bearing = round(compass_directions[choice]) + + confirm = input("Are you certain you want to rotate \the [src]?", "[name]") in list("Yes", "No") + if(confirm == "No") + visible_message(\ + "[user.name] decides not to try turning \the [src].",\ + "You decide not to try turning \the [src].") + return + + to_chat(user, "\The [src] clicks into place.") + for(var/obj/structure/prop/prism/P in my_turrets) + P.rotate_auto(new_bearing) + +/obj/structure/prop/prismcontrol/initialize() + ..() + if(my_turrets.len) //Preset controls. + for(var/obj/structure/prop/prism/P in my_turrets) + P.remote_dial = src + return + spawn() + for(var/obj/structure/prop/prism/P in orange(src, world.view)) //Don't search a huge area. + if(P.dialID == dialID && !P.remote_dial && P.external_control_lock) + my_turrets |= P + P.remote_dial = src + +/obj/structure/prop/prismcontrol/Destroy() + for(var/obj/structure/prop/prism/P in my_turrets) + P.remote_dial = null + my_turrets = list() + ..() diff --git a/code/game/objects/structures/props/projectile_lock.dm b/code/game/objects/structures/props/projectile_lock.dm new file mode 100644 index 0000000000..5c3fcd2ba0 --- /dev/null +++ b/code/game/objects/structures/props/projectile_lock.dm @@ -0,0 +1,53 @@ +//A locking mechanism that pulses when hit by a projectile. The base one responds to high-power lasers. + +/obj/structure/prop/lock + name = "weird lock" + desc = "An esoteric object that responds to.. something." + icon = 'icons/obj/props/prism.dmi' + icon_state = "lock" + + var/enabled = 0 + var/lockID = null + + var/list/linked_objects = list() + +/obj/structure/prop/lock/Destroy() + if(linked_objects.len) + for(var/obj/O in linked_objects) + if(istype(O, /obj/machinery/door/blast/puzzle)) + var/obj/machinery/door/blast/puzzle/P = O + P.locks -= src + linked_objects -= P + ..() + +/obj/structure/prop/lock/proc/toggle_lock() + enabled = !enabled + + if(enabled) + icon_state = "[initial(icon_state)]-active" + else + icon_state = "[initial(icon_state)]" + +/obj/structure/prop/lock/projectile + name = "beam lock" + desc = "An esoteric object that responds to high intensity light." + + var/projectile_key = /obj/item/projectile/beam + var/timed = 0 + var/timing = 0 + var/time_limit = 1500 // In ticks. Ten is one second. + + interaction_message = "The object remains inert to your touch." + +/obj/structure/prop/lock/projectile/bullet_act(var/obj/item/projectile/Proj) + if(!istype(Proj, projectile_key) || timing) + return + + if(istype(Proj, /obj/item/projectile/beam/heavylaser/cannon) || istype(Proj, /obj/item/projectile/beam/emitter) || (Proj.damage >= 80 && Proj.damtype == BURN)) + toggle_lock() + visible_message("\The [src] [enabled ? "disengages" : "engages"] its locking mechanism.") + + if(timed) + timing = 1 + spawn(time_limit) + toggle_lock() diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm new file mode 100644 index 0000000000..fea5815674 --- /dev/null +++ b/code/game/objects/structures/props/prop.dm @@ -0,0 +1,18 @@ +//The base 'prop' for PoIs or other large junk. + +/obj/structure/prop + name = "something" + desc = "My description is broken, bug a developer." + icon = 'icons/obj/structures.dmi' + icon_state = "safe" + density = TRUE + anchored = TRUE + var/interaction_message = null + +/obj/structure/prop/attack_hand(mob/living/user) // Used to tell the player that this isn't useful for anything. + if(!istype(user)) + return FALSE + if(!interaction_message) + return ..() + else + to_chat(user, interaction_message) diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm new file mode 100644 index 0000000000..b9a32fc0dc --- /dev/null +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -0,0 +1,92 @@ +// An indestructible blast door that can only be opened once its puzzle requirements are completed. + +/obj/machinery/door/blast/puzzle + name = "puzzle door" + desc = "A large, virtually indestructible door that will not open unless certain requirements are met." + icon_state_open = "pdoor0" + icon_state_opening = "pdoorc0" + icon_state_closed = "pdoor1" + icon_state_closing = "pdoorc1" + icon_state = "pdoor1" + + explosion_resistance = 100 + + maxhealth = 9999999 //No. + + var/list/locks = list() + var/lockID = null + var/checkrange_mult = 1 + +/obj/machinery/door/blast/puzzle/proc/check_locks() + for(var/obj/structure/prop/lock/L in locks) + if(!L.enabled) + return 0 + return 1 + +/obj/machinery/door/blast/puzzle/bullet_act(var/obj/item/projectile/Proj) + visible_message("\The [src] is completely unaffected by \the [Proj].") + qdel(Proj) //No piercing. No. + +/obj/machinery/door/blast/puzzle/ex_act(severity) + visible_message("\The [src] is completely unaffected by the blast.") + return + +/obj/machinery/door/blast/puzzle/initialize() + . = ..() + implicit_material = get_material_by_name("dungeonium") + if(locks.len) + return + var/check_range = world.view * checkrange_mult + for(var/obj/structure/prop/lock/L in orange(src, check_range)) + if(L.lockID == lockID) + L.linked_objects |= src + locks |= L + +/obj/machinery/door/blast/puzzle/Destroy() + if(locks.len) + for(var/obj/structure/prop/lock/L in locks) + L.linked_objects -= src + locks -= L + ..() + +/obj/machinery/door/blast/puzzle/attack_hand(mob/user as mob) + if(check_locks()) + force_toggle(1, user) + else + to_chat(user, "\The [src] does not respond to your touch.") + +/obj/machinery/door/blast/puzzle/attackby(obj/item/weapon/C as obj, mob/user as mob) + if(istype(C, /obj/item/weapon)) + if(C.pry == 1 && (user.a_intent != I_HURT || (stat & BROKEN))) + if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + to_chat(user, "You need to be wielding \the [F] to do that.") + return + + if(check_locks()) + force_toggle(1, user) + + else + to_chat(user, "[src]'s arcane workings resist your effort.") + return + + else if(src.density && (user.a_intent == I_HURT)) + var/obj/item/weapon/W = C + user.setClickCooldown(user.get_attack_speed(W)) + if(W.damtype == BRUTE || W.damtype == BURN) + user.do_attack_animation(src) + user.visible_message("\The [user] hits \the [src] with \the [W] with no visible effect.") + + else if(istype(C, /obj/item/weapon/plastique)) + to_chat(user, "On contacting \the [src], a flash of light envelops \the [C] as it is turned to ash. Oh.") + qdel(C) + return 0 + +/obj/machinery/door/blast/puzzle/attack_generic(var/mob/user, var/damage) + if(check_locks()) + force_toggle(1, user) + +/obj/machinery/door/blast/puzzle/attack_alien(var/mob/user) + if(check_locks()) + force_toggle(1, user) diff --git a/icons/obj/props/prism.dmi b/icons/obj/props/prism.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0b938c7ef04ba964434bf4d5b017aa1534bed743 GIT binary patch literal 19706 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 literal 0 HcmV?d00001 diff --git a/icons/obj/props/projectile_lock.dmi b/icons/obj/props/projectile_lock.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index 21345fe0dc..1176f15e95 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1156,7 +1156,6 @@ #include "code\game\objects\random\mob.dm" #include "code\game\objects\random\random_vr.dm" #include "code\game\objects\random\spacesuits.dm" -#include "code\game\objects\structures\alien_props.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\bonfire.dm" @@ -1238,6 +1237,11 @@ #include "code\game\objects\structures\flora\trees.dm" #include "code\game\objects\structures\ghost_pods\ghost_pods.dm" #include "code\game\objects\structures\ghost_pods\silicon.dm" +#include "code\game\objects\structures\props\alien_props.dm" +#include "code\game\objects\structures\props\beam_prism.dm" +#include "code\game\objects\structures\props\projectile_lock.dm" +#include "code\game\objects\structures\props\prop.dm" +#include "code\game\objects\structures\props\puzzledoor.dm" #include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"