From cfaa6a9cd50d492c3fadea8a903880d46365f450 Mon Sep 17 00:00:00 2001 From: ACCount Date: Wed, 1 Nov 2017 05:00:44 +0300 Subject: [PATCH] Reflector fixes and improvements --- code/__HELPERS/maths.dm | 2 +- code/game/objects/structures/reflector.dm | 135 ++++++++++++++-------- 2 files changed, 90 insertions(+), 47 deletions(-) diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 22fb2d69b5..ca76b715c4 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, var/t = round((val - min) / d) return val - (t * d) -#define NORM_ROT(rot) ((((rot % 360) + (rot - round(rot, 1))) > 0) ? ((rot % 360) + (rot - round(rot, 1))) : (((rot % 360) + (rot - round(rot, 1))) + 360)) +#define NORM_ROT(rot) ((((rot % 360) + (rot - round(rot, 1))) >= 0) ? ((rot % 360) + (rot - round(rot, 1))) : (((rot % 360) + (rot - round(rot, 1))) + 360)) /proc/get_angle_of_incidence(face_angle, angle_in, auto_normalize = TRUE) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 45f9c3614d..e47afd53d4 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -1,13 +1,16 @@ /obj/structure/reflector - name = "reflector frame" - icon = 'icons/obj/stock_parts.dmi' - icon_state = "box_0" - desc = "An angled mirror for reflecting lasers." + name = "reflector base" + icon = 'icons/obj/structures.dmi' + icon_state = "reflector_map" + desc = "A base for reflector assemblies." anchored = FALSE - density = TRUE + density = FALSE layer = BELOW_OBJ_LAYER + var/deflector_icon_state + var/image/deflector_overlay var/finished = FALSE var/admin = FALSE //Can't be rotated or deconstructed + var/can_rotate = TRUE var/framebuildstacktype = /obj/item/stack/sheet/metal var/framebuildstackamount = 5 var/buildstacktype = /obj/item/stack/sheet/metal @@ -17,19 +20,42 @@ /obj/structure/reflector/Initialize() . = ..() + icon_state = "reflector_base" allowed_projectile_typecache = typecacheof(allowed_projectile_typecache) + if(deflector_icon_state) + deflector_overlay = image(icon, deflector_icon_state) + add_overlay(deflector_overlay) + if(rotation_angle == -1) setAngle(dir2angle(dir)) else setAngle(rotation_angle) + if(admin) + can_rotate = FALSE + /obj/structure/reflector/examine(mob/user) ..() - to_chat(user, "Alt-click to adjust its direction.") + if(finished) + to_chat(user, "It is set to [rotation_angle] degrees, and the rotation is [can_rotate ? "unlocked" : "locked"].") + if(!admin) + if(can_rotate) + to_chat(user, "Alt-click to adjust its direction.") + else + to_chat(user, "Use screwdriver to unlock the rotation.") -/obj/structure/reflector/Moved() - setAngle(dir_map_to_angle(dir)) - return ..() +/obj/structure/reflector/proc/setAngle(new_angle) + if(can_rotate) + rotation_angle = new_angle + if(deflector_overlay) + cut_overlay(deflector_overlay) + deflector_overlay.transform = turn(matrix(), new_angle) + add_overlay(deflector_overlay) + + +/obj/structure/reflector/setDir(new_dir) + setAngle(dir_map_to_angle(new_dir)) + return ..(NORTH) /obj/structure/reflector/proc/dir_map_to_angle(dir) return 0 @@ -51,22 +77,45 @@ /obj/structure/reflector/attackby(obj/item/W, mob/user, params) if(admin) return + + if(istype(W, /obj/item/screwdriver)) + can_rotate = !can_rotate + to_chat(user, "You [can_rotate ? "unlock" : "lock"] [src]'s rotation.") + playsound(src, W.usesound, 50, 1) + return + if(istype(W, /obj/item/wrench)) if(anchored) - to_chat(user, "Unweld [src] first!") + to_chat(user, "Unweld [src] from the floor first!") + return + user.visible_message("[user] starts to dismantle [src].", "You start to dismantle [src]...") if(do_after(user, 80*W.toolspeed, target = src)) - playsound(src.loc, W.usesound, 50, 1) - to_chat(user, "You dismantle [src].") - new framebuildstacktype(loc, framebuildstackamount) + playsound(src, W.usesound, 50, 1) + to_chat(user, "You dismantle [src].") + new framebuildstacktype(drop_location(), framebuildstackamount) if(buildstackamount) - new buildstacktype(loc, buildstackamount) + new buildstacktype(drop_location(), buildstackamount) qdel(src) else if(istype(W, /obj/item/weldingtool)) var/obj/item/weldingtool/WT = W - if(!anchored) + + if(obj_integrity < max_integrity) + if(WT.remove_fuel(0,user)) + user.visible_message("[user] starts to repair [src].", + "You begin repairing [src]...", + "You hear welding.") + playsound(src, W.usesound, 40, 1) + if(do_after(user,40*WT.toolspeed, target = src)) + obj_integrity = max_integrity + user.visible_message("[user] has repaired [src].", \ + "You finish repairing [src].") + + else if(!anchored) if (WT.remove_fuel(0,user)) - playsound(src, 'sound/items/welder2.ogg', 50, 1) - user.visible_message("[user] starts to weld [src] to the floor.", "You start to weld [src] to the floor...", "You hear welding.") + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] starts to weld [src] to the floor.", + "You start to weld [src] to the floor...", + "You hear welding.") if (do_after(user,20*W.toolspeed, target = src)) if(!WT.isOn()) return @@ -74,7 +123,7 @@ to_chat(user, "You weld [src] to the floor.") else if (WT.remove_fuel(0,user)) - playsound(src, 'sound/items/welder2.ogg', 50, 1) + playsound(src, W.usesound, 50, 1) user.visible_message("[user] starts to cut [src] free from the floor.", "You start to cut [src] free from the floor...", "You hear welding.") if (do_after(user,20*W.toolspeed, target = src)) if(!WT.isOn()) @@ -86,50 +135,44 @@ if(finished) return var/obj/item/stack/sheet/S = W - if(istype(W, /obj/item/stack/sheet/glass)) + if(istype(S, /obj/item/stack/sheet/glass)) if(S.use(5)) - new /obj/structure/reflector/single (loc) - qdel (src) + new /obj/structure/reflector/single(drop_location()) + qdel(src) else to_chat(user, "You need five sheets of glass to create a reflector!") return - if(istype(W, /obj/item/stack/sheet/rglass)) + if(istype(S, /obj/item/stack/sheet/rglass)) if(S.use(10)) - new /obj/structure/reflector/double (loc) + new /obj/structure/reflector/double(drop_location()) qdel(src) else to_chat(user, "You need ten sheets of reinforced glass to create a double reflector!") return - if(istype(W, /obj/item/stack/sheet/mineral/diamond)) + if(istype(S, /obj/item/stack/sheet/mineral/diamond)) if(S.use(1)) - new /obj/structure/reflector/box (loc) + new /obj/structure/reflector/box(drop_location()) qdel(src) else return ..() /obj/structure/reflector/proc/rotate(mob/user) - if (anchored) - to_chat(user, "It is fastened to the floor!") + if (!can_rotate || admin) + to_chat(user, "The rotation is locked!") return FALSE - var/new_angle = input(user, "Input a new angle for primary reflection face.", "Reflector Angle") as null|num + var/new_angle = input(user, "Input a new angle for primary reflection face.", "Reflector Angle", rotation_angle) as null|num if(!user.canUseTopic(src, be_close=TRUE)) to_chat(user, "You can't do that right now!") return - setAngle(NORM_ROT(new_angle)) + if(!isnull(new_angle)) + setAngle(NORM_ROT(new_angle)) return TRUE -/obj/structure/reflector/proc/setAngle(new_angle) - rotation_angle = new_angle - setDir(NORTH) - var/matrix/M = new - M.Turn(new_angle) - transform = M - /obj/structure/reflector/AltClick(mob/user) if(!user.canUseTopic(src, be_close=TRUE)) to_chat(user, "You can't do that right now!") return - else + else if(finished) rotate(user) @@ -139,9 +182,9 @@ /obj/structure/reflector/single name = "reflector" - icon = 'icons/obj/structures.dmi' - icon_state = "reflector" - desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle." + deflector_icon_state = "reflector" + desc = "An angled mirror for reflecting laser beams." + density = TRUE finished = TRUE buildstacktype = /obj/item/stack/sheet/glass buildstackamount = 5 @@ -170,9 +213,9 @@ /obj/structure/reflector/double name = "double sided reflector" - icon = 'icons/obj/structures.dmi' - icon_state = "reflector_double" - desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle." + deflector_icon_state = "reflector_double" + desc = "A double sided angled mirror for reflecting laser beams." + density = TRUE finished = TRUE buildstacktype = /obj/item/stack/sheet/rglass buildstackamount = 10 @@ -202,9 +245,9 @@ /obj/structure/reflector/box name = "reflector box" - icon = 'icons/obj/structures.dmi' - icon_state = "reflector_box" - desc = "A box with an internal set of mirrors that reflects all laser fire in a single direction." + deflector_icon_state = "reflector_box" + desc = "A box with an internal set of mirrors that reflects all laser beams in a single direction." + density = TRUE finished = TRUE buildstacktype = /obj/item/stack/sheet/mineral/diamond buildstackamount = 1