diff --git a/code/datums/sun.dm b/code/datums/sun.dm
index d701ad4c5e7..693cd69c156 100644
--- a/code/datums/sun.dm
+++ b/code/datums/sun.dm
@@ -42,7 +42,7 @@
for(var/obj/machinery/power/tracker/T in machines)
- T.set_angle()
+ T.set_angle(angle)
for(var/obj/machinery/power/solar/S in machines)
if(S.control)
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index b4cde466f12..9c77038c17d 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -101,12 +101,18 @@
var/prints
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
var/list/L = params2list(src.fingerprints[i])
- if(L[1] == md5(H.dna.uni_identity))
- new_prints = i
- prints = L[2]
- break
+ if(L.len > 1)
+ if(L[1] == md5(H.dna.uni_identity))
+ new_prints = i
+ prints = L[2]
+ break
+ else
+ src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(80,90))
else
- src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(80,90))
+ var/turf/T = get_turf(src)
+ for (var/mob/N in world)
+ if (N.client && N.client.holder)
+ N << "ERROR:Fingerprint application failed! Important data: [src.name] at [T.x], [T.y], [T.z] with the print string [L[1]]"
if(new_prints)
src.fingerprints[new_prints] = text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(15,30))))
else if(new_prints == 0)
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 000a13d8dac..52071fc0f52 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -88,35 +88,86 @@
traitor.objectives += block_objective
else
- var/list/target = traitor.objectives
for(var/i = 1, i <= rand(1,3), i++)
- var/datum/objective/objective
switch(rand(1,100))
if(1 to 30)
- var/datum/objective/assassinate/kill_objective = new
- kill_objective.owner = traitor
- kill_objective.find_target()
- objective = kill_objective
+ if(!locate(/datum/objective/assassinate) in traitor.objectives && !locate(/datum/objective/protect) in traitor.objectives)
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = traitor
+ kill_objective.find_target()
+ traitor.objectives += kill_objective
+ else
+ var/works = 1
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = traitor
+ kill_objective.find_target()
+ for(var/j, j < traitor.objectives.len, j++)
+ var/compare = istype(traitor.objectives[j],/datum/objective/assassinate)
+ if(compare)
+ var/datum/objective/assassinate/test = traitor.objectives[j]
+ if(test.target == kill_objective.target)
+ works = 0
+ break
+ compare = istype(traitor.objectives[j],/datum/objective/protect)
+ if(compare)
+ var/datum/objective/protect/test = traitor.objectives[j]
+ if(test.target == kill_objective.target)
+ works = 0
+ break
+ if(works)
+ traitor.objectives += kill_objective
+ else
+ i -= 1
if(31 to 40)
- var/datum/objective/protect/protect_objective = new
- protect_objective.owner = traitor
- protect_objective.find_target()
- objective = protect_objective
+ if(!locate(/datum/objective/assassinate) in traitor.objectives && !locate(/datum/objective/protect) in traitor.objectives)
+ var/datum/objective/protect/protect_objective = new
+ protect_objective.owner = traitor
+ protect_objective.find_target()
+ traitor.objectives += protect_objective
+ else
+ var/works = 1
+ var/datum/objective/protect/protect_objective = new
+ protect_objective.owner = traitor
+ protect_objective.find_target()
+ for(var/j, j < traitor.objectives.len, j++)
+ var/compare = istype(traitor.objectives[j],/datum/objective/assassinate)
+ if(compare)
+ var/datum/objective/assassinate/test = traitor.objectives[j]
+ if(test.target == protect_objective.target)
+ works = 0
+ break
+ compare = istype(traitor.objectives[j],/datum/objective/protect)
+ if(compare)
+ var/datum/objective/protect/test = traitor.objectives[j]
+ if(test.target == protect_objective.target)
+ works = 0
+ break
+ if(works)
+ traitor.objectives += protect_objective
+ else
+ i -= 1
else
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = traitor
- steal_objective.find_target()
- objective = steal_objective
- var/inthere = 0
- for(var/j, j<= target.len, j++)
- var/datum/objective/temp = target[j]
- if(temp:target == objective:target)
- inthere = 1
- break
- if(!inthere)
- traitor.objectives += objective
- else
- i -= 1
+ if(!locate(/datum/objective/steal) in traitor.objectives)
+ var/datum/objective/steal/steal_objective = new
+ steal_objective.owner = traitor
+ steal_objective.find_target()
+ traitor.objectives += steal_objective
+ else
+ var/works = 1
+ var/datum/objective/steal/steal_objective = new
+ steal_objective.owner = traitor
+ steal_objective.find_target()
+ for(var/j, j < traitor.objectives.len, j++)
+ var/compare = istype(traitor.objectives[j],/datum/objective/steal)
+ if(compare)
+ var/datum/objective/steal/test = traitor.objectives[j]
+ if(test.target_name == steal_objective.target_name)
+ works = 0
+ break
+ if(works)
+ traitor.objectives += steal_objective
+ else
+ i -= 1
if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 441a7f06fbe..3326604e932 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -698,8 +698,13 @@
// calculates a path to the current destination
// given an optional turf to avoid
/obj/machinery/bot/mulebot/proc/calc_path(var/turf/avoid = null)
- src.path = AStar(src.loc, src.target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_ortho, 0, 250, id=botcard, exclude=avoid)
- src.path = reverselist(src.path)
+ if(src.target)
+ src.path = AStar(src.loc, src.target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_ortho, 0, 250, id=botcard, exclude=avoid)
+ src.path = reverselist(src.path)
+ else
+ for (var/mob/M in world)
+ if (M.client && M.client.holder)
+ M << "ERROR:A Mulebot has attempted to path to a null target! This is a bug!"
// sets the current destination
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index efaac149680..603afe375f9 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -16,8 +16,7 @@
// called by datum/sun/calc_position() as sun's angle changes
- proc/set_angle()
- var/angle = sun.angle
+ proc/set_angle(angle)
//set icon dir to show sun illumination
dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index 9080590840c..cdae466b78a 100644
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -116,7 +116,7 @@
"acl" = (/obj/item/weapon/stamp/hos,/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/security/hos)
"acm" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/security/hos)
"acn" = (/obj/structure/disposalpipe/segment{dir = 1},/obj/item/device/radio/intercom{pixel_x = 28; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/security/hos)
-"aco" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/structure/closet/wardrobe/red,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/security/main)
+"aco" = (/obj/structure/closet/wardrobe/red,/turf/simulated/floor,/area/security/main)
"acp" = (/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
"acq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced{tag = "icon-reinf_1tilethick"; icon_state = "reinf_1tilethick"},/obj/machinery/camera{dir = 1; c_tag = "Firing Range"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/security/range)
"acr" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/filingcabinet,/turf/simulated/floor{dir = 10; icon_state = "carpetside"},/area/security/hos)
@@ -4801,7 +4801,7 @@
"bOq" = (/obj/machinery/door/airlock/glass{name = "Virology"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bOr" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bOs" = (/obj/structure/disposalpipe/segment{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
-"bOt" = (/obj/structure/cable{tag = "Streight"; icon_state = "4-8"; pixel_x = 1; d1 = 4; d2 = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Access"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bOt" = (/obj/structure/cable{tag = "Streight"; icon_state = "4-8"; pixel_x = 1; d1 = 4; d2 = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; holdopen = 0; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Access"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bOu" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bOv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 20},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bOw" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/medical/research{name = "Research Division"})
@@ -4870,7 +4870,7 @@
"bPH" = (/obj/structure/disposalpipe/segment{dir = 1},/turf/simulated/wall/r_wall,/area/medical/virology)
"bPI" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 6; icon_state = "intact-r-f"; initialize_directions = 6; level = 1; name = "pipe"},/turf/simulated/wall/r_wall,/area/medical/virology)
"bPJ" = (/obj/effect/sign/biohazard,/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 9; icon_state = "intact-r-f"; level = 1; name = "pipe"},/turf/simulated/wall/r_wall,/area/medical/virology)
-"bPK" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Access"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
+"bPK" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1449; holdopen = 0; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Access"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"bPL" = (/obj/effect/sign/biohazard,/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/medical/virology)
"bPM" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology)
"bPN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/virology)