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