diff --git a/_maps/map_files/dragon_outpost/dragon_outpost.dmm b/_maps/map_files/dragon_outpost/dragon_outpost.dmm new file mode 100644 index 00000000000..6621535fd3d --- /dev/null +++ b/_maps/map_files/dragon_outpost/dragon_outpost.dmm @@ -0,0 +1,65540 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(4,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(5,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(6,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(12,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(13,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(14,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(15,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(16,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(17,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(18,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(19,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(20,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(21,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(22,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(24,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(25,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(26,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(27,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(28,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(29,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(30,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(31,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(32,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(33,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(34,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(35,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(36,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(37,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(38,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(39,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(40,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(41,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(42,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(43,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(44,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(45,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(46,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(47,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(48,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(49,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(50,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(51,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(52,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(53,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(54,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(55,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(56,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(57,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(58,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(59,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(60,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(61,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(62,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(63,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(64,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(65,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(66,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(67,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(68,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(69,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(70,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(71,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(72,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(73,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(74,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(75,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(76,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(77,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(78,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(79,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(80,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(81,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(82,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(83,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(84,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(85,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(86,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(87,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(88,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(89,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(90,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(91,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(92,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(93,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(94,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(95,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(96,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(97,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(98,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(99,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(100,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(101,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(102,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(103,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(104,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(105,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(106,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(107,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(108,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(109,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(110,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(111,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(112,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(113,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(114,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(115,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(116,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(117,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(118,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(119,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(120,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(121,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(122,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(123,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(124,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(125,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(126,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(127,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(128,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(129,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(130,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(131,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(132,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(133,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(134,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(135,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(136,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(137,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(138,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(139,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(140,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(141,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(142,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(143,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(144,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(145,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(146,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(147,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(148,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(149,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(150,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(151,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(152,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(153,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(154,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(155,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(156,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(157,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(158,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(159,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(160,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(161,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(162,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(163,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(164,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(165,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(166,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(167,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(168,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(169,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(170,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(171,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(172,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(173,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(174,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(175,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(176,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(177,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(178,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(179,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(180,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(181,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(182,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(183,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(184,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(185,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(186,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(187,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(188,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(189,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(190,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(191,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(192,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(193,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(194,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(195,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(196,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(197,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(198,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(199,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(200,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(201,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(202,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(203,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(204,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(205,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(206,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(207,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(208,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(209,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(210,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(211,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(212,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(213,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(214,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(215,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(216,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(217,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(218,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(219,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(220,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(221,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(222,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(223,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(224,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(225,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(226,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(227,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(228,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(229,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(230,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(231,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(232,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(233,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(234,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(235,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(236,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(237,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(238,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(239,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(240,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(241,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(242,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(243,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(244,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(245,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(246,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(247,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(248,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(249,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(250,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(251,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(252,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(253,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(254,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(255,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index c6fab7e2e4e..adf20cd52f5 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -17,21 +17,6 @@ #define SUPPORT_RODS 5 #define SHEATH 6 -//window construction states -#define WINDOW_OUT_OF_FRAME 0 -#define WINDOW_IN_FRAME 1 -#define WINDOW_SCREWED_TO_FRAME 2 - -//airlock assembly construction states -#define AIRLOCK_ASSEMBLY_NEEDS_WIRES 0 -#define AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS 1 -#define AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER 2 - -//blast door (de)construction states -#define BLASTDOOR_NEEDS_WIRES 0 -#define BLASTDOOR_NEEDS_ELECTRONICS 1 -#define BLASTDOOR_FINISHED 2 - //default_unfasten_wrench() return defines #define CANT_UNFASTEN 0 #define FAILED_UNFASTEN 1 @@ -104,35 +89,5 @@ #define CAT_CHEMISTRY "Chemistry" #define CAT_ATMOSPHERIC "Atmospheric" -//rcd modes -#define RCD_FLOORWALL 0 -#define RCD_AIRLOCK 1 -#define RCD_DECONSTRUCT 2 -#define RCD_WINDOWGRILLE 3 -#define RCD_MACHINE 4 -#define RCD_COMPUTER 5 -#define RCD_FURNISHING 6 - -#define RCD_UPGRADE_FRAMES (1<<0) -#define RCD_UPGRADE_SIMPLE_CIRCUITS (1<<1) -#define RCD_UPGRADE_SILO_LINK (1<<2) -#define RCD_UPGRADE_FURNISHING (1<<3) - -#define RPD_UPGRADE_UNWRENCH (1<<0) - -#define RCD_WINDOW_FULLTILE "full tile" -#define RCD_WINDOW_DIRECTIONAL "directional" -#define RCD_WINDOW_NORMAL "glass" -#define RCD_WINDOW_REINFORCED "reinforced glass" - -#define RCD_MEMORY_WALL 1 -#define RCD_MEMORY_WINDOWGRILLE 2 - -// How much faster to use the RCD when on a tile with memory -#define RCD_MEMORY_SPEED_BUFF 5 - -/// How much less resources the RCD uses when reconstructing -#define RCD_MEMORY_COST_BUFF 8 - /// How many sheets does it cost to make a fulltile window #define SHEETS_FOR_FULLTILE_WINDOW 2 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index 5fed20f45b0..a0660fde305 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -22,8 +22,6 @@ #define COMSIG_ATOM_ACID_ACT "atom_acid_act" ///from base of atom/emag_act(): (/mob/user) #define COMSIG_ATOM_EMAG_ACT "atom_emag_act" -///from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) -#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" ///from base of atom/singularity_pull(): (/datum/component/singularity, current_size) #define COMSIG_ATOM_SING_PULL "atom_sing_pull" ///from obj/machinery/bsa/full/proc/fire(): () diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index b7d7935ec90..d4b066dbe2f 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -12,8 +12,6 @@ ///from base of mob/living/update_transform() #define COMSIG_MOB_POST_UPDATE_TRANSFORM "mob_post_update_transform" -///from /obj/structure/door/crush(): (mob/living/crushed, /obj/machinery/door/crushing_door) -#define COMSIG_LIVING_DOORCRUSHED "living_doorcrush" ///from base of mob/living/resist() (/mob/living) #define COMSIG_LIVING_RESIST "living_resist" ///from base of mob/living/ignite_mob() (/mob/living) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 5d38ccf301b..d686b882191 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -73,10 +73,6 @@ /// from /obj/machinery/light_switch/set_lights(), sent to every switch in the area: (status) #define COMSIG_LIGHT_SWITCH_SET "light_switch_set" -/// from /obj/machinery/fire_alarm/reset(), /obj/machinery/fire_alarm/alarm(): (status) -#define COMSIG_FIREALARM_ON_TRIGGER "firealarm_trigger" -#define COMSIG_FIREALARM_ON_RESET "firealarm_reset" - // /obj access signals #define COMSIG_OBJ_ALLOWED "door_try_to_activate" @@ -85,14 +81,6 @@ #define COMSIG_AIRLOCK_SHELL_ALLOWED "airlock_shell_try_allowed" #define COMPONENT_AIRLOCK_SHELL_ALLOW (1<<0) -// /obj/machinery/door/airlock signals - -//from /obj/machinery/door/airlock/open(): (forced) -#define COMSIG_AIRLOCK_OPEN "airlock_open" -//from /obj/machinery/door/airlock/close(): (forced) -#define COMSIG_AIRLOCK_CLOSE "airlock_close" -///from /obj/machinery/door/airlock/set_bolt(): -#define COMSIG_AIRLOCK_SET_BOLT "airlock_set_bolt" // /obj/item signals ///from base of obj/item/equipped(): (/mob/equipper, slot) @@ -417,4 +405,3 @@ /// from base of /obj/item/slimepotion/speed/afterattack(): (obj/target, /obj/src, mob/user) #define COMSIG_SPEED_POTION_APPLIED "speed_potion" #define SPEED_POTION_STOP (1<<0) - diff --git a/code/__DEFINES/explosions.dm b/code/__DEFINES/explosions.dm index 9c1ac30267c..2b91b26c1ab 100644 --- a/code/__DEFINES/explosions.dm +++ b/code/__DEFINES/explosions.dm @@ -1,4 +1,4 @@ -// The severity of explosions. Why are these inverted? I have no idea, but git blame doesn't go back far enough for me to find out. +// The severity of explosions. Why are these inverted? I have no idea, but git blame doesn't go back far enough for me to find out. BOLD FACED LIE. I CHECKED GIT BLAME. YOU INVERTED IT!! /// The (current) highest possible explosion severity. #define EXPLODE_DEVASTATE 3 /// The (current) middling explosion severity. diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 865a62aa249..06b8bb67c24 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -106,21 +106,13 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_WALLS S_OBJ(1) ///turf/closed/wall, /obj/structure/falsewall #define SMOOTH_GROUP_HIERO_WALL S_OBJ(2) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall -#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(3) ///turf/closed/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(3) ///turf/closed/wall/mineral/titanium/survival/pod -#define SMOOTH_GROUP_PAPERFRAME S_OBJ(4) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe - -#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///turf/closed/indestructible/fakeglass, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/reinforced/plasma/fulltile -#define SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE S_OBJ(22) ///obj/structure/window/bronze/fulltile -#define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(23) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium -#define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(24) ///obj/structure/window/reinforced/shuttle +#define SMOOTH_GROUP_PAPERFRAME S_OBJ(4) ///obj/structure/mineral_door/paperframe #define SMOOTH_GROUP_LATTICE S_OBJ(30) ///obj/structure/lattice #define SMOOTH_GROUP_CATWALK S_OBJ(31) ///obj/structure/lattice/catwalk -#define SMOOTH_GROUP_GRILLE S_OBJ(32) ///obj/structure/grille - -#define SMOOTH_GROUP_AIRLOCK S_OBJ(40) ///obj/machinery/door/airlock -#define SMOOTH_GROUP_SHUTTERS_BLASTDOORS S_OBJ(41) ///obj/machinery/door/poddoor +#define SMOOTH_GROUP_GRILLE S_OBJ(32) ///obj/structure/grillen #define SMOOTH_GROUP_TABLES S_OBJ(50) ///obj/structure/table #define SMOOTH_GROUP_WOOD_TABLES S_OBJ(51) ///obj/structure/table/wood @@ -139,7 +131,7 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_HEDGE_FLUFF S_OBJ(65) ///obj/structure/hedge -#define SMOOTH_GROUP_SHUTTLE_PARTS S_OBJ(66) ///turf/closed/indestructible/opsglass, /obj/structure/shuttle, /obj/structure/window/reinforced/shuttle/survival_pod +#define SMOOTH_GROUP_SHUTTLE_PARTS S_OBJ(66) ///turf/closed/indestructible/opsglass, /obj/structure/shuttle #define SMOOTH_GROUP_CLEANABLE_DIRT S_OBJ(67) ///obj/effect/decal/cleanable/dirt diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 165ee834b5c..eb52d9edeb6 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -83,7 +83,6 @@ Specifically: ZMIMIC_MAX_PLANE to (ZMIMIC_MAX_PLANE - ZMIMIC_MAX_DEPTH) //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define #define CLOSED_DOOR_LAYER 3.1 -#define CLOSED_FIREDOOR_LAYER 3.11 #define ABOVE_OBJ_LAYER 3.2 #define SHUTTER_LAYER_CLOSED 3.21 #define CLOSED_BLASTDOOR_LAYER 3.22 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 51a3a693176..0778e035591 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -34,13 +34,6 @@ #define START_PROCESSING_ON_INIT (1<<0) /// Indicates the machine will automatically start processing right after it's `Initialize()` is ran. #define START_PROCESSING_MANUALLY (1<<1) /// Machines with this flag will not start processing when it's spawned. Use this if you want to manually control when a machine starts processing. -//bitflags for door switches. -#define OPEN (1<<0) -#define IDSCAN (1<<1) -#define BOLTS (1<<2) -#define SHOCK (1<<3) -#define SAFE (1<<4) - //used in design to specify which machine can build it #define FABRICATOR (1<<0) //For circuits. Uses glass/chemicals. #define AUTOLATHE (1<<1) //Prints basic designs without research @@ -104,9 +97,6 @@ #define PROGRAM_CATEGORY_SCI "Science" #define PROGRAM_CATEGORY_MISC "Other" -#define FIREDOOR_OPEN 1 -#define FIREDOOR_CLOSED 2 - #define HYPERTORUS_INACTIVE 0 // No or minimal energy #define HYPERTORUS_NOMINAL 1 // Normal operation #define HYPERTORUS_WARNING 2 // Integrity damaged diff --git a/code/__DEFINES/memory_defines.dm b/code/__DEFINES/memory_defines.dm index ddb6eaffad5..d12c804c000 100644 --- a/code/__DEFINES/memory_defines.dm +++ b/code/__DEFINES/memory_defines.dm @@ -2,7 +2,6 @@ #define NOTES_BANK_ACCOUNT "Bank" #define NOTES_ANTAG "Antag" #define NOTES_TRAITS "Traits" -#define NOTES_DOOR_CODES "Door Codes" ///name of the file that has all the saved engravings #define ENGRAVING_SAVE_FILE "data/engravings/[SSmapping.config.map_name]_engravings.json" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 2743fb91c96..6034ca15c22 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -25,7 +25,6 @@ ///Used by security bots to determine if this item is safe for public use. #define NEEDS_PERMIT (1<<3) #define SLOWS_WHILE_IN_HAND (1<<4) -#define NO_MAT_REDEMPTION (1<<5) // Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. #define DROPDEL (1<<6) // When dropped, it calls qdel on itself #define NOBLUDGEON (1<<7) // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() #define ABSTRACT (1<<9) // for all things that are technically items but used for various different stuff <= wow thanks for the fucking insight sherlock diff --git a/code/__DEFINES/path.dm b/code/__DEFINES/path.dm index be67647254b..be6e3b2bbad 100644 --- a/code/__DEFINES/path.dm +++ b/code/__DEFINES/path.dm @@ -5,7 +5,7 @@ #define CANASTARPASS_ALWAYS_PROC 1 /** - * A helper macro to see if it's possible to step from the first turf into the second one, minding things like door access and directional windows. + * A helper macro to see if it's possible to step from the first turf into the second one * Note that this can only be used inside the [datum/pathfind][pathfind datum] since it uses variables from said datum. * If you really want to optimize things, optimize this, cuz this gets called a lot. */ diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 2f706276341..5878ee80020 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -673,9 +673,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait put on [/mob/living/carbon/human]. If that mob has a crystal core, also known as an ethereal heart, it will not try to revive them if the mob dies. #define TRAIT_CANNOT_CRYSTALIZE "cannot_crystalize" -///Trait applied to turfs when an atmos holosign is placed on them. It will stop firedoors from closing. -#define TRAIT_FIREDOOR_STOP "firedoor_stop" - /// Trait applied when the MMI component is added to an [/obj/item/integrated_circuit] #define TRAIT_COMPONENT_MMI "component_mmi" /// Trait applied when the MMI component is added to an [/obj/item/integrated_circuit] diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index fa89cf5e9df..63520d99de5 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -93,9 +93,6 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en newA.reg_in_areas_in_z() - for(var/thing2move in oldA.firedoors + oldA.firealarms + oldA.airalarms) - thing2move:set_area(get_area(thing2move)) //Dude trust me - if(!isarea(area_choice) && (newA.area_lighting == AREA_LIGHTING_DYNAMIC)) newA.create_area_lighting_objects() diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm deleted file mode 100644 index ad9f24cef3c..00000000000 --- a/code/__HELPERS/construction.dm +++ /dev/null @@ -1,10 +0,0 @@ -/// Produces a new RCD result from the given one if it can be calculated that -/// the RCD should speed up with the remembered form. -/proc/rcd_result_with_memory(list/defaults, turf/place, expected_memory) - if (place?.rcd_memory == expected_memory) - return defaults + list( - "cost" = defaults["cost"] / RCD_MEMORY_COST_BUFF, - "delay" = defaults["delay"] / RCD_MEMORY_SPEED_BUFF, - ) - else - return defaults diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1102fea4213..fcad4e4da2d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -154,20 +154,16 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list( /obj/item/storage/secure/safe, /obj/machinery/airalarm, /obj/machinery/newscaster, - /obj/machinery/button, /obj/machinery/computer/security/telescreen, /obj/machinery/computer/security/telescreen/entertainment, /obj/machinery/defibrillator_mount, - /obj/machinery/door_timer, /obj/machinery/embedded_controller/radio/simple_vent_controller, - /obj/machinery/firealarm, /obj/machinery/flasher, /obj/machinery/keycard_auth, /obj/machinery/light_switch, /obj/machinery/power/apc, /obj/machinery/requests_console, /obj/machinery/status_display, - /obj/machinery/ticket_machine, /obj/machinery/turretid, /obj/structure/extinguisher_cabinet, /obj/structure/fireaxecabinet, diff --git a/code/__HELPERS/paths/jps_path.dm b/code/__HELPERS/paths/jps_path.dm index ab04627489b..cfda7029539 100644 --- a/code/__HELPERS/paths/jps_path.dm +++ b/code/__HELPERS/paths/jps_path.dm @@ -421,7 +421,7 @@ if(TURF_PATHING_PASS_NO) return TRUE - var/static/list/directional_blocker_cache = typecacheof(list(/obj/structure/window, /obj/machinery/door/window, /obj/structure/railing, /obj/machinery/door/firedoor/border_only)) + var/static/list/directional_blocker_cache = typecacheof(list(/obj/structure/railing)) // Source border object checks for(var/obj/border in src) if(!directional_blocker_cache[border.type]) diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 348be5992bc..7cb26b68712 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -398,17 +398,6 @@ Turf and target are separate in case you want to teleport some distance from a t if(!dest_turf) return FALSE for(var/obj/turf_content in dest_turf) - if(istype(turf_content, /obj/machinery/door/window)) - if((turf_content.dir == test_dir) || is_fulltile) - return FALSE - if(istype(turf_content, /obj/structure/windoor_assembly)) - var/obj/structure/windoor_assembly/windoor_assembly = turf_content - if(windoor_assembly.dir == test_dir || is_fulltile) - return FALSE - if(istype(turf_content, /obj/structure/window)) - var/obj/structure/window/window_structure = turf_content - if(window_structure.dir == test_dir || window_structure.fulltile || is_fulltile) - return FALSE if(istype(turf_content, /obj/structure/railing)) var/obj/structure/railing/rail = turf_content if(rail.dir == test_dir || is_fulltile) diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm index 98aed39eba1..b421c2366c1 100644 --- a/code/__HELPERS/type_processing.dm +++ b/code/__HELPERS/type_processing.dm @@ -15,8 +15,6 @@ /obj/item/reagent_containers = "REAGENT_CONTAINERS", /obj/machinery/atmospherics = "ATMOS_MECH", /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", /obj/item/organ = "ORGAN", /obj/item = "ITEM", /obj/machinery = "MACHINERY", diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index c3f689d1f97..253e11c324e 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -184,7 +184,6 @@ DEFINE_BITFIELD(item_flags, list( "ITEM_HAS_CONTEXTUAL_SCREENTIPS" = ITEM_HAS_CONTEXTUAL_SCREENTIPS, "NEEDS_PERMIT" = NEEDS_PERMIT, "NOBLUDGEON" = NOBLUDGEON, - "NO_MAT_REDEMPTION" = NO_MAT_REDEMPTION, "NO_PIXEL_RANDOM_DROP" = NO_PIXEL_RANDOM_DROP, "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, "SURGICAL_TOOL" = SURGICAL_TOOL, diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 7e892c93a44..9f2d97c8077 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -49,9 +49,6 @@ GLOBAL_LIST_INIT(trash_loot, list(//junk: useless, very easy to get, or ghetto c /obj/item/light/tube = 1, /obj/item/reagent_containers/food/drinks/drinkingglass = 1, - /obj/item/airlock_painter = 1, - /obj/item/airlock_painter/decal = 1, - /obj/item/airlock_painter/decal/tile = 1, /obj/item/clothing/mask/breath = 1, /obj/item/shard = 1, diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 99556468472..8fe181de664 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -115,7 +115,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/stamp/hos, /obj/item/toy/figure/hos, /obj/item/toy/figure/secofficer, - /obj/machinery/door/airlock/security, /obj/structure/statue/gold/hos, /obj/structure/statue/silver/sec, /obj/structure/statue/silver/secborg, @@ -146,11 +145,8 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/toy/mecha/darkhonk, /obj/item/toy/mecha/honk, /obj/item/trash/cheesie, - /obj/machinery/door/airlock/bananium, - /obj/structure/mecha_wreckage/honker, /obj/structure/statue/bananium, /obj/vehicle/sealed/car/clowncar, - /obj/vehicle/sealed/mecha/combat/honker, )), "greytide" = (typecacheof(list( @@ -215,7 +211,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/toy/figure/hos, /obj/item/toy/figure/rd, /obj/machinery/atmospherics/miner, - /obj/machinery/door/airlock/centcom, )), "robots" = typecacheof(list( @@ -250,7 +245,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/surgicaldrill, /obj/machinery/atmospherics/components/unary/cryo_cell, /obj/machinery/dna_scannernew, - /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, /obj/machinery/stasis, /obj/structure/sign/departments/medbay, @@ -284,7 +278,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/toy/figure/hop, /obj/item/toy/figure/hos, /obj/item/toy/figure/rd, - /obj/machinery/door/airlock/command, /obj/structure/statue/diamond/captain, /obj/structure/statue/gold/ce, /obj/structure/statue/gold/cmo, @@ -365,7 +358,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/throwing_star, /obj/item/toy/katana, /obj/structure/mineral_door/paperframe, - /obj/structure/window/paperframe, )), "birds" = typecacheof(list( @@ -392,9 +384,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/syringe, - /obj/item/mecha_ammo, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic, - /obj/item/mecha_parts/mecha_equipment/weapon/energy, /obj/item/storage/belt/bandolier, /obj/item/storage/belt/holster, /obj/machinery/porta_turret, @@ -427,7 +416,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/throwing_star, /obj/item/toy/katana, /obj/structure/mineral_door/paperframe, - /obj/structure/window/paperframe, )), "blood" = typecacheof(list( diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index db10302ce56..1e5b686e652 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -149,38 +149,6 @@ /atom/proc/AICtrlShiftClick() return -/* Airlocks */ -/obj/machinery/door/airlock/AICtrlClick() // Bolts doors - if(obj_flags & EMAGGED) - return - - toggle_bolt(usr) - log_touch(usr) - -/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. - if(obj_flags & EMAGGED) - return - - if(!secondsElectrified) - shock_perm(usr) - else - shock_restore(usr) - -/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! - if(obj_flags & EMAGGED) - return FALSE - - user_toggle_open(usr) - log_touch(usr) - return TRUE - -/obj/machinery/door/airlock/AICtrlShiftClick() // Sets/Unsets Emergency Access Override - if(obj_flags & EMAGGED) - return - - toggle_emergency(usr) - log_touch(usr) - /* APC */ /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. if(can_use(usr, 1)) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 75a85b39498..1f1c5b5587f 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -102,32 +102,12 @@ /atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AICtrlShiftClick() - else - ..() - - /atom/proc/BorgShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AIShiftClick() - else - ..() - - /atom/proc/BorgCtrlClick(mob/living/silicon/robot/user) //forward to human click if not overridden CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AICtrlClick() - else - ..() - /obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. if(get_dist(src,user) <= user.interaction_range) AICtrlClick() @@ -144,12 +124,6 @@ AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. - if(get_dist(src,user) <= user.interaction_range) - AIAltClick() - else - ..() - /obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. if(get_dist(src,user) <= user.interaction_range) AIAltClick() diff --git a/code/controllers/subsystem/holomap.dm b/code/controllers/subsystem/holomap.dm index 46e00b4bf0d..8b77c760ce7 100644 --- a/code/controllers/subsystem/holomap.dm +++ b/code/controllers/subsystem/holomap.dm @@ -44,14 +44,7 @@ SUBSYSTEM_DEF(holomap) var/pixel_x = T.x + offset_x var/pixel_y = T.y + offset_y // Draw spacebound airlocks - if(locate(/obj/machinery/door/airlock/external, T)) - for(var/dir in GLOB.cardinals) - var/turf/other = get_step(T, dir) - if(!istype(other.loc, /area/station)) - canvas.DrawBox(HOLOMAP_COLOR_EXTERNAL_AIRLOCK, pixel_x, pixel_y) - continue turfloop - var/obj/structure/window/W - if(iswallturf(T) || ((W = locate(/obj/structure/window, T)) && W.fulltile) || locate(/obj/structure/plasticflaps, T)) + if(iswallturf(T) || locate(/obj/structure/plasticflaps, T)) for(var/dir in GLOB.cardinals) var/turf/other = get_step(T, dir) if(isnull(other)) diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 9672e11ead8..8ddef545f4c 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(id_access) /// Helper list containing all station groups. var/list/station_groups = list() - /// Database of referenceable pincodes (Usually door codes.) + /// Database of referenceable pincodes var/list/static_pincodes = list() /datum/controller/subsystem/id_access/Initialize(timeofday) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 355c6eda889..1f729c11a08 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -12,8 +12,6 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(applyplate)) RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, PROC_REF(dropplates)) - if(istype(parent, /obj/vehicle/sealed/mecha/working/ripley)) - RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(apply_mech_overlays)) if(_maxamount) maxamount = _maxamount diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index a632d94131b..3dc490afe5a 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -11,7 +11,6 @@ /obj/energy_ball, /obj/docking_port, /obj/structure/lattice, - /obj/structure/stone_tile, /obj/projectile, /obj/effect/projectile, /obj/effect/portal, @@ -41,13 +40,10 @@ /datum/component/chasm/proc/is_safe() //if anything matching this typecache is found in the chasm, we don't drop things - var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile)) + var/static/list/chasm_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk)) var/atom/parent = src.parent var/list/found_safeties = typecache_filter_list(parent.contents, chasm_safeties_typecache) - for(var/obj/structure/stone_tile/S in found_safeties) - if(S.fallen) - LAZYREMOVE(found_safeties, S) return LAZYLEN(found_safeties) /datum/component/chasm/proc/drop_stuff(AM) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 968d7812163..7db86b4da48 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -713,30 +713,6 @@ // ) // category = CAT_MISC -/datum/crafting_recipe/shutters - name = "Shutters" - reqs = list(/obj/item/stack/sheet/plasteel = 5, - /obj/item/stack/cable_coil = 5, - /obj/item/electronics/airlock = 1 - ) - result = /obj/machinery/door/poddoor/shutters/preopen - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) - time = 10 SECONDS - category = CAT_MISC - one_per_turf = TRUE - -/datum/crafting_recipe/blast_doors - name = "Blast Door" - reqs = list(/obj/item/stack/sheet/plasteel = 15, - /obj/item/stack/cable_coil = 15, - /obj/item/electronics/airlock = 1 - ) - result = /obj/machinery/door/poddoor/preopen - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) - time = 30 SECONDS - category = CAT_MISC - one_per_turf = TRUE - /datum/crafting_recipe/aquarium name = "Aquarium" result = /obj/structure/aquarium diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 0a438d4813e..93af256347e 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -104,7 +104,6 @@ /datum/species = TRUE, // Some types to remove them and their subtypes /mob/living/carbon/human/species = FALSE, - /mob/living/simple_animal/hostile/syndicate/mecha_pilot = FALSE, )) // Some particular types to disallow if they're too broad/abstract // Not in the above typecache generator because it includes subtypes and this doesn't. @@ -140,7 +139,6 @@ /obj/projectile/bullet/honker = 15, /obj/projectile/temp = 15, /obj/projectile/ion = 15, - /obj/projectile/magic/door = 15, /obj/projectile/magic/locker = 15, /obj/projectile/magic/fetch = 15, /obj/projectile/beam/emitter = 15, diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 249c09625f9..338285e09b2 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -113,7 +113,7 @@ return if(I.item_flags & ABSTRACT) return - if((I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION) || (tc && !is_type_in_typecache(I, tc))) + if((I.flags_1 & HOLOGRAM_1) || (tc && !is_type_in_typecache(I, tc))) if(!(mat_container_flags & MATCONTAINER_SILENT)) to_chat(user, span_warning("[parent] won't accept [I]!")) return diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index 9cd7af2d93b..fe9b80ef4d8 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -59,17 +59,6 @@ if(!prob(15)) return - var/our_guy_pos = get_turf(living_guy) - for(var/turf_content in our_guy_pos) - if(istype(turf_content, /obj/machinery/door/airlock)) - to_chat(living_guy, span_warning("A malevolent force launches your body to the floor...")) - var/obj/machinery/door/airlock/darth_airlock = turf_content - living_guy.apply_status_effect(/datum/status_effect/incapacitating/paralyzed, 10) - INVOKE_ASYNC(darth_airlock, TYPE_PROC_REF(/obj/machinery/door/airlock, close), TRUE) - if(!permanent) - qdel(src) - return - for(var/turf/the_turf as anything in get_adjacent_open_turfs(living_guy)) if(the_turf.CanZPass(living_guy, DOWN, z_move_flags = ZMOVE_FALL_FLAGS) && living_guy.can_z_move(DOWN, the_turf, ZMOVE_FALL_FLAGS)) to_chat(living_guy, span_warning("A malevolent force guides you towards the edge...")) diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index 19794d94b58..dd12152ef0a 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -62,7 +62,6 @@ RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, PROC_REF(vehicle_mob_unbuckle)) RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, PROC_REF(vehicle_mob_buckle)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(vehicle_moved)) - RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(vehicle_bump)) RegisterSignal(parent, COMSIG_BUCKLED_CAN_Z_MOVE, PROC_REF(riding_can_z_move)) /** @@ -224,14 +223,6 @@ SHOULD_CALL_PARENT(TRUE) movable_parent.set_glide_size(DELAY_TO_GLIDE_SIZE(vehicle_move_delay)) -/// So we can check all occupants when we bump a door to see if anyone has access -/datum/component/riding/proc/vehicle_bump(atom/movable/movable_parent, obj/machinery/door/possible_bumped_door) - SIGNAL_HANDLER - if(!istype(possible_bumped_door)) - return - for(var/occupant in movable_parent.buckled_mobs) - INVOKE_ASYNC(possible_bumped_door, TYPE_PROC_REF(/obj/machinery/door, bumpopen), occupant) - /datum/component/riding/proc/Unbuckle(atom/movable/M) addtimer(CALLBACK(parent, TYPE_PROC_REF(/atom/movable, unbuckle_mob), M), 0, TIMER_UNIQUE) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 96529caa539..c36b64806b2 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -135,17 +135,12 @@ rotated_obj.balloon_alert(user, "need a wrench!") return FALSE if(!(rotation_flags & ROTATION_IGNORE_ANCHORED) && rotated_obj.anchored) - if(istype(rotated_obj, /obj/structure/window)) - rotated_obj.balloon_alert(user, "need to unscrew!") - else - rotated_obj.balloon_alert(user, "need to unwrench!") + rotated_obj.balloon_alert(user, "need to unwrench!") return FALSE if(rotation_flags & ROTATION_NEEDS_ROOM) var/target_dir = turn(rotated_obj.dir, degrees) - var/obj/structure/window/rotated_window = rotated_obj - var/fulltile = istype(rotated_window) ? rotated_window.fulltile : FALSE - if(!valid_window_location(rotated_obj.loc, target_dir, is_fulltile = fulltile)) + if(!valid_window_location(rotated_obj.loc, target_dir, is_fulltile = TRUE)) rotated_obj.balloon_alert(user, "can't rotate in that direction!") return FALSE return TRUE diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index f23cd2d7c3d..b853925f38b 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -342,12 +342,6 @@ var/obj/machinery/vending/darth_vendor = hit darth_vendor.tilt(user, TRUE) return - else if(istype(hit, /obj/structure/window)) - var/obj/structure/window/W = hit - splatWindow(user, W) - if(QDELETED(W)) - return COMPONENT_MOVABLE_IMPACT_NEVERMIND - return var/oopsie_mod = 0 var/danger_zone = (speed - 1) * 13 // for every extra speed we have over 1, take away 13 of the safest chance @@ -448,36 +442,6 @@ QDEL_NULL(tackle_ref) UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) -///A special case for splatting for handling windows -/datum/component/tackler/proc/splatWindow(mob/living/carbon/user, obj/structure/window/W) - playsound(user, 'sound/effects/Glasshit.ogg', 140, TRUE) - - if(W.type in list(/obj/structure/window, /obj/structure/window/fulltile, /obj/structure/window/unanchored, /obj/structure/window/fulltile/unanchored)) // boring unreinforced windows - for(var/i in 1 to speed) - var/obj/item/shard/shard = new /obj/item/shard(get_turf(user)) - shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=3, pain_chance=5) - shard.updateEmbedding() - user.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = null - shard.updateEmbedding() - W.atom_destruction() - user.stamina.adjust(-10 * speed) - user.Paralyze(30) - user.visible_message(span_danger("[user] smacks into [W] and shatters it, shredding [user.p_them()]self with glass!"), span_userdanger("You smacks into [W] and shatter it, shredding yourself with glass!")) - - else - user.visible_message(span_danger("[user] smacks into [W] like a bug!"), span_userdanger("You smacks into [W] like a bug!")) - user.Paralyze(10) - user.Knockdown(30) - W.take_damage(30 * speed) - user.stamina.adjust(-10 * speed) - user.adjustBruteLoss(5 * speed) - -/datum/component/tackler/proc/delayedSmash(obj/structure/window/W) - if(W) - W.atom_destruction() - playsound(W, SFX_SHATTER, 70, TRUE) - ///Check to see if we hit a table, and if so, make a big mess! /datum/component/tackler/proc/checkObstacle(mob/living/carbon/owner) SIGNAL_HANDLER diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 1028c07c9e7..a7c1db28fa1 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -147,16 +147,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/looping_sound/firealarm - mid_sounds = list('sound/machines/FireAlarm1.ogg' = 1,'sound/machines/FireAlarm2.ogg' = 1,'sound/machines/FireAlarm3.ogg' = 1,'sound/machines/FireAlarm4.ogg' = 1) - mid_length = 2.4 SECONDS - volume = 75 - ignore_walls = FALSE - extra_range = 5 - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - /datum/looping_sound/atmosalarm mid_sounds = list('sound/machines/atmosalarm.ogg' = 1) mid_length = 1 SECONDS diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 0c328875da8..cd8026b784e 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -51,7 +51,6 @@ Simple datum which is instanced once per type and is used for every object of sa /// The integrity of walls made with this material. var/wall_integrity = 50 - var/obj/structure/window/window_type //! The type of window made with this material. var/list/icon/wall_icons //! The icons used for walls made with this material. In order of the wall's damage level from destroyed to max durability. var/list/icon/wall_icons_trim_top //! The icons used for wall trims made with this material. In order of the wall's damage level from destroyed to max durability. var/list/icon/wall_icons_trim_bottom //! The icons used for wall trims made with this material. In order of the wall's damage level from destroyed to max durability. diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm index 0917b27fdd7..3026c15fd7a 100644 --- a/code/datums/proximity_monitor/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -106,8 +106,6 @@ freeze_mob(A) else if(istype(A, /obj/projectile)) freeze_projectile(A) - else if(istype(A, /obj/vehicle/sealed/mecha)) - freeze_mecha(A) else if((ismachinery(A) && !istype(A, /obj/machinery/light)) || isstructure(A)) //Special exception for light fixtures since recoloring causes them to change light freeze_structure(A) else @@ -142,8 +140,6 @@ unfreeze_mob(A) else if(istype(A, /obj/projectile)) unfreeze_projectile(A) - else if(istype(A, /obj/vehicle/sealed/mecha)) - unfreeze_mecha(A) UnregisterSignal(A, COMSIG_MOVABLE_PRE_MOVE) UnregisterSignal(A, COMSIG_ITEM_PICKUP) @@ -152,14 +148,6 @@ frozen_things -= A global_frozen_atoms -= A - -/datum/proximity_monitor/advanced/timestop/proc/freeze_mecha(obj/vehicle/sealed/mecha/M) - M.completely_disabled = TRUE - -/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mecha(obj/vehicle/sealed/mecha/M) - M.completely_disabled = FALSE - - /datum/proximity_monitor/advanced/timestop/proc/freeze_throwing(atom/movable/AM) var/datum/thrownthing/T = AM.throwing T.paused = TRUE diff --git a/code/datums/station_integrity.dm b/code/datums/station_integrity.dm index 5d28b62930a..fa1f90c987f 100644 --- a/code/datums/station_integrity.dm +++ b/code/datums/station_integrity.dm @@ -11,8 +11,6 @@ var/floor = 0 var/wall = 0 var/r_wall = 0 - var/window = 0 - var/door = 0 var/grille = 0 var/mach = 0 @@ -20,8 +18,6 @@ floor = 0 wall = 0 r_wall = 0 - window = 0 - door = 0 grille = 0 mach = 0 for(var/Z in SSmapping.levels_by_trait(ZTRAIT_STATION)) @@ -49,15 +45,7 @@ for(var/obj/O in T.contents) - if(istype(O, /obj/structure/window)) - window += 1 - else if(istype(O, /obj/structure/grille)) - var/obj/structure/grille/GR = O - if(!GR.broken) - grille += 1 - else if(istype(O, /obj/machinery/door)) - door += 1 - else if(ismachinery(O)) + if(ismachinery(O)) mach += 1 CHECK_TICK CHECK_TICK @@ -70,8 +58,6 @@ output += (result.floor / max(floor,1)) output += (result.r_wall/ max(r_wall,1)) output += (result.wall / max(wall,1)) - output += (result.window / max(window,1)) - output += (result.door / max(door,1)) output += (result.grille / max(grille,1)) output += (result.mach / max(mach,1)) return (output/7) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm deleted file mode 100644 index 681528e9604..00000000000 --- a/code/datums/wires/airlock.dm +++ /dev/null @@ -1,200 +0,0 @@ -#define AI_WIRE_NORMAL 0 -#define AI_WIRE_DISABLED 1 -#define AI_WIRE_HACKED 2 -#define AI_WIRE_DISABLED_HACKED -1 - -/datum/wires/airlock - holder_type = /obj/machinery/door/airlock - proper_name = "Generic Airlock" - -/datum/wires/airlock/secure - proper_name = "High Security Airlock" - randomize = TRUE - -/datum/wires/airlock/maint - dictionary_key = /datum/wires/airlock/maint - proper_name = "Maintenance Airlock" - -/datum/wires/airlock/command - dictionary_key = /datum/wires/airlock/command - proper_name = "Command Airlock" - -/datum/wires/airlock/service - dictionary_key = /datum/wires/airlock/service - proper_name = "Service Airlock" - -/datum/wires/airlock/security - dictionary_key = /datum/wires/airlock/security - proper_name = "Security Airlock" - -/datum/wires/airlock/engineering - dictionary_key = /datum/wires/airlock/engineering - proper_name = "Engineering Airlock" - -/datum/wires/airlock/medbay - dictionary_key = /datum/wires/airlock/medbay - proper_name = "Medbay Airlock" - -/datum/wires/airlock/science - dictionary_key = /datum/wires/airlock/science - proper_name = "Science Airlock" - -/datum/wires/airlock/ai - dictionary_key = /datum/wires/airlock/ai - proper_name = "AI Airlock" - -/datum/wires/airlock/New(atom/holder) - wires = list( - WIRE_POWER1, WIRE_POWER2, - WIRE_BACKUP1, WIRE_BACKUP2, - WIRE_OPEN, WIRE_BOLTS, WIRE_IDSCAN, WIRE_AI, - WIRE_SHOCK, WIRE_SAFETY, WIRE_TIMING, WIRE_LIGHT, - WIRE_ZAP1, WIRE_ZAP2 - ) - add_duds(2) - ..() - -/datum/wires/airlock/interact(mob/user) - var/obj/machinery/door/airlock/airlock_holder = holder - if (!issilicon(user) && airlock_holder.isElectrified() && airlock_holder.shock(user, 100)) - return - - return ..() - -/datum/wires/airlock/interactable(mob/user) - if(!..()) - return FALSE - var/obj/machinery/door/airlock/A = holder - if(!issilicon(user) && A.isElectrified()) - var/mob/living/carbon/carbon_user = user - if (!istype(carbon_user) || carbon_user.should_electrocute(src)) - return FALSE - if(A.is_secure()) - return FALSE - if(A.panel_open) - return TRUE - -/datum/wires/airlock/get_status() - var/obj/machinery/door/airlock/A = holder - var/list/status = list() - status += "The door bolts [A.locked ? "have fallen!" : "look up."]" - status += "The test light is [A.hasPower() ? "on" : "off"]." - status += "The AI connection light is [A.aiControlDisabled || (A.obj_flags & EMAGGED) ? "off" : "on"]." - status += "The check wiring light is [A.dont_close_on_dense_objects ? "off" : "on"]." - status += "The timer is powered [A.autoclose ? "on" : "off"]." - status += "The speed light is [!A.superspeed ? "on" : "off"]." - status += "The emergency light is [A.emergency ? "on" : "off"]." - return status - -/datum/wires/airlock/on_pulse(wire) - set waitfor = FALSE - var/obj/machinery/door/airlock/A = holder - switch(wire) - if(WIRE_POWER1, WIRE_POWER2) // Pulse to loose power. - A.loseMainPower() - if(WIRE_BACKUP1, WIRE_BACKUP2) // Pulse to loose backup power. - A.loseBackupPower() - if(WIRE_OPEN) // Pulse to open door (only works not emagged and ID wire is cut or no access is required). - if(A.obj_flags & EMAGGED) - return - if(!A.requiresID() || A.check_access(null)) - if(A.density) - INVOKE_ASYNC(A, TYPE_PROC_REF(/obj/machinery/door/airlock, open), 1) - else - INVOKE_ASYNC(A, TYPE_PROC_REF(/obj/machinery/door/airlock, close), 1) - if(WIRE_BOLTS) // Pulse to toggle bolts (but only raise if power is on). - if(!A.locked) - A.bolt() - else - if(A.hasPower()) - A.unbolt() - A.update_appearance() - if(WIRE_IDSCAN) // Pulse to disable emergency access and flash red lights. - if(A.hasPower() && A.density) - A.do_animate("deny") - if(A.emergency) - A.emergency = FALSE - A.update_appearance() - if(WIRE_AI) // Pulse to disable WIRE_AI control for 10 ticks (follows same rules as cutting). - if(A.aiControlDisabled == AI_WIRE_NORMAL) - A.aiControlDisabled = AI_WIRE_DISABLED - else if(A.aiControlDisabled == AI_WIRE_DISABLED_HACKED) - A.aiControlDisabled = AI_WIRE_HACKED - addtimer(CALLBACK(A, TYPE_PROC_REF(/obj/machinery/door/airlock, reset_ai_wire)), 1 SECONDS) - if(WIRE_SHOCK) // Pulse to shock the door for 10 ticks. - if(!A.secondsElectrified) - A.set_electrified(MACHINE_DEFAULT_ELECTRIFY_TIME, usr) - A.shock(usr, 100) - if(WIRE_SAFETY) - A.dont_close_on_dense_objects = !A.dont_close_on_dense_objects - if(!A.density) - A.close() - if(WIRE_TIMING) - A.superspeed = !A.superspeed - if(WIRE_LIGHT) - A.lights = !A.lights - A.update_appearance() - -/obj/machinery/door/airlock/proc/reset_ai_wire() - if(aiControlDisabled == AI_WIRE_DISABLED) - aiControlDisabled = AI_WIRE_NORMAL - else if(aiControlDisabled == AI_WIRE_HACKED) - aiControlDisabled = AI_WIRE_DISABLED_HACKED - -/datum/wires/airlock/on_cut(wire, mend) - var/obj/machinery/door/airlock/A = holder - switch(wire) - if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power. - if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2)) - A.regainMainPower() - else - A.loseMainPower() - if(isliving(usr)) - A.shock(usr, 50) - if(WIRE_BACKUP1, WIRE_BACKUP2) // Cut to loose backup power, repair all to gain backup power. - if(mend && !is_cut(WIRE_BACKUP1) && !is_cut(WIRE_BACKUP2)) - A.regainBackupPower() - else - A.loseBackupPower() - if(isliving(usr)) - A.shock(usr, 50) - if(WIRE_BOLTS) // Cut to drop bolts, mend does nothing. - if(!mend) - A.bolt() - if(WIRE_AI) // Cut to disable WIRE_AI control, mend to re-enable. - if(mend) - if(A.aiControlDisabled == AI_WIRE_DISABLED) // 0 = normal, 1 = locked out, 2 = overridden by WIRE_AI, -1 = previously overridden by WIRE_AI - A.aiControlDisabled = AI_WIRE_NORMAL - else if(A.aiControlDisabled == AI_WIRE_HACKED) - A.aiControlDisabled = AI_WIRE_DISABLED_HACKED - else - if(A.aiControlDisabled == AI_WIRE_NORMAL) - A.aiControlDisabled = AI_WIRE_DISABLED - else if(A.aiControlDisabled == AI_WIRE_DISABLED_HACKED) - A.aiControlDisabled = AI_WIRE_HACKED - if(WIRE_SHOCK) // Cut to shock the door, mend to unshock. - if(mend) - if(A.secondsElectrified) - A.set_electrified(MACHINE_NOT_ELECTRIFIED, usr) - else - if(A.secondsElectrified != MACHINE_ELECTRIFIED_PERMANENT) - A.set_electrified(MACHINE_ELECTRIFIED_PERMANENT, usr) - A.shock(usr, 100) - if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable. - A.dont_close_on_dense_objects = mend - if(WIRE_TIMING) // Cut to disable auto-close, mend to re-enable. - A.autoclose = mend - if(A.autoclose && !A.density) - A.close() - if(WIRE_LIGHT) // Cut to disable lights, mend to re-enable. - A.lights = mend - A.update_appearance() - if(WIRE_ZAP1, WIRE_ZAP2) // Ouch. - if(isliving(usr)) - A.shock(usr, 50) - -/datum/wires/airlock/can_reveal_wires(mob/user) - if(HAS_TRAIT(user, TRAIT_KNOW_ENGI_WIRES)) - return TRUE - - return ..() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 89cbd0d92f4..7cf0761314b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -26,12 +26,6 @@ var/holomap_color = null - ///A var for whether the area allows for detecting fires/etc. Disabled or enabled at a fire alarm. - var/fire_detect = TRUE - ///A list of all fire locks in this area and on the border of this area. - var/list/firedoors - ///A list of all fire alarms in this area OR ADJACENT TO IT - var/list/firealarms ///A list of all air alarms in this area var/list/airalarms ///Alarm type to count of sources. Not usable for ^ because we handle fires differently @@ -96,9 +90,6 @@ var/list/power_usage - /// Wire assignment for airlocks in this area - var/airlock_wires = /datum/wires/airlock - ///This datum, if set, allows terrain generation behavior to be ran on Initialize() var/datum/map_generator/map_generator @@ -276,32 +267,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) QDEL_NULL(alarm_manager) return ..() -/** - * Close and lock a door passed into this proc - * - * Does this need to exist on area? probably not - */ -/area/proc/close_and_lock_door(obj/machinery/door/DOOR) - set waitfor = FALSE - DOOR.close() - if(DOOR.density) - DOOR.lock() - -/** - * Raise a burglar alert for this area - * - * Close and locks all doors in the area and alerts silicon mobs of a break in - * - * Alarm auto resets after 600 ticks - */ -/area/proc/burglaralert(obj/trigger) - if (area_flags & NO_ALERTS) - return - //Trigger alarm effect - communicate_fire_alert(FIRE_RAISED_GENERIC, TRUE) - //Lockdown airlocks - for(var/obj/machinery/door/door in src) - close_and_lock_door(door) /** * Update the icon of the area (overridden to always be null for space @@ -504,14 +469,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) to_chat(H, result.create_tooltip(get_flavor_string())) result.do_skill_sound(H) -///Called by airalarms and firealarms to communicate the status of the area to relevant machines -/area/proc/communicate_fire_alert(code) - for(var/obj/machinery/light/L as anything in lights) - L.update() - - for(var/datum/listener in airalarms + firealarms + firedoors) - SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code) - /area/add_viscontents(atom/A) CRASH("Tried to mutate area vis_contents.") diff --git a/code/game/area/areas/ai_monitored.dm b/code/game/area/areas/ai_monitored.dm index c38027086c1..f88df762703 100644 --- a/code/game/area/areas/ai_monitored.dm +++ b/code/game/area/areas/ai_monitored.dm @@ -14,21 +14,18 @@ /area/station/ai_monitored/aisat/exterior name = "\improper AI Satellite Exterior" icon_state = "ai" - airlock_wires = /datum/wires/airlock/ai holomap_color = HOLOMAP_AREACOLOR_COMMAND /area/station/ai_monitored/command/storage/satellite name = "\improper AI Satellite Maint" icon_state = "ai_storage" ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/ai // Turret protected /area/station/ai_monitored/turret_protected ambientsounds = list('sound/ambience/ambitech.ogg', 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambiatmos.ogg', 'sound/ambience/ambiatmos2.ogg') ///Some sounds (like the space jam) are terrible when on loop. We use this varaible to add it to other AI areas, but override it to keep it from the AI's core. var/ai_will_not_hear_this = list('sound/ambience/ambimalf.ogg') - airlock_wires = /datum/wires/airlock/ai /area/station/ai_monitored/turret_protected/Initialize(mapload) . = ..() @@ -106,7 +103,6 @@ /area/station/ai_monitored/command/nuke_storage name = "\improper Vault" icon_state = "nuke_storage" - airlock_wires = /datum/wires/airlock/command //Security - AI Monitored /area/station/ai_monitored/security @@ -116,7 +112,6 @@ name = "\improper Armory" icon_state = "armory" ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/security /area/station/ai_monitored/security/armory/upper name = "Upper Armory" diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index c208c195732..bf050fb5d34 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -313,7 +313,3 @@ The areas used here are STRICTLY on the CC Z level. /turf/open/lava/plasma/snow_air initial_gas = OPENTURF_LOW_PRESSURE temperature = 180 - -/obj/structure/grille/indestructable - flags_1 = CONDUCT_1 | NODECONSTRUCT_1 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 8aad659a83a..3aada218306 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -16,7 +16,6 @@ area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT flags_1 = NONE ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_SPACE area_lighting = AREA_LIGHTING_STATIC @@ -377,7 +376,6 @@ name = "\improper Abandoned Satellite" ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\ 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg') - airlock_wires = /datum/wires/airlock/engineering //ABANDONED BOX WHITESHIP diff --git a/code/game/area/areas/station.dm b/code/game/area/areas/station.dm index 13529432a2b..6539aeaf93d 100644 --- a/code/game/area/areas/station.dm +++ b/code/game/area/areas/station.dm @@ -12,7 +12,6 @@ name = "Generic Maintenance" ambience_index = AMBIENCE_MAINT area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | SHOW_NAME | PERSISTENT_ENGRAVINGS - airlock_wires = /datum/wires/airlock/maint sound_environment = SOUND_AREA_TUNNEL_ENCLOSED forced_ambience = TRUE ambient_buzz = 'sound/ambience/source_corridor2.ogg' @@ -358,7 +357,6 @@ name = "Command" icon_state = "Bridge" ambientsounds = list('sound/ambience/signal.ogg') - airlock_wires = /datum/wires/airlock/command sound_environment = SOUND_AREA_STANDARD_STATION holomap_color = HOLOMAP_AREACOLOR_COMMAND @@ -551,7 +549,6 @@ //Service /area/station/service - airlock_wires = /datum/wires/airlock/service holomap_color = HOLOMAP_AREACOLOR_GENERIC_ROOM /area/station/service/cafeteria @@ -578,7 +575,6 @@ /area/station/service/bar name = "\improper Bar" icon_state = "bar" - airlock_wires = /datum/wires/airlock/service sound_environment = SOUND_AREA_WOODFLOOR /area/station/service/bar/Initialize(mapload) @@ -690,7 +686,6 @@ /area/station/service/hydroponics name = "Hydroponics" icon_state = "hydro" - airlock_wires = /datum/wires/airlock/service sound_environment = SOUND_AREA_STANDARD_STATION /area/station/service/hydroponics/upper @@ -714,7 +709,6 @@ /area/station/engineering ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_LARGE_ENCLOSED holomap_color = HOLOMAP_AREACOLOR_ENGINEERING @@ -852,7 +846,6 @@ area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT flags_1 = NONE ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_SPACE /area/station/solars/fore @@ -937,7 +930,6 @@ name = "\improper Ward" icon_state = "medbay" ambience_index = AMBIENCE_MEDICAL - airlock_wires = /datum/wires/airlock/medbay sound_environment = SOUND_AREA_STANDARD_STATION min_ambience_cooldown = 90 SECONDS max_ambience_cooldown = 180 SECONDS @@ -1087,7 +1079,6 @@ name = "Security" icon_state = "security" ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/security sound_environment = SOUND_AREA_STANDARD_STATION holomap_color = HOLOMAP_AREACOLOR_SECURITY @@ -1279,7 +1270,6 @@ /area/station/cargo name = "Quartermasters" icon_state = "quart" - airlock_wires = /datum/wires/airlock/service sound_environment = SOUND_AREA_STANDARD_STATION holomap_color = HOLOMAP_AREACOLOR_CARGO @@ -1358,7 +1348,6 @@ /area/station/science name = "\improper Science Division" icon_state = "science" - airlock_wires = /datum/wires/airlock/science sound_environment = SOUND_AREA_STANDARD_STATION holomap_color = HOLOMAP_AREACOLOR_SCIENCE @@ -1464,7 +1453,6 @@ holomap_color = HOLOMAP_AREACOLOR_COMMAND ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg', 'sound/ambience/ambitech.ogg',\ 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg') - airlock_wires = /datum/wires/airlock/engineering /area/station/tcommsat/computer name = "\improper Telecomms Control Room" diff --git a/code/game/area/areas_new/arrival.dm b/code/game/area/areas_new/arrival.dm new file mode 100644 index 00000000000..4decfc7759b --- /dev/null +++ b/code/game/area/areas_new/arrival.dm @@ -0,0 +1,4 @@ +/area/arrivals + name = "(DO NOT USE)" + +/area/arrivals/arrival diff --git a/code/game/atom/atoms.dm b/code/game/atom/atoms.dm index eb8c1eabb65..e7c9b638b07 100644 --- a/code/game/atom/atoms.dm +++ b/code/game/atom/atoms.dm @@ -1112,21 +1112,6 @@ TYPEINFO_DEF(/atom) /atom/proc/emag_act(mob/user, obj/item/card/emag/emag_card) SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT, user, emag_card) - -///Return the values you get when an RCD eats you? -/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - return FALSE - - -/** - * Respond to an RCD acting on our item - * - * Default behaviour is to send [COMSIG_ATOM_RCD_ACT] and return FALSE - */ -/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) - return FALSE - /** * Respond to an electric bolt action on our item * diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 57bfa125e44..ad81a2d2ba5 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -439,44 +439,6 @@ Diagnostic HUDs! set_hud_image_vars(DIAG_TRACK_HUD, "hudtrackingai") set_hud_image_active(DIAG_TRACK_HUD) -/*~~~~~~~~~~~~~~~~~~~~ - BIG STOMPY MECHS -~~~~~~~~~~~~~~~~~~~~~*/ -/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechhealth() - set_hud_image_vars(DIAG_MECH_HUD, "huddiag[RoundDiagBar(atom_integrity/max_integrity)]") - - -/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechcell() - var/new_state - if(cell) - var/chargelvl = cell.charge/cell.maxcharge - new_state = "hudbatt[RoundDiagBar(chargelvl)]" - else - new_state = "hudnobatt" - - set_hud_image_vars(DIAG_BATT_HUD, new_state) - -/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat() - if(internal_damage) - set_hud_image_vars(DIAG_STAT_HUD, "hudwarn") - set_hud_image_active(DIAG_STAT_HUD) - return - - set_hud_image_vars(DIAG_STAT_HUD, null) - set_hud_image_inactive(DIAG_STAT_HUD) - -///Shows tracking beacons on the mech -/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechtracking() - var/new_icon_state //This var exists so that the holder's icon state is set only once in the event of multiple mech beacons. - for(var/obj/item/mecha_parts/mecha_tracking/T in trackers) - if(T.ai_beacon) //Beacon with AI uplink - new_icon_state = "hudtrackingai" - break //Immediately terminate upon finding an AI beacon to ensure it is always shown over the normal one, as mechs can have several trackers. - else - new_icon_state = "hudtracking" - - set_hud_image_vars(DIAG_TRACK_HUD, new_icon_state) - /*~~~~~~~~~ Bots! ~~~~~~~~~~*/ @@ -525,14 +487,3 @@ Diagnostic HUDs! new_state = "hudnobatt" set_hud_image_vars(DIAG_BATT_HUD, new_state) - -/*~~~~~~~~~~~~ - Airlocks! -~~~~~~~~~~~~~*/ -/obj/machinery/door/airlock/proc/diag_hud_set_electrified() - if(secondsElectrified == MACHINE_NOT_ELECTRIFIED) - set_hud_image_inactive(DIAG_AIRLOCK_HUD) - return - - set_hud_image_vars(DIAG_AIRLOCK_HUD, "electrified") - set_hud_image_active(DIAG_AIRLOCK_HUD) diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 1dd725734df..772fd0809a8 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -1,99 +1,5 @@ #define AIRLOCK_CONTROL_RANGE 5 -// This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access) -/obj/machinery/door/airlock - /// The current state of the airlock, used to construct the airlock overlays - var/airlock_state - var/frequency - var/datum/radio_frequency/radio_connection - - -/obj/machinery/door/airlock/receive_signal(datum/signal/signal) - SHOULD_CALL_PARENT(FALSE) //TODO: RECONCILE TAGS AND NETIDS - if(!signal) - return - - if(id_tag != signal.data["tag"] || !signal.data["command"]) - return - - switch(signal.data["command"]) - if("open") - open(TRUE) - - if("close") - close(TRUE) - - if("unlock") - locked = FALSE - update_appearance() - - if("lock") - locked = TRUE - update_appearance() - - if("secure_open") - secure_open() - return - - if("secure_close") - secure_close() - return - - send_status() - -/obj/machinery/door/airlock/proc/secure_close() - set waitfor = FALSE - locked = FALSE - close(TRUE) - locked = TRUE - sleep(2) - update_appearance() - send_status() - -/obj/machinery/door/airlock/proc/secure_open() - set waitfor = FALSE - locked = FALSE - update_appearance() - sleep(2) - open(TRUE) - locked = TRUE - update_appearance() - send_status() - -/obj/machinery/door/airlock/proc/send_status() - if(radio_connection) - var/datum/signal/signal = new(src, list( - "tag" = id_tag, - "timestamp" = world.time, - "door_status" = density ? "closed" : "open", - "lock_status" = locked ? "locked" : "unlocked" - )) - radio_connection.post_signal(signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) - - -/obj/machinery/door/airlock/open(surpress_send) - . = ..() - if(!surpress_send) - send_status() - - -/obj/machinery/door/airlock/close(surpress_send) - . = ..() - if(!surpress_send) - send_status() - - -/obj/machinery/door/airlock/proc/set_frequency(new_frequency) - SSpackets.remove_object(src, frequency) - if(new_frequency) - frequency = new_frequency - radio_connection = SSpackets.add_object(src, frequency, RADIO_AIRLOCK) - -/obj/machinery/door/airlock/Destroy() - if(frequency) - SSpackets.remove_object(src,frequency) - return ..() - /obj/machinery/airlock_sensor icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_sensor_off" diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index b96f07b55af..0cecfcb610e 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -441,13 +441,7 @@ /datum/design/welding_helmet, /datum/design/cable_coil, /datum/design/apc_board, - /datum/design/airlock_board, - /datum/design/firelock_board, /datum/design/airalarm_electronics, - /datum/design/firealarm_electronics, - /datum/design/airlock_painter, - /datum/design/airlock_painter/decal, - /datum/design/airlock_painter/decal/tile, /datum/design/paint_sprayer, /datum/design/emergency_oxygen, /datum/design/iron, @@ -508,7 +502,6 @@ /datum/design/plastic_box, /datum/design/sticky_tape, /datum/design/chisel, - /datum/design/control, /datum/design/paperroll, /datum/design/beacon, /datum/design/plasticducky, @@ -516,4 +509,3 @@ /datum/design/oven_tray, /datum/design/data, ) - diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm deleted file mode 100644 index a3bfd4b7541..00000000000 --- a/code/game/machinery/buttons.dm +++ /dev/null @@ -1,338 +0,0 @@ -TYPEINFO_DEF(/obj/machinery/button) - default_armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 90, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, FIRE = 90, ACID = 70) - -/obj/machinery/button - name = "button" - desc = "A remote control switch." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "doorctrl" - var/skin = "doorctrl" - power_channel = AREA_USAGE_ENVIRON - var/obj/item/assembly/device - var/obj/item/electronics/airlock/board - var/device_type = null - var/id = null - var/initialized_button = 0 - var/silicon_access_disabled = FALSE - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.02 - resistance_flags = LAVA_PROOF | FIRE_PROOF - var/light_mask = "button-light-mask" - -/obj/machinery/button/indestructible - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0) - . = ..() - if(built) - setDir(ndir) - panel_open = TRUE - update_appearance() - AddComponent(/datum/component/wall_mounted, CALLBACK(src, PROC_REF(deconstruct), FALSE)) - - if(!built && !device && device_type) - device = new device_type(src) - - src.check_access(null) - - if(req_access.len || req_one_access.len) - board = new(src) - if(req_access.len) - board.accesses = req_access - else - board.one_access = 1 - board.accesses = req_one_access - - setup_device() - -/obj/machinery/button/update_icon_state() - if(panel_open) - icon_state = "button-open" - return ..() - if(machine_stat & (NOPOWER|BROKEN)) - icon_state = "[skin]-p" - return ..() - icon_state = skin - return ..() - -/obj/machinery/button/update_overlays() - . = ..() - if(!panel_open) - if(light_mask && !(machine_stat & (NOPOWER|BROKEN))) - . += emissive_appearance(icon, light_mask) - return - if(device) - . += "button-device" - if(board) - . += "button-board" - -/obj/machinery/button/screwdriver_act(mob/living/user, obj/item/tool) - if(panel_open || allowed(user)) - default_deconstruction_screwdriver(user, "button-open", "[skin]", tool) - update_appearance() - else - to_chat(user, span_alert("Maintenance Access Denied.")) - z_flick("[skin]-denied", src) - - return TRUE - -/obj/machinery/button/attackby(obj/item/W, mob/living/user, params) - if(panel_open) - if(!device && istype(W, /obj/item/assembly)) - if(!user.transferItemToLoc(W, src)) - to_chat(user, span_warning("\The [W] is stuck to you!")) - return - device = W - to_chat(user, span_notice("You add [W] to the button.")) - - if(!board && istype(W, /obj/item/electronics/airlock)) - if(!user.transferItemToLoc(W, src)) - to_chat(user, span_warning("\The [W] is stuck to you!")) - return - board = W - if(board.one_access) - req_one_access = board.accesses - else - req_access = board.accesses - to_chat(user, span_notice("You add [W] to the button.")) - - if(!device && !board && W.tool_behaviour == TOOL_WRENCH) - to_chat(user, span_notice("You start unsecuring the button frame...")) - W.play_tool_sound(src) - if(W.use_tool(src, user, 40)) - to_chat(user, span_notice("You unsecure the button frame.")) - transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src))) - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - qdel(src) - - update_appearance() - return - - if(!user.combat_mode && !(W.item_flags & NOBLUDGEON)) - return attack_hand(user) - else - return ..() - -/obj/machinery/button/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - req_access = list() - req_one_access = list() - playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - obj_flags |= EMAGGED - -/obj/machinery/button/attack_ai(mob/user) - if(!silicon_access_disabled && !panel_open) - return attack_hand(user) - -/obj/machinery/button/attack_robot(mob/user) - return attack_ai(user) - -/obj/machinery/button/proc/setup_device() - if(id && istype(device, /obj/item/assembly/control)) - var/obj/item/assembly/control/A = device - A.id = id - initialized_button = 1 - -/obj/machinery/button/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) - if(id) - id = "[port.id]_[id]" - setup_device() - -/obj/machinery/button/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(!initialized_button) - setup_device() - add_fingerprint(user) - if(panel_open) - if(device || board) - if(device) - device.forceMove(drop_location()) - device = null - if(board) - board.forceMove(drop_location()) - req_access = list() - req_one_access = list() - board = null - update_appearance() - to_chat(user, span_notice("You remove electronics from the button frame.")) - - else - if(skin == "doorctrl") - skin = "launcher" - else - skin = "doorctrl" - to_chat(user, span_notice("You change the button frame's front panel.")) - return - - if((machine_stat & (NOPOWER|BROKEN))) - return - - if(device && device.next_activate > world.time) - return - - if(!allowed(user)) - to_chat(user, span_alert("Access Denied.")) - z_flick("[skin]-denied", src) - return - - use_power(5) - icon_state = "[skin]1" - - if(device) - device.pulsed() - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_BUTTON_PRESSED,src) - - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), 15) - -/obj/machinery/button/door - name = "door button" - desc = "A door remote control switch." - var/normaldoorcontrol = FALSE - var/specialfunctions = OPEN // Bitflag, see assembly file - var/sync_doors = TRUE - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) - -/obj/machinery/button/door/indestructible - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/button/door/setup_device() - if(!device) - if(normaldoorcontrol) - var/obj/item/assembly/control/airlock/A = new(src) - A.specialfunctions = specialfunctions - device = A - else - var/obj/item/assembly/control/C = new(src) - C.sync_doors = sync_doors - device = C - ..() - -/obj/machinery/button/door/incinerator_vent_ordmix - name = "combustion chamber vent control" - id = INCINERATOR_ORDMIX_VENT - req_access = list(ACCESS_ORDNANCE) - -/obj/machinery/button/door/incinerator_vent_atmos_main - name = "turbine vent control" - id = INCINERATOR_ATMOS_MAINVENT - req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) - -/obj/machinery/button/door/incinerator_vent_atmos_aux - name = "combustion chamber vent control" - id = INCINERATOR_ATMOS_AUXVENT - req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) - -/obj/machinery/button/door/atmos_test_room_mainvent_1 - name = "test chamber 1 vent control" - id = TEST_ROOM_ATMOS_MAINVENT_1 - req_one_access = list(ACCESS_ATMOSPHERICS) - -/obj/machinery/button/door/atmos_test_room_mainvent_2 - name = "test chamber 2 vent control" - id = TEST_ROOM_ATMOS_MAINVENT_2 - req_one_access = list(ACCESS_ATMOSPHERICS) - -/obj/machinery/button/massdriver - name = "mass driver button" - desc = "A remote control switch for a mass driver." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/massdriver - -/obj/machinery/button/massdriver/indestructible - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/button/ignition - name = "ignition switch" - desc = "A remote control switch for a mounted igniter." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/igniter - -/obj/machinery/button/ignition/indestructible - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/button/ignition/incinerator - name = "combustion chamber ignition switch" - desc = "A remote control switch for the combustion chamber's igniter." - -/obj/machinery/button/ignition/incinerator/ordmix - id = INCINERATOR_ORDMIX_IGNITER - -/obj/machinery/button/ignition/incinerator/atmos - id = INCINERATOR_ATMOS_IGNITER - -/obj/machinery/button/flasher - name = "flasher button" - desc = "A remote control switch for a mounted flasher." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/flasher - -/obj/machinery/button/curtain - name = "curtain button" - desc = "A remote control switch for a mechanical curtain." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/curtain - -/obj/machinery/button/flasher/indestructible - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/button/crematorium - name = "crematorium igniter" - desc = "Burn baby burn!" - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/crematorium - req_access = list() - id = 1 - -/obj/machinery/button/crematorium/indestructible - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -TYPEINFO_DEF(/obj/item/wallframe/button) - default_materials = list(/datum/material/steel=MINERAL_MATERIAL_AMOUNT) - -/obj/item/wallframe/button - name = "button frame" - desc = "Used for building buttons." - icon_state = "button" - result_path = /obj/machinery/button - pixel_shift = 24 - -/obj/machinery/button/elevator - name = "elevator button" - desc = "Go back. Go back. Go back. Can you operate the elevator." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/elevator - req_access = list() - id = 1 - -/obj/machinery/button/elevator/examine(mob/user) - . = ..() - . += span_notice("There's a small inscription on the button...") - . += span_notice("THIS CALLS THE ELEVATOR! IT DOES NOT OPERATE IT! Interact with the elevator itself to use it!") - -/obj/machinery/button/tram - name = "tram caller" - desc = "A button for calling the tram. It has a speakerbox in it with some internals." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/tram - req_access = list() - id = 1 - -/obj/machinery/button/tram/setup_device() - var/obj/item/assembly/control/tram/tram_device = device - tram_device.initial_id = id - . = ..() - -/obj/machinery/button/tram/examine(mob/user) - . = ..() - . += span_notice("There's a small inscription on the button...") - . += span_notice("THIS CALLS THE TRAM! IT DOES NOT OPERATE IT! The console on the tram tells it where to go!") diff --git a/code/game/machinery/computer/arena.dm b/code/game/machinery/computer/arena.dm index 56bcac610cc..7ea8215ce54 100644 --- a/code/game/machinery/computer/arena.dm +++ b/code/game/machinery/computer/arena.dm @@ -249,13 +249,6 @@ /obj/machinery/computer/arena/proc/set_doors(closed = FALSE) - for(var/obj/machinery/door/poddoor/D in INSTANCES_OF(/obj/machinery/door)) //I really dislike pathing of these - if(D.id != arena_id) - continue - if(closed) - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - else - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, open)) /obj/machinery/computer/arena/Topic(href, href_list) if(..()) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index d6b9d5c7f9e..8fccf1f7800 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -393,21 +393,6 @@ state = STATE_MAIN playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) - if ("toggleEmergencyAccess") - if(emergency_access_cooldown(usr)) //if were in cooldown, dont allow the following code - return - if (!authenticated_as_silicon_or_captain(usr)) - return - if (GLOB.emergency_access) - revoke_maint_all_access() - log_game("[key_name(usr)] disabled emergency maintenance access.") - message_admins("[ADMIN_LOOKUPFLW(usr)] disabled emergency maintenance access.") - deadchat_broadcast(" disabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) - else - make_maint_all_access() - log_game("[key_name(usr)] enabled emergency maintenance access.") - message_admins("[ADMIN_LOOKUPFLW(usr)] enabled emergency maintenance access.") - deadchat_broadcast(" enabled emergency maintenance access at [span_name("[get_area_name(usr, TRUE)]")].", span_name("[usr.real_name]"), usr, message_type = DEADCHAT_ANNOUNCEMENT) // Request codes for the Captain's Spare ID safe. if("requestSafeCodes") if(SSjob.assigned_captain) @@ -539,7 +524,6 @@ if (authenticated_as_silicon_or_captain(user)) data["canToggleEmergencyAccess"] = TRUE - data["emergencyAccess"] = GLOB.emergency_access data["alertLevelTick"] = alert_level_tick data["canMakeAnnouncement"] = TRUE diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 29374496681..339c8155917 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -45,21 +45,12 @@ say("Cannot locate mass driver connector. Cancelling firing sequence!") return - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - M.open() - sleep(20) for(var/obj/machinery/mass_driver/M in range(range, src)) if(M.id == id) M.power = connected.power M.drive() - sleep(50) - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - M.close() - /obj/machinery/computer/pod/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -77,10 +68,6 @@ data["timing"] = timing data["power"] = connected ? connected.power : 0.25 data["poddoor"] = FALSE - for(var/obj/machinery/door/poddoor/door in range(range, src)) - if(door.id == id) - data["poddoor"] = TRUE - break return data /obj/machinery/computer/pod/ui_act(action, list/params) @@ -121,14 +108,6 @@ value = round(time + value) time = clamp(value, 0, 120) return TRUE - if("door") - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - if(M.density) - M.open() - else - M.close() - return TRUE if("driver_test") for(var/obj/machinery/mass_driver/M in range(range, src)) if(M.id == id) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm deleted file mode 100644 index 6ca6a0aa3bc..00000000000 --- a/code/game/machinery/doors/airlock.dm +++ /dev/null @@ -1,1663 +0,0 @@ -/* - New methods: - pulse - sends a pulse into a wire for hacking purposes - cut - cuts a wire and makes any necessary state changes - mend - mends a wire and makes any necessary state changes - canAIControl - 1 if the AI can control the airlock, 0 if not (then check canAIHack to see if it can hack in) - canAIHack - 1 if the AI can hack into the airlock to recover control, 0 if not. Also returns 0 if the AI does not *need* to hack it. - hasPower - 1 if the main or backup power are functioning, 0 if not. - requiresIDs - 1 if the airlock is requiring IDs, 0 if not - isAllPowerCut - 1 if the main and backup power both have cut wires. - regainMainPower - handles the effect of main power coming back on. - loseMainPower - handles the effect of main power going offline. Usually (if one isn't already running) spawn a thread to count down how long it will be offline - counting down won't happen if main power was completely cut along with backup power, though, the thread will just sleep. - loseBackupPower - handles the effect of backup power going offline. - regainBackupPower - handles the effect of main power coming back on. - shock - has a chance of electrocuting its target. - isSecure - 1 if there some form of shielding in front of the airlock wires. -*/ - -/// Overlay cache. Why isn't this just in /obj/machinery/door/airlock? Because its used just a -/// tiny bit in door_assembly.dm Refactored so you don't have to make a null copy of airlock -/// to get to the damn thing -/// Someone, for the love of god, profile this. Is there a reason to cache mutable_appearance -/// if so, why are we JUST doing the airlocks when we can put this in mutable_appearance.dm for -/// everything -/proc/get_airlock_overlay(icon_state, icon_file, em_block, color) - var/static/list/airlock_overlays = list() - - var/base_icon_key = "[icon_state][icon_file][color]" - if(!(. = airlock_overlays[base_icon_key])) - var/mutable_appearance/airlock_overlay = mutable_appearance(icon_file, icon_state) - if(color) - airlock_overlay.color = color - . = airlock_overlays[base_icon_key] = airlock_overlay - if(isnull(em_block)) - return - - var/em_block_key = "[base_icon_key][em_block]" - var/mutable_appearance/em_blocker = airlock_overlays[em_block_key] - if(!em_blocker) - em_blocker = airlock_overlays[em_block_key] = mutable_appearance(icon_file, icon_state, plane = EMISSIVE_PLANE, appearance_flags = EMISSIVE_APPEARANCE_FLAGS) - em_blocker.color = em_block ? GLOB.em_block_color : GLOB.emissive_color - - return list(., em_blocker) - -// Before you say this is a bad implmentation, look at what it was before then ask yourself -// "Would this be better with a global var" - -// Wires for the airlock are located in the datum folder, inside the wires datum folder. - -#define AIRLOCK_CLOSED 1 -#define AIRLOCK_CLOSING 2 -#define AIRLOCK_OPEN 3 -#define AIRLOCK_OPENING 4 -#define AIRLOCK_DENY 5 -#define AIRLOCK_EMAG 6 - -#define AIRLOCK_FRAME_CLOSED "closed" -#define AIRLOCK_FRAME_CLOSING "closing" -#define AIRLOCK_FRAME_OPEN "open" -#define AIRLOCK_FRAME_OPENING "opening" - -#define AIRLOCK_LIGHT_BOLTS "bolts" -#define AIRLOCK_LIGHT_EMERGENCY "emergency" -#define AIRLOCK_LIGHT_DENIED "denied" -#define AIRLOCK_LIGHT_CLOSING "closing" -#define AIRLOCK_LIGHT_OPENING "opening" - -#define AIRLOCK_SECURITY_NONE 0 //Normal airlock //Wires are not secured -#define AIRLOCK_SECURITY_IRON 1 //Medium security airlock //There is a simple iron plate over wires (use welder) -#define AIRLOCK_SECURITY_PLASTEEL_I_S 2 //Sliced inner plating (use crowbar), jumps to 0 -#define AIRLOCK_SECURITY_PLASTEEL_I 3 //Removed outer plating, second layer here (use welder) -#define AIRLOCK_SECURITY_PLASTEEL_O_S 4 //Sliced outer plating (use crowbar) -#define AIRLOCK_SECURITY_PLASTEEL_O 5 //There is first layer of plasteel (use welder) -#define AIRLOCK_SECURITY_PLASTEEL 6 //Max security airlock //Fully secured wires (use wirecutters to remove grille, that is electrified) - -#define AIRLOCK_INTEGRITY_N 300 // Normal airlock integrity -#define AIRLOCK_INTEGRITY_MULTIPLIER 1.5 // How much reinforced doors health increases -/// How much extra health airlocks get when braced with a seal -#define AIRLOCK_SEAL_MULTIPLIER 2 - -// Airlocks ignore damage below this value -#define AIRLOCK_DAMAGE_DEFLECTION_N (/obj/item/wrench::force) -/// Reinforced airlocks ignore damage below this value -#define AIRLOCK_DAMAGE_DEFLECTION_R (/obj/item/storage/toolbox::force) - -#define AIRLOCK_DENY_ANIMATION_TIME (0.6 SECONDS) /// The amount of time for the airlock deny animation to show - -#define DOOR_VISION_DISTANCE 11 ///The maximum distance a door will see out to - -/obj/machinery/door/airlock - name = "airlock" - desc = "An air-tight mechanical door." - icon = 'icons/obj/doors/airlocks/station/airlock.dmi' - icon_state = "closed" - - flags_1 = HTML_USE_INITAL_ICON_1 - rad_insulation = RAD_MEDIUM_INSULATION - - max_integrity = 300 - - var/normal_integrity = AIRLOCK_INTEGRITY_N - integrity_failure = 0.25 - damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N - - autoclose = TRUE - secondsElectrified = MACHINE_NOT_ELECTRIFIED //How many seconds remain until the door is no longer electrified. -1/MACHINE_ELECTRIFIED_PERMANENT = permanently electrified until someone fixes it. - - assemblytype = /obj/structure/door_assembly - explosion_block = 1 - hud_possible = list(DIAG_AIRLOCK_HUD = 'icons/mob/huds/hud.dmi') - zmm_flags = ZMM_MANGLE_PLANES - smoothing_groups = SMOOTH_GROUP_AIRLOCK - - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - blocks_emissive = NONE // Custom emissive blocker. We don't want the normal behavior. - align_to_windows = TRUE - door_align_type = /obj/machinery/door/airlock - - ///what airlock assembly mineral plating was applied to - var/previous_airlock = /obj/structure/door_assembly - - var/security_level = 0 //How much are wires secured - var/aiControlDisabled = AI_WIRE_NORMAL //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - var/hackProof = FALSE // if true, this door can't be hacked by the AI - var/secondsMainPowerLost = 0 //The number of seconds until power is restored. - var/secondsBackupPowerLost = 0 //The number of seconds until power is restored. - var/spawnPowerRestoreRunning = FALSE - var/lights = TRUE // bolt lights show by default - var/aiDisabledIdScanner = FALSE - var/aiHacking = FALSE - - var/detonated = FALSE - var/abandoned = FALSE - var/cutAiWire = FALSE - var/autoname = FALSE - var/superspeed = FALSE - - // Sounds - var/doorOpen = 'sound/machines/doors/airlock_open.ogg' - var/doorClose = 'sound/machines/doors/airlock_close.ogg' - var/doorDeni = 'sound/machines/deniedbeep.ogg' // i'm thinkin' Deni's - var/boltUp = 'sound/machines/boltsup.ogg' - var/boltDown = 'sound/machines/boltsdown.ogg' - var/noPower = 'sound/machines/doorclick.ogg' - var/forcedOpen = 'sound/machines/doors/airlock_open_force.ogg' - var/forcedClosed = 'sound/machines/doors/airlock_close_force.ogg' - - // Appearance stuff - var/stripe_overlays = 'icons/obj/doors/airlocks/station/airlock_stripe.dmi' - var/color_overlays = 'icons/obj/doors/airlocks/station/airlock_color.dmi' - var/glass_fill_overlays = 'icons/obj/doors/airlocks/station/glass_overlays.dmi' - var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - var/note_overlay_file = 'icons/obj/doors/airlocks/station/note_overlays.dmi' //Used for papers and photos pinned to the airlock - var/has_fill_overlays = TRUE - - // Paint - var/airlock_paint - var/stripe_paint - - // Cycle linking - var/cyclelinkeddir = 0 - /// Cyclelinking for airlocks that aren't on the same x or y coord as the target. - var/closeOtherId //Cyclelinking for airlocks that aren't on the same x or y coord as the target. - /// TRUE means the door will automatically close the next time it's opened. - var/delayed_close_requested = FALSE - var/obj/machinery/door/airlock/cyclelinkedairlock - var/obj/machinery/door/airlock/closeOther - var/list/obj/machinery/door/airlock/close_others = list() - - /// Electronics ref - var/obj/item/electronics/airlock/electronics - - var/shuttledocked = 0 - var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close - var/prying_so_hard = FALSE - - COOLDOWN_DECLARE(shockCooldown) - /// Paper pinned to the airlock - var/obj/item/note - /// The seal on the airlock - var/obj/item/seal - -/obj/machinery/door/airlock/Initialize(mapload) - . = ..() - wires = set_wires() - if(frequency) - set_frequency(frequency) - - if(security_level > AIRLOCK_SECURITY_IRON) - atom_integrity = normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER - max_integrity = normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER - else - atom_integrity = normal_integrity - max_integrity = normal_integrity - - if(damage_deflection == AIRLOCK_DAMAGE_DEFLECTION_N && security_level > AIRLOCK_SECURITY_IRON) - damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R - - prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) - diag_hud_set_electrified() - - RegisterSignal(src, COMSIG_MACHINERY_BROKEN, PROC_REF(on_break)) - - // Click on the floor to close airlocks - var/static/list/connections = list( - COMSIG_ATOM_ATTACK_HAND = PROC_REF(on_attack_hand) - ) - AddElement(/datum/element/connect_loc, connections) - - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/door/airlock/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) - if(id_tag) - id_tag = "[port.id]_[id_tag]" - -/obj/machinery/door/airlock/proc/update_other_id() - for(var/obj/machinery/door/airlock/Airlock in INSTANCES_OF(/obj/machinery/door)) - if(Airlock.closeOtherId == closeOtherId && Airlock != src) - if(!(Airlock in close_others)) - close_others += Airlock - if(!(src in Airlock.close_others)) - Airlock.close_others += src - -/obj/machinery/door/airlock/proc/cyclelinkairlock() - if (cyclelinkedairlock) - cyclelinkedairlock.cyclelinkedairlock = null - cyclelinkedairlock = null - if (!cyclelinkeddir) - return - var/limit = DOOR_VISION_DISTANCE - var/turf/T = get_turf(src) - var/obj/machinery/door/airlock/FoundDoor - do - T = get_step(T, cyclelinkeddir) - FoundDoor = locate() in T - if (FoundDoor && FoundDoor.cyclelinkeddir != get_dir(FoundDoor, src)) - FoundDoor = null - limit-- - while(!FoundDoor && limit) - if (!FoundDoor) - log_mapping("[src] at [AREACOORD(src)] failed to find a valid airlock to cyclelink with!") - return - FoundDoor.cyclelinkedairlock = src - cyclelinkedairlock = FoundDoor - -/obj/machinery/door/airlock/vv_edit_var(var_name) - . = ..() - switch (var_name) - if (NAMEOF(src, cyclelinkeddir)) - cyclelinkairlock() - -/obj/machinery/door/airlock/lock() - bolt() - -/obj/machinery/door/airlock/proc/bolt() - if(locked) - return - set_bolt(TRUE) - playsound(src,boltDown,30,FALSE,3) - audible_message(span_hear("You hear a click from the bottom of the door."), null, 1) - update_appearance() - -/obj/machinery/door/airlock/proc/set_bolt(should_bolt) - if(locked == should_bolt) - return - SEND_SIGNAL(src, COMSIG_AIRLOCK_SET_BOLT, should_bolt) - . = locked - locked = should_bolt - -/obj/machinery/door/airlock/unlock() - unbolt() - -/obj/machinery/door/airlock/proc/unbolt() - if(!locked) - return - set_bolt(FALSE) - playsound(src,boltUp,30,FALSE,3) - audible_message(span_hear("You hear a click from the bottom of the door."), null, 1) - update_appearance() - -/obj/machinery/door/airlock/Destroy() - QDEL_NULL(wires) - QDEL_NULL(electronics) - if (cyclelinkedairlock) - if (cyclelinkedairlock.cyclelinkedairlock == src) - cyclelinkedairlock.cyclelinkedairlock = null - cyclelinkedairlock = null - if(close_others) //remove this airlock from the list of every linked airlock - closeOtherId = null - for(var/obj/machinery/door/airlock/otherlock as anything in close_others) - otherlock.close_others -= src - close_others.Cut() - if(id_tag) - for(var/obj/machinery/door_buttons/D as anything in INSTANCES_OF(/obj/machinery/door_buttons)) - D.removeMe(src) - QDEL_NULL(note) - QDEL_NULL(seal) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.remove_atom_from_hud(src) - return ..() - -/obj/machinery/door/airlock/handle_atom_del(atom/A) - if(A == note) - note = null - update_appearance() - if(A == seal) - seal = null - update_appearance() - -/obj/machinery/door/airlock/bumpopen(mob/living/user) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite - if(!issilicon(usr)) - if(isElectrified() && shock(user, 100, user.get_empty_held_index() ? SHOCK_HANDS : SHOCK_USE_AVG_SIEMENS)) - return - else if(user.hallucinating() && iscarbon(user) && prob(1) && !operating) - var/mob/living/carbon/C = user - if(!C.wearing_shock_proof_gloves()) - new /datum/hallucination/shock(C) - return - ..() - -/obj/machinery/door/airlock/proc/isElectrified() - return (secondsElectrified != MACHINE_NOT_ELECTRIFIED) - -/obj/machinery/door/airlock/proc/canAIControl(mob/user) - return ((aiControlDisabled != AI_WIRE_DISABLED) && !isAllPowerCut()) - -/obj/machinery/door/airlock/proc/canAIHack() - return ((aiControlDisabled==AI_WIRE_DISABLED) && (!hackProof) && (!isAllPowerCut())); - -/obj/machinery/door/airlock/hasPower() - return ((!secondsMainPowerLost || !secondsBackupPowerLost) && !(machine_stat & NOPOWER)) - -/obj/machinery/door/airlock/requiresID() - return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) - -/obj/machinery/door/airlock/proc/isAllPowerCut() - if((wires.is_cut(WIRE_POWER1) || wires.is_cut(WIRE_POWER2)) && (wires.is_cut(WIRE_BACKUP1) || wires.is_cut(WIRE_BACKUP2))) - return TRUE - -/obj/machinery/door/airlock/proc/regainMainPower() - if(secondsMainPowerLost > 0) - secondsMainPowerLost = 0 - update_appearance() - -/obj/machinery/door/airlock/proc/handlePowerRestore() - var/cont = TRUE - while (cont) - sleep(10) - if(QDELETED(src)) - return - cont = FALSE - if(secondsMainPowerLost>0) - if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) - secondsMainPowerLost -= 1 - cont = TRUE - if(secondsBackupPowerLost>0) - if(!wires.is_cut(WIRE_BACKUP1) && !wires.is_cut(WIRE_BACKUP2)) - secondsBackupPowerLost -= 1 - cont = TRUE - spawnPowerRestoreRunning = FALSE - update_appearance() - -/obj/machinery/door/airlock/proc/loseMainPower() - if(secondsMainPowerLost <= 0) - secondsMainPowerLost = 60 - if(secondsBackupPowerLost < 10) - secondsBackupPowerLost = 10 - if(!spawnPowerRestoreRunning) - spawnPowerRestoreRunning = TRUE - INVOKE_ASYNC(src, PROC_REF(handlePowerRestore)) - update_appearance() - -/obj/machinery/door/airlock/proc/loseBackupPower() - if(secondsBackupPowerLost < 60) - secondsBackupPowerLost = 60 - if(!spawnPowerRestoreRunning) - spawnPowerRestoreRunning = TRUE - INVOKE_ASYNC(src, PROC_REF(handlePowerRestore)) - update_appearance() - -/obj/machinery/door/airlock/proc/regainBackupPower() - if(secondsBackupPowerLost > 0) - secondsBackupPowerLost = 0 - update_appearance() - -// shock user with probability prb (if all connections & power are working) -// returns TRUE if shocked, FALSE otherwise -// The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/proc/shock(mob/living/user, prb, shock_flags = SHOCK_HANDS) - if(!istype(user) || !hasPower()) // unpowered, no shock - return FALSE - - if(!COOLDOWN_FINISHED(src, shockCooldown)) - return FALSE //Already shocked someone recently? - - if(!prob(prb)) - return FALSE //you lucked out, no shock for you - - do_sparks(5, TRUE, src) - - if(electrocute_mob(user, get_area(src), src, 1, TRUE, shock_flags = shock_flags)) - COOLDOWN_START(src, shockCooldown, 1 SECONDS) - return TRUE - else - return FALSE - -/obj/machinery/door/airlock/proc/is_secure() - return (security_level > 0) - -/obj/machinery/door/airlock/update_icon(updates=ALL, state=0, override=FALSE) - if(operating && !override) - return - - if(!state) - state = density ? AIRLOCK_CLOSED : AIRLOCK_OPEN - airlock_state = state - UPDATE_OO_IF_PRESENT - . = ..() - -/obj/machinery/door/airlock/update_icon_state() - . = ..() - switch(airlock_state) - if(AIRLOCK_OPEN, AIRLOCK_CLOSED) - icon_state = "" - if(AIRLOCK_DENY, AIRLOCK_OPENING, AIRLOCK_CLOSING, AIRLOCK_EMAG) - icon_state = "nonexistenticonstate" //MADNESS - - -/obj/machinery/door/airlock/update_overlays() - . = ..() - - var/frame_state - var/light_state - switch(airlock_state) - if(AIRLOCK_CLOSED) - frame_state = AIRLOCK_FRAME_CLOSED - if(locked) - light_state = AIRLOCK_LIGHT_BOLTS - else if(emergency) - light_state = AIRLOCK_LIGHT_EMERGENCY - if(AIRLOCK_DENY) - frame_state = AIRLOCK_FRAME_CLOSED - light_state = AIRLOCK_LIGHT_DENIED - if(AIRLOCK_EMAG) - frame_state = AIRLOCK_FRAME_CLOSED - if(AIRLOCK_CLOSING) - frame_state = AIRLOCK_FRAME_CLOSING - light_state = AIRLOCK_LIGHT_CLOSING - if(AIRLOCK_OPEN) - frame_state = AIRLOCK_FRAME_OPEN - if(AIRLOCK_OPENING) - frame_state = AIRLOCK_FRAME_OPENING - light_state = AIRLOCK_LIGHT_OPENING - - . += get_airlock_overlay(frame_state, icon, em_block = TRUE) - if(has_fill_overlays) - if(glass) - . += get_airlock_overlay("glass_[frame_state]", glass_fill_overlays, em_block = TRUE) - else - . += get_airlock_overlay("fill_[frame_state]", icon, em_block = TRUE) - - if(airlock_paint && color_overlays) - . += get_airlock_overlay(frame_state, color_overlays, color = airlock_paint) - if(!glass && has_fill_overlays) - . += get_airlock_overlay("fill_[frame_state]", color_overlays, color = airlock_paint) - - if(stripe_paint && stripe_overlays) - . += get_airlock_overlay(frame_state, stripe_overlays, color = stripe_paint) - if(!glass && has_fill_overlays) - . += get_airlock_overlay("fill_[frame_state]", stripe_overlays, color = stripe_paint) - - if(lights && hasPower()) - . += get_airlock_overlay("lights_[light_state]", overlays_file, em_block = FALSE) - - if(panel_open) - . += get_airlock_overlay("panel_[frame_state][security_level ? "_protected" : null]", overlays_file, em_block = TRUE) - if(frame_state == AIRLOCK_FRAME_CLOSED && welded) - . += get_airlock_overlay("welded", overlays_file, em_block = TRUE) - - if(airlock_state == AIRLOCK_EMAG) - . += get_airlock_overlay("sparks", overlays_file, em_block = FALSE) - - if(hasPower()) - if(frame_state == AIRLOCK_FRAME_CLOSED) - if(atom_integrity < integrity_failure * max_integrity) - . += get_airlock_overlay("sparks_broken", overlays_file, em_block = FALSE) - else if(atom_integrity < (0.75 * max_integrity)) - . += get_airlock_overlay("sparks_damaged", overlays_file, em_block = FALSE) - else if(frame_state == AIRLOCK_FRAME_OPEN) - if(atom_integrity < (0.75 * max_integrity)) - . += get_airlock_overlay("sparks_open", overlays_file, em_block = FALSE) - - if(note) - . += get_airlock_overlay(get_note_state(frame_state), note_overlay_file, em_block = TRUE) - - if(frame_state == AIRLOCK_FRAME_CLOSED && seal) - . += get_airlock_overlay("sealed", overlays_file, em_block = TRUE) - - if(hasPower() && unres_sides) - for(var/heading in list(NORTH,SOUTH,EAST,WEST)) - if(!(unres_sides & heading)) - continue - var/image/floorlight = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_[heading]") - floorlight.plane = ABOVE_LIGHTING_PLANE - switch (heading) - if (NORTH) - floorlight.pixel_x = 0 - floorlight.pixel_y = 32 - if (SOUTH) - floorlight.pixel_x = 0 - floorlight.pixel_y = -32 - if (EAST) - floorlight.pixel_x = 32 - floorlight.pixel_y = 0 - if (WEST) - floorlight.pixel_x = -32 - floorlight.pixel_y = 0 - . += floorlight - -/obj/machinery/door/airlock/do_animate(animation) - switch(animation) - if("opening") - update_icon(ALL, AIRLOCK_OPENING) - if("closing") - update_icon(ALL, AIRLOCK_CLOSING) - if("deny") - if(!machine_stat) - update_icon(ALL, AIRLOCK_DENY) - if(prob(1) && prob(10)) //1000. - playsound(src, 'sound/machines/access_denied_hl.ogg', 50, FALSE, 3) - else - playsound(src,doorDeni,50,FALSE,3) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon), ALL, AIRLOCK_CLOSED), AIRLOCK_DENY_ANIMATION_TIME) - -/obj/machinery/door/airlock/examine(mob/user) - . = ..() - if(closeOtherId) - . += span_warning("This airlock cycles on ID: [sanitize(closeOtherId)].") - - if(obj_flags & EMAGGED) - . += span_warning("Its access panel is smoking slightly.") - - if(note) - if(!in_range(user, src) && !isobserver(user)) - . += span_notice("There's a [note.name] pinned to the front. You can't read it from here.") - else - . += span_notice("There's a [note.name] pinned to the front...") - . += note.examine(user) - if(seal) - . += span_notice("It's been braced with \a [seal].") - - if(panel_open) - switch(security_level) - if(AIRLOCK_SECURITY_NONE) - . += span_notice("Its wires are exposed.") - if(AIRLOCK_SECURITY_IRON) - . += span_notice("Its wires are hidden behind a welded iron cover.") - if(AIRLOCK_SECURITY_PLASTEEL_I_S) - . += span_notice("There is some shredded plasteel inside.") - if(AIRLOCK_SECURITY_PLASTEEL_I) - . += span_notice("Its wires are behind an inner layer of plasteel.") - if(AIRLOCK_SECURITY_PLASTEEL_O_S) - . += span_notice("There is some shredded plasteel inside.") - if(AIRLOCK_SECURITY_PLASTEEL_O) - . += span_notice("There is a welded plasteel cover hiding its wires.") - if(AIRLOCK_SECURITY_PLASTEEL) - . += span_notice("There is a protective grille over its panel.") - - else if(security_level) - if(security_level == AIRLOCK_SECURITY_IRON) - . += span_notice("There is a sheet of iron welded over the access panel.") - - if(issilicon(user) && !(machine_stat & BROKEN)) - . += span_notice("Shift-click [src] to [ density ? "open" : "close"] it.") - . += span_notice("Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts.") - . += span_notice("Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.") - . += span_notice("Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access.") - - if(is_station_level(z)) - var/datum/roll_result/result = user.get_examine_result("airlock", 12) - if(result?.outcome >= SUCCESS) - result.do_skill_sound(user) - . += result.create_tooltip("Nearly two thousand kilograms of cold steel, and a time-tested design.", body_only = TRUE) - -/obj/machinery/door/airlock/disco_flavor(mob/living/carbon/human/user, nearby, is_station_level) - . = ..() - var/datum/roll_result/result = user.get_examine_result("door_flavor", only_once = TRUE) - if(result?.outcome >= SUCCESS) - result.do_skill_sound(user) - to_chat( - user, - result.create_tooltip("An airlock by one name, a door by another, a threshold a third. You are not always certain what could be behind it."), - ) - -/obj/machinery/door/airlock/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(isAI(user) || iscyborg(user)) - if(!(machine_stat & BROKEN)) - var/ui = SStgui.try_update_ui(user, src) - if(!ui && !held_item) - context[SCREENTIP_CONTEXT_LMB] = "Open UI" - context[SCREENTIP_CONTEXT_SHIFT_LMB] = density ? "Open" : "Close" - context[SCREENTIP_CONTEXT_CTRL_LMB] = locked ? "Unbolt" : "Bolt" - context[SCREENTIP_CONTEXT_ALT_LMB] = isElectrified() ? "Unelectrify" : "Electrify" - context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB] = emergency ? "Unset emergency access" : "Set emergency access" - . = CONTEXTUAL_SCREENTIP_SET - - if(!isliving(user)) - return . - - if(!Adjacent(user)) - return . - - switch (held_item?.tool_behaviour) - if (TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Close panel" : "Open panel" - return CONTEXTUAL_SCREENTIP_SET - if (TOOL_CROWBAR) - if (panel_open) - if (security_level == AIRLOCK_SECURITY_PLASTEEL_O_S || security_level == AIRLOCK_SECURITY_PLASTEEL_I_S) - context[SCREENTIP_CONTEXT_LMB] = "Remove shielding" - return CONTEXTUAL_SCREENTIP_SET - else if (should_try_removing_electronics()) - context[SCREENTIP_CONTEXT_LMB] = "Remove electronics" - return CONTEXTUAL_SCREENTIP_SET - - // Not always contextually true, but is contextually false in ways that make gameplay interesting. - // For example, trying to pry open an airlock, only for the bolts to be down and the lights off. - context[SCREENTIP_CONTEXT_LMB] = "Pry open" - - return CONTEXTUAL_SCREENTIP_SET - if (TOOL_WELDER) - context[SCREENTIP_CONTEXT_RMB] = "Weld shut" - - if (panel_open) - switch (security_level) - if (AIRLOCK_SECURITY_IRON, AIRLOCK_SECURITY_PLASTEEL_I, AIRLOCK_SECURITY_PLASTEEL_O) - context[SCREENTIP_CONTEXT_LMB] = "Cut shielding" - return CONTEXTUAL_SCREENTIP_SET - - context[SCREENTIP_CONTEXT_LMB] = "Repair" - return CONTEXTUAL_SCREENTIP_SET - - return . - -/obj/machinery/door/airlock/attack_ai(mob/user) - if(!canAIControl(user)) - if(canAIHack()) - hack(user) - return - else - to_chat(user, span_warning("Airlock AI control has been blocked with a firewall. Unable to hack.")) - if(obj_flags & EMAGGED) - to_chat(user, span_warning("Unable to interface: Airlock is unresponsive.")) - return - if(detonated) - to_chat(user, span_warning("Unable to interface. Airlock control panel damaged.")) - return - - ui_interact(user) - -/obj/machinery/door/airlock/proc/hack(mob/user) - set waitfor = 0 - if(!aiHacking) - aiHacking = TRUE - to_chat(user, span_warning("Airlock AI control has been blocked. Beginning fault-detection.")) - sleep(50) - if(canAIControl(user)) - to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) - aiHacking = FALSE - return - else if(!canAIHack()) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - aiHacking = FALSE - return - to_chat(user, span_notice("Fault confirmed: airlock control wire disabled or cut.")) - sleep(20) - to_chat(user, span_notice("Attempting to hack into airlock. This may take some time.")) - sleep(200) - if(canAIControl(user)) - to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) - aiHacking = FALSE - return - else if(!canAIHack()) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - aiHacking = FALSE - return - to_chat(user, span_notice("Upload access confirmed. Loading control program into airlock software.")) - sleep(170) - if(canAIControl(user)) - to_chat(user, span_notice("Alert cancelled. Airlock control has been restored without our assistance.")) - aiHacking = FALSE - return - else if(!canAIHack()) - to_chat(user, span_warning("Connection lost! Unable to hack airlock.")) - aiHacking = FALSE - return - to_chat(user, span_notice("Transfer complete. Forcing airlock to execute program.")) - sleep(50) - //disable blocked control - aiControlDisabled = AI_WIRE_HACKED - to_chat(user, span_notice("Receiving control information from airlock.")) - sleep(10) - //bring up airlock dialog - aiHacking = FALSE - if(user) - attack_ai(user) - -/obj/machinery/door/airlock/attack_animal(mob/user, list/modifiers) - if(isElectrified() && shock(user, 100)) - return - return ..() - -/obj/machinery/door/airlock/attack_paw(mob/user, list/modifiers) - return attack_hand(user, modifiers) - -/obj/machinery/door/airlock/proc/on_attack_hand(atom/source, mob/user, list/modifiers) - SIGNAL_HANDLER - INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, attack_hand), user, modifiers) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/obj/machinery/door/airlock/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(!(issilicon(user) || isAdminGhostAI(user))) - if(isElectrified() && shock(user, 100)) - return - - if(ishuman(user) && prob(40) && density) - var/mob/living/carbon/human/H = user - if((HAS_TRAIT(H, TRAIT_DUMB)) && Adjacent(user)) - playsound(src, 'sound/effects/bang.ogg', 25, TRUE) - if(!istype(H.head, /obj/item/clothing/head/helmet)) - H.visible_message( - span_danger("[user] headbutts the airlock."), \ - span_userdanger("You headbutt the airlock!"), - span_hear("You hear a loud thud.") - ) - H.Paralyze(100) - H.apply_damage(10, BRUTE, BODY_ZONE_HEAD) - else - visible_message( - span_danger("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet."), - span_danger("You slam your head into the airlock"), - span_hear("You hear a loud thud.") - ) - -/obj/machinery/door/airlock/attempt_wire_interaction(mob/user) - if(security_level) - to_chat(user, span_warning("Wires are protected!")) - return WIRE_INTERACTION_FAIL - return ..() - -/obj/machinery/door/airlock/proc/electrified_loop() - while (secondsElectrified > MACHINE_NOT_ELECTRIFIED) - sleep(10) - if(QDELETED(src)) - return - - secondsElectrified-- - // This is to protect against changing to permanent, mid loop. - if(secondsElectrified == MACHINE_NOT_ELECTRIFIED) - set_electrified(MACHINE_NOT_ELECTRIFIED) - else - set_electrified(MACHINE_ELECTRIFIED_PERMANENT) - -/obj/machinery/door/airlock/screwdriver_act(mob/living/user, obj/item/tool) - if(panel_open && detonated) - to_chat(user, span_warning("[src] has no maintenance panel!")) - return ITEM_INTERACT_SUCCESS - panel_open = !panel_open - to_chat(user, span_notice("You [panel_open ? "open":"close"] the maintenance panel of the airlock.")) - tool.play_tool_sound(src) - update_appearance() - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/airlock/wirecutter_act(mob/living/user, obj/item/tool) - if(panel_open && security_level == AIRLOCK_SECURITY_PLASTEEL) - . = ITEM_INTERACT_SUCCESS // everything after this shouldn't result in attackby - if(hasPower() && shock(user, 60)) // Protective grille of wiring is electrified - return . - user.visible_message( - span_notice("[user] cut through [src]'s outer grille."), - span_notice("You cut through [src]'s outer grille."), - span_hear("You hear thin metal being cut.") - ) - if(!tool.use_tool(src, user, 10, volume=100)) - return . - if(!panel_open) // double check it wasn't closed while we were trying to snip - return . - user.visible_message( - span_notice("[user] removes [src]'s shielding."), - span_notice("You remove [src]'s shielding."), - span_hear("You hear metal being pryed up.") - ) - security_level = AIRLOCK_SECURITY_PLASTEEL_O - return . - if(note) - if(IsReachableBy(user)) - user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src].")) - else //telekinesis - visible_message(span_notice("[tool] cuts down [note] from [src].")) - tool.play_tool_sound(src) - note.forceMove(tool.drop_location()) - note = null - update_appearance() - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/airlock/crowbar_act(mob/living/user, obj/item/tool) - - if(!panel_open || security_level == AIRLOCK_SECURITY_NONE) - return ..() - - var/layer_flavor - var/next_level - var/starting_level = security_level - - switch(security_level) - if(AIRLOCK_SECURITY_PLASTEEL_O_S) - layer_flavor = "outer layer of shielding" - next_level = AIRLOCK_SECURITY_PLASTEEL_I - - if(AIRLOCK_SECURITY_PLASTEEL_I_S) - layer_flavor = "inner layer of shielding" - next_level = AIRLOCK_SECURITY_NONE - else - return ITEM_INTERACT_SUCCESS - - user.visible_message(span_notice("You start prying away [src]'s [layer_flavor].")) - if(!tool.use_tool(src, user, 40, volume=100)) - return ITEM_INTERACT_SUCCESS - if(!panel_open || security_level != starting_level) - // if the plating's already been broken, don't break it again - return ITEM_INTERACT_SUCCESS - user.visible_message(span_notice("[user] removes [src]'s shielding."), - span_notice("You remove [src]'s [layer_flavor].")) - security_level = next_level - spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1) - if(next_level == AIRLOCK_SECURITY_NONE) - modify_max_integrity(max_integrity / AIRLOCK_INTEGRITY_MULTIPLIER) - damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N - update_appearance() - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/airlock/welder_act(mob/living/user, obj/item/tool) - - if(!panel_open || security_level == AIRLOCK_SECURITY_NONE) - return ..() - - var/layer_flavor - var/next_level - var/starting_level = security_level - - var/material_to_spawn - var/amount_to_spawn - - switch(security_level) - if(AIRLOCK_SECURITY_IRON) - layer_flavor = "panel's shielding" - next_level = AIRLOCK_SECURITY_NONE - material_to_spawn = /obj/item/stack/sheet/steel - amount_to_spawn = 2 - if(AIRLOCK_SECURITY_PLASTEEL_O) - layer_flavor = "outer layer of shielding" - next_level = AIRLOCK_SECURITY_PLASTEEL_O_S - if(AIRLOCK_SECURITY_PLASTEEL_I) - layer_flavor = "inner layer of shielding" - next_level = AIRLOCK_SECURITY_PLASTEEL_I_S - else - return ITEM_INTERACT_SUCCESS - - if(!tool.tool_start_check(user, amount=2)) - return ITEM_INTERACT_SUCCESS - - to_chat(user, span_notice("You begin cutting the [layer_flavor]...")) - - if(!tool.use_tool(src, user, 4 SECONDS, volume=50, amount=2)) - return ITEM_INTERACT_SUCCESS - - if(!panel_open || security_level != starting_level) - // see if anyone's screwing with us - return ITEM_INTERACT_SUCCESS - - user.visible_message( - span_notice("[user] cuts through [src]'s shielding."), // passers-by don't get the full picture - span_notice("You cut through [src]'s [layer_flavor]."), - span_hear("You hear welding.") - ) - - security_level = next_level - - if(material_to_spawn) - spawn_atom_to_turf(material_to_spawn, user.loc, amount_to_spawn) - - if(security_level == AIRLOCK_SECURITY_NONE) - update_appearance() - - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/airlock/proc/try_reinforce(mob/user, obj/item/stack/sheet/material, amt_required, new_security_level) - if(material.get_amount() < amt_required) - to_chat(user, span_warning("You need at least [amt_required] sheets of [material] to reinforce [src].")) - return FALSE - to_chat(user, span_notice("You start reinforcing [src].")) - if(!do_after(user, src, 2 SECONDS)) - return FALSE - if(!panel_open || !material.use(amt_required)) - return FALSE - user.visible_message(span_notice("[user] reinforces [src] with [material]."), - span_notice("You reinforce [src] with [material].")) - security_level = new_security_level - update_appearance() - return TRUE - -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) - if(!issilicon(user) && !isAdminGhostAI(user)) - if(isElectrified() && shock(user, 75)) - return - - C.leave_evidence(user, src) - - var/mob/living/L = user - if(L.combat_mode) - return ..() - - if(is_wire_tool(C) && panel_open) - attempt_wire_interaction(user) - return - - else if(panel_open && security_level == AIRLOCK_SECURITY_NONE && istype(C, /obj/item/stack/sheet)) - if(istype(C, /obj/item/stack/sheet/steel)) - return try_reinforce(user, C, 2, AIRLOCK_SECURITY_IRON) - - else if(istype(C, /obj/item/stack/sheet/plasteel)) - if(!try_reinforce(user, C, 2, AIRLOCK_SECURITY_PLASTEEL)) - return FALSE - modify_max_integrity(max_integrity * AIRLOCK_INTEGRITY_MULTIPLIER) - damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R - update_appearance() - return TRUE - - else if(istype(C, /obj/item/pai_cable)) - var/obj/item/pai_cable/cable = C - cable.plugin(src, user) - - else if(istype(C, /obj/item/airlock_painter)) - change_paintjob(C, user) - - else if(istype(C, /obj/item/door_seal)) //adding the seal - var/obj/item/door_seal/airlockseal = C - if(!density) - to_chat(user, span_warning("[src] must be closed before you can seal it!")) - return - if(seal) - to_chat(user, span_warning("[src] has already been sealed!")) - return - - user.visible_message(span_notice("[user] begins sealing [src]."), span_notice("You begin sealing [src].")) - playsound(src, 'sound/items/jaws_pry.ogg', 30, TRUE) - if(!do_after(user, src, airlockseal.seal_time)) - return - - if(!density) - to_chat(user, span_warning("[src] must be closed before you can seal it!")) - return - - if(seal) - to_chat(user, span_warning("[src] has already been sealed!")) - return - - if(!user.transferItemToLoc(airlockseal, src)) - to_chat(user, span_warning("For some reason, you can't attach [airlockseal]!")) - return - - playsound(src, forcedClosed, 30, TRUE) - user.visible_message(span_notice("[user] finishes sealing [src]."), span_notice("You finish sealing [src].")) - seal = airlockseal - modify_max_integrity(max_integrity * AIRLOCK_SEAL_MULTIPLIER) - update_appearance() - - else if(istype(C, /obj/item/paper) || istype(C, /obj/item/photo)) - if(note) - to_chat(user, span_warning("There's already something pinned to this airlock! Use wirecutters to remove it.")) - return - if(!user.transferItemToLoc(C, src)) - to_chat(user, span_warning("For some reason, you can't attach [C]!")) - return - - user.visible_message(span_notice("[user] pins [C] to [src]."), span_notice("You pin [C] to [src]."), span_hear("You hear a metallic thud.")) - note = C - update_appearance() - else - return ..() - - -/obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/living/user) - if(!operating && density) - if(seal) - to_chat(user, span_warning("[src] is blocked by a seal!")) - return - - if(atom_integrity < max_integrity) - if(!W.tool_start_check(user, amount=0)) - return - user.visible_message(span_notice("[user] begins welding the airlock."), \ - span_notice("You begin repairing the airlock..."), \ - span_hear("You hear a welding torch fusing metal.")) - if(W.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, PROC_REF(weld_checks), W, user))) - atom_integrity = max_integrity - set_machine_stat(machine_stat & ~BROKEN) - user.visible_message(span_notice("[user] finishes welding [src]."), \ - span_notice("You finish repairing the airlock.")) - update_appearance() - else - to_chat(user, span_notice("The airlock doesn't need repairing.")) - -/obj/machinery/door/airlock/try_to_weld_secondary(obj/item/weldingtool/tool, mob/user) - if(!tool.tool_start_check(user, amount=0)) - return - user.visible_message(span_notice("[user] begins [welded ? "unwelding":"welding"] the airlock."), \ - span_notice("You begin [welded ? "unwelding":"welding"] the airlock..."), \ - span_hear("You hear metal a welding torch splitting metal.")) - if(!tool.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, PROC_REF(weld_checks), tool, user))) - return - welded = !welded - user.visible_message(span_notice("[user] [welded? "welds shut":"unwelds"] [src]."), \ - span_notice("You [welded ? "weld the airlock shut":"unweld the airlock"].")) - log_game("[key_name(user)] [welded ? "welded":"unwelded"] airlock [src] with [tool] at [AREACOORD(src)]") - update_appearance() - -/obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user) - return !operating && density - -/** - * Used when attempting to remove a seal from an airlock - * - * Called when attacking an airlock with an empty hand, returns TRUE (there was a seal and we removed it, or failed to remove it) - * or FALSE (there was no seal) - * Arguments: - * * user - Whoever is attempting to remove the seal - */ -/obj/machinery/door/airlock/try_remove_seal(mob/living/user) - if(!seal) - return FALSE - var/obj/item/door_seal/airlockseal = seal - if(!ishuman(user)) - to_chat(user, span_warning("You don't have the dexterity to remove the seal!")) - return TRUE - user.visible_message(span_notice("[user] begins removing the seal from [src]."), span_notice("You begin removing [src]'s pneumatic seal.")) - playsound(src, forcedOpen, 30, TRUE) - if(!do_after(user, src, airlockseal.unseal_time)) - return TRUE - if(!seal) - return TRUE - playsound(src, 'sound/items/jaws_pry.ogg', 30, TRUE) - airlockseal.forceMove(get_turf(user)) - user.visible_message(span_notice("[user] finishes removing the seal from [src]."), span_notice("You finish removing [src]'s pneumatic seal.")) - seal = null - modify_max_integrity(max_integrity / AIRLOCK_SEAL_MULTIPLIER) - update_appearance() - return TRUE - -/// Returns if a crowbar would remove the airlock electronics -/obj/machinery/door/airlock/proc/should_try_removing_electronics() - if (security_level != 0) - return FALSE - - if (!panel_open) - return FALSE - - if (obj_flags & EMAGGED) - return TRUE - - if (!density) - return FALSE - - if (!welded) - return FALSE - - if (hasPower()) - return FALSE - - if (locked) - return FALSE - - return TRUE - -/obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user, forced = FALSE) - if(I?.tool_behaviour == TOOL_CROWBAR && should_try_removing_electronics() && !operating) - user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \ - span_notice("You start to remove electronics from the airlock assembly...")) - if(I.use_tool(src, user, 40, volume=100)) - deconstruct(TRUE, user) - return - if(seal) - to_chat(user, span_warning("Remove the seal first!")) - return - if(locked) - to_chat(user, span_warning("The airlock's bolts prevent it from being forced!")) - return - if(welded) - to_chat(user, span_warning("It's welded, it won't budge!")) - return - if(hasPower()) - if(forced) - var/check_electrified = isElectrified() //setting this so we can check if the mob got shocked during the do_after below - if(check_electrified && shock(user,100)) - return //it's like sticking a fork in a power socket - - if(!density)//already open - return - - if(!prying_so_hard) - var/time_to_open = 50 - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) //is it aliens or just the CE being a dick? - prying_so_hard = TRUE - if(do_after(user, src, time_to_open)) - if(check_electrified && shock(user,100)) - prying_so_hard = FALSE - return - open(2) - take_damage(25, BRUTE, 0, 0) // Enough to sometimes spark - if(density && !open(2)) - to_chat(user, span_warning("Despite your attempts, [src] refuses to open.")) - prying_so_hard = FALSE - return - to_chat(user, span_warning("The airlock's motors resist your efforts to force it!")) - return - - if(!operating) - if(istype(I, /obj/item/fireaxe)) //being fireaxe'd - var/obj/item/fireaxe/axe = I - if(axe && !axe.wielded) - to_chat(user, span_warning("You need to be wielding \the [axe] to do that!")) - return - INVOKE_ASYNC(src, (density ? PROC_REF(open) : PROC_REF(close)), 2) - -/obj/machinery/door/airlock/open(forced=0) - if( operating || welded || locked || seal ) - return FALSE - if(!forced) - if(!hasPower() || wires.is_cut(WIRE_OPEN)) - return FALSE - if(forced < 2) - if(obj_flags & EMAGGED) - return FALSE - use_power(50) - playsound(src, doorOpen, 45, TRUE) - else - //playsound(src, 'sound/machines/airlockforced.ogg', 30, TRUE) - Original - playsound(src, forcedOpen, 45, TRUE) //PARIAH STATION EDIT - aesthetics/airlock module - - if(autoclose) - autoclose_in(superspeed ? 1.5 SECONDS : autoclose_delay) - - if(!density) - return TRUE - - if(closeOther != null && istype(closeOther, /obj/machinery/door/airlock)) - addtimer(CALLBACK(closeOther, PROC_REF(close)), 2) - - if(close_others) - for(var/obj/machinery/door/airlock/otherlock as anything in close_others) - if(!shuttledocked && !emergency && !otherlock.shuttledocked && !otherlock.emergency) - if(otherlock.operating) - otherlock.delayed_close_requested = TRUE - else - addtimer(CALLBACK(otherlock, PROC_REF(close)), 2) - - if(cyclelinkedairlock) - if(!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency) - if(cyclelinkedairlock.operating) - cyclelinkedairlock.delayed_close_requested = TRUE - else - addtimer(CALLBACK(cyclelinkedairlock, PROC_REF(close)), 2) - - SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) - operating = TRUE - update_icon(ALL, AIRLOCK_OPENING, TRUE) - sleep(1) - set_opacity(0) - update_freelook_sight() - sleep(4) - set_density(FALSE) - flags_1 &= ~PREVENT_CLICK_UNDER_1 - zas_update_loc() - sleep(1) - layer = OPEN_DOOR_LAYER - update_icon(ALL, AIRLOCK_OPEN, TRUE) - operating = FALSE - if(delayed_close_requested) - delayed_close_requested = FALSE - addtimer(CALLBACK(src, PROC_REF(close)), 1) - return TRUE - - -/obj/machinery/door/airlock/close(forced = FALSE, force_crush = FALSE) - if(operating || welded || locked || seal) - return - if(density) - return TRUE - if(!forced) - if(!hasPower() || wires.is_cut(WIRE_BOLTS)) - return - - var/dangerous_close = !dont_close_on_dense_objects || force_crush - if(!dangerous_close) - for(var/atom/movable/M in get_turf(src)) - if(M.density && M != src) //something is blocking the door - autoclose_in() - return - if(forced < 2) - if(obj_flags & EMAGGED) - return - use_power(50) - playsound(src, doorClose, 30, TRUE) - - else - playsound(src, forcedClosed, 60, TRUE) - - var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src)) - if(killthis) - EX_ACT(killthis, EXPLODE_HEAVY) - SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced) - operating = TRUE - update_icon(ALL, AIRLOCK_CLOSING, 1) - layer = CLOSED_DOOR_LAYER - if(air_tight) - set_density(TRUE) - flags_1 |= PREVENT_CLICK_UNDER_1 - zas_update_loc() - sleep(1) - if(!air_tight) - set_density(TRUE) - flags_1 |= PREVENT_CLICK_UNDER_1 - zas_update_loc() - sleep(4) - if(dangerous_close) - crush() - if(visible && !glass) - set_opacity(1) - update_freelook_sight() - sleep(1) - update_icon(ALL, AIRLOCK_CLOSED, 1) - operating = FALSE - delayed_close_requested = FALSE - if(!dangerous_close) - CheckForMobs() - return TRUE - -/obj/machinery/door/airlock/proc/prison_open() - if(obj_flags & EMAGGED) - return - locked = FALSE - open() - locked = TRUE - return - -// gets called when a player uses an airlock painter on this airlock -/obj/machinery/door/airlock/proc/change_paintjob(obj/item/airlock_painter/painter, mob/user) - if((!in_range(src, user) && loc != user) || !painter.can_use(user)) // user should be adjacent to the airlock, and the painter should have a toner cartridge that isn't empty - return - - // reads from the airlock painter's `available paintjob` list. lets the player choose a paint option, or cancel painting - var/current_paintjob = tgui_input_list(user, "Paintjob for this airlock", "Customize", sort_list(painter.available_paint_jobs)) - if(isnull(current_paintjob)) // if the user clicked cancel on the popup, return - return - - var/airlock_type = painter.available_paint_jobs["[current_paintjob]"] // get the airlock type path associated with the airlock name the user just chose - var/obj/machinery/door/airlock/airlock = airlock_type // we need to create a new instance of the airlock and assembly to read vars from them - var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype) - - if(glass && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer - to_chat(user, span_warning("This paint job can only be applied to non-glass airlocks.")) - return - - // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock - painter.use_paint(user) - icon = initial(airlock.icon) - stripe_overlays = initial(airlock.stripe_overlays) - color_overlays = initial(airlock.color_overlays) - glass_fill_overlays = initial(airlock.glass_fill_overlays) - overlays_file = initial(airlock.overlays_file) - note_overlay_file = initial(airlock.note_overlay_file) - airlock_paint = initial(airlock.airlock_paint) - stripe_paint = initial(airlock.stripe_paint) - assemblytype = initial(airlock.assemblytype) - update_appearance() - -/obj/machinery/door/airlock/CanAStarPass(to_dir, datum/can_pass_info/pass_info) - //Airlock is passable if it is open (!density), bot has access, and is not bolted shut or powered off) - return !density || (!locked && !pass_info.no_id && check_access_list(pass_info.access) && hasPower()) - -/obj/machinery/door/airlock/emag_act(mob/user, obj/item/card/emag/doorjack/D) - if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) - if(istype(D, /obj/item/card/emag/doorjack)) - D.use_charge(user) - operating = TRUE - update_icon(ALL, AIRLOCK_EMAG, 1) - sleep(6) - if(QDELETED(src)) - return - operating = FALSE - if(!open()) - update_icon(ALL, AIRLOCK_CLOSED, 1) - obj_flags |= EMAGGED - lights = FALSE - locked = TRUE - loseMainPower() - loseBackupPower() - -/obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/humanoid/user, list/modifiers) - if(isElectrified() && shock(user, 100)) //Mmm, fried xeno! - add_fingerprint(user) - return - if(!density) //Already open - return ..() - if(locked || welded || seal) //Extremely generic, as aliens only understand the basics of how airlocks work. - if(user.combat_mode) - return ..() - to_chat(user, span_warning("[src] refuses to budge!")) - return - add_fingerprint(user) - user.visible_message(span_warning("[user] begins prying open [src]."),\ - span_noticealien("You begin digging your claws into [src] with all your might!"),\ - span_warning("You hear groaning metal...")) - var/time_to_open = 5 //half a second - if(hasPower()) - time_to_open = 5 SECONDS //Powered airlocks take longer to open, and are loud. - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - - - if(do_after(user, src, time_to_open)) - if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) - to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!")) - -/obj/machinery/door/airlock/hostile_lockdown(mob/origin) - // Must be powered and have working AI wire. - if(canAIControl(src) && !machine_stat) - locked = FALSE //For airlocks that were bolted open. - dont_close_on_dense_objects = FALSE //DOOR CRUSH - close() - bolt() //Bolt it! - set_electrified(MACHINE_ELECTRIFIED_PERMANENT) //Shock it! - if(origin) - LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(origin)]") - - -/obj/machinery/door/airlock/disable_lockdown() - // Must be powered and have working AI wire. - if(canAIControl(src) && !machine_stat) - unbolt() - set_electrified(MACHINE_NOT_ELECTRIFIED) - open() - dont_close_on_dense_objects = TRUE - - -/obj/machinery/door/airlock/proc/on_break() - SIGNAL_HANDLER - - if(!panel_open) - panel_open = TRUE - wires.cut_all() - -/obj/machinery/door/airlock/proc/set_electrified(seconds, mob/user) - secondsElectrified = seconds - diag_hud_set_electrified() - if(secondsElectrified > MACHINE_NOT_ELECTRIFIED) - INVOKE_ASYNC(src, PROC_REF(electrified_loop)) - - if(user) - var/message - switch(secondsElectrified) - if(MACHINE_ELECTRIFIED_PERMANENT) - message = "permanently shocked" - if(MACHINE_NOT_ELECTRIFIED) - message = "unshocked" - else - message = "temp shocked for [secondsElectrified] seconds" - LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(user)] - ([uppertext(message)])") - log_combat(user, src, message) - log_touch(user) - -/obj/machinery/door/airlock/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - if((damage_amount >= atom_integrity) && (damage_flag == BOMB)) - flags_1 |= NODECONSTRUCT_1 //If an explosive took us out, don't drop the assembly - - . = ..() - - if(atom_integrity < (0.75 * max_integrity)) - update_appearance() - - -/obj/machinery/door/airlock/deconstruct(disassembled = TRUE, mob/user) - if(!(flags_1 & NODECONSTRUCT_1)) - var/obj/structure/door_assembly/A - if(assemblytype) - A = new assemblytype(loc) - else - A = new /obj/structure/door_assembly(loc) - //If you come across a null assemblytype, it will produce the default assembly instead of disintegrating. - A.heat_proof_finished = heat_proof //tracks whether there's rglass in - A.set_anchored(TRUE) - A.glass = glass - A.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS - A.created_name = name - A.previous_assembly = previous_airlock - A.update_appearance() - - if(!disassembled) - A?.update_integrity(A.max_integrity * 0.5) - else if(obj_flags & EMAGGED) - if(user) - to_chat(user, span_warning("You discard the damaged electronics.")) - else - if(user) - to_chat(user, span_notice("You remove the airlock electronics.")) - - var/obj/item/electronics/airlock/ae - if(!electronics) - ae = new/obj/item/electronics/airlock(loc) - gen_access() - if(length(req_one_access)) - ae.one_access = 1 - ae.accesses = req_one_access - else - ae.accesses = req_access - else - ae = electronics - electronics = null - ae.forceMove(drop_location()) - qdel(src) - -/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - if(seal) - to_chat(user, span_notice("[src]'s seal needs to be removed first.")) - return FALSE - if(security_level != AIRLOCK_SECURITY_NONE) - to_chat(user, span_notice("[src]'s reinforcement needs to be removed first.")) - return FALSE - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) - return FALSE - -/obj/machinery/door/airlock/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct the airlock.")) - qdel(src) - return TRUE - return FALSE - -/** - * Returns a string representing the type of note pinned to this airlock - * Arguments: - * * frame_state - The AIRLOCK_FRAME_ value, as used in update_overlays() - **/ -/obj/machinery/door/airlock/proc/get_note_state(frame_state) - if(!note) - return - else if(istype(note, /obj/item/paper)) - return "note_[frame_state]" - - else if(istype(note, /obj/item/photo)) - return "photo_[frame_state]" - -/obj/machinery/door/airlock/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiAirlock", name) - ui.open() - return TRUE - -/obj/machinery/door/airlock/ui_data() - var/list/data = list() - - var/list/power = list() - power["main"] = secondsMainPowerLost ? 0 : 2 // boolean - power["main_timeleft"] = secondsMainPowerLost - power["backup"] = secondsBackupPowerLost ? 0 : 2 // boolean - power["backup_timeleft"] = secondsBackupPowerLost - data["power"] = power - - data["shock"] = secondsElectrified == MACHINE_NOT_ELECTRIFIED ? 2 : 0 - data["shock_timeleft"] = secondsElectrified - data["id_scanner"] = !aiDisabledIdScanner - data["emergency"] = emergency // access - data["locked"] = locked // bolted - data["lights"] = lights // bolt lights - data["safe"] = dont_close_on_dense_objects // safeties - data["speed"] = !superspeed // safe speed - data["welded"] = welded // welded - data["opened"] = !density // opened - - var/list/wire = list() - wire["main_1"] = !wires.is_cut(WIRE_POWER1) - wire["main_2"] = !wires.is_cut(WIRE_POWER2) - wire["backup_1"] = !wires.is_cut(WIRE_BACKUP1) - wire["backup_2"] = !wires.is_cut(WIRE_BACKUP2) - wire["shock"] = !wires.is_cut(WIRE_SHOCK) - wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) - wire["bolts"] = !wires.is_cut(WIRE_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_LIGHT) - wire["safe"] = !wires.is_cut(WIRE_SAFETY) - wire["timing"] = !wires.is_cut(WIRE_TIMING) - - data["wires"] = wire - return data - -/obj/machinery/door/airlock/ui_act(action, params) - . = ..() - if(.) - return - - if(!user_allowed(usr)) - return - switch(action) - if("disrupt-main") - if(!secondsMainPowerLost) - loseMainPower() - update_appearance() - else - to_chat(usr, span_warning("Main power is already offline.")) - . = TRUE - if("disrupt-backup") - if(!secondsBackupPowerLost) - loseBackupPower() - update_appearance() - else - to_chat(usr, span_warning("Backup power is already offline.")) - . = TRUE - if("shock-restore") - shock_restore(usr) - . = TRUE - if("shock-temp") - shock_temp(usr) - . = TRUE - if("shock-perm") - shock_perm(usr) - . = TRUE - if("idscan-toggle") - aiDisabledIdScanner = !aiDisabledIdScanner - . = TRUE - if("emergency-toggle") - toggle_emergency(usr) - . = TRUE - if("bolt-toggle") - toggle_bolt(usr) - . = TRUE - if("light-toggle") - lights = !lights - update_appearance() - . = TRUE - if("safe-toggle") - dont_close_on_dense_objects = !dont_close_on_dense_objects - . = TRUE - if("speed-toggle") - superspeed = !superspeed - . = TRUE - if("open-close") - user_toggle_open(usr) - . = TRUE - -/obj/machinery/door/airlock/proc/user_allowed(mob/user) - return (issilicon(user) && canAIControl(user)) || isAdminGhostAI(user) - -/obj/machinery/door/airlock/proc/shock_restore(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_SHOCK)) - to_chat(user, span_warning("Can't un-electrify the airlock - The electrification wire is cut.")) - else if(isElectrified()) - set_electrified(MACHINE_NOT_ELECTRIFIED, user) - -/obj/machinery/door/airlock/proc/shock_temp(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_SHOCK)) - to_chat(user, span_warning("The electrification wire has been cut.")) - else - set_electrified(MACHINE_DEFAULT_ELECTRIFY_TIME, user) - -/obj/machinery/door/airlock/proc/shock_perm(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_SHOCK)) - to_chat(user, span_warning("The electrification wire has been cut.")) - else - set_electrified(MACHINE_ELECTRIFIED_PERMANENT, user) - -/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_BOLTS)) - to_chat(user, span_warning("The door bolt drop wire is cut - you can't toggle the door bolts.")) - return - if(locked) - if(!hasPower()) - to_chat(user, span_warning("The door has no power - you can't raise the door bolts.")) - else - unbolt() - log_combat(user, src, "unbolted") - else - bolt() - log_combat(user, src, "bolted") - -/obj/machinery/door/airlock/proc/toggle_emergency(mob/user) - if(!user_allowed(user)) - return - emergency = !emergency - update_appearance() - -/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) - if(!user_allowed(user)) - return - if(welded) - to_chat(user, span_warning("The airlock has been welded shut!")) - else if(locked) - to_chat(user, span_warning("The door bolts are down!")) - else if(!density) - close() - else - open() - -/** - * Generates the airlock's wire layout based on the current area the airlock resides in. - * - * Returns a new /datum/wires/ with the appropriate wire layout based on the airlock_wires - * of the area the airlock is in. - */ -/obj/machinery/door/airlock/proc/set_wires() - var/area/source_area = get_area(src) - return source_area?.airlock_wires ? new source_area.airlock_wires(src) : new /datum/wires/airlock(src) - -#undef AIRLOCK_CLOSED -#undef AIRLOCK_CLOSING -#undef AIRLOCK_OPEN -#undef AIRLOCK_OPENING -#undef AIRLOCK_DENY -#undef AIRLOCK_EMAG - -#undef AIRLOCK_SECURITY_NONE -#undef AIRLOCK_SECURITY_IRON -#undef AIRLOCK_SECURITY_PLASTEEL_I_S -#undef AIRLOCK_SECURITY_PLASTEEL_I -#undef AIRLOCK_SECURITY_PLASTEEL_O_S -#undef AIRLOCK_SECURITY_PLASTEEL_O -#undef AIRLOCK_SECURITY_PLASTEEL - -#undef AIRLOCK_INTEGRITY_N -#undef AIRLOCK_INTEGRITY_MULTIPLIER -#undef AIRLOCK_SEAL_MULTIPLIER -#undef AIRLOCK_DAMAGE_DEFLECTION_N -#undef AIRLOCK_DAMAGE_DEFLECTION_R - -#undef AIRLOCK_DENY_ANIMATION_TIME - -#undef DOOR_VISION_DISTANCE diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm deleted file mode 100644 index 5783e104a2a..00000000000 --- a/code/game/machinery/doors/airlock_electronics.dm +++ /dev/null @@ -1,101 +0,0 @@ -/obj/item/electronics/airlock - name = "airlock electronics" - req_access = list(ACCESS_MAINT_TUNNELS) - /// A list of all granted accesses - var/list/accesses = list() - /// If the airlock should require ALL or only ONE of the listed accesses - var/one_access = 0 - /// Unrestricted sides, or sides of the airlock that will open regardless of access - var/unres_sides = 0 - ///what name are we passing to the finished airlock - var/passed_name - ///what string are we passing to the finished airlock as the cycle ID - var/passed_cycle_id - /// A holder of the electronics, in case of them working as an integrated part - var/holder - -/obj/item/electronics/airlock/examine(mob/user) - . = ..() - . += span_notice("Has a neat selection menu for modifying airlock access levels.") - -/obj/item/electronics/airlock/ui_state(mob/user) - return GLOB.hands_state - -/obj/item/electronics/airlock/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AirlockElectronics", name) - ui.open() - -/obj/item/electronics/airlock/ui_static_data(mob/user) - var/list/data = list() - - var/list/regions = list() - var/list/tgui_region_data = SSid_access.tgui_access_groups - for(var/region in SSid_access.station_groups) - regions += tgui_region_data[region] - - data["regions"] = regions - return data - -/obj/item/electronics/airlock/ui_data() - var/list/data = list() - data["accesses"] = accesses - data["oneAccess"] = one_access - data["unres_direction"] = unres_sides - data["passedName"] = passed_name - data["passedCycleId"] = passed_cycle_id - return data - -/obj/item/electronics/airlock/ui_act(action, params) - . = ..() - if(.) - return - - switch(action) - if("clear_all") - accesses = list() - one_access = 0 - . = TRUE - if("grant_all") - accesses = SSid_access.get_access_for_group(list(/datum/access_group/station/all)) - . = TRUE - if("one_access") - one_access = !one_access - . = TRUE - if("set") - var/access = text2num(params["access"]) - if (!(access in accesses)) - accesses += access - else - accesses -= access - . = TRUE - if("direc_set") - var/unres_direction = text2num(params["unres_direction"]) - unres_sides ^= unres_direction //XOR, toggles only the bit that was clicked - . = TRUE - if("grant_region") - var/region = params["region"] - if(isnull(region)) - return - accesses |= SSid_access.get_access_for_group(list(region)) - . = TRUE - if("deny_region") - var/region = params["region"] - if(isnull(region)) - return - accesses -= SSid_access.get_access_for_group(list(region)) - . = TRUE - if("passedName") - var/new_name = trim("[params["passedName"]]", 30) - passed_name = new_name - . = TRUE - if("passedCycleId") - var/new_cycle_id = trim(params["passedCycleId"], 30) - passed_cycle_id = new_cycle_id - . = TRUE - -/obj/item/electronics/airlock/ui_host() - if(holder) - return holder - return src diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm deleted file mode 100644 index 109c3f59d4d..00000000000 --- a/code/game/machinery/doors/airlock_types.dm +++ /dev/null @@ -1,500 +0,0 @@ -/* - Station Airlocks Regular -*/ - -/obj/machinery/door/airlock/command - assemblytype = /obj/structure/door_assembly/door_assembly_com - normal_integrity = 450 - airlock_paint = "#334E6D" - stripe_paint = "#43769D" - -/obj/machinery/door/airlock/security - assemblytype = /obj/structure/door_assembly/door_assembly_sec - normal_integrity = 450 - airlock_paint = "#9F2828" - stripe_paint = "#D27428" - -/obj/machinery/door/airlock/engineering - assemblytype = /obj/structure/door_assembly/door_assembly_eng - airlock_paint = "#A28226" - stripe_paint = "#7F292F" - -/obj/machinery/door/airlock/medical - assemblytype = /obj/structure/door_assembly/door_assembly_med - airlock_paint = "#BBBBBB" - stripe_paint = "#5995BA" - -/obj/machinery/door/airlock/hydroponics //Hydroponics front doors! - assemblytype = /obj/structure/door_assembly/door_assembly_hydro - airlock_paint = "#559958" - stripe_paint = "#0650A4" - -/obj/machinery/door/airlock/maintenance - name = "maintenance access" - assemblytype = /obj/structure/door_assembly/door_assembly_mai - normal_integrity = 250 - stripe_paint = "#B69F3C" - -/obj/machinery/door/airlock/maintenance/external - name = "external airlock access" - assemblytype = /obj/structure/door_assembly/door_assembly_extmai - stripe_paint = "#9F2828" - -/obj/machinery/door/airlock/mining - name = "mining airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_min - airlock_paint = "#967032" - stripe_paint = "#5F350B" - -/obj/machinery/door/airlock/atmos - name = "atmospherics airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_atmo - airlock_paint = "#A28226" - stripe_paint = "#469085" - -/obj/machinery/door/airlock/research - assemblytype = /obj/structure/door_assembly/door_assembly_research - airlock_paint = "#BBBBBB" - stripe_paint = "#563758" - -/obj/machinery/door/airlock/freezer - name = "freezer airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_fre - airlock_paint = "#BBBBBB" - -/obj/machinery/door/airlock/science - assemblytype = /obj/structure/door_assembly/door_assembly_science - airlock_paint = "#BBBBBB" - stripe_paint = "#6633CC" - -/obj/machinery/door/airlock/virology - assemblytype = /obj/structure/door_assembly/door_assembly_viro - airlock_paint = "#BBBBBB" - stripe_paint = "#2a7a25" - -////////////////////////////////// -/* - Station Airlocks Glass -*/ - -/obj/machinery/door/airlock/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/glass/incinerator - autoclose = FALSE - frequency = FREQ_AIRLOCK_CONTROL - heat_proof = TRUE - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/door/airlock/command/glass - opacity = FALSE - glass = TRUE - normal_integrity = 400 - -/obj/machinery/door/airlock/engineering/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/engineering/glass/critical - critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. - -/obj/machinery/door/airlock/security/glass - opacity = FALSE - glass = TRUE - normal_integrity = 400 - -/obj/machinery/door/airlock/medical/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day? - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/research/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/research/glass/incinerator - autoclose = FALSE - frequency = FREQ_AIRLOCK_CONTROL - heat_proof = TRUE - req_access = list(ACCESS_ORDNANCE) - -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior - name = "Mixing Room Interior Airlock" - id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior - name = "Mixing Room Exterior Airlock" - id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR - -/obj/machinery/door/airlock/mining/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/atmos/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/atmos/glass/critical - critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. - -/obj/machinery/door/airlock/science/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/virology/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/maintenance/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/maintenance/external/glass - opacity = FALSE - glass = TRUE - normal_integrity = 200 - -////////////////////////////////// -/* - Station Airlocks Mineral -*/ - -/obj/machinery/door/airlock/gold - name = "gold airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_gold - airlock_paint = "#9F891F" - -/obj/machinery/door/airlock/gold/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/silver - name = "silver airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_silver - airlock_paint = "#C9C9C9" - -/obj/machinery/door/airlock/silver/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/diamond - name = "diamond airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_diamond - normal_integrity = 1000 - explosion_block = 2 - airlock_paint = "#4AB4B4" - -/obj/machinery/door/airlock/diamond/glass - normal_integrity = 950 - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/uranium - name = "uranium airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_uranium - airlock_paint = "#174207" - var/last_event = 0 - //Is this airlock actually radioactive? - var/actually_radioactive = TRUE - -/obj/machinery/door/airlock/uranium/process() - if(actually_radioactive && world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time - -/obj/machinery/door/airlock/uranium/proc/radiate() - radiation_pulse( - src, - max_range = 2, - threshold = RAD_LIGHT_INSULATION, - chance = URANIUM_IRRADIATION_CHANCE, - minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, - ) - -/obj/machinery/door/airlock/uranium/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/uranium/safe - actually_radioactive = FALSE - -/obj/machinery/door/airlock/uranium/glass/safe - actually_radioactive = FALSE - -TYPEINFO_DEF(/obj/machinery/door/airlock/plasma) - default_materials = list(/datum/material/plasma = 20000) - -/obj/machinery/door/airlock/plasma - name = "plasma airlock" - desc = "No way this can end badly." - assemblytype = /obj/structure/door_assembly/door_assembly_plasma - airlock_paint = "#65217B" - material_flags = MATERIAL_EFFECTS - material_modifier = 0.25 - -/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~ - return 0 - -/obj/machinery/door/airlock/plasma/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/bananium - name = "bananium airlock" - desc = "Honkhonkhonk" - assemblytype = /obj/structure/door_assembly/door_assembly_bananium - airlock_paint = "#FFFF00" - doorOpen = 'sound/items/bikehorn.ogg' - -/obj/machinery/door/airlock/bananium/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/sandstone - name = "sandstone airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_sandstone - airlock_paint = "#C09A72" - -/obj/machinery/door/airlock/sandstone/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/wood - name = "wooden airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_wood - airlock_paint = "#805F44" - -/obj/machinery/door/airlock/wood/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/titanium - name = "shuttle airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_titanium - airlock_paint = "#b3c0c7" - normal_integrity = 400 - -/obj/machinery/door/airlock/titanium/glass - normal_integrity = 350 - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/bronze - name = "bronze airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_bronze - airlock_paint = "#9c5f05" - -/obj/machinery/door/airlock/bronze/seethru - assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru - opacity = FALSE - glass = TRUE -////////////////////////////////// -/* - Station2 Airlocks -*/ - -/obj/machinery/door/airlock/public - icon = 'icons/obj/doors/airlocks/station2/airlock.dmi' - glass_fill_overlays = 'icons/obj/doors/airlocks/station2/glass_overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_public - -/obj/machinery/door/airlock/public/glass - opacity = FALSE - glass = TRUE - explosion_block = 0 //:) - -/obj/machinery/door/airlock/public/glass/incinerator - autoclose = FALSE - frequency = FREQ_AIRLOCK_CONTROL - heat_proof = TRUE - req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) - -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior - name = "Turbine Interior Airlock" - id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior - name = "Turbine Exterior Airlock" - id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR - -////////////////////////////////// -/* - External Airlocks -*/ - -/obj/machinery/door/airlock/external - name = "external airlock" - icon = 'icons/obj/doors/airlocks/external/airlock.dmi' - color_overlays = 'icons/obj/doors/airlocks/external/airlock_color.dmi' - glass_fill_overlays = 'icons/obj/doors/airlocks/external/glass_overlays.dmi' - overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - airlock_paint = "#9F2828" - assemblytype = /obj/structure/door_assembly/door_assembly_ext - req_access = list(ACCESS_EXTERNAL_AIRLOCKS) - - /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized. - var/space_dir = null - -/obj/machinery/door/airlock/external/Initialize(mapload, ...) - // default setting is for mapping only, let overrides work - if(!mapload || req_access_txt || req_one_access_txt) - req_access = null - - return ..() - -/obj/machinery/door/airlock/external/LateInitialize() - . = ..() - if(space_dir) - unres_sides |= space_dir - -/obj/machinery/door/airlock/external/examine(mob/user) - . = ..() - if(space_dir) - . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.") - -/obj/machinery/door/airlock/external/cyclelinkairlock() - . = ..() - var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock - if(istype(cycle_linked_external_airlock)) - cycle_linked_external_airlock.space_dir |= space_dir - space_dir |= cycle_linked_external_airlock.space_dir - -/obj/machinery/door/airlock/external/try_safety_unlock(mob/user) - if(space_dir && density) - if(!hasPower()) - to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) - if(do_after(user, src, 15 SECONDS)) - try_to_crowbar(null, user, TRUE) - return TRUE - else - // always open from the space side - // get_dir(src, user) & space_dir, checked in unresricted_sides - var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE) - return try_to_activate_door(user, should_safety_open) - - return ..() - -/// Access free external airlock -/obj/machinery/door/airlock/external/ruin - req_access = null - -/obj/machinery/door/airlock/external/glass - opacity = FALSE - glass = TRUE - -/// Access free external glass airlock -/obj/machinery/door/airlock/external/glass/ruin - req_access = null - -////////////////////////////////// -/* - CentCom Airlocks -*/ - -/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such. - icon = 'icons/obj/doors/airlocks/centcom/airlock.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_centcom - normal_integrity = 1000 - security_level = 6 - explosion_block = 2 - -/obj/machinery/door/airlock/grunge - icon = 'icons/obj/doors/airlocks/centcom/airlock.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_grunge - -////////////////////////////////// -/* - Vault Airlocks -*/ - -/obj/machinery/door/airlock/vault - name = "vault door" - icon = 'icons/obj/doors/airlocks/vault/airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_vault - explosion_block = 2 - normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original - security_level = 6 - has_fill_overlays = FALSE - -////////////////////////////////// -/* - Hatch Airlocks -*/ - -/obj/machinery/door/airlock/hatch - name = "airtight hatch" - icon = 'icons/obj/doors/airlocks/hatch/airlock.dmi' - stripe_overlays = 'icons/obj/doors/airlocks/hatch/airlock_stripe.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_hatch - -/obj/machinery/door/airlock/maintenance_hatch - name = "maintenance hatch" - icon = 'icons/obj/doors/airlocks/hatch/airlock.dmi' - stripe_overlays = 'icons/obj/doors/airlocks/hatch/airlock_stripe.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_mhatch - stripe_paint = "#B69F3C" - -////////////////////////////////// -/* - High Security Airlocks -*/ - -/obj/machinery/door/airlock/highsecurity - name = "high tech security airlock" - icon = 'icons/obj/doors/airlocks/highsec/airlock.dmi' - color_overlays = null - stripe_overlays = null - has_fill_overlays = FALSE - assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity - explosion_block = 2 - normal_integrity = 500 - security_level = 1 - damage_deflection = 30 - -////////////////////////////////// -/* - Shuttle Airlocks -*/ - -/obj/machinery/door/airlock/shuttle - name = "shuttle airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_shuttle - airlock_paint = "#b3c0c7" - -/obj/machinery/door/airlock/shuttle/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/abductor - name = "alien airlock" - desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?" - assemblytype = /obj/structure/door_assembly/door_assembly_abductor - damage_deflection = 30 - explosion_block = 3 - hackProof = TRUE - aiControlDisabled = AI_WIRE_DISABLED - normal_integrity = 700 - security_level = 1 - airlock_paint = "#333333" - stripe_paint = "#6633CC" - -////////////////////////////////// -/* - Misc Airlocks -*/ - -/obj/machinery/door/airlock/glass_large - name = "large glass airlock" - icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' - overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' - opacity = FALSE - assemblytype = null - glass = TRUE - bound_width = 64 // 2x1 diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm deleted file mode 100644 index b1f72277a4c..00000000000 --- a/code/game/machinery/doors/alarmlock.dm +++ /dev/null @@ -1,44 +0,0 @@ -/obj/machinery/door/airlock/alarmlock - name = "glass alarm airlock" - icon = 'icons/obj/doors/airlocks/station2/airlock.dmi' - glass_fill_overlays = 'icons/obj/doors/airlocks/station2/glass_overlays.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' - opacity = FALSE - assemblytype = /obj/structure/door_assembly/door_assembly_public - glass = TRUE - - var/datum/radio_frequency/air_connection - var/air_frequency = FREQ_ATMOS_ALARMS - autoclose = FALSE - -/obj/machinery/door/airlock/alarmlock/Initialize(mapload) - . = ..() - air_connection = new - -/obj/machinery/door/airlock/alarmlock/Destroy() - SSpackets.remove_object(src,air_frequency) - air_connection = null - return ..() - -/obj/machinery/door/airlock/alarmlock/Initialize(mapload) - . = ..() - SSpackets.remove_object(src, air_frequency) - air_connection = SSpackets.add_object(src, air_frequency, RADIO_TO_AIRALARM) - INVOKE_ASYNC(src, PROC_REF(open)) - -/obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal) - ..() - if(machine_stat & (NOPOWER|BROKEN)) - return - - var/alarm_area = signal.data["zone"] - var/alert = signal.data["alert"] - - if(alarm_area == get_area_name(src)) - switch(alert) - if("severe") - autoclose = TRUE - close() - if("minor", "clear") - autoclose = FALSE - open() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm deleted file mode 100644 index 863ec2c123a..00000000000 --- a/code/game/machinery/doors/brigdoors.dm +++ /dev/null @@ -1,295 +0,0 @@ -#define CHARS_PER_LINE 5 -#define FONT_SIZE "5pt" -#define FONT_COLOR "#09f" -#define FONT_STYLE "Small Fonts" -#define MAX_TIMER 15 MINUTES - -#define PRESET_SHORT 2 MINUTES -#define PRESET_MEDIUM 3 MINUTES -#define PRESET_LONG 5 MINUTES - - - -/////////////////////////////////////////////////////////////////////////////////////////////// -// Brig Door control displays. -// Description: This is a controls the timer for the brig doors, displays the timer on itself and -// has a popup window when used, allowing to set the timer. -// Code Notes: Combination of old brigdoor.dm code from rev4407 and the status_display.dm code -// Date: 01/September/2010 -// Programmer: Veryinky -///////////////////////////////////////////////////////////////////////////////////////////////// -/obj/machinery/door_timer - name = "door timer" - icon = 'icons/obj/status_display.dmi' - icon_state = "frame" - desc = "A remote control for a door." - req_access = list(ACCESS_SECURITY) - density = FALSE - var/id = null // id of linked machinery/lockers - - var/activation_time = 0 - var/timer_duration = 0 - - var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing - ///List of weakrefs to nearby doors - var/list/doors = list() - ///List of weakrefs to nearby flashers - var/list/flashers = list() - ///List of weakrefs to nearby closets - var/list/closets = list() - - var/obj/item/radio/Radio //needed to send messages to sec radio - - maptext_height = 26 - maptext_width = 32 - maptext_y = -1 - -/obj/machinery/door_timer/Initialize(mapload) - . = ..() - - Radio = new/obj/item/radio(src) - Radio.set_listening(FALSE, TRUE) - AddComponent(/datum/component/wall_mounted, CALLBACK(src, PROC_REF(deconstruct), FALSE)) - - if(id != null) - for(var/obj/machinery/door/window/brigdoor/M in urange(20, src)) - if (M.id == id) - doors += WEAKREF(M) - - for(var/obj/machinery/flasher/F in urange(20, src)) - if(F.id == id) - flashers += WEAKREF(F) - - for(var/obj/structure/closet/secure_closet/brig/C in urange(20, src)) - if(C.id == id) - closets += WEAKREF(C) - - if(!length(doors) && !length(flashers) && length(closets)) - atom_break() - update_appearance() - - -//Main door timer loop, if it's timing and time is >0 reduce time by 1. -// if it's less than 0, open door, reset timer -// update the door_timer window and the icon -/obj/machinery/door_timer/process() - if(machine_stat & (NOPOWER|BROKEN)) - return - - if(timing) - if(world.time - activation_time >= timer_duration) - timer_end() // open doors, reset timer, clear status screen - update_appearance() - -// open/closedoor checks if door_timer has power, if so it checks if the -// linked door is open/closed (by density) then opens it/closes it. -/obj/machinery/door_timer/proc/timer_start() - if(machine_stat & (NOPOWER|BROKEN)) - return 0 - - activation_time = world.time - timing = TRUE - - for(var/datum/weakref/door_ref as anything in doors) - var/obj/machinery/door/window/brigdoor/door = door_ref.resolve() - if(!door) - doors -= door_ref - continue - if(door.density) - continue - INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door/window/brigdoor, close)) - - for(var/datum/weakref/closet_ref as anything in closets) - var/obj/structure/closet/secure_closet/brig/closet = closet_ref.resolve() - if(!closet) - closets -= closet_ref - continue - if(closet.broken) - continue - if(closet.opened && !closet.close()) - continue - closet.locked = TRUE - closet.update_appearance() - return 1 - - -/obj/machinery/door_timer/proc/timer_end(forced = FALSE) - - if(machine_stat & (NOPOWER|BROKEN)) - return 0 - - if(!forced) - Radio.set_frequency(FREQ_SECURITY) - Radio.talk_into(src, "Timer has expired. Releasing prisoner.", FREQ_SECURITY) - - timing = FALSE - activation_time = null - set_timer(0) - update_appearance() - - for(var/datum/weakref/door_ref as anything in doors) - var/obj/machinery/door/window/brigdoor/door = door_ref.resolve() - if(!door) - doors -= door_ref - continue - if(!door.density) - continue - INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door/window/brigdoor, open)) - - for(var/datum/weakref/closet_ref as anything in closets) - var/obj/structure/closet/secure_closet/brig/closet = closet_ref.resolve() - if(!closet) - closets -= closet_ref - continue - if(closet.broken) - continue - if(closet.opened) - continue - closet.locked = FALSE - closet.update_appearance() - - return 1 - - -/obj/machinery/door_timer/proc/time_left(seconds = FALSE) - . = max(0,timer_duration - (activation_time ? world.time - activation_time : 0)) - if(seconds) - . /= 10 - -/obj/machinery/door_timer/proc/set_timer(value) - var/new_time = clamp(value,0,MAX_TIMER) - . = new_time == timer_duration //return 1 on no change - timer_duration = new_time - -/obj/machinery/door_timer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "BrigTimer", name) - ui.open() - -//icon update function -// if NOPOWER, display blank -// if BROKEN, display blue screen of death icon AI uses -// if timing=true, run update display function -/obj/machinery/door_timer/update_icon() - . = ..() - if(machine_stat & (NOPOWER)) - return - - if(machine_stat & (BROKEN)) - set_picture("ai_bsod") - return - - if(timing) - var/disp1 = id - var/time_left = time_left(seconds = TRUE) - var/disp2 = "[add_leading(num2text((time_left / 60) % 60), 2, "0")]:[add_leading(num2text(time_left % 60), 2, "0")]" - if(length(disp2) > CHARS_PER_LINE) - disp2 = "Error" - update_display(disp1, disp2) - else - if(maptext) - maptext = "" - return - - -// Adds an icon in case the screen is broken/off, stolen from status_display.dm -/obj/machinery/door_timer/proc/set_picture(state) - if(maptext) - maptext = "" - cut_overlays() - add_overlay(mutable_appearance('icons/obj/status_display.dmi', state)) - - -//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display -// Stolen from status_display -/obj/machinery/door_timer/proc/update_display(line1, line2) - line1 = uppertext(line1) - line2 = uppertext(line2) - var/new_text = {"
[line1]
[line2]
"} - if(maptext != new_text) - maptext = new_text - -/obj/machinery/door_timer/ui_data() - var/list/data = list() - var/time_left = time_left(seconds = TRUE) - data["seconds"] = round(time_left % 60) - data["minutes"] = round((time_left - data["seconds"]) / 60) - data["timing"] = timing - data["flash_charging"] = FALSE - for(var/datum/weakref/flash_ref as anything in flashers) - var/obj/machinery/flasher/flasher = flash_ref.resolve() - if(!flasher) - flashers -= flash_ref - continue - if(flasher.last_flash && (flasher.last_flash + 15 SECONDS) > world.time) - data["flash_charging"] = TRUE - break - return data - - -/obj/machinery/door_timer/ui_act(action, params) - . = ..() - if(.) - return - - . = TRUE - - var/mob/user = usr - - if(!allowed(usr)) - to_chat(usr, span_warning("Access denied.")) - return FALSE - - switch(action) - if("time") - var/value = text2num(params["adjust"]) - if(value) - . = set_timer(time_left()+value) - investigate_log("[key_name(usr)] modified the timer by [value/10] seconds for cell [id], currently [time_left(seconds = TRUE)]", INVESTIGATE_RECORDS) - user.log_message("modified the timer by [value/10] seconds for cell [id], currently [time_left(seconds = TRUE)]", LOG_ATTACK) - if("start") - timer_start() - investigate_log("[key_name(usr)] has started [id]'s timer of [time_left(seconds = TRUE)] seconds", INVESTIGATE_RECORDS) - user.log_message("has started [id]'s timer of [time_left(seconds = TRUE)] seconds", LOG_ATTACK) - if("stop") - investigate_log("[key_name(usr)] has stopped [id]'s timer of [time_left(seconds = TRUE)] seconds", INVESTIGATE_RECORDS) - user.log_message("[key_name(usr)] has stopped [id]'s timer of [time_left(seconds = TRUE)] seconds", LOG_ATTACK) - timer_end(forced = TRUE) - if("flash") - investigate_log("[key_name(usr)] has flashed cell [id]", INVESTIGATE_RECORDS) - user.log_message("[key_name(usr)] has flashed cell [id]", LOG_ATTACK) - for(var/datum/weakref/flash_ref as anything in flashers) - var/obj/machinery/flasher/flasher = flash_ref.resolve() - if(!flasher) - flashers -= flash_ref - continue - flasher.flash() - if("preset") - var/preset = params["preset"] - var/preset_time = time_left() - switch(preset) - if("short") - preset_time = PRESET_SHORT - if("medium") - preset_time = PRESET_MEDIUM - if("long") - preset_time = PRESET_LONG - . = set_timer(preset_time) - investigate_log("[key_name(usr)] set cell [id]'s timer to [preset_time/10] seconds", INVESTIGATE_RECORDS) - user.log_message("set cell [id]'s timer to [preset_time/10] seconds", LOG_ATTACK) - if(timing) - activation_time = world.time - else - . = FALSE - - -#undef PRESET_SHORT -#undef PRESET_MEDIUM -#undef PRESET_LONG - -#undef MAX_TIMER -#undef FONT_SIZE -#undef FONT_COLOR -#undef FONT_STYLE -#undef CHARS_PER_LINE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm deleted file mode 100644 index 686d14cb735..00000000000 --- a/code/game/machinery/doors/door.dm +++ /dev/null @@ -1,617 +0,0 @@ - - -TYPEINFO_DEF(/obj/machinery/door) - default_armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 90, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 80, ACID = 70) - -DEFINE_INTERACTABLE(/obj/machinery/door) -/obj/machinery/door - name = "door" - desc = "It opens and closes." - icon = 'icons/obj/doors/Doorint.dmi' - icon_state = "door1" - base_icon_state = "door" - layer = OPEN_DOOR_LAYER - opacity = TRUE - density = TRUE - move_resist = MOVE_FORCE_VERY_STRONG - - can_astar_pass = CANASTARPASS_ALWAYS_PROC - - power_channel = AREA_USAGE_ENVIRON - pass_flags_self = PASSDOORS - max_integrity = 350 - can_atmos_pass = CANPASS_PROC - flags_1 = PREVENT_CLICK_UNDER_1 - receive_ricochet_chance_mod = 0.8 - - interaction_flags_atom = INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND - blocks_emissive = EMISSIVE_BLOCK_UNIQUE - - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.2 - - var/secondsElectrified = MACHINE_NOT_ELECTRIFIED - var/shockedby - var/visible = TRUE - var/operating = FALSE - var/glass = FALSE - var/welded = FALSE - var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors - var/emergency = FALSE // Emergency access override - var/sub_door = FALSE // true if it's meant to go under another door. - var/closingLayer = CLOSED_DOOR_LAYER - - /// Does the door automatically close - var/autoclose = FALSE - /// How long it takes for the door to automatically close after being opened - var/autoclose_delay = 15 SECONDS - - /// Whether the door detects things and mobs in its way and reopen or crushes them. - var/dont_close_on_dense_objects = TRUE - var/locked = FALSE //whether the door is bolted or not. - var/assemblytype //the type of door frame to drop during deconstruction - var/real_explosion_block //ignore this, just use explosion_block - var/red_alert_access = FALSE //if TRUE, this door will always open on red alert - var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access - var/can_crush = TRUE /// Whether or not the door can crush mobs. - var/can_open_with_hands = TRUE /// Whether or not the door can be opened by hand (used for blast doors and shutters) - ///If set, air zones cannot merge across the door even when it is opened. - var/block_air_zones = TRUE - - /// What door types do we want to align with if any - var/door_align_type - var/align_to_windows = FALSE - var/auto_dir_align = TRUE - - ///Sound to play when knocked on - var/knock_sound = 'goon/sounds/Door_Metal_Knock_1.ogg' - - /// Sparks caused by damage and such - var/datum/effect_system/spark_spread/spark_system - -/obj/machinery/door/Initialize(mapload) - . = ..() - SET_TRACKING(__TYPE__) - - set_init_door_layer() - update_freelook_sight() - register_context() - - spark_system = new /datum/effect_system/spark_spread - spark_system.set_up(2, 1, src) - if(density) - flags_1 |= PREVENT_CLICK_UNDER_1 - else - flags_1 &= ~PREVENT_CLICK_UNDER_1 - - zas_update_loc() - //doors only block while dense though so we have to use the proc - real_explosion_block = explosion_block - explosion_block = EXPLOSION_BLOCK_PROC - RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(check_security_level)) - -/obj/machinery/door/LateInitialize() - . = ..() - // Automatically align the direction of the airlock - auto_dir_align() - -/obj/machinery/door/proc/auto_dir_align() - if(!auto_dir_align) - return - // Set directional facing - var/turf/my_turf = get_turf(src) - var/turf/north_turf = get_step(my_turf, NORTH) - var/turf/south_turf = get_step(my_turf, SOUTH) - //If south or north is blocked, face towards west - var/block_dir = SOUTH - var/align_dir - for(var/i in 1 to 2) - var/turf/check_turf = i == 1 ? north_turf : south_turf - if(!check_turf) - continue - if(!check_turf.density) - //Adjacent turf is not dense, check if we can maybe align with a window or a low wall - if(align_to_windows) - var/obj/structure/window/window = locate() in check_turf - if(!window || !window.fulltile) - continue - else - continue - block_dir = WEST - break - - if(door_align_type) - var/turf/west_turf = get_step(my_turf, WEST) - var/turf/east_turf = get_step(my_turf, EAST) - for(var/i in 1 to 4) - var/dir_to_align - var/turf/check_turf - switch(i) - if(1) - check_turf = north_turf - dir_to_align = WEST - if(2) - check_turf = south_turf - dir_to_align = WEST - if(3) - check_turf = east_turf - dir_to_align = SOUTH - if(4) - check_turf = west_turf - dir_to_align = SOUTH - if(!check_turf) - continue - var/obj/machinery/door/found_door = locate(door_align_type) in check_turf - if(found_door) - align_dir = dir_to_align - break - - if(align_dir) - setDir(align_dir) - else - setDir(block_dir) - -/obj/machinery/door/examine(mob/user) - . = ..() - if(red_alert_access) - . += span_notice("In the event of a red alert, its access requirements will automatically lift.") - . += span_notice("Its maintenance panel is [panel_open ? "open" : "screwed in place"].") - -/obj/machinery/door/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(!can_open_with_hands) - return . - - if(isaicamera(user) || issilicon(user)) - return . - - if (isnull(held_item) && Adjacent(user)) - context[SCREENTIP_CONTEXT_LMB] = "Open" - context[SCREENTIP_CONTEXT_RMB] = "Knock" - return CONTEXTUAL_SCREENTIP_SET - -/obj/machinery/door/check_access_list(list/access_list) - if(red_alert_access && SSsecurity_level.current_level >= SEC_LEVEL_RED) - return TRUE - return ..() - -/obj/machinery/door/proc/set_init_door_layer() - if(density) - layer = closingLayer - else - layer = initial(layer) - -/obj/machinery/door/Destroy() - UNSET_TRACKING(__TYPE__) - update_freelook_sight() - - if(spark_system) - qdel(spark_system) - spark_system = null - return ..() - -/obj/machinery/door/zas_canpass(turf/other) - if(QDELETED(src)) - return AIR_ALLOWED - if(block_air_zones) - return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED - return density ? (AIR_BLOCKED|ZONE_BLOCKED) : AIR_ALLOWED - -/** - * Signal handler for checking if we notify our surrounding that access requirements are lifted accordingly to a newly set security level - * - * Arguments: - * * source The datum source of the signal - * * new_level The new security level that is in effect - */ -/obj/machinery/door/proc/check_security_level(datum/source, new_level) - SIGNAL_HANDLER - - if(new_level <= SEC_LEVEL_BLUE) - return - if(!red_alert_access) - return - audible_message(span_notice("[src] whirr[p_s()] as [p_they()] automatically lift[p_s()] access requirements!")) - playsound(src, 'sound/machines/boltsup.ogg', 50, TRUE) - -/obj/machinery/door/proc/try_safety_unlock(mob/user) - return FALSE - -/** - * Called when attempting to remove the seal from an airlock - * - * Here because we need to call it and return if there was a seal so we don't try to open the door - * or try its safety lock while it's sealed - * Arguments: - * * user - the mob attempting to remove the seal - */ -/obj/machinery/door/proc/try_remove_seal(mob/user) - return - -/obj/machinery/door/BumpedBy(atom/movable/AM) - . = ..() - if(operating || (obj_flags & EMAGGED) || (!can_open_with_hands && density)) - return - if(ismob(AM)) - var/mob/B = AM - if((isdrone(B) || iscyborg(B)) && B.stat) - return - if(isliving(AM)) - var/mob/living/M = AM - if(world.time - M.last_bumped <= 10) - return //Can bump-open one airlock per second. This is to prevent shock spam. - M.last_bumped = world.time - if(HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && !check_access(null) && !emergency) - return - if(try_safety_unlock(M)) - return - bumpopen(M) - return - return - - if(isitem(AM)) - var/obj/item/I = AM - if(!density || (I.w_class < WEIGHT_CLASS_NORMAL && !LAZYLEN(I.GetAccess()))) - return - if(check_access(I)) - open() - else - do_animate("deny") - return - -/obj/machinery/door/Move() - var/turf/T = loc - . = ..() - if(.) - T.zas_update_loc() - zas_update_loc() - - -/obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(.) - return - // Snowflake handling for PASSGLASS. - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return !opacity - -/obj/machinery/door/CanAStarPass(to_dir, datum/can_pass_info/pass_info) - . = ..() - if(.) - return - - if(locked) - return FALSE - - var/mob/M = pass_info.caller_ref?.resolve() - if(isnull(M)) - return - - return allowed(M) - -/obj/machinery/door/proc/bumpopen(mob/user) - if(operating || !can_open_with_hands) - return - - add_fingerprint(user) - user.animate_interact(src) - if(!density || (obj_flags & EMAGGED)) - return - - if(requiresID() && allowed(user)) - open() - else - do_animate("deny") - user.client?.give_award(/datum/award/achievement/ai_door, user) - -/obj/machinery/door/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - knock_on(user) - return TRUE - if(try_remove_seal(user)) - return - if(try_safety_unlock(user)) - return - return try_to_activate_door(user) - -/obj/machinery/door/attack_tk(mob/user) - if(requiresID() && !allowed(null)) - return - return ..() - -/obj/machinery/door/proc/try_to_activate_door(mob/user, access_bypass = FALSE, obj/item/attackedby) - set waitfor = FALSE - - if(attackedby) - attackedby.leave_evidence(user, src) - else - add_fingerprint(user) - - user.animate_interact(src) - - if(operating || (obj_flags & EMAGGED) || !can_open_with_hands) - return - - if(access_bypass || (requiresID() && allowed(user))) - . = TRUE - if(density) - open() - else - close() - return . - - if(density) - do_animate("deny") - user.client?.give_award(/datum/award/achievement/ai_door, user) - -/obj/machinery/door/allowed(mob/M) - if(emergency) - return TRUE - if(unrestricted_side(M)) - return TRUE - return ..() - -/obj/machinery/door/proc/unrestricted_side(mob/opener) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter) - return get_dir(src, opener) & unres_sides - -/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user) - return - -/// Called when the user right-clicks on the door with a welding tool. -/obj/machinery/door/proc/try_to_weld_secondary(obj/item/weldingtool/tool, mob/user) - return - - -/obj/machinery/door/proc/try_to_crowbar(obj/item/acting_object, mob/user) - return - -/// Called when the user right-clicks on the door with a crowbar. -/obj/machinery/door/proc/try_to_crowbar_secondary(obj/item/acting_object, mob/user) - return - -/obj/machinery/door/welder_act(mob/living/user, obj/item/tool) - try_to_weld(tool, user) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/crowbar_act(mob/living/user, obj/item/tool) - if(user.combat_mode) - return - - var/forced_open = FALSE - if(istype(tool, /obj/item/crowbar)) - var/obj/item/crowbar/crowbar = tool - forced_open = crowbar.force_opens - try_to_crowbar(tool, user, forced_open) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/attackby(obj/item/I, mob/living/user, params) - if((I.item_flags & NOBLUDGEON) || user.combat_mode) - return ..() - - if(istype(I, /obj/item/fireaxe)) - try_to_crowbar(I, user, FALSE) - return TRUE - - if(try_to_activate_door(user, attackedby = I)) - return TRUE - - return ..() - -/obj/machinery/door/welder_act_secondary(mob/living/user, obj/item/tool) - try_to_weld_secondary(tool, user) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/crowbar_act_secondary(mob/living/user, obj/item/tool) - var/forced_open = FALSE - if(istype(tool, /obj/item/crowbar)) - var/obj/item/crowbar/crowbar = tool - forced_open = crowbar.force_opens - try_to_crowbar_secondary(tool, user, forced_open) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - . = ..() - if(. && atom_integrity > 0) - if(damage_amount >= 10 && prob(30)) - spark_system.start() - -/obj/machinery/door/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(glass) - playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE) - else if(damage_amount) - playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE) - else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) - if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) - -/obj/machinery/door/emp_act(severity) - . = ..() - if (. & EMP_PROTECT_SELF) - return - if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) ) - INVOKE_ASYNC(src, PROC_REF(open)) - if(prob(severity*10 - 20)) - if(secondsElectrified == MACHINE_NOT_ELECTRIFIED) - secondsElectrified = MACHINE_ELECTRIFIED_PERMANENT - LAZYADD(shockedby, "\[[time_stamp()]\]EM Pulse") - addtimer(CALLBACK(src, PROC_REF(unelectrify)), 300) - -/obj/machinery/door/proc/unelectrify() - secondsElectrified = MACHINE_NOT_ELECTRIFIED - -/obj/machinery/door/update_icon_state() - icon_state = "[base_icon_state][density]" - return ..() - -/obj/machinery/door/proc/do_animate(animation) - switch(animation) - if("opening") - if(panel_open) - z_flick("o_doorc0", src) - else - z_flick("doorc0", src) - if("closing") - if(panel_open) - z_flick("o_doorc1", src) - else - z_flick("doorc1", src) - if("deny") - if(!machine_stat) - z_flick("door_deny", src) - - -/obj/machinery/door/proc/open() - if(!density) - return 1 - if(operating) - return - operating = TRUE - use_power(active_power_usage) - do_animate("opening") - set_opacity(0) - sleep(5) - set_density(FALSE) - flags_1 &= ~PREVENT_CLICK_UNDER_1 - sleep(5) - layer = initial(layer) - update_appearance() - set_opacity(0) - operating = FALSE - zas_update_loc() - update_freelook_sight() - if(autoclose) - autoclose_in() - return 1 - -/obj/machinery/door/proc/close() - if(density) - return TRUE - if(operating || welded) - return - if(dont_close_on_dense_objects) - for(var/atom/movable/M in get_turf(src)) - if(M.density && M != src) //something is blocking the door - if(autoclose) - autoclose_in() - return - - operating = TRUE - - do_animate("closing") - layer = closingLayer - sleep(5) - set_density(TRUE) - flags_1 |= PREVENT_CLICK_UNDER_1 - sleep(5) - update_appearance() - if(visible && !glass) - set_opacity(1) - operating = FALSE - zas_update_loc() - update_freelook_sight() - - if(!can_crush) - return TRUE - - if(dont_close_on_dense_objects) - CheckForMobs() - else - crush() - return TRUE - -/obj/machinery/door/proc/CheckForMobs() - if(locate(/mob/living) in get_turf(src)) - sleep(1) - open() - -/obj/machinery/door/proc/crush() - for(var/mob/living/L in get_turf(src)) - L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) - SEND_SIGNAL(L, COMSIG_LIVING_DOORCRUSHED, src) - if(isalien(L)) //For xenos - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. - L.emote("roar") - else if(ishuman(L)) //For humans - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.emote("agony") - L.Paralyze(100) - else //for simple_animals & borgs - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - var/turf/location = get_turf(src) - //add_blood doesn't work for borgs/xenos, but add_blood_floor does. - L.add_splatter_floor(location) - log_combat(src, L, "crushed") - for(var/obj/vehicle/sealed/mecha/M in get_turf(src)) - M.take_damage(DOOR_CRUSH_DAMAGE) - log_combat(src, M, "crushed") - -/obj/machinery/door/proc/autoclose() - if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) - close() - -/obj/machinery/door/proc/autoclose_in(wait = autoclose_delay) - addtimer(CALLBACK(src, PROC_REF(autoclose)), wait, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE) - -/obj/machinery/door/proc/requiresID() - return 1 - -/obj/machinery/door/proc/hasPower() - return !(machine_stat & NOPOWER) - -/obj/machinery/door/proc/update_freelook_sight() - if(!glass && GLOB.cameranet) - GLOB.cameranet.updateVisibility(src, 0) - -/obj/machinery/door/block_superconductivity() // All non-glass airlocks block heat, this is intended. - if(opacity || heat_proof) - return 1 - return 0 - -/obj/machinery/door/morgue - icon = 'icons/obj/doors/doormorgue.dmi' - -/obj/machinery/door/get_dumping_location() - return null - -/obj/machinery/door/proc/lock() - return - -/obj/machinery/door/proc/unlock() - return - -/obj/machinery/door/proc/hostile_lockdown(mob/origin) - if(!machine_stat) //So that only powered doors are closed. - close() //Close ALL the doors! - -/obj/machinery/door/proc/disable_lockdown() - if(!machine_stat) //Opens only powered doors. - open() //Open everything! - -/obj/machinery/door/ex_act(severity, target) - //if it blows up a wall it should blow up a door - return ..(severity ? min(EXPLODE_DEVASTATE, severity + 1) : EXPLODE_NONE, target) - -/obj/machinery/door/GetExplosionBlock() - return density ? real_explosion_block : 0 - -/obj/machinery/door/power_change() - . = ..() - if(. && !(machine_stat & NOPOWER)) - autoclose_in() - -/obj/machinery/door/zap_act(power, zap_flags) - zap_flags &= ~ZAP_OBJ_DAMAGE - . = ..() - -/obj/machinery/door/proc/knock_on(mob/user) - user?.changeNext_move(CLICK_CD_MELEE) - playsound(src, knock_sound, 100, TRUE) - add_fingerprint(user) - user?.animate_interact(src, INTERACT_GENERIC) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm deleted file mode 100644 index f19d75bbf12..00000000000 --- a/code/game/machinery/doors/firedoor.dm +++ /dev/null @@ -1,604 +0,0 @@ -#define CONSTRUCTION_PANEL_OPEN 1 //Maintenance panel is open, still functioning -#define CONSTRUCTION_NO_CIRCUIT 2 //Circuit board removed, can safely weld apart -#define DEFAULT_STEP_TIME 20 /// default time for each step -#define DETECT_COOLDOWN_STEP_TIME 5 SECONDS ///Wait time before we can detect an issue again, after a recent clear. - -TYPEINFO_DEF(/obj/machinery/door/firedoor) - default_armor = list(BLUNT = 10, PUNCTURE = 30, SLASH = 90, LASER = 20, ENERGY = 20, BOMB = 30, BIO = 100, FIRE = 95, ACID = 70) - -/obj/machinery/door/firedoor - name = "firelock" - desc = "Apply crowbar." - icon = 'icons/obj/doors/doorfire.dmi' - icon_state = "door_open" - opacity = FALSE - density = FALSE - max_integrity = 50 - resistance_flags = FIRE_PROOF - heat_proof = TRUE - glass = FALSE - sub_door = TRUE - explosion_block = 1 - dont_close_on_dense_objects = FALSE - layer = BELOW_OPEN_DOOR_LAYER - closingLayer = CLOSED_FIREDOOR_LAYER - assemblytype = /obj/structure/firelock_frame - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - door_align_type = /obj/machinery/door/firedoor - - align_to_windows = TRUE - ///Trick to get the glowing overlay visible from a distance - luminosity = 1 - ///X offset for the overlay lights, so that they line up with the thin border firelocks - var/light_xoffset = 0 - ///Y offset for the overlay lights, so that they line up with the thin border firelocks - var/light_yoffset = 0 - - var/boltslocked = TRUE - ///The firedoor's area loc - var/area/my_area - ///Every area a firedoor is listening to. - var/list/joined_areas = list() - ///Type of alarm when active. See code/defines/firealarm.dm for the list. This var being null means there is no alarm. - var/alert_type = FIRE_CLEAR - - knock_sound = 'sound/effects/glassknock.ogg' - var/bash_sound = 'sound/effects/glassbash.ogg' - - -/obj/machinery/door/firedoor/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_FIRE_ALERT, PROC_REF(handle_alert)) - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/door/firedoor/LateInitialize() - . = ..() - set_area(get_area(src)) - -/obj/machinery/door/firedoor/Destroy() - set_area(null) - return ..() - -/** - * Sets the offset for the warning lights. - * - * Used for special firelocks with light overlays that don't line up to their sprite. - */ -/obj/machinery/door/firedoor/proc/adjust_lights_starting_offset() - return - -/obj/machinery/door/firedoor/examine(mob/user) - . = ..() - if(!density) - . += span_notice("It is open, but could be pried closed.") - - else if(!welded) - . += span_notice("It is closed, but could be pried open.") - . += span_notice("Hold the firelock temporarily open by prying it with left-click and standing next to it.") - . += span_notice("Prying by right-clicking the firelock will open it permanently.") - . += span_notice("Deconstruction would require it to be welded shut.") - - else if(boltslocked) - . += span_notice("It is welded shut. The floor bolts have been locked by screws.") - else - . += span_notice("The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor.") - -/obj/machinery/door/firedoor/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(!isliving(user)) - return . - - var/mob/living/living_user = user - - if (isnull(held_item)) - if(density) - if(isalienadult(living_user) || issilicon(living_user)) - context[SCREENTIP_CONTEXT_LMB] = "Open" - return CONTEXTUAL_SCREENTIP_SET - if(!living_user.combat_mode) - if(ishuman(living_user)) - context[SCREENTIP_CONTEXT_LMB] = "Knock" - return CONTEXTUAL_SCREENTIP_SET - else - if(ismonkey(living_user)) - context[SCREENTIP_CONTEXT_LMB] = "Attack" - return CONTEXTUAL_SCREENTIP_SET - if(ishuman(living_user)) - context[SCREENTIP_CONTEXT_LMB] = "Bash" - return CONTEXTUAL_SCREENTIP_SET - else if(issilicon(living_user)) - context[SCREENTIP_CONTEXT_LMB] = "Close" - return CONTEXTUAL_SCREENTIP_SET - return . - - if(!Adjacent(src, living_user)) - return . - - switch (held_item.tool_behaviour) - if (TOOL_CROWBAR) - if (!density) - context[SCREENTIP_CONTEXT_LMB] = "Close" - else if (!welded) - context[SCREENTIP_CONTEXT_LMB] = "Hold open" - context[SCREENTIP_CONTEXT_RMB] = "Open permanently" - return CONTEXTUAL_SCREENTIP_SET - if (TOOL_WELDER) - context[SCREENTIP_CONTEXT_LMB] = welded ? "Unweld shut" : "Weld shut" - return CONTEXTUAL_SCREENTIP_SET - if (TOOL_WRENCH) - if (welded && !boltslocked) - context[SCREENTIP_CONTEXT_LMB] = "Unfasten bolts" - return CONTEXTUAL_SCREENTIP_SET - if (TOOL_SCREWDRIVER) - if (welded) - context[SCREENTIP_CONTEXT_LMB] = "Unlock bolts" - return CONTEXTUAL_SCREENTIP_SET - - return . - -/obj/machinery/door/firedoor/Moved(atom/oldloc, list/old_locs, momentum_change = TRUE) - . = ..() - var/new_area = get_area(src) - if(my_area != new_area) - set_area(new_area) - -/obj/machinery/door/firedoor/proc/set_area(new_area) - if(my_area) - LAZYREMOVE(my_area.firedoors, src) - for(var/area/A in joined_areas) - LAZYREMOVE(A.firedoors, src) - joined_areas.Cut() - - if(!new_area) - return - my_area = new_area - - if(!my_area) - return - - for(var/area/area2join in get_adjacent_open_areas(src) | my_area) - LAZYDISTINCTADD(area2join.firedoors, src) - joined_areas |= area2join - -/obj/machinery/door/firedoor/proc/handle_alert(datum/source, code) - SIGNAL_HANDLER - - if(!!alert_type == !!code) - return - - alert_type = code - - if(code == FIRE_CLEAR) - INVOKE_ASYNC(src, PROC_REF(open)) - else - INVOKE_ASYNC(src, PROC_REF(close)) - -/obj/machinery/door/firedoor/emag_act(mob/user, obj/item/card/emag/doorjack/digital_crowbar) - if(obj_flags & EMAGGED) - return - if(!isAI(user)) //Skip doorjack-specific code - if(!user || digital_crowbar.charges < 1) - return - digital_crowbar.use_charge(user) - obj_flags |= EMAGGED - INVOKE_ASYNC(src, PROC_REF(open)) - -/obj/machinery/door/firedoor/BumpedBy(atom/movable/AM) - if(panel_open || operating) - return - if(!density) - return ..() - return FALSE - -/obj/machinery/door/firedoor/bumpopen(mob/living/user) - return FALSE //No bumping to open, not even in mechs - -/obj/machinery/door/firedoor/power_change() - . = ..() - update_icon() - -/obj/machinery/door/firedoor/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - if(operating || !density) - return - user.changeNext_move(CLICK_CD_MELEE) - - if(!user.combat_mode || modifiers[RIGHT_CLICK]) - knock_on(user) - return TRUE - else - user.visible_message(span_warning("[user] bashes [src]!"), \ - span_warning("You bash [src]!")) - playsound(src, bash_sound, 100, TRUE) - return TRUE - -/obj/machinery/door/firedoor/wrench_act(mob/living/user, obj/item/tool) - tool.leave_evidence(user, src) - if(operating || !welded) - return FALSE - - if(boltslocked) - to_chat(user, span_notice("There are screws locking the bolts in place!")) - return ITEM_INTERACT_SUCCESS - tool.play_tool_sound(src) - user.visible_message(span_notice("[user] starts undoing [src]'s bolts..."), \ - span_notice("You start unfastening [src]'s floor bolts...")) - if(!tool.use_tool(src, user, DEFAULT_STEP_TIME)) - return ITEM_INTERACT_SUCCESS - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - user.visible_message(span_notice("[user] unfastens [src]'s bolts."), \ - span_notice("You undo [src]'s floor bolts.")) - deconstruct(TRUE) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/firedoor/screwdriver_act(mob/living/user, obj/item/tool) - if(operating || !welded) - return FALSE - user.visible_message(span_notice("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts."), \ - span_notice("You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.")) - tool.play_tool_sound(src) - boltslocked = !boltslocked - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/firedoor/try_to_activate_door(mob/user, access_bypass = FALSE, obj/item/attackedby) - return - -/obj/machinery/door/firedoor/try_to_weld(obj/item/weldingtool/W, mob/user) - if(!W.tool_start_check(user, amount=0)) - return - user.visible_message(span_notice("[user] starts [welded ? "unwelding" : "welding"] [src]."), span_notice("You start welding [src].")) - if(W.use_tool(src, user, DEFAULT_STEP_TIME, volume=50)) - welded = !welded - user.visible_message(span_danger("[user] [welded?"welds":"unwelds"] [src]."), span_notice("You [welded ? "weld" : "unweld"] [src].")) - log_game("[key_name(user)] [welded ? "welded":"unwelded"] firedoor [src] with [W] at [AREACOORD(src)]") - update_appearance() - -/// We check for adjacency when using the primary attack. -/obj/machinery/door/firedoor/try_to_crowbar(obj/item/acting_object, mob/user) - if(welded || operating) - return - - if(density) - user.visible_message( - span_danger("[user] presses their crowbar into [src] to pry it open!"), - span_notice("You press your crowbar between the door and begin to pry it open..."), - span_hear("You hear a metal clang, followed by metallic groans.") - ) - if(!do_after(user, src, 3 SECONDS, DO_PUBLIC)) - return - user.visible_message( - span_danger("[user] forces [src] open with a crowbar!"), - span_notice("You force open [src]."), - span_hear("You hear a heavy metallic object sliding.") - ) - open() - else - user.visible_message( - span_notice("[user] forces [src] shut."), - span_notice("You force [src] closed."), - span_hear("You hear a heavy metallic object sliding, followed by a clang.") - ) - close() - -/obj/machinery/door/firedoor/attack_ai(mob/user) - add_fingerprint(user) - if(welded || operating || machine_stat & NOPOWER) - return TRUE - if(density) - open() - else - close() - return TRUE - -/obj/machinery/door/firedoor/attack_robot(mob/user) - return attack_ai(user) - -/obj/machinery/door/firedoor/attack_alien(mob/user, list/modifiers) - add_fingerprint(user) - if(welded) - to_chat(user, span_warning("[src] refuses to budge!")) - return - open() - -/obj/machinery/door/firedoor/do_animate(animation) - switch(animation) - if("opening") - z_flick("[base_icon_state]_opening", src) - if("closing") - z_flick("[base_icon_state]_closing", src) - -/obj/machinery/door/firedoor/update_icon_state() - . = ..() - icon_state = "[base_icon_state]_[density ? "closed" : "open"]" - -/obj/machinery/door/firedoor/update_overlays() - . = ..() - if(welded) - . += density ? "welded" : "welded_open" - if(alert_type && powered()) - var/iconstate2use - switch(alert_type) - if(FIRE_RAISED_HOT, FIRE_RAISED_GENERIC) - iconstate2use = "firelock_alarm_type_hot" - if(FIRE_RAISED_COLD) - iconstate2use = "firelock_alarm_type_cold" - if(FIRE_RAISED_PRESSURE) - iconstate2use = "firelock_alarm_type_pressure" - var/mutable_appearance/hazards - hazards = mutable_appearance(icon, iconstate2use, alpha = src.alpha) - hazards.pixel_x = light_xoffset - hazards.pixel_y = light_yoffset - . += hazards - -/obj/machinery/door/firedoor/open() - if(welded) - return - . = ..() - if(.) - playsound(loc, 'sound/machines/doors/blastdoor_open.ogg', 60, TRUE) - -/obj/machinery/door/firedoor/close() - if(HAS_TRAIT(loc, TRAIT_FIREDOOR_STOP)) - return - . = ..() - if(.) - playsound(loc, 'sound/machines/doors/blastdoor_close.ogg', 60, TRUE) - - -/obj/machinery/door/firedoor/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - var/turf/targetloc = get_turf(src) - if(disassembled || prob(40)) - var/obj/structure/firelock_frame/unbuilt_lock = new assemblytype(targetloc) - if(disassembled) - unbuilt_lock.constructionStep = CONSTRUCTION_PANEL_OPEN - else - unbuilt_lock.constructionStep = CONSTRUCTION_NO_CIRCUIT - unbuilt_lock.update_integrity(unbuilt_lock.max_integrity * 0.5) - unbuilt_lock.update_appearance() - else - new /obj/item/electronics/firelock (targetloc) - qdel(src) - -/obj/machinery/door/firedoor/closed - icon_state = "door_closed" - density = TRUE - alert_type = FIRE_RAISED_GENERIC - -/obj/machinery/door/firedoor/border_only - icon = 'icons/obj/doors/edge_Doorfire.dmi' - can_crush = FALSE - flags_1 = ON_BORDER_1 - can_atmos_pass = CANPASS_PROC - auto_dir_align = FALSE - -/obj/machinery/door/firedoor/border_only/closed - icon_state = "door_closed" - density = TRUE - alert_type = FIRE_RAISED_GENERIC - -/obj/machinery/door/firedoor/border_only/Initialize(mapload) - . = ..() - adjust_lights_starting_offset() - - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit) - ) - - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/machinery/door/firedoor/border_only/adjust_lights_starting_offset() - light_xoffset = 0 - light_yoffset = 0 - switch(dir) - if(NORTH) - light_yoffset = 2 - if(SOUTH) - light_yoffset = -2 - if(EAST) - light_xoffset = 2 - if(WEST) - light_xoffset = -2 - update_icon() - -/obj/machinery/door/firedoor/border_only/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - adjust_lights_starting_offset() - -/obj/machinery/door/firedoor/border_only/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(!(border_dir == dir)) //Make sure looking at appropriate border - return TRUE - -/obj/machinery/door/firedoor/border_only/CanAStarPass(to_dir, datum/can_pass_info/pass_info) - return !density || (dir != to_dir) - -/obj/machinery/door/firedoor/border_only/proc/on_exit(datum/source, atom/movable/leaving, direction) - SIGNAL_HANDLER - if(leaving.movement_type & PHASING) - return - if(leaving == src) - return // Let's not block ourselves. - - if(direction == dir && density) - leaving.Bump(src) - return COMPONENT_ATOM_BLOCK_EXIT - -/obj/machinery/door/firedoor/border_only/zas_canpass(turf/T) - if(QDELETED(src)) - return AIR_ALLOWED - if(get_dir(loc, T) == dir) - return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED - else - return ZONE_BLOCKED - -/obj/machinery/door/firedoor/heavy - name = "heavy firelock" - icon = 'icons/obj/doors/Doorfire.dmi' - glass = FALSE - explosion_block = 2 - assemblytype = /obj/structure/firelock_frame/heavy - max_integrity = 550 - - -/obj/item/electronics/firelock - name = "firelock circuitry" - desc = "A circuit board used in construction of firelocks." - icon_state = "mainboard" - -/obj/structure/firelock_frame - name = "firelock frame" - desc = "A partially completed firelock." - icon = 'icons/obj/doors/Doorfire.dmi' - icon_state = "frame1" - base_icon_state = "frame" - anchored = FALSE - density = TRUE - var/constructionStep = CONSTRUCTION_NO_CIRCUIT - var/reinforced = 0 - -/obj/structure/firelock_frame/examine(mob/user) - . = ..() - switch(constructionStep) - if(CONSTRUCTION_PANEL_OPEN) - . += span_notice("It is unbolted from the floor. The circuit could be removed with a crowbar.") - if(!reinforced) - . += span_notice("It could be reinforced with plasteel.") - if(CONSTRUCTION_NO_CIRCUIT) - . += span_notice("There are no firelock electronics in the frame. The frame could be welded apart .") - -/obj/structure/firelock_frame/update_icon_state() - icon_state = "[base_icon_state][constructionStep]" - return ..() - -/obj/structure/firelock_frame/attackby(obj/item/attacking_object, mob/user) - switch(constructionStep) - if(CONSTRUCTION_PANEL_OPEN) - if(attacking_object.tool_behaviour == TOOL_CROWBAR) - attacking_object.play_tool_sound(src) - user.visible_message(span_notice("[user] begins removing the circuit board from [src]..."), \ - span_notice("You begin prying out the circuit board from [src]...")) - if(!attacking_object.use_tool(src, user, DEFAULT_STEP_TIME)) - return - if(constructionStep != CONSTRUCTION_PANEL_OPEN) - return - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - user.visible_message(span_notice("[user] removes [src]'s circuit board."), \ - span_notice("You remove the circuit board from [src].")) - new /obj/item/electronics/firelock(drop_location()) - constructionStep = CONSTRUCTION_NO_CIRCUIT - update_appearance() - return - if(attacking_object.tool_behaviour == TOOL_WRENCH) - if(locate(/obj/machinery/door/firedoor) in get_turf(src)) - to_chat(user, span_warning("There's already a firelock there.")) - return - attacking_object.play_tool_sound(src) - user.visible_message(span_notice("[user] starts bolting down [src]..."), \ - span_notice("You begin bolting [src]...")) - if(!attacking_object.use_tool(src, user, DEFAULT_STEP_TIME)) - return - if(locate(/obj/machinery/door/firedoor) in get_turf(src)) - return - user.visible_message(span_notice("[user] finishes the firelock."), \ - span_notice("You finish the firelock.")) - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - if(reinforced) - new /obj/machinery/door/firedoor/heavy(get_turf(src)) - else - new /obj/machinery/door/firedoor(get_turf(src)) - qdel(src) - return - if(istype(attacking_object, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/plasteel_sheet = attacking_object - if(reinforced) - to_chat(user, span_warning("[src] is already reinforced.")) - return - if(plasteel_sheet.get_amount() < 2) - to_chat(user, span_warning("You need more plasteel to reinforce [src].")) - return - user.visible_message(span_notice("[user] begins reinforcing [src]..."), \ - span_notice("You begin reinforcing [src]...")) - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - if(do_after(user, src, DEFAULT_STEP_TIME)) - if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || plasteel_sheet.get_amount() < 2 || !plasteel_sheet) - return - user.visible_message(span_notice("[user] reinforces [src]."), \ - span_notice("You reinforce [src].")) - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - plasteel_sheet.use(2) - reinforced = 1 - return - if(CONSTRUCTION_NO_CIRCUIT) - if(istype(attacking_object, /obj/item/electronics/firelock)) - user.visible_message(span_notice("[user] starts adding [attacking_object] to [src]..."), \ - span_notice("You begin adding a circuit board to [src]...")) - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - if(!do_after(user, src, DEFAULT_STEP_TIME)) - return - if(constructionStep != CONSTRUCTION_NO_CIRCUIT) - return - qdel(attacking_object) - user.visible_message(span_notice("[user] adds a circuit to [src]."), \ - span_notice("You insert and secure [attacking_object].")) - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - constructionStep = CONSTRUCTION_PANEL_OPEN - return - if(attacking_object.tool_behaviour == TOOL_WELDER) - if(!attacking_object.tool_start_check(user, amount=1)) - return - user.visible_message(span_notice("[user] begins cutting apart [src]'s frame..."), \ - span_notice("You begin slicing [src] apart...")) - - if(attacking_object.use_tool(src, user, DEFAULT_STEP_TIME, volume=50, amount=1)) - if(constructionStep != CONSTRUCTION_NO_CIRCUIT) - return - user.visible_message(span_notice("[user] cuts apart [src]!"), \ - span_notice("You cut [src] into metal.")) - var/turf/tagetloc = get_turf(src) - new /obj/item/stack/sheet/steel(tagetloc, 3) - if(reinforced) - new /obj/item/stack/sheet/plasteel(tagetloc, 2) - qdel(src) - return - if(istype(attacking_object, /obj/item/electroadaptive_pseudocircuit)) - var/obj/item/electroadaptive_pseudocircuit/raspberrypi = attacking_object - if(!raspberrypi.adapt_circuit(user, DEFAULT_STEP_TIME * 0.5)) - return - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a firelock circuit and slot it into the assembly.")) - constructionStep = CONSTRUCTION_PANEL_OPEN - update_appearance() - return - return ..() - -/obj/structure/firelock_frame/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) - else if((constructionStep == CONSTRUCTION_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) - return FALSE - -/obj/structure/firelock_frame/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_UPGRADE_SIMPLE_CIRCUITS) - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a firelock circuit and slot it into the assembly.")) - constructionStep = CONSTRUCTION_PANEL_OPEN - update_appearance() - return TRUE - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct [src].")) - qdel(src) - return TRUE - return FALSE - -/obj/structure/firelock_frame/heavy - name = "heavy firelock frame" - reinforced = TRUE - -#undef CONSTRUCTION_PANEL_OPEN -#undef CONSTRUCTION_NO_CIRCUIT diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm deleted file mode 100644 index 7e4743a491b..00000000000 --- a/code/game/machinery/doors/passworddoor.dm +++ /dev/null @@ -1,76 +0,0 @@ -TYPEINFO_DEF(/obj/machinery/door/password) - default_armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) - -/obj/machinery/door/password - name = "door" - desc = "This door only opens when provided a password." - icon = 'icons/obj/doors/blastdoor.dmi' - icon_state = "closed" - explosion_block = 3 - heat_proof = TRUE - max_integrity = 600 - resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF - damage_deflection = 70 - var/password = "Swordfish" - var/interaction_activated = TRUE //use the door to enter the password - var/voice_activated = FALSE //Say the password nearby to open the door. - -/obj/machinery/door/password/voice - voice_activated = TRUE - - -/obj/machinery/door/password/Initialize(mapload) - . = ..() - if(voice_activated) - become_hearing_sensitive() - -/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) - . = ..() - if(!density || !voice_activated || radio_freq) - return - if(findtext(raw_message,password)) - open() - -/obj/machinery/door/password/BumpedBy(atom/movable/AM) - return !density && ..() - -/obj/machinery/door/password/try_to_activate_door(mob/user, access_bypass = FALSE, obj/item/attackedby) - if(attackedby) - attackedby.leave_evidence(user, src) - else - add_fingerprint(user) - if(operating) - return - if(density) - if(access_bypass || ask_for_pass(user)) - open() - else - do_animate("deny") - -/obj/machinery/door/password/update_icon_state() - . = ..() - icon_state = density ? "closed" : "open" - -/obj/machinery/door/password/do_animate(animation) - switch(animation) - if("opening") - z_flick("opening", src) - playsound(src, 'sound/machines/doors/blastdoor_open.ogg', 30, TRUE) - if("closing") - z_flick("closing", src) - playsound(src, 'sound/machines/doors/blastdoor_close.ogg', 30, TRUE) - if("deny") - //Deny animation would be nice to have. - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - -/obj/machinery/door/password/proc/ask_for_pass(mob/user) - var/guess = tgui_input_text(user, "Enter the password", "Password") - if(guess == password) - return TRUE - return FALSE - -/obj/machinery/door/password/emp_act(severity) - return - -/obj/machinery/door/password/ex_act(severity, target) - return FALSE diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm deleted file mode 100644 index 7fa411d25af..00000000000 --- a/code/game/machinery/doors/poddoor.dm +++ /dev/null @@ -1,210 +0,0 @@ -TYPEINFO_DEF(/obj/machinery/door/poddoor) - default_armor = list(BLUNT = 50, PUNCTURE = 100, SLASH = 100, LASER = 100, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 100, ACID = 70) - -/obj/machinery/door/poddoor - name = "blast door" - desc = "A heavy duty blast door that opens mechanically." - icon = 'icons/obj/doors/blastdoor.dmi' - icon_state = "closed" - layer = BLASTDOOR_LAYER - closingLayer = CLOSED_BLASTDOOR_LAYER - sub_door = TRUE - explosion_block = 3 - heat_proof = TRUE - dont_close_on_dense_objects = FALSE - max_integrity = 600 - resistance_flags = FIRE_PROOF - damage_deflection = 70 - can_open_with_hands = FALSE - block_air_zones = FALSE - smoothing_groups = SMOOTH_GROUP_SHUTTERS_BLASTDOORS - door_align_type = /obj/machinery/door/poddoor - var/datum/crafting_recipe/recipe_type = /datum/crafting_recipe/blast_doors - var/deconstruction = BLASTDOOR_FINISHED // deconstruction step - var/id = 1 - -/obj/machinery/door/poddoor/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if (density) - balloon_alert(user, "open the door first!") - return ITEM_INTERACT_SUCCESS - else if (default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/poddoor/multitool_act(mob/living/user, obj/item/tool) - . = ..() - if (density) - balloon_alert(user, "open the door first!") - return ITEM_INTERACT_SUCCESS - if (!panel_open) - return - if (deconstruction != BLASTDOOR_FINISHED) - return - var/change_id = tgui_input_number(user, "Set the door controllers ID", "Door Controller ID", id, 100) - if(!change_id || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) - return - id = change_id - to_chat(user, span_notice("You change the ID to [id].")) - balloon_alert(user, "ID changed") - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/poddoor/crowbar_act(mob/living/user, obj/item/tool) - . = ..() - if(machine_stat & NOPOWER) - open(TRUE) - return ITEM_INTERACT_SUCCESS - if (density) - balloon_alert(user, "open the door first!") - return ITEM_INTERACT_SUCCESS - if (!panel_open) - return - if (deconstruction != BLASTDOOR_FINISHED) - return - balloon_alert(user, "removing airlock electronics...") - if(tool.use_tool(src, user, 10 SECONDS, volume = 50)) - new /obj/item/electronics/airlock(loc) - id = null - deconstruction = BLASTDOOR_NEEDS_ELECTRONICS - balloon_alert(user, "removed airlock electronics") - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/poddoor/wirecutter_act(mob/living/user, obj/item/tool) - . = ..() - if (density) - balloon_alert(user, "open the door first!") - return ITEM_INTERACT_SUCCESS - if (!panel_open) - return - if (deconstruction != BLASTDOOR_NEEDS_ELECTRONICS) - return - balloon_alert(user, "removing internal cables...") - if(tool.use_tool(src, user, 10 SECONDS, volume = 50)) - var/datum/crafting_recipe/recipe = locate(recipe_type) in GLOB.crafting_recipes - var/amount = recipe.reqs[/obj/item/stack/cable_coil] - new /obj/item/stack/cable_coil(loc, amount) - deconstruction = BLASTDOOR_NEEDS_WIRES - balloon_alert(user, "removed internal cables") - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/poddoor/welder_act(mob/living/user, obj/item/tool) - . = ..() - if (density) - balloon_alert(user, "open the door first!") - return ITEM_INTERACT_SUCCESS - if (!panel_open) - return - if (deconstruction != BLASTDOOR_NEEDS_WIRES) - return - balloon_alert(user, "tearing apart...") //You're tearing me apart, Lisa! - if(tool.use_tool(src, user, 15 SECONDS, volume = 50)) - var/datum/crafting_recipe/recipe = locate(recipe_type) in GLOB.crafting_recipes - var/amount = recipe.reqs[/obj/item/stack/sheet/plasteel] - new /obj/item/stack/sheet/plasteel(loc, amount) - user.balloon_alert(user, "torn apart") - qdel(src) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/door/poddoor/examine(mob/user) - . = ..() - if(panel_open) - if(deconstruction == BLASTDOOR_FINISHED) - . += span_notice("The maintenance panel is opened and the electronics could be pried out.") - else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) - . += span_notice("The electronics are missing and there are some wires sticking out.") - else if(deconstruction == BLASTDOOR_NEEDS_WIRES) - . += span_notice("The wires have been removed and it's ready to be sliced apart.") - -/obj/machinery/door/poddoor/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) - id = "[port.id]_[id]" - -//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS. -/obj/machinery/door/poddoor/ex_act(severity, target) - if(severity <= EXPLODE_LIGHT) - return FALSE - return ..() - -/obj/machinery/door/poddoor/do_animate(animation) - switch(animation) - if("opening") - z_flick("opening", src) - playsound(src, 'sound/machines/doors/blastdoor_open.ogg', 60, TRUE) - if("closing") - z_flick("closing", src) - playsound(src, 'sound/machines/doors/blastdoor_close.ogg', 60, TRUE) - -/obj/machinery/door/poddoor/update_icon_state() - . = ..() - icon_state = density ? "closed" : "open" - -/obj/machinery/door/poddoor/attack_alien(mob/living/carbon/alien/humanoid/user, list/modifiers) - if(density & !(resistance_flags & INDESTRUCTIBLE)) - add_fingerprint(user) - user.visible_message(span_warning("[user] begins prying open [src]."),\ - span_noticealien("You begin digging your claws into [src] with all your might!"),\ - span_warning("You hear groaning metal...")) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - - var/time_to_open = 5 SECONDS - if(hasPower()) - time_to_open = 15 SECONDS - - if(do_after(user, src, time_to_open)) - if(density && !open(TRUE)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) - to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!")) - - else - return ..() - -/obj/machinery/door/poddoor/preopen - icon_state = "open" - density = FALSE - opacity = FALSE - -/obj/machinery/door/poddoor/ert - name = "hardened blast door" - desc = "A heavy duty blast door that only opens for dire emergencies." - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -//special poddoors that open when emergency shuttle docks at centcom -/obj/machinery/door/poddoor/shuttledock - var/checkdir = 4 //door won't open if turf in this dir is `turftype` - var/turftype = /turf/open/space - -/obj/machinery/door/poddoor/shuttledock/proc/check() - var/turf/turf = get_step(src, checkdir) - if(!istype(turf, turftype)) - INVOKE_ASYNC(src, PROC_REF(open)) - else - INVOKE_ASYNC(src, PROC_REF(close)) - -/obj/machinery/door/poddoor/incinerator_ordmix - name = "combustion chamber vent" - id = INCINERATOR_ORDMIX_VENT - -/obj/machinery/door/poddoor/incinerator_atmos_main - name = "turbine vent" - id = INCINERATOR_ATMOS_MAINVENT - -/obj/machinery/door/poddoor/incinerator_atmos_aux - name = "combustion chamber vent" - id = INCINERATOR_ATMOS_AUXVENT - -/obj/machinery/door/poddoor/atmos_test_room_mainvent_1 - name = "test chamber 1 vent" - id = TEST_ROOM_ATMOS_MAINVENT_1 - -/obj/machinery/door/poddoor/atmos_test_room_mainvent_2 - name = "test chamber 2 vent" - id = TEST_ROOM_ATMOS_MAINVENT_2 - -/obj/machinery/door/poddoor/massdriver_ordnance - name = "Ordnance Launcher Bay Door" - id = MASSDRIVER_ORDNANCE - -/obj/machinery/door/poddoor/massdriver_chapel - name = "Chapel Launcher Bay Door" - id = MASSDRIVER_CHAPEL - -/obj/machinery/door/poddoor/massdriver_trash - name = "Disposals Launcher Bay Door" - id = MASSDRIVER_DISPOSALS diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm deleted file mode 100644 index 029c87c107d..00000000000 --- a/code/game/machinery/doors/shutters.dm +++ /dev/null @@ -1,64 +0,0 @@ -TYPEINFO_DEF(/obj/machinery/door/poddoor/shutters) - default_armor = list(BLUNT = 20, PUNCTURE = 20, SLASH = 90, LASER = 20, ENERGY = 75, BOMB = 25, BIO = 100, FIRE = 100, ACID = 70) - -/obj/machinery/door/poddoor/shutters - gender = PLURAL - name = "shutters" - desc = "Heavy duty mechanical shutters with an atmospheric seal that keeps them airtight once closed." - icon = 'icons/obj/doors/shutters.dmi' - layer = SHUTTER_LAYER - closingLayer = SHUTTER_LAYER_CLOSED - damage_deflection = 5 - max_integrity = 100 - recipe_type = /datum/crafting_recipe/shutters - -/obj/machinery/door/poddoor/shutters/preopen - icon_state = "open" - density = FALSE - opacity = FALSE - -/obj/machinery/door/poddoor/shutters/do_animate(animation) - switch(animation) - if("opening") - z_flick("opening", src) - playsound(src, 'sound/machines/doors/shutters_open.ogg', 100, TRUE) - if("closing") - z_flick("closing", src) - playsound(src, 'sound/machines/doors/shutters_close.ogg', 100, TRUE) - -/obj/machinery/door/poddoor/shutters/indestructible - name = "hardened shutters" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/door/poddoor/shutters/radiation - name = "radiation shutters" - desc = "Lead-lined shutters with a radiation hazard symbol. Whilst this won't stop you getting irradiated, especially by a supermatter crystal, it will stop radiation travelling as far." - icon = 'icons/obj/doors/shutters_radiation.dmi' - icon_state = "closed" - rad_insulation = RAD_EXTREME_INSULATION - -/obj/machinery/door/poddoor/shutters/radiation/preopen - icon_state = "open" - density = FALSE - opacity = FALSE - rad_insulation = RAD_NO_INSULATION - -/obj/machinery/door/poddoor/shutters/radiation/open() - . = ..() - rad_insulation = RAD_NO_INSULATION - -/obj/machinery/door/poddoor/shutters/radiation/close() - . = ..() - rad_insulation = RAD_EXTREME_INSULATION - -/obj/machinery/door/poddoor/shutters/window - name = "windowed shutters" - desc = "A shutter with a thick see-through polycarbonate window." - icon = 'icons/obj/doors/shutters_window.dmi' - icon_state = "closed" - opacity = FALSE - glass = TRUE - -/obj/machinery/door/poddoor/shutters/window/preopen - icon_state = "open" - density = FALSE diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm deleted file mode 100644 index 6f0bbc3298a..00000000000 --- a/code/game/machinery/doors/unpowered.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/machinery/door/unpowered - -/obj/machinery/door/unpowered/BumpedBy(atom/movable/AM) - if(src.locked) - return - ..() - return - - -/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params) - if(locked) - return - else - return ..() - -/obj/machinery/door/unpowered/emag_act() - return - -/obj/machinery/door/unpowered/shuttle - icon = 'icons/turf/shuttle.dmi' - name = "door" - icon_state = "door1" - opacity = TRUE - density = TRUE - explosion_block = 1 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm deleted file mode 100644 index 2c9e23e69e0..00000000000 --- a/code/game/machinery/doors/windowdoor.dm +++ /dev/null @@ -1,447 +0,0 @@ -TYPEINFO_DEF(/obj/machinery/door/window) - default_armor = list(BLUNT = 20, PUNCTURE = 50, SLASH = 90, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, FIRE = 70, ACID = 100) - -/obj/machinery/door/window - name = "interior door" - desc = "A strong door." - icon = 'icons/obj/doors/windoor.dmi' - icon_state = "left" - layer = ABOVE_WINDOW_LAYER - closingLayer = ABOVE_WINDOW_LAYER - resistance_flags = ACID_PROOF - var/base_state = "left" - max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file - integrity_failure = 0 - visible = FALSE - flags_1 = ON_BORDER_1 - opacity = FALSE - pass_flags_self = PASSGLASS - can_atmos_pass = CANPASS_PROC - interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN - set_dir_on_move = FALSE - auto_dir_align = FALSE - - var/obj/item/electronics/airlock/electronics = null - var/reinf = 0 - var/shards = 2 - var/rods = 2 - var/cable = 1 - -/obj/machinery/door/window/Initialize(mapload, set_dir, unres_sides) - . = ..() - flags_1 &= ~PREVENT_CLICK_UNDER_1 - if(set_dir) - setDir(set_dir) - if(LAZYLEN(req_access)) - icon_state = "[icon_state]" - base_state = icon_state - - if(unres_sides) - //remove unres_sides from directions it can't be bumped from - switch(dir) - if(NORTH,SOUTH) - unres_sides &= ~EAST - unres_sides &= ~WEST - if(EAST,WEST) - unres_sides &= ~NORTH - unres_sides &= ~SOUTH - - src.unres_sides = unres_sides - update_appearance(UPDATE_ICON) - - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit), - ) - - AddElement(/datum/element/connect_loc, loc_connections) - - zas_update_loc() - become_atmos_sensitive() - -/obj/machinery/door/window/Destroy() - set_density(FALSE) - if(atom_integrity == 0) - playsound(src, SFX_SHATTER, 70, TRUE) - electronics = null - lose_atmos_sensitivity() - return ..() - -/obj/machinery/door/window/update_icon_state() - . = ..() - icon_state = "[base_state][density ? null : "open"]" - - if(hasPower() && unres_sides) - set_light(l_outer_range = 2, l_power = 1) - return - - set_light(l_outer_range = 0) - -/obj/machinery/door/window/update_overlays() - . = ..() - - if(!hasPower() || !unres_sides) - return - - switch(dir) - if(NORTH,SOUTH) - if(unres_sides & NORTH) - var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n") - side_overlay.pixel_y = dir == NORTH ? 31 : 6 - . += side_overlay - if(unres_sides & SOUTH) - var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_s") - side_overlay.pixel_y = dir == NORTH ? -6 : -31 - . += side_overlay - if(EAST,WEST) - if(unres_sides & EAST) - var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_e") - side_overlay.pixel_x = dir == EAST ? 31 : 6 - . += side_overlay - if(unres_sides & WEST) - var/image/side_overlay = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_w") - side_overlay.pixel_x = dir == EAST ? -6 : -31 - . += side_overlay - -/obj/machinery/door/window/proc/open_and_close() - if(!open()) - return - autoclose = TRUE - if(check_access(null)) - sleep(50) - else //secure doors close faster - sleep(20) - if(!density && autoclose) //did someone change state while we slept? - close() - -/obj/machinery/door/window/BumpedBy(atom/movable/AM) - if(operating || !density) - return - if(!ismob(AM)) - if(ismecha(AM)) - var/obj/vehicle/sealed/mecha/mecha = AM - for(var/O in mecha.occupants) - var/mob/living/occupant = O - if(allowed(occupant)) - open_and_close() - return - do_animate("deny") - return - if(!SSticker) - return - var/mob/M = AM - if(HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) || ((isdrone(M) || iscyborg(M)) && M.stat != CONSCIOUS)) - return - bumpopen(M) - -/obj/machinery/door/window/bumpopen(mob/user) - if(operating || !density) - return - add_fingerprint(user) - if(!requiresID()) - user = null - - if(allowed(user)) - open_and_close() - else - do_animate("deny") - return - -/obj/machinery/door/window/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(.) - return - - if(border_dir == dir) - return FALSE - - if(istype(mover, /obj/structure/window)) - var/obj/structure/window/moved_window = mover - return valid_window_location(loc, moved_window.dir, is_fulltile = moved_window.fulltile) - - if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) - return valid_window_location(loc, mover.dir, is_fulltile = FALSE) - - return TRUE - -/obj/machinery/door/window/zas_canpass(turf/T) - if(QDELETED(src)) - return AIR_ALLOWED - if(get_dir(loc, T) == dir) - return density ? (AIR_BLOCKED|ZONE_BLOCKED) : ZONE_BLOCKED - else - return ZONE_BLOCKED - -//used in the AStar algorithm to determinate if the turf the door is on is passable -/obj/machinery/door/window/CanAStarPass(to_dir, datum/can_pass_info/pass_info) - return !density || (dir != to_dir) || (check_access_list(pass_info.access) && hasPower() && !pass_info.no_id) - -/obj/machinery/door/window/proc/on_exit(datum/source, atom/movable/leaving, direction) - SIGNAL_HANDLER - if(leaving.movement_type & PHASING) - return - - if(leaving == src) - return // Let's not block ourselves. - - if((pass_flags_self & leaving.pass_flags) || ((pass_flags_self & LETPASSTHROW) && leaving.throwing)) - return - - if(direction == dir && density) - leaving.Bump(src) - return COMPONENT_ATOM_BLOCK_EXIT - -/obj/machinery/door/window/open(forced=FALSE) - if (operating) //doors can still open when emag-disabled - return 0 - if(!forced) - if(!hasPower()) - return 0 - if(forced < 2) - if(obj_flags & EMAGGED) - return 0 - if(!operating) //in case of emag - operating = TRUE - do_animate("opening") - playsound(src, 'sound/machines/windowdoor.ogg', 100, TRUE) - icon_state ="[base_state]open" - sleep(10) - set_density(FALSE) - update_appearance(UPDATE_ICON_STATE) - update_freelook_sight() - - if(operating == 1) //emag again - operating = FALSE - return 1 - -/obj/machinery/door/window/close(forced=FALSE) - if (operating) - return 0 - if(!forced) - if(!hasPower()) - return 0 - if(forced < 2) - if(obj_flags & EMAGGED) - return 0 - operating = TRUE - do_animate("closing") - playsound(src, 'sound/machines/windowdoor.ogg', 100, TRUE) - icon_state = base_state - - set_density(TRUE) - update_appearance(UPDATE_ICON_STATE) - update_freelook_sight() - sleep(10) - - operating = FALSE - return 1 - -/obj/machinery/door/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(src, 'sound/effects/glasshit.ogg', 90, TRUE) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) - - -/obj/machinery/door/window/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1) && !disassembled) - for(var/i in 1 to shards) - drop_debris(new /obj/item/shard(src)) - if(rods) - drop_debris(new /obj/item/stack/rods(src, rods)) - if(cable) - drop_debris(new /obj/item/stack/cable_coil(src, cable)) - qdel(src) - -/obj/machinery/door/window/proc/drop_debris(obj/item/debris) - debris.forceMove(loc) - transfer_fingerprints_to(debris) - -/obj/machinery/door/window/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if((exposed_temperature > T0C + (reinf ? 1600 : 800))) - take_damage(round(exposed_temperature / 200), BURN, 0, 0) - -/obj/machinery/door/window/fire_act(exposed_temperature, exposed_volume, turf/adjacent) - take_damage(round(exposed_temperature / 200), BURN, 0, 0) - -/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) - var/initial_damage_percentage = get_integrity_percentage() - . = ..() - if(.) //received damage - if(atom_integrity > 0) - playsound(src, get_sfx(SFX_GLASS_CRACK), 100, TRUE) - var/damage_percentage = get_integrity_percentage() - if (damage_percentage >= 75 && initial_damage_percentage < 75) - visible_message(span_warning("\The [src] looks like it's about to shatter!")) - playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) - else if (damage_percentage >= 50 && initial_damage_percentage < 50) - visible_message(span_warning("\The [src] looks seriously damaged!")) - playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) - else if (damage_percentage >= 25 && initial_damage_percentage < 25) - visible_message(span_warning("Cracks begin to appear in \the [src]!")) - playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) - -/obj/machinery/door/window/emag_act(mob/user) - if(!operating && density && !(obj_flags & EMAGGED)) - obj_flags |= EMAGGED - operating = TRUE - z_flick("[base_state]spark", src) - playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - sleep(6) - operating = FALSE - desc += "
[span_warning("Its access panel is smoking slightly.")]" - open(2) - -/obj/machinery/door/window/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(flags_1 & NODECONSTRUCT_1) - return - if(density || operating) - to_chat(user, span_warning("You need to open the door to access the maintenance panel!")) - return - tool.leave_evidence(user, src) - tool.play_tool_sound(src) - panel_open = !panel_open - to_chat(user, span_notice("You [panel_open ? "open" : "close"] the maintenance panel.")) - return TRUE - -/obj/machinery/door/window/crowbar_act(mob/living/user, obj/item/tool) - . = ..() - if(flags_1 & NODECONSTRUCT_1) - return - if(!panel_open || density || operating) - return - tool.leave_evidence(user, src) - user.visible_message(span_notice("[user] removes the electronics from the [name]."), \ - span_notice("You start to remove electronics from the [name]...")) - if(!tool.use_tool(src, user, 40, volume=50)) - return - if(!panel_open || density || operating || !loc) - return - var/obj/structure/windoor_assembly/windoor_assembly = new /obj/structure/windoor_assembly(loc) - switch(base_state) - if("left") - windoor_assembly.facing = "l" - if("right") - windoor_assembly.facing = "r" - if("leftsecure") - windoor_assembly.facing = "l" - windoor_assembly.secure = TRUE - if("rightsecure") - windoor_assembly.facing = "r" - windoor_assembly.secure = TRUE - windoor_assembly.set_anchored(TRUE) - windoor_assembly.state= "02" - windoor_assembly.setDir(dir) - windoor_assembly.update_appearance() - windoor_assembly.created_name = name - if(obj_flags & EMAGGED) - to_chat(user, span_warning("You discard the damaged electronics.")) - qdel(src) - return - to_chat(user, span_notice("You remove the airlock electronics.")) - var/obj/item/electronics/airlock/dropped_electronics - if(!electronics) - dropped_electronics = new/obj/item/electronics/airlock(drop_location()) - if(req_one_access) - dropped_electronics.one_access = 1 - dropped_electronics.accesses = req_one_access - else - dropped_electronics.accesses = req_access - else - dropped_electronics = electronics - electronics = null - dropped_electronics.forceMove(drop_location()) - qdel(src) - return TRUE - -/obj/machinery/door/window/interact(mob/user) //for sillycones - try_to_activate_door(user) - -/obj/machinery/door/window/try_to_activate_door(mob/user, access_bypass = FALSE, obj/item/attackedby) - if (..()) - autoclose = FALSE - -/obj/machinery/door/window/unrestricted_side(mob/opener) - if(get_turf(opener) == loc) - return turn(dir,180) & unres_sides - return ..() - -/obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user) - if(!hasPower()) - if(density) - open(2) - else - close(2) - else - to_chat(user, span_warning("The door's motors resist your efforts to force it!")) - -/obj/machinery/door/window/do_animate(animation) - switch(animation) - if("opening") - z_flick("[base_state]opening", src) - if("closing") - z_flick("[base_state]closing", src) - if("deny") - z_flick("[base_state]deny", src) - -/obj/machinery/door/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) - return FALSE - -/obj/machinery/door/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct the windoor.")) - qdel(src) - return TRUE - return FALSE - - -/obj/machinery/door/window/brigdoor - name = "secure door" - icon_state = "leftsecure" - base_state = "leftsecure" - var/id = null - max_integrity = 300 //Stronger doors for prison (regular window door health is 200) - reinf = 1 - explosion_block = 1 - -/obj/machinery/door/window/brigdoor/security/cell - name = "cell door" - desc = "For keeping in criminal scum." - req_access = list(ACCESS_SECURITY) - -/obj/machinery/door/window/brigdoor/security/holding - name = "holding cell door" - req_one_access = list(ACCESS_SECURITY) - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/right, 0) - -/obj/machinery/door/window/right - icon_state = "right" - base_state = "right" - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/right, 0) - -/obj/machinery/door/window/brigdoor/right - icon_state = "rightsecure" - base_state = "rightsecure" - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/cell/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/cell/right, 0) - -/obj/machinery/door/window/brigdoor/security/cell/right - icon_state = "rightsecure" - base_state = "rightsecure" - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/holding/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/brigdoor/security/holding/right, 0) - -/obj/machinery/door/window/brigdoor/security/holding/right - icon_state = "rightsecure" - base_state = "rightsecure" diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm deleted file mode 100644 index 328776a7fd2..00000000000 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ /dev/null @@ -1,314 +0,0 @@ -#define CLOSING 1 -#define OPENING 2 -#define CYCLE 3 -#define CYCLE_EXTERIOR 4 -#define CYCLE_INTERIOR 5 - -/obj/machinery/door_buttons - power_channel = AREA_USAGE_ENVIRON - use_power = IDLE_POWER_USE - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.04 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/idSelf - -/obj/machinery/door_buttons/attackby(obj/O, mob/user) - return attack_hand(user) - -/obj/machinery/door_buttons/proc/findObjsByTag() - return - -/obj/machinery/door_buttons/Initialize(mapload) - ..() - SET_TRACKING(__TYPE__) - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/door_buttons/Destroy() - UNSET_TRACKING(__TYPE__) - return ..() - -/obj/machinery/door_buttons/LateInitialize() - findObjsByTag() - -/obj/machinery/door_buttons/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - req_access = list() - req_one_access = list() - playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("You short out the access controller.")) - -/obj/machinery/door_buttons/proc/removeMe() - - -/obj/machinery/door_buttons/access_button - icon = 'icons/obj/airlock_machines.dmi' - icon_state = "access_button_standby" - base_icon_state = "access_button" - name = "access button" - desc = "A button used for the explicit purpose of opening an airlock." - var/idDoor - var/obj/machinery/door/airlock/door - var/obj/machinery/door_buttons/airlock_controller/controller - var/busy - -/obj/machinery/door_buttons/access_button/findObjsByTag() - for(var/obj/machinery/door_buttons/airlock_controller/A in INSTANCES_OF(/obj/machinery/door_buttons)) - if(A.idSelf == idSelf) - controller = A - break - for(var/obj/machinery/door/airlock/I in INSTANCES_OF(/obj/machinery/door)) - if(I.id_tag == idDoor) - door = I - break - -/obj/machinery/door_buttons/access_button/interact(mob/user) - if(busy) - return - if(!allowed(user)) - to_chat(user, span_warning("Access denied.")) - return - if(controller && !controller.busy && door) - if(controller.machine_stat & NOPOWER) - return - busy = TRUE - update_appearance() - if(door.density) - if(!controller.exteriorAirlock || !controller.interiorAirlock) - controller.onlyOpen(door) - else - if(controller.exteriorAirlock.density && controller.interiorAirlock.density) - controller.onlyOpen(door) - else - controller.cycleClose(door) - else - controller.onlyClose(door) - use_power(active_power_usage) - addtimer(CALLBACK(src, PROC_REF(not_busy)), 2 SECONDS) - -/obj/machinery/door_buttons/access_button/proc/not_busy() - busy = FALSE - update_appearance() - -/obj/machinery/door_buttons/access_button/update_icon_state() - if(machine_stat & NOPOWER) - icon_state = "[base_icon_state]_off" - return ..() - icon_state = "[base_icon_state]_[busy ? "cycle" : "standby"]" - return ..() - -/obj/machinery/door_buttons/access_button/removeMe(obj/O) - if(O == door) - door = null - - - -/obj/machinery/door_buttons/airlock_controller - icon = 'icons/obj/airlock_machines.dmi' - icon_state = "access_control_standby" - base_icon_state = "access_control" - name = "access console" - desc = "A small console that can cycle opening between two airlocks." - var/obj/machinery/door/airlock/interiorAirlock - var/obj/machinery/door/airlock/exteriorAirlock - var/idInterior - var/idExterior - var/busy - var/lostPower - -/obj/machinery/door_buttons/airlock_controller/removeMe(obj/O) - if(O == interiorAirlock) - interiorAirlock = null - else if(O == exteriorAirlock) - exteriorAirlock = null - -/obj/machinery/door_buttons/airlock_controller/Destroy() - for(var/obj/machinery/door_buttons/access_button/A in INSTANCES_OF(/obj/machinery/door_buttons)) - if(A.controller == src) - A.controller = null - return ..() - -/obj/machinery/door_buttons/airlock_controller/Topic(href, href_list) - if(..()) - return - if(busy) - return - if(!allowed(usr)) - to_chat(usr, span_warning("Access denied.")) - return - switch(href_list["command"]) - if("close_exterior") - onlyClose(exteriorAirlock) - if("close_interior") - onlyClose(interiorAirlock) - if("cycle_exterior") - cycleClose(exteriorAirlock) - if("cycle_interior") - cycleClose(interiorAirlock) - if("open_exterior") - onlyOpen(exteriorAirlock) - if("open_interior") - onlyOpen(interiorAirlock) - -/obj/machinery/door_buttons/airlock_controller/proc/onlyOpen(obj/machinery/door/airlock/A) - if(A) - busy = CLOSING - update_appearance() - openDoor(A) - -/obj/machinery/door_buttons/airlock_controller/proc/onlyClose(obj/machinery/door/airlock/A) - if(A) - busy = CLOSING - closeDoor(A) - -/obj/machinery/door_buttons/airlock_controller/proc/closeDoor(obj/machinery/door/airlock/A) - if(A.density) - goIdle() - return FALSE - update_appearance() - A.dont_close_on_dense_objects = FALSE //Door crushies, manual door after all. Set every time in case someone changed it, safe doors can end up waiting forever. - A.unbolt() - if(A.close()) - if(machine_stat & NOPOWER || lostPower || !A || QDELETED(A)) - goIdle(TRUE) - return FALSE - A.bolt() - goIdle(TRUE) - return TRUE - goIdle(TRUE) - return FALSE - -/obj/machinery/door_buttons/airlock_controller/proc/cycleClose(obj/machinery/door/airlock/A) - if(!A || !exteriorAirlock || !interiorAirlock) - return - if(exteriorAirlock.density == interiorAirlock.density || !A.density) - return - busy = CYCLE - update_appearance() - if(A == interiorAirlock) - if(closeDoor(exteriorAirlock)) - busy = CYCLE_INTERIOR - else - if(closeDoor(interiorAirlock)) - busy = CYCLE_EXTERIOR - -/obj/machinery/door_buttons/airlock_controller/proc/cycleOpen(obj/machinery/door/airlock/A) - if(!A) - goIdle(TRUE) - if(A == exteriorAirlock) - if(interiorAirlock) - if(!interiorAirlock.density || !interiorAirlock.locked) - return - else - if(exteriorAirlock) - if(!exteriorAirlock.density || !exteriorAirlock.locked) - return - if(busy != OPENING) - busy = OPENING - openDoor(A) - -/obj/machinery/door_buttons/airlock_controller/proc/openDoor(obj/machinery/door/airlock/A) - if(exteriorAirlock && interiorAirlock && (!exteriorAirlock.density || !interiorAirlock.density)) - goIdle(TRUE) - return - A.unbolt() - INVOKE_ASYNC(src, PROC_REF(do_openDoor), A) - -/obj/machinery/door_buttons/airlock_controller/proc/do_openDoor(obj/machinery/door/airlock/A) - if(A?.open()) - if(machine_stat | (NOPOWER) && !lostPower && A && !QDELETED(A)) - A.bolt() - goIdle(TRUE) - -/obj/machinery/door_buttons/airlock_controller/proc/goIdle(update) - lostPower = FALSE - busy = FALSE - if(update) - update_appearance() - updateUsrDialog() - -/obj/machinery/door_buttons/airlock_controller/process() - if(machine_stat & NOPOWER) - return - if(busy == CYCLE_EXTERIOR) - cycleOpen(exteriorAirlock) - else if(busy == CYCLE_INTERIOR) - cycleOpen(interiorAirlock) - -/obj/machinery/door_buttons/airlock_controller/power_change() - . = ..() - if(machine_stat & NOPOWER) - lostPower = TRUE - else - if(!busy) - lostPower = FALSE - -/obj/machinery/door_buttons/airlock_controller/findObjsByTag() - for(var/obj/machinery/door/airlock/A in INSTANCES_OF(/obj/machinery/door)) - if(A.id_tag == idInterior) - interiorAirlock = A - else if(A.id_tag == idExterior) - exteriorAirlock = A - -/obj/machinery/door_buttons/airlock_controller/update_icon_state() - if(machine_stat & NOPOWER) - icon_state = "access_control_off" - return ..() - icon_state = "[base_icon_state]_[(busy || lostPower) ? "process" : "standby"]" - return ..() - -/obj/machinery/door_buttons/airlock_controller/ui_interact(mob/user) - var/datum/browser/popup = new(user, "computer", name) - popup.set_content(returnText()) - popup.open() - -/obj/machinery/door_buttons/airlock_controller/proc/returnText() - var/output - if(!exteriorAirlock && !interiorAirlock) - return "ERROR ERROR ERROR ERROR" - if(lostPower) - output = "Initializing..." - else - if(!exteriorAirlock || !interiorAirlock) - if(!exteriorAirlock) - if(interiorAirlock.density) - output = "Open Interior Airlock
" - else - output = "Close Interior Airlock
" - else - if(exteriorAirlock.density) - output = "Open Exterior Airlock
" - else - output = "Close Exterior Airlock
" - else - if(exteriorAirlock.density) - if(interiorAirlock.density) - output = {"Open Exterior Airlock
- Open Interior Airlock
"} - else - output = {"Cycle to Exterior Airlock
- Close Interior Airlock
"} - else - if(interiorAirlock.density) - output = {"Close Exterior Airlock
- Cycle to Interior Airlock
"} - else - output = {"Close Exterior Airlock
- Close Interior Airlock
"} - - - output = {"Access Control Console
- [output]
"} - if(exteriorAirlock) - output += "Exterior Door: [exteriorAirlock.density ? "closed" : "open"]
" - if(interiorAirlock) - output += "Interior Door: [interiorAirlock.density ? "closed" : "open"]
" - - return output - -#undef CLOSING -#undef OPENING -#undef CYCLE -#undef CYCLE_EXTERIOR -#undef CYCLE_INTERIOR diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm deleted file mode 100644 index 509f7d62672..00000000000 --- a/code/game/machinery/firealarm.dm +++ /dev/null @@ -1,522 +0,0 @@ -/obj/item/electronics/firealarm - name = "fire alarm electronics" - desc = "A fire alarm circuit. Can handle heat levels up to 40 degrees celsius." - -/obj/item/wallframe/firealarm - name = "fire alarm frame" - desc = "Used for building fire alarms." - icon = 'icons/obj/firealarm.dmi' - icon_state = "fire_bitem" - result_path = /obj/machinery/firealarm - pixel_shift = 26 - -DEFINE_INTERACTABLE(/obj/machinery/firealarm) -TYPEINFO_DEF(/obj/machinery/firealarm) - default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 90, ACID = 30) - -/obj/machinery/firealarm - name = "fire alarm" - desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." - icon = 'icons/obj/firealarm.dmi' - icon_state = "fire0" - max_integrity = 250 - integrity_failure = 0.4 - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.02 - power_channel = AREA_USAGE_ENVIRON - resistance_flags = FIRE_PROOF - zmm_flags = ZMM_MANGLE_PLANES - - light_power = 0 - light_outer_range = 7 - light_color = COLOR_VIVID_RED - - //Trick to get the glowing overlay visible from a distance - luminosity = 1 - ///Buildstate for contruction steps. 2 = complete, 1 = no wires, 0 = circuit gone - var/buildstage = 2 - ///Our home area, set in Init. Due to loading step order, this seems to be null very early in the server setup process, which is why some procs use `my_area?` for var or list checks. - var/area/my_area = null - ///The current alarm state - var/alert_type = FIRE_CLEAR - ///Radial menu choice cache - var/static/list/radial_choices = list( - "activate" = new /image{ - icon = 'icons/hud/radial.dmi'; - icon_state = "red";; - maptext = "Activate"; - maptext_y = 30; - maptext_x = -1; - maptext_width = 40; - }, - "deactivate" = new /image{ - icon = 'icons/hud/radial.dmi'; - icon_state = "green"; - maptext = "Deactivate"; - maptext_y = -8; - maptext_x = -6; - maptext_width = 45; - } - ) - -/obj/machinery/firealarm/Initialize(mapload, dir, building) - . = ..() - SET_TRACKING(__TYPE__) - if(building) - buildstage = 0 - panel_open = TRUE - if(name == initial(name)) - name = "[get_area_name(src)] [initial(name)]" - update_appearance() - RegisterSignal(src, COMSIG_FIRE_ALERT, PROC_REF(handle_alert)) - RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(check_security_level)) - - AddComponent(/datum/component/usb_port, list( - /obj/item/circuit_component/firealarm, - )) - AddComponent(/datum/component/wall_mounted, CALLBACK(src, PROC_REF(deconstruct), FALSE)) - - AddElement( \ - /datum/element/contextual_screentip_bare_hands, \ - lmb_text = "Turn on", \ - rmb_text = "Turn off", \ - ) - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/firealarm/LateInitialize() - . = ..() - set_area(get_area(src)) - -/obj/machinery/firealarm/Destroy() - set_area(null) - UNSET_TRACKING(__TYPE__) - return ..() - -/obj/machinery/firealarm/Moved(atom/OldLoc, Dir, list/old_locs, momentum_change = TRUE) - . = ..() - var/new_area = get_area(src) - if(my_area != new_area) - set_area(new_area) - -/obj/machinery/firealarm/proc/set_area(new_area) - if(my_area) - LAZYREMOVE(my_area.firealarms, src) - if(!new_area) - return - my_area = new_area - if(my_area) - LAZYADD(my_area.firealarms, src) - -/obj/machinery/firealarm/update_appearance(updates) - . = ..() - if(alert_type && !(obj_flags & EMAGGED) && !(machine_stat & (BROKEN|NOPOWER))) - set_light(l_power = 0.8) - else - set_light(l_power = 0) - -/obj/machinery/firealarm/update_icon_state() - if(panel_open) - icon_state = "fire_b[buildstage]" - return ..() - if(machine_stat & BROKEN) - icon_state = "firex" - return ..() - icon_state = "fire0" - return ..() - -/obj/machinery/firealarm/update_overlays() - . = ..() - if(machine_stat & NOPOWER) - return - - . += mutable_appearance(icon, "fire_overlay") - if(is_station_level(z)) - . += mutable_appearance(icon, "fire_[SSsecurity_level.current_level]") - . += emissive_appearance(icon, "fire_[SSsecurity_level.current_level]", alpha = 90) - else - . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") - . += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]", alpha = 90) - - if(!alert_type) - if(my_area?.fire_detect) //If this is false, leave the green light missing. A good hint to anyone paying attention. - . += mutable_appearance(icon, "fire_off") - . += emissive_appearance(icon, "fire_off", alpha = 90) - else if(obj_flags & EMAGGED) - . += mutable_appearance(icon, "fire_emagged") - . += emissive_appearance(icon, "fire_emagged", alpha = 90) - else - . += mutable_appearance(icon, "fire_on") - . += emissive_appearance(icon, "fire_on", alpha = 90) - - if(!panel_open && alert_type) //It just looks horrible with the panel open - . += mutable_appearance(icon, "fire_detected") - . += emissive_appearance(icon, "fire_detected", alpha = 90) //Pain - -/obj/machinery/firealarm/emp_act(severity) - . = ..() - - if (. & EMP_PROTECT_SELF) - return - - if(prob(50 / severity)) - alarm() - -/obj/machinery/firealarm/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - update_appearance() - if(user) - user.visible_message(span_warning("Sparks fly out of [src]!"), - span_notice("You override [src], disabling the speaker.")) - playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - - -/** - * Signal handler for checking if we should update fire alarm appearance accordingly to a newly set security level - * - * Arguments: - * * source The datum source of the signal - * * new_level The new security level that is in effect - */ -/obj/machinery/firealarm/proc/check_security_level(datum/source, new_level) - SIGNAL_HANDLER - - if(is_station_level(z)) - update_appearance() - -/obj/machinery/firealarm/proc/handle_alert(datum/source, code) - SIGNAL_HANDLER - - if(!!alert_type == !!code) - return - - if(!code) - alert_type = code - reset() - else - alert_type = code - alarm() - -/** - * Sounds the fire alarm and closes all firelocks in the area. Also tells the area to color the lights red. - * - * Arguments: - * * mob/user is the user that pulled the alarm. - */ -/obj/machinery/firealarm/proc/alarm(mob/user) - if(!is_operational) - return - SEND_SIGNAL(src, COMSIG_FIREALARM_ON_TRIGGER) - update_use_power(ACTIVE_POWER_USE) - update_appearance() - - -/** - * Resets all firelocks in the area. Also tells the area to disable alarm lighting, if it was enabled. - * - * Arguments: - * * mob/user is the user that reset the alarm. - */ -/obj/machinery/firealarm/proc/reset(mob/user) - if(!is_operational) - return - SEND_SIGNAL(src, COMSIG_FIREALARM_ON_RESET) - update_use_power(IDLE_POWER_USE) - update_appearance() - -/obj/machinery/firealarm/attack_hand(mob/user, list/modifiers) - if(buildstage != 2) - return - . = ..() - add_fingerprint(user) - - if(!is_operational) - return - - switch(user.simple_binary_radial(src, radial_choices)) - if(SIMPLE_RADIAL_ACTIVATE) - if(!alert_type) - my_area.communicate_fire_alert(FIRE_RAISED_GENERIC) - log_game("[user] triggered a fire alarm at [COORD(src)]") - if(SIMPLE_RADIAL_DEACTIVATE) - if(alert_type) - my_area.communicate_fire_alert(FIRE_CLEAR) - log_game("[user] cleared a fire alarm at [COORD(src)]") - if(SIMPLE_RADIAL_DOESNT_USE) - if(alert_type) - my_area.communicate_fire_alert(FIRE_CLEAR) - log_game("[user] cleared a fire alarm at [COORD(src)]") - else - my_area.communicate_fire_alert(FIRE_RAISED_GENERIC) - log_game("[user] triggered a fire alarm at [COORD(src)]") - - user.animate_interact(src) - return TRUE - -/obj/machinery/firealarm/attack_hand_secondary(mob/user, list/modifiers) - if(buildstage != 2) - return ..() - add_fingerprint(user) - reset(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/machinery/firealarm/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/firealarm/attack_ai_secondary(mob/user) - return attack_hand_secondary(user) - -/obj/machinery/firealarm/attack_robot(mob/user) - return attack_hand(user) - -/obj/machinery/firealarm/attack_robot_secondary(mob/user) - return attack_hand_secondary(user) - -/obj/machinery/firealarm/attackby(obj/item/tool, mob/living/user, params) - tool.leave_evidence(user, src) - - if(tool.tool_behaviour == TOOL_SCREWDRIVER && buildstage == 2) - tool.play_tool_sound(src) - panel_open = !panel_open - to_chat(user, span_notice("The wires have been [panel_open ? "exposed" : "unexposed"].")) - update_appearance() - return - - if(panel_open) - - if(tool.tool_behaviour == TOOL_WELDER && !user.combat_mode) - if(atom_integrity < max_integrity) - if(!tool.tool_start_check(user, amount=0)) - return - - to_chat(user, span_notice("You begin repairing [src]...")) - if(tool.use_tool(src, user, 40, volume=50)) - atom_integrity = max_integrity - to_chat(user, span_notice("You repair [src].")) - else - to_chat(user, span_warning("[src] is already in good condition!")) - return - - switch(buildstage) - if(2) - if(tool.tool_behaviour == TOOL_WIRECUTTER) - buildstage = 1 - tool.play_tool_sound(src) - new /obj/item/stack/cable_coil(user.loc, 5) - to_chat(user, span_notice("You cut the wires from \the [src].")) - update_appearance() - return - - else if(tool.force) //hit and turn it on - ..() - attack_hand(user) - return - - if(1) - if(istype(tool, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/coil = tool - if(coil.get_amount() < 5) - to_chat(user, span_warning("You need more cable for this!")) - else - coil.use(5) - buildstage = 2 - to_chat(user, span_notice("You wire \the [src].")) - update_appearance() - return - - else if(tool.tool_behaviour == TOOL_CROWBAR) - user.visible_message(span_notice("[user.name] removes the electronics from [src.name]."), \ - span_notice("You start prying out the circuit...")) - if(tool.use_tool(src, user, 20, volume=50)) - if(buildstage == 1) - if(machine_stat & BROKEN) - to_chat(user, span_notice("You remove the destroyed circuit.")) - set_machine_stat(machine_stat & ~BROKEN) - else - to_chat(user, span_notice("You pry out the circuit.")) - new /obj/item/electronics/firealarm(user.loc) - buildstage = 0 - update_appearance() - return - if(0) - if(istype(tool, /obj/item/electronics/firealarm)) - to_chat(user, span_notice("You insert the circuit.")) - qdel(tool) - buildstage = 1 - update_appearance() - return - - else if(istype(tool, /obj/item/electroadaptive_pseudocircuit)) - var/obj/item/electroadaptive_pseudocircuit/pseudoc = tool - if(!pseudoc.adapt_circuit(user, 15)) - return - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a fire alarm circuit and slot it into the assembly.")) - buildstage = 1 - update_appearance() - return - - else if(tool.tool_behaviour == TOOL_WRENCH) - user.visible_message(span_notice("[user] removes the fire alarm assembly from the wall."), \ - span_notice("You remove the fire alarm assembly from the wall.")) - var/obj/item/wallframe/firealarm/frame = new /obj/item/wallframe/firealarm() - frame.forceMove(user.drop_location()) - tool.play_tool_sound(src) - qdel(src) - return - return ..() - -/obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) - return FALSE - -/obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_UPGRADE_SIMPLE_CIRCUITS) - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a fire alarm circuit and slot it into the assembly.")) - buildstage = 1 - update_appearance() - return TRUE - return FALSE - -/obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - . = ..() - if(.) //damage received - if(atom_integrity > 0 && !(machine_stat & BROKEN) && buildstage != 0) - if(prob(33)) - alarm() - -/obj/machinery/firealarm/singularity_pull(S, current_size) - if (current_size >= STAGE_FIVE) // If the singulo is strong enough to pull anchored objects, the fire alarm experiences integrity failure - deconstruct() - return ..() - -/obj/machinery/firealarm/atom_break(damage_flag) - if(buildstage == 0) //can't break the electronics if there isn't any inside. - return - return ..() - -/obj/machinery/firealarm/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - new /obj/item/stack/sheet/steel(loc, 1) - if(!(machine_stat & BROKEN)) - var/obj/item/item = new /obj/item/electronics/firealarm(loc) - if(!disassembled) - item.update_integrity(item.max_integrity * 0.5) - new /obj/item/stack/cable_coil(loc, 3) - qdel(src) - -// Allows users to examine the state of the thermal sensor -/obj/machinery/firealarm/examine(mob/user) - . = ..() - if((alert_type)) - . += span_alert("The local area hazard light is flashing.") - -// Allows Silicons to disable thermal sensor -/obj/machinery/firealarm/BorgCtrlClick(mob/living/silicon/robot/user) - if(get_dist(src,user) <= user.interaction_range) - AICtrlClick(user) - return - return ..() - -/obj/machinery/firealarm/AICtrlClick(mob/living/silicon/robot/user) - if(obj_flags & EMAGGED) - to_chat(user, span_warning("The control circuitry of [src] appears to be malfunctioning.")) - return - my_area.fire_detect = !my_area.fire_detect - for(var/obj/machinery/firealarm/fire_panel in my_area.firealarms) - fire_panel.update_icon() - to_chat(user, span_notice("You [ my_area.fire_detect ? "enable" : "disable" ] the local firelock thermal sensors!")) - log_game("[user] has [ my_area.fire_detect ? "enabled" : "disabled" ] firelock sensors using [src] at [COORD(src)]") - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/firealarm, 26) - -/* - * Return of Party button - */ - -/area - var/party = FALSE - -/obj/machinery/firealarm/partyalarm - name = "\improper PARTY BUTTON" - desc = "Cuban Pete is in the house!" - var/static/party_overlay - -/obj/machinery/firealarm/partyalarm/reset() - if (machine_stat & (NOPOWER|BROKEN)) - return - var/area/area = get_area(src) - if (!area || !area.party) - return - area.party = FALSE - area.cut_overlay(party_overlay) - -/obj/machinery/firealarm/partyalarm/alarm() - if (machine_stat & (NOPOWER|BROKEN)) - return - var/area/area = get_area(src) - if (!area || area.party || area.name == "Space") - return - area.party = TRUE - if (!party_overlay) - party_overlay = iconstate2appearance('icons/area/areas_misc.dmi', "party") - area.add_overlay(party_overlay) - -/obj/item/circuit_component/firealarm - display_name = "Fire Alarm" - desc = "Allows you to interface with the Fire Alarm." - - var/datum/port/input/alarm_trigger - var/datum/port/input/reset_trigger - - /// Returns a boolean value of 0 or 1 if the fire alarm is on or not. - var/datum/port/output/is_on - /// Returns when the alarm is turned on - var/datum/port/output/triggered - /// Returns when the alarm is turned off - var/datum/port/output/reset - - var/obj/machinery/firealarm/attached_alarm - -/obj/item/circuit_component/firealarm/populate_ports() - alarm_trigger = add_input_port("Set", PORT_TYPE_SIGNAL) - reset_trigger = add_input_port("Reset", PORT_TYPE_SIGNAL) - - is_on = add_output_port("Is On", PORT_TYPE_NUMBER) - triggered = add_output_port("Triggered", PORT_TYPE_SIGNAL) - reset = add_output_port("Reset", PORT_TYPE_SIGNAL) - -/obj/item/circuit_component/firealarm/register_usb_parent(atom/movable/parent) - . = ..() - if(istype(parent, /obj/machinery/firealarm)) - attached_alarm = parent - RegisterSignal(parent, COMSIG_FIREALARM_ON_TRIGGER, PROC_REF(on_firealarm_triggered)) - RegisterSignal(parent, COMSIG_FIREALARM_ON_RESET, PROC_REF(on_firealarm_reset)) - -/obj/item/circuit_component/firealarm/unregister_usb_parent(atom/movable/parent) - attached_alarm = null - UnregisterSignal(parent, COMSIG_FIREALARM_ON_TRIGGER) - UnregisterSignal(parent, COMSIG_FIREALARM_ON_RESET) - return ..() - -/obj/item/circuit_component/firealarm/proc/on_firealarm_triggered(datum/source) - SIGNAL_HANDLER - is_on.set_output(1) - triggered.set_output(COMPONENT_SIGNAL) - -/obj/item/circuit_component/firealarm/proc/on_firealarm_reset(datum/source) - SIGNAL_HANDLER - is_on.set_output(0) - reset.set_output(COMPONENT_SIGNAL) - - -/obj/item/circuit_component/firealarm/input_received(datum/port/input/port) - if(COMPONENT_TRIGGERED_BY(alarm_trigger, port)) - attached_alarm?.alarm() - - if(COMPONENT_TRIGGERED_BY(reset_trigger, port)) - attached_alarm?.reset() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm deleted file mode 100644 index 2579f32836f..00000000000 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ /dev/null @@ -1,216 +0,0 @@ -#define ATMOS_PIPEDISPENSER 0 -#define DISPOSAL_PIPEDISPENSER 1 -#define TRANSIT_PIPEDISPENSER 2 - -/obj/machinery/pipedispenser - name = "pipe dispenser" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - desc = "Dispenses countless types of pipes. Very useful if you need pipes." - density = TRUE - interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_OFFLINE - var/wait = 0 - var/piping_layer = PIPING_LAYER_DEFAULT - ///color of pipe - var/paint_color = "green" - ///type of dispenser - var/category = ATMOS_PIPEDISPENSER - ///smart pipe directions - var/p_init_dir = ALL_CARDINALS - -/obj/machinery/pipedispenser/attack_paw(mob/user, list/modifiers) - return attack_hand(user, modifiers) - -/obj/machinery/pipedispenser/ui_static_data(mob/user) - var/list/data = list("paint_colors" = GLOB.pipe_paint_colors) - return data - -/obj/machinery/pipedispenser/ui_data() - var/list/data = list( - "category" = category, - "piping_layer" = piping_layer, - "categories" = list(), - "selected_color" = paint_color, - ) - - // The get the recipies for this dispenser - var/list/recipes - switch(category) - if(ATMOS_PIPEDISPENSER) - recipes = GLOB.atmos_pipe_recipes - if(DISPOSAL_PIPEDISPENSER) - recipes = GLOB.disposal_pipe_recipes - if(TRANSIT_PIPEDISPENSER) - recipes = GLOB.transit_tube_recipes - // Generate pipe categories - for(var/c in recipes) - var/list/cat = recipes[c] - var/list/r = list() - for(var/i in 1 to cat.len) - var/datum/pipe_info/info = cat[i] - r += list(list("pipe_name" = info.name, "pipe_index" = i, "all_layers" = info.all_layers, "dir" = NORTH)) - // if this is bendable, add the bent version of the pipe (disposals) - if (info.dirtype == PIPE_BENDABLE) - r += list(list("pipe_name" = "Bent " + info.name, "pipe_index" = i, "all_layers" = info.all_layers, "dir" = NORTHEAST)) - data["categories"] += list(list("cat_name" = c, "recipes" = r)) - var/list/init_directions = list("north" = FALSE, "south" = FALSE, "east" = FALSE, "west" = FALSE) - for(var/direction in GLOB.cardinals) - if(p_init_dir & direction) - init_directions[dir2text(direction)] = TRUE - data["init_directions"] = init_directions - return data - -/obj/machinery/pipedispenser/ui_act(action, params) - if(..()) - return - switch(action) - if("color") - paint_color = params["paint_color"] - - if("pipe_type") - switch(category) - if(ATMOS_PIPEDISPENSER) - if(wait < world.time) - var/datum/pipe_info/info = GLOB.atmos_pipe_recipes[params["category"]][params["pipe_type"]] - var/recipe_type = info.type - var/p_type = info.id - - // No spawning arbitrary paths (literally 1984) - if(!verify_recipe(GLOB.atmos_pipe_recipes, p_type)) - return - - // If this is a meter, make that. - if(recipe_type == /datum/pipe_info/meter) - new /obj/item/pipe_meter(loc) - wait = world.time + 1 SECONDS - return - - // Otherwise, make a pipe/device - var/p_dir = params["pipe_dir"] - var/obj/item/pipe/pipe_out = new (loc, p_type, p_dir) - pipe_out.p_init_dir = p_init_dir - pipe_out.pipe_color = GLOB.pipe_paint_colors[paint_color] - pipe_out.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY) - pipe_out.set_piping_layer(piping_layer) - pipe_out.add_fingerprint(usr) - wait = world.time + 1 SECONDS - if(DISPOSAL_PIPEDISPENSER) - if(wait < world.time) - var/datum/pipe_info/info = GLOB.disposal_pipe_recipes[params["category"]][params["pipe_type"]] - var/p_type = info.id - - // No spawning arbitrary paths (literally 1984) - if(!verify_recipe(GLOB.disposal_pipe_recipes, p_type)) - return - - var/obj/structure/disposalconstruct/disposal_out = new (loc, p_type) - if(!disposal_out.can_place()) - to_chat(usr, span_warning("There's not enough room to build that here!")) - qdel(disposal_out) - return - - disposal_out.add_fingerprint(usr) - disposal_out.update_appearance() - disposal_out.setDir(params["pipe_dir"]) - wait = world.time + 1 SECONDS - if(TRANSIT_PIPEDISPENSER) - if(wait < world.time) - var/datum/pipe_info/info = GLOB.transit_tube_recipes[params["category"]][params["pipe_type"]] - var/p_type = info.id - - // No spawning arbitrary paths (literally 1984) - if(!verify_recipe(GLOB.transit_tube_recipes, p_type)) - return - - var/obj/structure/c_transit_tube/tube_out = new p_type(loc) - tube_out.add_fingerprint(usr) - tube_out.update_appearance() - tube_out.setDir(params["pipe_dir"]) - wait = world.time + 1 SECONDS - if("piping_layer") - piping_layer = text2num(params["piping_layer"]) - - if("init_dir_setting") - var/target_dir = p_init_dir ^ text2dir(params["dir_flag"]) - // Refuse to create a smart pipe that can only connect in one direction (it would act weirdly and lack an icon) - if (ISNOTSTUB(target_dir)) - p_init_dir = target_dir - else - to_chat(usr, span_warning("\The [src]'s screen flashes a warning: Can't configure a pipe to only connect in one direction.")) - - if("init_reset") - p_init_dir = ALL_CARDINALS - - return TRUE - -/obj/machinery/pipedispenser/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "PipeDispenser", name) - ui.open() - -/obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, params) - add_fingerprint(user) - if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) - to_chat(usr, span_notice("You put [W] back into [src].")) - qdel(W) - return - else - return ..() - -/obj/machinery/pipedispenser/proc/verify_recipe(recipes, path) - for(var/category in recipes) - var/list/cat_recipes = recipes[category] - for(var/i in cat_recipes) - var/datum/pipe_info/info = i - if (path == info.id) - return TRUE - return FALSE - -/obj/machinery/pipedispenser/wrench_act(mob/living/user, obj/item/tool) - . = ..() - if(default_unfasten_wrench(user, tool, time = 4 SECONDS)) - user << browse(null, "window=pipedispenser") - - return TRUE - - -/obj/machinery/pipedispenser/disposal - name = "disposal pipe dispenser" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - desc = "Dispenses pipes that will ultimately be used to move trash around." - density = TRUE - category = DISPOSAL_PIPEDISPENSER - - -//Allow you to drag-drop disposal pipes and transit tubes into it -/obj/machinery/pipedispenser/disposal/MouseDroppedOn(obj/structure/pipe, mob/source) - if(!source.incapacitated()) - return - - if (!istype(pipe, /obj/structure/disposalconstruct) && !istype(pipe, /obj/structure/c_transit_tube) && !istype(pipe, /obj/structure/c_transit_tube_pod)) - return - - if (get_dist(source, src) > 1 || get_dist(src,pipe) > 1 ) - return - - if (pipe.anchored) - return - - qdel(pipe) - - -//transit tube dispenser -//inherit disposal for the dragging proc -/obj/machinery/pipedispenser/disposal/transit_tube - name = "transit tube dispenser" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "pipe_d" - density = TRUE - desc = "Dispenses pipes that will move beings around." - category = TRANSIT_PIPEDISPENSER - -#undef ATMOS_PIPEDISPENSER -#undef DISPOSAL_PIPEDISPENSER -#undef TRANSIT_PIPEDISPENSER diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 326502b0fdb..4d82fd54290 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -546,16 +546,10 @@ qdel(src) /obj/effect/decal/cleanable/blood/hitsplatter/Bump(atom/bumped_atom) - if(!iswallturf(bumped_atom) && !istype(bumped_atom, /obj/structure/window)) + if(!iswallturf(bumped_atom)) qdel(src) return - if(istype(bumped_atom, /obj/structure/window)) - var/obj/structure/window/bumped_window = bumped_atom - if(!bumped_window.fulltile) - qdel(src) - return - hit_endpoint = TRUE if(isturf(prev_loc)) var/turf/T = get_turf(bumped_atom) @@ -563,25 +557,13 @@ abstract_move(bumped_atom) skip = TRUE //Adjust pixel offset to make splatters appear on the wall - if(istype(bumped_atom, /obj/structure/window)) - land_on_window(bumped_atom) - else - var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new(prev_loc, null, blood_dna_info) - final_splatter.pixel_x = (dir == EAST ? 32 : (dir == WEST ? -32 : 0)) - final_splatter.pixel_y = (dir == NORTH ? 32 : (dir == SOUTH ? -32 : 0)) + var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new(prev_loc, null, blood_dna_info) + final_splatter.pixel_x = (dir == EAST ? 32 : (dir == WEST ? -32 : 0)) + final_splatter.pixel_y = (dir == NORTH ? 32 : (dir == SOUTH ? -32 : 0)) else // This will only happen if prev_loc is not even a turf, which is highly unlikely. abstract_move(bumped_atom) qdel(src) -/// A special case for hitsplatters hitting windows, since those can actually be moved around, store it in the window and slap it in the vis_contents -/obj/effect/decal/cleanable/blood/hitsplatter/proc/land_on_window(obj/structure/window/the_window) - if(!the_window.fulltile) - return - var/obj/effect/decal/cleanable/blood/splatter/over_window/final_splatter = new(the_window, null, blood_dna_info) - the_window.add_viscontents(final_splatter) - the_window.bloodied = TRUE - qdel(src) - /obj/effect/decal/cleanable/blood/squirt name = "blood trail" icon_state = "squirt" diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index d8e1e26b8d2..380563a694e 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -1,7 +1,7 @@ ///////////////////////////////////////////// //SPARK SYSTEM (like steam system) // The attach(atom/atom) proc is optional, and can be called to attach the effect -// to something, like the RCD, so then you can just call start() and the sparks +// to something so then you can just call start() and the sparks // will always spawn at the items location. ///////////////////////////////////////////// diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 20269e11bad..9b138627c03 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -468,8 +468,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/navigate_destination/LateInitialize() . = ..() if(!location) - var/obj/machinery/door/airlock/A = locate(/obj/machinery/door/airlock) in loc - location = A ? format_text(A.name) : get_area_name(src, format_text = TRUE) + location = get_area_name(src, format_text = TRUE) GLOB.navigate_destinations[loc] = location diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index 6297a7107e7..cf2e64a49c5 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -85,11 +85,3 @@ /obj/item/stack/sheet/mineral/snow{amount = 25} = 2, /obj/item/shovel = 2, ) - -/obj/effect/spawner/random/exotic/ripley - name = "ripley spawner" - icon_state = "ripley" - loot = list( - /obj/structure/mecha_wreckage/ripley = 3, - /obj/vehicle/sealed/mecha/working/ripley/mining = 1, - ) diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm index e30bc5d3ee4..440b9993edb 100644 --- a/code/game/objects/effects/spawners/random/structure.dm +++ b/code/game/objects/effects/spawners/random/structure.dm @@ -22,15 +22,6 @@ spawn_loot_chance = 20 loot = list(/obj/structure/closet/crate/secure/loot) -/obj/effect/spawner/random/structure/grille - name = "grille spawner" - icon_state = "grille" - spawn_loot_chance = 90 - loot = list( // 80% chance normal grille, 10% chance of broken, 10% chance of nothing - /obj/structure/grille = 8, - /obj/structure/grille/broken = 1, - ) - /obj/effect/spawner/random/structure/furniture_parts name = "furniture parts spawner" icon_state = "table_parts" diff --git a/code/game/objects/effects/spawners/random/techstorage.dm b/code/game/objects/effects/spawners/random/techstorage.dm index ad421c720ce..533399fc197 100644 --- a/code/game/objects/effects/spawners/random/techstorage.dm +++ b/code/game/objects/effects/spawners/random/techstorage.dm @@ -112,8 +112,6 @@ /obj/effect/spawner/random/techstorage/rnd_secure_all name = "secure RnD circuit board spawner" loot = list( - /obj/item/circuitboard/computer/mecha_control, /obj/item/circuitboard/computer/apc_control, /obj/item/circuitboard/computer/robotics, ) - diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index bd94e40aea2..f45a5396a4f 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -78,7 +78,6 @@ name = "grille or waste spawner" icon_state = "grille" loot = list( - /obj/structure/grille = 5, /obj/effect/spawner/random/trash/food_packaging = 3, /obj/effect/spawner/random/trash/cigbutt = 1, /obj/item/food/deadmouse = 1, diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 993babbbce9..d877a167259 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -12,412 +12,3 @@ again. . = ..() for(var/spawn_type in spawn_list) new spawn_type(loc) - -//normal windows - -/obj/effect/spawner/structure/window - icon = 'icons/obj/structures_spawners.dmi' - icon_state = "window_spawner" - name = "window spawner" - spawn_list = list(/obj/structure/window/fulltile) - dir = SOUTH - layer = ABOVE_OBJ_LAYER - -/obj/effect/spawner/structure/window/Initialize(mapload) - . = ..() - var/turf/current_turf = loc - current_turf.rcd_memory = RCD_MEMORY_WINDOWGRILLE - -/obj/effect/spawner/structure/window/wood - name = "window with wooden low wall spawner" - spawn_list = list(/obj/structure/window/fulltile) - - -/obj/effect/spawner/structure/window/hollow - name = "hollow window spawner" - icon_state = "hwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) - -/obj/effect/spawner/structure/window/hollow/end - icon_state = "hwindow_spawner_end" - -/obj/effect/spawner/structure/window/hollow/end/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north, /obj/structure/window/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/middle - icon_state = "hwindow_spawner_middle" - -/obj/effect/spawner/structure/window/hollow/middle/Initialize(mapload) - switch(dir) - if(NORTH,SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/north) - if(EAST,WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/east, /obj/structure/window/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/directional - icon_state = "hwindow_spawner_directional" - -/obj/effect/spawner/structure/window/hollow/directional/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north) - if(NORTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/east) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/east) - if(SOUTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window) - if(SOUTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window, /obj/structure/window/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/west) - if(NORTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/spawner/north, /obj/structure/window/spawner/west) - . = ..() - -//reinforced - -/obj/effect/spawner/structure/window/reinforced - name = "reinforced window spawner" - icon_state = "rwindow_spawner" - spawn_list = list(/obj/structure/window/reinforced/fulltile) - -/obj/effect/spawner/structure/window/reinforced/grille - name = "reinforced window with grille spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/fulltile) - -/obj/effect/spawner/structure/window/reinforced/wood - name = "reinforced window with wooden low wall spawner" - icon_state = "rwindow_spawner" - spawn_list = list(/obj/structure/window/reinforced/fulltile) - -/obj/effect/spawner/structure/window/hollow/reinforced - name = "hollow reinforced window spawner" - icon_state = "hrwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) - -/obj/effect/spawner/structure/window/hollow/reinforced/end - icon_state = "hrwindow_spawner_end" - -/obj/effect/spawner/structure/window/hollow/reinforced/end/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/reinforced/middle - icon_state = "hrwindow_spawner_middle" - -/obj/effect/spawner/structure/window/hollow/reinforced/middle/Initialize(mapload) - switch(dir) - if(NORTH,SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/north) - if(EAST,WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/east, /obj/structure/window/reinforced/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/reinforced/directional - icon_state = "hrwindow_spawner_directional" - -/obj/effect/spawner/structure/window/hollow/reinforced/directional/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north) - if(NORTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/east) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/east) - if(SOUTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced) - if(SOUTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced, /obj/structure/window/reinforced/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/west) - if(NORTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/spawner/north, /obj/structure/window/reinforced/spawner/west) - . = ..() - -//tinted - -/obj/effect/spawner/structure/window/reinforced/tinted - name = "tinted reinforced window spawner" - icon_state = "twindow_spawner" - spawn_list = list(/obj/structure/window/reinforced/tinted/fulltile) - -/obj/effect/spawner/structure/window/reinforced/tinted/grille - name = "tinted reinforced window with grille spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/tinted/fulltile) - -//bronze - -/obj/effect/spawner/structure/window/bronze - name = "bronze window spawner" - icon_state = "bronzewindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/bronze/fulltile) - - -//shuttle window - -/obj/effect/spawner/structure/window/reinforced/shuttle - name = "shuttle window spawner" - icon_state = "swindow_spawner" - spawn_list = list(/obj/structure/window/reinforced/shuttle) - - -//plastitanium window - -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium - name = "plastitanium window spawner" - icon_state = "plastitaniumwindow_spawner" - spawn_list = list(/obj/structure/window/reinforced/plasma/plastitanium) - - -//ice window - -/obj/effect/spawner/structure/window/ice - name = "ice window spawner" - icon_state = "icewindow_spawner" - spawn_list = list(/obj/structure/window/reinforced/fulltile/ice) - - -//survival pod window - -/obj/effect/spawner/structure/window/survival_pod - name = "pod window spawner" - icon_state = "podwindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod) - -/obj/effect/spawner/structure/window/hollow/survival_pod - name = "hollow pod window spawner" - icon_state = "podwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - -/obj/effect/spawner/structure/window/hollow/survival_pod/end - icon_state = "podwindow_spawner_end" - -/obj/effect/spawner/structure/window/hollow/survival_pod/end/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/survival_pod/middle - icon_state = "podwindow_spawner_middle" - -/obj/effect/spawner/structure/window/hollow/survival_pod/middle/Initialize(mapload) - switch(dir) - if(NORTH,SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north) - if(EAST,WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/survival_pod/directional - icon_state = "podwindow_spawner_directional" - -/obj/effect/spawner/structure/window/hollow/survival_pod/directional/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north) - if(NORTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east) - if(SOUTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod) - if(SOUTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - if(NORTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north, /obj/structure/window/reinforced/shuttle/survival_pod/spawner/west) - . = ..() - - -//plasma windows - -/obj/effect/spawner/structure/window/plasma - name = "plasma window spawner" - icon_state = "pwindow_spawner" - spawn_list = list(/obj/structure/window/plasma/fulltile) - -/obj/effect/spawner/structure/window/hollow/plasma - name = "hollow plasma window spawner" - icon_state = "phwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) - -/obj/effect/spawner/structure/window/hollow/plasma/end - icon_state = "phwindow_spawner_end" - -/obj/effect/spawner/structure/window/hollow/plasma/end/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/plasma/middle - icon_state = "phwindow_spawner_middle" - -/obj/effect/spawner/structure/window/hollow/plasma/middle/Initialize(mapload) - switch(dir) - if(NORTH,SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/north) - if(EAST,WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/east, /obj/structure/window/plasma/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/plasma/directional - icon_state = "phwindow_spawner_directional" - -/obj/effect/spawner/structure/window/hollow/plasma/directional/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north) - if(NORTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/east) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/east) - if(SOUTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma) - if(SOUTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma, /obj/structure/window/plasma/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/west) - if(NORTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/plasma/spawner/north, /obj/structure/window/plasma/spawner/west) - . = ..() - -//reinforced plasma - -/obj/effect/spawner/structure/window/reinforced/plasma - name = "reinforced plasma window spawner" - icon_state = "prwindow_spawner" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/fulltile) - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma - name = "hollow reinforced plasma window spawner" - icon_state = "phrwindow_spawner_full" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/north, /obj/structure/window/reinforced/plasma/spawner/east, /obj/structure/window/reinforced/plasma/spawner/west) - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/end - icon_state = "phrwindow_spawner_end" - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/end/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/north, /obj/structure/window/reinforced/plasma/spawner/east, /obj/structure/window/reinforced/plasma/spawner/west) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/north, /obj/structure/window/reinforced/plasma/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/east, /obj/structure/window/reinforced/plasma/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/north, /obj/structure/window/reinforced/plasma/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle - icon_state = "phrwindow_spawner_middle" - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle/Initialize(mapload) - switch(dir) - if(NORTH,SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/north) - if(EAST,WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/east, /obj/structure/window/reinforced/plasma/spawner/west) - . = ..() - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/directional - icon_state = "phrwindow_spawner_directional" - -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/directional/Initialize(mapload) - switch(dir) - if(NORTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/north) - if(NORTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/north, /obj/structure/window/reinforced/plasma/spawner/east) - if(EAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/east) - if(SOUTHEAST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/east) - if(SOUTH) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma) - if(SOUTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma, /obj/structure/window/reinforced/plasma/spawner/west) - if(WEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/west) - if(NORTHWEST) - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/spawner/north, /obj/structure/window/reinforced/plasma/spawner/west) - . = ..() - -//Dummy types -/obj/effect/spawner/structure/window/prepainted - name = "dummy" - -/obj/effect/spawner/structure/window/reinforced/prepainted - name = "dummy" - -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted - name = "dummy" - -/obj/effect/spawner/structure/window/prepainted/daedalus - name = "reinforced window spawner (daedaelus paint)" - spawn_list = list(/obj/structure/window/fulltile) - -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus - name = "window spawner (daedalus paint)" - spawn_list = list(/obj/structure/window/reinforced/fulltile) - -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus - name = "tinted reinforced window spawner (daedalus paint)" - spawn_list = list(/obj/structure/window/reinforced/tinted/fulltile) - -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus - name = "reinforced plasma window spawner (daedalus paint)" - spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/plasma/fulltile) - -/obj/effect/spawner/structure/window/prepainted/marsexec - name = "reinforced window spawner (mars executive paint)" - spawn_list = list(/obj/structure/window/fulltile) - -/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec - name = "window spawner (mars executive paint)" - spawn_list = list(/obj/structure/window/reinforced/fulltile) - -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/marsexec - name = "tinted reinforced window spawner (mars executive paint)" - spawn_list = list(/obj/structure/window/reinforced/tinted/fulltile) diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index f000aa4c039..42ea9a8b677 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -34,7 +34,7 @@ /obj/effect/temp_visual/cult/door name = "unholy glow" icon_state = "doorglow" - layer = CLOSED_FIREDOOR_LAYER //above closed doors + layer = CLOSED_DOOR_LAYER + 0.1 //above closed doors plane = GAME_PLANE /obj/effect/temp_visual/cult/door/unruned diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 5f557b037ef..c74722268a2 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -480,51 +480,6 @@ icon_state = "launchpad_pull" duration = 2 SECONDS -/obj/effect/constructing_effect - icon = 'icons/effects/effects_rcd.dmi' - icon_state = "" - layer = ABOVE_ALL_MOB_LAYER - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/status = 0 - var/delay = 0 - -/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status) - . = ..() - status = rcd_status - delay = rcd_delay - if (status == RCD_DECONSTRUCT) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), 1.1 SECONDS) - delay -= 11 - icon_state = "rcd_end_reverse" - else - update_appearance() - -/obj/effect/constructing_effect/update_icon_state() - icon_state = "rcd" - if(delay < 10) - icon_state += "_shortest" - return ..() - if (delay < 20) - icon_state += "_shorter" - return ..() - if (delay < 37) - icon_state += "_short" - return ..() - if(status == RCD_DECONSTRUCT) - icon_state += "_reverse" - return ..() - -/obj/effect/constructing_effect/proc/end_animation() - if (status == RCD_DECONSTRUCT) - qdel(src) - else - icon_state = "rcd_end" - addtimer(CALLBACK(src, PROC_REF(end)), 15) - -/obj/effect/constructing_effect/proc/end() - qdel(src) - /obj/effect/temp_visual/electricity icon_state = "electricity3" duration = 0.5 SECONDS diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm deleted file mode 100644 index d1cc144f576..00000000000 --- a/code/game/objects/items/RCD.dm +++ /dev/null @@ -1,1146 +0,0 @@ -#define GLOW_MODE 3 -#define LIGHT_MODE 2 -#define REMOVE_MODE 1 - -/* -CONTAINS: -RCD -ARCD -RLD -*/ - -TYPEINFO_DEF(/obj/item/construction) - default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) - default_materials = list(/datum/material/steel=100000) - -/obj/item/construction - name = "not for ingame use" - desc = "A device used to rapidly build and deconstruct. Reload with iron, plasteel, glass or compressed matter cartridges." - opacity = FALSE - density = FALSE - anchored = FALSE - flags_1 = CONDUCT_1 - item_flags = NOBLUDGEON - force = 0 - throwforce = 10 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL - req_access_txt = "11" - resistance_flags = FIRE_PROOF - var/datum/effect_system/spark_spread/spark_system - var/matter = 0 - var/max_matter = 100 - var/no_ammo_message = "The \'Low Ammo\' light on the device blinks yellow." - var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays - var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states - /// Bitflags for upgrades - var/upgrade = NONE - /// Bitflags for banned upgrades - var/banned_upgrades = NONE - var/datum/component/remote_materials/silo_mats //remote connection to the silo - var/silo_link = FALSE //switch to use internal or remote storage - -/obj/item/construction/Initialize(mapload) - . = ..() - spark_system = new /datum/effect_system/spark_spread - spark_system.set_up(5, 0, src) - spark_system.attach(src) - if(upgrade & RCD_UPGRADE_SILO_LINK) - silo_mats = AddComponent(/datum/component/remote_materials, "RCD", mapload, FALSE) - -/obj/item/construction/examine(mob/user) - . = ..() - . += "It currently holds [matter]/[max_matter] matter-units." - if(upgrade & RCD_UPGRADE_SILO_LINK) - . += "Remote storage link state: [silo_link ? "[silo_mats.on_hold() ? "ON HOLD" : "ON"]" : "OFF"]." - if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) - . += "Remote connection has iron in equivalent to [silo_mats.mat_container.get_material_amount(/datum/material/steel)/500] RCD unit\s." //1 matter for 1 floor tile, as 4 tiles are produced from 1 iron - -/obj/item/construction/Destroy() - QDEL_NULL(spark_system) - silo_mats = null - return ..() - -/obj/item/construction/pre_attack(atom/target, mob/user, params) - if(istype(target, /obj/item/rcd_upgrade)) - install_upgrade(target, user) - return TRUE - if(insert_matter(target, user)) - return TRUE - return ..() - -/obj/item/construction/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/rcd_upgrade)) - install_upgrade(W, user) - return TRUE - if(insert_matter(W, user)) - return TRUE - return ..() - -/// Installs an upgrade into the RCD checking if it is already installed, or if it is a banned upgrade -/obj/item/construction/proc/install_upgrade(obj/item/rcd_upgrade/rcd_up, mob/user) - if(rcd_up.upgrade & upgrade) - to_chat(user, span_warning("[src] has already installed this upgrade!")) - return - if(rcd_up.upgrade & banned_upgrades) - to_chat(user, span_warning("[src] can't install this upgrade!")) - return - upgrade |= rcd_up.upgrade - if((rcd_up.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) - silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - qdel(rcd_up) - -/// Inserts matter into the RCD allowing it to build -/obj/item/construction/proc/insert_matter(obj/O, mob/user) - if(iscyborg(user)) - return FALSE - var/loaded = FALSE - if(istype(O, /obj/item/rcd_ammo)) - var/obj/item/rcd_ammo/R = O - var/load = min(R.ammoamt, max_matter - matter) - if(load <= 0) - to_chat(user, span_warning("[src] can't hold any more matter-units!")) - return FALSE - R.ammoamt -= load - if(R.ammoamt <= 0) - qdel(R) - matter += load - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - loaded = TRUE - else if(istype(O, /obj/item/stack)) - loaded = loadwithsheets(O, user) - if(loaded) - to_chat(user, span_notice("[src] now holds [matter]/[max_matter] matter-units.")) - update_appearance() //ensures that ammo counters (if present) get updated - return loaded - -/obj/item/construction/proc/loadwithsheets(obj/item/stack/S, mob/user) - var/value = S.matter_amount - if(value <= 0) - to_chat(user, span_notice("You can't insert [S.name] into [src]!")) - return FALSE - var/maxsheets = round((max_matter-matter)/value) //calculate the max number of sheets that will fit in RCD - if(maxsheets > 0) - var/amount_to_use = min(S.amount, maxsheets) - S.use(amount_to_use) - matter += value*amount_to_use - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - to_chat(user, span_notice("You insert [amount_to_use] [S.name] sheets into [src]. ")) - return TRUE - to_chat(user, span_warning("You can't insert any more [S.name] sheets into [src]!")) - return FALSE - -/obj/item/construction/proc/activate() - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) - -/obj/item/construction/attack_self(mob/user) - playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE) - if(prob(20)) - spark_system.start() - -/obj/item/construction/proc/useResource(amount, mob/user) - if(!silo_mats || !silo_link) - if(matter < amount) - if(user) - to_chat(user, no_ammo_message) - return FALSE - matter -= amount - update_appearance() - return TRUE - else - if(silo_mats.on_hold()) - if(user) - to_chat(user, span_alert("Mineral access is on hold, please contact the quartermaster.")) - return FALSE - if(!silo_mats.mat_container) - to_chat(user, span_alert("No silo link detected. Connect to silo via multitool.")) - return FALSE - if(!silo_mats.mat_container.has_materials(list(/datum/material/steel = 500), amount)) - if(user) - to_chat(user, no_ammo_message) - return FALSE - - var/list/materials = list() - materials[GET_MATERIAL_REF(/datum/material/steel)] = 500 - silo_mats.mat_container.use_materials(materials, amount) - silo_mats.silo_log(src, "consume", -amount, "build", materials) - return TRUE - -/obj/item/construction/proc/checkResource(amount, mob/user) - if(!silo_mats || !silo_mats.mat_container || !silo_link) - if(silo_link) - to_chat(user, span_alert("Connected silo link is invalid. Reconnect to silo via multitool.")) - return FALSE - else - . = matter >= amount - else - if(silo_mats.on_hold()) - if(user) - to_chat(user, span_alert("Mineral access is on hold, please contact the quartermaster.")) - return FALSE - . = silo_mats.mat_container.has_materials(list(/datum/material/steel = 500), amount) - if(!. && user) - to_chat(user, no_ammo_message) - if(has_ammobar) - flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light - return . - -/obj/item/construction/proc/range_check(atom/A, mob/user) - if(A.z != user.z) - return - if(!(A in view(7, get_turf(user)))) - to_chat(user, span_warning("The \'Out of Range\' light on [src] blinks red.")) - return FALSE - else - return TRUE - -/obj/item/construction/proc/prox_check(proximity) - if(proximity) - return TRUE - else - return FALSE - -/** - * Checks if we are allowed to interact with a radial menu - * - * Arguments: - * * user The living mob interacting with the menu - * * remote_anchor The remote anchor for the menu - */ -/obj/item/construction/proc/check_menu(mob/living/user, remote_anchor) - if(!istype(user)) - return FALSE - if(user.incapacitated()) - return FALSE - if(remote_anchor && user.remote_control != remote_anchor) - return FALSE - return TRUE - -#define RCD_DESTRUCTIVE_SCAN_RANGE 10 -#define RCD_HOLOGRAM_FADE_TIME (15 SECONDS) -#define RCD_DESTRUCTIVE_SCAN_COOLDOWN (RCD_HOLOGRAM_FADE_TIME + 1 SECONDS) - -/obj/item/construction/rcd - name = "rapid-construction-device (RCD)" - icon = 'icons/obj/tools.dmi' - icon_state = "rcd" - worn_icon_state = "RCD" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - custom_premium_price = PAYCHECK_HARD * 10 - max_matter = 160 - slot_flags = ITEM_SLOT_BELT - item_flags = NO_MAT_REDEMPTION | NOBLUDGEON - has_ammobar = TRUE - actions_types = list(/datum/action/item_action/rcd_scan) - var/mode = RCD_FLOORWALL - var/construction_mode = RCD_FLOORWALL - var/ranged = FALSE - var/computer_dir = 1 - var/airlock_type = /obj/machinery/door/airlock - var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use - var/window_type = /obj/structure/window/fulltile - var/window_glass = RCD_WINDOW_NORMAL - var/window_size = RCD_WINDOW_FULLTILE - var/furnish_type = /obj/structure/chair - var/furnish_cost = 8 - var/furnish_delay = 10 - var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available - var/delay_mod = 1 - var/canRturf = FALSE //Variable for R walls to deconstruct them - /// Integrated airlock electronics for setting access to a newly built airlocks - var/obj/item/electronics/airlock/airlock_electronics - - COOLDOWN_DECLARE(destructive_scan_cooldown) - -GLOBAL_VAR_INIT(icon_holographic_wall, init_holographic_wall()) -GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) - -// `initial` does not work here. Neither does instantiating a wall/whatever -// and referencing that. I don't know why. -/proc/init_holographic_wall() - return getHologramIcon( - icon('icons/turf/walls/legacy/wall.dmi', "wall-0"), - opacity = 1, - ) - -/proc/init_holographic_window() - var/icon/grille_icon = icon('icons/obj/structures.dmi', "grille") - var/icon/window_icon = icon('icons/obj/smooth_structures/window.dmi', "window-0") - - grille_icon.Blend(window_icon, ICON_OVERLAY) - - return getHologramIcon(grille_icon) - -/obj/item/construction/rcd/Initialize(mapload) - . = ..() - AddElement(/datum/element/openspace_item_click_handler) - -/obj/item/construction/rcd/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag) - mode = construction_mode - rcd_create(target, user) - -/obj/item/construction/rcd/ui_action_click(mob/user, actiontype) - if (!COOLDOWN_FINISHED(src, destructive_scan_cooldown)) - to_chat(user, span_warning("[src] lets out a low buzz.")) - return - - COOLDOWN_START(src, destructive_scan_cooldown, RCD_DESTRUCTIVE_SCAN_COOLDOWN) - rcd_scan(src) - -/** - * Global proc that generates RCD hologram in a range. - * - * Arguments: - * * source - The atom the scans originate from - * * scan_range - The range of turfs we grab from the source - * * fade_time - The time for RCD holograms to fade - */ -/proc/rcd_scan(atom/source, scan_range = RCD_DESTRUCTIVE_SCAN_RANGE, fade_time = RCD_HOLOGRAM_FADE_TIME) - playsound(source, 'sound/items/rcdscan.ogg', 50, vary = TRUE, pressure_affected = FALSE) - - var/turf/source_turf = get_turf(source) - for(var/turf/open/surrounding_turf in RANGE_TURFS(scan_range, source_turf)) - var/rcd_memory = surrounding_turf.rcd_memory - if(!rcd_memory) - continue - - var/skip_to_next_turf = FALSE - - - for(var/atom/content_of_turf as anything in surrounding_turf.contents) - if (content_of_turf.density) - skip_to_next_turf = TRUE - break - - if(skip_to_next_turf) - continue - - var/hologram_icon - switch(rcd_memory) - if(RCD_MEMORY_WALL) - hologram_icon = GLOB.icon_holographic_wall - if(RCD_MEMORY_WINDOWGRILLE) - hologram_icon = GLOB.icon_holographic_window - - var/obj/effect/rcd_hologram/hologram = new(surrounding_turf) - hologram.icon = hologram_icon - animate(hologram, alpha = 0, time = fade_time, easing = CIRCULAR_EASING | EASE_IN) - -/obj/effect/rcd_hologram - name = "hologram" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/effect/rcd_hologram/Initialize(mapload) - . = ..() - QDEL_IN(src, RCD_HOLOGRAM_FADE_TIME) - -#undef RCD_DESTRUCTIVE_SCAN_COOLDOWN -#undef RCD_DESTRUCTIVE_SCAN_RANGE -#undef RCD_HOLOGRAM_FADE_TIME - -/obj/item/construction/rcd/suicide_act(mob/living/user) - var/turf/T = get_turf(user) - - if(!isopenturf(T)) // Oh fuck - user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - return BRUTELOSS - - mode = RCD_FLOORWALL - user.visible_message(span_suicide("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide!")) - if(checkResource(16, user)) // It takes 16 resources to construct a wall - var/success = T.rcd_act(user, src, RCD_FLOORWALL) - T = get_turf(user) - // If the RCD placed a floor instead of a wall, having a wall without plating under it is cursed - // There isn't an easy programmatical way to check if rcd_act will place a floor or a wall, so just repeat using it for free - if(success && isopenturf(T)) - T.rcd_act(user, src, RCD_FLOORWALL) - useResource(16, user) - activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.gib() - return MANUAL_SUICIDE - - user.visible_message(span_suicide("[user] pulls the trigger... But there is not enough ammo!")) - return SHAME - -/obj/item/construction/rcd/verb/toggle_window_glass_verb() - set name = "RCD : Toggle Window Glass" - set category = "Object" - set src in view(1) - - if(!usr.canUseTopic(src, USE_CLOSE)) - return - - toggle_window_glass(usr) - -/obj/item/construction/rcd/verb/toggle_window_size_verb() - set name = "RCD : Toggle Window Size" - set category = "Object" - set src in view(1) - - if(!usr.canUseTopic(src, USE_CLOSE)) - return - - toggle_window_size(usr) - -/// Toggles the usage of reinforced or normal glass -/obj/item/construction/rcd/proc/toggle_window_glass(mob/user) - if (window_glass != RCD_WINDOW_REINFORCED) - set_window_type(user, RCD_WINDOW_REINFORCED, window_size) - return - set_window_type(user, RCD_WINDOW_NORMAL, window_size) - -/// Toggles the usage of directional or full tile windows -/obj/item/construction/rcd/proc/toggle_window_size(mob/user) - if (window_size != RCD_WINDOW_DIRECTIONAL) - set_window_type(user, window_glass, RCD_WINDOW_DIRECTIONAL) - return - set_window_type(user, window_glass, RCD_WINDOW_FULLTILE) - -/// Sets the window type to be created based on parameters -/obj/item/construction/rcd/proc/set_window_type(mob/user, glass, size) - window_glass = glass - window_size = size - if(window_glass == RCD_WINDOW_REINFORCED) - if(window_size == RCD_WINDOW_DIRECTIONAL) - window_type = /obj/structure/window/reinforced - else - window_type = /obj/structure/window/reinforced/fulltile - else - if(window_size == RCD_WINDOW_DIRECTIONAL) - window_type = /obj/structure/window - else - window_type = /obj/structure/window/fulltile - - to_chat(user, span_notice("You change \the [src]'s window mode to [window_size] [window_glass] window.")) - -/obj/item/construction/rcd/proc/toggle_silo_link(mob/user) - if(silo_mats) - if(!silo_mats.mat_container && !silo_link) // Allow them to turn off an invalid link - to_chat(user, span_alert("No silo link detected. Connect to silo via multitool.")) - return FALSE - silo_link = !silo_link - to_chat(user, span_notice("You change \the [src]'s storage link state: [silo_link ? "ON" : "OFF"].")) - else - to_chat(user, span_warning("\the [src] doesn't have remote storage connection.")) - -/obj/item/construction/rcd/proc/get_airlock_image(airlock_type) - var/obj/machinery/door/airlock/proto = airlock_type - var/ic = initial(proto.icon) - var/mutable_appearance/MA = mutable_appearance(ic, "closed") - var/has_glass = initial(proto.glass) - - var/color_overlays = initial(proto.color_overlays) - var/stripe_overlays = initial(proto.stripe_overlays) - var/airlock_paint = initial(proto.airlock_paint) - var/stripe_paint = initial(proto.stripe_paint) - - if(!has_glass) - MA.overlays += "fill_closed" - else - MA.overlays += mutable_appearance(initial(proto.glass_fill_overlays), "glass_closed") - if(color_overlays && airlock_paint) - var/mutable_appearance/paint = mutable_appearance(color_overlays, "closed") - paint.color = airlock_paint - MA.overlays += paint - if(!has_glass) - var/mutable_appearance/paint_fill = mutable_appearance(color_overlays, "fill_closed") - paint_fill.color = airlock_paint - MA.overlays += paint_fill - if(stripe_overlays && stripe_paint) - var/mutable_appearance/stripe = mutable_appearance(stripe_overlays, "closed") - stripe.color = stripe_paint - MA.overlays += stripe - if(!has_glass) - var/mutable_appearance/stripe_fill = mutable_appearance(stripe_overlays, "fill_closed") - stripe_fill.color = stripe_paint - MA.overlays += stripe_fill - //Not scaling these down to button size because they look horrible then, instead just bumping up radius. - return MA - -/obj/item/construction/rcd/proc/change_computer_dir(mob/user) - if(!user) - return - var/list/computer_dirs = list( - "NORTH" = image(icon = 'icons/hud/radial.dmi', icon_state = "cnorth"), - "EAST" = image(icon = 'icons/hud/radial.dmi', icon_state = "ceast"), - "SOUTH" = image(icon = 'icons/hud/radial.dmi', icon_state = "csouth"), - "WEST" = image(icon = 'icons/hud/radial.dmi', icon_state = "cwest") - ) - var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - switch(computerdirs) - if("NORTH") - computer_dir = 1 - if("EAST") - computer_dir = 4 - if("SOUTH") - computer_dir = 2 - if("WEST") - computer_dir = 8 - -/** - * Customizes RCD's airlock settings based on user's choices - * - * Arguments: - * * user The mob that is choosing airlock settings - * * remote_anchor The remote anchor for radial menus. If set, it will also remove proximity restrictions from the menus - */ -/obj/item/construction/rcd/proc/change_airlock_setting(mob/user, remote_anchor) - if(!user) - return - - var/list/solid_or_glass_choices = list( - "Solid" = get_airlock_image(/obj/machinery/door/airlock), - "Glass" = get_airlock_image(/obj/machinery/door/airlock/glass), - "Windoor" = image(icon = 'icons/hud/radial.dmi', icon_state = "windoor"), - "Secure Windoor" = image(icon = 'icons/hud/radial.dmi', icon_state = "secure_windoor") - ) - - var/list/solid_choices = list( - "Standard" = get_airlock_image(/obj/machinery/door/airlock), - "Public" = get_airlock_image(/obj/machinery/door/airlock/public), - "Engineering" = get_airlock_image(/obj/machinery/door/airlock/engineering), - "Atmospherics" = get_airlock_image(/obj/machinery/door/airlock/atmos), - "Security" = get_airlock_image(/obj/machinery/door/airlock/security), - "Command" = get_airlock_image(/obj/machinery/door/airlock/command), - "Medical" = get_airlock_image(/obj/machinery/door/airlock/medical), - "Research" = get_airlock_image(/obj/machinery/door/airlock/research), - "Freezer" = get_airlock_image(/obj/machinery/door/airlock/freezer), - "Virology" = get_airlock_image(/obj/machinery/door/airlock/virology), - "Mining" = get_airlock_image(/obj/machinery/door/airlock/mining), - "Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance), - "External" = get_airlock_image(/obj/machinery/door/airlock/external), - "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external), - "Airtight Hatch" = get_airlock_image(/obj/machinery/door/airlock/hatch), - "Maintenance Hatch" = get_airlock_image(/obj/machinery/door/airlock/maintenance_hatch) - ) - - var/list/glass_choices = list( - "Standard" = get_airlock_image(/obj/machinery/door/airlock/glass), - "Public" = get_airlock_image(/obj/machinery/door/airlock/public/glass), - "Engineering" = get_airlock_image(/obj/machinery/door/airlock/engineering/glass), - "Atmospherics" = get_airlock_image(/obj/machinery/door/airlock/atmos/glass), - "Security" = get_airlock_image(/obj/machinery/door/airlock/security/glass), - "Command" = get_airlock_image(/obj/machinery/door/airlock/command/glass), - "Medical" = get_airlock_image(/obj/machinery/door/airlock/medical/glass), - "Research" = get_airlock_image(/obj/machinery/door/airlock/research/glass), - "Virology" = get_airlock_image(/obj/machinery/door/airlock/virology/glass), - "Mining" = get_airlock_image(/obj/machinery/door/airlock/mining/glass), - "Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/glass), - "External" = get_airlock_image(/obj/machinery/door/airlock/external/glass), - "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass) - ) - - var/airlockcat = show_radial_menu(user, remote_anchor || src, solid_or_glass_choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user, remote_anchor), require_near = remote_anchor ? FALSE : TRUE, tooltips = TRUE) - switch(airlockcat) - if("Solid") - if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, remote_anchor || src, solid_choices, radius = 42, custom_check = CALLBACK(src, PROC_REF(check_menu), user, remote_anchor), require_near = remote_anchor ? FALSE : TRUE, tooltips = TRUE) - switch(airlockpaint) - if("Standard") - airlock_type = /obj/machinery/door/airlock - if("Public") - airlock_type = /obj/machinery/door/airlock/public - if("Engineering") - airlock_type = /obj/machinery/door/airlock/engineering - if("Atmospherics") - airlock_type = /obj/machinery/door/airlock/atmos - if("Security") - airlock_type = /obj/machinery/door/airlock/security - if("Command") - airlock_type = /obj/machinery/door/airlock/command - if("Medical") - airlock_type = /obj/machinery/door/airlock/medical - if("Research") - airlock_type = /obj/machinery/door/airlock/research - if("Freezer") - airlock_type = /obj/machinery/door/airlock/freezer - if("Virology") - airlock_type = /obj/machinery/door/airlock/virology - if("Mining") - airlock_type = /obj/machinery/door/airlock/mining - if("Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance - if("External") - airlock_type = /obj/machinery/door/airlock/external - if("External Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance/external - if("Airtight Hatch") - airlock_type = /obj/machinery/door/airlock/hatch - if("Maintenance Hatch") - airlock_type = /obj/machinery/door/airlock/maintenance_hatch - airlock_glass = FALSE - else - airlock_type = /obj/machinery/door/airlock - airlock_glass = FALSE - - if("Glass") - if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, remote_anchor || src, glass_choices, radius = 42, custom_check = CALLBACK(src, PROC_REF(check_menu), user, remote_anchor), require_near = remote_anchor ? FALSE : TRUE, tooltips = TRUE) - switch(airlockpaint) - if("Standard") - airlock_type = /obj/machinery/door/airlock/glass - if("Public") - airlock_type = /obj/machinery/door/airlock/public/glass - if("Engineering") - airlock_type = /obj/machinery/door/airlock/engineering/glass - if("Atmospherics") - airlock_type = /obj/machinery/door/airlock/atmos/glass - if("Security") - airlock_type = /obj/machinery/door/airlock/security/glass - if("Command") - airlock_type = /obj/machinery/door/airlock/command/glass - if("Medical") - airlock_type = /obj/machinery/door/airlock/medical/glass - if("Research") - airlock_type = /obj/machinery/door/airlock/research/glass - if("Virology") - airlock_type = /obj/machinery/door/airlock/virology/glass - if("Mining") - airlock_type = /obj/machinery/door/airlock/mining/glass - if("Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance/glass - if("External") - airlock_type = /obj/machinery/door/airlock/external/glass - if("External Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance/external/glass - airlock_glass = TRUE - else - airlock_type = /obj/machinery/door/airlock/glass - airlock_glass = TRUE - if("Windoor") - airlock_type = /obj/machinery/door/window - airlock_glass = TRUE - if("Secure Windoor") - airlock_type = /obj/machinery/door/window/brigdoor - airlock_glass = TRUE - else - airlock_type = /obj/machinery/door/airlock - airlock_glass = FALSE - -/// Radial menu for choosing the object you want to be created with the furnishing mode -/obj/item/construction/rcd/proc/change_furnishing_type(mob/user) - if(!user) - return - var/static/list/choices = list( - "Chair" = image(icon = 'icons/hud/radial.dmi', icon_state = "chair"), - "Stool" = image(icon = 'icons/hud/radial.dmi', icon_state = "stool"), - "Table" = image(icon = 'icons/hud/radial.dmi', icon_state = "table"), - "Glass Table" = image(icon = 'icons/hud/radial.dmi', icon_state = "glass_table") - ) - var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - switch(choice) - if("Chair") - furnish_type = /obj/structure/chair - furnish_cost = 8 - furnish_delay = 10 - if("Stool") - furnish_type = /obj/structure/chair/stool - furnish_cost = 8 - furnish_delay = 10 - if("Table") - furnish_type = /obj/structure/table - furnish_cost = 16 - furnish_delay = 20 - if("Glass Table") - furnish_type = /obj/structure/table/glass - furnish_cost = 16 - furnish_delay = 20 - -/obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) - var/list/rcd_results = A.rcd_vals(user, src) - if(!rcd_results) - return FALSE - var/delay = rcd_results["delay"] * delay_mod - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) - if(!checkResource(rcd_results["cost"], user)) - qdel(rcd_effect) - return FALSE - if(rcd_results["mode"] == RCD_MACHINE || rcd_results["mode"] == RCD_COMPUTER || rcd_results["mode"] == RCD_FURNISHING) - var/turf/target_turf = get_turf(A) - if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - qdel(rcd_effect) - return FALSE - if(!do_after(user, A, delay, DO_PUBLIC, display = src)) - qdel(rcd_effect) - return FALSE - if(!checkResource(rcd_results["cost"], user)) - qdel(rcd_effect) - return FALSE - if(!A.rcd_act(user, src, rcd_results["mode"])) - qdel(rcd_effect) - return FALSE - rcd_effect.end_animation() - useResource(rcd_results["cost"], user) - activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - return TRUE - -/obj/item/construction/rcd/Initialize(mapload) - . = ..() - airlock_electronics = new(src) - airlock_electronics.name = "Access Control" - airlock_electronics.holder = src - SET_TRACKING(TRACKING_KEY_RCD) - -/obj/item/construction/rcd/Destroy() - QDEL_NULL(airlock_electronics) - UNSET_TRACKING(TRACKING_KEY_RCD) - . = ..() - -/obj/item/construction/rcd/attack_self(mob/user) - ..() - var/list/choices = list( - "Airlock" = image(icon = 'icons/hud/radial.dmi', icon_state = "airlock"), - "Grilles & Windows" = image(icon = 'icons/hud/radial.dmi', icon_state = "grillewindow"), - "Floors & Walls" = image(icon = 'icons/hud/radial.dmi', icon_state = "wallfloor") - ) - if(upgrade & RCD_UPGRADE_FRAMES) - choices += list( - "Machine Frames" = image(icon = 'icons/hud/radial.dmi', icon_state = "machine"), - "Computer Frames" = image(icon = 'icons/hud/radial.dmi', icon_state = "computer_dir"), - ) - if(upgrade & RCD_UPGRADE_SILO_LINK) - choices += list( - "Silo Link" = image(icon = 'icons/obj/mining.dmi', icon_state = "silo"), - ) - if(upgrade & RCD_UPGRADE_FURNISHING) - choices += list( - "Furnishing" = image(icon = 'icons/hud/radial.dmi', icon_state = "chair") - ) - switch(construction_mode) - if(RCD_AIRLOCK) - choices += list( - "Change Access" = image(icon = 'icons/hud/radial.dmi', icon_state = "access"), - "Change Airlock Type" = image(icon = 'icons/hud/radial.dmi', icon_state = "airlocktype") - ) - if(RCD_WINDOWGRILLE) - choices += list( - "Change Window Glass" = image(icon = 'icons/hud/radial.dmi', icon_state = "windowtype"), - "Change Window Size" = image(icon = 'icons/hud/radial.dmi', icon_state = "windowsize") - ) - if(RCD_FURNISHING) - choices += list( - "Change Furnishing Type" = image(icon = 'icons/hud/radial.dmi', icon_state = "chair") - ) - var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - switch(choice) - if("Floors & Walls") - construction_mode = RCD_FLOORWALL - if("Airlock") - construction_mode = RCD_AIRLOCK - if("Grilles & Windows") - construction_mode = RCD_WINDOWGRILLE - if("Machine Frames") - construction_mode = RCD_MACHINE - if("Furnishing") - construction_mode = RCD_FURNISHING - if("Computer Frames") - construction_mode = RCD_COMPUTER - change_computer_dir(user) - return - if("Change Access") - airlock_electronics.ui_interact(user) - return - if("Change Airlock Type") - change_airlock_setting(user) - return - if("Change Window Glass") - toggle_window_glass(user) - return - if("Change Window Size") - toggle_window_size(user) - return - if("Change Furnishing Type") - change_furnishing_type(user) - return - if("Silo Link") - toggle_silo_link(user) - return - else - return - playsound(src, 'sound/effects/pop.ogg', 50, FALSE) - to_chat(user, span_notice("You change RCD's mode to '[choice]'.")) - -/obj/item/construction/rcd/proc/target_check(atom/A, mob/user) // only returns true for stuff the device can actually work with - if((isturf(A) && A.density && mode==RCD_DECONSTRUCT) || (isturf(A) && !A.density) || (istype(A, /obj/machinery/door/airlock) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/grille) || (istype(A, /obj/structure/window) && mode==RCD_DECONSTRUCT)) - return TRUE - else - return FALSE - -/obj/item/construction/rcd/pre_attack(atom/A, mob/user, params) - . = ..() - mode = construction_mode - if(!A.rcd_vals(user, src)) - return - rcd_create(A, user) - return TRUE - -/obj/item/construction/rcd/pre_attack_secondary(atom/target, mob/living/user, params) - . = ..() - mode = RCD_DECONSTRUCT - if(!target.rcd_vals(user, src)) - return - rcd_create(target, user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - -/obj/item/construction/rcd/proc/detonate_pulse() - audible_message("[src] begins to vibrate and \ - buzz loudly!","[src] begins \ - vibrating violently!") - // 5 seconds to get rid of it - addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 50) - -/obj/item/construction/rcd/proc/detonate_pulse_explode() - explosion(src, light_impact_range = 3, flame_range = 1, flash_range = 1) - qdel(src) - -/obj/item/construction/rcd/update_overlays() - . = ..() - if(has_ammobar) - var/ratio = CEILING((matter / max_matter) * ammo_sections, 1) - if(ratio > 0) - . += "[icon_state]_charge[ratio]" - -/obj/item/construction/rcd/Initialize(mapload) - . = ..() - update_appearance() - -/obj/item/construction/rcd/borg - no_ammo_message = "Insufficient charge." - desc = "A device used to rapidly build walls and floors." - banned_upgrades = RCD_UPGRADE_SILO_LINK - var/energyfactor = 72 - - -/obj/item/construction/rcd/borg/useResource(amount, mob/user) - if(!iscyborg(user)) - return 0 - var/mob/living/silicon/robot/borgy = user - if(!borgy.cell) - if(user) - to_chat(user, no_ammo_message) - return 0 - . = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs - if(!. && user) - to_chat(user, no_ammo_message) - return . - -/obj/item/construction/rcd/borg/checkResource(amount, mob/user) - if(!iscyborg(user)) - return 0 - var/mob/living/silicon/robot/borgy = user - if(!borgy.cell) - if(user) - to_chat(user, no_ammo_message) - return 0 - . = borgy.cell.charge >= (amount * energyfactor) - if(!. && user) - to_chat(user, no_ammo_message) - return . - -/obj/item/construction/rcd/borg/syndicate - name = "syndicate RCD" - desc = "A reverse-engineered RCD with black market upgrades that allow this device to deconstruct reinforced walls. Property of Donk Co." - icon_state = "ircd" - inhand_icon_state = "ircd" - energyfactor = 66 - canRturf = TRUE - -/obj/item/construction/rcd/loaded - matter = 160 - -/obj/item/construction/rcd/loaded/upgraded - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING - -/obj/item/construction/rcd/combat - name = "industrial RCD" - icon_state = "ircd" - inhand_icon_state = "ircd" - max_matter = 500 - matter = 500 - canRturf = TRUE - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING - -TYPEINFO_DEF(/obj/item/rcd_ammo) - default_materials = list(/datum/material/steel=12000, /datum/material/glass=8000) - -/obj/item/rcd_ammo - name = "compressed matter cartridge" - desc = "Compressed matter for the RCD." - icon = 'icons/obj/tools.dmi' - icon_state = "rcdammo" - w_class = WEIGHT_CLASS_TINY - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - var/ammoamt = 40 - -TYPEINFO_DEF(/obj/item/rcd_ammo/large) - default_materials = list(/datum/material/steel=48000, /datum/material/glass=32000) - -/obj/item/rcd_ammo/large - name = "highly compressed matter cartridge" - desc = "Tightly compressed matter for the RCD." - ammoamt = 160 - - -/obj/item/construction/rcd/combat/admin - name = "admin RCD" - max_matter = INFINITY - matter = INFINITY - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING - - -// Ranged RCD - - -/obj/item/construction/rcd/arcd - name = "advanced rapid-construction-device (ARCD)" - desc = "A prototype RCD with ranged capability and extended capacity. Reload with iron, plasteel, glass or compressed matter cartridges." - max_matter = 300 - matter = 300 - delay_mod = 0.6 - ranged = TRUE - icon_state = "arcd" - inhand_icon_state = "oldrcd" - has_ammobar = FALSE - -/obj/item/construction/rcd/arcd/afterattack(atom/A, mob/user) - . = ..() - if(range_check(A,user)) - pre_attack(A, user) - -/obj/item/construction/rcd/arcd/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - if(range_check(target,user)) - pre_attack_secondary(target, user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/construction/rcd/arcd/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - if(ranged && range_check(target, user)) - mode = construction_mode - rcd_create(target, user) - -/obj/item/construction/rcd/arcd/rcd_create(atom/A, mob/user) - . = ..() - if(.) - user.Beam(A,icon_state="rped_upgrade", time = 3 SECONDS) - - - -// RAPID LIGHTING DEVICE - - - -/obj/item/construction/rld - name = "Rapid Lighting Device (RLD)" - desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges." - icon = 'icons/obj/tools.dmi' - icon_state = "rld-5" - worn_icon_state = "RPD" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - matter = 200 - max_matter = 200 - var/matter_divisor = 35 - var/mode = LIGHT_MODE - slot_flags = ITEM_SLOT_BELT - actions_types = list(/datum/action/item_action/pick_color) - - var/wallcost = 10 - var/floorcost = 15 - var/launchcost = 5 - var/deconcost = 10 - - var/walldelay = 10 - var/floordelay = 10 - var/decondelay = 15 - - var/color_choice = null - - -/obj/item/construction/rld/ui_action_click(mob/user, datum/action/A) - if(istype(A, /datum/action/item_action/pick_color)) - color_choice = input(user,"","Choose Color",color_choice) as color - else - ..() - -/obj/item/construction/rld/update_icon_state() - icon_state = "rld-[round(matter/matter_divisor)]" - return ..() - -/obj/item/construction/rld/attack_self(mob/user) - ..() - switch(mode) - if(REMOVE_MODE) - mode = LIGHT_MODE - to_chat(user, span_notice("You change RLD's mode to 'Permanent Light Construction'.")) - if(LIGHT_MODE) - mode = GLOW_MODE - to_chat(user, span_notice("You change RLD's mode to 'Light Launcher'.")) - if(GLOW_MODE) - mode = REMOVE_MODE - to_chat(user, span_notice("You change RLD's mode to 'Deconstruct'.")) - - -/obj/item/construction/rld/proc/checkdupes(target) - . = list() - var/turf/checking = get_turf(target) - for(var/obj/machinery/light/dupe in checking) - if(istype(dupe, /obj/machinery/light)) - . |= dupe - - -/obj/item/construction/rld/afterattack(atom/A, mob/user) - . = ..() - if(!range_check(A,user)) - return - var/turf/start = get_turf(src) - switch(mode) - if(REMOVE_MODE) - if(istype(A, /obj/machinery/light/)) - if(checkResource(deconcost, user)) - to_chat(user, span_notice("You start deconstructing [A]...")) - user.Beam(A,icon_state="light_beam", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - if(do_after(user, A, decondelay, DO_PUBLIC, display = src)) - if(!useResource(deconcost, user)) - return FALSE - activate() - qdel(A) - return TRUE - return FALSE - - if(LIGHT_MODE) - if(iswallturf(A)) - var/turf/closed/constructed_wall/W = A - if(checkResource(floorcost, user)) - to_chat(user, span_notice("You start building a wall light...")) - user.Beam(A,icon_state="light_beam", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, FALSE) - if(do_after(user, A, floordelay, DO_PUBLIC, display = src)) - if(!istype(W)) - return FALSE - var/list/candidates = list() - var/turf/open/winner = null - var/winning_dist = null - for(var/direction in GLOB.cardinals) - var/turf/C = get_step(W, direction) - var/list/dupes = checkdupes(C) - if((isspaceturf(C) || (get_step(src, 0).open_directions & direction)) && !dupes.len) - candidates += C - if(!candidates.len) - to_chat(user, span_warning("Valid target not found...")) - playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, TRUE) - return FALSE - for(var/turf/open/O in candidates) - if(istype(O)) - var/x0 = O.x - var/y0 = O.y - var/contender = cheap_hypotenuse(start.x, start.y, x0, y0) - if(!winner) - winner = O - winning_dist = contender - else - if(contender < winning_dist) // lower is better - winner = O - winning_dist = contender - activate() - if(!useResource(wallcost, user)) - return FALSE - var/light = get_turf(winner) - var/align = get_dir(winner, A) - var/obj/machinery/light/L = new /obj/machinery/light(light) - L.setDir(align) - L.color = color_choice - L.set_light_color(L.color) - return TRUE - return FALSE - - if(isfloorturf(A)) - var/turf/open/floor/F = A - if(checkResource(floorcost, user)) - to_chat(user, span_notice("You start building a floor light...")) - user.Beam(A,icon_state="light_beam", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, TRUE) - if(do_after(user, A, floordelay, DO_PUBLIC, display = src)) - if(!istype(F)) - return FALSE - if(!useResource(floorcost, user)) - return FALSE - activate() - var/destination = get_turf(A) - var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(destination) - FL.color = color_choice - FL.set_light_color(FL.color) - return TRUE - return FALSE - - if(GLOW_MODE) - if(useResource(launchcost, user)) - activate() - to_chat(user, span_notice("You fire a glowstick!")) - var/obj/item/flashlight/glowstick/G = new /obj/item/flashlight/glowstick(start) - G.color = color_choice - G.set_light_color(G.color) - G.throw_at(A, 9, 3, user) - G.on = TRUE - G.update_brightness() - return TRUE - return FALSE - -/obj/item/construction/rld/mini - name = "mini-rapid-light-device (MRLD)" - desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges." - icon = 'icons/obj/tools.dmi' - icon_state = "rld-5" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - matter = 100 - max_matter = 100 - matter_divisor = 20 - -/obj/item/rcd_upgrade - name = "RCD advanced design disk" - desc = "It seems to be empty." - icon = 'icons/obj/module.dmi' - icon_state = "datadisk3" - var/upgrade - -/obj/item/rcd_upgrade/frames - desc = "It contains the design for machine frames and computer frames." - upgrade = RCD_UPGRADE_FRAMES - -/obj/item/rcd_upgrade/simple_circuits - desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." - upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS - -/obj/item/rcd_upgrade/silo_link - desc = "It contains direct silo connection RCD upgrade." - upgrade = RCD_UPGRADE_SILO_LINK -/obj/item/rcd_upgrade/furnishing - desc = "It contains the design for chairs, stools, tables, and glass tables." - upgrade = RCD_UPGRADE_FURNISHING - -/datum/action/item_action/rcd_scan - name = "Destruction Scan" - desc = "Scans the surrounding area for destruction. Scanned structures will rebuild significantly faster." - -/datum/action/item_action/pick_color - name = "Choose A Color" - -#undef GLOW_MODE -#undef LIGHT_MODE -#undef REMOVE_MODE diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm deleted file mode 100644 index e302b597acf..00000000000 --- a/code/game/objects/items/RPD.dm +++ /dev/null @@ -1,661 +0,0 @@ -/* -CONTAINS: -RPD -*/ - -#define ATMOS_CATEGORY 0 -#define DISPOSALS_CATEGORY 1 -#define TRANSIT_CATEGORY 2 - -#define BUILD_MODE (1<<0) -#define WRENCH_MODE (1<<1) -#define DESTROY_MODE (1<<2) -#define REPROGRAM_MODE (1<<3) - -GLOBAL_LIST_INIT(atmos_pipe_recipes, list( - "Pipes" = list( - new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/smart, TRUE), - new /datum/pipe_info/pipe("Layer Adapter", /obj/machinery/atmospherics/pipe/layer_manifold, TRUE), - new /datum/pipe_info/pipe("Color Adapter", /obj/machinery/atmospherics/pipe/color_adapter, TRUE), - new /datum/pipe_info/pipe("Bridge Pipe", /obj/machinery/atmospherics/pipe/bridge_pipe, TRUE), - new /datum/pipe_info/pipe("Multi-Deck Adapter", /obj/machinery/atmospherics/pipe/multiz, FALSE), - ), - "Devices" = list( - new /datum/pipe_info/pipe("Connector", /obj/machinery/atmospherics/components/unary/portables_connector, TRUE), - new /datum/pipe_info/pipe("Gas Pump", /obj/machinery/atmospherics/components/binary/pump, TRUE), - new /datum/pipe_info/pipe("Volume Pump", /obj/machinery/atmospherics/components/binary/volume_pump, TRUE), - new /datum/pipe_info/pipe("Gas Filter", /obj/machinery/atmospherics/components/trinary/filter, TRUE), - new /datum/pipe_info/pipe("Gas Mixer", /obj/machinery/atmospherics/components/trinary/mixer, TRUE), - new /datum/pipe_info/pipe("Injector", /obj/machinery/atmospherics/components/unary/outlet_injector, TRUE), - new /datum/pipe_info/pipe("Scrubber", /obj/machinery/atmospherics/components/unary/vent_scrubber, TRUE), - new /datum/pipe_info/pipe("Unary Vent", /obj/machinery/atmospherics/components/unary/vent_pump, TRUE), - new /datum/pipe_info/pipe("Passive Vent", /obj/machinery/atmospherics/components/unary/passive_vent, TRUE), - new /datum/pipe_info/pipe("Manual Valve", /obj/machinery/atmospherics/components/binary/valve, TRUE), - new /datum/pipe_info/pipe("Digital Valve", /obj/machinery/atmospherics/components/binary/valve/digital, TRUE), - new /datum/pipe_info/pipe("Pressure Valve", /obj/machinery/atmospherics/components/binary/pressure_valve, TRUE), - new /datum/pipe_info/pipe("Temperature Gate", /obj/machinery/atmospherics/components/binary/temperature_gate, TRUE), - new /datum/pipe_info/pipe("Temperature Pump", /obj/machinery/atmospherics/components/binary/temperature_pump, TRUE), - new /datum/pipe_info/meter("Meter"), - ), - "Heat Exchange" = list( - new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/heat_exchanging/simple, FALSE), - new /datum/pipe_info/pipe("Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold, FALSE), - new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, FALSE), - new /datum/pipe_info/pipe("Junction", /obj/machinery/atmospherics/pipe/heat_exchanging/junction, FALSE), - new /datum/pipe_info/pipe("Heat Exchanger", /obj/machinery/atmospherics/components/unary/heat_exchanger, FALSE), - ) -)) - -GLOBAL_LIST_INIT(disposal_pipe_recipes, list( - "Disposal Pipes" = list( - new /datum/pipe_info/disposal("Pipe", /obj/structure/disposalpipe/segment, PIPE_BENDABLE), - new /datum/pipe_info/disposal("Junction", /obj/structure/disposalpipe/junction, PIPE_TRIN_M), - new /datum/pipe_info/disposal("Y-Junction", /obj/structure/disposalpipe/junction/yjunction), - new /datum/pipe_info/disposal("Sort Junction", /obj/structure/disposalpipe/sorting/mail, PIPE_TRIN_M), - new /datum/pipe_info/disposal("Trunk", /obj/structure/disposalpipe/trunk), - new /datum/pipe_info/disposal("Bin", /obj/machinery/disposal/bin, PIPE_ONEDIR), - new /datum/pipe_info/disposal("Outlet", /obj/structure/disposaloutlet), - new /datum/pipe_info/disposal("Chute", /obj/machinery/disposal/delivery_chute), - ) -)) - -GLOBAL_LIST_INIT(transit_tube_recipes, list( - "Transit Tubes" = list( - new /datum/pipe_info/transit("Straight Tube", /obj/structure/c_transit_tube, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Straight Tube with Crossing", /obj/structure/c_transit_tube/crossing, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Curved Tube", /obj/structure/c_transit_tube/curved, PIPE_UNARY_FLIPPABLE), - new /datum/pipe_info/transit("Diagonal Tube", /obj/structure/c_transit_tube/diagonal, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Diagonal Tube with Crossing", /obj/structure/c_transit_tube/diagonal/crossing, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Junction", /obj/structure/c_transit_tube/junction, PIPE_UNARY_FLIPPABLE), - ), - "Station Equipment" = list( - new /datum/pipe_info/transit("Through Tube Station", /obj/structure/c_transit_tube/station, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Terminus Tube Station", /obj/structure/c_transit_tube/station/reverse, PIPE_UNARY), - new /datum/pipe_info/transit("Through Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Terminus Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser/reverse, PIPE_UNARY), - new /datum/pipe_info/transit("Transit Tube Pod", /obj/structure/c_transit_tube_pod, PIPE_ONEDIR), - ) -)) - -/datum/pipe_info - var/name - var/icon_state - var/id = -1 - var/dirtype = PIPE_BENDABLE - var/all_layers - -/datum/pipe_info/proc/Params() - return "" - -/datum/pipe_info/proc/get_preview(selected_dir) - var/list/dirs - switch(dirtype) - if(PIPE_STRAIGHT, PIPE_BENDABLE) - dirs = list("[NORTH]" = "Vertical", "[EAST]" = "Horizontal") - if(dirtype == PIPE_BENDABLE) - dirs += list("[NORTHWEST]" = "West to North", "[NORTHEAST]" = "North to East", - "[SOUTHWEST]" = "South to West", "[SOUTHEAST]" = "East to South") - if(PIPE_TRINARY) - dirs = list("[NORTH]" = "West South East", "[SOUTH]" = "East North West", - "[EAST]" = "North West South", "[WEST]" = "South East North") - if(PIPE_TRIN_M) - dirs = list("[NORTH]" = "North East South", "[SOUTHWEST]" = "North West South", - "[NORTHEAST]" = "South East North", "[SOUTH]" = "South West North", - "[WEST]" = "West North East", "[SOUTHEAST]" = "West South East", - "[NORTHWEST]" = "East North West", "[EAST]" = "East South West",) - if(PIPE_UNARY) - dirs = list("[NORTH]" = "North", "[SOUTH]" = "South", "[WEST]" = "West", "[EAST]" = "East") - if(PIPE_ONEDIR) - dirs = list("[SOUTH]" = name) - if(PIPE_UNARY_FLIPPABLE) - dirs = list("[NORTH]" = "North", "[EAST]" = "East", "[SOUTH]" = "South", "[WEST]" = "West", - "[NORTHEAST]" = "North Flipped", "[SOUTHEAST]" = "East Flipped", "[SOUTHWEST]" = "South Flipped", "[NORTHWEST]" = "West Flipped") - - - var/list/rows = list() - var/list/row = list("previews" = list()) - var/i = 0 - for(var/dir in dirs) - var/numdir = text2num(dir) - var/flipped = ((dirtype == PIPE_TRIN_M) || (dirtype == PIPE_UNARY_FLIPPABLE)) && (ISDIAGONALDIR(numdir)) - row["previews"] += list(list("selected" = (numdir == selected_dir), "dir" = dir2text(numdir), "dir_name" = dirs[dir], "icon_state" = icon_state, "flipped" = flipped)) - if(i++ || dirtype == PIPE_ONEDIR) - rows += list(row) - row = list("previews" = list()) - i = 0 - - return rows - -/datum/pipe_info/pipe/New(label, obj/machinery/atmospherics/path, use_five_layers) - name = label - id = path - all_layers = use_five_layers - icon_state = initial(path.pipe_state) - var/obj/item/pipe/c = initial(path.construction_type) - dirtype = initial(c.RPD_type) - -/datum/pipe_info/pipe/Params() - return "makepipe=[id]&type=[dirtype]" - -/datum/pipe_info/meter - icon_state = "meter" - dirtype = PIPE_ONEDIR - -/datum/pipe_info/meter/New(label) - name = label - -/datum/pipe_info/meter/Params() - return "makemeter=[id]&type=[dirtype]" - -/datum/pipe_info/disposal/New(label, obj/path, dt=PIPE_UNARY) - name = label - id = path - - icon_state = initial(path.icon_state) - if(ispath(path, /obj/structure/disposalpipe)) - icon_state = "con[icon_state]" - - dirtype = dt - -/datum/pipe_info/disposal/Params() - return "dmake=[id]&type=[dirtype]" - -/datum/pipe_info/transit/New(label, obj/path, dt=PIPE_UNARY) - name = label - id = path - dirtype = dt - icon_state = initial(path.icon_state) - if(dt == PIPE_UNARY_FLIPPABLE) - icon_state = "[icon_state]_preview" - -TYPEINFO_DEF(/obj/item/pipe_dispenser) - default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) - default_materials = list(/datum/material/steel=75000, /datum/material/glass=37500) - -/obj/item/pipe_dispenser - name = "Rapid Pipe Dispenser (RPD)" - desc = "A device used to rapidly pipe things." - icon = 'icons/obj/tools.dmi' - icon_state = "rpd" - worn_icon_state = "RPD" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - flags_1 = CONDUCT_1 - force = 10 - throwforce = 10 - throw_speed = 1 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL - slot_flags = ITEM_SLOT_BELT - resistance_flags = FIRE_PROOF - ///Sparks system used when changing device in the UI - var/datum/effect_system/spark_spread/spark_system - ///Direction of the device we are going to spawn, set up in the UI - var/p_dir = NORTH - ///Initial direction of the smart pipe we are going to spawn, set up in the UI - var/p_init_dir = ALL_CARDINALS - ///Is the device of the flipped type? - var/p_flipped = FALSE - ///Color of the device we are going to spawn - var/paint_color = "green" - ///Speed of building atmos devices - var/atmos_build_speed = 0.5 SECONDS - ///Speed of building disposal devices - var/disposal_build_speed = 0.5 SECONDS - ///Speed of building transit devices - var/transit_build_speed = 0.5 SECONDS - ///Speed of removal of unwrenched devices - var/destroy_speed = 0.5 SECONDS - ///Speed of reprogramming connectable directions of smart pipes - var/reprogram_speed = 0.5 SECONDS - ///Category currently active (Atmos, disposal, transit) - var/category = ATMOS_CATEGORY - ///Piping layer we are going to spawn the atmos device in - var/piping_layer = PIPING_LAYER_DEFAULT - ///Stores the current device to spawn - var/datum/pipe_info/recipe - ///Stores the first atmos device - var/static/datum/pipe_info/first_atmos - ///Stores the first disposal device - var/static/datum/pipe_info/first_disposal - ///Stores the first transit device - var/static/datum/pipe_info/first_transit - ///The modes that are allowed for the RPD - var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE | REPROGRAM_MODE - /// Bitflags for upgrades - var/upgrade_flags - -/obj/item/pipe_dispenser/Initialize(mapload) - . = ..() - spark_system = new - spark_system.set_up(5, 0, src) - spark_system.attach(src) - if(!first_atmos) - first_atmos = GLOB.atmos_pipe_recipes[GLOB.atmos_pipe_recipes[1]][1] - if(!first_disposal) - first_disposal = GLOB.disposal_pipe_recipes[GLOB.disposal_pipe_recipes[1]][1] - if(!first_transit) - first_transit = GLOB.transit_tube_recipes[GLOB.transit_tube_recipes[1]][1] - - recipe = first_atmos - -/obj/item/pipe_dispenser/Destroy() - qdel(spark_system) - spark_system = null - return ..() - -/obj/item/pipe_dispenser/equipped(mob/user, slot, initial) - . = ..() - if(slot == ITEM_SLOT_HANDS) - RegisterSignal(user, COMSIG_MOUSE_SCROLL_ON, PROC_REF(mouse_wheeled)) - else - UnregisterSignal(user,COMSIG_MOUSE_SCROLL_ON) - -/obj/item/pipe_dispenser/unequipped(mob/user, silent) - UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) - return ..() - -/obj/item/pipe_dispenser/cyborg_unequip(mob/user) - UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) - return ..() - -/obj/item/pipe_dispenser/attack_self(mob/user) - ui_interact(user) - -/obj/item/pipe_dispenser/pre_attack(atom/target, mob/user, params) - if(istype(target, /obj/item/rpd_upgrade/unwrench)) - install_upgrade(target, user) - return TRUE - return ..() - -/obj/item/pipe_dispenser/pre_attack_secondary(obj/machinery/atmospherics/target, mob/user, params) - if(!istype(target, /obj/machinery/atmospherics)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(target.pipe_color && target.piping_layer) - paint_color = GLOB.pipe_color_name[target.pipe_color] - piping_layer = target.piping_layer - to_chat(user, span_notice("You change [src] to [paint_color] color and layer [piping_layer] pipes.")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/pipe_dispenser/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/rpd_upgrade)) - install_upgrade(W, user) - return TRUE - return ..() - -/** - * Installs an upgrade into the RPD - * - * Installs an upgrade into the RPD checking if it is already installed - * Arguments: - * * rpd_up - RPD upgrade - * * user - mob that use upgrade on RPD - */ -/obj/item/pipe_dispenser/proc/install_upgrade(obj/item/rpd_upgrade/rpd_up, mob/user) - if(rpd_up.upgrade_flags& upgrade_flags) - to_chat(user, span_warning("[src] has already installed this upgrade!")) - return - upgrade_flags |= rpd_up.upgrade_flags - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - qdel(rpd_up) - -/obj/item/pipe_dispenser/suicide_act(mob/user) - user.visible_message(span_suicide("[user] points the end of the RPD down [user.p_their()] throat and presses a button! It looks like [user.p_theyre()] trying to commit suicide...")) - playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) - playsound(get_turf(user), 'sound/items/deconstruct.ogg', 50, TRUE) - return(BRUTELOSS) - -/obj/item/pipe_dispenser/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/pipes), - ) - -/obj/item/pipe_dispenser/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "RapidPipeDispenser", name) - ui.open() - -/obj/item/pipe_dispenser/ui_static_data(mob/user) - var/list/data = list("paint_colors" = GLOB.pipe_paint_colors) - return data - -/obj/item/pipe_dispenser/ui_data(mob/user) - var/list/data = list( - "category" = category, - "piping_layer" = piping_layer, - "preview_rows" = recipe.get_preview(p_dir), - "categories" = list(), - "selected_color" = paint_color, - "mode" = mode - ) - - var/list/recipes - switch(category) - if(ATMOS_CATEGORY) - recipes = GLOB.atmos_pipe_recipes - if(DISPOSALS_CATEGORY) - recipes = GLOB.disposal_pipe_recipes - if(TRANSIT_CATEGORY) - recipes = GLOB.transit_tube_recipes - for(var/c in recipes) - var/list/cat = recipes[c] - var/list/r = list() - for(var/i in 1 to cat.len) - var/datum/pipe_info/info = cat[i] - r += list(list("pipe_name" = info.name, "pipe_index" = i, "selected" = (info == recipe), "all_layers" = info.all_layers)) - data["categories"] += list(list("cat_name" = c, "recipes" = r)) - - var/list/init_directions = list("north" = FALSE, "south" = FALSE, "east" = FALSE, "west" = FALSE) - for(var/direction in GLOB.cardinals) - if(p_init_dir & direction) - init_directions[dir2text(direction)] = TRUE - data["init_directions"] = init_directions - return data - -/obj/item/pipe_dispenser/ui_act(action, params) - . = ..() - if(.) - return - - if(!usr.canUseTopic(src, USE_CLOSE)) - return - - var/playeffect = TRUE - switch(action) - if("color") - paint_color = params["paint_color"] - if("category") - category = text2num(params["category"]) - switch(category) - if(DISPOSALS_CATEGORY) - recipe = first_disposal - if(ATMOS_CATEGORY) - recipe = first_atmos - if(TRANSIT_CATEGORY) - recipe = first_transit - p_dir = NORTH - playeffect = FALSE - if("piping_layer") - piping_layer = text2num(params["piping_layer"]) - playeffect = FALSE - if("pipe_type") - var/static/list/recipes - if(!recipes) - recipes = GLOB.disposal_pipe_recipes + GLOB.atmos_pipe_recipes + GLOB.transit_tube_recipes - recipe = recipes[params["category"]][text2num(params["pipe_type"])] - p_dir = NORTH - if("setdir") - p_dir = text2dir(params["dir"]) - p_flipped = text2num(params["flipped"]) - playeffect = FALSE - if("mode") - var/n = text2num(params["mode"]) - mode ^= n - if("init_dir_setting") - var/target_dir = p_init_dir ^ text2dir(params["dir_flag"]) - // Refuse to create a smart pipe that can only connect in one direction (it would act weirdly and lack an icon) - if (ISNOTSTUB(target_dir)) - p_init_dir = target_dir - else - to_chat(usr, span_warning("\The [src]'s screen flashes a warning: Can't configure a pipe to only connect in one direction.")) - playeffect = FALSE - if("init_reset") - p_init_dir = ALL_CARDINALS - if(playeffect) - spark_system.start() - playsound(get_turf(src), 'sound/effects/pop.ogg', 50, FALSE) - return TRUE - -/obj/item/pipe_dispenser/pre_attack(atom/A, mob/user) - if(!ISADVANCEDTOOLUSER(user) || istype(A, /turf/open/space/transit)) - return ..() - - var/atom/attack_target = A - - //So that changing the menu settings doesn't affect the pipes already being built. - var/queued_p_type = recipe.id - var/queued_p_dir = p_dir - var/queued_p_flipped = p_flipped - - //Unwrench pipe before we build one over/paint it, but only if we're not already running a do_after on it already to prevent a potential runtime. - if((mode & DESTROY_MODE) && (upgrade_flags & RPD_UPGRADE_UNWRENCH) && istype(attack_target, /obj/machinery/atmospherics) && !(DOING_INTERACTION_WITH_TARGET(user, attack_target))) - attack_target = attack_target.wrench_act(user, src) - if(!isatom(attack_target)) - CRASH("When attempting to call [A.type].wrench_act(), received the following non-atom return value: [attack_target]") - - //make sure what we're clicking is valid for the current category - var/static/list/make_pipe_whitelist - if(!make_pipe_whitelist) - make_pipe_whitelist = typecacheof(list(/obj/structure/lattice, /obj/item/pipe, /obj/structure/window, /obj/structure/grille)) - if(istype(attack_target, /obj/machinery/atmospherics) && mode & BUILD_MODE) - attack_target = get_turf(attack_target) - var/can_make_pipe = (isturf(attack_target) || is_type_in_typecache(attack_target, make_pipe_whitelist)) - - . = TRUE - - if((mode & DESTROY_MODE) && istype(attack_target, /obj/item/pipe) || istype(attack_target, /obj/structure/disposalconstruct) || istype(attack_target, /obj/structure/c_transit_tube) || istype(attack_target, /obj/structure/c_transit_tube_pod) || istype(attack_target, /obj/item/pipe_meter) || istype(attack_target, /obj/structure/disposalpipe/broken)) - to_chat(user, span_notice("You start destroying a pipe...")) - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if(do_after(user, attack_target, destroy_speed)) - activate() - qdel(attack_target) - return - - if(mode & REPROGRAM_MODE) - // If this is a placed smart pipe, try to reprogram it - var/obj/machinery/atmospherics/pipe/smart/S = attack_target - if(istype(S)) - if (S.dir == ALL_CARDINALS) - to_chat(user, span_warning("\The [S] has no unconnected directions!")) - return - var/old_init_dir = S.get_init_directions() - if (old_init_dir == p_init_dir) - to_chat(user, span_warning("\The [S] is already in this configuration!")) - return - // Check for differences in unconnected directions - var/target_differences = (p_init_dir ^ old_init_dir) & ~S.connections - if (!target_differences) - to_chat(user, span_warning("\The [S] is already in this configuration for its unconnected directions!")) - return - - to_chat(user, span_notice("You start reprogramming \the [S]...")) - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if(!do_after(user, S, reprogram_speed)) - return - - // Something else could have changed the target's state while we were waiting in do_after - // Most of the edge cases don't matter, but atmos components being able to have live connections not described by initializable directions sounds like a headache at best and an exploit at worst - - // Double check to make sure that nothing has changed. If anything we were about to change was connected during do_after, abort - if (target_differences & S.connections) - to_chat(user, span_warning("\The [src]'s screen flashes a warning: Can't configure a pipe in a currently connected direction.")) - return - // Grab the current initializable directions, which may differ from old_init_dir if someone else was working on the same pipe at the same time - var/current_init_dir = S.get_init_directions() - // Access p_init_dir directly. The RPD can change target layer and initializable directions (though not pipe type or dir) while working to dispense and connect a component, - // and have it reflected in the final result. Reprogramming should be similarly consistent. - var/new_init_dir = (current_init_dir & ~target_differences) | (p_init_dir & target_differences) - // Don't make a smart pipe with only one connection - if (ISSTUB(new_init_dir)) - to_chat(user, span_warning("\The [src]'s screen flashes a warning: Can't configure a pipe to only connect in one direction.")) - return - S.set_init_directions(new_init_dir) - // We're now reconfigured. - // We can never disconnect from existing connections, but we can connect to previously unconnected directions, and should immediately do so - var/newly_permitted_connections = new_init_dir & ~current_init_dir - if(newly_permitted_connections) - // We're allowed to connect in new directions. Recompute our nodes - // Disconnect from everything that is currently connected - for (var/i in 1 to S.device_type) - // This is basically pipe.nullifyNode, but using it here would create a pitfall for others attempting to - // copy and paste disconnection code for other components. Welcome to the atmospherics subsystem - var/obj/machinery/atmospherics/node = S.nodes[i] - if (!node) - continue - node.disconnect(S) - S.nodes[i] = null - // Get our new connections - S.atmos_init() - // Connect to our new connections - for (var/obj/machinery/atmospherics/O in S.nodes) - O.atmos_init() - O.add_member(src) - SSairmachines.add_to_rebuild_queue(S) - // Finally, update our internal state - update_pipe_icon also updates dir and connections - S.update_pipe_icon() - user.visible_message(span_notice("[user] reprograms the \the [S]."),span_notice("You reprogram \the [S].")) - return - // If this is an unplaced smart pipe, try to reprogram it - var/obj/item/pipe/quaternary/I = attack_target - if(istype(I) && ispath(I.pipe_type, /obj/machinery/atmospherics/pipe/smart)) - // An unplaced pipe never has any existing connections, so just directly assign the new configuration - I.p_init_dir = p_init_dir - I.update() - - if(mode & BUILD_MODE) - switch(category) //if we've gotten this var, the target is valid - if(ATMOS_CATEGORY) //Making pipes - if(!can_make_pipe) - return ..() - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if (recipe.type == /datum/pipe_info/meter) - to_chat(user, span_notice("You start building a meter...")) - if(do_after(user, attack_target, atmos_build_speed)) - activate() - var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(get_turf(attack_target)) - PM.setAttachLayer(piping_layer) - if(mode & WRENCH_MODE) - PM.wrench_act(user, src) - else - if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5)) - to_chat(user, span_notice("You can't build this object on the layer...")) - return ..() - to_chat(user, span_notice("You start building a pipe...")) - if(do_after(user, attack_target, atmos_build_speed)) - if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5))//double check to stop cheaters (and to not waste time waiting for something that can't be placed) - to_chat(user, span_notice("You can't build this object on the layer...")) - return ..() - activate() - var/obj/machinery/atmospherics/path = queued_p_type - var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe - var/obj/item/pipe/pipe_type = new pipe_item_type( - get_turf(attack_target), - queued_p_type, - queued_p_dir, - null, - GLOB.pipe_paint_colors[paint_color], - ispath(queued_p_type, /obj/machinery/atmospherics/pipe/smart) ? p_init_dir : null, - ) - if(queued_p_flipped && istype(pipe_type, /obj/item/pipe/trinary/flippable)) - var/obj/item/pipe/trinary/flippable/F = pipe_type - F.flipped = queued_p_flipped - - pipe_type.update() - pipe_type.add_fingerprint(usr) - pipe_type.set_piping_layer(piping_layer) - if(ispath(queued_p_type, /obj/machinery/atmospherics) && !ispath(queued_p_type, /obj/machinery/atmospherics/pipe/color_adapter)) - pipe_type.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY) - if(mode & WRENCH_MODE) - pipe_type.wrench_act(user, src) - - if(DISPOSALS_CATEGORY) //Making disposals pipes - if(!can_make_pipe) - return ..() - attack_target = get_turf(attack_target) - if(isclosedturf(attack_target)) - to_chat(user, span_warning("[src]'s error light flickers; there's something in the way!")) - return - to_chat(user, span_notice("You start building a disposals pipe...")) - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if(do_after(user, attack_target, disposal_build_speed)) - var/obj/structure/disposalconstruct/C = new (attack_target, queued_p_type, queued_p_dir, queued_p_flipped) - - if(!C.can_place()) - to_chat(user, span_warning("There's not enough room to build that here!")) - qdel(C) - return - - activate() - - C.add_fingerprint(usr) - C.update_appearance() - if(mode & WRENCH_MODE) - C.wrench_act(user, src) - return - - if(TRANSIT_CATEGORY) //Making transit tubes - if(!can_make_pipe) - return ..() - attack_target = get_turf(attack_target) - if(isclosedturf(attack_target)) - to_chat(user, span_warning("[src]'s error light flickers; there's something in the way!")) - return - - var/turf/target_turf = get_turf(attack_target) - if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) - to_chat(user, span_warning("[src]'s error light flickers; there's something in the way!")) - return - - to_chat(user, span_notice("You start building a transit tube...")) - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - if(do_after(user, attack_target, transit_build_speed)) - activate() - if(queued_p_type == /obj/structure/c_transit_tube_pod) - var/obj/structure/c_transit_tube_pod/pod = new /obj/structure/c_transit_tube_pod(attack_target) - pod.add_fingerprint(usr) - if(mode & WRENCH_MODE) - pod.wrench_act(user, src) - - else - var/obj/structure/c_transit_tube/tube = new queued_p_type(attack_target) - tube.setDir(queued_p_dir) - - if(queued_p_flipped) - tube.setDir(turn(queued_p_dir, 45)) - tube.SimpleRotateFlip() - - tube.add_fingerprint(usr) - if(mode & WRENCH_MODE) - tube.wrench_act(user, src) - return - else - return ..() - -/obj/item/pipe_dispenser/proc/activate() - playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, TRUE) - -/obj/item/pipe_dispenser/proc/mouse_wheeled(mob/source, atom/A, delta_x, delta_y, params) - SIGNAL_HANDLER - if(source.incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) - return - - if(delta_y < 0) - piping_layer = min(PIPING_LAYER_MAX, piping_layer + 1) - else if(delta_y > 0) - piping_layer = max(PIPING_LAYER_MIN, piping_layer - 1) - else - return - SStgui.update_uis(src) - to_chat(source, span_notice("You set the layer to [piping_layer].")) - -#undef ATMOS_CATEGORY -#undef DISPOSALS_CATEGORY -#undef TRANSIT_CATEGORY - -#undef BUILD_MODE -#undef DESTROY_MODE -#undef WRENCH_MODE -#undef REPROGRAM_MODE - -/obj/item/rpd_upgrade - name = "RPD advanced design disk" - desc = "It seems to be empty." - icon = 'icons/obj/module.dmi' - icon_state = "datadisk3" - /// Bitflags for upgrades - var/upgrade_flags - -/obj/item/rpd_upgrade/unwrench - desc = "Adds reverse wrench mode to the RPD. Attention, due to budget cuts, the mode is hard linked to the destroy mode control button." - upgrade_flags = RPD_UPGRADE_UNWRENCH diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm deleted file mode 100644 index e6032a932db..00000000000 --- a/code/game/objects/items/RSF.dm +++ /dev/null @@ -1,193 +0,0 @@ -/* -CONTAINS: -RSF - -*/ -///Extracts the related object from an associated list of objects and values, or lists and objects. -#define OBJECT_OR_LIST_ELEMENT(from, input) (islist(input) ? from[input] : input) -TYPEINFO_DEF(/obj/item/rsf) - default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - -/obj/item/rsf - name = "\improper Rapid-Service-Fabricator" - desc = "A device used to rapidly deploy service items." - icon = 'icons/obj/tools.dmi' - icon_state = "rsf" - inhand_icon_state = "rsf" - base_icon_state = "rsf" - ///The icon state to revert to when the tool is empty - var/spent_icon_state = "rsf_empty" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - opacity = FALSE - density = FALSE - anchored = FALSE - item_flags = NOBLUDGEON - ///The current matter count - var/matter = 0 - ///The max amount of matter in the device - var/max_matter = 30 - ///The type of the object we are going to dispense - var/to_dispense - ///The cost of the object we are going to dispense - var/dispense_cost = 0 - w_class = WEIGHT_CLASS_NORMAL - ///An associated list of atoms and charge costs. This can contain a separate list, as long as it's associated item is an object - var/list/cost_by_item = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 20, - /obj/item/paper = 10, - /obj/item/storage/dice = 200, - /obj/item/pen = 50, - /obj/item/clothing/mask/cigarette = 10, - ) - ///An associated list of fuel and it's value - var/list/matter_by_item = list(/obj/item/rcd_ammo = 10,) - ///A list of surfaces that we are allowed to place things on. - var/list/allowed_surfaces = list(/turf/open/floor, /obj/structure/table) - ///The unit of mesure of the matter, for use in text - var/discriptor = "fabrication-units" - ///The verb that describes what we're doing, for use in text - var/action_type = "Dispensing" - ///Holds a copy of world.time from the last time the synth was used. - var/cooldown = 0 - ///How long should the minimum period between this RSF's item dispensings be? - var/cooldowndelay = 0 SECONDS - -/obj/item/rsf/Initialize(mapload) - . = ..() - to_dispense = cost_by_item[1] - dispense_cost = cost_by_item[to_dispense] - -/obj/item/rsf/examine(mob/user) - . = ..() - . += span_notice("It currently holds [matter]/[max_matter] [discriptor].") - -/obj/item/rsf/cyborg - matter = 30 - -/obj/item/rsf/attackby(obj/item/W, mob/user, params) - if(is_type_in_list(W,matter_by_item))//If the thing we got hit by is in our matter list - var/tempMatter = matter_by_item[W.type] + matter - if(tempMatter > max_matter) - to_chat(user, span_warning("\The [src] can't hold any more [discriptor]!")) - return - if(isstack(W)) - var/obj/item/stack/stack = W - stack.use(1) - else - qdel(W) - matter = tempMatter //We add its value - playsound(src.loc, 'sound/machines/click.ogg', 10, TRUE) - to_chat(user, span_notice("\The [src] now holds [matter]/[max_matter] [discriptor].")) - icon_state = base_icon_state//and set the icon state to the base state - else - return ..() - -/obj/item/rsf/attack_self(mob/user) - playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE) - var/target = cost_by_item - var/cost = 0 - //Warning, prepare for bodgecode - while(islist(target))//While target is a list we continue the loop - var/picked = show_radial_menu(user, src, formRadial(target), custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE) - if(!check_menu(user) || picked == null) - return - for(var/emem in target)//Back through target agian - var/atom/test = OBJECT_OR_LIST_ELEMENT(target, emem) - if(picked == initial(test.name))//We try and find the entry that matches the radial selection - cost = target[emem]//We cash the cost - target = emem - break - //If we found a list we start it all again, this time looking through its contents. - //This allows for sublists - to_dispense = target - dispense_cost = cost - // Change mode - -///Forms a radial menu based off an object in a list, or a list's associated object -/obj/item/rsf/proc/formRadial(from) - var/list/radial_list = list() - for(var/meme in from)//We iterate through all of targets entrys - var/atom/temp = OBJECT_OR_LIST_ELEMENT(from, meme) - //We then add their data into the radial menu - radial_list[initial(temp.name)] = image(icon = initial(temp.icon), icon_state = initial(temp.icon_state)) - return radial_list - -/obj/item/rsf/proc/check_menu(mob/user) - if(user.incapacitated() || !user.Adjacent(src)) - return FALSE - return TRUE - -/obj/item/rsf/afterattack(atom/A, mob/user, proximity) - if(cooldown > world.time) - return - . = ..() - if(!proximity || !is_allowed(A)) - return - if(use_matter(dispense_cost, user))//If we can charge that amount of charge, we do so and return true - playsound(loc, 'sound/machines/click.ogg', 10, TRUE) - var/atom/meme = new to_dispense(get_turf(A)) - to_chat(user, span_notice("[action_type] [meme.name]...")) - cooldown = world.time + cooldowndelay - -///A helper proc. checks to see if we can afford the amount of charge that is passed, and if we can docs the charge from our base, and returns TRUE. If we can't we return FALSE -/obj/item/rsf/proc/use_matter(charge, mob/user) - if(iscyborg(user)) - var/mob/living/silicon/robot/R = user - var/end_charge = R.cell.charge - charge - if(end_charge < 0) - to_chat(user, span_warning("You do not have enough power to use [src].")) - icon_state = spent_icon_state - return FALSE - R.cell.charge = end_charge - return TRUE - else - if(matter - 1 < 0) - to_chat(user, span_warning("\The [src] doesn't have enough [discriptor] left.")) - icon_state = spent_icon_state - return FALSE - matter-- - to_chat(user, span_notice("\The [src] now holds [matter]/[max_matter] [discriptor].")) - return TRUE - -///Helper proc that iterates through all the things we are allowed to spawn on, and sees if the passed atom is one of them -/obj/item/rsf/proc/is_allowed(atom/to_check) - for(var/sort in allowed_surfaces) - if(istype(to_check, sort)) - return TRUE - return FALSE - -/obj/item/rsf/cookiesynth - name = "Cookie Synthesizer" - desc = "A self-recharging device used to rapidly deploy cookies." - icon_state = "rcd" - base_icon_state = "rcd" - spent_icon_state = "rcd" - max_matter = 10 - cost_by_item = list(/obj/item/food/cookie = 100) - dispense_cost = 100 - discriptor = "cookie-units" - action_type = "Fabricates" - cooldowndelay = 10 SECONDS - ///Tracks whether or not the cookiesynth is about to print a poisoned cookie - var/toxin = FALSE //This might be better suited to some initialize fuckery, but I don't have a good "poisoned" sprite - -/obj/item/rsf/cookiesynth/emag_act(mob/user) - obj_flags ^= EMAGGED - if(obj_flags & EMAGGED) - to_chat(user, span_warning("You short out [src]'s reagent safety checker!")) - else - to_chat(user, span_warning("You reset [src]'s reagent safety checker!")) - -/obj/item/rsf/cookiesynth/attack_self(mob/user) - var/mob/living/silicon/robot/P = null - if(iscyborg(user)) - P = user - if(((obj_flags & EMAGGED) || (P?.emagged)) && !toxin) - toxin = TRUE - to_dispense = /obj/item/food/cookie/sleepy - to_chat(user, span_alert("Cookie Synthesizer hacked.")) - else - toxin = FALSE - to_dispense = /obj/item/food/cookie - to_chat(user, span_notice("Cookie Synthesizer reset.")) - diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm deleted file mode 100644 index 29376ad1958..00000000000 --- a/code/game/objects/items/airlock_painter.dm +++ /dev/null @@ -1,448 +0,0 @@ -TYPEINFO_DEF(/obj/item/airlock_painter) - default_materials = list(/datum/material/steel=50, /datum/material/glass=50) - -/obj/item/airlock_painter - name = "airlock painter" - desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on an airlock during or after construction to change the paintjob. Alt-Click to remove the ink cartridge." - icon = 'icons/obj/objects.dmi' - icon_state = "airlock_sprayer" - worn_icon_state = "painter" - w_class = WEIGHT_CLASS_SMALL - - - flags_1 = CONDUCT_1 - item_flags = NOBLUDGEON - slot_flags = ITEM_SLOT_BELT - usesound = 'sound/effects/spray2.ogg' - - /// The ink cartridge to pull charges from. - var/obj/item/toner/ink = null - /// The type path to instantiate for the ink cartridge the device initially comes with, eg. /obj/item/toner - var/initial_ink_type = /obj/item/toner - /// Associate list of all paint jobs the airlock painter can apply. The key is the name of the airlock the user will see. The value is the type path of the airlock - var/list/available_paint_jobs = list( - "Public" = /obj/machinery/door/airlock/public, - "Engineering" = /obj/machinery/door/airlock/engineering, - "Atmospherics" = /obj/machinery/door/airlock/atmos, - "Security" = /obj/machinery/door/airlock/security, - "Command" = /obj/machinery/door/airlock/command, - "Medical" = /obj/machinery/door/airlock/medical, - "Research" = /obj/machinery/door/airlock/research, - "Freezer" = /obj/machinery/door/airlock/freezer, - "Science" = /obj/machinery/door/airlock/science, - "Mining" = /obj/machinery/door/airlock/mining, - "Maintenance" = /obj/machinery/door/airlock/maintenance, - "External" = /obj/machinery/door/airlock/external, - "External Maintenance"= /obj/machinery/door/airlock/maintenance/external, - "Virology" = /obj/machinery/door/airlock/virology, - "Standard" = /obj/machinery/door/airlock - ) - -/obj/item/airlock_painter/Initialize(mapload) - . = ..() - ink = new initial_ink_type(src) - -//This proc doesn't just check if the painter can be used, but also uses it. -//Only call this if you are certain that the painter will be used right after this check! -/obj/item/airlock_painter/proc/use_paint(mob/user) - if(can_use(user)) - ink.charges-- - playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE) - return TRUE - else - return FALSE - -//This proc only checks if the painter can be used. -//Call this if you don't want the painter to be used right after this check, for example -//because you're expecting user input. -/obj/item/airlock_painter/proc/can_use(mob/user) - if(!ink) - to_chat(user, span_warning("There is no toner cartridge installed in [src]!")) - return FALSE - else if(ink.charges < 1) - to_chat(user, span_warning("[src] is out of ink!")) - return FALSE - else - return TRUE - -/obj/item/airlock_painter/suicide_act(mob/user) - var/obj/item/organ/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS) - - if(can_use(user) && L) - user.visible_message(span_suicide("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - use(user) - - // Once you've inhaled the toner, you throw up your lungs - // and then die. - - // Find out if there is an open turf in front of us, - // and if not, pick the turf we are standing on. - var/turf/T = get_step(get_turf(src), user.dir) - if(!isopenturf(T)) - T = get_turf(src) - - // they managed to lose their lungs between then and - // now. Good job. - if(!L) - return OXYLOSS - - L.Remove(user) - - // make some colorful reagent, and apply it to the lungs - L.create_reagents(10) - L.reagents.add_reagent(/datum/reagent/colorful_reagent, 10) - L.reagents.expose(L, TOUCH, 1) - - // TODO maybe add some colorful vomit? - - user.visible_message(span_suicide("[user] vomits out [user.p_their()] [L]!")) - playsound(user.loc, 'sound/effects/splat.ogg', 50, TRUE) - - L.forceMove(T) - - return (TOXLOSS|OXYLOSS) - else if(can_use(user) && !L) - user.visible_message(span_suicide("[user] is spraying toner on [user.p_them()]self from [src]! It looks like [user.p_theyre()] trying to commit suicide.")) - user.reagents.add_reagent(/datum/reagent/colorful_reagent, 1) - user.reagents.expose(user, TOUCH, 1) - return TOXLOSS - - else - user.visible_message(span_suicide("[user] is trying to inhale toner from [src]! It might be a suicide attempt if [src] had any toner.")) - return SHAME - - -/obj/item/airlock_painter/examine(mob/user) - . = ..() - if(!ink) - . += span_notice("It doesn't have a toner cartridge installed.") - return - var/ink_level = "high" - if(ink.charges < 1) - ink_level = "empty" - else if((ink.charges/ink.max_charges) <= 0.25) //25% - ink_level = "low" - else if((ink.charges/ink.max_charges) > 1) //Over 100% (admin var edit) - ink_level = "dangerously high" - . += span_notice("Its ink levels look [ink_level].") - - -/obj/item/airlock_painter/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/toner)) - if(ink) - to_chat(user, span_warning("[src] already contains \a [ink]!")) - return - if(!user.transferItemToLoc(W, src)) - return - to_chat(user, span_notice("You install [W] into [src].")) - ink = W - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - else - return ..() - -/obj/item/airlock_painter/AltClick(mob/user) - . = ..() - if(ink) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - ink.forceMove(user.drop_location()) - user.put_in_hands(ink) - to_chat(user, span_notice("You remove [ink] from [src].")) - ink = null - -TYPEINFO_DEF(/obj/item/airlock_painter/decal) - default_materials = list(/datum/material/steel=50, /datum/material/glass=50) - -/obj/item/airlock_painter/decal - name = "decal painter" - desc = "An airlock painter, reprogramed to use a different style of paint in order to apply decals for floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to remove the ink cartridge." - icon = 'icons/obj/objects.dmi' - icon_state = "decal_sprayer" - inhand_icon_state = "decal_sprayer" - initial_ink_type = /obj/item/toner/large - /// The current direction of the decal being printed - var/stored_dir = 2 - /// The current color of the decal being printed. - var/stored_color = "yellow" - /// The current base icon state of the decal being printed. - var/stored_decal = "warningline" - /// The full icon state of the decal being printed. - var/stored_decal_total = "warningline" - /// The type path of the spritesheet being used for the frontend. - var/spritesheet_type = /datum/asset/spritesheet/decals // spritesheet containing previews - /// Does this printer implementation support custom colors? - var/supports_custom_color = FALSE - /// Current custom color - var/stored_custom_color - /// List of color options as list(user-friendly label, color value to return) - var/color_list = list( - list("Yellow", "yellow"), - list("Red", "red"), - list("White", "white"), - ) - /// List of direction options as list(user-friendly label, dir value to return) - var/dir_list = list( - list("North", NORTH), - list("South", SOUTH), - list("East", EAST), - list("West", WEST), - ) - /// List of decal options as list(user-friendly label, icon state base value to return) - var/decal_list = list( - list("Warning Line", "warningline"), - list("Warning Line Corner", "warninglinecorner"), - list("Caution Label", "caution"), - list("Directional Arrows", "arrows"), - list("Stand Clear Label", "stand_clear"), - list("Bot", "bot"), - list("Box", "box"), - list("Box Corner", "box_corners"), - list("Delivery Marker", "delivery"), - list("Warning Box", "warn_full"), - ) - // These decals only have a south sprite. - var/nondirectional_decals = list( - "bot", - "box", - "delivery", - "warn_full", - ) - -/obj/item/airlock_painter/decal/Initialize(mapload) - . = ..() - stored_custom_color = stored_color - -/obj/item/airlock_painter/decal/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity) - to_chat(user, span_notice("You need to get closer!")) - return - - if(isfloorturf(target) && use_paint(user)) - paint_floor(target) - -/** - * Actually add current decal to the floor. - * - * Responsible for actually adding the element to the turf for maximum flexibility.area - * Can be overriden for different decal behaviors. - * Arguments: - * * target - The turf being painted to -*/ -/obj/item/airlock_painter/decal/proc/paint_floor(turf/open/floor/target) - target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, CLEAN_TYPE_PAINT, null) - -/** - * Return the final icon_state for the given decal options - * - * Arguments: - * * decal - the selected decal base icon state - * * color - the selected color - * * dir - the selected dir - */ -/obj/item/airlock_painter/decal/proc/get_decal_path(decal, color, dir) - // Special case due to icon_state names - if(color == "yellow") - color = "" - - return "[decal][color ? "_" : ""][color]" - -/obj/item/airlock_painter/decal/proc/update_decal_path() - stored_decal_total = get_decal_path(stored_decal, stored_color, stored_dir) - -/obj/item/airlock_painter/decal/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "DecalPainter", name) - ui.open() - -/obj/item/airlock_painter/decal/ui_assets(mob/user) - . = ..() - . += get_asset_datum(spritesheet_type) - -/obj/item/airlock_painter/decal/ui_static_data(mob/user) - . = ..() - var/datum/asset/spritesheet/icon_assets = get_asset_datum(spritesheet_type) - - .["icon_prefix"] = "[icon_assets.name]32x32" - .["supports_custom_color"] = supports_custom_color - .["decal_list"] = list() - .["color_list"] = list() - .["dir_list"] = list() - .["nondirectional_decals"] = nondirectional_decals - - for(var/decal in decal_list) - .["decal_list"] += list(list( - "name" = decal[1], - "decal" = decal[2], - )) - for(var/color in color_list) - .["color_list"] += list(list( - "name" = color[1], - "color" = color[2], - )) - for(var/dir in dir_list) - .["dir_list"] += list(list( - "name" = dir[1], - "dir" = dir[2], - )) - -/obj/item/airlock_painter/decal/ui_data(mob/user) - . = ..() - .["current_decal"] = stored_decal - .["current_color"] = stored_color - .["current_dir"] = stored_dir - .["current_custom_color"] = stored_custom_color - -/obj/item/airlock_painter/decal/ui_act(action, list/params) - . = ..() - if(.) - return - - switch(action) - //Lists of decals and designs - if("select decal") - var/selected_decal = params["decal"] - var/selected_dir = text2num(params["dir"]) - stored_decal = selected_decal - stored_dir = selected_dir - if("select color") - var/selected_color = params["color"] - stored_color = selected_color - if("pick custom color") - if(supports_custom_color) - pick_painting_tool_color(usr, stored_custom_color) - update_decal_path() - . = TRUE - -/obj/item/airlock_painter/decal/set_painting_tool_color(chosen_color) - . = ..() - stored_custom_color = chosen_color - stored_color = chosen_color - -/datum/asset/spritesheet/decals - name = "floor_decals" - cross_round_cachable = TRUE - - /// The floor icon used for blend_preview_floor() - var/preview_floor_icon = 'icons/turf/floors.dmi' - /// The floor icon state used for blend_preview_floor() - var/preview_floor_state = "floor" - /// The associated decal painter type to grab decals, colors, etc from. - var/obj/item/airlock_painter/decal/painter_type = /obj/item/airlock_painter/decal - -/** - * Underlay an example floor for preview purposes, and return the new icon. - * - * Arguments: - * * decal - the decal to place over the example floor tile - */ -/datum/asset/spritesheet/decals/proc/blend_preview_floor(icon/decal) - var/icon/final = icon(preview_floor_icon, preview_floor_state) - final.Blend(decal, ICON_OVERLAY) - return final - -/** - * Insert a specific state into the spritesheet. - * - * Arguments: - * * decal - the given decal base state. - * * dir - the given direction. - * * color - the given color. - */ -/datum/asset/spritesheet/decals/proc/insert_state(decal, dir, color) - // Special case due to icon_state names - var/icon_state_color = color == "yellow" ? "" : color - - var/icon/final = blend_preview_floor(icon('icons/turf/decals.dmi', "[decal][icon_state_color ? "_" : ""][icon_state_color]", dir)) - Insert("[decal]_[dir]_[color]", final) - -/datum/asset/spritesheet/decals/create_spritesheets() - // Must actually create because initial(type) doesn't work for /lists for some reason. - var/obj/item/airlock_painter/decal/painter = new painter_type() - - for(var/list/decal in painter.decal_list) - for(var/list/dir in painter.dir_list) - for(var/list/color in painter.color_list) - insert_state(decal[2], dir[2], color[2]) - if(painter.supports_custom_color) - insert_state(decal[2], dir[2], "custom") - - qdel(painter) - -/obj/item/airlock_painter/decal/debug - name = "extreme decal painter" - icon_state = "decal_sprayer_ex" - initial_ink_type = /obj/item/toner/extreme - -/obj/item/airlock_painter/decal/tile - name = "tile sprayer" - desc = "An airlock painter, reprogramed to use a different style of paint in order to spray colors on floor tiles as well, in addition to repainting doors. Decals break when the floor tiles are removed. Alt-Click to change design." - icon_state = "tile_sprayer" - stored_dir = 2 - stored_color = "#D4D4D4" - stored_decal = "tile_corner" - spritesheet_type = /datum/asset/spritesheet/decals/tiles - supports_custom_color = TRUE - color_list = list( - list("White", "#D4D4D4"), - list("Black", "#0e0f0f"), - list("Bar Burgundy", "#791500"), - list("Sec Red", "#DE3A3A"), - list("Cargo Brown", "#A46106"), - list("Engi Yellow", "#EFB341"), - list("Service Green", "#9FED58"), - list("Med Blue", "#52B4E9"), - list("R&D Purple", "#D381C9"), - ) - decal_list = list( - list("Corner", "tile_corner"), - list("Half", "tile_half_contrasted"), - list("Opposing Corners", "tile_opposing_corners"), - list("3 Corners", "tile_anticorner_contrasted"), - list("4 Corners", "tile_fourcorners"), - list("Trimline Corner", "trimline_corner_fill"), - list("Trimline Fill", "trimline_fill"), - list("Trimline Fill L", "trimline_fill__8"), // This is a hack that lives in the spritesheet builder and paint_floor - list("Trimline End", "trimline_end_fill"), - list("Trimline Box", "trimline_box_fill"), - ) - nondirectional_decals = list( - "tile_fourcorners", - "trimline_box_fill", - ) - - /// The alpha value to paint the tiles at. The decal mapping helper creates tile overlays at alpha 110. - var/stored_alpha = 110 - -/obj/item/airlock_painter/decal/tile/paint_floor(turf/open/floor/target) - // Account for 8-sided decals. - var/source_decal = stored_decal - var/source_dir = stored_dir - if(copytext(stored_decal, -3) == "__8") - source_decal = splicetext(stored_decal, -3, 0, "") - source_dir = turn(stored_dir, 45) - - target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', source_decal, source_dir, null, null, stored_alpha, stored_color, null, CLEAN_TYPE_PAINT, null) - -/datum/asset/spritesheet/decals/tiles - name = "floor_tile_decals" - painter_type = /obj/item/airlock_painter/decal/tile - -/datum/asset/spritesheet/decals/tiles/insert_state(decal, dir, color) - // Account for 8-sided decals. - var/source_decal = decal - var/source_dir = dir - if(copytext(decal, -3) == "__8") - source_decal = splicetext(decal, -3, 0, "") - source_dir = turn(dir, 45) - - var/icon/colored_icon = icon('icons/turf/decals.dmi', source_decal, dir=source_dir) - colored_icon.ChangeOpacity(110) - if(color == "custom") - // Do a fun rainbow pattern to stand out while still being static. - colored_icon.Blend(icon('icons/effects/random_spawners.dmi', "rainbow"), ICON_MULTIPLY) - else - colored_icon.Blend(color, ICON_MULTIPLY) - - colored_icon = blend_preview_floor(colored_icon) - Insert("[decal]_[dir]_[replacetext(color, "#", "")]", colored_icon) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 0c9321ab2f1..79cd9293c1a 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -159,8 +159,6 @@ /area/centcom/asteroid, /area/centcom/tdome, /area/centcom/wizard_station, - /area/misc/hilbertshotel, - /area/misc/hilbertshotelstorage ) for (var/type in SPECIALS) if ( istype(A,type) ) @@ -238,10 +236,4 @@ for(var/obj/machinery/atmospherics/components/unary/vent_pump/vent in area) vent.name = replacetext(vent.name,oldtitle,title) - - for(var/obj/machinery/door/door in area) - door.name = replacetext(door.name,oldtitle,title) - - for(var/obj/machinery/firealarm/firepanel in area) - firepanel.name = replacetext(firepanel.name,oldtitle,title) //TODO: much much more. Unnamed airlocks, cameras, etc. diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index b5bbd1c7405..11ec817bc76 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -46,7 +46,6 @@ icon_state = "bluebodybag_folded" unfoldedbag_path = /obj/structure/closet/body_bag/bluespace w_class = WEIGHT_CLASS_SMALL - item_flags = NO_MAT_REDEMPTION /obj/item/bodybag/bluespace/examine(mob/user) . = ..() diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 7ef59e1d176..db3b858f69a 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -167,16 +167,6 @@ greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/auxiliary_base -/obj/item/circuitboard/computer/base_construction - name = "circuit board (Generic Base Construction Console)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/computer/camera_advanced/base_construction - -/obj/item/circuitboard/computer/base_construction/centcom - name = "circuit board (Centcom Base Construction Console)" - greyscale_colors = CIRCUIT_COLOR_ENGINEERING - build_path = /obj/machinery/computer/camera_advanced/base_construction/centcom - /obj/item/circuitboard/computer/comm_monitor name = "Telecommunications Monitor (Computer Board)" greyscale_colors = CIRCUIT_COLOR_ENGINEERING @@ -365,16 +355,6 @@ greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/launchpad -/obj/item/circuitboard/computer/mech_bay_power_console - name = "Mech Bay Power Control Console (Computer Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/mech_bay_power_console - -/obj/item/circuitboard/computer/mecha_control - name = "Exosuit Control Console (Computer Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/mecha - /obj/item/circuitboard/computer/research name = "Research Monitor (Computer Board)" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 90378c08ba7..d54694c6978 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -358,9 +358,6 @@ /obj/item/circuitboard/machine/circuit_imprinter/robotics name = "Circuit Imprinter (Machine Board)" build_path = /obj/machinery/rnd/production/circuit_imprinter/offstation - def_components = list( - /obj/item/disk/data = /obj/item/disk/data/fabricator/imprinter/robotics - ) /obj/item/circuitboard/machine/holopad name = "AI Holopad (Machine Board)" @@ -821,14 +818,6 @@ /obj/item/stock_parts/micro_laser = 1, ) -/obj/item/circuitboard/machine/mech_recharger - name = "Mechbay Recharger (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/mech_bay_recharge_port - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/stock_parts/capacitor = 5) - /obj/item/circuitboard/machine/monkey_recycler name = "Monkey Recycler (Machine Board)" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 8091cc4ab29..2fde96a8a17 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -154,20 +154,6 @@ human_target.update_lips(null) decreaseUses(user) return - else if(istype(target, /obj/structure/window)) - user.visible_message(span_notice("[user] begins to clean \the [target.name] with [src]..."), span_notice("You begin to clean \the [target.name] with [src]...")) - if(do_after(user, target, clean_speedies)) - to_chat(user, span_notice("You clean \the [target.name].")) - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - target.set_opacity(initial(target.opacity)) - var/obj/structure/window/our_window = target - if(our_window.bloodied) - for(var/obj/effect/decal/cleanable/blood/iter_blood in our_window) - our_window.remove_viscontents(iter_blood) - qdel(iter_blood) - our_window.bloodied = FALSE - user.mind?.adjust_experience(/datum/skill/cleaning, CLEAN_SKILL_GENERIC_WASH_XP) - decreaseUses(user) else user.visible_message(span_notice("[user] begins to clean \the [target.name] with [src]..."), span_notice("You begin to clean \the [target.name] with [src]...")) if(do_after(user, target, clean_speedies)) diff --git a/code/game/objects/items/data_disk/fabricator.dm b/code/game/objects/items/data_disk/fabricator.dm index 11a3b9aa17b..ef9ff99da5f 100644 --- a/code/game/objects/items/data_disk/fabricator.dm +++ b/code/game/objects/items/data_disk/fabricator.dm @@ -65,28 +65,3 @@ /obj/item/disk/data/fabricator/imprinter/offstation build_type = AWAY_IMPRINTER | IMPRINTER - -/obj/item/disk/data/fabricator/imprinter/robotics - build_type = AWAY_IMPRINTER | IMPRINTER - -/obj/item/disk/data/fabricator/imprinter/robotics/compile_designs() - . = list( - /datum/design/board/ripley_main, - /datum/design/board/ripley_peri, - /datum/design/board/odysseus_main, - /datum/design/board/odysseus_peri, - /datum/design/board/gygax_main, - /datum/design/board/gygax_peri, - /datum/design/board/gygax_targ, - /datum/design/board/durand_main, - /datum/design/board/durand_peri, - /datum/design/board/durand_targ, - /datum/design/board/honker_main, - /datum/design/board/honker_peri, - /datum/design/board/honker_targ, - /datum/design/board/phazon_main, - /datum/design/board/phazon_peri, - /datum/design/board/phazon_targ, - /datum/design/board/clarke_main, - /datum/design/board/clarke_peri - ) diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm index 7a627d6191f..11d7b4835d4 100644 --- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm +++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm @@ -11,9 +11,7 @@ TYPEINFO_DEF(/obj/item/electroadaptive_pseudocircuit) var/recharging = FALSE var/circuits = 5 //How many circuits the pseudocircuit has left var/static/recycleable_circuits = typecacheof(list( - /obj/item/electronics/firelock, /obj/item/electronics/airalarm, - /obj/item/electronics/firealarm, /obj/item/electronics/apc, ))//A typecache of circuits consumable for material diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm index 57e90c916c1..0e150abfea0 100644 --- a/code/game/objects/items/devices/polycircuit.dm +++ b/code/game/objects/items/devices/polycircuit.dm @@ -7,8 +7,8 @@ max_amount = 8 merge_type = /obj/item/stack/circuit_stack singular_name = "circuit aggregate" - var/circuit_type = /obj/item/electronics/airlock - var/chosen_circuit = "airlock" + var/circuit_type = /obj/item/electronics/airalarm + var/chosen_circuit = "air alarm" /obj/item/stack/circuit_stack/attack_self(mob/user)// Prevents the crafting menu, and tells you how to use it. to_chat(user, span_warning("You can't use [src] by itself, you'll have to try and remove one of these circuits by hand... carefully.")) @@ -29,12 +29,6 @@ if(loc != user) return switch(chosen_circuit) - if("airlock") - circuit_type = /obj/item/electronics/airlock - if("firelock") - circuit_type = /obj/item/electronics/firelock - if("fire alarm") - circuit_type = /obj/item/electronics/firealarm if("air alarm") circuit_type = /obj/item/electronics/airalarm if("APC") diff --git a/code/game/objects/items/emags.dm b/code/game/objects/items/emags.dm index c2f5bc36f7e..41305e47d91 100644 --- a/code/game/objects/items/emags.dm +++ b/code/game/objects/items/emags.dm @@ -14,7 +14,7 @@ inhand_icon_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' - item_flags = NO_MAT_REDEMPTION | NOBLUDGEON + item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_ID worn_icon_state = "emag" var/prox_check = TRUE //If the emag requires you to be in range @@ -55,10 +55,6 @@ . = ..() playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) -/obj/item/card/emag/Initialize(mapload) - . = ..() - type_blacklist = list(typesof(/obj/machinery/door/airlock), typesof(/obj/machinery/door/window/), typesof(/obj/machinery/door/firedoor)) //list of all typepaths that require a specialized emag to hack. - /obj/item/card/emag/attack() return @@ -79,54 +75,6 @@ return FALSE return TRUE -/* - * DOORMAG - */ -/obj/item/card/emag/doorjack - desc = "Commonly known as a \"doorjack\", this device is a specialized cryptographic sequencer specifically designed to override station airlock access codes. Uses self-refilling charges to hack airlocks." - name = "airlock authentication override card" - icon_state = "doorjack" - worn_icon_state = "doorjack" - var/type_whitelist //List of types - var/charges = 3 - var/max_charges = 3 - var/list/charge_timers = list() - var/charge_time = 1800 //three minutes - -/obj/item/card/emag/doorjack/Initialize(mapload) - . = ..() - type_whitelist = list(typesof(/obj/machinery/door/airlock), typesof(/obj/machinery/door/window/), typesof(/obj/machinery/door/firedoor)) //list of all acceptable typepaths that this device can affect - -/obj/item/card/emag/doorjack/proc/use_charge(mob/user) - charges -- - to_chat(user, span_notice("You use [src]. It now has [charges] charge[charges == 1 ? "" : "s"] remaining.")) - charge_timers.Add(addtimer(CALLBACK(src, PROC_REF(recharge)), charge_time, TIMER_STOPPABLE)) - -/obj/item/card/emag/doorjack/proc/recharge(mob/user) - charges = min(charges+1, max_charges) - playsound(src,'sound/machines/twobeep.ogg',10,TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) - charge_timers.Remove(charge_timers[1]) - -/obj/item/card/emag/doorjack/examine(mob/user) - . = ..() - . += span_notice("It has [charges] charges remaining.") - if (length(charge_timers)) - . += "[span_notice("A small display on the back reads:")]" - for (var/i in 1 to length(charge_timers)) - var/timeleft = timeleft(charge_timers[i]) - var/loadingbar = num2loadingbar(timeleft/charge_time) - . += span_notice("CHARGE #[i]: [loadingbar] ([timeleft*0.1]s)") - -/obj/item/card/emag/doorjack/can_emag(atom/target, mob/user) - if (charges <= 0) - to_chat(user, span_warning("[src] is recharging!")) - return FALSE - for (var/list/subtypelist in type_whitelist) - if (target.type in subtypelist) - return TRUE - to_chat(user, span_warning("[src] is unable to interface with this. It only seems to fit into airlock electronics.")) - return FALSE - /* * Battlecruiser Access */ diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 2ac9ab7136e..bfa11b57c95 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -38,15 +38,6 @@ TYPEINFO_DEF(/obj/item/fireaxe) user.visible_message(span_suicide("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!")) return (BRUTELOSS) -/obj/item/fireaxe/afterattack(atom/A, mob/user, proximity) - . = ..() - if(!proximity) - return - if(wielded) //destroys windows and grilles in one hit - if(istype(A, /obj/structure/window) || istype(A, /obj/structure/grille)) - var/obj/structure/W = A - W.atom_destruction("fireaxe") - /* * Bone Axe */ diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index efb63891ac3..b4c7fdf768a 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -28,91 +28,6 @@ color = "#3bbbdb" puzzle_id = "blue" -//*************** -//*****Doors***** -//*************** - -TYPEINFO_DEF(/obj/machinery/door/puzzle) - default_armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) - -/obj/machinery/door/puzzle - name = "locked door" - desc = "This door only opens under certain conditions. It looks virtually indestructable." - icon = 'icons/obj/doors/puzzledoor/default.dmi' - icon_state = "door_closed" - explosion_block = 3 - heat_proof = TRUE - max_integrity = 600 - resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF - damage_deflection = 70 - /// Make sure that the puzzle has the same puzzle_id as the keycard door! - var/puzzle_id = null - /// Message that occurs when the door is opened - var/open_message = "The door beeps, and slides opens." - -//Standard Expressions to make keycard doors basically un-cheeseable -/obj/machinery/door/puzzle/BumpedBy(atom/movable/AM) - return !density && ..() - -/obj/machinery/door/puzzle/emp_act(severity) - return - -/obj/machinery/door/puzzle/ex_act(severity, target) - return FALSE - -/obj/machinery/door/puzzle/try_to_activate_door(mob/user, access_bypass = FALSE, obj/item/attackedby) - if(attackedby) - attackedby.leave_evidence(user, src) - else - add_fingerprint(user) - if(operating) - return - -/obj/machinery/door/puzzle/proc/try_puzzle_open(try_id) - if(puzzle_id && puzzle_id != try_id) - return FALSE - if(!density) - visible_message(span_warning("The door can't seem to be closed.")) - return TRUE - if(open_message) - visible_message(span_notice(open_message)) - open() - return TRUE - -/obj/machinery/door/puzzle/keycard - desc = "This door only opens when a keycard is swiped. It looks virtually indestructable." - -/obj/machinery/door/puzzle/keycard/attackby(obj/item/attacking_item, mob/user, params) - . = ..() - if(!istype(attacking_item, /obj/item/keycard)) - return - var/obj/item/keycard/key = attacking_item - if(!try_puzzle_open(key.puzzle_id)) - to_chat(user, span_notice("[src] buzzes. This must not be the right key.")) - -//Test doors. Gives admins a few doors to use quickly should they so choose for events. -/obj/machinery/door/puzzle/keycard/yellow_required - name = "blue airlock" - desc = "It looks like it requires a yellow keycard." - puzzle_id = "yellow" - -/obj/machinery/door/puzzle/keycard/blue_required - name = "blue airlock" - desc = "It looks like it requires a blue keycard." - puzzle_id = "blue" - -/obj/machinery/door/puzzle/light - desc = "This door only opens when a linked mechanism is powered. It looks virtually indestructable." - -/obj/machinery/door/puzzle/light/Initialize(mapload) - . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED, PROC_REF(check_mechanism)) - -/obj/machinery/door/puzzle/light/proc/check_mechanism(datum/source, try_id) - SIGNAL_HANDLER - - INVOKE_ASYNC(src, PROC_REF(try_puzzle_open), try_id) - //************************* //***Box Pushing Puzzles*** //************************* diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index b61d337b3bb..41e7fcd984a 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -170,7 +170,7 @@ /// Charging mode var/mode = "draw" /// Whitelist of charging machines - var/static/list/charge_machines = typecacheof(list(/obj/machinery/cell_charger, /obj/machinery/recharger, /obj/machinery/recharge_station, /obj/machinery/mech_bay_recharge_port)) + var/static/list/charge_machines = typecacheof(list(/obj/machinery/cell_charger, /obj/machinery/recharger, /obj/machinery/recharge_station)) /// Whitelist of chargable items var/static/list/charge_items = typecacheof(list(/obj/item/stock_parts/cell, /obj/item/gun/energy)) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 02f5097985d..449b1b23e6f 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -27,7 +27,6 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ hitsound = 'sound/weapons/gun/general/grenade_launch.ogg' embedding = list(embed_chance = 50) novariants = TRUE - matter_amount = 2 cost = 250 source = /datum/robot_energy_storage/iron merge_type = /obj/item/stack/rods diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index fb434839bb8..ec28a9c7b77 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -9,7 +9,6 @@ * Glass sheets */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("glass shard", /obj/item/shard, time = 0, on_floor = TRUE), \ new/datum/stack_recipe("glass tile", /obj/item/stack/tile/glass, 1, 4, 20) \ )) @@ -30,7 +29,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/glass) material_type = /datum/material/glass point_value = 1 tableVariant = /obj/structure/table/glass - matter_amount = 4 cost = 500 source = /datum/robot_energy_storage/glass @@ -76,7 +74,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/glass) return ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 20, on_floor = TRUE) \ )) @@ -128,9 +125,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/plasmaglass) * Reinforced glass sheets */ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ - new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \ - null, \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, on_floor = TRUE), \ new/datum/stack_recipe("reinforced glass tile", /obj/item/stack/tile/rglass, 1, 4, 20) \ )) @@ -150,7 +144,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/rglass) merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) point_value = 4 - matter_amount = 6 tableVariant = /obj/structure/table/reinforced/rglass /obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params) @@ -185,7 +178,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/rglass) . += GLOB.reinforced_glass_recipes GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, on_floor = TRUE) \ )) @@ -204,7 +196,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/plasmarglass) merge_type = /obj/item/stack/sheet/plasmarglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10) point_value = 23 - matter_amount = 8 tableVariant = /obj/structure/table/reinforced/plasmarglass /obj/item/stack/sheet/plasmarglass/get_main_recipes() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 5220d194f3a..bb925707fad 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -396,7 +396,6 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 15, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 15, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 20, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20), \ )) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 68bff432bf0..09a0718d487 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -78,28 +78,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ null, \ - new /datum/stack_recipe_list("airlock assemblies", list( \ - new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("hydroponics airlock assembly", /obj/structure/door_assembly/door_assembly_hydro, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - )), \ - null, \ - new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ @@ -111,9 +89,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ null, \ new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2), \ new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2), \ - new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \ new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \ - new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), \ new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ @@ -139,7 +115,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ point_value = 2 tableVariant = /obj/structure/table material_type = /datum/material/steel - matter_amount = 4 cost = 500 source = /datum/robot_energy_storage/iron @@ -170,11 +145,6 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("AI core", /obj/structure/ai_core, 4, time = 50, one_per_turf = TRUE), new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), new/datum/stack_recipe("Large Gas Tank", /obj/structure/tank_frame, 4, time=1 SECONDS, one_per_turf=TRUE), - null, - new /datum/stack_recipe_list("airlock assemblies", list( \ - new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), - new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 50, one_per_turf = 1, on_floor = 1), - )), \ )) TYPEINFO_DEF(/obj/item/stack/sheet/plasteel) @@ -196,7 +166,6 @@ TYPEINFO_DEF(/obj/item/stack/sheet/plasteel) point_value = 23 tableVariant = /obj/structure/table/reinforced material_flags = NONE - matter_amount = 12 /obj/item/stack/sheet/plasteel/get_main_recipes() . = ..() @@ -551,9 +520,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ */ GLOBAL_LIST_INIT(bronze_recipes, list ( \ - new/datum/stack_recipe("directional bronze window", /obj/structure/window/bronze/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ - new/datum/stack_recipe("pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("bronze pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze/seethru, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bronze floor tile", /obj/item/stack/tile/bronze, 1, 4, 20), \ new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/bronze), \ new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/bronze), \ @@ -672,7 +638,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list( . += GLOB.plastic_recipes GLOBAL_LIST_INIT(paperframe_recipes, list( -new /datum/stack_recipe("paper frame separator", /obj/structure/window/paperframe, 2, one_per_turf = TRUE, on_floor = TRUE, time = 10), \ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperframe, 3, one_per_turf = TRUE, on_floor = TRUE, time = 10 ))) /obj/item/stack/sheet/paperframes diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index c455164d65f..f089f80d8fa 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -71,8 +71,6 @@ /// How much this stack reduces blood flow, multiplier var/absorption_rate_modifier = 1 - /// Amount of matter for RCD - var/matter_amount = 0 /// Does this stack require a unique girder in order to make a wall? var/has_unique_girder = FALSE @@ -438,13 +436,6 @@ return FALSE var/turf/dest_turf = get_turf(usr) - // If we're making a window, we have some special snowflake window checks to do. - if(ispath(recipe.result_type, /obj/structure/window)) - var/obj/structure/window/result_path = recipe.result_type - if(!valid_window_location(dest_turf, usr.dir, is_fulltile = initial(result_path.fulltile))) - to_chat(usr, span_warning("The [recipe.title] won't fit here!")) - return FALSE - if(recipe.one_per_turf && (locate(recipe.result_type) in dest_turf)) to_chat(usr, span_warning("There is another [recipe.title] here!")) return FALSE @@ -460,14 +451,8 @@ return FALSE for(var/obj/object in dest_turf) - if(istype(object, /obj/structure/grille)) - continue if(istype(object, /obj/structure/table)) continue - if(istype(object, /obj/structure/window)) - var/obj/structure/window/window_structure = object - if(!window_structure.fulltile) - continue if(object.density || NO_BUILD & object.obj_flags) to_chat(usr, span_warning("There is \a [object.name] here. You can\'t make \a [recipe.title] here!")) return FALSE diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm index e2c234aee7c..66057f296cc 100644 --- a/code/game/objects/items/stacks/tiles/tile_iron.dm +++ b/code/game/objects/items/stacks/tiles/tile_iron.dm @@ -13,7 +13,6 @@ TYPEINFO_DEF(/obj/item/stack/tile/iron) flags_1 = CONDUCT_1 turf_type = /turf/open/floor/iron resistance_flags = FIRE_PROOF - matter_amount = 1 cost = 125 source = /datum/robot_energy_storage/iron merge_type = /obj/item/stack/tile/iron diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 53059cc53de..eab20a1ed98 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -98,7 +98,6 @@ righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' w_class = WEIGHT_CLASS_BULKY resistance_flags = FIRE_PROOF - item_flags = NO_MAT_REDEMPTION TYPEINFO_DEF(/obj/item/storage/backpack/holding) default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 50) @@ -109,7 +108,6 @@ TYPEINFO_DEF(/obj/item/storage/backpack/holding) icon_state = "holdingpack" inhand_icon_state = "holdingpack" resistance_flags = FIRE_PROOF - item_flags = NO_MAT_REDEMPTION /obj/item/storage/backpack/holding/Initialize() . = ..() @@ -642,30 +640,6 @@ TYPEINFO_DEF(/obj/item/storage/backpack/holding) for(var/i in 1 to 9) new /obj/item/ammo_box/magazine/smgm45(src) -/obj/item/storage/backpack/duffelbag/syndie/ammo/mech - desc = "A large duffel bag, packed to the brim with various exosuit ammo." - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents() - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/storage/belt/utility/syndicate(src) - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler - desc = "A large duffel bag, packed to the brim with various exosuit ammo." - -/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents() - new /obj/item/mecha_ammo/lmg(src) - new /obj/item/mecha_ammo/lmg(src) - new /obj/item/mecha_ammo/lmg(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/scattershot(src) - new /obj/item/mecha_ammo/missiles_he(src) - new /obj/item/mecha_ammo/missiles_he(src) - new /obj/item/mecha_ammo/missiles_he(src) - /obj/item/storage/backpack/duffelbag/syndie/c20rbundle desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor." @@ -750,4 +724,3 @@ TYPEINFO_DEF(/obj/item/storage/backpack/holding) desc = "A large duffel bag for holding extra police gear." slowdown = 0 supports_variations_flags = NONE - diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 87f1b90da34..5713b90b49d 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -82,7 +82,6 @@ desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." icon_state = "bluetrashbag" inhand_icon_state = "bluetrashbag" - item_flags = NO_MAT_REDEMPTION /obj/item/storage/bag/trash/bluespace/Initialize() . = ..() diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index b07b299ee7e..97628181a3f 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -55,12 +55,9 @@ atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_total_storage = 21 atom_storage.set_holdable(list( - /obj/item/airlock_painter, /obj/item/analyzer, /obj/item/assembly/signaler, /obj/item/clothing/gloves, - /obj/item/construction/rcd, - /obj/item/construction/rld, /obj/item/crowbar, /obj/item/screwdriver, /obj/item/weldingtool, @@ -80,11 +77,8 @@ /obj/item/forcefield_projector, /obj/item/assembly/signaler, /obj/item/lightreplacer, - /obj/item/construction/rcd, - /obj/item/pipe_dispenser, /obj/item/inducer, /obj/item/plunger, - /obj/item/airlock_painter, /obj/item/paint_sprayer, )) @@ -156,7 +150,6 @@ new /obj/item/crowbar/power(src) new /obj/item/weldingtool/experimental(src) new /obj/item/multitool(src) - new /obj/item/construction/rcd/loaded/upgraded(src) new /obj/item/extinguisher/mini(src) new /obj/item/stack/cable_coil(src) @@ -645,7 +638,6 @@ TYPEINFO_DEF(/obj/item/storage/belt/champion) new /obj/item/gun/magic/wand/resurrection(src) new /obj/item/gun/magic/wand/polymorph(src) new /obj/item/gun/magic/wand/teleport(src) - new /obj/item/gun/magic/wand/door(src) new /obj/item/gun/magic/wand/fireball(src) for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 683ee83975d..27417935e91 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -327,26 +327,6 @@ for(var/i in 1 to 6) new /obj/item/assembly/flash/handheld(src) -/obj/item/storage/box/wall_flash - name = "wall-mounted flash kit" - desc = "This box contains everything necessary to build a wall-mounted flash. WARNING: Flashes can cause serious eye damage, protective eyewear is required." - icon_state = "secbox" - illustration = "flash" - -/obj/item/storage/box/wall_flash/PopulateContents() - var/id = rand(1000, 9999) - // FIXME what if this conflicts with an existing one? - - new /obj/item/wallframe/button(src) - new /obj/item/electronics/airlock(src) - var/obj/item/assembly/control/flasher/remote = new(src) - remote.id = id - var/obj/item/wallframe/flasher/frame = new(src) - frame.id = id - new /obj/item/assembly/flash/handheld(src) - new /obj/item/screwdriver(src) - - /obj/item/storage/box/teargas name = "box of tear gas grenades (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation." @@ -1123,8 +1103,6 @@ /obj/item/modular_computer/tablet/pda=1,\ /obj/item/modular_computer/tablet/preset/advanced=1,\ /obj/item/geiger_counter=1,\ - /obj/item/construction/rcd/combat/admin=1,\ - /obj/item/pipe_dispenser=1,\ /obj/item/card/emag=1,\ /obj/item/stack/spacecash/c1000=50,\ /obj/item/healthanalyzer/advanced=1,\ diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 0a3f3e66f24..5ad9c5a6781 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -152,7 +152,6 @@ new /obj/item/grenade/c4 (src) // 1 tc new /obj/item/grenade/c4 (src) // 1 tc new /obj/item/card/emag(src) // 4 tc - new /obj/item/card/emag/doorjack(src) // 3 tc /obj/item/storage/box/syndicate/bundle_b/PopulateContents() switch (pick_weight(list( diff --git a/code/game/objects/structures/construction_console/construction_actions.dm b/code/game/objects/structures/construction_console/construction_actions.dm deleted file mode 100644 index 18081aee72f..00000000000 --- a/code/game/objects/structures/construction_console/construction_actions.dm +++ /dev/null @@ -1,141 +0,0 @@ -/datum/action/innate/camera_off/base_construction - name = "Log out" - -///Generic construction action for base [construction consoles][/obj/machinery/computer/camera_advanced/base_construction]. -/datum/action/innate/construction - button_icon = 'icons/mob/actions/actions_construction.dmi' - ///Console's eye mob - var/mob/camera/ai_eye/remote/base_construction/remote_eye - ///Console itself - var/obj/machinery/computer/camera_advanced/base_construction/base_console - ///Is this used to build only on the station z level? - var/only_station_z = TRUE - -/datum/action/innate/construction/Activate() - if(!target) - return TRUE - remote_eye = owner.remote_control - base_console = target - -///Sanity check for any construction action that relies on an RCD being in the base console -/datum/action/innate/construction/proc/check_rcd() - //The console must always have an RCD. - if(!base_console.internal_rcd) - CRASH("Base console is somehow missing an internal RCD!") - -///Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction. -/datum/action/innate/construction/proc/check_spot() - var/turf/build_target = get_turf(remote_eye) - var/area/build_area = get_area(build_target) - var/area/area_constraint = base_console.allowed_area - //If the console has no allowed_area var, then we're free to build wherever - if (!area_constraint) - return TRUE - if(!istype(build_area, area_constraint)) - to_chat(owner, span_warning("You can only build within [area_constraint]!")) - return FALSE - if(only_station_z && !is_station_level(build_target.z)) - to_chat(owner, span_warning("[area_constraint] has launched and can no longer be modified.")) - return FALSE - return TRUE - -/datum/action/innate/construction/build - name = "Build" - button_icon_state = "build" - -/datum/action/innate/construction/build/Activate() - if(..()) - return - if(!check_spot()) - return - var/turf/target_turf = get_turf(remote_eye) - var/atom/rcd_target = target_turf - //Find airlocks and other shite - for(var/obj/S in target_turf) - if(LAZYLEN(S.rcd_vals(owner,base_console.internal_rcd))) - rcd_target = S //If we don't break out of this loop we'll get the last placed thing - owner.changeNext_move(CLICK_CD_RANGE) - check_rcd() - base_console.internal_rcd.pre_attack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely! - playsound(target_turf, 'sound/items/deconstruct.ogg', 60, TRUE) - -/datum/action/innate/construction/switch_mode - name = "Switch Mode" - button_icon_state = "builder_mode" - -/datum/action/innate/construction/switch_mode/Activate() - if(..()) - return - var/list/buildlist = list("Walls and Floors" = RCD_FLOORWALL, "Airlocks" = RCD_AIRLOCK, "Deconstruction" = RCD_DECONSTRUCT, "Windows and Grilles" = RCD_WINDOWGRILLE) - var/buildmode = tgui_input_list(owner, "Set construction mode", "Base Console", buildlist) - if(isnull(buildmode)) - return - if(isnull(buildlist[buildmode])) - return - check_rcd() - base_console.internal_rcd.construction_mode = buildlist[buildmode] - to_chat(owner, "Build mode is now [buildmode].") - -/datum/action/innate/construction/airlock_type - name = "Select Airlock Type" - button_icon_state = "airlock_select" - -/datum/action/innate/construction/airlock_type/Activate() - if(..()) - return - check_rcd() - base_console.internal_rcd.change_airlock_setting(owner, remote_eye) - -/datum/action/innate/construction/window_type - name = "Select Window Glass" - button_icon_state = "window_select" - -/datum/action/innate/construction/window_type/Activate() - if(..()) - return - check_rcd() - base_console.internal_rcd.toggle_window_glass(owner) - -///Generic action used with base construction consoles to build anything that can't be built with an RCD -/datum/action/innate/construction/place_structure - name = "Place Generic Structure" - var/obj/structure_path - var/structure_name - var/place_sound - -/datum/action/innate/construction/place_structure/Activate() - if(..()) - return - var/turf/place_turf = get_turf(remote_eye) - if(!base_console.structures[structure_name]) - to_chat(owner, span_warning("[base_console] is out of [structure_name]!")) - return - if(!check_spot()) - return - //Can't place inside a closed turf - if(place_turf.density) - to_chat(owner, span_warning("[structure_name] may only be placed on a floor.")) - return - //Can't place two dense objects inside eachother - if(initial(structure_path.density) && place_turf.is_blocked_turf()) - to_chat(owner, span_warning("Location is obstructed by something. Please clear the location and try again.")) - return - var/obj/placed_structure = new structure_path(place_turf) - base_console.structures[structure_name]-- - var/remaining = base_console.structures[structure_name] - playsound(place_turf, place_sound, 50, TRUE) - after_place(placed_structure, remaining) - -///Proc to handle additional behavior after placing an object -/datum/action/innate/construction/place_structure/proc/after_place() - return - -/datum/action/innate/construction/place_structure/fan - name = "Place Tiny Fan" - button_icon_state = "build_fan" - structure_name = "fans" - structure_path = /obj/structure/fans/tiny - place_sound = 'sound/machines/click.ogg' - -/datum/action/innate/construction/place_structure/fan/after_place(obj/placed_structure, remaining) - to_chat(owner, span_notice("Tiny fan placed. [remaining] fans remaining.")) diff --git a/code/game/objects/structures/construction_console/construction_console.dm b/code/game/objects/structures/construction_console/construction_console.dm deleted file mode 100644 index 62b8bce221c..00000000000 --- a/code/game/objects/structures/construction_console/construction_console.dm +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Camera console used to control a base building drone - * - * Using this console will put the user in control of a [base building drone][/mob/camera/ai_eye/remote/base_construction]. - * The drone will appear somewhere within the allowed_area var, or if no area is specified, at the location of the console.area - * Upon interacting, the user will be granted a set of base building actions that will generally be carried out at the drone's location. - * To create a new base builder system, this class should be the only thing that needs to be subtyped. - * - */ -/obj/machinery/computer/camera_advanced/base_construction - name = "generic base construction console" - desc = "An industrial computer integrated with a camera-assisted rapid construction drone." - networks = list("ss13") - circuit = /obj/item/circuitboard/computer/base_construction - off_action = /datum/action/innate/camera_off/base_construction - jump_action = null - icon_screen = "mining" - icon_keyboard = "rd_key" - light_color = LIGHT_COLOR_PINK - ///Area that the eyeobj will be constrained to. If null, eyeobj will be able to build and move anywhere. - var/area/allowed_area - ///Assoc. list ("structure_name" : count) that keeps track of the number of special structures that can't be built with an RCD, for example, tiny fans or turrets. - var/list/structures = list() - ///Internal RCD. Some construction actions rely on having this. - var/obj/item/construction/rcd/internal/internal_rcd - -/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) - . = ..() - //Populate the actions list with the different action objects that will be granted to console users - populate_actions_list() - //Map spawned consoles will automatically restock their materials - if(mapload) - restock_materials() - -/** - * Fill the construction_actios list with actions - * - * Instantiate each action object that we'll be giving to users of - * this console, and put it in the actions list - */ -/obj/machinery/computer/camera_advanced/base_construction/proc/populate_actions_list() - return - -/** - * Reload materials used by the console - * - * Restocks any materials used by the base construction console. - * This might mean refilling the internal RCD (should it be initialized), or - * giving the structures list default values. - */ -/obj/machinery/computer/camera_advanced/base_construction/proc/restock_materials() - return - -///Find a spawn location for the eyeobj. If no allowed_area is defined, spawn ontop of the console. -/obj/machinery/computer/camera_advanced/base_construction/proc/find_spawn_spot() - if (allowed_area) - return pick(get_area_turfs(allowed_area)) - return get_turf(src) - -/obj/machinery/computer/camera_advanced/base_construction/CreateEye() - var/turf/spawn_spot = find_spawn_spot() - if (!spawn_spot) - return FALSE - eyeobj = new /mob/camera/ai_eye/remote/base_construction(spawn_spot, src) - eyeobj.origin = src - return TRUE - -/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, params) - //If we have an internal RCD, we can refill it by slapping the console with some materials - if(internal_rcd && (istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet))) - internal_rcd.attackby(W, user, params) - else - return ..() - -/obj/machinery/computer/camera_advanced/base_construction/Destroy() - qdel(internal_rcd) - return ..() - -///Go through every action object in the construction_action list (which should be fully initialized by now) and grant it to the user. -/obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) - ..() - //When the eye is in use, make it visible to players so they know when someone is building. - eyeobj.invisibility = 0 - -/obj/machinery/computer/camera_advanced/base_construction/remove_eye_control(mob/living/user) - ..() - //Hide the eye when not in use. - eyeobj.invisibility = INVISIBILITY_MAXIMUM - -/** - * A mob used by [/obj/machinery/computer/camera_advanced/base_construction] for building in specific areas. - * - * Controlled by a user who is using a base construction console. - * The user will be granted a set of building actions by the console, and the actions will be carried out by this mob. - * The mob is constrained to a given area defined by the base construction console. - * - */ -/mob/camera/ai_eye/remote/base_construction - name = "construction holo-drone" - //Allows any curious crew to watch the base after it leaves. (This is safe as the base cannot be modified once it leaves) - move_on_shuttle = TRUE - icon = 'icons/obj/mining.dmi' - icon_state = "construction_drone" - ///Reference to the camera console controlling this drone - var/obj/machinery/computer/camera_advanced/base_construction/linked_console - -/mob/camera/ai_eye/remote/base_construction/Initialize(mapload, obj/machinery/computer/camera_advanced/console_link) - linked_console = console_link - if(!linked_console) - stack_trace("A base consturuction drone was created with no linked console") - return INITIALIZE_HINT_QDEL - return ..() - -/mob/camera/ai_eye/remote/base_construction/setLoc(turf/destination, force_update = FALSE) - var/area/curr_area = get_area(destination) - //Only move if we're in the allowed area. If no allowed area is defined, then we're free to move wherever. - if(!linked_console.allowed_area || istype(curr_area, linked_console.allowed_area)) - return ..() - -/mob/camera/ai_eye/remote/base_construction/relaymove(mob/living/user, direction) - //This camera eye is visible, and as such needs to keep it's dir updated - dir = direction - return ..() - -///[Base console's][/obj/machinery/computer/camera_advanced/base_construction] internal RCD. Has a large material capacity and a fast buildspeed. -/obj/item/construction/rcd/internal - name = "internal RCD" - max_matter = 600 - no_ammo_message = "Internal matter exhausted. Please add additional materials." - delay_mod = 0.5 diff --git a/code/game/objects/structures/construction_console/construction_console_centcom.dm b/code/game/objects/structures/construction_console/construction_console_centcom.dm deleted file mode 100644 index e2acfe351dc..00000000000 --- a/code/game/objects/structures/construction_console/construction_console_centcom.dm +++ /dev/null @@ -1,15 +0,0 @@ -///admin-only base consturctino console subtype for building anywhere! -/obj/machinery/computer/camera_advanced/base_construction/centcom - name = "centcom base construction console" - circuit = /obj/item/circuitboard/computer/base_construction/centcom - -/obj/machinery/computer/camera_advanced/base_construction/centcom/Initialize(mapload) - internal_rcd = new(src) - return ..() - -/obj/machinery/computer/camera_advanced/base_construction/centcom/restock_materials() - internal_rcd.matter = internal_rcd.max_matter - -/obj/machinery/computer/camera_advanced/base_construction/centcom/populate_actions_list() - actions += new /datum/action/innate/construction/switch_mode(src) //Action for switching the RCD's build modes - actions += new /datum/action/innate/construction/build(src) //Action for using the RCD diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 45ee4323e60..093d6bdf62a 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -97,7 +97,6 @@ TYPEINFO_DEF(/obj/structure/closet) /obj/structure/closet/Destroy() QDEL_NULL(door_obj) - QDEL_NULL(electronics) return ..() /obj/structure/closet/update_appearance(updates=ALL) @@ -362,10 +361,6 @@ TYPEINFO_DEF(/obj/structure/closet) if (!(flags_1 & NODECONSTRUCT_1)) if(ispath(material_drop) && material_drop_amount) new material_drop(loc, material_drop_amount) - if (electronics) - var/obj/item/electronics/airlock/electronics_ref = electronics - electronics = null - electronics_ref.forceMove(drop_location()) dump_contents() qdel(src) @@ -423,50 +418,6 @@ TYPEINFO_DEF(/obj/structure/closet) span_hear("You hear welding.")) log_game("[key_name(user)] [welded ? "welded":"unwelded"] closet [src] with [W] at [AREACOORD(src)]") update_appearance() - else if (can_install_electronics && istype(W, /obj/item/electronics/airlock)\ - && !secure && !electronics && !locked && (welded || !can_weld_shut) && !broken) - user.visible_message(span_notice("[user] installs the electronics into the [src]."),\ - span_notice("You start to install electronics into the [src]...")) - if (!do_after(user, src, 4 SECONDS)) - return FALSE - if (electronics || secure) - return FALSE - if (!user.transferItemToLoc(W, src)) - return FALSE - W.moveToNullspace() - to_chat(user, span_notice("You install the electronics.")) - electronics = W - if (electronics.one_access) - req_one_access = electronics.accesses - else - req_access = electronics.accesses - secure = TRUE - update_appearance() - else if (can_install_electronics && W.tool_behaviour == TOOL_SCREWDRIVER\ - && (secure || electronics) && !locked && (welded || !can_weld_shut)) - user.visible_message(span_notice("[user] begins to remove the electronics from the [src]."),\ - span_notice("You begin to remove the electronics from the [src]...")) - var/had_electronics = !!electronics - var/was_secure = secure - if (!do_after(user, src, 4 SECONDS)) - return FALSE - if ((had_electronics && !electronics) || (was_secure && !secure)) - return FALSE - var/obj/item/electronics/airlock/electronics_ref - if (!electronics) - electronics_ref = new /obj/item/electronics/airlock(loc) - gen_access() - if (req_one_access.len) - electronics_ref.one_access = 1 - electronics_ref.accesses = req_one_access - else - electronics_ref.accesses = req_access - else - electronics_ref = electronics - electronics = null - electronics_ref.forceMove(drop_location()) - secure = FALSE - update_appearance() else if(!user.combat_mode) var/item_is_id = W.GetID() if(!item_is_id) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 0c25fdae501..34297f4cd0d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -13,7 +13,6 @@ new /obj/item/areaeditor/blueprints(src) new /obj/item/storage/briefcase/inflatable(src) new /obj/item/assembly/flash/handheld(src) - new /obj/item/pipe_dispenser(src) new /obj/item/circuitboard/machine/fabricator/department/engineering(src) new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/ce(src) @@ -76,7 +75,6 @@ /obj/structure/closet/secure_closet/atmospherics/PopulateContents() ..() new /obj/item/radio/headset/headset_eng(src) - new /obj/item/pipe_dispenser(src) new /obj/item/storage/toolbox/mechanical(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/storage/briefcase/inflatable(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index 2efc6b1a9b3..78f52e849fd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -63,5 +63,3 @@ new /obj/item/stack/sheet/mineral/sandbags(src, 30) new /obj/item/clothing/shoes/magboots(src) new /obj/item/storage/box/metalfoam(src) - for(var/i in 1 to 3) - new /obj/item/rcd_ammo/large(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index dd828bb5630..951cb435906 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -220,17 +220,6 @@ /obj/structure/closet/crate/engineering/electrical icon_state = "engi_e_crate" -/obj/structure/closet/crate/rcd - desc = "A crate for the storage of an RCD." - name = "\improper RCD crate" - icon_state = "engi_crate" - -/obj/structure/closet/crate/rcd/PopulateContents() - ..() - for(var/i in 1 to 4) - new /obj/item/rcd_ammo(src) - new /obj/item/construction/rcd(src) - /obj/structure/closet/crate/science name = "science crate" desc = "A science crate." diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index e8ecfec5e63..6b7d04a0c7a 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -44,15 +44,12 @@ TYPEINFO_DEF(/obj/structure/displaycase) update_appearance() /obj/structure/displaycase/handle_atom_del(atom/A) - if(A == electronics) - electronics = null if(A == showpiece) showpiece = null update_appearance() return ..() /obj/structure/displaycase/Destroy() - QDEL_NULL(electronics) QDEL_NULL(showpiece) QDEL_NULL(alarm_manager) return ..() @@ -102,8 +99,6 @@ TYPEINFO_DEF(/obj/structure/displaycase) /obj/structure/displaycase/proc/trigger_alarm() if(!alert) return - var/area/alarmed = get_area(src) - alarmed.burglaralert(src) alarm_manager.send_alarm(ALARM_BURGLAR) addtimer(CALLBACK(alarm_manager, TYPE_PROC_REF(/datum/alarm_handler, clear_alarm), ALARM_BURGLAR), 1 MINUTES) @@ -233,25 +228,11 @@ TYPEINFO_DEF(/obj/structure/displaycase) new /obj/item/stack/sheet/mineral/wood(get_turf(src), 5) qdel(src) - else if(istype(I, /obj/item/electronics/airlock)) - to_chat(user, span_notice("You start installing the electronics into [src]...")) - I.play_tool_sound(src) - if(do_after(user, src, 30) && user.transferItemToLoc(I,src)) - electronics = I - to_chat(user, span_notice("You install the airlock electronics.")) - else if(istype(I, /obj/item/stock_parts/card_reader)) var/obj/item/stock_parts/card_reader/C = I to_chat(user, span_notice("You start adding [C] to [src]...")) if(do_after(user, src, 20)) - var/obj/structure/displaycase/forsale/sale = new(src.loc) - if(electronics) - electronics.forceMove(sale) - sale.electronics = electronics - if(electronics.one_access) - sale.req_one_access = electronics.accesses - else - sale.req_access = electronics.accesses + new /obj/structure/displaycase/forsale(src.loc) qdel(src) qdel(C) @@ -263,14 +244,7 @@ TYPEINFO_DEF(/obj/structure/displaycase) to_chat(user, span_notice("You start adding [G] to [src]...")) if(do_after(user, src, 20)) G.use(10) - var/obj/structure/displaycase/noalert/display = new(src.loc) - if(electronics) - electronics.forceMove(display) - display.electronics = electronics - if(electronics.one_access) - display.req_one_access = electronics.accesses - else - display.req_access = electronics.accesses + new /obj/structure/displaycase/noalert(src.loc) qdel(src) else return ..() @@ -595,4 +569,3 @@ TYPEINFO_DEF(/obj/structure/displaycase) /obj/structure/displaycase/forsale/kitchen desc = "A display case with an ID-card swiper. Use your ID to purchase the contents. Meant for the bartender and chef." req_one_access = list(ACCESS_KITCHEN, ACCESS_BAR) - diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm deleted file mode 100644 index 8bb86d31275..00000000000 --- a/code/game/objects/structures/door_assembly.dm +++ /dev/null @@ -1,383 +0,0 @@ -TYPEINFO_DEF(/obj/structure/door_assembly) - default_armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 90, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 80, ACID = 70) - -/obj/structure/door_assembly - name = "airlock assembly" - icon = 'icons/obj/doors/airlocks/station/airlock.dmi' - icon_state = "construction" - anchored = FALSE - density = TRUE - - max_integrity = 120 - - var/state = AIRLOCK_ASSEMBLY_NEEDS_WIRES - var/base_name = "airlock" - var/mineral = null - var/obj/item/electronics/airlock/electronics = null - var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed - var/glass_type = /obj/machinery/door/airlock/glass - var/glass = 0 // 0 = glass can be installed. 1 = glass is already installed. - var/created_name = null - var/heat_proof_finished = 0 //whether to heat-proof the finished airlock - var/previous_assembly = /obj/structure/door_assembly - var/noglass = FALSE //airlocks with no glass version, also cannot be modified with sheets - var/material_type = /obj/item/stack/sheet/steel - var/material_amt = 4 - - var/overlays_file - var/stripe_overlays - var/color_overlays - var/glass_fill_overlays - var/airlock_paint - var/stripe_paint - - var/has_fill_overlays = TRUE - -/obj/structure/door_assembly/Initialize() - . = ..() - /// Set overlay and color values from the airlock this assembly is supposed to build - var/obj/machinery/door/airlock/airlock_cast = airlock_type - icon = initial(airlock_cast.icon) - overlays_file = initial(airlock_cast.overlays_file) - stripe_overlays = initial(airlock_cast.stripe_overlays) - color_overlays = initial(airlock_cast.color_overlays) - glass_fill_overlays = initial(airlock_cast.glass_fill_overlays) - airlock_paint = initial(airlock_cast.airlock_paint) - stripe_paint = initial(airlock_cast.stripe_paint) - has_fill_overlays = initial(airlock_cast.has_fill_overlays) - - update_appearance() - - AddComponent(/datum/component/simple_rotation) - -/obj/structure/door_assembly/examine(mob/user) - . = ..() - var/doorname = "" - if(created_name) - doorname = ", written on it is '[created_name]'" - switch(state) - if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) - if(anchored) - . += span_notice("The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring.") - else - . += span_notice("The assembly is welded together, but the anchoring bolts are unwrenched.") - if(AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) - . += span_notice("The maintenance panel is wired, but the circuit slot is empty.") - if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) - . += span_notice("The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open.") - if(!mineral && !glass && !noglass) - . += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers.") - else if(!mineral && glass && !noglass) - . += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers.") - else if(mineral && !glass && !noglass) - . += span_notice("There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows.") - else - . += span_notice("There is a small paper placard on the assembly[doorname].") - -/obj/structure/door_assembly/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/pen)) - var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t - - else if((W.tool_behaviour == TOOL_WELDER) && (mineral || glass || !anchored )) - if(!W.tool_start_check(user, amount=0)) - return - - if(mineral) - var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") - user.visible_message(span_notice("[user] welds the [mineral] plating off the airlock assembly."), span_notice("You start to weld the [mineral] plating off the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=50)) - to_chat(user, span_notice("You weld the [mineral] plating off.")) - new mineral_path(loc, 2) - var/obj/structure/door_assembly/PA = new previous_assembly(loc) - transfer_assembly_vars(src, PA) - - else if(glass) - user.visible_message(span_notice("[user] welds the glass panel out of the airlock assembly."), span_notice("You start to weld the glass panel out of the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=50)) - to_chat(user, span_notice("You weld the glass panel out.")) - if(heat_proof_finished) - new /obj/item/stack/sheet/rglass(get_turf(src)) - heat_proof_finished = 0 - else - new /obj/item/stack/sheet/glass(get_turf(src)) - glass = 0 - else if(!anchored) - user.visible_message(span_warning("[user] disassembles the airlock assembly."), \ - span_notice("You start to disassemble the airlock assembly...")) - if(W.use_tool(src, user, 40, volume=50)) - to_chat(user, span_notice("You disassemble the airlock assembly.")) - deconstruct(TRUE) - - else if(W.tool_behaviour == TOOL_WRENCH) - if(!anchored ) - var/door_check = 1 - for(var/obj/machinery/door/D in loc) - if(!D.sub_door) - door_check = 0 - break - - if(door_check) - user.visible_message(span_notice("[user] secures the airlock assembly to the floor."), \ - span_notice("You start to secure the airlock assembly to the floor..."), \ - span_hear("You hear wrenching.")) - - if(W.use_tool(src, user, 40, volume=100)) - if(anchored) - return - to_chat(user, span_notice("You secure the airlock assembly.")) - name = "secured airlock assembly" - set_anchored(TRUE) - else - to_chat(user, "There is another door here!") - - else - user.visible_message(span_notice("[user] unsecures the airlock assembly from the floor."), \ - span_notice("You start to unsecure the airlock assembly from the floor..."), \ - span_hear("You hear wrenching.")) - if(W.use_tool(src, user, 40, volume=100)) - if(!anchored) - return - to_chat(user, span_notice("You unsecure the airlock assembly.")) - name = "airlock assembly" - set_anchored(FALSE) - - else if(istype(W, /obj/item/stack/cable_coil) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored ) - if(!W.tool_start_check(user, amount=1)) - return - - user.visible_message(span_notice("[user] wires the airlock assembly."), \ - span_notice("You start to wire the airlock assembly...")) - if(W.use_tool(src, user, 40, amount=1)) - if(state != AIRLOCK_ASSEMBLY_NEEDS_WIRES) - return - state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS - to_chat(user, span_notice("You wire the airlock assembly.")) - name = "wired airlock assembly" - - else if((W.tool_behaviour == TOOL_WIRECUTTER) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - user.visible_message(span_notice("[user] cuts the wires from the airlock assembly."), \ - span_notice("You start to cut the wires from the airlock assembly...")) - - if(W.use_tool(src, user, 40, volume=100)) - if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) - return - to_chat(user, span_notice("You cut the wires from the airlock assembly.")) - new/obj/item/stack/cable_coil(get_turf(user), 1) - state = AIRLOCK_ASSEMBLY_NEEDS_WIRES - name = "secured airlock assembly" - - else if(istype(W, /obj/item/electronics/airlock) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - W.play_tool_sound(src, 100) - user.visible_message(span_notice("[user] installs the electronics into the airlock assembly."), \ - span_notice("You start to install electronics into the airlock assembly...")) - if(do_after(user, src, 40, DO_PUBLIC, display = W)) - if( state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - return - if(!user.transferItemToLoc(W, src)) - return - - to_chat(user, span_notice("You install the airlock electronics.")) - state = AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER - name = "near finished airlock assembly" - electronics = W - - - else if((W.tool_behaviour == TOOL_CROWBAR) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) - user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \ - span_notice("You start to remove electronics from the airlock assembly...")) - - if(W.use_tool(src, user, 40, volume=100)) - if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) - return - to_chat(user, span_notice("You remove the airlock electronics.")) - state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS - name = "wired airlock assembly" - var/obj/item/electronics/airlock/ae - if (!electronics) - ae = new/obj/item/electronics/airlock( loc ) - else - ae = electronics - electronics = null - ae.forceMove(src.loc) - - else if(istype(W, /obj/item/stack/sheet) && (!glass || !mineral)) - var/obj/item/stack/sheet/G = W - if(G) - if(G.get_amount() >= 1) - if(!noglass) - if(!glass) - if(istype(G, /obj/item/stack/sheet/rglass) || istype(G, /obj/item/stack/sheet/glass)) - playsound(src, 'sound/items/crowbar.ogg', 100, TRUE) - user.visible_message(span_notice("[user] adds [G.name] to the airlock assembly."), \ - span_notice("You start to install [G.name] into the airlock assembly...")) - if(do_after(user, src, 40, DO_PUBLIC, display = W)) - if(G.get_amount() < 1 || glass) - return - if(G.type == /obj/item/stack/sheet/rglass) - to_chat(user, span_notice("You install [G.name] windows into the airlock assembly.")) - heat_proof_finished = 1 //reinforced glass makes the airlock heat-proof - name = "near finished heat-proofed window airlock assembly" - else - to_chat(user, span_notice("You install regular glass windows into the airlock assembly.")) - name = "near finished window airlock assembly" - G.use(1) - glass = TRUE - to_chat(user, span_warning("You cannot add [G] to [src]!")) - else - to_chat(user, span_warning("You cannot add [G] to [src]!")) - - else if((W.tool_behaviour == TOOL_SCREWDRIVER) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) - user.visible_message(span_notice("[user] finishes the airlock."), \ - span_notice("You start finishing the airlock...")) - - if(W.use_tool(src, user, 40, volume=100)) - if(loc && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) - to_chat(user, span_notice("You finish the airlock.")) - var/obj/machinery/door/airlock/door - if(glass) - door = new glass_type( loc ) - else - door = new airlock_type( loc ) - door.setDir(dir) - door.unres_sides = electronics.unres_sides - //door.req_access = req_access - door.electronics = electronics - door.heat_proof = heat_proof_finished - door.security_level = 0 - if(electronics.one_access) - door.req_one_access = electronics.accesses - else - door.req_access = electronics.accesses - if(created_name) - door.name = created_name - else if(electronics.passed_name) - door.name = sanitize(electronics.passed_name) - else - door.name = base_name - if(electronics.passed_cycle_id) - door.closeOtherId = electronics.passed_cycle_id - door.update_other_id() - door.previous_airlock = previous_assembly - electronics.forceMove(door) - door.update_appearance() - qdel(src) - else - return ..() - - update_appearance() - -/obj/structure/door_assembly/update_overlays() - . = ..() - if(has_fill_overlays) - if(!glass) - . += get_airlock_overlay("fill_construction", icon, TRUE) - else - . += get_airlock_overlay("glass_construction", glass_fill_overlays, TRUE) - - if(airlock_paint && color_overlays) - . += get_airlock_overlay("construction", color_overlays, color = airlock_paint) - if(!glass && has_fill_overlays) - . += get_airlock_overlay("fill_construction", color_overlays, color = airlock_paint) - - if(stripe_paint && stripe_overlays) - . += get_airlock_overlay("construction", stripe_overlays, color = stripe_paint) - if(!glass && has_fill_overlays) - . += get_airlock_overlay("fill_construction", stripe_overlays, color = stripe_paint) - - . += get_airlock_overlay("panelAddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED)_c[state+1]", overlays_file, TRUE) - -/obj/structure/door_assembly/update_name() - name = "" - switch(state) - if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) - if(anchored) - name = "secured " - if(AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) - name = "wired " - if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) - name = "near finished " - name += "[heat_proof_finished ? "heat-proofed " : ""][glass ? "window " : ""][base_name] assembly" - return ..() - -/obj/structure/door_assembly/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -/obj/structure/door_assembly/proc/transfer_assembly_vars(obj/structure/door_assembly/source, obj/structure/door_assembly/target, previous = FALSE) - target.glass = source.glass - target.heat_proof_finished = source.heat_proof_finished - target.created_name = source.created_name - target.state = source.state - target.set_anchored(source.anchored) - if(previous) - target.previous_assembly = source.type - if(electronics) - target.electronics = source.electronics - source.electronics.forceMove(target) - target.update_appearance() - qdel(source) - -/obj/structure/door_assembly/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - var/turf/T = get_turf(src) - if(!disassembled) - material_amt = rand(2,4) - new material_type(T, material_amt) - if(glass) - if(disassembled) - if(heat_proof_finished) - new /obj/item/stack/sheet/rglass(T) - else - new /obj/item/stack/sheet/glass(T) - else - new /obj/item/shard(T) - if(mineral) - var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]") - new mineral_path(T, 2) - qdel(src) - - -/obj/structure/door_assembly/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) - return FALSE - -/obj/structure/door_assembly/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct [src].")) - qdel(src) - return TRUE - return FALSE - -/obj/structure/door_assembly/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - - density = FALSE - var/is_user_adjacent = user.Adjacent(src) - density = TRUE - - if(!is_user_adjacent) - return - - . = TRUE - - if(!do_after(user, src, 5 SECONDS, DO_PUBLIC)) - return - - shimmy_through(user) - -/// Move a mob into our loc. -/obj/structure/door_assembly/proc/shimmy_through(mob/living/user) - set_density(FALSE) - . = user.Move(get_turf(src), get_dir(user, src)) - set_density(TRUE) - - if(.) - user.visible_message(span_notice("[user] shimmies their way through [src].")) diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm deleted file mode 100644 index 9fd51bf1965..00000000000 --- a/code/game/objects/structures/door_assembly_types.dm +++ /dev/null @@ -1,204 +0,0 @@ -/obj/structure/door_assembly/door_assembly_public - name = "public airlock assembly" - glass_type = /obj/machinery/door/airlock/public/glass - airlock_type = /obj/machinery/door/airlock/public - -/obj/structure/door_assembly/door_assembly_com - name = "command airlock assembly" - base_name = "command airlock" - glass_type = /obj/machinery/door/airlock/command/glass - airlock_type = /obj/machinery/door/airlock/command - -/obj/structure/door_assembly/door_assembly_sec - name = "security airlock assembly" - base_name = "security airlock" - glass_type = /obj/machinery/door/airlock/security/glass - airlock_type = /obj/machinery/door/airlock/security - -/obj/structure/door_assembly/door_assembly_eng - name = "engineering airlock assembly" - base_name = "engineering airlock" - glass_type = /obj/machinery/door/airlock/engineering/glass - airlock_type = /obj/machinery/door/airlock/engineering - -/obj/structure/door_assembly/door_assembly_min - name = "mining airlock assembly" - base_name = "mining airlock" - glass_type = /obj/machinery/door/airlock/mining/glass - airlock_type = /obj/machinery/door/airlock/mining - -/obj/structure/door_assembly/door_assembly_atmo - name = "atmospherics airlock assembly" - base_name = "atmospherics airlock" - glass_type = /obj/machinery/door/airlock/atmos/glass - airlock_type = /obj/machinery/door/airlock/atmos - -/obj/structure/door_assembly/door_assembly_research - name = "research airlock assembly" - base_name = "research airlock" - glass_type = /obj/machinery/door/airlock/research/glass - airlock_type = /obj/machinery/door/airlock/research - -/obj/structure/door_assembly/door_assembly_science - name = "science airlock assembly" - base_name = "science airlock" - glass_type = /obj/machinery/door/airlock/science/glass - airlock_type = /obj/machinery/door/airlock/science - -/obj/structure/door_assembly/door_assembly_med - name = "medical airlock assembly" - base_name = "medical airlock" - glass_type = /obj/machinery/door/airlock/medical/glass - airlock_type = /obj/machinery/door/airlock/medical - -/obj/structure/door_assembly/door_assembly_hydro - name = "hydroponics airlock assembly" - base_name = "hydroponics airlock" - glass_type = /obj/machinery/door/airlock/hydroponics/glass - airlock_type = /obj/machinery/door/airlock/hydroponics - -/obj/structure/door_assembly/door_assembly_mai - name = "maintenance airlock assembly" - base_name = "maintenance airlock" - glass_type = /obj/machinery/door/airlock/maintenance/glass - airlock_type = /obj/machinery/door/airlock/maintenance - -/obj/structure/door_assembly/door_assembly_extmai - name = "external maintenance airlock assembly" - base_name = "external maintenance airlock" - glass_type = /obj/machinery/door/airlock/maintenance/external/glass - airlock_type = /obj/machinery/door/airlock/maintenance/external - -/obj/structure/door_assembly/door_assembly_ext - name = "external airlock assembly" - base_name = "external airlock" - glass_type = /obj/machinery/door/airlock/external/glass - airlock_type = /obj/machinery/door/airlock/external - -/obj/structure/door_assembly/door_assembly_fre - name = "freezer airlock assembly" - base_name = "freezer airlock" - airlock_type = /obj/machinery/door/airlock/freezer - noglass = TRUE - -/obj/structure/door_assembly/door_assembly_hatch - name = "airtight hatch assembly" - base_name = "airtight hatch" - airlock_type = /obj/machinery/door/airlock/hatch - noglass = TRUE - -/obj/structure/door_assembly/door_assembly_mhatch - name = "maintenance hatch assembly" - base_name = "maintenance hatch" - airlock_type = /obj/machinery/door/airlock/maintenance_hatch - noglass = TRUE - -/obj/structure/door_assembly/door_assembly_highsecurity - name = "high security airlock assembly" - base_name = "high security airlock" - airlock_type = /obj/machinery/door/airlock/highsecurity - noglass = TRUE - material_type = /obj/item/stack/sheet/plasteel - material_amt = 4 - -/obj/structure/door_assembly/door_assembly_vault - name = "vault door assembly" - base_name = "vault door" - airlock_type = /obj/machinery/door/airlock/vault - noglass = TRUE - material_type = /obj/item/stack/sheet/plasteel - material_amt = 6 - -/obj/structure/door_assembly/door_assembly_shuttle - name = "shuttle airlock assembly" - base_name = "shuttle airlock" - airlock_type = /obj/machinery/door/airlock/shuttle - glass_type = /obj/machinery/door/airlock/shuttle/glass - -/obj/structure/door_assembly/door_assembly_viro - name = "virology airlock assembly" - base_name = "virology airlock" - glass_type = /obj/machinery/door/airlock/virology/glass - airlock_type = /obj/machinery/door/airlock/virology - -/obj/structure/door_assembly/door_assembly_centcom - airlock_type = /obj/machinery/door/airlock/centcom - noglass = TRUE - -/obj/structure/door_assembly/door_assembly_grunge - airlock_type = /obj/machinery/door/airlock/grunge - noglass = TRUE - -/obj/structure/door_assembly/door_assembly_gold - name = "gold airlock assembly" - base_name = "gold airlock" - airlock_type = /obj/machinery/door/airlock/gold - mineral = "gold" - glass_type = /obj/machinery/door/airlock/gold/glass - -/obj/structure/door_assembly/door_assembly_silver - name = "silver airlock assembly" - base_name = "silver airlock" - airlock_type = /obj/machinery/door/airlock/silver - mineral = "silver" - glass_type = /obj/machinery/door/airlock/silver/glass - -/obj/structure/door_assembly/door_assembly_diamond - name = "diamond airlock assembly" - base_name = "diamond airlock" - airlock_type = /obj/machinery/door/airlock/diamond - mineral = "diamond" - glass_type = /obj/machinery/door/airlock/diamond/glass - -/obj/structure/door_assembly/door_assembly_uranium - name = "uranium airlock assembly" - base_name = "uranium airlock" - airlock_type = /obj/machinery/door/airlock/uranium - mineral = "uranium" - glass_type = /obj/machinery/door/airlock/uranium/glass - -/obj/structure/door_assembly/door_assembly_plasma - name = "plasma airlock assembly" - base_name = "plasma airlock" - airlock_type = /obj/machinery/door/airlock/plasma - mineral = "plasma" - glass_type = /obj/machinery/door/airlock/plasma/glass - -/obj/structure/door_assembly/door_assembly_bananium - name = "bananium airlock assembly" - desc = "Honk." - base_name = "bananium airlock" - airlock_type = /obj/machinery/door/airlock/bananium - mineral = "bananium" - glass_type = /obj/machinery/door/airlock/bananium/glass - -/obj/structure/door_assembly/door_assembly_sandstone - name = "sandstone airlock assembly" - base_name = "sandstone airlock" - airlock_type = /obj/machinery/door/airlock/sandstone - mineral = "sandstone" - glass_type = /obj/machinery/door/airlock/sandstone/glass - -/obj/structure/door_assembly/door_assembly_titanium - name = "titanium airlock assembly" - base_name = "shuttle airlock" - glass_type = /obj/machinery/door/airlock/titanium/glass - airlock_type = /obj/machinery/door/airlock/titanium - mineral = "titanium" - -/obj/structure/door_assembly/door_assembly_wood - name = "wooden airlock assembly" - base_name = "wooden airlock" - airlock_type = /obj/machinery/door/airlock/wood - mineral = "wood" - glass_type = /obj/machinery/door/airlock/wood/glass - -/obj/structure/door_assembly/door_assembly_bronze - name = "bronze airlock assembly" - base_name = "bronze airlock" - airlock_type = /obj/machinery/door/airlock/bronze - noglass = TRUE - material_type = /obj/item/stack/sheet/bronze - -/obj/structure/door_assembly/door_assembly_bronze/seethru - airlock_type = /obj/machinery/door/airlock/bronze/seethru diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm deleted file mode 100644 index 79204d4e5f8..00000000000 --- a/code/game/objects/structures/grille.dm +++ /dev/null @@ -1,306 +0,0 @@ -/// Max number of unanchored items that will be moved from a tile when attempting to add a window to a grille. -#define CLEAR_TILE_MOVE_LIMIT 20 - -TYPEINFO_DEF(/obj/structure/grille) - default_armor = list(BLUNT = 50, PUNCTURE = 70, SLASH = 90, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) - -/obj/structure/grille - desc = "A flimsy framework of iron rods." - name = "grille" - icon = 'icons/obj/smooth_structures/grille.dmi' - icon_state = "grille-0" - base_icon_state = "grille" - color = "#545454" - density = TRUE - anchored = TRUE - pass_flags_self = PASSGRILLE - can_atmos_pass = CANPASS_ALWAYS - flags_1 = CONDUCT_1 - //pressure_resistance = 5*ONE_ATMOSPHERE - max_integrity = 50 - integrity_failure = 0.4 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_GRILLE - smoothing_groups_with = SMOOTH_GROUP_GRILLE - var/icon/broken_icon = 'icons/obj/smooth_structures/grille_broken.dmi' - var/rods_type = /obj/item/stack/rods - var/rods_amount = 2 - var/rods_broken = TRUE - -/obj/structure/grille/Initialize(mapload) - . = ..() - become_atmos_sensitive() - -/obj/structure/grille/Destroy() - update_cable_icons_on_turf(get_turf(src)) - lose_atmos_sensitivity() - return ..() - -/obj/structure/grille/update_appearance(updates) - if(QDELETED(src)) - return - . = ..() - -/obj/structure/grille/update_icon_state() - . = ..() - if(broken) - icon = broken_icon - icon_state = "brokengrille" - -/obj/structure/grille/set_smoothed_icon_state(new_junction) - if(broken) - return - return ..() - -/obj/structure/grille/examine(mob/user) - . = ..() - if(anchored) - . += span_notice("It's secured in place with screws. The rods look like they could be cut through.") - if(!anchored) - . += span_notice("The anchoring screws are unscrewed. The rods look like they could be cut through.") - -/obj/structure/grille/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) - if(RCD_WINDOWGRILLE) - var/cost = 8 - var/delay = 2 SECONDS - - if(the_rcd.window_glass == RCD_WINDOW_REINFORCED) - delay = 4 SECONDS - cost = 12 - - return rcd_result_with_memory( - list("mode" = RCD_WINDOWGRILLE, "delay" = delay, "cost" = cost), - get_turf(src), RCD_MEMORY_WINDOWGRILLE, - ) - return FALSE - -/obj/structure/grille/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct the grille.")) - qdel(src) - return TRUE - if(RCD_WINDOWGRILLE) - if(!isturf(loc)) - return FALSE - var/turf/T = loc - - if(repair_grille()) - to_chat(user, span_notice("You rebuild the broken grille.")) - - if(!ispath(the_rcd.window_type, /obj/structure/window)) - CRASH("Invalid window path type in RCD: [the_rcd.window_type]") - var/obj/structure/window/window_path = the_rcd.window_type - if(!valid_window_location(T, user.dir, is_fulltile = initial(window_path.fulltile))) - return FALSE - to_chat(user, span_notice("You construct the window.")) - var/obj/structure/window/WD = new the_rcd.window_type(T, user.dir) - WD.set_anchored(TRUE) - return TRUE - return FALSE - -/obj/structure/grille/BumpedBy(atom/movable/AM) - if(!ismob(AM)) - return - var/mob/M = AM - shock(M, 70, M.get_empty_held_index() ? SHOCK_HANDS : SHOCK_USE_AVG_SIEMENS) - -/obj/structure/grille/attack_animal(mob/user, list/modifiers) - . = ..() - if(!.) - return - if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille - take_damage(rand(5,10), BRUTE, BLUNT, 1) - -/obj/structure/grille/attack_paw(mob/user, list/modifiers) - return attack_hand(user, modifiers) - -/obj/structure/grille/hulk_damage() - return 60 - -/obj/structure/grille/attack_hulk(mob/living/carbon/human/user) - if(shock(user, 70)) - return - . = ..() - -/obj/structure/grille/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src, ATTACK_EFFECT_KICK) - user.visible_message(span_warning("[user] hits [src]."), null, null, COMBAT_MESSAGE_RANGE) - log_combat(user, src, "hit") - if(!shock(user, 70)) - take_damage(rand(5,10), BRUTE, BLUNT, 1) - -/obj/structure/grille/attack_alien(mob/living/user, list/modifiers) - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message(span_warning("[user] mangles [src]."), null, null, COMBAT_MESSAGE_RANGE) - if(!shock(user, 70)) - take_damage(20, BRUTE, BLUNT, 1) - -/obj/structure/grille/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(!. && istype(mover, /obj/projectile)) - return prob(30) - -/obj/structure/grille/CanAStarPass(to_dir, datum/can_pass_info/pass_info) - if(!density) - return TRUE - - if(pass_info.pass_flags & PASSGRILLE) - return TRUE - return FALSE - -/obj/structure/grille/wirecutter_act(mob/living/user, obj/item/tool) - add_fingerprint(user) - if(shock(user, 100)) - return - if(tool.use_tool(src, user, 1 SECONDS, volume=50)) - deconstruct() - return ITEM_INTERACT_SUCCESS - -/obj/structure/grille/screwdriver_act(mob/living/user, obj/item/tool) - if(!isturf(loc) || !anchored) - return FALSE - add_fingerprint(user) - if(shock(user, 90)) - return FALSE - tool.play_tool_sound(src, 100) - set_anchored(!anchored) - user.visible_message(span_notice("[user] [anchored ? "fastens" : "unfastens"] [src]."), \ - span_notice("You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.")) - return ITEM_INTERACT_SUCCESS - -/obj/structure/grille/attackby(obj/item/W, mob/user, params) - user.changeNext_move(CLICK_CD_MELEE) - W.leave_evidence(user, src) - if(istype(W, /obj/item/stack/rods) && broken) - if(shock(user, 90)) - return - var/obj/item/stack/rods/R = W - user.visible_message(span_notice("[user] rebuilds the broken grille."), \ - span_notice("You rebuild the broken grille.")) - repair_grille() - R.use(1) - return TRUE - - else if(istype(W, /obj/item/shard) || !shock(user, 70)) - return ..() - -/obj/structure/grille/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(src, 'sound/effects/grillehit.ogg', 80, TRUE) - else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 80, TRUE) - - -/obj/structure/grille/deconstruct(disassembled = TRUE) - if(!loc) //if already qdel'd somehow, we do nothing - return - if(!(flags_1&NODECONSTRUCT_1)) - var/obj/R = new rods_type(drop_location(), rods_amount) - transfer_fingerprints_to(R) - qdel(src) - ..() - -/obj/structure/grille/atom_break() - . = ..() - if(!broken && !(flags_1 & NODECONSTRUCT_1)) - set_density(FALSE) - atom_integrity = 20 - broken = TRUE - rods_amount = 1 - rods_broken = FALSE - var/obj/R = new rods_type(drop_location(), rods_broken) - if(!QDELING(R)) - transfer_fingerprints_to(R) - smoothing_flags = NONE - update_appearance() - -/obj/structure/grille/proc/repair_grille() - if(broken) - set_density(TRUE) - atom_integrity = max_integrity - broken = FALSE - rods_amount = 2 - rods_broken = TRUE - smoothing_flags = SMOOTH_BITMASK - update_appearance() - return TRUE - return FALSE - -// shock user with probability prb (if all connections & power are working) -// returns 1 if shocked, 0 otherwise - -/obj/structure/grille/proc/shock(mob/user, prb, shock_flags = SHOCK_HANDS) - if(!anchored || broken) // anchored/broken grilles are never connected - return FALSE - if(!prob(prb)) - return FALSE - if(!in_range(src, user))//To prevent TK and mech users from getting shocked - return FALSE - var/turf/T = get_turf(src) - var/obj/structure/cable/C = T.get_cable_node() - if(C) - if(electrocute_mob(user, C, src, 1, TRUE, shock_flags = shock_flags)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(3, 1, src) - s.start() - return TRUE - else - return FALSE - return FALSE - -/obj/structure/grille/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(exposed_temperature > T0C + 1500 && !broken) - take_damage(1, BURN, 0, 0) - -/obj/structure/grille/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(isobj(AM)) - if(prob(50) && anchored && !broken) - var/obj/O = AM - if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time - var/turf/T = get_turf(src) - var/obj/structure/cable/C = T.get_cable_node() - if(C) - playsound(src, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) - tesla_zap(src, 3, C.newavail() * 0.01, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) //Zap for 1/100 of the amount of power. At a million watts in the grid, it will be as powerful as a tesla revolver shot. - C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. - return ..() - -/obj/structure/grille/zap_act(power, zap_flags) - if(!anchored) - return ..() - - var/turf/turfloc = loc - var/obj/structure/cable/C = turfloc.get_cable_node() - if(!C) - return ..() - - zap_flags &= ~ZAP_OBJ_DAMAGE - C.add_avail(power / 7500) - power = power / 7500 - return ..() - -/obj/structure/grille/get_dumping_location() - return null - -/obj/structure/grille/broken // Pre-broken grilles for map placement - density = FALSE - broken = TRUE - rods_amount = 1 - rods_broken = FALSE - -/obj/structure/grille/broken/Initialize(mapload) - . = ..() - take_damage(max_integrity * 0.6) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 359b2bb303a..f6a0e82f147 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -109,18 +109,11 @@ TYPEINFO_DEF(/obj/structure/holosign) /obj/structure/holosign/barrier/atmos/Initialize(mapload) . = ..() - var/turf/local = get_turf(loc) - ADD_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) zas_update_loc() /obj/structure/holosign/barrier/atmos/block_superconductivity() //Didn't used to do this, but it's "normal", and will help ease heat flow transitions with the players. return TRUE -/obj/structure/holosign/barrier/atmos/Destroy() - var/turf/local = get_turf(loc) - REMOVE_TRAIT(local, TRAIT_FIREDOOR_STOP, TRAIT_GENERIC) - return ..() - /obj/structure/holosign/barrier/cyborg name = "Energy Field" desc = "A fragile energy field that blocks movement. Excels at blocking lethal projectiles." diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 5dfb9591c4a..a445e77b3cb 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -58,20 +58,6 @@ TYPEINFO_DEF(/obj/structure/lattice) if(levels == 1 && !istype(src, /obj/structure/lattice/catwalk)) . |= FALL_INTERCEPTED | FALL_NO_MESSAGE | FALL_RETAIN_PULL -/obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) - -/obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - if(passed_mode == RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - var/turf/T = src.loc - if(isspaceturf(T)) - T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - qdel(src) - return TRUE - return FALSE - /obj/structure/lattice/singularity_pull(S, current_size) if(current_size >= STAGE_FOUR) deconstruct() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm deleted file mode 100644 index 66d60069fff..00000000000 --- a/code/game/objects/structures/windoor_assembly.dm +++ /dev/null @@ -1,350 +0,0 @@ -/* Windoor (window door) assembly -Nodrak - * Step 1: Create a windoor out of rglass - * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) - * Step 3: Rotate or Flip the assembly to face and open the way you want - * Step 4: Wrench the assembly in place - * Step 5: Add cables to the assembly - * Step 6: Set access for the door. - * Step 7: Screwdriver the door to complete - */ - - -/obj/structure/windoor_assembly - icon = 'icons/obj/doors/windoor.dmi' - - name = "windoor Assembly" - icon_state = "l_windoor_assembly01" - desc = "A small glass and wire assembly for windoors." - anchored = FALSE - density = FALSE - dir = NORTH - set_dir_on_move = FALSE - - var/obj/item/electronics/airlock/electronics = null - var/created_name = null - - //Vars to help with the icon's name - var/facing = "l" //Does the windoor open to the left or right? - var/secure = FALSE //Whether or not this creates a secure windoor - var/state = "01" //How far the door assembly has progressed - can_atmos_pass = CANPASS_PROC - -/obj/structure/windoor_assembly/Initialize(mapload, loc, set_dir) - . = ..() - if(set_dir) - setDir(set_dir) - zas_update_loc() - - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit), - ) - - AddElement(/datum/element/connect_loc, loc_connections) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) - -/obj/structure/windoor_assembly/Destroy() - set_density(FALSE) - return ..() - -/obj/structure/windoor_assembly/Move() - . = ..() - if(.) - zas_update_loc() - -/obj/structure/windoor_assembly/update_icon_state() - icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" - return ..() - -/obj/structure/windoor_assembly/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - - if(border_dir == dir) - return - - if(istype(mover, /obj/structure/window)) - var/obj/structure/window/moved_window = mover - return valid_window_location(loc, moved_window.dir, is_fulltile = moved_window.fulltile) - - if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) - return valid_window_location(loc, mover.dir, is_fulltile = FALSE) - -/obj/structure/windoor_assembly/zas_canpass(turf/T) - if(QDELETED(src)) - return AIR_ALLOWED - if(get_dir(loc, T) == dir) - return density ? AIR_BLOCKED|ZONE_BLOCKED : ZONE_BLOCKED - else - return ZONE_BLOCKED - -/obj/structure/windoor_assembly/proc/on_exit(datum/source, atom/movable/leaving, direction) - SIGNAL_HANDLER - - if(leaving.movement_type & PHASING) - return - - if(leaving == src) - return // Let's not block ourselves. - - if (leaving.pass_flags & pass_flags_self) - return - - if (direction == dir && density) - leaving.Bump(src) - return COMPONENT_ATOM_BLOCK_EXIT - -/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params) - //I really should have spread this out across more states but thin little windoors are hard to sprite. - W.leave_evidence(user, src) - switch(state) - if("01") - if(W.tool_behaviour == TOOL_WELDER && !anchored) - if(!W.tool_start_check(user, amount=0)) - return - - user.visible_message(span_notice("[user] disassembles the windoor assembly."), - span_notice("You start to disassemble the windoor assembly...")) - - if(W.use_tool(src, user, 40, volume=50)) - to_chat(user, span_notice("You disassemble the windoor assembly.")) - var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) - if (!QDELETED(RG)) - RG.add_fingerprint(user) - if(secure) - var/obj/item/stack/rods/R = new (get_turf(src), 4) - if (!QDELETED(R)) - R.add_fingerprint(user) - qdel(src) - return - - //Wrenching an unsecure assembly anchors it in place. Step 4 complete - if(W.tool_behaviour == TOOL_WRENCH && !anchored) - for(var/obj/machinery/door/window/WD in loc) - if(WD.dir == dir) - to_chat(user, span_warning("There is already a windoor in that location!")) - return - user.visible_message(span_notice("[user] secures the windoor assembly to the floor."), - span_notice("You start to secure the windoor assembly to the floor...")) - - if(W.use_tool(src, user, 40, volume=100)) - if(anchored) - return - for(var/obj/machinery/door/window/WD in loc) - if(WD.dir == dir) - to_chat(user, span_warning("There is already a windoor in that location!")) - return - to_chat(user, span_notice("You secure the windoor assembly.")) - set_anchored(TRUE) - if(secure) - name = "secure anchored windoor assembly" - else - name = "anchored windoor assembly" - - //Unwrenching an unsecure assembly un-anchors it. Step 4 undone - else if(W.tool_behaviour == TOOL_WRENCH && anchored) - user.visible_message(span_notice("[user] unsecures the windoor assembly to the floor."), - span_notice("You start to unsecure the windoor assembly to the floor...")) - - if(W.use_tool(src, user, 40, volume=100)) - if(!anchored) - return - to_chat(user, span_notice("You unsecure the windoor assembly.")) - set_anchored(FALSE) - if(secure) - name = "secure windoor assembly" - else - name = "windoor assembly" - - //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete. - else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) - var/obj/item/stack/sheet/plasteel/P = W - if(P.get_amount() < 2) - to_chat(user, span_warning("You need more plasteel to do this!")) - return - to_chat(user, span_notice("You start to reinforce the windoor with plasteel...")) - - if(do_after(user, src, 40, DO_PUBLIC, display = W)) - if(!src || secure || P.get_amount() < 2) - return - - P.use(2) - to_chat(user, span_notice("You reinforce the windoor.")) - secure = TRUE - if(anchored) - name = "secure anchored windoor assembly" - else - name = "secure windoor assembly" - - //Adding cable to the assembly. Step 5 complete. - else if(istype(W, /obj/item/stack/cable_coil) && anchored) - user.visible_message(span_notice("[user] wires the windoor assembly."), span_notice("You start to wire the windoor assembly...")) - - if(do_after(user, src, 40, DO_PUBLIC, display = W)) - if(!src || !anchored || src.state != "01") - return - var/obj/item/stack/cable_coil/CC = W - if(!CC.use(1)) - to_chat(user, span_warning("You need more cable to do this!")) - return - to_chat(user, span_notice("You wire the windoor.")) - state = "02" - if(secure) - name = "secure wired windoor assembly" - else - name = "wired windoor assembly" - else - return ..() - - if("02") - - //Removing wire from the assembly. Step 5 undone. - if(W.tool_behaviour == TOOL_WIRECUTTER) - user.visible_message(span_notice("[user] cuts the wires from the airlock assembly."), span_notice("You start to cut the wires from airlock assembly...")) - - if(W.use_tool(src, user, 40, volume=100)) - if(state != "02") - return - - to_chat(user, span_notice("You cut the windoor wires.")) - new/obj/item/stack/cable_coil(get_turf(user), 1) - state = "01" - if(secure) - name = "secure anchored windoor assembly" - else - name = "anchored windoor assembly" - - //Adding airlock electronics for access. Step 6 complete. - else if(istype(W, /obj/item/electronics/airlock)) - if(!user.transferItemToLoc(W, src)) - return - W.play_tool_sound(src, 100) - user.visible_message(span_notice("[user] installs the electronics into the airlock assembly."), - span_notice("You start to install electronics into the airlock assembly...")) - - if(do_after(user, src, 40, DO_PUBLIC, display = W)) - if(!src || electronics) - W.forceMove(drop_location()) - return - to_chat(user, span_notice("You install the airlock electronics.")) - name = "near finished windoor assembly" - electronics = W - else - W.forceMove(drop_location()) - - //Screwdriver to remove airlock electronics. Step 6 undone. - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(!electronics) - return - - user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), - span_notice("You start to uninstall electronics from the airlock assembly...")) - - if(W.use_tool(src, user, 40, volume=100) && electronics) - to_chat(user, span_notice("You remove the airlock electronics.")) - name = "wired windoor assembly" - var/obj/item/electronics/airlock/ae - ae = electronics - electronics = null - ae.forceMove(drop_location()) - - else if(istype(W, /obj/item/pen)) - var/t = tgui_input_text(user, "Enter the name for the door", "Windoor Renaming", created_name, MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t - return - - - - //Crowbar to complete the assembly, Step 7 complete. - else if(W.tool_behaviour == TOOL_CROWBAR) - if(!electronics) - to_chat(usr, span_warning("The assembly is missing electronics!")) - return - user << browse(null, "window=windoor_access") - user.visible_message(span_notice("[user] pries the windoor into the frame."), - span_notice("You start prying the windoor into the frame...")) - - if(W.use_tool(src, user, 40, volume=100) && electronics) - - set_density(TRUE) //Shouldn't matter but just incase - to_chat(user, span_notice("You finish the windoor.")) - - if(secure) - var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) - if(facing == "l") - windoor.icon_state = "leftsecureopen" - windoor.base_state = "leftsecure" - else - windoor.icon_state = "rightsecureopen" - windoor.base_state = "rightsecure" - windoor.setDir(dir) - windoor.set_density(FALSE) - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() - - - else - var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) - if(facing == "l") - windoor.icon_state = "leftopen" - windoor.base_state = "left" - else - windoor.icon_state = "rightopen" - windoor.base_state = "right" - windoor.setDir(dir) - windoor.set_density(FALSE) - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() - - - else - return ..() - - //Update to reflect changes(if applicable) - update_appearance() - -/obj/structure/windoor_assembly/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -//Flips the windoor assembly, determines whather the door opens to the left or the right -/obj/structure/windoor_assembly/verb/flip() - set name = "Flip Windoor Assembly" - set category = "Object" - set src in oview(1) - if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)) - return - - if(isliving(usr)) - var/mob/living/L = usr - if(!(L.mobility_flags & MOBILITY_USE)) - return - - if(facing == "l") - to_chat(usr, span_notice("The windoor will now slide to the right.")) - facing = "r" - else - facing = "l" - to_chat(usr, span_notice("The windoor will now slide to the left.")) - - update_appearance() - return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm deleted file mode 100644 index d3f880ff7c6..00000000000 --- a/code/game/objects/structures/window.dm +++ /dev/null @@ -1,953 +0,0 @@ -TYPEINFO_DEF(/obj/structure/window) - default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 20, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) - -/obj/structure/window - name = "window" - desc = "A window." - icon = 'icons/obj/directwindow.dmi' // Swapped out by fulltile windows because they have custom rendering. - icon_state = "window" - density = TRUE - layer = ABOVE_OBJ_LAYER //Just above doors - //pressure_resistance = 4*ONE_ATMOSPHERE - anchored = TRUE //initially is 0 for tile smoothing - flags_1 = ON_BORDER_1 - max_integrity = 25 - can_be_unanchored = TRUE - resistance_flags = ACID_PROOF - can_atmos_pass = CANPASS_PROC - rad_insulation = RAD_VERY_LIGHT_INSULATION - pass_flags_self = PASSGLASS - set_dir_on_move = FALSE - flags_ricochet = RICOCHET_HARD - receive_ricochet_chance_mod = 0.5 - var/list/icon/icons //! The icons used for the window. In order of the window's damage level from destroyed to max durability. - var/state = WINDOW_OUT_OF_FRAME - var/reinf = FALSE - var/heat_resistance = 800 - var/decon_speed = 2 SECONDS - var/wtype = "glass" - var/fulltile = FALSE - var/glass_type = /obj/item/stack/sheet/glass - var/glass_amount = 1 - var/real_explosion_block //ignore this, just use explosion_block - var/break_sound = SFX_SHATTER - var/knock_sound = 'sound/effects/glassknock.ogg' - var/bash_sound = 'sound/effects/glassbash.ogg' - var/hit_sound = 'sound/effects/glasshit.ogg' - /// If some inconsiderate jerk has had their blood spilled on this window, thus making it cleanable - var/bloodied = FALSE - ///Snowflake for fire act damage - var/damage_per_fire_tick = 1 - ///The amount of heat needed to start damaging the window - var/melting_point = T0C + 3000 //See, because some dipass decided to make the station 50% glass, NT opted to infuse all the windows with plasma. - -/obj/structure/window/Initialize(mapload, direct) - . = ..() - if(direct) - setDir(direct) - - if(reinf && anchored) - state = WINDOW_SCREWED_TO_FRAME - - zas_update_loc() - - - if(fulltile) - setDir() - - //windows only block while reinforced and fulltile, so we'll use the proc - real_explosion_block = explosion_block - explosion_block = EXPLOSION_BLOCK_PROC - - flags_1 |= ALLOW_DARK_PAINTS_1 - RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, AfterRotation = CALLBACK(src,PROC_REF(AfterRotation))) - - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit), - ) - - if (flags_1 & ON_BORDER_1) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/window/examine(mob/user) - . = ..() - if(reinf) - if(anchored && state == WINDOW_SCREWED_TO_FRAME) - . += span_notice("The window is bolted to the frame.") - else if(anchored && state == WINDOW_IN_FRAME) - . += span_notice("The window is unbolted but still pried into the frame.") - else if(anchored && state == WINDOW_OUT_OF_FRAME) - . += span_notice("The window is out of the frame, but could be pried in. It is screwed to the floor.") - else if(!anchored) - . += span_notice("The window is unscrewed from the floor, and could be deconstructed by wrenching.") - else - if(anchored) - . += span_notice("The window is screwed to the floor.") - else - . += span_notice("The window is unscrewed from the floor, and could be deconstructed by wrenching.") - -/obj/structure/window/update_integrity(new_value) - . = ..() - update_appearance() - -/obj/structure/window/update_icon(updates) - if(!length(icons)) - return ..() - var/integrity_pct = atom_integrity / max_integrity - icon = icons[MAP(integrity_pct, 0, 1, 1, length(icons))] - return ..() - -/obj/structure/window/disco_flavor(mob/living/carbon/human/user, nearby = FALSE, is_station_level = FALSE) - . = ..() - if(!nearby || !is_station_level) - return - - if(isspaceturf(get_turf(user))) - return - - if(!(locate(/turf/open/space) in get_adjacent_open_turfs(src))) - return - - var/datum/roll_result/result = user.get_examine_result("window_flavor", 13, only_once = TRUE) - if(result?.outcome >= SUCCESS) - result.do_skill_sound(user) - to_chat( - user, - result.create_tooltip("The glass is cold to the touch. Cold eternity beckons you to the other side."), - ) - -/obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) - return FALSE - -/obj/structure/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct the window.")) - qdel(src) - return TRUE - return FALSE - -/obj/structure/window/singularity_pull(S, current_size) - ..() - if(anchored && current_size >= STAGE_TWO) - set_anchored(FALSE) - if(current_size >= STAGE_FIVE) - deconstruct(FALSE) - -/obj/structure/window/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(.) - return - - if(fulltile) - return FALSE - - if(border_dir == dir) - return FALSE - - if(istype(mover, /obj/structure/window)) - var/obj/structure/window/moved_window = mover - return valid_window_location(loc, moved_window.dir, is_fulltile = moved_window.fulltile) - - if(istype(mover, /obj/structure/windoor_assembly) || istype(mover, /obj/machinery/door/window)) - return valid_window_location(loc, mover.dir, is_fulltile = FALSE) - - return TRUE - -/obj/structure/window/proc/knock_on(mob/user) - user?.animate_interact(src, INTERACT_GENERIC) - playsound(src, knock_sound, 100, TRUE) - -/obj/structure/window/proc/on_exit(datum/source, atom/movable/leaving, direction) - SIGNAL_HANDLER - - if(leaving.movement_type & PHASING) - return - - if(leaving == src) - return // Let's not block ourselves. - - if (leaving.pass_flags & pass_flags_self) - return - - if (fulltile) - return - - if(direction == dir && density) - leaving.Bump(src) - return COMPONENT_ATOM_BLOCK_EXIT - -/obj/structure/window/attack_tk(mob/user) - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message(span_notice("Something knocks on [src].")) - log_touch(user) - knock_on() - return COMPONENT_CANCEL_ATTACK_CHAIN - - -/obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) - if(!can_be_reached(user)) - return - . = ..() - -/obj/structure/window/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - if(!can_be_reached(user)) - return - user.changeNext_move(CLICK_CD_MELEE) - - if(!user.combat_mode) - user.visible_message(span_notice("[user] knocks on [src]."), \ - span_notice("You knock on [src].")) - knock_on(user) - else - user.visible_message(span_warning("[user] bashes [src]!"), \ - span_warning("You bash [src]!")) - playsound(src, bash_sound, 100, TRUE) - -/obj/structure/window/attack_paw(mob/user, list/modifiers) - return attack_hand(user, modifiers) - -/obj/structure/window/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) //used by attack_alien, attack_animal, and attack_slime - if(!can_be_reached(user)) - return - ..() - -/obj/structure/window/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) - if(!can_be_reached(user)) - return TRUE //skip the afterattack - add_fingerprint(user) - return ..() - -/obj/structure/window/welder_act(mob/living/user, obj/item/tool) - if(atom_integrity >= max_integrity) - to_chat(user, span_warning("[src] is already in good condition!")) - return ITEM_INTERACT_SUCCESS - if(!tool.tool_start_check(user, amount = 0)) - return FALSE - to_chat(user, span_notice("You begin repairing [src]...")) - if(tool.use_tool(src, user, 4 SECONDS, volume = 50)) - atom_integrity = max_integrity - update_nearby_icons() - to_chat(user, span_notice("You repair [src].")) - return ITEM_INTERACT_SUCCESS - -/obj/structure/window/screwdriver_act(mob/living/user, obj/item/tool) - if((flags_1 & NODECONSTRUCT_1) || (reinf && state >= WINDOW_IN_FRAME)) - return - to_chat(user, span_notice("You begin to [anchored ? "unscrew [src] from":"screw [src] to"] the floor...")) - if(tool.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_anchored), anchored))) - set_anchored(!anchored) - to_chat(user, span_notice("You [anchored ? "fasten [src] to":"unfasten [src] from"] the floor.")) - return ITEM_INTERACT_SUCCESS - -/obj/structure/window/wrench_act(mob/living/user, obj/item/tool) - if(flags_1 & NODECONSTRUCT_1) - return FALSE - if(reinf) - switch(state) - if(WINDOW_IN_FRAME) - to_chat(user, span_notice("You begin to secure the bolts of [src].")) - if(tool.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_anchored), anchored))) - state = WINDOW_SCREWED_TO_FRAME - to_chat(user, span_notice("You secure the bolts of [src].")) - return ITEM_INTERACT_SUCCESS - if(WINDOW_SCREWED_TO_FRAME) - to_chat(user, span_notice("You begin loosen the bolts of [src].")) - if(tool.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_anchored), anchored))) - state = WINDOW_IN_FRAME - to_chat(user, span_notice("You loosen the bolts of [src].")) - return ITEM_INTERACT_SUCCESS - if(!anchored) - to_chat(user, span_notice("You begin to disassemble [src]...")) - if(!tool.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) - return ITEM_INTERACT_SUCCESS - var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount) - if (!QDELETED(G)) - G.add_fingerprint(user) - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - to_chat(user, span_notice("You successfully disassemble [src].")) - qdel(src) - return ITEM_INTERACT_SUCCESS - -/obj/structure/window/crowbar_act(mob/living/user, obj/item/tool) - if(!anchored || !reinf) - return FALSE - if((flags_1 & NODECONSTRUCT_1)) - return FALSE - if(reinf) - switch(state) - if(WINDOW_OUT_OF_FRAME) - to_chat(user, span_notice("You begin to lever [src] into the frame...")) - if(tool.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) - state = WINDOW_IN_FRAME - to_chat(user, span_notice("You pry [src] into the frame.")) - return ITEM_INTERACT_SUCCESS - if(WINDOW_IN_FRAME) - to_chat(user, span_notice("You begin to lever [src] out of the frame...")) - if(tool.use_tool(src, user, decon_speed, volume = 75, extra_checks = CALLBACK(src, PROC_REF(check_state_and_anchored), state, anchored))) - state = WINDOW_OUT_OF_FRAME - to_chat(user, span_notice("You pry [src] out of the frame.")) - return ITEM_INTERACT_SUCCESS - -/obj/structure/window/attackby(obj/item/I, mob/living/user, params) - if(!can_be_reached(user)) - return TRUE //skip the afterattack - - I.leave_evidence(user, src) - - return ..() - -/obj/structure/window/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -/obj/structure/window/set_anchored(anchorvalue) - ..() - zas_update_loc() - update_nearby_icons() - -/obj/structure/window/proc/check_state(checked_state) - if(state == checked_state) - return TRUE - -/obj/structure/window/proc/check_anchored(checked_anchored) - if(anchored == checked_anchored) - return TRUE - -/obj/structure/window/proc/check_state_and_anchored(checked_state, checked_anchored) - return check_state(checked_state) && check_anchored(checked_anchored) - - -/obj/structure/window/proc/can_be_reached(mob/user) - if(fulltile) - return TRUE - var/checking_dir = get_dir(user, src) - if(!(checking_dir & dir)) - return TRUE // Only windows on the other side may be blocked by other things. - checking_dir = REVERSE_DIR(checking_dir) - for(var/obj/blocker in loc) - if(!blocker.CanPass(user, checking_dir)) - return FALSE - return TRUE - - -/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) - var/initial_damage_percentage = get_integrity_percentage() - . = ..() - if(.) //received damage - update_nearby_icons() - if(atom_integrity > 0) - playsound(src, get_sfx(SFX_GLASS_CRACK), 100, TRUE) - var/damage_percentage = get_integrity_percentage() - if (damage_percentage >= 75 && initial_damage_percentage < 75) - visible_message(span_warning("\The [src] looks like it's about to shatter!")) - playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) - else if (damage_percentage >= 50 && initial_damage_percentage < 50) - visible_message(span_warning("\The [src] looks seriously damaged!")) - playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) - else if (damage_percentage >= 25 && initial_damage_percentage < 25) - visible_message(span_warning("Cracks begin to appear in \the [src]!")) - playsound(loc, get_sfx(SFX_GLASS_CRACK), 100, 1) - -/obj/structure/window/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(src, hit_sound, 75, TRUE) - else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) - -/obj/structure/window/ex_act(severity, target) - return ..(min(EXPLODE_DEVASTATE, severity + 1), target) - - -/obj/structure/window/deconstruct(disassembled = TRUE) - if(QDELETED(src)) - return - if(!disassembled) - playsound(src, break_sound, 70, TRUE) - visible_message(span_danger("\The [src] shatters into pieces!"), null, "You hear glass shatter!") - if(!(flags_1 & NODECONSTRUCT_1)) - for(var/obj/item/shard/debris in spawnDebris(drop_location())) - transfer_fingerprints_to(debris) // transfer fingerprints to shards only - qdel(src) - update_nearby_icons() - -/obj/structure/window/proc/spawnDebris(location) - . = list() - . += new /obj/item/shard(location) - . += new /obj/effect/decal/cleanable/glass(location) - if (reinf) - . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) - if (fulltile) - . += new /obj/item/shard(location) - -/obj/structure/window/proc/AfterRotation(mob/user, degrees) - zas_update_loc() - -/obj/structure/window/proc/on_painted(obj/structure/window/source, is_dark_color) - SIGNAL_HANDLER - if (is_dark_color && fulltile) //Opaque directional windows restrict vision even in directions they are not placed in, please don't do this - set_opacity(255) - else - set_opacity(initial(opacity)) - -/obj/structure/window/Destroy() - set_density(FALSE) - update_nearby_icons() - - if(!fulltile) - var/turf/open/T = get_step(src, dir) - if(istype(T)) - SSzas.mark_for_update(T) - - . = ..() - -/obj/structure/window/Move() - var/turf/T = loc - . = ..() - if(.) - T.zas_update_loc() - zas_update_loc() - -/obj/structure/window/zas_canpass(turf/T) - if(QDELETED(src)) - return AIR_ALLOWED - if(!anchored || !density) - return ZONE_BLOCKED - if(!fulltile) - if(get_dir(loc, T) & dir) - return AIR_BLOCKED|ZONE_BLOCKED - else - return AIR_ALLOWED - return AIR_BLOCKED|ZONE_BLOCKED - -//This proc is used to update the icons of nearby windows. -/obj/structure/window/proc/update_nearby_icons() - update_appearance() - QUEUE_SMOOTH_NEIGHBORS(src) - -//merges adjacent full-tile windows into one -/obj/structure/window/update_overlays(updates=ALL) - . = ..() - if(QDELETED(src) || !fulltile) - return - - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) - QUEUE_SMOOTH(src) - - var/ratio = atom_integrity / max_integrity - ratio = CEILING(ratio*4, 1) * 25 - if(ratio > 75) - return - - . += mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1), appearance_flags = RESET_COLOR) - -/obj/structure/window/fire_act(exposed_temperature, exposed_volume, turf/adjacent) - if (exposed_temperature > melting_point) - take_damage(round(exposed_volume / 100), BURN, 0, 0) - -/obj/structure/window/get_dumping_location() - return null - -/obj/structure/window/CanAStarPass(to_dir, datum/can_pass_info/pass_info) - if(!density) - return TRUE - if(fulltile || (dir == to_dir)) - return FALSE - - return TRUE - -/obj/structure/window/GetExplosionBlock() - return reinf && fulltile ? real_explosion_block : 0 - -/obj/structure/window/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) - if (!user.combat_mode || !grab.current_grab.enable_violent_interactions) - return ..() - - var/mob/living/affecting_mob = grab.get_affecting_mob() - if(!istype(affecting_mob)) - if(isitem(victim)) - var/obj/item/I = victim - I.melee_attack_chain(user, src, params) - return TRUE - - - var/def_zone = deprecise_zone(grab.target_zone) - var/obj/item/bodypart/BP = affecting_mob.get_bodypart(def_zone) - if(!BP) - return - - var/blocked = affecting_mob.run_armor_check(def_zone, BLUNT) - if(grab.current_grab.damage_stage < GRAB_NECK) - affecting_mob.visible_message(span_danger("[user] bashes [affecting_mob]'s [BP.plaintext_zone] against \the [src]!")) - switch(def_zone) - if(BODY_ZONE_HEAD, BODY_ZONE_CHEST) - if(prob(50 * ((100 - blocked/100)))) - affecting_mob.Knockdown(4 SECONDS) - if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - if(prob(50 * ((100 - blocked/100)))) - var/side = def_zone == BODY_ZONE_L_ARM ? LEFT_HANDS : RIGHT_HANDS - var/obj/item/I = affecting_mob.get_held_items_for_side(side) - if(I) - affecting_mob.dropItemToGround(I) - affecting_mob.apply_damage(20, BRUTE, def_zone, blocked) - take_damage(10) - qdel(grab) - else - affecting_mob.visible_message(span_danger("[user] crushes [affecting_mob]'s [BP.plaintext_zone] against \the [src]!")) - switch(def_zone) - if(BODY_ZONE_HEAD, BODY_ZONE_CHEST) - affecting_mob.Knockdown(10 SECONDS) - if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - var/side = def_zone == BODY_ZONE_L_ARM ? LEFT_HANDS : RIGHT_HANDS - var/obj/item/I = affecting_mob.get_held_items_for_side(side) - if(I) - affecting_mob.dropItemToGround(I) - - affecting_mob.apply_damage(20, BRUTE, def_zone, blocked) - take_damage(20) - qdel(grab) - - var/obj/effect/decal/cleanable/blood/splatter/over_window/splatter = new(src, null, affecting_mob.get_blood_dna_list()) - add_viscontents(splatter) - bloodied = TRUE - return TRUE - -/obj/structure/window/spawner/east - dir = EAST - -/obj/structure/window/spawner/west - dir = WEST - -/obj/structure/window/spawner/north - dir = NORTH - -/obj/structure/window/unanchored - anchored = FALSE - -TYPEINFO_DEF(/obj/structure/window/reinforced) - default_armor = list(BLUNT = 30, PUNCTURE = 0, SLASH = 40, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 80, ACID = 100) - -/obj/structure/window/reinforced - name = "reinforced window" - desc = "A window that is reinforced with metal rods." - icon_state = "rwindow" - reinf = TRUE - heat_resistance = 1600 - max_integrity = 75 - explosion_block = 1 - damage_deflection = 11 - state = WINDOW_SCREWED_TO_FRAME - glass_type = /obj/item/stack/sheet/rglass - rad_insulation = RAD_HEAVY_INSULATION - receive_ricochet_chance_mod = 1.1 - melting_point = T0C + 4000 - -/obj/structure/window/reinforced/spawner/east - dir = EAST - -/obj/structure/window/reinforced/spawner/west - dir = WEST - -/obj/structure/window/reinforced/spawner/north - dir = NORTH - -/obj/structure/window/reinforced/unanchored - anchored = FALSE - state = WINDOW_OUT_OF_FRAME - -TYPEINFO_DEF(/obj/structure/window/plasma) - default_armor = list(BLUNT = 60, PUNCTURE = 5, SLASH = 40, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, FIRE = 99, ACID = 100) - -/obj/structure/window/plasma - name = "plasma window" - desc = "A window made out of a plasma-silicate alloy. It looks insanely tough to break and burn through." - icon_state = "plasmawindow" - reinf = FALSE - heat_resistance = 25000 - max_integrity = 200 - explosion_block = 1 - glass_type = /obj/item/stack/sheet/plasmaglass - rad_insulation = RAD_NO_INSULATION - melting_point = 25000 //Yeah fuck you - -/obj/structure/window/plasma/Initialize(mapload, direct) - . = ..() - -/obj/structure/window/plasma/spawnDebris(location) - . = list() - . += new /obj/item/shard/plasma(location) - . += new /obj/effect/decal/cleanable/glass/plasma(location) - if (reinf) - . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) - if (fulltile) - . += new /obj/item/shard/plasma(location) - -/obj/structure/window/plasma/spawner/east - dir = EAST - -/obj/structure/window/plasma/spawner/west - dir = WEST - -/obj/structure/window/plasma/spawner/north - dir = NORTH - -/obj/structure/window/plasma/unanchored - anchored = FALSE - -TYPEINFO_DEF(/obj/structure/window/reinforced/plasma) - default_armor = list(BLUNT = 80, PUNCTURE = 20, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, FIRE = 99, ACID = 100) - -/obj/structure/window/reinforced/plasma - name = "reinforced plasma window" - desc = "A window made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough to break and is most likely nigh fireproof." - icon_state = "plasmarwindow" - reinf = TRUE - heat_resistance = 50000 - max_integrity = 500 - damage_deflection = 18 - explosion_block = 2 - glass_type = /obj/item/stack/sheet/plasmarglass - melting_point = 25000 - -/obj/structure/window/reinforced/plasma/block_superconductivity() - return TRUE - -/obj/structure/window/reinforced/plasma/spawner/east - dir = EAST - -/obj/structure/window/reinforced/plasma/spawner/west - dir = WEST - -/obj/structure/window/reinforced/plasma/spawner/north - dir = NORTH - -/obj/structure/window/reinforced/plasma/unanchored - anchored = FALSE - state = WINDOW_OUT_OF_FRAME - -/obj/structure/window/reinforced/tinted - name = "tinted window" - icon_state = "twindow" - opacity = TRUE -/obj/structure/window/reinforced/tinted/frosted - name = "frosted window" - icon_state = "fwindow" - -/* Full Tile Windows (more atom_integrity) */ - -/obj/structure/window/fulltile - icon = 'icons/construction/wall/glass/wall/wall_0.dmi' - icon_state = "wall-0" - base_icon_state = "wall" - color = "#AFD3E6" - alpha = 180 - max_integrity = 50 - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - glass_amount = 2 - icons = list( - 'icons/construction/wall/glass/wall/wall_5.dmi', - 'icons/construction/wall/glass/wall/wall_4.dmi', - 'icons/construction/wall/glass/wall/wall_3.dmi', - 'icons/construction/wall/glass/wall/wall_2.dmi', - 'icons/construction/wall/glass/wall/wall_1.dmi', - 'icons/construction/wall/glass/wall/wall_0.dmi', - ) - - - -/obj/structure/window/fulltile/unanchored - anchored = FALSE - -/obj/structure/window/plasma/fulltile - icon = 'icons/obj/smooth_structures/window.dmi' - icon_state = "window-0" - base_icon_state = "window" - color = "#c162ec" - alpha = 180 - max_integrity = 300 - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - glass_amount = 2 - melting_point = 25000 - -/obj/structure/window/plasma/fulltile/unanchored - anchored = FALSE - -/obj/structure/window/reinforced/plasma/fulltile - icon = 'icons/obj/smooth_structures/window.dmi' - icon_state = "window-0" - base_icon_state = "window" - color = "#c162ec" - alpha = 180 - state = WINDOW_SCREWED_TO_FRAME - max_integrity = 500 - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - glass_amount = 2 - melting_point = 28000 - -/obj/structure/window/reinforced/plasma/fulltile/unanchored - anchored = FALSE - state = WINDOW_OUT_OF_FRAME - -/obj/structure/window/reinforced/fulltile - icon = 'icons/construction/wall/glass_reinforced/wall/wall_0.dmi' - icon_state = "wall-0" - base_icon_state = "wall" - color = "#829eb5" - alpha = 180 - max_integrity = 150 - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - state = WINDOW_SCREWED_TO_FRAME - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - glass_amount = 2 - icons = list( - 'icons/construction/wall/glass_reinforced/wall/wall_5.dmi', - 'icons/construction/wall/glass_reinforced/wall/wall_4.dmi', - 'icons/construction/wall/glass_reinforced/wall/wall_3.dmi', - 'icons/construction/wall/glass_reinforced/wall/wall_2.dmi', - 'icons/construction/wall/glass_reinforced/wall/wall_1.dmi', - 'icons/construction/wall/glass_reinforced/wall/wall_0.dmi', - ) - - -/obj/structure/window/reinforced/fulltile/unanchored - anchored = FALSE - state = WINDOW_OUT_OF_FRAME - -/obj/structure/window/reinforced/tinted/fulltile - icon = 'icons/obj/smooth_structures/window_reinforced.dmi' - icon_state = "wall-0" - base_icon_state = "wall" - color = "#3b5461" - alpha = 180 - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - glass_amount = 2 - -/obj/structure/window/reinforced/fulltile/ice - max_integrity = 150 - glass_amount = 2 - melting_point = T0C - damage_per_fire_tick = 15 - -//there is a sub shuttle window in survival_pod.dm for mining pods -TYPEINFO_DEF(/obj/structure/window/reinforced/shuttle) - default_armor = list(BLUNT = 75, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 80, ACID = 100) - -/obj/structure/window/reinforced/shuttle //this is called reinforced because it is reinforced w/titanium - name = "shuttle window" - desc = "A reinforced, air-locked pod window." - icon = 'icons/obj/smooth_structures/window_reinforced.dmi' - icon_state = "window-0" - base_icon_state = "window" - color ="#afb5e6" - alpha = 180 - max_integrity = 150 - wtype = "shuttle" - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - reinf = TRUE - heat_resistance = 1600 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE - smoothing_groups_with = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE + SMOOTH_GROUP_WALLS - explosion_block = 3 - glass_type = /obj/item/stack/sheet/titaniumglass - glass_amount = 2 - receive_ricochet_chance_mod = 1.2 - melting_point = 8000 - damage_per_fire_tick = 5 - damage_deflection = 11 - -/obj/structure/window/reinforced/shuttle/spawnDebris(location) - . = list() - . += new /obj/item/shard/titanium(location) - . += new /obj/effect/decal/cleanable/glass/titanium(location) - if (reinf) - . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) - if (fulltile) - . += new /obj/item/shard/titanium(location) - -/obj/structure/window/reinforced/shuttle/tinted - opacity = TRUE - -/obj/structure/window/reinforced/shuttle/unanchored - anchored = FALSE - -TYPEINFO_DEF(/obj/structure/window/reinforced/plasma/plastitanium) - default_armor = list(BLUNT = 95, PUNCTURE = 0, SLASH = 100, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 80, ACID = 100) - -/obj/structure/window/reinforced/plasma/plastitanium - name = "plastitanium window" - desc = "A durable looking window made of an alloy of of plasma and titanium." - icon = 'icons/obj/smooth_structures/window.dmi' - icon_state = "window-0" - base_icon_state = "window" - color = "#D0CBD4" - alpha = 180 - max_integrity = 1200 - wtype = "shuttle" - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - heat_resistance = 1600 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - explosion_block = 3 - damage_deflection = 21 //The same as reinforced plasma windows.3 - glass_type = /obj/item/stack/sheet/plastitaniumglass - glass_amount = 2 - rad_insulation = RAD_HEAVY_INSULATION - melting_point = 10000000 //Yeah this thing isnt melting - -/obj/structure/window/reinforced/plasma/plastitanium/spawnDebris(location) - . = list() - . += new /obj/item/shard/plastitanium(location) - . += new /obj/effect/decal/cleanable/glass/plastitanium(location) - if (reinf) - . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) - if (fulltile) - . += new /obj/item/shard/plastitanium(location) - -/obj/structure/window/reinforced/plasma/plastitanium/unanchored - anchored = FALSE - state = WINDOW_OUT_OF_FRAME - -TYPEINFO_DEF(/obj/structure/window/paperframe) - default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - -/obj/structure/window/paperframe - name = "paper frame" - desc = "A fragile separator made of thin wood and paper." - icon = 'icons/obj/smooth_structures/paperframes.dmi' - icon_state = "paperframes-0" - base_icon_state = "paperframes" - opacity = TRUE - max_integrity = 15 - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_PAPERFRAME - smoothing_groups_with = SMOOTH_GROUP_PAPERFRAME - glass_amount = 2 - glass_type = /obj/item/stack/sheet/paperframes - heat_resistance = 233 - decon_speed = 10 - can_atmos_pass = CANPASS_ALWAYS - resistance_flags = FLAMMABLE - knock_sound = SFX_PAGE_TURN - bash_sound = 'sound/weapons/slashmiss.ogg' - break_sound = 'sound/items/poster_ripped.ogg' - hit_sound = 'sound/weapons/slashmiss.ogg' - melting_point = T0C - damage_per_fire_tick = 15 - var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) - var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = ABOVE_OBJ_LAYER - 0.1) - -/obj/structure/window/paperframe/Initialize(mapload) - . = ..() - update_appearance() - -/obj/structure/window/paperframe/examine(mob/user) - . = ..() - if(atom_integrity < max_integrity) - . += span_info("It looks a bit damaged, you may be able to fix it with some paper.") - -/obj/structure/window/paperframe/spawnDebris(location) - . = list(new /obj/item/stack/sheet/mineral/wood(location)) - for (var/i in 1 to rand(1,4)) - . += new /obj/item/paper/natural(location) - -/obj/structure/window/paperframe/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - if(user.combat_mode) - take_damage(4, BRUTE, BLUNT, 0) - if(!QDELETED(src)) - update_appearance() - -/obj/structure/window/paperframe/update_appearance(updates) - . = ..() - set_opacity(atom_integrity >= max_integrity) - -/obj/structure/window/paperframe/update_icon(updates=ALL) - . = ..() - if((updates & UPDATE_SMOOTHING)) - QUEUE_SMOOTH(src) - -/obj/structure/window/paperframe/update_overlays() - . = ..() - . += (atom_integrity < max_integrity) ? torn : paper - -/obj/structure/window/paperframe/attackby(obj/item/W, mob/living/user) - if(W.get_temperature()) - fire_act(null, W.get_temperature(), null) - return - if(user.combat_mode) - return ..() - if(istype(W, /obj/item/paper) && atom_integrity < max_integrity) - user.visible_message(span_notice("[user] starts to patch the holes in \the [src].")) - if(do_after(user, src, 20)) - atom_integrity = min(atom_integrity+4,max_integrity) - qdel(W) - user.visible_message(span_notice("[user] patches some of the holes in \the [src].")) - if(atom_integrity == max_integrity) - update_appearance() - return - ..() - update_appearance() - -/obj/structure/window/bronze - name = "brass window" - desc = "A paper-thin pane of translucent yet reinforced brass. Nevermind, this is just weak bronze!" - icon = 'icons/obj/smooth_structures/clockwork_window.dmi' - icon_state = "clockwork_window_single" - glass_type = /obj/item/stack/sheet/bronze - -/obj/structure/window/bronze/unanchored - anchored = FALSE - -/obj/structure/window/bronze/fulltile - icon = 'icons/obj/smooth_structures/window.dmi' - icon_state = "window-0" - base_icon_state = "window" - color = "#92661A" - alpha = 180 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS - fulltile = TRUE - flags_1 = PREVENT_CLICK_UNDER_1 - max_integrity = 50 - glass_amount = 2 - -/obj/structure/window/bronze/fulltile/unanchored - anchored = FALSE diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index af40fb095e5..3106f0600ce 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -90,7 +90,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_opacity = opacity var/old_directional_opacity = directional_opacity var/old_dynamic_lumcount = dynamic_lumcount - var/old_rcd_memory = rcd_memory var/old_above = above var/old_fire = active_hotspot var/old_explosion_details = explosion_throw_details @@ -144,7 +143,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( W.AfterChange(flags, old_type) W.blueprint_data = old_bp - W.rcd_memory = old_rcd_memory W.explosion_throw_details = old_explosion_details lighting_corner_NE = old_lighting_corner_NE diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index d167ed908ee..b59f76a01ac 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -73,7 +73,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon = 'icons/turf/walls/solid_wall_reinforced.dmi' icon_state = "wall-0" base_icon_state = "wall" - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_WALLS color = "#3a3a4f" /turf/closed/indestructible/riveted @@ -91,7 +91,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#423b3b" smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_WALLS /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/cult_wall.dmi' @@ -100,7 +100,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#174207" smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_WALLS /turf/closed/indestructible/riveted/plastinum name = "plastinum wall" @@ -116,7 +116,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#93662C" smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_WALLS /turf/closed/indestructible/alien name = "alien wall" @@ -154,8 +154,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#a885b8" opacity = FALSE smoothing_flags = SMOOTH_BITMASK - smoothing_groups =SMOOTH_GROUP_WINDOW_FULLTILE - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_WALLS /turf/closed/indestructible/fakeglass/Initialize(mapload, inherited_virtual_z) . = ..() @@ -170,8 +169,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#a2a2a2" opacity = FALSE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + SMOOTH_GROUP_WALLS + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + smoothing_groups_with = SMOOTH_GROUP_WALLS /turf/closed/indestructible/opsglass/Initialize(mapload, inherited_virtual_z) . = ..() @@ -179,12 +178,6 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) underlays += mutable_appearance('icons/obj/structures.dmi', "grille") underlays += mutable_appearance('icons/turf/floors.dmi', "plating") -/turf/closed/indestructible/fakedoor - name = "CentCom Access" - icon = 'icons/obj/doors/airlocks/centcom/airlock.dmi' - icon_state = "fake_door" - smoothing_groups = SMOOTH_GROUP_AIRLOCK - /turf/closed/indestructible/rock name = "dense rock" desc = "An extremely densely-packed rock, most mining tools or explosives would never get through this." diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index c3ccb99ee6c..02abeec92ba 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -35,20 +35,6 @@ /turf/open/chasm/MakeDry() return -/turf/open/chasm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) - return FALSE - -/turf/open/chasm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE - return FALSE - /turf/open/chasm/rust_heretic_act() return FALSE diff --git a/code/game/turfs/open/dirtystation.dm b/code/game/turfs/open/dirtystation.dm index 092fd891fa2..9a87e4a91b6 100644 --- a/code/game/turfs/open/dirtystation.dm +++ b/code/game/turfs/open/dirtystation.dm @@ -13,9 +13,6 @@ if(!(flags_1 & CAN_BE_DIRTY_1)) return - if(locate(/obj/structure/grille) in contents) - return - var/area/A = get_area(src) if(A && !(A.flags_1 & CAN_BE_DIRTY_1)) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 136709110c3..2c26ed09f36 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -32,8 +32,6 @@ var/floor_tile = null var/list/broken_states var/list/burnt_states - /// Determines if you can deconstruct this with a RCD - var/rcd_proof = FALSE /turf/open/floor/Initialize(mapload) . = ..() @@ -253,117 +251,6 @@ /turf/open/floor/acid_melt() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) -/turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_FLOORWALL) - return rcd_result_with_memory( - list("mode" = RCD_FLOORWALL, "delay" = 2 SECONDS, "cost" = 16), - src, RCD_MEMORY_WALL, - ) - if(RCD_AIRLOCK) - if(the_rcd.airlock_glass) - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20) - else - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16) - if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33) - if(RCD_WINDOWGRILLE) - return rcd_result_with_memory( - list("mode" = RCD_WINDOWGRILLE, "delay" = 1 SECONDS, "cost" = 4), - src, RCD_MEMORY_WINDOWGRILLE, - ) - if(RCD_MACHINE) - return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) - if(RCD_COMPUTER) - return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) - if(RCD_FURNISHING) - return list("mode" = RCD_FURNISHING, "delay" = the_rcd.furnish_delay, "cost" = the_rcd.furnish_cost) - return FALSE - -/turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_AIRLOCK) - for(var/obj/machinery/door/door in src) - if(door.sub_door) - continue - to_chat(user, span_notice("There is another door here!")) - return FALSE - if(ispath(the_rcd.airlock_type, /obj/machinery/door/window)) - to_chat(user, span_notice("You build a windoor.")) - var/obj/machinery/door/window/new_window = new the_rcd.airlock_type(src, user.dir, the_rcd.airlock_electronics?.unres_sides) - if(the_rcd.airlock_electronics) - new_window.name = the_rcd.airlock_electronics.passed_name || initial(new_window.name) - if(the_rcd.airlock_electronics.one_access) - new_window.req_one_access = the_rcd.airlock_electronics.accesses.Copy() - else - new_window.req_access = the_rcd.airlock_electronics.accesses.Copy() - new_window.autoclose = TRUE - new_window.update_appearance() - return TRUE - to_chat(user, span_notice("You build an airlock.")) - var/obj/machinery/door/airlock/new_airlock = new the_rcd.airlock_type(src) - new_airlock.electronics = new /obj/item/electronics/airlock(new_airlock) - if(the_rcd.airlock_electronics) - new_airlock.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() - new_airlock.electronics.one_access = the_rcd.airlock_electronics.one_access - new_airlock.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides - new_airlock.electronics.passed_name = the_rcd.airlock_electronics.passed_name - new_airlock.electronics.passed_cycle_id = the_rcd.airlock_electronics.passed_cycle_id - if(new_airlock.electronics.one_access) - new_airlock.req_one_access = new_airlock.electronics.accesses - else - new_airlock.req_access = new_airlock.electronics.accesses - if(new_airlock.electronics.unres_sides) - new_airlock.unres_sides = new_airlock.electronics.unres_sides - if(new_airlock.electronics.passed_name) - new_airlock.name = sanitize(new_airlock.electronics.passed_name) - if(new_airlock.electronics.passed_cycle_id) - new_airlock.closeOtherId = new_airlock.electronics.passed_cycle_id - new_airlock.update_other_id() - new_airlock.autoclose = TRUE - new_airlock.update_appearance() - return TRUE - if(RCD_DECONSTRUCT) - if(rcd_proof) - balloon_alert(user, "it's too thick!") - return FALSE - else - var/old_turf_name = name - if(!ScrapeAway(flags = CHANGETURF_INHERIT_AIR)) - return FALSE - to_chat(user, span_notice("You deconstruct the [old_turf_name].")) - return TRUE - if(RCD_WINDOWGRILLE) - if(locate(/obj/structure/grille) in src) - return FALSE - to_chat(user, span_notice("You construct the grille.")) - var/obj/structure/grille/new_grille = new(src) - new_grille.set_anchored(TRUE) - return TRUE - if(RCD_MACHINE) - if(locate(/obj/structure/frame/machine) in src) - return FALSE - var/obj/structure/frame/machine/new_machine = new(src) - new_machine.state = 2 - new_machine.icon_state = "box_1" - new_machine.set_anchored(TRUE) - return TRUE - if(RCD_COMPUTER) - if(locate(/obj/structure/frame/computer) in src) - return FALSE - var/obj/structure/frame/computer/new_computer = new(src) - new_computer.set_anchored(TRUE) - new_computer.state = 1 - new_computer.setDir(the_rcd.computer_dir) - return TRUE - if(RCD_FURNISHING) - if(locate(the_rcd.furnish_type) in src) - return FALSE - var/atom/new_furnish = new the_rcd.furnish_type(src) - new_furnish.setDir(user.dir) - return TRUE - return FALSE - /turf/open/floor/material name = "floor" icon_state = "materialfloor" diff --git a/code/game/turfs/open/floor/hull.dm b/code/game/turfs/open/floor/hull.dm index c65e96f6ad6..d31dbbe9ecb 100644 --- a/code/game/turfs/open/floor/hull.dm +++ b/code/game/turfs/open/floor/hull.dm @@ -6,13 +6,6 @@ initial_gas = AIRLESS_ATMOS temperature = TCMB -/turf/open/floor/engine/hull/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) //no rcd destroying this flooring - if(passed_mode == RCD_DECONSTRUCT) - to_chat(user, span_warning("The flooring is too thick to be regularly deconstructed!")) - return FALSE - return ..() - -/// RCD-immune plating generated only by shuttle code for shuttle ceilings on multi-z maps, should not be mapped in or creatable in any other way /turf/open/floor/engine/hull/ceiling name = "shuttle ceiling plating" var/old_turf_type diff --git a/code/game/turfs/open/floor/overfloor_catwalk.dm b/code/game/turfs/open/floor/overfloor_catwalk.dm index 23dae244aca..e310f229034 100644 --- a/code/game/turfs/open/floor/overfloor_catwalk.dm +++ b/code/game/turfs/open/floor/overfloor_catwalk.dm @@ -114,10 +114,6 @@ if(current_size >= STAGE_FOUR) deconstruct(TRUE) -/obj/structure/overfloor_catwalk/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) - //Reskins! More fitting with most of our tiles, and appear as a radial on the base type /obj/structure/overfloor_catwalk/iron name = "iron plated catwalk floor cover" diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 4da5928a4f5..1bda747bb40 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -178,17 +178,6 @@ else to_chat(user, span_danger("You hit [src], to no effect!")) -/turf/open/floor/plating/foam/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) - -/turf/open/floor/plating/foam/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - if(passed_mode == RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE - return FALSE - /turf/open/floor/plating/foam/ex_act() . = ..() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) @@ -201,16 +190,13 @@ #define PLATE_BOLTS_LOOSENED 1 #define PLATE_CUT 2 -/turf/open/floor/plating/reinforced //RCD Proof plating designed to be used on Multi-Z maps to protect the rooms below +/turf/open/floor/plating/reinforced name = "reinforced plating" desc = "Thick, tough flooring created with multiple layers of metal." icon_state = "r_plate-0" - heat_capacity = INFINITY - baseturfs = /turf/open/floor/plating allow_replacement = FALSE - rcd_proof = TRUE upgradable = FALSE //Used to track which stage of deconstruction the plate is currently in, Intact > Bolts Loosened > Cut diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index 5add649d562..14bf39ae4fe 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -11,8 +11,6 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE - rcd_proof = TRUE - /turf/open/floor/engine/examine(mob/user) . += ..() diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index f1c779bd6d9..65426aa17fc 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -79,20 +79,6 @@ STOP_PROCESSING(SSobj, src) UnregisterSignal(src, COMSIG_TURF_CHANGE) -/turf/open/lava/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) - return FALSE - -/turf/open/lava/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE - return FALSE - /turf/open/lava/rust_heretic_act() return FALSE @@ -128,11 +114,8 @@ /turf/open/lava/proc/is_safe() //if anything matching this typecache is found in the lava, we don't burn things - var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile, /obj/structure/lattice/lava)) + var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/lattice/lava)) var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache) - for(var/obj/structure/stone_tile/S in found_safeties) - if(S.fallen) - LAZYREMOVE(found_safeties, S) return LAZYLEN(found_safeties) ///Generic return value of the can_burn_stuff() proc. Does nothing. diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index 9b5a4ee290d..6236a936b6a 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -72,108 +72,3 @@ /turf/open/misc/blob_act(obj/structure/blob/B) return - -/turf/open/misc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_FLOORWALL) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) - else - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) - - if(RCD_AIRLOCK) - if(the_rcd.airlock_glass) - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20) - else - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16) - if(RCD_WINDOWGRILLE) - return rcd_result_with_memory( - list("mode" = RCD_WINDOWGRILLE, "delay" = 2 SECONDS, "cost" = 6), - src, RCD_MEMORY_WINDOWGRILLE, - ) - if(RCD_MACHINE) - return list("mode" = RCD_MACHINE, "delay" = 2 SECONDS, "cost" = 25) - if(RCD_COMPUTER) - return list("mode" = RCD_COMPUTER, "delay" = 2 SECONDS, "cost" = 25) - if(RCD_FURNISHING) - return list("mode" = RCD_FURNISHING, "delay" = the_rcd.furnish_delay, "cost" = the_rcd.furnish_cost) - return FALSE - -/turf/open/misc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE - if(RCD_AIRLOCK) // I'm sorry - for(var/obj/machinery/door/door in src) - if(door.sub_door) - continue - to_chat(user, span_notice("There is another door here!")) - return FALSE - if(ispath(the_rcd.airlock_type, /obj/machinery/door/window)) - to_chat(user, span_notice("You build a windoor.")) - var/obj/machinery/door/window/new_window = new the_rcd.airlock_type(src, user.dir, the_rcd.airlock_electronics?.unres_sides) - if(the_rcd.airlock_electronics) - new_window.name = the_rcd.airlock_electronics.passed_name || initial(new_window.name) - if(the_rcd.airlock_electronics.one_access) - new_window.req_one_access = the_rcd.airlock_electronics.accesses.Copy() - else - new_window.req_access = the_rcd.airlock_electronics.accesses.Copy() - new_window.autoclose = TRUE - new_window.update_appearance() - return TRUE - to_chat(user, span_notice("You build an airlock.")) - var/obj/machinery/door/airlock/new_airlock = new the_rcd.airlock_type(src) - new_airlock.electronics = new /obj/item/electronics/airlock(new_airlock) - if(the_rcd.airlock_electronics) - new_airlock.electronics.accesses = the_rcd.airlock_electronics.accesses.Copy() - new_airlock.electronics.one_access = the_rcd.airlock_electronics.one_access - new_airlock.electronics.unres_sides = the_rcd.airlock_electronics.unres_sides - new_airlock.electronics.passed_name = the_rcd.airlock_electronics.passed_name - new_airlock.electronics.passed_cycle_id = the_rcd.airlock_electronics.passed_cycle_id - if(new_airlock.electronics.one_access) - new_airlock.req_one_access = new_airlock.electronics.accesses - else - new_airlock.req_access = new_airlock.electronics.accesses - if(new_airlock.electronics.unres_sides) - new_airlock.unres_sides = new_airlock.electronics.unres_sides - if(new_airlock.electronics.passed_name) - new_airlock.name = sanitize(new_airlock.electronics.passed_name) - if(new_airlock.electronics.passed_cycle_id) - new_airlock.closeOtherId = new_airlock.electronics.passed_cycle_id - new_airlock.update_other_id() - new_airlock.autoclose = TRUE - new_airlock.update_appearance() - return TRUE - if(RCD_WINDOWGRILLE) - if(locate(/obj/structure/grille) in src) - return FALSE - to_chat(user, span_notice("You construct the grille.")) - var/obj/structure/grille/new_grille = new(src) - new_grille.set_anchored(TRUE) - return TRUE - if(RCD_MACHINE) - if(locate(/obj/structure/frame/machine) in src) - return FALSE - var/obj/structure/frame/machine/new_machine = new(src) - new_machine.state = 2 - new_machine.icon_state = "box_1" - new_machine.set_anchored(TRUE) - return TRUE - if(RCD_COMPUTER) - if(locate(/obj/structure/frame/computer) in src) - return FALSE - var/obj/structure/frame/computer/new_computer = new(src) - new_computer.set_anchored(TRUE) - new_computer.state = 1 - new_computer.setDir(the_rcd.computer_dir) - return TRUE - if(RCD_FURNISHING) - if(locate(the_rcd.furnish_type) in src) - return FALSE - var/atom/new_furnish = new the_rcd.furnish_type(src) - new_furnish.setDir(user.dir) - return TRUE - return FALSE diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index f3a2d7f560b..d721e8254e1 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -85,27 +85,6 @@ return return ..() -/turf/open/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(!CanBuildHere()) - return FALSE - - switch(the_rcd.mode) - if(RCD_FLOORWALL) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) - else - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) - return FALSE - -/turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE - return FALSE - /turf/open/openspace/rust_heretic_act() return FALSE diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 5b1cb0f6f65..341380410af 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -192,27 +192,6 @@ GLOBAL_REAL_VAR(space_appearances) = make_space_appearances() /turf/open/space/acid_act(acidpwr, acid_volume) return FALSE -/turf/open/space/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(!CanBuildHere()) - return FALSE - - switch(the_rcd.mode) - if(RCD_FLOORWALL) - var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) - else - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) - return FALSE - -/turf/open/space/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_FLOORWALL) - to_chat(user, span_notice("You build a floor.")) - PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - return TRUE - return FALSE - /turf/open/space/rust_heretic_act() return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0fe595d9c52..6aa0171ae10 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -73,10 +73,6 @@ GLOBAL_LIST_EMPTY(station_turfs) ///the holodeck can load onto this turf if TRUE var/holodeck_compatible = FALSE - /// If this turf contained an RCD'able object (or IS one, for walls) - /// but is now destroyed, this will preserve the value. - /// See __DEFINES/construction.dm for RCD_MEMORY_*. - var/rcd_memory ///whether or not this turf forces movables on it to have no gravity (unless they themselves have forced gravity) var/force_no_gravity = FALSE diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index ff80f29c3b2..c83ffc4b05b 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -198,11 +198,6 @@ if (teamSpawned) message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]") - //Open the Armory doors - if(ertemplate.opendoors) - for(var/obj/machinery/door/poddoor/ert/door in INSTANCES_OF(/obj/machinery/door)) - door.open() - CHECK_TICK return TRUE return diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index e6c07342bb7..678f11ebcdf 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -54,7 +54,6 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/station_food_debug, /client/proc/station_stack_debug, /client/proc/check_atmos_controls, - /client/proc/find_bad_access, )) GLOBAL_PROTECT(admin_verbs_debug_mapping) @@ -122,14 +121,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) output += "
  • Overlapping cameras at [ADMIN_VERBOSEJMP(C1)] Networks: [json_encode(C1.network)] and [json_encode(C2.network)]
  • " var/turf/T = get_step(C1,C1.dir) if(!T || !isturf(T) || !T.density ) - if(!(locate(/obj/structure/grille) in T)) - var/window_check = 0 - for(var/obj/structure/window/W in T) - if (W.dir == turn(C1.dir,180) || (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST)) ) - window_check = 1 - break - if(!window_check) - output += "
  • Camera not connected to wall at [ADMIN_VERBOSEJMP(C1)] Network: [json_encode(C1.network)]
  • " + output += "
  • Camera not connected to wall at [ADMIN_VERBOSEJMP(C1)] Network: [json_encode(C1.network)]
  • " output += "" usr << browse(output,"window=airreport;size=1000x500") @@ -550,41 +542,3 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) to_chat(usr, "Atmos control frequency check passed without encountering problems.", confidential=TRUE) else to_chat(usr, "Total errors: [invalid_machine + invalid_tag + tagless + duplicate_tag + not_heard + not_told]", confidential=TRUE) - -/client/proc/find_bad_access() - set name = "Find Bad Access" - set category = "Mapping" - - var/list/zlevel_cache = new /list(world.maxz) - for(var/zlevel in SSmapping.get_zstack(get_random_station_turf(), FALSE)) - zlevel_cache[zlevel] = TRUE - - var/doors = 0 - for(var/obj/machinery/door/D as anything in INSTANCES_OF(/obj/machinery/door)) - if(!zlevel_cache[D.z]) - continue - - doors++ - - var/list/bad_access = list() - var/list/bad_one_access = list() - - D.gen_access() - - for(var/access_num in D.req_access) - if(!SSid_access.desc_by_access["[access_num]"]) - bad_access += num2text(access_num) - - for(var/access_num in D.req_one_access) - if(!SSid_access.desc_by_access["[access_num]"]) - bad_one_access += num2text(access_num) - - - if(length(bad_access) && length(bad_one_access)) - to_chat(src, "[ADMIN_COORDJMP(D)] VV Bad Access: [jointext(bad_access, ",")] | Bad One Access: [jointext(bad_one_access, ",")]") - else if(length(bad_access)) - to_chat(src, "[ADMIN_COORDJMP(D)] VV Bad Access: [jointext(bad_access, ",")]") - else if(length(bad_one_access)) - to_chat(src, "[ADMIN_COORDJMP(D)] VV Bad One Access: [jointext(bad_one_access, ",")]") - - to_chat(src, span_debug("Searched [doors] doors.")) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index f798828dc8c..b4fe018c4c2 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -70,19 +70,10 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if("maint_access_engiebrig") if(!is_debugger) return - for(var/obj/machinery/door/airlock/maintenance/M in INSTANCES_OF(/obj/machinery/door)) - M.check_access() - if (ACCESS_MAINT_TUNNELS in M.req_access) - M.req_access = list() - M.req_one_access = list(ACCESS_SECURITY, ACCESS_ENGINEERING) message_admins("[key_name_admin(holder)] made all maint doors engineering and brig access-only.") if("maint_access_brig") if(!is_debugger) return - for(var/obj/machinery/door/airlock/maintenance/M in INSTANCES_OF(/obj/machinery/door)) - M.check_access() - if (ACCESS_MAINT_TUNNELS in M.req_access) - M.req_access = list(ACCESS_SECURITY) message_admins("[key_name_admin(holder)] made all maint doors brig access-only.") if("infinite_sec") if(!is_debugger) @@ -291,14 +282,6 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) summon_events(holder) SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Activate")) - if("eagles") - if(!is_funmin) - return - SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Egalitarian Station")) - for(var/obj/machinery/door/airlock/W in INSTANCES_OF(/obj/machinery/door)) - if(is_station_level(W.z) && !istype(get_area(W), /area/station/command) && !istype(get_area(W), /area/station/commons) && !istype(get_area(W), /area/station/service) && !istype(get_area(W), /area/station/command/heads_quarters) && !istype(get_area(W), /area/station/security/prison)) W.req_access = list() - message_admins("[key_name_admin(holder)] activated Egalitarian Station mode") - priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.") if("ancap") if(!is_funmin) return diff --git a/code/modules/admin/view_variables/mass_edit_variables.dm b/code/modules/admin/view_variables/mass_edit_variables.dm index 02acca95496..251c2797716 100644 --- a/code/modules/admin/view_variables/mass_edit_variables.dm +++ b/code/modules/admin/view_variables/mass_edit_variables.dm @@ -213,12 +213,6 @@ . += thing CHECK_TICK - else if (ispath(T, /obj/machinery/door)) - for(var/obj/machinery/door/thing in world) - if (typecache[thing.type]) - . += thing - CHECK_TICK - else if (ispath(T, /obj/machinery)) for(var/obj/machinery/thing in world) if (typecache[thing.type]) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index db5fcec405a..adf5779122f 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -855,13 +855,6 @@ TYPEINFO_DEF(/obj/structure/table/abductor) door_anim_time = 0 material_drop = /obj/item/stack/sheet/mineral/abductor -/obj/structure/door_assembly/door_assembly_abductor - name = "alien airlock assembly" - base_name = "alien airlock" - airlock_type = /obj/machinery/door/airlock/abductor - material_type = /obj/item/stack/sheet/mineral/abductor - noglass = TRUE - TYPEINFO_DEF(/obj/item/clothing/under/abductor) default_armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, FIRE = 0, ACID = 0) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index a9df2d5676d..29beb8dc881 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -184,26 +184,6 @@ var/obj/machinery/computer/C = target C.attack_alien(user) //muh copypasta - else if(istype(target, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = target - - if((!A.requiresID() || A.allowed(user)) && A.hasPower()) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message, power requirement is so this doesn't stop unpowered doors from being pried open if you have access - return - if(A.locked) - to_chat(user, span_warning("The airlock's bolts prevent it from being forced!")) - return - - if(A.hasPower()) - user.visible_message(span_warning("[user] jams [src] into the airlock and starts prying it open!"), span_warning("We start forcing the [A] open."), \ - span_hear("You hear a metal screeching sound.")) - playsound(A, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - if(!do_after(user, A, 100)) - return - //user.say("Heeeeeeeeeerrre's Johnny!") - user.visible_message(span_warning("[user] forces the airlock to open with [user.p_their()] [src]!"), span_warning("We force the [A] to open."), \ - span_hear("You hear a metal screeching sound.")) - A.open(2) - /obj/item/melee/arm_blade/unequipped(mob/user) ..() if(can_drop) diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm index eb52498879d..6e13937ea64 100644 --- a/code/modules/antagonists/heretic/magic/mirror_walk.dm +++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm @@ -17,7 +17,6 @@ var/phase_in_time = 2 SECONDS /// Static typecache of types that are counted as reflective. var/static/list/special_reflective_surfaces = typecacheof(list( - /obj/structure/window, /obj/structure/mirror, )) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 0fd48c64f82..621ed374943 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -296,10 +296,6 @@ corpseholder.open() for(var/obj/machinery/dna_scannernew/dna in victim) dna.open_machine() - for(var/obj/structure/window/window in victim) - window.take_damage(rand(30, 80)) - if(window?.fulltile) - new /obj/effect/temp_visual/revenant/cracks(window.loc) for(var/obj/machinery/light/light in victim) light.flicker(20) //spooky diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index d6aac590dbb..e3eae3e4371 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -353,12 +353,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) uses = 1 /datum/action/innate/ai/lockdown/Activate() - for(var/obj/machinery/door/D in INSTANCES_OF(/obj/machinery/door)) - if(!is_station_level(D.z)) - continue - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door, hostile_lockdown), owner) - addtimer(CALLBACK(D, TYPE_PROC_REF(/obj/machinery/door, disable_lockdown)), 900) - var/obj/machinery/computer/communications/C = locate() in INSTANCES_OF(/obj/machinery/computer/communications) if(C) C.post_status("alert", "lockdown") @@ -421,31 +415,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) new /mob/living/simple_animal/hostile/mimic/copy/machine(get_turf(to_animate), to_animate, invoker, TRUE) -/// Destroy RCDs: Detonates all non-cyborg RCDs on the station. -/datum/ai_module/destructive/destroy_rcd - name = "Destroy RCDs" - description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Construction Devices on the station." - cost = 25 - one_purchase = TRUE - power_type = /datum/action/innate/ai/destroy_rcds - unlock_text = "After some improvisation, you rig your onboard radio to be able to send a signal to detonate all RCDs." - unlock_sound = 'sound/items/timer.ogg' - -/datum/action/innate/ai/destroy_rcds - name = "Destroy RCDs" - desc = "Detonate all non-cyborg RCDs on the station." - button_icon_state = "detonate_rcds" - uses = 1 - cooldown_period = 100 - -/datum/action/innate/ai/destroy_rcds/Activate() - for(var/I in INSTANCES_OF(TRACKING_KEY_RCD)) - if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared. - var/obj/item/construction/rcd/RCD = I - RCD.detonate_pulse() - to_chat(owner, span_danger("RCD detonation pulse emitted.")) - owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0) - /// Overload Machine: Allows the AI to overload a machine, detonating it after a delay. Two uses per purchase. /datum/ai_module/destructive/overload_machine name = "Machine Overload" @@ -665,37 +634,6 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) to_chat(owner, span_notice("All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.")) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) -/// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job. -/datum/ai_module/utility/break_fire_alarms - name = "Thermal Sensor Override" - description = "Gives you the ability to override the thermal sensors on all fire alarms. This will remove their ability to scan for fire and thus their ability to alert." - one_purchase = TRUE - cost = 25 - power_type = /datum/action/innate/ai/break_fire_alarms - unlock_text = "You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will." - unlock_sound = 'sound/machines/FireAlarm1.ogg' - -/datum/action/innate/ai/break_fire_alarms - name = "Override Thermal Sensors" - desc = "Disables the automatic temperature sensing on all fire alarms, making them effectively useless." - button_icon_state = "break_fire_alarms" - uses = 1 - -/datum/action/innate/ai/break_fire_alarms/Activate() - for(var/obj/machinery/firealarm/bellman as anything in INSTANCES_OF(/obj/machinery/firealarm)) - if(!is_station_level(bellman.z)) - continue - bellman.obj_flags |= EMAGGED - bellman.update_appearance() - - for(var/obj/machinery/door/firedoor/firelock in INSTANCES_OF(/obj/machinery/door)) - if(!is_station_level(firelock.z)) - continue - - firelock.emag_act(owner_AI, src) - to_chat(owner, span_notice("All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.")) - owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) - /// Disable Emergency Lights /datum/ai_module/utility/emergency_lights name = "Disable Emergency Lights" diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm index 5e5d199fb9a..7a7a3879f1f 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/mobility.dm @@ -36,10 +36,3 @@ item_path = /obj/item/warpwhistle category = "Mobility" cost = 1 - -/datum/spellbook_entry/item/staffdoor - name = "Staff of Door Creation" - desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." - item_path = /obj/item/gun/magic/staff/door - cost = 1 - category = "Mobility" diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm deleted file mode 100644 index 34b8c70caeb..00000000000 --- a/code/modules/assembly/doorcontrol.dm +++ /dev/null @@ -1,286 +0,0 @@ -/obj/item/assembly/control - name = "blast door controller" - desc = "A small electronic device able to control a blast door remotely." - icon_state = "control" - attachable = TRUE - var/id = null - var/can_change_id = 0 - var/cooldown = FALSE //Door cooldowns - var/sync_doors = TRUE - -/obj/item/assembly/control/examine(mob/user) - . = ..() - if(id) - . += span_notice("Its channel ID is '[id]'.") - -/obj/item/assembly/control/multitool_act(mob/living/user) - var/change_id = tgui_input_number(user, "Set the door controllers ID", "Door ID", id, 100) - if(!change_id || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) - return - id = change_id - to_chat(user, span_notice("You change the ID to [id].")) - -/obj/item/assembly/control/activate() - var/openclose - if(cooldown) - return - cooldown = TRUE - for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door)) - if(M.id == src.id) - if(openclose == null || !sync_doors) - openclose = M.density - INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/machinery/door/poddoor, open) : TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) - -/obj/item/assembly/control/curtain - name = "curtain controller" - desc = "A small electronic device able to control a mechanical curtain remotely." - -/obj/item/assembly/control/curtain/examine(mob/user) - . = ..() - if(id) - . += span_notice("Its channel ID is '[id]'.") - -/obj/item/assembly/control/curtain/activate() - var/openclose - if(cooldown) - return - cooldown = TRUE - for(var/obj/structure/curtain/cloth/fancy/mechanical/M as anything in INSTANCES_OF(/obj/structure/curtain/cloth/fancy/mechanical)) - if(M.id == src.id) - if(openclose == null || !sync_doors) - openclose = M.density - INVOKE_ASYNC(M, openclose ? TYPE_PROC_REF(/obj/structure/curtain/cloth/fancy/mechanical, open) : TYPE_PROC_REF(/obj/structure/curtain/cloth/fancy/mechanical, close)) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 5) - - -/obj/item/assembly/control/airlock - name = "airlock controller" - desc = "A small electronic device able to control an airlock remotely." - id = "badmin" // Set it to null for MEGAFUN. - var/specialfunctions = OPEN - /* - Bitflag, 1= open (OPEN) - 2= idscan (IDSCAN) - 4= bolts (BOLTS) - 8= shock (SHOCK) - 16= door safties (SAFE) - */ - -/obj/item/assembly/control/airlock/activate() - if(cooldown) - return - cooldown = TRUE - var/doors_need_closing = FALSE - var/list/obj/machinery/door/airlock/open_or_close = list() - for(var/obj/machinery/door/airlock/D in INSTANCES_OF(/obj/machinery/door)) - if(D.id_tag == src.id) - if(specialfunctions & OPEN) - open_or_close += D - if(!D.density) - doors_need_closing = TRUE - if(specialfunctions & IDSCAN) - D.aiDisabledIdScanner = !D.aiDisabledIdScanner - if(specialfunctions & BOLTS) - if(!D.wires.is_cut(WIRE_BOLTS) && D.hasPower()) - D.locked = !D.locked - D.update_appearance() - if(specialfunctions & SHOCK) - if(D.secondsElectrified) - D.set_electrified(MACHINE_ELECTRIFIED_PERMANENT, usr) - else - D.set_electrified(MACHINE_NOT_ELECTRIFIED, usr) - if(specialfunctions & SAFE) - D.dont_close_on_dense_objects = !D.dont_close_on_dense_objects - - for(var/D in open_or_close) - INVOKE_ASYNC(D, doors_need_closing ? TYPE_PROC_REF(/obj/machinery/door/airlock, close) : TYPE_PROC_REF(/obj/machinery/door/airlock, open)) - - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) - - -/obj/item/assembly/control/massdriver - name = "mass driver controller" - desc = "A small electronic device able to control a mass driver." - -/obj/item/assembly/control/massdriver/activate() - if(cooldown) - return - cooldown = TRUE - for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door)) - if (M.id == src.id) - INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, open)) - - sleep(10) - - for(var/obj/machinery/mass_driver/M as anything in INSTANCES_OF(/obj/machinery/mass_driver)) - if(M.id == src.id) - M.drive() - - sleep(60) - - for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door)) - if (M.id == src.id) - INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) - - -/obj/item/assembly/control/igniter - name = "ignition controller" - desc = "A remote controller for a mounted igniter." - -/obj/item/assembly/control/igniter/activate() - if(cooldown) - return - - cooldown = TRUE - - for(var/obj/machinery/sparker/M as anything in INSTANCES_OF(/obj/machinery/sparker)) - if (M.id == src.id) - INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/sparker, ignite)) - - for(var/obj/machinery/igniter/M as anything in INSTANCES_OF(/obj/machinery/igniter)) - if(M.id == src.id) - M.use_power(50) - M.on = !M.on - M.icon_state = "igniter[M.on]" - - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 30) - -/obj/item/assembly/control/flasher - name = "flasher controller" - desc = "A remote controller for a mounted flasher." - -/obj/item/assembly/control/flasher/activate() - if(cooldown) - return - cooldown = TRUE - for(var/obj/machinery/flasher/M as anything in INSTANCES_OF(/obj/machinery/flasher)) - if(M.id == src.id) - INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/flasher, flash)) - - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) - -/obj/item/assembly/control/crematorium - name = "crematorium controller" - desc = "An evil-looking remote controller for a crematorium." - -/obj/item/assembly/control/crematorium/activate() - if(cooldown) - return - cooldown = TRUE - for (var/obj/structure/bodycontainer/crematorium/C in GLOB.crematoriums) - if (C.id == id) - C.cremate(usr) - - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) - -//how long it spends on each floor when moving somewhere, so it'd take 4 seconds to reach you if it had to travel up 2 floors -#define FLOOR_TRAVEL_TIME 2 SECONDS -/obj/item/assembly/control/elevator - name = "elevator controller" - desc = "A small device used to call elevators to the current floor." - -/obj/item/assembly/control/elevator/activate() - if(cooldown) - return - cooldown = TRUE - var/datum/lift_master/lift - for(var/datum/lift_master/possible_match as anything in GLOB.active_lifts_by_type[BASIC_LIFT_ID]) - if(possible_match.specific_lift_id != id || !check_z(possible_match) || possible_match.controls_locked) - continue - - lift = possible_match - break - - if(!lift) - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS) - return - - var/obj/structure/industrial_lift/target = lift.lift_platforms[1] - var/target_z = target.z - - lift.set_controls(LIFT_PLATFORM_LOCKED) - ///The z level to which the elevator should travel - var/targetZ = (abs(loc.z)) //The target Z (where the elevator should move to) is not our z level (we are just some assembly in nullspace) but actually the Z level of whatever we are contained in (e.g. elevator button) - ///The amount of z levels between the our and targetZ - var/difference = abs(targetZ - target_z) - ///Direction (up/down) needed to go to reach targetZ - var/direction = target_z < targetZ ? UP : DOWN - ///How long it will/should take us to reach the target Z level - var/travel_duration = FLOOR_TRAVEL_TIME * difference //100 / 2 floors up = 50 seconds on every floor, will always reach destination in the same time - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), travel_duration) - - for(var/i in 1 to difference) - sleep(FLOOR_TRAVEL_TIME)//hey this should be alright... right? - if(QDELETED(lift) || QDELETED(src))//elevator control or button gone = don't go up anymore - return - lift.MoveLift(direction, null) - lift.set_controls(LIFT_PLATFORM_UNLOCKED) - -///check if any of the lift platforms are already here -/obj/item/assembly/control/elevator/proc/check_z(datum/lift_master/lift) - for(var/obj/structure/industrial_lift/platform as anything in lift.lift_platforms) - if(platform.z == loc.z) - return FALSE - - return TRUE - -#undef FLOOR_TRAVEL_TIME - -/obj/item/assembly/control/tram - name = "tram call button" - desc = "A small device used to bring trams to you." - ///for finding the landmark initially - should be the exact same as the landmark's destination id. - var/initial_id - ///ID to link to allow us to link to one specific tram in the world - var/specific_lift_id = MAIN_STATION_TRAM - ///this is our destination's landmark, so we only have to find it the first time. - var/datum/weakref/to_where - -/obj/item/assembly/control/tram/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/item/assembly/control/tram/LateInitialize() - . = ..() - //find where the tram needs to go to (our destination). only needs to happen the first time - for(var/obj/effect/landmark/tram/our_destination as anything in GLOB.tram_landmarks[specific_lift_id]) - if(our_destination.destination_id == initial_id) - to_where = WEAKREF(our_destination) - break - -/obj/item/assembly/control/tram/Destroy() - to_where = null - return ..() - -/obj/item/assembly/control/tram/activate() - if(cooldown) - return - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 2 SECONDS) - - var/datum/lift_master/tram/tram - for(var/datum/lift_master/tram/possible_match as anything in GLOB.active_lifts_by_type[TRAM_LIFT_ID]) - if(possible_match.specific_lift_id == specific_lift_id) - tram = possible_match - break - - if(!tram) - say("The tram is not responding to call signals. Please send a technician to repair the internals of the tram.") - return - if(tram.travelling) //in use - say("The tram is already travelling to [tram.from_where].") - return - if(!to_where) - return - var/obj/effect/landmark/tram/current_location = to_where.resolve() - if(!current_location) - return - if(tram.from_where == current_location) //already here - say("The tram is already here. Please board the tram and select a destination.") - return - - say("The tram has been called to [current_location.name]. Please wait for its arrival.") - tram.tram_travel(current_location) diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index b97dbf3a379..9a0cf8b54fd 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -103,7 +103,6 @@ This entire system is an absolute mess. ///The typecache of objects airflow can't push objects into the same tile of GLOBAL_LIST_INIT(airflow_step_blacklist, typecacheof(list( /obj/structure, - /obj/machinery/door ))) /atom/movable/Bump(atom/A) diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 958d2c04d24..442057f925b 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -415,23 +415,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin /turf/open/space/apply_fire_protection() return -/turf/fire_act(exposed_temperature, exposed_volume, turf/adjacent) - return - -/turf/open/floor/fire_act(exposed_temperature, exposed_volume, turf/adjacent) - if(!adjacent) - return - - var/dir_to = get_dir(src, adjacent) - - for(var/obj/structure/window/W in src) - if(W.dir == dir_to || W.fulltile) //Same direction or diagonal (full tile) - W.fire_act(exposed_temperature, exposed_volume, adjacent) - - for(var/obj/machinery/door/window/door in src) - if(door.dir == dir_to) //Same direction or diagonal (full tile) - door.fire_act(exposed_temperature, exposed_volume, adjacent) - /turf/closed/constructed_wall/fire_act(exposed_temperature, exposed_volume, turf/adjacent) if(!uses_integrity) burn(exposed_temperature) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 6fd6dfdcdbb..36f83b34106 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -104,8 +104,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm) var/alert_type = FIRE_CLEAR ///A reference to the area we are in var/area/my_area - ///The loopingsound for when there's shit fucky - var/datum/looping_sound/firealarm/soundloop var/locked = TRUE var/aidisabled = 0 @@ -167,7 +165,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm) name = "[get_area_name(src)] Air Alarm" alarm_manager = new(src) - soundloop = new(src, FALSE) RegisterSignal(src, COMSIG_FIRE_ALERT, PROC_REF(handle_alert)) update_appearance() @@ -190,7 +187,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm) SSairmachines.stop_processing_machine(src) QDEL_NULL(wires) QDEL_NULL(alarm_manager) - QDEL_NULL(soundloop) return ..() /obj/machinery/airalarm/Moved(atom/OldLoc, Dir, list/old_locs, momentum_change = TRUE) @@ -467,10 +463,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm) post_alert(0) usr.animate_interact(src) . = TRUE - if("fire_alarm") - my_area.communicate_fire_alert(alert_type ? FIRE_CLEAR : FIRE_RAISED_GENERIC) - usr.animate_interact(src) - . = TRUE update_appearance() @@ -773,22 +765,8 @@ TYPEINFO_DEF(/obj/machinery/airalarm) current_tlv = cached_tlv[gas_id] gas_dangerlevel = max(gas_dangerlevel, current_tlv.get_danger_level(environment.gas[gas_id])) - var/old_danger_level = danger_level danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel) - if(old_danger_level != danger_level) - INVOKE_ASYNC(src, PROC_REF(apply_danger_level)) - if(alert_type) - if(!danger_level) - my_area.communicate_fire_alert(FIRE_CLEAR) - else if(danger_level) - if(temperature_dangerlevel > 1) - my_area.communicate_fire_alert(environment.temperature >= cached_tlv["temperature"].hazard_max ? FIRE_RAISED_HOT : FIRE_RAISED_COLD) - else if(pressure_dangerlevel > 1) - my_area.communicate_fire_alert(FIRE_RAISED_PRESSURE) - else - my_area.communicate_fire_alert(FIRE_RAISED_GENERIC) - if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05) mode = AALARM_MODE_SCRUBBING INVOKE_ASYNC(src, PROC_REF(apply_mode), src) @@ -943,21 +921,6 @@ TYPEINFO_DEF(/obj/machinery/airalarm) togglelock(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if((buildstage == AIRALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) - return FALSE - -/obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_UPGRADE_SIMPLE_CIRCUITS) - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt an air alarm circuit and slot it into the assembly.")) - buildstage = AIRALARM_BUILD_NO_WIRES - update_appearance() - return TRUE - return FALSE - /obj/machinery/airalarm/proc/togglelock(mob/living/user) if(machine_stat & (NOPOWER|BROKEN)) to_chat(user, span_warning("It does nothing!")) @@ -1124,10 +1087,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 21) if(code) alarm_manager.send_alarm(ALARM_FIRE) - soundloop.start() else alarm_manager.clear_alarm(ALARM_FIRE) - soundloop.stop() alert_type = code diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index 6ff8bf0531c..7364a659744 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -42,14 +42,3 @@ else if(isobj(object)) qdel(object) return - else if(istype(object,/turf) && alt_click && left_click) - log_admin("Build Mode: [key_name(c)] built an airlock at [AREACOORD(object)]") - new/obj/machinery/door/airlock(get_turf(object)) - else if(istype(object,/turf) && ctrl_click && left_click) - var/obj/structure/window/reinforced/window - if(BM.build_dir in GLOB.diagonals) - window = new /obj/structure/window/reinforced/fulltile(get_turf(object)) - else - window = new /obj/structure/window/reinforced(get_turf(object)) - window.setDir(BM.build_dir) - log_admin("Build Mode: [key_name(c)] built a window at [AREACOORD(object)]") diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 51c64efef3e..d521a8b73ca 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -50,12 +50,6 @@ contents_cost = CARGO_CRATE_VALUE * 3.5 export_types = list(/obj/structure/reagent_dispensers/beerkeg) - -/datum/export/large/pipedispenser - cost = CARGO_CRATE_VALUE * 2.5 - unit_name = "pipe dispenser" - export_types = list(/obj/machinery/pipedispenser) - /datum/export/large/emitter cost = CARGO_CRATE_VALUE * 2.75 unit_name = "emitter" diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 4714099a8af..9037eff4c1c 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -93,7 +93,6 @@ cost = CARGO_CRATE_VALUE * 0.025 unit_name = "radio" export_types = list(/obj/item/radio) - exclude_types = list(/obj/item/radio/mech) //Advanced/Power Tools. /datum/export/weldingtool/experimental @@ -111,31 +110,6 @@ unit_name = "hand drill" export_types = list(/obj/item/screwdriver/power) -/datum/export/rld_mini - cost = CARGO_CRATE_VALUE * 0.75 - unit_name = "mini rapid lighting device" - export_types = list(/obj/item/construction/rld/mini) - -/datum/export/rsf - cost = CARGO_CRATE_VALUE * 0.5 - unit_name = "rapid service fabricator" - export_types = list(/obj/item/rsf) - -/datum/export/rcd - cost = CARGO_CRATE_VALUE * 0.5 - unit_name = "rapid construction device" - export_types = list(/obj/item/construction/rcd) - -/datum/export/rcd_ammo - cost = CARGO_CRATE_VALUE * 0.3 - unit_name = "compressed matter cardridge" - export_types = list(/obj/item/rcd_ammo) - -/datum/export/rpd - cost = CARGO_CRATE_VALUE * 0.5 - unit_name = "rapid pipe dispenser" - export_types = list(/obj/item/pipe_dispenser) - //artisanal exports for the mom and pops /datum/export/soap cost = CARGO_CRATE_VALUE * 0.375 diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 04d12ee0c48..b98a094d21b 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -424,16 +424,6 @@ /obj/item/melee/baton/security/loaded) crate_name = "stun baton crate" -/datum/supply_pack/security/wall_flash - name = "Wall-Mounted Flash Crate" - desc = "Contains four wall-mounted flashes. Requires Security access to open." - cost = CARGO_CRATE_VALUE * 2 - contains = list(/obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash, - /obj/item/storage/box/wall_flash) - crate_name = "wall-mounted flash crate" - /datum/supply_pack/security/constable name = "Traditional Equipment Crate" desc = "Spare equipment found in a warehouse." @@ -654,25 +644,6 @@ /obj/machinery/shieldgen) crate_name = "anti-breach shield projector crate" -/datum/supply_pack/engineering/ripley - name = "APLU MK-I Crate" - desc = "A do-it-yourself kit for building an ALPU MK-I \"Ripley\", designed for lifting and carrying heavy equipment, and other station tasks. Batteries not included." - cost = CARGO_CRATE_VALUE * 10 - access_view = ACCESS_ROBOTICS - contains = list(/obj/item/mecha_parts/chassis/ripley, - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_leg, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/stock_parts/capacitor, - /obj/item/stock_parts/scanning_module, - /obj/item/circuitboard/mecha/ripley/main, - /obj/item/circuitboard/mecha/ripley/peripherals, - /obj/item/mecha_parts/mecha_equipment/drill, - /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) - crate_name= "\improper APLU MK-I kit" - /datum/supply_pack/engineering/conveyor name = "Conveyor Assembly Crate" desc = "Keep production moving along with thirty conveyor belts. Conveyor switch included. If you have any questions, check out the enclosed instruction book." @@ -1044,16 +1015,6 @@ contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" -/datum/supply_pack/materials/rcd_ammo - name = "RCD Ammo" - desc = "Contains four raw material cartridges that can be used to quickly recharge any RCD." - cost = CARGO_CRATE_VALUE * 8.5 - contains = list(/obj/item/rcd_ammo, - /obj/item/rcd_ammo, - /obj/item/rcd_ammo/large, - /obj/item/rcd_ammo/large,) - crate_name = "rcd ammo crate" - /datum/supply_pack/materials/foamtank name = "Firefighting Foam Tank Crate" desc = "Contains a tank of firefighting foam." diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index b37bf0bcce9..1121292e0c1 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -150,14 +150,11 @@ back = /obj/item/mod/control/pre_equipped/responsory/engineer l_hand = /obj/item/gun/energy/e_gun backpack_contents = list( - /obj/item/construction/rcd/loaded/upgraded = 1, /obj/item/melee/baton/security/loaded = 1, - /obj/item/pipe_dispenser = 1, /obj/item/storage/box/survival/engineer = 1, ) belt = /obj/item/storage/belt/utility/full/powertools glasses = /obj/item/clothing/glasses/meson/engine - l_pocket = /obj/item/rcd_ammo/large /datum/outfit/centcom/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() @@ -173,10 +170,8 @@ name = "ERT Engineer - High Alert" backpack_contents = list( - /obj/item/construction/rcd/combat = 1, /obj/item/gun/energy/pulse/pistol = 1, /obj/item/melee/baton/security/loaded = 1, - /obj/item/pipe_dispenser = 1, /obj/item/storage/box/survival/engineer = 1, ) @@ -230,7 +225,6 @@ suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/security backpack_contents = list( - /obj/item/construction/rcd/loaded = 1, /obj/item/melee/baton/security/loaded = 1, /obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/survival/engineer = 1, @@ -449,7 +443,6 @@ suit_store = null back = /obj/item/storage/backpack/ert/engineer backpack_contents = list( - /obj/item/construction/rcd/loaded = 1, /obj/item/etherealballdeployer = 1, /obj/item/stack/light_w = 30, /obj/item/stack/sheet/glass/fifty = 1, diff --git a/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm b/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm index 305dbc276d7..27326c0385a 100644 --- a/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm +++ b/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm @@ -12,7 +12,7 @@ TYPEINFO_DEF(/obj/item/clothing/suit/space/hardsuit) icon_state = "hardsuit-engineering" inhand_icon_state = "eng_hardsuit" max_integrity = 300 - allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner) siemens_coefficient = 0 actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle_helmet) supports_variations_flags = CLOTHING_TESHARI_VARIATION diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 40791f5f42f..d5ed27601fe 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -371,8 +371,6 @@ TYPEINFO_DEF(/obj/item/clothing/suit/hooded/wintercoat/engineering) zmm_flags = ZMM_MANGLE_PLANES allowed = list( /obj/item/analyzer, - /obj/item/construction/rcd, - /obj/item/pipe_dispenser, /obj/item/t_scanner, /obj/item/storage/bag/construction, ) diff --git a/code/modules/codex/entries/items.dm b/code/modules/codex/entries/items.dm index 5efbe8b3d24..1b97793dbb7 100644 --- a/code/modules/codex/entries/items.dm +++ b/code/modules/codex/entries/items.dm @@ -17,11 +17,3 @@ name = "Reagent Cartridge" associated_paths = list(/obj/item/reagent_containers/chem_cartridge) controls_text = "Use Pen - Change label." - -/datum/codex_entry/item/pipe_dispenser - name = "Rapid Pipe Dispenser" - associated_paths = list(/obj/item/pipe_dispenser) - controls_text = {" - Right Click on Pipe - Set color and layer.
    - Scroll Wheel - Cycle pipe layer. - "} diff --git a/code/modules/codex/entries/machinery.dm b/code/modules/codex/entries/machinery.dm index d7f162e8c3a..8a2b0002275 100644 --- a/code/modules/codex/entries/machinery.dm +++ b/code/modules/codex/entries/machinery.dm @@ -7,13 +7,6 @@ . = ..() GLOB.machine_codex_entries += src -/datum/codex_entry/machine/airlock - name = "Airlock" - associated_paths = list(/obj/machinery/door/airlock) - mechanics_text = "    An airtight mechanical door. Most airlocks require an ID to open (wearing it on your ID slot is enough), and many have special access requirements to be on your ID. You can open an airlock by clicking on one, or simply walking into it, and clicking on an open airlock will close it. If the lights on the door flash red, you don't have the required access to open the airlock, and if they're consistently red, the door is bolted. Airlocks also require power to operate. In a situation without power, a crowbar can be used to force it open.

    Airlocks can also be hacked.
    Airlock hacking information:
    * Door bolts will lock the door, preventing it from being opened by any means until the bolts are raised again. Pulsing the correct wire will toggle the bolts, but cutting it will only drop them.
    * IDscan light indicates the door can scan ID cards. If the wire for this is pulsed it will cause the door to flash red, and cutting it will cause doors with restricted access to be unable to scan ID, essentially locking it.
    * The AI control light shows whether or not AI and robots can control the door. Pulsing is only temporary, while cutting is more permanent.
    * The test light shows whether the door has power or not. When turned off, the door can be opened with a crowbar.
    * If the door sparks, it is electrified. Pulsing the corresponding wire causes this to happen for 30 seconds, and cutting it electrifies the door until mended.
    * The check wiring light will turn on if the safety is turned off. This causes the airlock to close even when someone is standing on it, crushing them.
    * If the Check Timing Mechanism light is on then the door will close much faster than normal. Dangerous in conjuction with the Check Wiring light.

    Deconstruction
    To pull apart an airlock, you must open the maintenance panel, disable the power via hacking (or any other means), weld the door shut, and crowbar the electroncs out, cut the wires with a wirecutter, unsecure the whole assembly with a wrench, and then cut it into metal sheets with a welding tool." - antag_text = "    Electrifying a door makes for a good trap, hurting and stunning whoever touches it. The same goes for a combination of disabling the safety and timing mechanisms. Bolting a door can also help ensure privacy, or slow down those in search of you. It's also a good idea to disable AI interaction when needed." - disambiguator = "machine" - /datum/codex_entry/machine/asteroid_magnet name = "Asteroid Magnet" associated_paths = list(/obj/machinery/asteroid_magnet) diff --git a/code/modules/construction/girder.dm b/code/modules/construction/girder.dm index d0826c7d478..8b56095b8fc 100644 --- a/code/modules/construction/girder.dm +++ b/code/modules/construction/girder.dm @@ -14,7 +14,7 @@ density = FALSE can_atmos_pass = CANPASS_ALWAYS smoothing_groups = SMOOTH_GROUP_WALLS - smoothing_groups_with = SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WALLS uses_integrity = TRUE max_integrity = /datum/material/steel::wall_integrity * 0.5 /// The material that the girder walls are made of. @@ -51,7 +51,7 @@ 'icons/construction/wall/girder_reinforced/wall/wall_2.dmi', ) var/integrity_pct = atom_integrity / max_integrity - var/wanted_state = MAP(integrity_pct, 0, 1, 0, 2) + var/wanted_state = round(MAP(integrity_pct, 0, 1, 0, 2)) if(material_reinforcement) icon = reinforced_icons[wanted_state] // icon_state should be set by smoothing diff --git a/code/modules/construction/grille.dm b/code/modules/construction/grille.dm index 5650d8d141c..31d14545c6e 100644 --- a/code/modules/construction/grille.dm +++ b/code/modules/construction/grille.dm @@ -56,10 +56,6 @@ /obj/structure/grillen/screwdriver_act(mob/living/user, obj/item/tool) if(!Adjacent(user)) return ..() - var/obj/structure/window/window = locate() in get_turf(src) - if(!isnull(window)) - balloon_alert(user, "cannot reach!") - return TRUE if(shock(user, 75)) return TRUE balloon_alert_to_viewers("adjusting anchors...") @@ -117,36 +113,6 @@ return . = ..() -/obj/structure/grillen/attackby(obj/item/attacking_item, mob/user, params) - if(!istype(attacking_item, /obj/item/stack/sheet)) - return ..() - if(atom_integrity < (max_integrity * 0.7)) - balloon_alert(user, "grille is too damaged to attach a window!") - return TRUE - var/obj/item/stack/sheet/sheet = attacking_item - var/datum/material/material_instance = GET_MATERIAL_REF(sheet.material_type) - if(!material_instance) - stack_trace("null material_type: [sheet.material_type]") - return - var/obj/structure/window/window_type = material_instance.window_type - if(!window_type) - balloon_alert(user, "This cannot make a window!") - return TRUE - if(!isfloorturf(loc)) - balloon_alert(user, "what floor?") - return TRUE - for(var/atom/movable/other in loc) - if(other == src) - continue - if(other.density) - balloon_alert(user, "no room!") - return TRUE - var/obj/structure/window/window = new window_type(loc) - window.anchored = TRUE - window.state = WINDOW_OUT_OF_FRAME - window.setDir(dir) - return TRUE - /obj/structure/grillen/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) diff --git a/code/modules/construction/wall/wall_actual.dm b/code/modules/construction/wall/wall_actual.dm index 0b4d5acc3e6..61d813a1670 100644 --- a/code/modules/construction/wall/wall_actual.dm +++ b/code/modules/construction/wall/wall_actual.dm @@ -6,7 +6,7 @@ smoothing_flags = SMOOTH_BITMASK|SMOOTH_OBJ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS - smoothing_groups_with = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS + smoothing_groups_with = SMOOTH_GROUP_GRILLE + SMOOTH_GROUP_WALLS uses_integrity = TRUE max_integrity = /datum/material/steel::wall_integrity baseturfs = /turf/open/floor/plating @@ -35,6 +35,18 @@ QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) +/turf/closed/constructed_wall/ex_act(severity, target) + // TODO: ARMOR REFACTOR TO ACTUALLY MATTER FOR WALLS. kthx bai + if(!isnull(target)) + CRASH("I DIDNT TRAIN FOR THIS AT THE ACADEMY.") + switch(severity) + if(EXPLODE_DEVASTATE) + take_damage(max_integrity) + if(EXPLODE_HEAVY) + take_damage(max(FLOOR(max_integrity * 0.50, 1), 30)) + if(EXPLODE_LIGHT) + take_damage(FLOOR(max_integrity * 0.10, 1)) + /turf/closed/constructed_wall/proc/update_material_resistances() var/new_heat_resistance = material_plating.heat_resistance var/new_max_integrity = material_plating.wall_integrity @@ -58,6 +70,8 @@ visible_message(span_warning("\The [src] seems to warp slightly!")) /turf/closed/constructed_wall/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armor_penetration) + if(material_plating == /datum/material/centcomnium) + return 0 // dont feel like it champ last_damage = damage_amount return ..() diff --git a/code/modules/debris/debris_obj.dm b/code/modules/debris/debris_obj.dm index ad1b76a8cf3..a0f598e1205 100644 --- a/code/modules/debris/debris_obj.dm +++ b/code/modules/debris/debris_obj.dm @@ -7,8 +7,3 @@ debris_icon_state = DEBRIS_SPARKS debris_velocity = -10 debris_amount = 5 - -/obj/structure/window - debris_icon_state = DEBRIS_SPARKS - debris_velocity = -10 - debris_amount = 5 diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 1487fca5d03..128ceb9fc5f 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -11,8 +11,6 @@ /// 'normal' sound keys, index by them to get the friendly name. var/list/sound_pool = list( - "airlock" = "Door", - "airlock_pry" = "Door Prying", "console" = "Computer", "explosion" = "Explosion", "far_explosion" = "Distant Explosion", @@ -21,7 +19,6 @@ "alarm" = "Alarm", "beepsky" = "Securiton", "wall_decon" = "Wall Deconstruction", - "door_hack" = "Door Hacking", "tesla" = "Tesla Ball" ) /// 'Weird' sound keys, index by them to get the friendly name. @@ -45,7 +42,6 @@ ) /// Pool for generic hallucinations. Types can't key lists, so we need to invert the accesses. var/list/generic_pool = list( - "Fake bolted airlocks" = /datum/hallucination/bolts, "Imagined messages" = /datum/hallucination/chat, "Fake minor message" = /datum/hallucination/message, "Fake gas flood" = /datum/hallucination/fake_flood, diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm deleted file mode 100644 index bab3e3185f6..00000000000 --- a/code/modules/events/prison_break.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/round_event_control/grey_tide - name = "Grey Tide" - typepath = /datum/round_event/grey_tide - max_occurrences = 1 - min_players = 5 - -/datum/round_event/grey_tide - announceWhen = 50 - endWhen = 20 - var/list/area/areasToOpen = list() - var/list/potential_areas = list(/area/station/command, - /area/station/engineering, - /area/station/medical, - /area/station/security, - /area/station/cargo, - /area/station/science) - var/severity = 1 - - -/datum/round_event/grey_tide/setup() - announceWhen = rand(50, 60) - endWhen = rand(20, 30) - severity = rand(1,3) - for(var/i in 1 to severity) - var/picked_area = pick_n_take(potential_areas) - for(var/area/A in GLOB.areas) - if(istype(A, picked_area)) - areasToOpen += A - - -/datum/round_event/grey_tide/announce(fake) - if(areasToOpen && areasToOpen.len > 0) - priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.") - else - log_world("ERROR: Could not initiate grey-tide. No areas in the list!") - kill() - - -/datum/round_event/grey_tide/start() - for(var/area/A in areasToOpen) - for(var/obj/machinery/light/L in A) - L.flicker(10) - -/datum/round_event/grey_tide/end() - for(var/area/A in areasToOpen) - for(var/obj/O in A) - if(istype(O, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/temp = O - temp.locked = FALSE - temp.update_appearance() - else if(istype(O, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/temp = O - if(temp.critical_machine) //Skip doors in critical positions, such as the SM chamber. - continue - temp.prison_open() - else if(istype(O, /obj/machinery/door_timer)) - var/obj/machinery/door_timer/temp = O - temp.timer_end(forced = TRUE) - diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 772a387baba..b525242c6cf 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -40,7 +40,7 @@ random_color = FALSE var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/fireball, + /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) /mob/living/simple_animal/hostile/carp/ranged/Initialize(mapload) @@ -62,9 +62,9 @@ /mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool gold_core_spawnable = HOSTILE_SPAWN allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, - /obj/projectile/magic/door, /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) //thanks Lett1 + /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) //thanks Lett1 /mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology gold_core_spawnable = HOSTILE_SPAWN allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, - /obj/projectile/magic/door, /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) + /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 071ba630777..e476c8e86ca 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -13,7 +13,6 @@ GLOBAL_LIST_INIT(hallucination_list, list( /datum/hallucination/stationmessage = 7, /datum/hallucination/fake_flood = 7, /datum/hallucination/stray_bullet = 7, - /datum/hallucination/bolts = 7, /datum/hallucination/items_other = 7, /datum/hallucination/husks = 7, /datum/hallucination/items = 4, @@ -722,89 +721,6 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.client.images.Remove(delusion) return ..() -/datum/hallucination/bolts - var/list/airlocks_to_hit - var/list/locks - var/next_action = 0 - var/locking = TRUE - -/datum/hallucination/bolts/New(mob/living/carbon/C, forced, door_number) - set waitfor = FALSE - ..() - if(!door_number) - door_number = rand(0,4) //if 0 bolts all visible doors - var/count = 0 - feedback_details += "Door amount: [door_number]" - - for(var/obj/machinery/door/airlock/A in range(7, target)) - if(count>door_number && door_number>0) - break - if(!A.density) - continue - count++ - LAZYADD(airlocks_to_hit, A) - - if(!LAZYLEN(airlocks_to_hit)) //no valid airlocks in sight - qdel(src) - return - - START_PROCESSING(SSfastprocess, src) - -/datum/hallucination/bolts/process(delta_time) - next_action -= (delta_time * 10) - if (next_action > 0) - return - - if (locking) - var/atom/next_airlock = pop(airlocks_to_hit) - if (next_airlock) - var/obj/effect/hallucination/fake_door_lock/lock = new(get_turf(next_airlock)) - lock.target = target - lock.airlock = next_airlock - LAZYADD(locks, lock) - - if (!LAZYLEN(airlocks_to_hit)) - locking = FALSE - next_action = 10 SECONDS - return - else - var/obj/effect/hallucination/fake_door_lock/next_unlock = popleft(locks) - if (next_unlock) - next_unlock.unlock() - else - qdel(src) - return - - next_action = rand(4, 12) - -/datum/hallucination/bolts/Destroy() - . = ..() - QDEL_LIST(locks) - STOP_PROCESSING(SSfastprocess, src) - -/obj/effect/hallucination/fake_door_lock - layer = CLOSED_DOOR_LAYER + 1 //for Bump priority - plane = GAME_PLANE - var/image/bolt_light - var/obj/machinery/door/airlock/airlock - -/obj/effect/hallucination/fake_door_lock/proc/lock() - bolt_light = image(airlock.overlays_file, get_turf(airlock), "lights_bolts",layer=airlock.layer+0.1) - if(target.client) - target.client.images |= bolt_light - target.playsound_local(get_turf(airlock), 'sound/machines/boltsdown.ogg',30,0,3) - -/obj/effect/hallucination/fake_door_lock/proc/unlock() - if(target.client) - target.client.images.Remove(bolt_light) - target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3) - qdel(src) - -/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(mover == target && airlock.density) - return FALSE - /datum/hallucination/chat /datum/hallucination/chat/New(mob/living/carbon/C, forced = TRUE, force_radio, specific_message) diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 4c53b7469e9..93d76b7b87c 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -41,9 +41,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(ismachinery(O)) var/obj/machinery/M = O M.power_change() - if(istype(O, /obj/machinery/button)) - var/obj/machinery/button/B = O - B.setup_device() if(holoitem) O.flags_1 |= HOLOGRAM_1 diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 4c42d8dbe33..f7ded843571 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -304,10 +304,6 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf holo_machine.flags_1 |= NODECONSTRUCT_1 holo_machine.power_change() - if(istype(holo_machine, /obj/machinery/button)) - var/obj/machinery/button/holo_button = holo_machine - holo_button.setup_device() - spawning_simulation = FALSE ///this qdels holoitems that should no longer exist for whatever reason diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 4a95da05f48..584c6d9cec8 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -186,10 +186,6 @@ eventstarted = TRUE - for(var/obj/structure/window/W in currentarea) - if(W.flags_1&NODECONSTRUCT_1) // Just in case: only holo-windows - qdel(W) - for(var/mob/M in currentarea) to_chat(M, span_userdanger("FIGHT!")) diff --git a/code/modules/industrial_lift/tram_override_objects.dm b/code/modules/industrial_lift/tram_override_objects.dm index 4dc2240a70c..5b83516eebe 100644 --- a/code/modules/industrial_lift/tram_override_objects.dm +++ b/code/modules/industrial_lift/tram_override_objects.dm @@ -1,39 +1,4 @@ -/** - * the tram has a few objects mapped onto it at roundstart, by default many of those objects have unwanted properties - * for example grilles and windows have the atmos_sensitive element applied to them, which makes them register to - * themselves moving to re register signals onto the turf via connect_loc. this is bad and dumb since it makes the tram - * more expensive to move. - * - * if you map something on to the tram, make SURE if possible that it doesnt have anythign reacting to its own movement - * it will make the tram more expensive to move and we dont want that because we dont want to return to the days where - * the tram took a third of the tick per movement when its just carrying its default mapped in objects - */ -/obj/structure/grille/tram/Initialize(mapload) - . = ..() - //RemoveElement(/datum/element/atmos_sensitive, mapload) - //atmos_sensitive applies connect_loc which 1. reacts to movement in order to 2. unregister and register signals to - //the old and new locs. we dont want that, pretend these grilles and windows are plastic or something idk - -/obj/structure/window/reinforced/shuttle/tram/Initialize(mapload, direct) - . = ..() - //RemoveElement(/datum/element/atmos_sensitive, mapload) - /obj/structure/shuttle/engine/propulsion/in_wall/tram //if this has opacity, then every movement of the tram causes lighting updates //DO NOT put something on the tram roundstart that has opacity, it WILL overload SSlighting opacity = FALSE - -/obj/machinery/door/window/left/tram -/obj/machinery/door/window/right/tram - -/obj/machinery/door/window/left/tram/Initialize(mapload, set_dir, unres_sides) - . = ..() - //RemoveElement(/datum/element/atmos_sensitive, mapload) - -/obj/machinery/door/window/right/tram/Initialize(mapload, set_dir, unres_sides) - . = ..() - //RemoveElement(/datum/element/atmos_sensitive, mapload) - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/left/tram, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/right/tram, 0) - diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index f78633cc1c3..ab82180d546 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -254,7 +254,6 @@ GLOBAL_LIST_INIT(job_display_order, list( if(pinpad_key) var/pin = SSid_access.get_static_pincode(pinpad_key) - spawned.mind.set_note(NOTES_DOOR_CODES, "The pin to your doors is [pin]") to_chat(player_client, span_obviousnotice("You remember the pin to your doors: [pin]")) /datum/job/proc/announce_job(mob/living/joining_mob) diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index befd60d93ac..c8f91e71d98 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -31,10 +31,6 @@ family_heirlooms = list(/obj/item/lighter, /obj/item/lighter/greyscale, /obj/item/storage/box/matches) - mail_goodies = list( - /obj/item/rpd_upgrade/unwrench = 30, - ) - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN rpg_title = "Aeromancer" diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 0c74c4c3960..808ee7382aa 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -405,13 +405,6 @@ * * close: boolean, the state you want the curtains in. */ /datum/mafia_controller/proc/toggle_night_curtains(close) - for(var/obj/machinery/door/poddoor/D in INSTANCES_OF(/obj/machinery/door)) //I really dislike pathing of these - if(D.id != "mafia") //so as to not trigger shutters on station, lol - continue - if(close) - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) - else - INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/poddoor, open)) /** * The actual start of night for players. Mostly info is given at the start of the night as the end of the night is when votes and actions are submitted and tried. diff --git a/code/modules/mapfluff/centcom/nuke_ops.dm b/code/modules/mapfluff/centcom/nuke_ops.dm index 02bf8a50f8e..3765b6f178d 100644 --- a/code/modules/mapfluff/centcom/nuke_ops.dm +++ b/code/modules/mapfluff/centcom/nuke_ops.dm @@ -22,24 +22,3 @@ desc = "A grey keycard with Lopez's Information on it. This is your ticket into the Fridge in Firebase Balthazord." color = "#636363" puzzle_id = "syndicate_fridge" - -//keycard doors -/obj/machinery/door/puzzle/keycard/syndicate_bomb - name = "Syndicate Ordinance Laboratory" - desc = "Locked. Looks like you'll need a special access key to get in." - puzzle_id = "syndicate_bomb" - -/obj/machinery/door/puzzle/keycard/syndicate_bio - name = "Syndicate Bio-Weapon Laboratory" - desc = "Locked. Looks like you'll need a special access key to get in." - puzzle_id = "syndicate_bio" - -/obj/machinery/door/puzzle/keycard/syndicate_chem - name = "Syndicate Chemical Manufacturing Plant" - desc = "Locked. Looks like you'll need a special access key to get in" - puzzle_id = "syndicate_chem" - -/obj/machinery/door/puzzle/keycard/syndicate_fridge - name = "The Walk-In Fridge" - desc = "Locked. Lopez sure runs a tight galley." - puzzle_id = "syndicate_fridge" diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm deleted file mode 100644 index dac5534a62c..00000000000 --- a/code/modules/mapfluff/ruins/objects_and_mobs/necropolis_gate.dm +++ /dev/null @@ -1,431 +0,0 @@ -//The necropolis gate is used to call forth Legion from the Necropolis. -/obj/structure/necropolis_gate - name = "necropolis gate" - desc = "A massive stone gateway." - icon = 'icons/effects/96x96.dmi' - icon_state = "gate_full" - flags_1 = ON_BORDER_1 - appearance_flags = 0 - layer = TABLE_LAYER - anchored = TRUE - density = TRUE - pixel_x = -32 - pixel_y = -32 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_outer_range = 8 - light_color = LIGHT_COLOR_LAVA - var/open = FALSE - var/changing_openness = FALSE - var/locked = FALSE - var/static/mutable_appearance/top_overlay - var/static/mutable_appearance/door_overlay - var/static/mutable_appearance/dais_overlay - var/obj/structure/opacity_blocker/sight_blocker - var/sight_blocker_distance = 1 - -/obj/structure/necropolis_gate/Initialize(mapload) - . = ..() - setDir(SOUTH) - var/turf/sight_blocker_turf = get_turf(src) - if(sight_blocker_distance) - for(var/i in 1 to sight_blocker_distance) - if(!sight_blocker_turf) - break - sight_blocker_turf = get_step(sight_blocker_turf, NORTH) - if(sight_blocker_turf) - sight_blocker = new (sight_blocker_turf) //we need to block sight in a different spot than most things do - sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance) - icon_state = "gate_bottom" - top_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_top") - top_overlay.layer = EDGED_TURF_LAYER - add_overlay(top_overlay) - door_overlay = mutable_appearance('icons/effects/96x96.dmi', "door") - door_overlay.layer = EDGED_TURF_LAYER - add_overlay(door_overlay) - dais_overlay = mutable_appearance('icons/effects/96x96.dmi', "gate_dais") - dais_overlay.layer = CLOSED_TURF_LAYER - add_overlay(dais_overlay) - - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit), - ) - - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/necropolis_gate/Destroy(force) - if(force) - qdel(sight_blocker, TRUE) - . = ..() - else - return QDEL_HINT_LETMELIVE - -/obj/structure/necropolis_gate/singularity_pull() - return 0 - -/obj/structure/necropolis_gate/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(border_dir != dir) - return TRUE - -/obj/structure/necropolis_gate/proc/on_exit(datum/source, atom/movable/leaving, direction) - SIGNAL_HANDLER - - if(leaving.movement_type & PHASING) - return - - if(leaving == src) - return // Let's not block ourselves. - - if (direction == dir && density) - leaving.Bump(src) - return COMPONENT_ATOM_BLOCK_EXIT - -/obj/structure/opacity_blocker - icon = 'icons/effects/96x96.dmi' - icon_state = "gate_blocker" - layer = EDGED_TURF_LAYER - pixel_x = -32 - pixel_y = -32 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - opacity = TRUE - anchored = TRUE - -/obj/structure/opacity_blocker/singularity_pull() - return 0 - -/obj/structure/opacity_blocker/Destroy(force) - if(force) - . = ..() - else - return QDEL_HINT_LETMELIVE - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/structure/necropolis_gate/attack_hand(mob/user, list/modifiers) - if(locked) - to_chat(user, span_boldannounce("It's [open ? "stuck open":"locked"].")) - return - toggle_the_gate(user) - return ..() - -/obj/structure/necropolis_gate/proc/toggle_the_gate(mob/user, legion_damaged) - if(changing_openness) - return - changing_openness = TRUE - var/turf/T = get_turf(src) - if(open) - new /obj/effect/temp_visual/necropolis(T) - visible_message(span_boldwarning("The door slams closed!")) - sleep(1) - playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 80000) - sleep(1) - set_density(TRUE) - sleep(1) - var/turf/sight_blocker_turf = get_turf(src) - if(sight_blocker_distance) - for(var/i in 1 to sight_blocker_distance) - if(!sight_blocker_turf) - break - sight_blocker_turf = get_step(sight_blocker_turf, NORTH) - if(sight_blocker_turf) - sight_blocker.pixel_y = initial(sight_blocker.pixel_y) - (32 * sight_blocker_distance) - sight_blocker.forceMove(sight_blocker_turf) - sleep(2.5) - playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, TRUE, frequency = 15000) - add_overlay(door_overlay) - open = FALSE - else - cut_overlay(door_overlay) - new /obj/effect/temp_visual/necropolis/open(T) - sleep(2) - visible_message(span_warning("The door starts to grind open...")) - playsound(T, 'sound/effects/stonedoor_openclose.ogg', 300, TRUE, frequency = 20000) - sleep(22) - sight_blocker.forceMove(src) - sleep(5) - set_density(FALSE) - sleep(5) - open = TRUE - changing_openness = FALSE - return TRUE - -/obj/structure/necropolis_gate/locked - locked = TRUE - -GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) -/obj/structure/necropolis_gate/legion_gate - desc = "A tremendous, impossibly large gateway, set into a massive tower of stone." - sight_blocker_distance = 2 - -/obj/structure/necropolis_gate/legion_gate/Initialize(mapload) - . = ..() - GLOB.necropolis_gate = src - -/obj/structure/necropolis_gate/legion_gate/Destroy(force) - if(force) - if(GLOB.necropolis_gate == src) - GLOB.necropolis_gate = null - . = ..() - else - return QDEL_HINT_LETMELIVE - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/structure/necropolis_gate/legion_gate/attack_hand(mob/user, list/modifiers) - if(!open && !changing_openness) - var/safety = tgui_alert(user, "You think this might be a bad idea...", "Knock on the door?", list("Proceed", "Abort")) - if(safety == "Abort" || !in_range(src, user) || !src || open || changing_openness || user.incapacitated()) - return - user.visible_message(span_warning("[user] knocks on [src]..."), span_boldannounce("You tentatively knock on [src]...")) - playsound(user.loc, 'sound/effects/shieldbash.ogg', 100, TRUE) - sleep(50) - return ..() - -/obj/structure/necropolis_gate/legion_gate/toggle_the_gate(mob/user, legion_damaged) - if(open) - return - . = ..() - if(.) - locked = TRUE - var/turf/T = get_turf(src) - visible_message(span_userdanger("Something horrible emerges from the Necropolis!")) - if(legion_damaged) - message_admins("Legion took damage while the necropolis gate was closed, and has released itself!") - log_game("Legion took damage while the necropolis gate was closed and released itself.") - else - message_admins("[user ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!") - log_game("[user ? key_name(user) : "Unknown"] released Legion.") - - var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg') - for(var/mob/M in GLOB.player_list) - if(M.z == z) - to_chat(M, span_userdanger("Discordant whispers flood your mind in a thousand voices. Each one speaks your name, over and over. Something horrible has been released.")) - M.playsound_local(T, null, 100, FALSE, 0, FALSE, pressure_affected = FALSE, sound_to_use = legion_sound) - flash_color(M, flash_color = "#FF0000", flash_time = 50) - var/mutable_appearance/release_overlay = mutable_appearance('icons/effects/effects.dmi', "legiondoor") - notify_ghosts("Legion has been released in the [get_area(src)]!", source = src, alert_overlay = release_overlay, action = NOTIFY_JUMP, flashwindow = FALSE) - -/obj/effect/temp_visual/necropolis - icon = 'icons/effects/96x96.dmi' - icon_state = "door_closing" - appearance_flags = 0 - duration = 6 - layer = EDGED_TURF_LAYER - pixel_x = -32 - pixel_y = -32 - -/obj/effect/temp_visual/necropolis/open - icon_state = "door_opening" - duration = 38 - -/obj/structure/necropolis_arch - name = "necropolis arch" - desc = "A massive arch over the necropolis gate, set into a massive tower of stone." - icon = 'icons/effects/160x160.dmi' - icon_state = "arch_full" - appearance_flags = 0 - layer = TABLE_LAYER - anchored = TRUE - pixel_x = -64 - pixel_y = -40 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/open = FALSE - var/static/mutable_appearance/top_overlay - -/obj/structure/necropolis_arch/Initialize(mapload) - . = ..() - icon_state = "arch_bottom" - top_overlay = mutable_appearance('icons/effects/160x160.dmi', "arch_top") - top_overlay.layer = EDGED_TURF_LAYER - add_overlay(top_overlay) - -/obj/structure/necropolis_arch/singularity_pull() - return 0 - -/obj/structure/necropolis_arch/Destroy(force) - if(force) - . = ..() - else - return QDEL_HINT_LETMELIVE - -#define STABLE 0 //The tile is stable and won't collapse/sink when crossed. -#define COLLAPSE_ON_CROSS 1 //The tile is unstable and will temporary become unusable when crossed. -#define DESTROY_ON_CROSS 2 //The tile is nearly broken and will permanently become unusable when crossed. -#define UNIQUE_EFFECT 3 //The tile has some sort of unique effect when crossed. -//stone tiles for boss arenas -/obj/structure/stone_tile - name = "stone tile" - icon = 'icons/turf/boss_floors.dmi' - icon_state = "pristine_tile1" - layer = ABOVE_OPEN_TURF_LAYER - anchored = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/tile_key = "pristine_tile" - var/tile_random_sprite_max = 24 - var/fall_on_cross = STABLE //If the tile has some sort of effect when crossed - var/fallen = FALSE //If the tile is unusable - var/falling = FALSE //If the tile is falling - -/obj/structure/stone_tile/Initialize(mapload) - . = ..() - icon_state = "[tile_key][rand(1, tile_random_sprite_max)]" - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/stone_tile/Destroy(force) - if(force || fallen) - . = ..() - else - return QDEL_HINT_LETMELIVE - -/obj/structure/stone_tile/singularity_pull() - return - -/obj/structure/stone_tile/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == src) - return - if(falling || fallen) - return - var/turf/T = get_turf(src) - if(!islava(T) && !ischasm(T)) //nothing to sink or fall into - return - var/obj/item/I - if(istype(AM, /obj/item)) - I = AM - var/mob/living/L - if(isliving(AM)) - L = AM - switch(fall_on_cross) - if(COLLAPSE_ON_CROSS, DESTROY_ON_CROSS) - if((I && I.w_class >= WEIGHT_CLASS_BULKY) || (L && !(L.movement_type & FLYING) && L.mob_size >= MOB_SIZE_HUMAN)) //too heavy! too big! aaah! - INVOKE_ASYNC(src, PROC_REF(collapse)) - if(UNIQUE_EFFECT) - crossed_effect(AM) - -/obj/structure/stone_tile/proc/collapse() - falling = TRUE - var/break_that_sucker = fall_on_cross == DESTROY_ON_CROSS - playsound(src, 'sound/effects/pressureplate.ogg', 50, TRUE) - Shake(-1, -1, 25) - sleep(5) - if(break_that_sucker) - playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) - else - playsound(src, 'sound/mecha/mechmove04.ogg', 50, TRUE) - animate(src, alpha = 0, pixel_y = pixel_y - 3, time = 5) - fallen = TRUE - if(break_that_sucker) - QDEL_IN(src, 10) - else - addtimer(CALLBACK(src, PROC_REF(rebuild)), 55) - -/obj/structure/stone_tile/proc/rebuild() - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - 5 - animate(src, alpha = initial(alpha), pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 30) - sleep(30) - falling = FALSE - fallen = FALSE - -/obj/structure/stone_tile/proc/crossed_effect(atom/movable/AM) - return - -/obj/structure/stone_tile/block - name = "stone block" - icon_state = "pristine_block1" - tile_key = "pristine_block" - tile_random_sprite_max = 4 - -/obj/structure/stone_tile/slab - name = "stone slab" - icon_state = "pristine_slab1" - tile_key = "pristine_slab" - tile_random_sprite_max = 4 - -/obj/structure/stone_tile/center - name = "stone center tile" - icon_state = "pristine_center1" - tile_key = "pristine_center" - tile_random_sprite_max = 4 - -/obj/structure/stone_tile/surrounding - name = "stone surrounding slab" - icon_state = "pristine_surrounding1" - tile_key = "pristine_surrounding" - tile_random_sprite_max = 2 - -/obj/structure/stone_tile/surrounding_tile - name = "stone surrounding tile" - icon_state = "pristine_surrounding_tile1" - tile_key = "pristine_surrounding_tile" - tile_random_sprite_max = 2 - -//cracked stone tiles -/obj/structure/stone_tile/cracked - name = "cracked stone tile" - icon_state = "cracked_tile1" - tile_key = "cracked_tile" - -/obj/structure/stone_tile/block/cracked - name = "cracked stone block" - icon_state = "cracked_block1" - tile_key = "cracked_block" - -/obj/structure/stone_tile/slab/cracked - name = "cracked stone slab" - icon_state = "cracked_slab1" - tile_key = "cracked_slab" - tile_random_sprite_max = 1 - -/obj/structure/stone_tile/center/cracked - name = "cracked stone center tile" - icon_state = "cracked_center1" - tile_key = "cracked_center" - -/obj/structure/stone_tile/surrounding/cracked - name = "cracked stone surrounding slab" - icon_state = "cracked_surrounding1" - tile_key = "cracked_surrounding" - tile_random_sprite_max = 1 - -/obj/structure/stone_tile/surrounding_tile/cracked - name = "cracked stone surrounding tile" - icon_state = "cracked_surrounding_tile1" - tile_key = "cracked_surrounding_tile" - -//burnt stone tiles -/obj/structure/stone_tile/burnt - name = "burnt stone tile" - icon_state = "burnt_tile1" - tile_key = "burnt_tile" - -/obj/structure/stone_tile/block/burnt - name = "burnt stone block" - icon_state = "burnt_block1" - tile_key = "burnt_block" - -/obj/structure/stone_tile/slab/burnt - name = "burnt stone slab" - icon_state = "burnt_slab1" - tile_key = "burnt_slab" - -/obj/structure/stone_tile/center/burnt - name = "burnt stone center tile" - icon_state = "burnt_center1" - tile_key = "burnt_center" - -/obj/structure/stone_tile/surrounding/burnt - name = "burnt stone surrounding slab" - icon_state = "burnt_surrounding1" - tile_key = "burnt_surrounding" - -/obj/structure/stone_tile/surrounding_tile/burnt - name = "burnt stone surrounding tile" - icon_state = "burnt_surrounding_tile1" - tile_key = "burnt_surrounding_tile" - -#undef STABLE -#undef COLLAPSE_ON_CROSS -#undef DESTROY_ON_CROSS -#undef UNIQUE_EFFECT diff --git a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm index 4050b87abcb..a4aef82d057 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm @@ -20,136 +20,10 @@ name = "Vault Raider Objectives" info = "Objectives #1: Find out what is hidden in Kosmicheskaya Stantsiya 13s Vault" -/// Vault controller for use on the derelict/KS13. -/obj/machinery/computer/vaultcontroller - name = "vault controller" - desc = "It seems to be powering and controlling the vault locks." - icon_screen = "power" - icon_keyboard = "power_key" - light_color = LIGHT_COLOR_DIM_YELLOW - use_power = NO_POWER_USE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - - var/obj/structure/cable/attached_cable - var/obj/machinery/door/airlock/vault/derelict/door1 - var/obj/machinery/door/airlock/vault/derelict/door2 - var/locked = TRUE - var/siphoned_power = 0 - var/siphon_max = 1e7 - /obj/machinery/computer/monitor/examine(mob/user) . = ..() . += span_notice("It appears to be powered via a cable connector.") -//Checks for cable connection, charges if possible. -/obj/machinery/computer/vaultcontroller/process() - if(siphoned_power >= siphon_max) - return - update_cable() - if(attached_cable) - attempt_siphon() - -///Looks for a cable connection beneath the machine. -/obj/machinery/computer/vaultcontroller/proc/update_cable() - var/turf/T = get_turf(src) - attached_cable = locate(/obj/structure/cable) in T - -///Initializes airlock links. -/obj/machinery/computer/vaultcontroller/proc/find_airlocks() - for(var/obj/machinery/door/airlock/A in INSTANCES_OF(/obj/machinery/door)) - if(A.id_tag == "derelictvault") - if(!door1) - door1 = A - continue - if(door1 && !door2) - door2 = A - break - -///Tries to charge from powernet excess, no upper limit except max charge. -/obj/machinery/computer/vaultcontroller/proc/attempt_siphon() - var/surpluspower = clamp(attached_cable.surplus(), 0, (siphon_max - siphoned_power)) - if(surpluspower) - attached_cable.add_load(surpluspower) - siphoned_power += surpluspower - -///Handles the doors closing -/obj/machinery/computer/vaultcontroller/proc/cycle_close(obj/machinery/door/airlock/A) - A.dont_close_on_dense_objects = FALSE //Make sure its forced closed, always - A.unbolt() - A.close() - A.bolt() - -///Handles the doors opening -/obj/machinery/computer/vaultcontroller/proc/cycle_open(obj/machinery/door/airlock/A) - A.unbolt() - A.open() - A.bolt() - -///Attempts to lock the vault doors -/obj/machinery/computer/vaultcontroller/proc/lock_vault() - if(door1 && !door1.density) - cycle_close(door1) - if(door2 && !door2.density) - cycle_close(door2) - if(door1.density && door1.locked && door2.density && door2.locked) - locked = TRUE - -///Attempts to unlock the vault doors -/obj/machinery/computer/vaultcontroller/proc/unlock_vault() - if(door1?.density) - cycle_open(door1) - if(door2?.density) - cycle_open(door2) - if(!door1.density && door1.locked && !door2.density && door2.locked) - locked = FALSE - -///Attempts to lock/unlock vault doors, if machine is charged. -/obj/machinery/computer/vaultcontroller/proc/activate_lock() - if(siphoned_power < siphon_max) - return - if(!door1 || !door2) - find_airlocks() - if(locked) - unlock_vault() - else - lock_vault() - -/obj/machinery/computer/vaultcontroller/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "VaultController", name) - ui.open() - -/obj/machinery/computer/vaultcontroller/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("togglelock") - activate_lock() - -/obj/machinery/computer/vaultcontroller/ui_data() - var/list/data = list() - data["stored"] = siphoned_power - data["max"] = siphon_max - data["doorstatus"] = locked - return data - -///Airlock that can't be deconstructed, broken or hacked. -/obj/machinery/door/airlock/vault/derelict - locked = TRUE - move_resist = INFINITY - use_power = NO_POWER_USE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - id_tag = "derelictvault" - -///Overrides screwdriver attack to prevent all deconstruction and hacking. -/obj/machinery/door/airlock/vault/derelict/attackby(obj/item/C, mob/user, params) - if(C.tool_behaviour == TOOL_SCREWDRIVER) - return - ..() - /obj/structure/fluff/oldturret name = "broken turret" desc = "An obsolete model of turret, long non-functional." diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm deleted file mode 100644 index f056c27d2d8..00000000000 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ /dev/null @@ -1,640 +0,0 @@ -GLOBAL_VAR_INIT(hhStorageTurf, null) -GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) - -/obj/item/hilbertshotel - name = "Hilbert's Hotel" - desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." - icon_state = "hilbertshotel" - w_class = WEIGHT_CLASS_SMALL - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/datum/map_template/hilbertshotel/hotelRoomTemp - var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty - var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore - var/list/activeRooms = list() - var/list/storedRooms = list() - var/storageTurf - //Lore Stuff - var/ruinSpawned = FALSE - -/obj/item/hilbertshotel/Initialize(mapload) - . = ..() - //Load templates - INVOKE_ASYNC(src, PROC_REF(prepare_rooms)) - -/obj/item/hilbertshotel/proc/prepare_rooms() - hotelRoomTemp = new() - hotelRoomTempEmpty = new() - hotelRoomTempLore = new() - var/area/currentArea = get_area(src) - if(currentArea.type == /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom) - ruinSpawned = TRUE - -/obj/item/hilbertshotel/Destroy() - ejectRooms() - return ..() - -/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user) - if(M.mind) - to_chat(user, span_notice("You invite [M] to the hotel.")) - promptAndCheckIn(user, M) - else - to_chat(user, span_warning("[M] is not intelligent enough to understand how to use this device!")) - -/obj/item/hilbertshotel/attack_self(mob/user) - . = ..() - promptAndCheckIn(user, user) - -/obj/item/hilbertshotel/attack_tk(mob/user) - to_chat(user, span_notice("\The [src] actively rejects your mind as the bluespace energies surrounding it disrupt your telekinesis.")) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user, mob/target) - var/chosenRoomNumber - - // Input text changes depending on if you're using this in yourself or someone else. - if(user == target) - chosenRoomNumber = input(target, "What number room will you be checking into?", "Room Number") as null|num - else - chosenRoomNumber = input(target, "[user] is inviting you to enter \the [src]. What number room will you be checking into?", "Room Number") as null|num - - if(!chosenRoomNumber) - return - if(chosenRoomNumber > SHORT_REAL_LIMIT) - to_chat(target, span_warning("You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!")) - return - if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber))) - to_chat(target, span_warning("That is not a valid room number!")) - return - - // Orb is not adjacent to the target. No teleporties. - if(!src.Adjacent(target)) - to_chat(target, span_warning("You too far away from \the [src] to enter it!")) - - // If the target is incapacitated after selecting a room, they're not allowed to teleport. - if(target.incapacitated()) - to_chat(target, span_warning("You aren't able to activate \the [src] anymore!")) - - // Has the user thrown it away or otherwise disposed of it such that it's no longer in their hands or in some storage connected to them? - if(!(get_atom_on_turf(src, /mob) == user)) - if(user == target) - to_chat(user, span_warning("\The [src] is no longer in your possession!")) - else - to_chat(target, span_warning("\The [src] is no longer in the possession of [user]!")) - return - - // If the player is using it on themselves, we've got some logic to deal with. - // The user should drop the item before teleporting, but we're not going to force the item to be dropped if it can't be done normally... - if(user == target) - // The item should be on the user or in the user's inventory somewhere. - // However, if they're not holding it, it may be in a pocket? In a backpack? Who knows! Still, they can't just drop it to the floor anymore... - if(!user.get_held_index_of_item(src)) - to_chat(user, span_warning("You try to drop \the [src], but it's too late! It's no longer in your hands! Prepare for unforeseen consequences...")) - // Okay, so they HAVE to be holding it here, because it's in their hand from the above check. Try to drop the item and if it fails, oh dear... - else if(!user.dropItemToGround(src)) - to_chat(user, span_warning("You can't seem to drop \the [src]! It must be stuck to your hand somehow! Prepare for unforeseen consequences...")) - - if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize - if(!GLOB.hhStorageTurf) - var/datum/map_template/hilbertshotelstorage/storageTemp = new() - var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) - storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) - GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) - else - storageTurf = GLOB.hhStorageTurf - if(tryActiveRoom(chosenRoomNumber, target)) - return - if(tryStoredRoom(chosenRoomNumber, target)) - return - sendToNewRoom(chosenRoomNumber, target) - -/obj/item/hilbertshotel/proc/tryActiveRoom(roomNumber, mob/user) - if(activeRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] - do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) - return TRUE - return FALSE - -/obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user) - if(storedRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) - hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) - var/turfNumber = 1 - for(var/x in 0 to hotelRoomTemp.width-1) - for(var/y in 0 to hotelRoomTemp.height-1) - for(var/atom/movable/A in storedRooms["[roomNumber]"][turfNumber]) - if(istype(A.loc, /obj/item/abstracthotelstorage))//Don't want to recall something thats been moved - A.forceMove(locate(roomReservation.bottom_left_coords[1] + x, roomReservation.bottom_left_coords[2] + y, roomReservation.bottom_left_coords[3])) - turfNumber++ - for(var/obj/item/abstracthotelstorage/S in storageTurf) - if((S.roomNumber == roomNumber) && (S.parentSphere == src)) - qdel(S) - storedRooms -= "[roomNumber]" - activeRooms["[roomNumber]"] = roomReservation - linkTurfs(roomReservation, roomNumber) - do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) - return TRUE - return FALSE - -/obj/item/hilbertshotel/proc/sendToNewRoom(roomNumber, mob/user) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) - if(ruinSpawned && roomNumber == GLOB.hhMysteryRoomNumber) - hotelRoomTempLore.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) - else - hotelRoomTemp.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) - activeRooms["[roomNumber]"] = roomReservation - linkTurfs(roomReservation, roomNumber) - do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) - -/obj/item/hilbertshotel/proc/linkTurfs(datum/turf_reservation/currentReservation, currentRoomnumber) - var/area/misc/hilbertshotel/currentArea = get_area(locate(currentReservation.bottom_left_coords[1], currentReservation.bottom_left_coords[2], currentReservation.bottom_left_coords[3])) - currentArea.name = "Hilbert's Hotel Room [currentRoomnumber]" - currentArea.parentSphere = src - currentArea.storageTurf = storageTurf - currentArea.roomnumber = currentRoomnumber - currentArea.reservation = currentReservation - for(var/turf/closed/indestructible/hoteldoor/door in currentArea) - door.parentSphere = src - door.desc = "The door to this hotel room. The placard reads 'Room [currentRoomnumber]'. Strangely, this door doesn't even seem openable. The doorknob, however, seems to buzz with unusual energy...
    [span_info("Alt-Click to look through the peephole.")]" - for(var/turf/open/space/bluespace/BSturf in currentArea) - BSturf.parentSphere = src - -/obj/item/hilbertshotel/proc/ejectRooms() - if(activeRooms.len) - for(var/x in activeRooms) - var/datum/turf_reservation/room = activeRooms[x] - for(var/i in 0 to hotelRoomTemp.width-1) - for(var/j in 0 to hotelRoomTemp.height-1) - for(var/atom/movable/A in locate(room.bottom_left_coords[1] + i, room.bottom_left_coords[2] + j, room.bottom_left_coords[3])) - if(ismob(A)) - var/mob/M = A - if(M.mind) - to_chat(M, span_warning("As the sphere breaks apart, you're suddenly ejected into the depths of space!")) - var/max = world.maxx-TRANSITIONEDGE - var/min = 1+TRANSITIONEDGE - var/list/possible_transtitons = list() - for(var/AZ in SSmapping.z_list) - var/datum/space_level/D = AZ - if (D.linkage == CROSSLINKED) - possible_transtitons += D.z_value - var/_z = pick(possible_transtitons) - var/_x = rand(min,max) - var/_y = rand(min,max) - var/turf/T = locate(_x, _y, _z) - A.forceMove(T) - qdel(room) - - if(storedRooms.len) - for(var/x in storedRooms) - var/list/atomList = storedRooms[x] - for(var/atom/movable/A in atomList) - var/max = world.maxx-TRANSITIONEDGE - var/min = 1+TRANSITIONEDGE - var/list/possible_transtitons = list() - for(var/AZ in SSmapping.z_list) - var/datum/space_level/D = AZ - if (D.linkage == CROSSLINKED) - possible_transtitons += D.z_value - var/_z = pick(possible_transtitons) - var/_x = rand(min,max) - var/_y = rand(min,max) - var/turf/T = locate(_x, _y, _z) - A.forceMove(T) - -//Template Stuff -/datum/map_template/hilbertshotel - name = "Hilbert's Hotel Room" - mappath = "_maps/templates/hilbertshotel.dmm" - var/landingZoneRelativeX = 2 - var/landingZoneRelativeY = 8 - -/datum/map_template/hilbertshotel/empty - name = "Empty Hilbert's Hotel Room" - mappath = "_maps/templates/hilbertshotelempty.dmm" - -/datum/map_template/hilbertshotel/lore - name = "Doctor Hilbert's Deathbed" - mappath = "_maps/templates/hilbertshotellore.dmm" - -/datum/map_template/hilbertshotelstorage - name = "Hilbert's Hotel Storage" - mappath = "_maps/templates/hilbertshotelstorage.dmm" - - -//Turfs and Areas -/turf/closed/indestructible/hotelwall - name = "hotel wall" - desc = "A wall designed to protect the security of the hotel's guests." - icon_state = "hotelwall" - smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_HOTEL_WALLS - smoothing_groups_with = SMOOTH_GROUP_HOTEL_WALLS - explosion_block = INFINITY - -/turf/open/indestructible/hotelwood - desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering." - icon_state = "wood" - footstep = FOOTSTEP_WOOD - tiled_dirt = FALSE - -/turf/open/indestructible/hoteltile - desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering." - icon_state = "showroomfloor" - footstep = FOOTSTEP_FLOOR - tiled_dirt = FALSE - -/turf/open/space/bluespace - name = "\proper bluespace hyperzone" - icon_state = "bluespace" - base_icon_state = "bluespace" - baseturfs = /turf/open/space/bluespace - flags_1 = NOJAUNT - explosion_block = INFINITY - var/obj/item/hilbertshotel/parentSphere - -/turf/open/space/bluespace/Initialize(mapload) - . = ..() - update_icon_state() - -/turf/open/space/bluespace/update_icon_state() - icon_state = base_icon_state - return ..() - -/turf/open/space/bluespace/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - if(parentSphere && arrived.forceMove(get_turf(parentSphere))) - do_sparks(3, FALSE, get_turf(arrived)) - -/turf/closed/indestructible/hoteldoor - name = "Hotel Door" - icon_state = "hoteldoor" - explosion_block = INFINITY - var/obj/item/hilbertshotel/parentSphere - -/turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user) - if(!isliving(user)) - return - if(!user.mind) - return - if(!parentSphere) - to_chat(user, span_warning("The door seems to be malfunctioning and refuses to operate!")) - return - if(tgui_alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", list("Leave", "Stay")) == "Leave") - if(HAS_TRAIT(user, TRAIT_IMMOBILIZED) || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt. - return - user.forceMove(get_turf(parentSphere)) - do_sparks(3, FALSE, get_turf(user)) - -/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user) - if(!isobserver(user) || !parentSphere) - return ..() - user.forceMove(get_turf(parentSphere)) - -//If only this could be simplified... -/turf/closed/indestructible/hoteldoor/attack_tk(mob/user) - return //need to be close. - -/turf/closed/indestructible/hoteldoor/attack_hand(mob/user, list/modifiers) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_animal(mob/user, list/modifiers) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_paw(mob/user, list/modifiers) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_larva(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_slime(mob/user) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/attack_robot(mob/user) - if(get_dist(get_turf(src), get_turf(user)) <= 1) - promptExit(user) - -/turf/closed/indestructible/hoteldoor/AltClick(mob/user) - . = ..() - if(get_dist(get_turf(src), get_turf(user)) <= 1) - to_chat(user, span_notice("You peak through the door's bluespace peephole...")) - user.reset_perspective(parentSphere) - var/datum/action/peephole_cancel/PHC = new - user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) - PHC.Grant(user) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/atom, check_eye), user) - -/turf/closed/indestructible/hoteldoor/check_eye(mob/user) - if(get_dist(get_turf(src), get_turf(user)) >= 2) - for(var/datum/action/peephole_cancel/PHC in user.actions) - INVOKE_ASYNC(PHC, TYPE_PROC_REF(/datum/action/peephole_cancel, Trigger)) - -/datum/action/peephole_cancel - name = "Cancel View" - desc = "Stop looking through the bluespace peephole." - button_icon_state = "cancel_peephole" - -/datum/action/peephole_cancel/Trigger(trigger_flags) - . = ..() - to_chat(owner, span_warning("You move away from the peephole.")) - owner.reset_perspective() - owner.clear_fullscreen("remote_view", 0) - UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) - qdel(src) - -/area/misc/hilbertshotel - name = "Hilbert's Hotel Room" - icon_state = "hilbertshotel" - requires_power = FALSE - has_gravity = TRUE - area_flags = NOTELEPORT | HIDDEN_AREA - area_lighting = AREA_LIGHTING_DYNAMIC - ambientsounds = list('sound/ambience/servicebell.ogg') - var/roomnumber = 0 - var/obj/item/hilbertshotel/parentSphere - var/datum/turf_reservation/reservation - var/turf/storageTurf - -/area/misc/hilbertshotel/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - if(istype(arrived, /obj/item/hilbertshotel)) - relocate(arrived) - var/list/obj/item/hilbertshotel/hotels = arrived.get_all_contents_type(/obj/item/hilbertshotel) - for(var/obj/item/hilbertshotel/H in hotels) - if(parentSphere == H) - relocate(H) - -/area/misc/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H) - if(prob(0.135685)) //Because screw you - qdel(H) - return - - // Prepare for... - var/mob/living/unforeseen_consequences = get_atom_on_turf(H, /mob/living) - - // Turns out giving anyone who grabs a Hilbert's Hotel a free, complementary warp whistle is probably bad. - // Let's gib the last person to have selected a room number in it. - if(unforeseen_consequences) - to_chat(unforeseen_consequences, span_warning("\The [H] starts to resonate. Forcing it to enter itself induces a bluespace paradox, violently tearing your body apart.")) - unforeseen_consequences.gib() - - var/turf/targetturf = find_safe_turf() - if(!targetturf) - if(GLOB.blobstart.len > 0) - targetturf = get_turf(pick(GLOB.blobstart)) - else - CRASH("Unable to find a blobstart landmark") - var/turf/T = get_turf(H) - var/area/A = T.loc - log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") - message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") - for(var/mob/M in A) - to_chat(M, span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!")) - H.forceMove(targetturf) - -/area/misc/hilbertshotel/Exited(atom/movable/gone, direction) - . = ..() - if(ismob(gone)) - var/mob/M = gone - if(M.mind) - var/stillPopulated = FALSE - var/list/currentLivingMobs = get_all_contents_type(/mob/living) //Got to catch anyone hiding in anything - for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left. - if(L.mind) - stillPopulated = TRUE - break - if(!stillPopulated) - storeRoom() - -/area/misc/hilbertshotel/proc/storeRoom() - var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1) - var/storage[roomSize] - var/turfNumber = 1 - var/obj/item/abstracthotelstorage/storageObj = new(storageTurf) - storageObj.roomNumber = roomnumber - storageObj.parentSphere = parentSphere - storageObj.name = "Room [roomnumber] Storage" - for(var/x in 0 to parentSphere.hotelRoomTemp.width-1) - for(var/y in 0 to parentSphere.hotelRoomTemp.height-1) - var/list/turfContents = list() - for(var/atom/movable/A in locate(reservation.bottom_left_coords[1] + x, reservation.bottom_left_coords[2] + y, reservation.bottom_left_coords[3])) - if(ismob(A) && !isliving(A)) - continue //Don't want to store ghosts - turfContents += A - A.forceMove(storageObj) - storage[turfNumber] = turfContents - turfNumber++ - parentSphere.storedRooms["[roomnumber]"] = storage - parentSphere.activeRooms -= "[roomnumber]" - qdel(reservation) - -/area/misc/hilbertshotelstorage - name = "Hilbert's Hotel Storage Room" - icon_state = "hilbertshotel" - requires_power = FALSE - area_flags = HIDDEN_AREA | NOTELEPORT | UNIQUE_AREA - has_gravity = TRUE - -/obj/item/abstracthotelstorage - anchored = TRUE - invisibility = INVISIBILITY_ABSTRACT - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - item_flags = ABSTRACT - var/roomNumber - var/obj/item/hilbertshotel/parentSphere - -/obj/item/abstracthotelstorage/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - if(ismob(arrived)) - var/mob/M = arrived - M.notransform = TRUE - -/obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction) - . = ..() - if(ismob(gone)) - var/mob/M = gone - M.notransform = FALSE - -//Space Ruin stuff -/area/ruin/space/has_grav/powered/hilbertresearchfacility - name = "Hilbert Research Facility" - -/area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom - area_flags = UNIQUE_AREA | NOTELEPORT | HIDDEN_AREA - -/obj/item/analyzer/hilbertsanalyzer - name = "custom rigged analyzer" - desc = "A hand-held environmental scanner which reports current gas levels. This one seems custom rigged to additionally be able to analyze some sort of bluespace device." - icon_state = "hilbertsanalyzer" - worn_icon_state = "analyzer" - -/obj/item/analyzer/hilbertsanalyzer/afterattack(atom/target, mob/user, proximity) - . = ..() - if(istype(target, /obj/item/hilbertshotel)) - if(!proximity) - to_chat(user, span_warning("It's to far away to scan!")) - return - var/obj/item/hilbertshotel/sphere = target - if(sphere.activeRooms.len) - to_chat(user, "Currently Occupied Rooms:") - for(var/roomnumber in sphere.activeRooms) - to_chat(user, roomnumber) - else - to_chat(user, "No currenty occupied rooms.") - if(sphere.storedRooms.len) - to_chat(user, "Vacated Rooms:") - for(var/roomnumber in sphere.storedRooms) - to_chat(user, roomnumber) - else - to_chat(user, "No vacated rooms.") - -/obj/effect/landmark/lift_id/hilbert - specific_lift_id = HILBERT_TRAM - -/obj/effect/landmark/tram/left_part/hilbert - specific_lift_id = HILBERT_TRAM - destination_id = "left_part_hilbert" - tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask") - -/obj/effect/landmark/tram/middle_part/hilbert - specific_lift_id = HILBERT_TRAM - destination_id = "middle_part_hilbert" - tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw") - -/obj/effect/landmark/tram/right_part/hilbert - specific_lift_id = HILBERT_TRAM - destination_id = "right_part_hilbert" - tgui_icons = list("Ordnance" = "bullseye", "Office" = "user", "Dormitories" = "bed") - -/obj/item/keycard/hilbert - name = "Hilbert's office keycard" - desc = "A keycard with an engraving on it. The engraving reads: \"Hilbert\"." - color = "#aa00cc" - puzzle_id = "hilbert_office" - -/obj/machinery/door/puzzle/keycard/hilbert - name = "secure airlock" - puzzle_id = "hilbert_office" - -/datum/outfit/doctorhilbert - id = /obj/item/card/id/advanced/silver - uniform = /obj/item/clothing/under/rank/rnd/research_director/doctor_hilbert - shoes = /obj/item/clothing/shoes/sneakers/brown - back = /obj/item/storage/backpack/satchel/leather - suit = /obj/item/clothing/suit/toggle/labcoat - id_template = /datum/access_template/away/hilbert - -/datum/outfit/doctorhilbert/pre_equip(mob/living/carbon/human/hilbert, visualsOnly) - . = ..() - if(!visualsOnly) - hilbert.gender = MALE - hilbert.update_body() - -/obj/item/paper/crumpled/ruins/note_institute - name = "note to the institute" - -/obj/item/paper/crumpled/ruins/note_institute/Initialize(mapload) - . = ..() - info = {"Note to the Institute
    - If you're reading this, I hope you're from the Institute. First things first, I should apologise. I won't be coming back to teach in the new semester.
    - We've made some powerful enemies. Very powerful. More powerful than any of you can imagine, and so we can't come back.
    - So, we've made the decision to vanish. Perhaps more literally than you might think. Do not try to find us- for your own safety.
    - I've left some of our effects in the Hotel. Room number [uppertext(num2hex(GLOB.hhMysteryRoomNumber, 0))]. To anyone who should know, that should make sense.
    - Best of luck with the research. From all of us in the Hilbert Group, it's been a pleasure working with you.
    - - David, Phil, Fiona and Jen"} - -/obj/item/paper/crumpled/ruins/postdocs_memo - name = "memo to the postdocs" - info = {"Memo to the Postdocs - Remember, if you're going in to retrieve the prototype for any reason (not that you should be without my supervision), that the security systems are always live- they have no shutoff.
    - Instead, remember: what you can't see can't hurt you.
    - Take care of the lab during my vacation. See you all in June.
    - - David"} - -/obj/item/paper/crumpled/ruins/hotel_note - name = "hotel note" - info = {"Hotel Note
    - Well, you figured out the puzzle. Looks like someone's done their homework on my research.
    - I suppose you deserve to know some more about our situation. Our research has attracted some undue attention and so, for our own safety, we've taken to the Bluespace.
    - Yes, you did read that correctly. I'm sure the physics and maths would bore you, but in layman's terms, the manifested link to the Bluespace the crystals provide can be exploited. With the correct technology, one can "surf" the Bluespace, as Jen likes to call it.
    - What's more, the space-time continuum is in full effect here. By correctly manipulating the bluespace, one can go anywhere: time or space. I'll confess to not having figured that one out myself. Check the closet- consider it a prize for solving the puzzle. Just be careful with its use- you might find yourself dealing with the same pursuers we've picked up.
    - They deal in "time crimes", whatever their definition of those are.
    - Anyway, I'm beginning to ramble. We must be going now. Make sure any posthumous Nobel prizes are made out to the department.
    - - David"} - -/obj/item/paper/fluff/ruins/docslabnotes - name = "lab notebook page" - info = {"Laboratory Notebook
    - PROPERTY OF DOCTOR D. HILBERT
    - May 10th, 2555
    - Finally, my new facility is complete, and not a moment too soon!
    - My disagreements with Greenham have become too much to bear, so some time away from the campus will do me well. It's not like my students understand my work, anyway. Teaching never was my passion.
    - Anyway, I'm getting off track. It is quite amazing what a few million in grants will buy you. This station is state of the art, perfect for my studies.
    - Since the Zhang Incident of 2459, we have been quite aware of the properties of bluespace crystals. Their space-warping properties are well-documented, but poorly understood. However, I theorise that it may be possible to harness them in new ways.
    - To this end, I've procured a small team of postdoctorate students from the institute to assist with my research. Some administrative help wouldn't go amiss, either- perhaps I should hire a secretary...
    - *Following this is a long series of pages detailing failures, grievances with the institute, and more scientific equations than anyone can reasonably chew through.*
    -

    Breakthrough

    - January 8th, 2557
    - My theories have held up adequately. Today, we had our first successful test of the "Hilbert Pocket", as we've taken to calling it. By exploiting the ability of bluespace crystals to create a localised dilation in space, with precise application of force according to geometric calculus, we have successfully "folded" space into a pocket. We had Phil throw one of his analysers into it from across the room, and what we saw was incredible.
    - A pocket of infinite space, within a finite area. Simply revolutionary!
    - I've set the postdocs to paper writing while I work out the specifics. The technology is successful, but we have no way to harness it. Unless...
    - *Many more pages dedicated to equations, engineering drawings, and ramblings continue. Hilbert clearly loves the sight of his own handwriting.*
    -

    A New Device

    - September 21st, 2557
    - We've submitted the first draft of the paper on Hilbert Pockets to the journals. Now, I suppose, we wait.
    - In the meantime, I've taken to assembling the first prototype of the device. By exploiting the pocket's ability to create an infinite region of space within a finite area, I've made... well, I suppose it could be called a "Pocket Dimension". Within, I've created a nifty system that recursively produces subspace rooms, spatially linking them to any of the infinite points on the pocket's surface. Fiona says it's akin to a hotel, and I'm inclined to agree.
    - Hilbert's Hotel. I like the sound of that.
    "} - -/obj/item/paper/fluff/ruins/romans_emails - name = "e-mail readout - 14.05.2558" - info = {"Logs of Roman P.
    -

    New Job


    - Sent to: natalya_petroyenko@kosmokomm.net
    - Hello sis! Figured I should update you on what's going on with the career change.
    - First day on the new job. It's a pretty boring position, but hey- it's not like I was finding anything in New Vladimir. I'm just glad to have something to pay the bills.
    - Suppose I should say what's involved: I'm essentially playing housekeeper for some scientist and his cohort of student assistants. Far above my pay grade to understand what they do, but they seem excited enough. Talking about "pockets", for whatever reason. Maybe they're designing the next innovation in clothes?
    - Anyway, that's pretty much it. I'm living on their station for pretty much the duration, so I'm not sure if I'll be able to make it to Mama's birthday. Sorry about that- I'll do my best to make it up to her (and you) when I get some leave.
    - Hope to see you soon,
    - Little Brother Roman
    -
    -

    Visitors


    - Sent to: david_hilbert@physics.mit.edu
    - Morning Doctor. Sorry to email you when you're on holiday, but you did tell me to update you on anything suspicious.
    - There's been a ship that's been hanging around the facility for a few days. Figured that was odd enough, given how far from anything important we are, but it got stranger when one of them finally came over to talk.
    - I know I'm not a native speaker, but I couldn't make out his accent. Wasn't like anything I've heard before, anyway.
    - He kept asking where you were, and if he could come in to speak to you. Of course, I turned him away- even if you had been around I'd have been hesitant to let him in.
    - As an aside, the postdocs told me to pass on a message. Apparently they've made a breakthrough, which sounds good and all.
    - Regards,
    - Roman
    -
    -

    Weird Times


    - Sent to: natalya_petroyenko@kosmokomm.net
    - Hi sis! How was Christmas? Are Mama and Papa doing well? I'm really sorry I couldn't be there, but I've been working my fingers to the bone at work.
    - I figure I should tell you a bit about how it's been going here. I know, I know, you keep calling me a workaholic, but it's really... strange, I guess?
    - I keep getting little glimpses into the research that's happening. They're messing around with bluespace- you know, the tech that makes FTL engines work? I'm not sure what exactly they're doing with it, but they're talking more and more about pockets every day now.
    - Not only that, but I'm starting to hear strange noises from the labs I'm not allowed into. Nothing super terrifying, you know, we're not talking xenomorphs, but more like industrial sounds. Crashes, bangs, occasional high-pitched whining, you know the sort. Like a broken vacuum cleaner.
    - I know it's not the instruments or I'd have heard it before, so it must be something new they've been working on. Exciting, I suppose, but I'm starting to wonder if I'm in over my head working here. Maybe I should start looking for a new job, somewhere closer to home.
    - Hope to see you at Papa's birthday. I've requested leave for it, and I'm just waiting on the Doc's response.
    - See you soon,
    - Little Brother Roman
    -
    -

    End of Leave


    - Sent to: david_hilbert@physics.mit.edu
    - Morning Doctor. Where is everyone? I got back from leave and the station was empty. Have you all went on holiday without telling me?
    - And what the hell happened to the ordnance lab? I couldn't even open the door to get in, it was fused shut!
    - Look, I don't feel safe staying on the station with it in this state, so I'm calling an engineer and heading home until I hear back from you.
    - Regards,
    - Roman
    -
    -

    Looking for a New Job


    - Sent to: natalya_petroyenko@kosmokomm.net
    - Hi sis. First things first, sorry for missing your engagement party. There's been a... situation at work.
    - In fact, that's most of why I'm writing this. I have absolutely no idea what happened, but the Doctor and the students are gone. Just up and left. The facility's abandoned.
    - But like, it's clear they left in a hurry. Hell, there's still coffee in the cups. I'd question it further, but they were always kinda... odd, I guess? The whole thing gives me chills and I don't think I want to dig any deeper.
    - I dropped his university an email and called in the authorities. All that's left now, I guess, is to find a new job. Would your boss happen to be hiring?
    - See you soon,
    - Little Brother Roman - "} diff --git a/code/modules/mapping/access_helpers/airlock_all_access.dm b/code/modules/mapping/access_helpers/airlock_all_access.dm deleted file mode 100644 index 43b074d8e36..00000000000 --- a/code/modules/mapping/access_helpers/airlock_all_access.dm +++ /dev/null @@ -1,209 +0,0 @@ -#define MAKE_REAL_FOR_AIRLOCK(BaseType, Access_Define) ##BaseType/airlock { search_type = /obj/machinery/door/airlock }; - -#define MAKE_REAL_FOR_WINDOOR(BaseType, Access_Define) ##BaseType/windoor { search_type = /obj/machinery/door/window }; - -#define MAKE_REAL_FOR_CONTROLLER(BaseType, Access_Define) ##BaseType/embedded_controller { search_type = /obj/machinery/c4_embedded_controller }; - -// This coerces it to be a list which is technically hacky and bad but honestly GFY. Rewrite my macros. -#define MAKE_REAL_BASE(BaseType, Access_Define) ##BaseType { granted_access = list(Access_Define) }; - -#define MAKE_ABSTRACT_IMPL(BaseType, State) ##BaseType { icon_state = State; abstract_type = ##BaseType }; - - -#define MAKE_REAL_FOR_ALL(Slug, Access_Define) \ - MAKE_REAL_BASE(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) \ - MAKE_REAL_FOR_AIRLOCK(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) \ - MAKE_REAL_FOR_WINDOOR(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) \ - MAKE_REAL_FOR_CONTROLLER(/obj/effect/mapping_helpers/access/all/##Slug, Access_Define) - -#define MAKE_REAL_FOR_ANY(Slug, Access_Define) \ - MAKE_REAL_BASE(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) \ - MAKE_REAL_FOR_AIRLOCK(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) \ - MAKE_REAL_FOR_WINDOOR(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) \ - MAKE_REAL_FOR_CONTROLLER(/obj/effect/mapping_helpers/access/any/##Slug, Access_Define) - -/// Make a REAL access helper. -#define MAKE_REAL(Slug, Access_Define) \ - MAKE_REAL_FOR_ALL(Slug, Access_Define) \ - MAKE_REAL_FOR_ANY(Slug, Access_Define) - -/// Make an abstract access helper, Used for setting icon_state. -#define MAKE_ABSTRACT(Slug, State) \ - MAKE_ABSTRACT_IMPL(/obj/effect/mapping_helpers/access/all/##Slug, State) \ - MAKE_ABSTRACT_IMPL(/obj/effect/mapping_helpers/access/any/##Slug, State) - - -// -------------------- Command access helpers -MAKE_ABSTRACT(command, "access_helper_com") - -MAKE_REAL(command/general, ACCESS_MANAGEMENT) - -MAKE_REAL(command/ai_upload, ACCESS_AI_UPLOAD) - -MAKE_REAL(command/teleporter, ACCESS_TELEPORTER) - -MAKE_REAL(command/eva, ACCESS_EVA) - -MAKE_REAL(command/hop, ACCESS_DELEGATE) - -MAKE_REAL(command/captain, ACCESS_CAPTAIN) - -// -------------------- Engineering access helpers -MAKE_ABSTRACT(engineering, "access_helper_eng") - -MAKE_REAL(engineering/general, ACCESS_ENGINEERING) - -MAKE_REAL(engineering/engine_equipment, ACCESS_ENGINE_EQUIP) - -MAKE_REAL(engineering/aux_base, ACCESS_AUX_BASE) - -MAKE_REAL(engineering/maintenance, ACCESS_MAINT_TUNNELS) - -MAKE_REAL(engineering/external, ACCESS_EXTERNAL_AIRLOCKS) - -MAKE_REAL(engineering/secure, ACCESS_SECURE_ENGINEERING) - -MAKE_REAL(engineering/atmos, ACCESS_ATMOSPHERICS) - - -MAKE_REAL(engineering/ce, ACCESS_CE) - -// -------------------- Medical access helpers -MAKE_ABSTRACT(medical, "access_helper_med") - -MAKE_REAL(medical/general, ACCESS_MEDICAL) - -MAKE_REAL(medical/chemistry, ACCESS_PHARMACY) - -MAKE_REAL(medical/cmo, ACCESS_CMO) - -MAKE_REAL(medical/pharmacy, ACCESS_PHARMACY) - -// -------------------- Science access helpers -MAKE_ABSTRACT(science, "access_helper_sci") - -MAKE_REAL(science/general, ACCESS_RND) - -MAKE_REAL(science/research, ACCESS_RESEARCH) - -MAKE_REAL(science/ordnance, ACCESS_ORDNANCE) - -MAKE_REAL(science/ordnance_storage, ACCESS_ORDNANCE_STORAGE) - -MAKE_REAL(science/genetics, ACCESS_GENETICS) - -MAKE_REAL(science/robotics, ACCESS_ROBOTICS) - -MAKE_REAL(science/xenobio, ACCESS_XENOBIOLOGY) - -MAKE_REAL(science/rd, ACCESS_RD) - -// -------------------- Security access helpers -MAKE_ABSTRACT(security, "access_helper_sec") - -MAKE_REAL(security/general, ACCESS_SECURITY) - -MAKE_REAL(security/armory, ACCESS_ARMORY) - -MAKE_REAL(security/detective, ACCESS_FORENSICS) - -MAKE_REAL(security/court, ACCESS_COURT) - -MAKE_REAL(security/hos, ACCESS_HOS) - -// -------------------- Service access helpers -MAKE_ABSTRACT(service, "access_helper_serv") - -MAKE_REAL(service/general, ACCESS_SERVICE) - -MAKE_REAL(service/kitchen, ACCESS_KITCHEN) - -MAKE_REAL(service/bar, ACCESS_BAR) - -MAKE_REAL(service/hydroponics, ACCESS_HYDROPONICS) - -MAKE_REAL(service/janitor, ACCESS_JANITOR) - -MAKE_REAL(service/chapel_office, ACCESS_CHAPEL_OFFICE) - -MAKE_REAL(service/library, ACCESS_LIBRARY) - -MAKE_REAL(service/theatre, ACCESS_THEATRE) - -MAKE_REAL(service/lawyer, ACCESS_LAWYER) - -// -------------------- Supply access helpers -MAKE_ABSTRACT(supply, "access_helper_sup") - -MAKE_REAL(supply/general, ACCESS_CARGO) - -MAKE_REAL(supply/mineral_storage, ACCESS_MINERAL_STOREROOM) - -MAKE_REAL(supply/qm, ACCESS_QM) - -MAKE_REAL(supply/vault, ACCESS_VAULT) - -// -------------------- Syndicate access helpers -MAKE_ABSTRACT(syndicate, "access_helper_syn") - -MAKE_REAL(syndicate/general, ACCESS_SYNDICATE) - -MAKE_REAL(syndicate/leader, ACCESS_SYNDICATE_LEADER) - -// -------------------- Away access helpers -MAKE_ABSTRACT(away, "access_helper_awy") - -MAKE_REAL(away/general, ACCESS_AWAY_GENERAL) - -MAKE_REAL(away/command, ACCESS_AWAY_COMMAND) - -MAKE_REAL(away/security, ACCESS_AWAY_SEC) - -MAKE_REAL(away/engineering, ACCESS_AWAY_ENGINE) - -MAKE_REAL(away/medical, ACCESS_AWAY_MED) - -MAKE_REAL(away/supply, ACCESS_AWAY_SUPPLY) - -MAKE_REAL(away/science, ACCESS_AWAY_SCIENCE) - -MAKE_REAL(away/maintenance, ACCESS_AWAY_MAINT) - -MAKE_REAL(away/generic1, ACCESS_AWAY_GENERIC1) - -MAKE_REAL(away/generic2, ACCESS_AWAY_GENERIC2) - -MAKE_REAL(away/generic3, ACCESS_AWAY_GENERIC3) - -MAKE_REAL(away/generic4, ACCESS_AWAY_GENERIC4) - -// -------------------- Admin access helpers -MAKE_ABSTRACT(admin, "access_helper_adm") - -MAKE_REAL(admin/general, ACCESS_CENT_GENERAL) - -MAKE_REAL(admin/thunderdome, ACCESS_CENT_THUNDER) - -MAKE_REAL(admin/medical, ACCESS_CENT_MEDICAL) - -MAKE_REAL(admin/living, ACCESS_CENT_LIVING) - -MAKE_REAL(admin/storage, ACCESS_CENT_STORAGE) - -MAKE_REAL(admin/teleporter, ACCESS_CENT_TELEPORTER) - -MAKE_REAL(admin/captain, ACCESS_CENT_CAPTAIN) - -MAKE_REAL(admin/bar, ACCESS_CENT_BAR) - - -#undef MAKE_REAL_BASE -#undef MAKE_REAL_FOR_AIRLOCK -#undef MAKE_REAL_FOR_WINDOOR -//#undef MAKE_FOR_CONTROLLER -#undef MAKE_REAL_FOR_ALL -#undef MAKE_REAL_FOR_ANY -#undef MAKE_REAL - -#undef MAKE_ABSTRACT_IMPL -#undef MAKE_ABSTRACT diff --git a/code/modules/mapping/embedded_controller/door_control_linker.dm b/code/modules/mapping/embedded_controller/door_control_linker.dm deleted file mode 100644 index 7f7a50e1367..00000000000 --- a/code/modules/mapping/embedded_controller/door_control_linker.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/effect/mapping_helpers/door_control_linker - icon = 'icons/effects/mapping_helpers_96x96.dmi' - icon_state = "pincode_helper" - layer = DOOR_HELPER_LAYER - 0.01 // This helper is huge so render under similar ones. - pixel_x = -32 - pixel_y = -32 - - /// The ID used to link everything together. - var/linker_id - -/obj/effect/mapping_helpers/door_control_linker/Initialize(mapload) - . = ..() - if(!mapload) - log_mapping("[src] spawned outside of mapload!") - return - - link_machines() - -/obj/effect/mapping_helpers/door_control_linker/proc/link_machines() - var/obj/machinery/door/airlock/airlock = locate() in loc - if(!airlock) - log_mapping("DCL: ([src]) at [AREACOORD(src)]| Door linker not placed on a door.") - return - - // Make sure the door is actually radio-enabled. - new /obj/effect/mapping_helpers/airlock/frequency/airlock_control(loc) - - var/list/nearby = orange(1, airlock.loc) - - var/obj/machinery/c4_embedded_controller/master_controller - var/obj/machinery/c4_embedded_controller/slave/slave_controller - - for(var/obj/machinery/c4_embedded_controller/controller in nearby) - if(istype(controller, /obj/machinery/c4_embedded_controller/slave)) - if(slave_controller) - log_mapping("DCL: ([src]) at [AREACOORD(src)]| Multiple slave controllers affected by door linker.") - continue - - slave_controller = controller - continue - - if(!controller.autolink_capable) - log_mapping("DCL: ([src]) at [AREACOORD(src)]| Incompatible controller type [controller.type] affected by door linker.") - continue - - if(master_controller) - log_mapping("DCL: ([src]) at [AREACOORD(src)]| Multiple master controllers affected by door linker.") - continue - - master_controller = controller - - // Link up controllers - var/slave_id = "[linker_id]_slave" - airlock.id_tag = linker_id - slave_controller?.id_tag = slave_id - - if(master_controller) - if(istype(master_controller, /obj/machinery/c4_embedded_controller/airlock_pinpad)) - var/obj/machinery/c4_embedded_controller/airlock_pinpad/pinpad = master_controller - pinpad.tag_target = linker_id - pinpad.tag_slave = slave_id - - else if (istype(master_controller, /obj/machinery/c4_embedded_controller/airlock_access)) - var/obj/machinery/c4_embedded_controller/airlock_access/pinpad = master_controller - pinpad.tag_target = linker_id - pinpad.tag_slave = slave_id - else - CRASH("Embedded Controller of type [master_controller.type] is marked as DCL capable but is not handled!") - else - log_mapping("DCL: ([src]) at [AREACOORD(src)]| Door linker with no master controller[slave_controller ? "." : " or slave controller."]") - -/// Generates a random ID instead of a manual one. Saves on mapping time if you don't care about the IDs. -/obj/effect/mapping_helpers/door_control_linker/random_id - /// Juuuuuust in case. - var/static/list/consumed_ids = list() - -/obj/effect/mapping_helpers/door_control_linker/random_id/Initialize(mapload) - do - linker_id = "[world.timeofday][rand(1, 100)][rand(1, 100)]" - while(consumed_ids[linker_id]) - - consumed_ids[linker_id] = TRUE - - . = ..() - diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index f70a36afb44..54d54a2fddb 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -114,169 +114,6 @@ ..() return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL -//airlock helpers -/obj/effect/mapping_helpers/airlock - layer = DOOR_HELPER_LAYER - late = TRUE - -/obj/effect/mapping_helpers/airlock/Initialize(mapload) - . = ..() - if(!mapload) - log_mapping("[src] spawned outside of mapload!") - return - - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc - if(!airlock) - log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") - else - payload(airlock) - -/obj/effect/mapping_helpers/airlock/LateInitialize() - . = ..() - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc - if(!airlock) - qdel(src) - return - if(airlock.cyclelinkeddir) - airlock.cyclelinkairlock() - if(airlock.closeOtherId) - airlock.update_other_id() - if(airlock.abandoned) - var/outcome = rand(1,100) - switch(outcome) - if(1 to 9) - var/turf/here = get_turf(src) - for(var/turf/closed/T in range(2, src)) - here.PlaceOnTop(T.type) - qdel(src) - return - here.PlaceOnTop(/turf/closed/constructed_wall) - qdel(src) - return - if(9 to 11) - airlock.lights = FALSE - airlock.locked = TRUE - if(12 to 15) - airlock.locked = TRUE - if(16 to 23) - airlock.welded = TRUE - if(24 to 30) - airlock.panel_open = TRUE - if(airlock.cutAiWire) - wires.cut(WIRE_AI) - if(airlock.autoname) - name = get_area_name(src, TRUE) - update_appearance() - qdel(src) - -/obj/effect/mapping_helpers/airlock/proc/payload(obj/machinery/door/airlock/payload) - return - -/obj/effect/mapping_helpers/airlock/cyclelink_helper - name = "airlock cyclelink helper" - icon_state = "airlock_cyclelink_helper" - -/obj/effect/mapping_helpers/airlock/cyclelink_helper/payload(obj/machinery/door/airlock/airlock) - if(airlock.cyclelinkeddir) - log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!") - else - airlock.cyclelinkeddir = dir - -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi - name = "airlock multi-cyclelink helper" - icon_state = "airlock_multicyclelink_helper" - var/cycle_id - -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi/payload(obj/machinery/door/airlock/airlock) - if(airlock.closeOtherId) - log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] closeOtherId, but it's already set!") - else - airlock.closeOtherId = cycle_id - -/obj/effect/mapping_helpers/airlock/locked - name = "airlock lock helper" - icon_state = "airlock_locked_helper" - -/obj/effect/mapping_helpers/airlock/locked/payload(obj/machinery/door/airlock/airlock) - if(airlock.locked) - log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!") - else - airlock.locked = TRUE - - -/obj/effect/mapping_helpers/airlock/unres - name = "airlock unresctricted side helper" - icon_state = "airlock_unres_helper" - -/obj/effect/mapping_helpers/airlock/unres/payload(obj/machinery/door/airlock/airlock) - airlock.unres_sides ^= dir - -/obj/effect/mapping_helpers/airlock/abandoned - name = "airlock abandoned helper" - icon_state = "airlock_abandoned" - -/obj/effect/mapping_helpers/airlock/abandoned/payload(obj/machinery/door/airlock/airlock) - if(airlock.abandoned) - log_mapping("[src] at [AREACOORD(src)] tried to make [airlock] abandoned but it's already abandoned!") - else - airlock.abandoned = TRUE - -/obj/effect/mapping_helpers/airlock/cutaiwire - name = "airlock cut ai wire helper" - icon_state = "airlock_cutaiwire" - -/obj/effect/mapping_helpers/airlock/cutaiwire/payload(obj/machinery/door/airlock/airlock) - if(airlock.cutAiWire) - log_mapping("[src] at [AREACOORD(src)] tried to cut the ai wire on [airlock] but it's already cut!") - else - airlock.cutAiWire = TRUE - -/obj/effect/mapping_helpers/airlock/autoname - name = "airlock autoname helper" - icon_state = "airlock_autoname" - -/obj/effect/mapping_helpers/airlock/autoname/payload(obj/machinery/door/airlock/airlock) - if(airlock.autoname) - log_mapping("[src] at [AREACOORD(src)] tried to autoname the [airlock] but it's already autonamed!") - else - airlock.autoname = TRUE - -/obj/effect/mapping_helpers/airlock/frequency - name = "airlock radio frequency helper" - icon_state = "airlock_radio" - - var/frequency_to_set - -/obj/effect/mapping_helpers/airlock/frequency/payload(obj/machinery/door/airlock/airlock) - if(airlock.frequency) - log_mapping("[src] at [AREACOORD(src)] tried to set frequency for the [airlock] but it's already set!") - else - airlock.set_frequency(frequency_to_set) - -/obj/effect/mapping_helpers/airlock/frequency/airlock_control - frequency_to_set = FREQ_AIRLOCK_CONTROL - -// Windoors -/obj/effect/mapping_helpers/windoor - layer = WINDOW_HELPER_LAYER - late = TRUE - -/obj/effect/mapping_helpers/windoor/Initialize(mapload) - . = ..() - if(!mapload) - log_mapping("[src] spawned outside of mapload!") - return - - var/obj/machinery/door/window/windoor = locate() in loc - if(!windoor) - log_mapping("[src] failed to find a windoor at [AREACOORD(src)]") - else - payload(windoor) - return INITIALIZE_HINT_QDEL - -/obj/effect/mapping_helpers/windoor/proc/payload(obj/machinery/door/window/windoor) - return - //needs to do its thing before spawn_rivers() is called INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) @@ -643,44 +480,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) matchbox.pixel_x -= 3 new /obj/item/storage/box/fireworks/dangerous(fireworks_turf) //dangerous version for extra holiday memes. -//lets mappers place notes on airlocks with custom info or a pre-made note from a path -/obj/effect/mapping_helpers/airlock_note_placer - name = "Airlock Note Placer" - late = TRUE - icon_state = "airlocknoteplacer" - var/note_info //for writing out custom notes without creating an extra paper subtype - var/note_name //custom note name - var/note_path //if you already have something wrote up in a paper subtype, put the path here - -/obj/effect/mapping_helpers/airlock_note_placer/LateInitialize() - var/turf/turf = get_turf(src) - if(note_path && !istype(note_path, /obj/item/paper)) //don't put non-paper in the paper slot thank you - log_mapping("[src] at [x],[y] had an improper note_path path, could not place paper note.") - qdel(src) - return - if(locate(/obj/machinery/door/airlock) in turf) - var/obj/machinery/door/airlock/found_airlock = locate(/obj/machinery/door/airlock) in turf - if(note_path) - found_airlock.note = note_path - found_airlock.update_appearance() - qdel(src) - return - if(note_info) - var/obj/item/paper/paper = new /obj/item/paper(src) - if(note_name) - paper.name = note_name - paper.info = "[note_info]" - found_airlock.note = paper - paper.forceMove(found_airlock) - found_airlock.update_appearance() - qdel(src) - return - log_mapping("[src] at [x],[y] had no note_path or note_info, cannot place paper note.") - qdel(src) - return - log_mapping("[src] at [x],[y] could not find an airlock on current turf, cannot place paper note.") - qdel(src) - /** * ## trapdoor placer! * @@ -924,9 +723,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/obj/machinery/power/terminal/terminal = locate() in my_turf if(terminal) return TRUE - var/obj/structure/grille/grille = locate() in my_turf - if(grille) - return TRUE var/obj/machinery/power/smes/smes = locate() in my_turf if(smes) return TRUE diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 5b3076b06c9..b78f5804c74 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -81,52 +81,6 @@ //Pod objects -//Window -/obj/structure/window/reinforced/shuttle/survival_pod - name = "pod window" - icon = 'icons/obj/smooth_structures/pod_window.dmi' - icon_state = "pod_window-0" - base_icon_state = "pod_window" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD - smoothing_groups_with = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD - -/obj/structure/window/reinforced/shuttle/survival_pod/spawner/north - dir = NORTH - -/obj/structure/window/reinforced/shuttle/survival_pod/spawner/east - dir = EAST - -/obj/structure/window/reinforced/shuttle/survival_pod/spawner/west - dir = WEST - -/obj/structure/window/reinforced/survival_pod - name = "pod window" - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "pwindow" - -//Door -/obj/machinery/door/airlock/survival_pod - name = "airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_pod - smoothing_groups = SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD - -/obj/machinery/door/airlock/survival_pod/glass - opacity = FALSE - glass = TRUE - -/obj/structure/door_assembly/door_assembly_pod - name = "pod airlock assembly" - base_name = "pod airlock" - airlock_type = /obj/machinery/door/airlock/survival_pod - glass_type = /obj/machinery/door/airlock/survival_pod/glass - -//Windoor -/obj/machinery/door/window/survival_pod - icon = 'icons/obj/lavaland/survival_pod.dmi' - icon_state = "windoor" - base_state = "windoor" - //Table /obj/structure/table/survival_pod icon = 'icons/obj/lavaland/survival_pod.dmi' diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index d2aa307b8fc..19a9dfa1494 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return if(I.item_flags & ABSTRACT) return - if(!istype(I) || (I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION)) + if(!istype(I) || (I.flags_1 & HOLOGRAM_1)) to_chat(user, span_warning("[M] won't accept [I]!")) return var/item_mats = materials.get_item_material_amount(I, breakdown_flags) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 56951800cbf..ec59f16e9cd 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -339,7 +339,6 @@ TYPEINFO_DEF(/obj/item/coin) var/cooldown = 0 var/value var/coinflip - item_flags = NO_MAT_REDEMPTION //You know, it's kind of a problem that money is worth more extrinsicly than intrinsically in this universe. /obj/item/coin/Initialize(mapload) . = ..() diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index 29d6a099490..c637a7c7db2 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -54,7 +54,6 @@ /datum/map_template/shelter/alpha/New() . = ..() whitelisted_turfs = typecacheof(/turf/closed/mineral) - banned_objects = typecacheof(/obj/structure/stone_tile) /datum/map_template/shelter/beta name = "Shelter Beta" @@ -69,7 +68,6 @@ /datum/map_template/shelter/beta/New() . = ..() whitelisted_turfs = typecacheof(/turf/closed/mineral) - banned_objects = typecacheof(/obj/structure/stone_tile) /datum/map_template/shelter/charlie name = "Shelter Charlie" @@ -84,4 +82,3 @@ /datum/map_template/shelter/charlie/New() . = ..() whitelisted_turfs = typecacheof(/turf/closed/mineral) - banned_objects = typecacheof(/obj/structure/stone_tile) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index a41a97941db..006518589b9 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -151,11 +151,9 @@ GLOBAL_VAR_INIT(fresh_ghost_adjectives, __fresh_ghost_adjectives()) var/static/list/powers = list( /datum/action/cooldown/ghost_whisper = SPOOK_LEVEL_WEAK_POWERS, /datum/action/cooldown/flicker = SPOOK_LEVEL_WEAK_POWERS, - /datum/action/cooldown/knock_sound = SPOOK_LEVEL_WEAK_POWERS, /datum/action/cooldown/ghost_light = SPOOK_LEVEL_MEDIUM_POWERS, /datum/action/cooldown/chilling_presence = SPOOK_LEVEL_MEDIUM_POWERS, /datum/action/cooldown/shatter_light = SPOOK_LEVEL_DESTRUCTIVE_POWERS, - /datum/action/cooldown/shatter_glass = SPOOK_LEVEL_DESTRUCTIVE_POWERS, ) AddComponent(/datum/component/spooky_powers, powers) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 407b2a59cf4..fa7ae4f684b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -303,13 +303,6 @@ now_pushing = FALSE return - if(istype(AM, /obj/structure/window)) - var/obj/structure/window/W = AM - if(W.fulltile) - for(var/obj/structure/window/win in get_step(W, dir_to_target)) - now_pushing = FALSE - return - release_grabs(AM) var/current_dir diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5345dbafa42..4486ba7a24c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -496,32 +496,6 @@ else to_chat(src, "Target is not on or near any active cameras on the station.") return - if (href_list["ai_take_control"]) //Mech domination - var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in INSTANCES_OF(/obj/vehicle/sealed/mecha) - if (!M) - return - - var/mech_has_controlbeacon = FALSE - for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in M.trackers) - mech_has_controlbeacon = TRUE - break - if(!can_dominate_mechs && !mech_has_controlbeacon) - message_admins("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.") - log_game("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.") - return - - if(controlled_equipment) - to_chat(src, span_warning("You are already loaded into an onboard computer!")) - return - if(!GLOB.cameranet.checkCameraVis(M)) - to_chat(src, span_warning("Exosuit is no longer near active cameras.")) - return - if(!isturf(loc)) - to_chat(src, span_warning("You aren't in your core!")) - return - if(M) - M.transfer_ai(AI_MECH_HACK, src, usr) //Called om the mech itself. - /mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C) if(QDELETED(C)) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index c6287a30c98..c64cb10934d 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -86,14 +86,6 @@ return FALSE if("crew_manifest") show_crew_manifest(src) - if("door_jack") - if(params["jack"] == "jack") - if(hacking_cable?.machine) - hack_door() - if(params["jack"] == "cancel") - QDEL_NULL(hacking_cable) - if(params["jack"] == "cable") - extendcable() if("encryption_keys") to_chat(src, span_notice("You have [!encryptmod ? "enabled" : "disabled"] encrypted radio frequencies.")) encryptmod = !encryptmod @@ -216,38 +208,6 @@ hacking_cable.forceMove(drop_location()) hacking_cable.visible_message(span_warning("A port on [src] opens to reveal \a [hacking_cable], which promptly falls to the floor."), span_hear("You hear the soft click of something light and hard falling to the ground.")) -/** - * Door jacking supporting proc - * - * This will, after alerting any AIs on station, begin to hack open a door. - * After a 10 second timer, the door will crack open, provided they don't move out of the way. - */ - -/mob/living/silicon/pai/proc/hack_door() - var/turf/turf = get_turf(src) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, TRUE) - to_chat(usr, span_boldnotice("You begin overriding the airlock security protocols.")) - for(var/mob/living/silicon/ai/all_ais in GLOB.player_list) - if(!all_ais.stat) - continue - if(turf.loc) - to_chat(all_ais, span_boldannounce("Network Alert: Brute-force security override in progress in [turf.loc].")) - else - to_chat(all_ais, span_boldannounce("Network Alert: Brute-force security override in progress. Unable to pinpoint location.")) - //Now begin hacking - if(!do_after(src, hacking_cable.machine, 10 SECONDS, timed_action_flags = NONE, progress = TRUE)) - to_chat(src, span_notice("Door Jack: Connection to airlock has been lost. Hack aborted.")) - hacking_cable.visible_message( - span_warning("[hacking_cable] rapidly retracts back into its spool."),\ - span_hear("You hear a click and the sound of wire spooling rapidly.")) - QDEL_NULL(hacking_cable) - if(!QDELETED(card)) - card.update_appearance() - return - var/obj/machinery/door/door = hacking_cable.machine - door.open() - QDEL_NULL(hacking_cable) - /** * Proc that switches whether a pAI can refresh * the records window again. diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index c20062048ba..48060cc3330 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -312,8 +312,6 @@ basic_modules = list( /obj/item/assembly/flash/cyborg, /obj/item/borg/sight/meson, - /obj/item/construction/rcd/borg, - /obj/item/pipe_dispenser, /obj/item/extinguisher, /obj/item/weldingtool/largetank/cyborg, /obj/item/screwdriver/cyborg, @@ -654,7 +652,6 @@ name = "Peacekeeper" basic_modules = list( /obj/item/assembly/flash/cyborg, - /obj/item/rsf/cookiesynth, /obj/item/harmalarm, /obj/item/reagent_containers/borghypo/peace, /obj/item/holosign_creator/cyborg, @@ -715,7 +712,6 @@ /obj/item/extinguisher/mini, /obj/item/hand_labeler/borg, /obj/item/razor, - /obj/item/rsf, /obj/item/instrument/guitar, /obj/item/instrument/piano_synth, /obj/item/reagent_containers/dropper, @@ -802,8 +798,6 @@ basic_modules = list( /obj/item/assembly/flash/cyborg, /obj/item/borg/sight/thermal, - /obj/item/construction/rcd/borg/syndicate, - /obj/item/pipe_dispenser, /obj/item/restraints/handcuffs/cable/zipties, /obj/item/extinguisher, /obj/item/weldingtool/largetank/cyborg, diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 522d16cf8b0..ef10ca5e041 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -882,14 +882,6 @@ Pass a positive integer as an argument to override a bot's default speed. calc_summon_path() tries = 0 -/mob/living/simple_animal/bot/Bump(atom/A) //Leave no door unopened! - . = ..() - if((istype(A, /obj/machinery/door/airlock) || istype(A, /obj/machinery/door/window)) && (!isnull(access_card))) - var/obj/machinery/door/D = A - if(D.check_access(access_card)) - D.open() - frustration = 0 - /mob/living/simple_animal/bot/ui_data(mob/user) var/list/data = list() data["can_hack"] = (issilicon(user) || isAdminGhostAI(user)) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index a1324161e14..843d4933e3f 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -137,7 +137,6 @@ ) /// whitelisted drone items, recursive/includes descendants var/list/drone_item_whitelist_recursive = list( - /obj/item/airlock_painter, /obj/item/circuitboard, /obj/item/conveyor_switch_construct, /obj/item/electronics, diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm index abbe179ef4d..1d0808d9dda 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm @@ -44,7 +44,6 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "crowbar_cyborg" inhand_icon_state = "crowbar" - item_flags = NO_MAT_REDEMPTION /obj/item/screwdriver/drone name = "built-in screwdriver" @@ -52,7 +51,6 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "screwdriver_cyborg" inhand_icon_state = "screwdriver" - item_flags = NO_MAT_REDEMPTION random_color = FALSE @@ -71,14 +69,12 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "wrench_cyborg" inhand_icon_state = "wrench" - item_flags = NO_MAT_REDEMPTION /obj/item/weldingtool/drone name = "built-in welding tool" desc = "A welding tool built into your chassis." icon = 'icons/obj/items_cyborg.dmi' icon_state = "indwelder_cyborg" - item_flags = NO_MAT_REDEMPTION /obj/item/wirecutters/drone name = "built-in wirecutters" @@ -86,6 +82,4 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "wirecutters_cyborg" inhand_icon_state = "cutters" - item_flags = NO_MAT_REDEMPTION random_color = FALSE - diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index f1e3798b61e..5698a96e771 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -36,7 +36,7 @@ /mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget() . = ..() if(.) - if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille))) + if(toggle && (isliving(target))) ToggleMode(1) /mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE) diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm deleted file mode 100644 index 692e5255b11..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ /dev/null @@ -1,295 +0,0 @@ - -/** - * Mecha Pilots! - * By Remie Richards - * - * Mecha pilot mobs are able to pilot Mecha to a rudimentary level - * this allows for certain mobs to be more of a threat (Because they're in a MECH) - * - * Mecha Pilots can either spawn with one, or steal one! - * - * Inherits from syndicate just to avoid copy-paste) - * - * Featuring: - * * Mecha piloting skills - * * Uses Mecha equipment - * * Uses Mecha special abilities in specific situations - * * Pure Evil Incarnate - */ -/mob/living/simple_animal/hostile/syndicate/mecha_pilot - name = "Syndicate Mecha Pilot" - desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour." - wanted_objects = list() - search_objects = 0 - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - - var/spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded - var/obj/vehicle/sealed/mecha/mecha //Ref to pilot's mecha instance - var/required_mecha_charge = 7500 //If the pilot doesn't have a mecha, what charge does a potential Grand Theft Mecha need? (Defaults to half a battery) - var/mecha_charge_evacuate = 50 //Amount of charge at which the pilot tries to abandon the mecha - - //Vars that control when the pilot uses their mecha's abilities (if the mecha has that ability) - var/threat_use_mecha_smoke = 5 //5 mobs is enough to engage crowd control - var/defense_mode_chance = 35 //Chance to engage Defense mode when damaged - var/smoke_chance = 20 //Chance to deploy smoke for crowd control - var/retreat_chance = 40 //Chance to run away - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech - spawn_mecha_type = null - search_objects = 2 - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize(mapload) - . = ..() - wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE) - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. - name = "\improper Nanotrasen Mecha Pilot" - desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." - icon_living = "nanotrasen" - icon_state = "nanotrasen" - faction = list("nanotrasen") - spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/loaded - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen - name = "\improper Nanotrasen Mecha Pilot" - desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." - icon_living = "nanotrasen" - icon_state = "nanotrasen" - faction = list("nanotrasen") - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize(mapload) - . = ..() - if(spawn_mecha_type) - var/obj/vehicle/sealed/mecha/M = new spawn_mecha_type (get_turf(src)) - if(istype(M)) - INVOKE_ASYNC(src, PROC_REF(enter_mecha), M) - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M) - if(!M) - return 0 - LoseTarget() //Target was our mecha, so null it out - M.aimob_enter_mech(src) - targets_from = WEAKREF(M) - allow_movement_on_non_turfs = TRUE //duh - var/do_ranged = 0 - for(var/equip in mecha.flat_equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = equip - if(ME.range & MECHA_RANGED) - do_ranged = 1 - break - if(do_ranged) - minimum_distance = 5 - ranged = 1 - else - minimum_distance = 1 - ranged = 0 - wanted_objects = list() - search_objects = 0 - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) - var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - action.Trigger(forced_state = TRUE) - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M) - if(!M) - return 0 - - mecha.aimob_exit_mech(src) - allow_movement_on_non_turfs = FALSE - targets_from = null - - //Find a new mecha - wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE) - var/search_aggressiveness = 2 - for(var/obj/vehicle/sealed/mecha/combat/C in range(vision_range,src)) - if(is_valid_mecha(C)) - GiveTarget(C) - search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS! - break - search_objects = search_aggressiveness - ranged = 0 - minimum_distance = 1 - - SSmove_manager.stop_looping(src)//end any lingering movement loops, to prevent the haunted mecha bug - -//Checks if a mecha is valid for theft -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/vehicle/sealed/mecha/M) - if(!M) - return FALSE - if(LAZYLEN(M.occupants)) - return FALSE - if(!M.has_charge(required_mecha_charge)) - return FALSE - if(M.get_integrity() < M.max_integrity*0.5) - return FALSE - return TRUE - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A) - if(mecha) - var/dirto = get_dir(mecha,A) - if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises - mecha.vehicle_move(dirto, TRUE) - - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_reload() - if(mecha) - for(var/equip in mecha.flat_equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = equip - if(ME.needs_rearm()) - ME.rearm() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED) - . = list() - if(mecha) - for(var/equip in mecha.flat_equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = equip - if((ME.range & flag) && ME.action_checks(ME)) //this looks weird, but action_checks() just needs any atom, so I spoofed it here - . += ME - - - -//Pick a ranged weapon/tool -//Fire it -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/OpenFire(atom/A) - if(mecha) - mecha_reload() - mecha_face_target(A) - var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED) - if(possible_weapons.len) - var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever - if(ME.action(src,A)) - return - - else - ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget() - if(mecha) - var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE) - if(possible_weapons.len) - var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) - mecha_face_target(target) - if(ME.action(src,target)) - return - - if(!TIMER_COOLDOWN_CHECK(mecha, COOLDOWN_MECHA_MELEE_ATTACK)) - mecha_face_target(target) - target.mech_melee_attack(mecha, src) - else - if(ismecha(target)) - var/obj/vehicle/sealed/mecha/M = target - if(is_valid_mecha(M)) - enter_mecha(M) - return - else - if(!CanAttack(M)) - LoseTarget() - return - - return target.attack_animal(src) - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action() - . = ..() - if(!.) - return - if(!mecha) - for(var/obj/vehicle/sealed/mecha/combat/mecha_in_range in range(src,vision_range)) - if(is_valid_mecha(mecha_in_range)) - GiveTarget(mecha_in_range) //Let's nab it! - minimum_distance = 1 - ranged = 0 - break - if(mecha) - var/list/L = PossibleThreats() - var/threat_count = L.len - - //Low Charge - Eject - if(!mecha.has_charge(mecha_charge_evacuate)) - exit_mecha(mecha) - return - - //Too Much Damage - Eject - if(mecha.get_integrity() < mecha.max_integrity*0.1) - exit_mecha(mecha) - return - - //Smoke if there's too many targets - Smoke Power - if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance)) - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges) - var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke] - action.Trigger() - - //Heavy damage - Defense Power or Retreat - if(mecha.get_integrity() < mecha.max_integrity*0.25) - if(prob(defense_mode_chance)) - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) - var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - action.Trigger(forced_state = TRUE) - addtimer(CALLBACK(action, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/mech_defense_mode, Trigger), FALSE), 100) //10 seconds of defense, then toggle off - - else if(prob(retreat_chance)) - //Speed boost if possible - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode) - var/datum/action/vehicle/sealed/mecha/mech_overload_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode] - mecha.leg_overload_mode = FALSE - action.Trigger(forced_state = TRUE) - addtimer(CALLBACK(action, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/mech_overload_mode, Trigger), FALSE), 100) //10 seconds of speeeeed, then toggle off - - retreat_distance = 50 - addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS) - - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/death(gibbed, cause_of_death = "Unknown") - if(mecha) - mecha.aimob_exit_mech(src) - ..() - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/gib() - if(mecha) - mecha.aimob_exit_mech(src) - ..() - - -//Yes they actually try and pull this shit -//~simple animals~ -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target) - if(ismecha(the_target)) - var/obj/vehicle/sealed/mecha/M = the_target - if(mecha) - if(M == mecha) //Dont kill yourself - return FALSE - else //we're not in a mecha, so we check if we can steal it instead. - if(is_valid_mecha(M)) - return TRUE - for(var/occupant in M.occupants) - if(CanAttack(occupant)) - return TRUE - return FALSE - - . = ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement() - if(mecha && loc == mecha) - return 0 - ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0) - if(mecha && loc == mecha) - return mecha.relaymove(src, Dir) - return ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) - if(mecha) - SSmove_manager.move_to(mecha, target, minimum_distance, mecha.movedelay) - else - ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 3a79da08c80..d7093bbd18e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -99,7 +99,7 @@ ..() /// Mimics can't be made out of these objects -GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/structure/blob)) +GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cable, /obj/structure/blob)) /mob/living/simple_animal/hostile/mimic/copy health = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index f8715221c91..0de4a5ed399 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -128,10 +128,6 @@ return if (QDELETED(target)) return - if(istype(target, /obj/machinery/door/airlock) && !opening_airlock) - pry_door(target) - return - if (target.reagents && target.is_injectable(src, allowmobs = TRUE) && !istype(target, /obj/item/food/cheese)) src.visible_message(span_warning("[src] starts licking [target] passionately!"),span_notice("You start licking [target]...")) if (do_after(src, target, 2 SECONDS, interaction_key = REGALRAT_INTERACTION)) @@ -160,35 +156,6 @@ else to_chat(src, span_warning("You feel fine, no need to eat anything!")) -/** - * Allows rat king to pry open an airlock if it isn't locked. - * - * A proc used for letting the rat king pry open airlocks instead of just attacking them. - * This allows the rat king to traverse the station when there is a lack of vents or - * accessible doors, something which is common in certain rat king spawn points. - */ -/mob/living/simple_animal/hostile/regalrat/proc/pry_door(target) - var/obj/machinery/door/airlock/prying_door = target - if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal) - return FALSE - opening_airlock = TRUE - visible_message( - span_warning("[src] begins prying open the airlock..."), - span_notice("You begin digging your claws into the airlock..."), - span_warning("You hear groaning metal..."), - ) - var/time_to_open = 0.5 SECONDS - if(prying_door.hasPower()) - time_to_open = 5 SECONDS - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE) - if(do_after(src, time_to_open, prying_door)) - opening_airlock = FALSE - if(prying_door.density && !prying_door.open(2)) - to_chat(src, span_warning("Despite your efforts, the airlock managed to resist your attempts to open it!")) - return FALSE - prying_door.open() - return FALSE - opening_airlock = FALSE /mob/living/simple_animal/hostile/regalrat/controlled/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 9f2715c90ef..938c3a3831f 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -307,11 +307,6 @@ for(var/turf/T in turfs) if(istype(T, /turf/closed)) return - for(var/obj/structure/window/W in T.contents) - return - for(var/obj/machinery/door/D in T.contents) - if(D.density) - return delayFire += 1.5 addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T), delayFire) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 11e3a36b8f8..12fb3d35a40 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -168,30 +168,6 @@ if(mod) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, slowdown = mod) -/mob/living/simple_animal/slime/ObjBump(obj/O) - if(!client && powerlevel > 0) - var/probab = 10 - switch(powerlevel) - if(1 to 2) - probab = 20 - if(3 to 4) - probab = 30 - if(5 to 6) - probab = 40 - if(7 to 8) - probab = 60 - if(9) - probab = 70 - if(10) - probab = 95 - if(prob(probab)) - if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !Atkcool) - if (is_adult || prob(5)) - O.attack_slime(src) - Atkcool = TRUE - addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) - /mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return 2 diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 2affea270fc..b4bdf74bb6a 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -233,7 +233,6 @@ allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, - /obj/item/construction/rcd, /obj/item/storage/bag/construction, ) variants = list( @@ -289,7 +288,6 @@ /obj/item/tank/internals, /obj/item/analyzer, /obj/item/t_scanner, - /obj/item/pipe_dispenser, ) variants = list( "atmospheric" = list( @@ -347,8 +345,6 @@ /obj/item/tank/internals, /obj/item/analyzer, /obj/item/t_scanner, - /obj/item/pipe_dispenser, - /obj/item/construction/rcd, /obj/item/storage/bag/construction, ) variants = list( @@ -1266,8 +1262,6 @@ /obj/item/tank/internals, /obj/item/analyzer, /obj/item/t_scanner, - /obj/item/pipe_dispenser, - /obj/item/construction/rcd, ) variants = list( "prototype" = list( @@ -1676,4 +1670,3 @@ ), ), ) - diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index c0b5371662b..be276544236 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -181,32 +181,6 @@ perceived_threat_level = get_perceived_radiation_danger(pulse_information, insulation_to_target) addtimer(VARSET_CALLBACK(src, perceived_threat_level, null), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE) -///Constructor - Lets you build quicker and create RCD holograms. -/obj/item/mod/module/constructor - name = "MOD constructor module" - desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \ - advanced arm servos meant to carry crewmembers. However, it functions as an \ - extremely advanced construction hologram scanner, as well as containing the \ - latest engineering schematics combined with inbuilt memory to help the user build walls." - icon_state = "constructor" - module_type = MODULE_USABLE - complexity = 2 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 - incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) - cooldown_time = 11 SECONDS - required_slots = list(ITEM_SLOT_GLOVES) - -/obj/item/mod/module/constructor/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) - -/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) - REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) - -/obj/item/mod/module/constructor/on_use() - rcd_scan(src, fade_time = 10 SECONDS) - drain_power(use_power_cost) - ///Mister - Sprays water over an area. /obj/item/mod/module/mister name = "MOD water mister module" diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 97709bf7ecd..39bbc3cd205 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -65,7 +65,7 @@ icon_state = "carry" complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) + incompatible_modules = list(/obj/item/mod/module/quick_carry) required_slots = list(ITEM_SLOT_GLOVES) /obj/item/mod/module/quick_carry/on_suit_activation() diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm index 564c6407e54..6591ce71638 100644 --- a/code/modules/ninja/suit/ninjaDrainAct.dm +++ b/code/modules/ninja/suit/ninjaDrainAct.dm @@ -127,16 +127,6 @@ //COMMUNICATIONS CONSOLE// /obj/machinery/computer/communications/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) - -//AIRLOCK// -/obj/machinery/door/airlock/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) - if(!ninja_suit || !ninja || !ninja_gloves) - return INVALID_DRAIN - - if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) - emag_act() - ninja_gloves.door_hack_counter++ - //WIRE// /obj/structure/cable/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) if(!ninja_suit || !ninja || !ninja_gloves) @@ -175,35 +165,6 @@ return drain_total -//MECH// -/obj/vehicle/sealed/mecha/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) - if(!ninja_suit || !ninja || !ninja_gloves) - return INVALID_DRAIN - - var/maxcapacity = FALSE //Safety check - var/drain = 0 //Drain amount - var/drain_total = 0 - - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Warning: Unauthorized access through sub-route 4, block H, detected.")]") - if(get_charge()) - while(cell.charge > 0 && !maxcapacity) - drain = rand(ninja_gloves.mindrain, ninja_gloves.maxdrain) - if(cell.charge < drain) - drain = cell.charge - if(ninja_suit.cell.charge + drain > ninja_suit.cell.maxcharge) - drain = ninja_suit.cell.maxcharge - ninja_suit.cell.charge - maxcapacity = TRUE - if (do_after(ninja, src, 10)) - spark_system.start() - playsound(loc, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - cell.use(drain) - ninja_suit.cell.give(drain) - drain_total += drain - else - break - - return drain_total - //BORG// /mob/living/silicon/robot/ninjadrain_act(obj/item/clothing/suit/space/space_ninja/ninja_suit, mob/living/carbon/human/ninja, obj/item/clothing/gloves/space_ninja/ninja_gloves) if(!ninja_suit || !ninja || !ninja_gloves || (ROLE_SPACE_NINJA in faction)) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index ca27d503f10..e4dea7088cc 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -192,15 +192,6 @@ // .. or if you cannot read if(!user.can_read(src)) return UI_CLOSE - if(in_contents_of(/obj/machinery/door/airlock) || in_contents_of(/obj/item/clipboard)) - return UI_INTERACTIVE - return ..() - - - -/obj/item/paper/can_interact(mob/user) - if(in_contents_of(/obj/machinery/door/airlock)) - return TRUE return ..() diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm deleted file mode 100644 index 4c86a6658a4..00000000000 --- a/code/modules/paperwork/ticketmachine.dm +++ /dev/null @@ -1,207 +0,0 @@ -//Bureaucracy machine! -//Simply set this up in the hopline and you can serve people based on ticket numbers - -/obj/machinery/ticket_machine - name = "ticket machine" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "ticketmachine" - base_icon_state = "ticketmachine" - desc = "A marvel of bureaucratic engineering encased in an efficient plastic shell. It can be refilled with a hand labeler refill roll and linked to buttons with a multitool." - density = FALSE - maptext_height = 26 - maptext_width = 32 - maptext_x = 7 - maptext_y = 10 - layer = HIGH_OBJ_LAYER - var/ticket_number = 0 //Increment the ticket number whenever the HOP presses his button - var/current_number = 0 //What ticket number are we currently serving? - var/max_number = 100 //At this point, you need to refill it. - var/cooldown = 50 - var/ready = TRUE - var/id = "ticket_machine_default" //For buttons - -/obj/machinery/ticket_machine/Initialize(mapload) - . = ..() - update_appearance() - AddComponent(/datum/component/wall_mounted, CALLBACK(src, PROC_REF(deconstruct), FALSE)) - SET_TRACKING(__TYPE__) - -/obj/machinery/ticket_machine/Destroy() - UNSET_TRACKING(__TYPE__) - return ..() - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) - -/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) //make sure it has a data buffer - return - var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) - return TRUE - -/obj/machinery/ticket_machine/emag_act(mob/user) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind. - if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You overload [src]'s bureaucratic logic circuitry to its MAXIMUM setting.")) - ticket_number = rand(0,max_number) - current_number = ticket_number - obj_flags |= EMAGGED - update_appearance() - -/obj/machinery/ticket_machine/proc/increment() - if(current_number > ticket_number) - return - if(current_number < ticket_number) - current_number ++ //Increment the one we're serving. - playsound(src, 'sound/misc/announce_dig.ogg', 50, FALSE) - say("Now serving ticket #[current_number]!") - update_appearance() - -/obj/machinery/button/ticket_machine - name = "increment ticket counter" - desc = "Use this button after you've served someone to tell the next person to come forward." - device_type = /obj/item/assembly/control/ticket_machine - req_access = list() - id = "ticket_machine_default" - -/obj/machinery/button/ticket_machine/Initialize(mapload) - . = ..() - if(device) - var/obj/item/assembly/control/ticket_machine/ours = device - ours.id = id - -/obj/machinery/button/ticket_machine/multitool_act(mob/living/user, obj/item/I) - . = ..() - if(I.tool_behaviour == TOOL_MULTITOOL) - var/obj/item/multitool/M = I - if(M.buffer && !istype(M.buffer, /obj/machinery/ticket_machine)) - return - var/obj/item/assembly/control/ticket_machine/controller = device - controller.linked = WEAKREF(M.buffer) - id = null - controller.id = null - to_chat(user, span_warning("You've linked [src] to [M.buffer].")) - -/obj/item/assembly/control/ticket_machine - name = "ticket machine controller" - desc = "A remote controller for the HoP's ticket machine." - var/datum/weakref/linked //To whom are we linked? - -/obj/item/assembly/control/ticket_machine/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/item/assembly/control/ticket_machine/LateInitialize() - find_machine() - -/obj/item/assembly/control/ticket_machine/proc/find_machine() //Locate the one to which we're linked - for(var/obj/machinery/ticket_machine/ticketsplease as anything in INSTANCES_OF(/obj/machinery/ticket_machine)) - if(ticketsplease.id == id) - linked = WEAKREF(ticketsplease) - if(linked) - return TRUE - else - return FALSE - -/obj/item/assembly/control/ticket_machine/activate() - if(cooldown) - return - if(!linked) - return - var/obj/machinery/ticket_machine/machine = linked.resolve() - if(!machine) - return - cooldown = TRUE - machine.increment() - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) - -/obj/machinery/ticket_machine/update_icon() - . = ..() - handle_maptext() - -/obj/machinery/ticket_machine/update_icon_state() - switch(ticket_number) //Gives you an idea of how many tickets are left - if(0 to 49) - icon_state = "[base_icon_state]_100" - if(50 to 99) - icon_state = "[base_icon_state]_50" - if(100) - icon_state = "[base_icon_state]_0" - return ..() - -/obj/machinery/ticket_machine/proc/handle_maptext() - switch(current_number) //This is here to handle maptext offsets so that the numbers align. - if(0 to 9) - maptext_x = 13 - if(10 to 99) - maptext_x = 10 - if(100) - maptext_x = 8 - maptext = MAPTEXT(current_number) //Finally, apply the maptext - -/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/hand_labeler_refill)) - if(!(ticket_number >= max_number)) - if(tgui_alert(user, "[src] still has [max_number-ticket_number] ticket[max_number-ticket_number==1 ? null : "s"] left, are you sure you want to refill it?", "Tactical Refill", list("Refill", "Cancel")) != "Refill") - return //If the user still wants to refill it... - to_chat(user, span_notice("You start to refill [src]'s ticket holder.")) - if(do_after(user, src, 30)) - to_chat(user, span_notice("You insert [I] into [src] as it whirs nondescriptly.")) - qdel(I) - ticket_number = 0 - current_number = 0 - update_appearance() - return - -/obj/machinery/ticket_machine/proc/reset_cooldown() - ready = TRUE - -/obj/machinery/ticket_machine/attack_hand(mob/living/carbon/user, list/modifiers) - . = ..() - if(!ready) - to_chat(user,span_warning("You press the button, but nothing happens...")) - return - if(ticket_number >= max_number) - to_chat(user,span_warning("Ticket supply depleted, please refill this unit with a hand labeller refill cartridge!")) - return - - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 100, FALSE) - ticket_number++ - to_chat(user, span_notice("You take a ticket from [src], looks like you're ticket number #[ticket_number]...")) - var/obj/item/ticket_machine_ticket/theirticket = new /obj/item/ticket_machine_ticket(get_turf(src)) - theirticket.name = "Ticket #[ticket_number]" - theirticket.maptext = MAPTEXT(ticket_number) - theirticket.saved_maptext = MAPTEXT(ticket_number) - user.put_in_hands(theirticket) - update_appearance() - if(obj_flags & EMAGGED) //Emag the machine to destroy the HOP's life. - ready = FALSE - addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown)//Small cooldown to prevent piles of flaming tickets - theirticket.fire_act() - user.dropItemToGround(theirticket) - user.adjust_fire_stacks(1) - user.ignite_mob() - return - -/obj/item/ticket_machine_ticket - name = "Ticket" - desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper®. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "ticket" - maptext_x = 7 - maptext_y = 10 - w_class = WEIGHT_CLASS_TINY - resistance_flags = FLAMMABLE - max_integrity = 50 - var/saved_maptext = null - -/obj/item/ticket_machine_ticket/attack_hand(mob/user, list/modifiers) - . = ..() - maptext = saved_maptext //For some reason, storage code removes all maptext off objs, this stops its number from being wiped off when taken out of storage. - -/obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode - if(burn_paper_product_attackby_check(P, user)) - return - return ..() diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 1daf0cac847..f0af27b4f4a 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -120,54 +120,6 @@ qdel(src) return TRUE -/obj/machinery/power/apc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(!(the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return FALSE - - if(!has_electronics) - if(machine_stat & BROKEN) - to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit.")) - return FALSE - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) - - if(!cell) - if(machine_stat & MAINT) - to_chat(user, span_warning("There's no connector for a power cell.")) - return FALSE - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 50, "cost" = 10) //16 for a wall - - to_chat(user, span_warning("[src] has both electronics and a cell.")) - return FALSE - -/obj/machinery/power/apc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - if(!(passed_mode & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return FALSE - if(!has_electronics) - if(machine_stat & BROKEN) - to_chat(user, span_warning("[src]'s frame is too damaged to support a circuit.")) - return - user.visible_message(span_notice("[user] fabricates a circuit and places it into [src]."), \ - span_notice("You adapt a power control board and click it into place in [src]'s guts.")) - has_electronics = TRUE - locked = TRUE - return TRUE - - if(!cell) - if(machine_stat & MAINT) - to_chat(user, span_warning("There's no connector for a power cell.")) - return FALSE - var/obj/item/stock_parts/cell/crap/empty/C = new(src) - C.forceMove(src) - cell = C - chargecount = 0 - user.visible_message(span_notice("[user] fabricates a weak power cell and places it into [src]."), \ - span_warning("Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!")) - update_appearance() - return TRUE - - to_chat(user, span_warning("[src] has both electronics and a cell.")) - return FALSE - /obj/machinery/power/apc/emag_act(mob/user) if((obj_flags & EMAGGED) || malfhack) return diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 54aea3184b5..8dff2f1c05c 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -74,8 +74,6 @@ DEFINE_INTERACTABLE(/obj/machinery/light) var/constant_flickering = FALSE var/flicker_timer = null var/roundstart_flicker = FALSE - /// Should this turn red when a firealarm is on in the area? - var/firealarm = FALSE var/maploaded = FALSE /obj/machinery/light/Move() @@ -130,7 +128,7 @@ DEFINE_INTERACTABLE(/obj/machinery/light) /obj/machinery/light/update_icon_state() switch(status) // set icon_states if(LIGHT_OK) - if(emergency_mode || firealarm) + if(emergency_mode) icon_state = "[base_state]_emergency" else icon_state = "[base_state]" @@ -150,7 +148,7 @@ DEFINE_INTERACTABLE(/obj/machinery/light) if(!overlay_icon) return - if(emergency_mode || firealarm) + if(emergency_mode) . += mutable_appearance(overlay_icon, "[base_state]_emergency") return . += mutable_appearance(overlay_icon, base_state) @@ -513,8 +511,6 @@ DEFINE_INTERACTABLE(/obj/machinery/light) var/FC = bulb_falloff if(color) CO = color - if (firealarm) - CO = bulb_emergency_colour var/matching = light && OR == light.light_outer_range && IR == light.light_inner_range && PO == light.light_power && CO == light.light_color && FC == light.light_falloff_curve if(!matching) @@ -570,18 +566,6 @@ DEFINE_INTERACTABLE(/obj/machinery/light) alter_flicker(FALSE) flicker_timer = addtimer(CALLBACK(src, PROC_REF(flicker_on)), rand(5, 50), TIMER_STOPPABLE|TIMER_DELETE_ME) -/obj/machinery/light/proc/firealarm_on() - SIGNAL_HANDLER - - firealarm = TRUE - update() - -/obj/machinery/light/proc/firealarm_off() - SIGNAL_HANDLER - - firealarm = FALSE - update() - // ai attack - make lights flicker, because why not /obj/machinery/light/attack_ai(mob/user) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 8ea413b852e..8e51a9ae3b2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -233,7 +233,6 @@ /obj/machinery/disposal/delivery_chute = FALSE, /obj/structure/sign = FALSE, /obj/structure/lattice = FALSE, - /obj/structure/grille = FALSE, /obj/structure/frame/machine = FALSE, )) diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index a9b5e388679..c2e9730e99e 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -28,10 +28,6 @@ projectile_type = /obj/projectile/magic/safety harmful = FALSE -/obj/item/ammo_casing/magic/door - projectile_type = /obj/projectile/magic/door - harmful = FALSE - /obj/item/ammo_casing/magic/fireball projectile_type = /obj/projectile/magic/fireball diff --git a/code/modules/projectiles/ammunition/special/syringe.dm b/code/modules/projectiles/ammunition/special/syringe.dm index 59f5f3b3177..a73be5adf4f 100644 --- a/code/modules/projectiles/ammunition/special/syringe.dm +++ b/code/modules/projectiles/ammunition/special/syringe.dm @@ -21,15 +21,6 @@ D.inject_flags = S.inject_flags SG.syringes.Remove(S) qdel(S) - else if(istype(loc, /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun)) - var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/syringe_gun = loc - var/obj/item/reagent_containers/syringe/loaded_syringe = syringe_gun.syringes[1] - var/obj/projectile/bullet/dart/shot_dart = loaded_projectile - syringe_gun.reagents.trans_to(shot_dart, min(loaded_syringe.volume, syringe_gun.reagents.total_volume), transfered_by = user) - shot_dart.name = loaded_syringe.name - shot_dart.inject_flags = loaded_syringe.inject_flags - LAZYREMOVE(syringe_gun.syringes, loaded_syringe) - qdel(loaded_syringe) return ..() /obj/item/ammo_casing/chemgun diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index f4e545e521b..69220a7e202 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -5,7 +5,6 @@ ammo_type = /obj/item/ammo_casing/a357 max_ammo = 7 multiple_sprites = AMMO_BOX_PER_BULLET - item_flags = NO_MAT_REDEMPTION /obj/item/ammo_box/a357/match name = "speed loader (.357 Match)" diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index e160e40ead7..e30ea289a6c 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -473,10 +473,6 @@ TYPEINFO_DEF(/obj/item/gun/energy/beam_rifle) return ..() /obj/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) - if(istype(target, /obj/machinery/door)) - return 0.4 - if(istype(target, /obj/structure/window)) - return 0.5 return 1 /obj/projectile/beam/beam_rifle/proc/handle_impact(atom/target) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 8f935be4000..878bddf3104 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -5,7 +5,7 @@ icon_state = "staff" lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION + item_flags = NEEDS_PERMIT var/allow_intruder_use = FALSE /obj/item/gun/magic/staff/proc/is_wizard_or_friend(mob/user) @@ -114,7 +114,7 @@ no_den_usage = 1 school = SCHOOL_FORBIDDEN //this staff is evil. okay? it just is. look at this projectile type list. this is wrong. var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/fireball, + /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying, /obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping, /obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe) @@ -138,18 +138,6 @@ do_fire_gun(user, user, FALSE) return FALSE -/obj/item/gun/magic/staff/door - name = "staff of door creation" - desc = "An artefact that spits bolts of transformative magic that can create doors in walls." - fire_sound = 'sound/magic/staff_door.ogg' - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "staffofdoor" - inhand_icon_state = "staffofdoor" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - school = SCHOOL_TRANSMUTATION - /obj/item/gun/magic/staff/honk name = "staff of the honkmother" desc = "Honk." diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index cab75740930..c701811b2ca 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -204,27 +204,6 @@ can_charge = TRUE recharge_rate = 1 - -///////////////////////////////////// -//WAND OF DOOR CREATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/door - name = "wand of door creation" - desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." - school = SCHOOL_TRANSMUTATION - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "doorwand" - base_icon_state = "doorwand" - fire_sound = 'sound/magic/staff_door.ogg' - max_charges = 20 //20, 10, 10, 7 - no_den_usage = 1 - -/obj/item/gun/magic/wand/door/zap_self(mob/living/user) - to_chat(user, span_notice("You feel vaguely more open with your feelings.")) - charges-- - ..() - ///////////////////////////////////// //WAND OF FIREBALL ///////////////////////////////////// diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 6374b95b391..e9ba2001b31 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -102,35 +102,6 @@ smoke.set_up(0, location = t) smoke.start() -/obj/projectile/magic/door - name = "bolt of door creation" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond) - -/obj/projectile/magic/door/on_hit(atom/target) - . = ..() - if(istype(target, /obj/machinery/door)) - OpenDoor(target) - else - var/turf/T = get_turf(target) - if(isclosedturf(T) && !isindestructiblewall(T)) - CreateDoor(T) - -/obj/projectile/magic/door/proc/CreateDoor(turf/T) - var/door_type = pick(door_types) - var/obj/structure/mineral_door/D = new door_type(T) - T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - D.Open() - -/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D) - if(istype(D, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = D - A.locked = FALSE - D.open() - /obj/projectile/magic/change name = "bolt of change" icon_state = "ice_1" diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index c2d04ad8cb7..acec7aba27c 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -81,10 +81,6 @@ shrapnel_type = null var/sturdy = list( /turf/closed, - /obj/vehicle/sealed/mecha, - /obj/machinery/door, - /obj/structure/window, - /obj/structure/grille ) /obj/item/broken_missile diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 36d6dfe11c6..8aff6e0a4a3 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -165,24 +165,6 @@ category = list( "Electronics") mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI -/datum/design/airlock_board - name = "Airlock Electronics" - id = "airlock_board" - build_type = AUTOLATHE | FABRICATOR - materials = list(/datum/material/steel = 50, /datum/material/glass = 50) - build_path = /obj/item/electronics/airlock - category = list( "Electronics") - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI - -/datum/design/firelock_board - name = "Firelock Circuitry" - id = "firelock_board" - build_type = AUTOLATHE | FABRICATOR - materials = list(/datum/material/steel = 50, /datum/material/glass = 50) - build_path = /obj/item/electronics/firelock - category = list( "Electronics") - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI - /datum/design/airalarm_electronics name = "Air Alarm Electronics" id = "airalarm_electronics" @@ -192,42 +174,6 @@ category = list( "Electronics") mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI -/datum/design/firealarm_electronics - name = "Fire Alarm Electronics" - id = "firealarm_electronics" - build_type = AUTOLATHE | FABRICATOR - materials = list(/datum/material/steel = 50, /datum/material/glass = 50) - build_path = /obj/item/electronics/firealarm - category = list( "Electronics") - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI - -/datum/design/airlock_painter - name = "Airlock Painter" - id = "airlock_painter" - build_type = AUTOLATHE | FABRICATOR - materials = list(/datum/material/steel = 50, /datum/material/glass = 50) - build_path = /obj/item/airlock_painter - category = list(DCAT_PAINTER) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI - -/datum/design/airlock_painter/decal - name = "Decal Painter" - id = "decal_painter" - build_type = AUTOLATHE | FABRICATOR - materials = list(/datum/material/steel = 50, /datum/material/glass = 50) - build_path = /obj/item/airlock_painter/decal - category = list(DCAT_PAINTER) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI - -/datum/design/airlock_painter/decal/tile - name = "Tile Sprayer" - id = "tile_sprayer" - build_type = AUTOLATHE | FABRICATOR - materials = list(/datum/material/steel = 50, /datum/material/glass = 50) - build_path = /obj/item/airlock_painter/decal/tile - category = list(DCAT_PAINTER) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI - /datum/design/paint_sprayer name = "Paint Sprayer" id = "paint_sprayer" @@ -996,14 +942,6 @@ build_path = /obj/item/chisel category = list(DCAT_MISC_TOOL) -/datum/design/control - name = "Blast Door Controller" - id = "blast" - build_type = AUTOLATHE - materials = list(/datum/material/steel = 100, /datum/material/glass = 50) - build_path = /obj/item/assembly/control - category = list(DCAT_ASSEMBLY) - /datum/design/razor name = "Electric Razor" id = "razor" diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 3e2e12c0209..f9556fdbd96 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -126,17 +126,6 @@ desc = "Allows for the construction of circuit boards used to build a prisoner management console." id = "prisonmanage" build_path = /obj/item/circuitboard/computer/prisoner -/datum/design/board/mechacontrol - name = "Circuit Board (Exosuit Control Console)" - desc = "Allows for the construction of circuit boards used to build an exosuit control console." - id = "mechacontrol" - build_path = /obj/item/circuitboard/computer/mecha_control - -/datum/design/board/mechapower - name = "Circuit Board (Mech Bay Power Control Console)" - desc = "Allows for the construction of circuit boards used to build a mech bay power control console." - id = "mechapower" - build_path = /obj/item/circuitboard/computer/mech_bay_power_console /datum/design/board/cargo name = "Circuit Board (Supply Console)" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 9e470b2be66..184e508f3b9 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -214,13 +214,6 @@ build_path = /obj/item/circuitboard/machine/cyborgrecharger mapload_design_flags = DESIGN_IMPRINTER -/datum/design/board/mech_recharger - name = "Machine Board (Mechbay Recharger Board)" - desc = "The circuit board for a Mechbay Recharger." - id = "mech_recharger" - build_path = /obj/item/circuitboard/machine/mech_recharger - mapload_design_flags = DESIGN_IMPRINTER - // /datum/design/board/dnascanner // name = "Machine Board (DNA Scanner)" // desc = "The circuit board for a DNA Scanner." diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm deleted file mode 100644 index 0687035ef37..00000000000 --- a/code/modules/research/designs/mecha_designs.dm +++ /dev/null @@ -1,490 +0,0 @@ -/////////////////////////////////// -//////////Mecha Module Disks/////// -/////////////////////////////////// - -/datum/design/board/ripley_main - name = "APLU \"Ripley\" Central Control module" - desc = "Allows for the construction of a \"Ripley\" Central Control module." - id = "ripley_main" - build_path = /obj/item/circuitboard/mecha/ripley/main - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/ripley_peri - name = "APLU \"Ripley\" Peripherals Control module" - desc = "Allows for the construction of a \"Ripley\" Peripheral Control module." - id = "ripley_peri" - build_path = /obj/item/circuitboard/mecha/ripley/peripherals - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/odysseus_main - name = "\"Odysseus\" Central Control module" - desc = "Allows for the construction of a \"Odysseus\" Central Control module." - id = "odysseus_main" - build_path = /obj/item/circuitboard/mecha/odysseus/main - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/odysseus_peri - name = "\"Odysseus\" Peripherals Control module" - desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module." - id = "odysseus_peri" - build_path = /obj/item/circuitboard/mecha/odysseus/peripherals - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/gygax_main - name = "\"Gygax\" Central Control module" - desc = "Allows for the construction of a \"Gygax\" Central Control module." - id = "gygax_main" - build_path = /obj/item/circuitboard/mecha/gygax/main - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/gygax_peri - name = "\"Gygax\" Peripherals Control module" - desc = "Allows for the construction of a \"Gygax\" Peripheral Control module." - id = "gygax_peri" - build_path = /obj/item/circuitboard/mecha/gygax/peripherals - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/gygax_targ - name = "\"Gygax\" Weapons & Targeting Control module" - desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module." - id = "gygax_targ" - build_path = /obj/item/circuitboard/mecha/gygax/targeting - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/durand_main - name = "\"Durand\" Central Control module" - desc = "Allows for the construction of a \"Durand\" Central Control module." - id = "durand_main" - build_path = /obj/item/circuitboard/mecha/durand/main - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/durand_peri - name = "\"Durand\" Peripherals Control module" - desc = "Allows for the construction of a \"Durand\" Peripheral Control module." - id = "durand_peri" - build_path = /obj/item/circuitboard/mecha/durand/peripherals - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/durand_targ - name = "\"Durand\" Weapons & Targeting Control module" - desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module." - id = "durand_targ" - build_path = /obj/item/circuitboard/mecha/durand/targeting - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/honker_main - name = "\"H.O.N.K\" Central Control module" - desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." - id = "honker_main" - build_path = /obj/item/circuitboard/mecha/honker/main - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/honker_peri - name = "\"H.O.N.K\" Peripherals Control module" - desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." - id = "honker_peri" - build_path = /obj/item/circuitboard/mecha/honker/peripherals - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/honker_targ - name = "\"H.O.N.K\" Weapons & Targeting Control module" - desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." - id = "honker_targ" - build_path = /obj/item/circuitboard/mecha/honker/targeting - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/phazon_main - name = "\"Phazon\" Central Control module" - desc = "Allows for the construction of a \"Phazon\" Central Control module." - id = "phazon_main" - materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100) - build_path = /obj/item/circuitboard/mecha/phazon/main - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/phazon_peri - name = "\"Phazon\" Peripherals Control module" - desc = "Allows for the construction of a \"Phazon\" Peripheral Control module." - id = "phazon_peri" - materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100) - build_path = /obj/item/circuitboard/mecha/phazon/peripherals - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/phazon_targ - name = "\"Phazon\" Weapons & Targeting Control module" - desc = "Allows for the construction of a \"Phazon\" Weapons & Targeting Control module." - id = "phazon_targ" - materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100) - build_path = /obj/item/circuitboard/mecha/phazon/targeting - category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = NONE - -/datum/design/board/clarke_main - name = "\"Clarke\" Central Control module" - desc = "Allows for the construction of a \"Clarke\" Central Control module." - id = "clarke_main" - build_path = /obj/item/circuitboard/mecha/clarke/main - category = list(DCAT_EXOSUIT_MOD) - -/datum/design/board/clarke_peri - name = "\"Clarke\" Peripherals Control module" - desc = "Allows for the construction of a \"Clarke\" Peripheral Control module." - id = "clarke_peri" - build_path = /obj/item/circuitboard/mecha/clarke/peripherals - category = list(DCAT_EXOSUIT_MOD) - -/datum/design/board/savannah_ivanov_main - name = "\"Savannah-Ivanov\" Central Control module" - desc = "Allows for the construction of a \"Savannah-Ivanov\" Central Control module." - id = "savannah_ivanov_main" - build_path = /obj/item/circuitboard/mecha/savannah_ivanov/main - category = list(DCAT_EXOSUIT_MOD) - -/datum/design/board/savannah_ivanov_peri - name = "\"Savannah-Ivanov\" Peripherals Control module" - desc = "Allows for the construction of a \"Savannah-Ivanov\" Peripheral Control module." - id = "savannah_ivanov_peri" - build_path = /obj/item/circuitboard/mecha/savannah_ivanov/peripherals - category = list(DCAT_EXOSUIT_MOD) - -/datum/design/board/savannah_ivanov_targ - name = "\"Savannah-Ivanov\" Weapons & Targeting Control module" - desc = "Allows for the construction of a \"Savannah-Ivanov\" Weapons & Targeting Control module." - id = "savannah_ivanov_targ" - build_path = /obj/item/circuitboard/mecha/savannah_ivanov/targeting - category = list(DCAT_EXOSUIT_MOD) - -//////////////////////////////////////// -/////////// Mecha Equpment ///////////// -//////////////////////////////////////// - -/datum/design/mech_scattershot - name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")" - desc = "Allows for the construction of LBX AC 10." - id = "mech_scattershot" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_scattershot_ammo - name = "LBX AC 10 Scattershot Ammunition" - desc = "Ammunition for the LBX AC 10 exosuit weapon." - id = "mech_scattershot_ammo" - build_type = FABRICATOR | MECHFAB - build_path = /obj/item/mecha_ammo/scattershot - materials = list(/datum/material/steel=6000) - construction_time = 20 - category = list(DCAT_AMMO) - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/mech_carbine - name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" - desc = "Allows for the construction of FNX-99 \"Hades\" Carbine." - id = "mech_carbine" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_carbine_ammo - name = "FNX-99 Carbine Ammunition" - desc = "Ammunition for the FNX-99 \"Hades\" Carbine." - id = "mech_carbine_ammo" - build_type = FABRICATOR | MECHFAB - build_path = /obj/item/mecha_ammo/incendiary - materials = list(/datum/material/steel=6000) - construction_time = 20 - category = list(DCAT_AMMO) - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/mech_ion - name = "Exosuit Weapon (MKIV Ion Heavy Cannon)" - desc = "Allows for the construction of MKIV Ion Heavy Cannon." - id = "mech_ion" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion - materials = list(/datum/material/steel=20000,/datum/material/silver=6000,/datum/material/uranium=2000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - -/datum/design/mech_tesla - name = "Exosuit Weapon (MKI Tesla Cannon)" - desc = "Allows for the construction of MKI Tesla Cannon." - id = "mech_tesla" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla - materials = list(/datum/material/steel=20000,/datum/material/silver=8000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - -/datum/design/mech_laser - name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)" - desc = "Allows for the construction of CH-PS Laser." - id = "mech_laser" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_laser_heavy - name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)" - desc = "Allows for the construction of CH-LC Laser Cannon." - id = "mech_laser_heavy" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_disabler - name = "Exosuit Weapon (CH-DS \"Peacemaker\" Disabler)" - desc = "Allows for the construction of CH-DS Disabler." - id = "mech_disabler" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_grenade_launcher - name = "Exosuit Weapon (SGL-6 Grenade Launcher)" - desc = "Allows for the construction of SGL-6 Grenade Launcher." - id = "mech_grenade_launcher" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang - materials = list(/datum/material/steel=22000,/datum/material/gold=6000,/datum/material/silver=8000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_grenade_launcher_ammo - name = "SGL-6 Grenade Launcher Ammunition" - desc = "Ammunition for the SGL-6 Grenade Launcher." - id = "mech_grenade_launcher_ammo" - build_type = FABRICATOR | MECHFAB - build_path = /obj/item/mecha_ammo/flashbang - materials = list(/datum/material/steel=4000,/datum/material/gold=500,/datum/material/steel=500) - construction_time = 20 - category = list(DCAT_AMMO) - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/mech_missile_rack - name = "Exosuit Weapon (BRM-6 Missile Rack)" - desc = "Allows for the construction of an BRM-6 Breaching Missile Rack." - id = "mech_missile_rack" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching - materials = list(/datum/material/steel=22000,/datum/material/gold=6000,/datum/material/silver=8000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_missile_rack_ammo - name = "SRM-8 Missile Rack Ammunition" - desc = "Ammunition for the SRM-8 Missile Rack." - id = "mech_missile_rack_ammo" - build_type = FABRICATOR | MECHFAB - build_path = /obj/item/mecha_ammo/missiles_br - materials = list(/datum/material/steel=8000,/datum/material/gold=500,/datum/material/steel=500) - construction_time = 20 - category = list(DCAT_AMMO) - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/clusterbang_launcher - name = "Exosuit Weapon (SOB-3 Clusterbang Launcher)" - desc = "A weapon that violates the Geneva Convention at 3 rounds per minute" - id = "clusterbang_launcher" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang - materials = list(/datum/material/steel=20000,/datum/material/gold=10000,/datum/material/uranium=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/clusterbang_launcher_ammo - name = "SOB-3 Clusterbang Launcher Ammunition" - desc = "Ammunition for the SOB-3 Clusterbang Launcher" - id = "clusterbang_launcher_ammo" - build_type = FABRICATOR | MECHFAB - build_path = /obj/item/mecha_ammo/clusterbang - materials = list(/datum/material/steel=6000,/datum/material/gold=1500,/datum/material/uranium=1500) - construction_time = 20 - category = list(DCAT_AMMO) - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/mech_teleporter - name = "Exosuit Module (Teleporter Module)" - desc = "An exosuit module that allows exosuits to teleport to any position in view." - id = "mech_teleporter" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/teleporter - materials = list(/datum/material/steel=10000,/datum/material/diamond=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_rcd - name = "Exosuit Module (RCD Module)" - desc = "An exosuit-mounted Rapid Construction Device." - id = "mech_rcd" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/rcd - materials = list(/datum/material/steel=30000,/datum/material/gold=20000,/datum/material/plasma=25000,/datum/material/silver=20000) - construction_time = 1200 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_thrusters - name = "Exosuit Module (RCS Thruster Package)" - desc = "A thruster package for exosuits. Expells gas from the internal life-support air tank to generate thrust." - id = "mech_thrusters" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas - materials = list(/datum/material/steel=25000,/datum/material/titanium=5000,/datum/material/silver=3000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_gravcatapult - name = "Exosuit Module (Gravitational Catapult Module)" - desc = "An exosuit mounted Gravitational Catapult." - id = "mech_gravcatapult" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_repair_droid - name = "Exosuit Module (Repair Droid Module)" - desc = "Automated Repair Droid. BEEP BOOP" - id = "mech_repair_droid" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid - materials = list(/datum/material/steel=10000,/datum/material/glass = 5000,/datum/material/gold=1000,/datum/material/silver=2000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_ccw_armor - name = "Exosuit Module (Reactive Armor Booster Module)" - desc = "Exosuit-mounted melee armor booster." - id = "mech_ccw_armor" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster - materials = list(/datum/material/steel=20000,/datum/material/silver=5000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_proj_armor - name = "Exosuit Module (Reflective Armor Booster Module)" - desc = "Exosuit-mounted ranged armor booster." - id = "mech_proj_armor" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster - materials = list(/datum/material/steel=20000,/datum/material/gold=5000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_diamond_drill - name = "Exosuit Mining (Diamond Mining Drill)" - desc = "An upgraded version of the standard drill." - id = "mech_diamond_drill" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill - materials = list(/datum/material/steel=10000,/datum/material/diamond=6500) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_plasma_cutter - name = "Exosuit Mining (217-D Heavy Plasma Cutter)" - desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." - id = "mech_plasma_cutter" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma - materials = list(/datum/material/steel = 8000, /datum/material/glass = 1000, /datum/material/plasma = 2000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_lmg - name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" - desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst." - id = "mech_lmg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_lmg_ammo - name = "Ultra AC 2 Ammunition" - desc = "Ammunition for the Ultra AC 2 LMG" - id = "mech_lmg_ammo" - build_type = FABRICATOR | MECHFAB - build_path = /obj/item/mecha_ammo/lmg - materials = list(/datum/material/steel=4000) - construction_time = 20 - category = list(DCAT_AMMO) - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/mech_sleeper - name = "Exosuit Medical (Mounted Sleeper)" - desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." - id = "mech_sleeper" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper - materials = list(/datum/material/steel=5000, /datum/material/glass = 10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_syringe_gun - name = "Exosuit Medical (Syringe Gun)" - desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur." - id = "mech_syringe_gun" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun - materials = list(/datum/material/steel=3000, /datum/material/glass = 2000) - construction_time = 200 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_medical_beamgun - name = "Exosuit Medical (Medical Beamgun)" - desc = "Equipment for medical exosuits. A mounted medical nanite projector which will treat patients with a focused beam." - id = "mech_medi_beam" - build_type = MECHFAB - materials = list(/datum/material/steel = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000) - construction_time = 250 - build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 0095bd4ea74..963422bdeb7 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -131,717 +131,6 @@ category = list(DCAT_CYBORG) mapload_design_flags = DESIGN_FAB_ROBOTICS -//Ripley -/datum/design/ripley_chassis - name = "Exosuit Chassis (APLU \"Ripley\")" - id = "ripley_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/ripley - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_RIPLEY) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/ripley_torso - name = "Exosuit Torso (APLU \"Ripley\")" - id = "ripley_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/ripley_torso - materials = list(/datum/material/steel=20000,/datum/material/glass = 7500) - construction_time = 200 - category = list(DCAT_RIPLEY) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/ripley_left_arm - name = "Exosuit Left Arm (APLU \"Ripley\")" - id = "ripley_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/ripley_left_arm - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_RIPLEY) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/ripley_right_arm - name = "Exosuit Right Arm (APLU \"Ripley\")" - id = "ripley_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/ripley_right_arm - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_RIPLEY) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/ripley_left_leg - name = "Exosuit Left Leg (APLU \"Ripley\")" - id = "ripley_left_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/ripley_left_leg - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_RIPLEY) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/ripley_right_leg - name = "Exosuit Right Leg (APLU \"Ripley\")" - id = "ripley_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/ripley_right_leg - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_RIPLEY) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -//Odysseus -/datum/design/odysseus_chassis - name = "Exosuit Chassis (\"Odysseus\")" - id = "odysseus_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/odysseus - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/odysseus_torso - name = "Exosuit Torso (\"Odysseus\")" - id = "odysseus_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/odysseus_torso - materials = list(/datum/material/steel=12000) - construction_time = 180 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/odysseus_head - name = "Exosuit Head (\"Odysseus\")" - id = "odysseus_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/odysseus_head - materials = list(/datum/material/steel=6000,/datum/material/glass = 10000) - construction_time = 100 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/odysseus_left_arm - name = "Exosuit Left Arm (\"Odysseus\")" - id = "odysseus_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/odysseus_left_arm - materials = list(/datum/material/steel=6000) - construction_time = 120 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/odysseus_right_arm - name = "Exosuit Right Arm (\"Odysseus\")" - id = "odysseus_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/odysseus_right_arm - materials = list(/datum/material/steel=6000) - construction_time = 120 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/odysseus_left_leg - name = "Exosuit Left Leg (\"Odysseus\")" - id = "odysseus_left_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/odysseus_left_leg - materials = list(/datum/material/steel=7000) - construction_time = 130 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/odysseus_right_leg - name = "Exosuit Right Leg (\"Odysseus\")" - id = "odysseus_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/odysseus_right_leg - materials = list(/datum/material/steel=7000) - construction_time = 130 - category = list(DCAT_ODYSSEUS) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -//Gygax -/datum/design/gygax_chassis - name = "Exosuit Chassis (\"Gygax\")" - id = "gygax_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/gygax - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_torso - name = "Exosuit Torso (\"Gygax\")" - id = "gygax_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_torso - materials = list(/datum/material/steel=20000,/datum/material/glass = 10000,/datum/material/gold=2000, /datum/material/silver=2000) - construction_time = 300 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_head - name = "Exosuit Head (\"Gygax\")" - id = "gygax_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_head - materials = list(/datum/material/steel=10000,/datum/material/glass = 5000, /datum/material/gold=2000, /datum/material/silver=2000) - construction_time = 200 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_left_arm - name = "Exosuit Left Arm (\"Gygax\")" - id = "gygax_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_left_arm - materials = list(/datum/material/steel=15000, /datum/material/gold=1000, /datum/material/silver=1000) - construction_time = 200 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_right_arm - name = "Exosuit Right Arm (\"Gygax\")" - id = "gygax_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_right_arm - materials = list(/datum/material/steel=15000, /datum/material/gold=1000, /datum/material/silver=1000) - construction_time = 200 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_left_leg - name = "Exosuit Left Leg (\"Gygax\")" - id = "gygax_left_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_left_leg - materials = list(/datum/material/steel=15000, /datum/material/gold=2000, /datum/material/silver=2000) - construction_time = 200 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_right_leg - name = "Exosuit Right Leg (\"Gygax\")" - id = "gygax_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_right_leg - materials = list(/datum/material/steel=15000, /datum/material/gold=2000, /datum/material/silver=2000) - construction_time = 200 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/gygax_armor - name = "Exosuit Armor (\"Gygax\")" - id = "gygax_armor" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/gygax_armor - materials = list(/datum/material/steel=15000,/datum/material/gold=10000, /datum/material/silver=10000, /datum/material/titanium=10000) - construction_time = 600 - category = list(DCAT_GYGAX) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -//Durand -/datum/design/durand_chassis - name = "Exosuit Chassis (\"Durand\")" - id = "durand_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/durand - materials = list(/datum/material/steel=25000) - construction_time = 100 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_torso - name = "Exosuit Torso (\"Durand\")" - id = "durand_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_torso - materials = list(/datum/material/steel=25000, /datum/material/glass = 10000,/datum/material/silver=10000) - construction_time = 300 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_head - name = "Exosuit Head (\"Durand\")" - id = "durand_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_head - materials = list(/datum/material/steel=10000,/datum/material/glass = 15000,/datum/material/silver=2000) - construction_time = 200 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_left_arm - name = "Exosuit Left Arm (\"Durand\")" - id = "durand_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_left_arm - materials = list(/datum/material/steel=10000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_right_arm - name = "Exosuit Right Arm (\"Durand\")" - id = "durand_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_right_arm - materials = list(/datum/material/steel=10000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_left_leg - name = "Exosuit Left Leg (\"Durand\")" - id = "durand_left_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_left_leg - materials = list(/datum/material/steel=15000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_right_leg - name = "Exosuit Right Leg (\"Durand\")" - id = "durand_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_right_leg - materials = list(/datum/material/steel=15000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/durand_armor - name = "Exosuit Armor (\"Durand\")" - id = "durand_armor" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/durand_armor - materials = list(/datum/material/steel=30000,/datum/material/uranium=25000,/datum/material/titanium=20000) - construction_time = 600 - category = list(DCAT_DURAND) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -//H.O.N.K -/datum/design/honk_chassis - name = "Exosuit Chassis (\"H.O.N.K\")" - id = "honk_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/honker - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/honk_torso - name = "Exosuit Torso (\"H.O.N.K\")" - id = "honk_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/honker_torso - materials = list(/datum/material/steel=20000,/datum/material/glass = 10000,/datum/material/bananium=10000) - construction_time = 300 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/honk_head - name = "Exosuit Head (\"H.O.N.K\")" - id = "honk_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/honker_head - materials = list(/datum/material/steel=10000,/datum/material/glass = 5000,/datum/material/bananium=5000) - construction_time = 200 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/honk_left_arm - name = "Exosuit Left Arm (\"H.O.N.K\")" - id = "honk_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/honker_left_arm - materials = list(/datum/material/steel=15000,/datum/material/bananium=5000) - construction_time = 200 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/honk_right_arm - name = "Exosuit Right Arm (\"H.O.N.K\")" - id = "honk_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/honker_right_arm - materials = list(/datum/material/steel=15000,/datum/material/bananium=5000) - construction_time = 200 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/honk_left_leg - name = "Exosuit Left Leg (\"H.O.N.K\")" - id = "honk_left_leg" - build_type = MECHFAB - build_path =/obj/item/mecha_parts/part/honker_left_leg - materials = list(/datum/material/steel=20000,/datum/material/bananium=5000) - construction_time = 200 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/honk_right_leg - name = "Exosuit Right Leg (\"H.O.N.K\")" - id = "honk_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/honker_right_leg - materials = list(/datum/material/steel=20000,/datum/material/bananium=5000) - construction_time = 200 - category = list(DCAT_HONK) - mapload_design_flags = DESIGN_FAB_ROBOTICS - - -//Phazon -/datum/design/phazon_chassis - name = "Exosuit Chassis (\"Phazon\")" - id = "phazon_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/phazon - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_torso - name = "Exosuit Torso (\"Phazon\")" - id = "phazon_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_torso - materials = list(/datum/material/steel=35000,/datum/material/glass = 10000,/datum/material/plasma=20000) - construction_time = 300 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_head - name = "Exosuit Head (\"Phazon\")" - id = "phazon_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_head - materials = list(/datum/material/steel=15000,/datum/material/glass = 5000,/datum/material/plasma=10000) - construction_time = 200 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_left_arm - name = "Exosuit Left Arm (\"Phazon\")" - id = "phazon_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_left_arm - materials = list(/datum/material/steel=20000,/datum/material/plasma=10000) - construction_time = 200 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_right_arm - name = "Exosuit Right Arm (\"Phazon\")" - id = "phazon_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_right_arm - materials = list(/datum/material/steel=20000,/datum/material/plasma=10000) - construction_time = 200 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_left_leg - name = "Exosuit Left Leg (\"Phazon\")" - id = "phazon_left_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_left_leg - materials = list(/datum/material/steel=20000,/datum/material/plasma=10000) - construction_time = 200 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_right_leg - name = "Exosuit Right Leg (\"Phazon\")" - id = "phazon_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_right_leg - materials = list(/datum/material/steel=20000,/datum/material/plasma=10000) - construction_time = 200 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/phazon_armor - name = "Exosuit Armor (\"Phazon\")" - id = "phazon_armor" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/phazon_armor - materials = list(/datum/material/steel=25000,/datum/material/plasma=20000,/datum/material/titanium=20000) - construction_time = 300 - category = list(DCAT_PHAZON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -//Savannah-Ivanov -/datum/design/savannah_ivanov_chassis - name = "Exosuit Chassis (\"Savannah-Ivanov\")" - id = "savannah_ivanov_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/savannah_ivanov - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_torso - name = "Exosuit Torso (\"Savannah-Ivanov\")" - id = "savannah_ivanov_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_torso - materials = list(/datum/material/steel=20000,/datum/material/glass = 7500) - construction_time = 200 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_head - name = "Exosuit Head (\"Savannah-Ivanov\")" - id = "savannah_ivanov_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_head - materials = list(/datum/material/steel=6000,/datum/material/glass = 10000) - construction_time = 100 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_left_arm - name = "Exosuit Left Arm (\"Savannah-Ivanov\")" - id = "savannah_ivanov_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_arm - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_right_arm - name = "Exosuit Right Arm (\"Savannah-Ivanov\")" - id = "savannah_ivanov_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_arm - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_chassis - name = "Exosuit Chassis (\"Savannah-Ivanov\")" - id = "savannah_ivanov_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/savannah_ivanov - materials = list(/datum/material/steel=25000) - construction_time = 100 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_torso - name = "Exosuit Torso (\"Savannah-Ivanov\")" - id = "savannah_ivanov_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_torso - materials = list(/datum/material/steel=25000, /datum/material/glass = 10000,/datum/material/silver=10000) - construction_time = 300 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_head - name = "Exosuit Head (\"Savannah-Ivanov\")" - id = "savannah_ivanov_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_head - materials = list(/datum/material/steel=10000,/datum/material/glass = 15000,/datum/material/silver=2000) - construction_time = 200 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_left_arm - name = "Exosuit Left Arm (\"Savannah-Ivanov\")" - id = "savannah_ivanov_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_arm - materials = list(/datum/material/steel=10000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_right_arm - name = "Exosuit Right Arm (\"Savannah-Ivanov\")" - id = "savannah_ivanov_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_arm - materials = list(/datum/material/steel=10000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_left_leg - name = "Exosuit Left Leg (\"Savannah-Ivanov\")" - id = "savannah_ivanov_left_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_left_leg - materials = list(/datum/material/steel=15000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_right_leg - name = "Exosuit Right Leg (\"Savannah-Ivanov\")" - id = "savannah_ivanov_right_leg" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_right_leg - materials = list(/datum/material/steel=15000,/datum/material/silver=4000) - construction_time = 200 - category = list(DCAT_SAVANNAH) - -/datum/design/savannah_ivanov_armor - name = "Exosuit Armor (\"Savannah-Ivanov\")" - id = "savannah_ivanov_armor" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/savannah_ivanov_armor - materials = list(/datum/material/steel=30000,/datum/material/uranium=25000,/datum/material/titanium=20000) - construction_time = 600 - category = list(DCAT_SAVANNAH) - -//Clarke -/datum/design/clarke_chassis - name = "Exosuit Chassis (\"Clarke\")" - id = "clarke_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/clarke - materials = list(/datum/material/steel=20000) - construction_time = 100 - category = list(DCAT_CLARKE) - -/datum/design/clarke_torso - name = "Exosuit Torso (\"Clarke\")" - id = "clarke_torso" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/clarke_torso - materials = list(/datum/material/steel=20000,/datum/material/glass = 7500) - construction_time = 200 - category = list(DCAT_CLARKE) - -/datum/design/clarke_head - name = "Exosuit Head (\"Clarke\")" - id = "clarke_head" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/clarke_head - materials = list(/datum/material/steel=6000,/datum/material/glass = 10000) - construction_time = 100 - category = list(DCAT_CLARKE) - -/datum/design/clarke_left_arm - name = "Exosuit Left Arm (\"Clarke\")" - id = "clarke_left_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/clarke_left_arm - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_CLARKE) - -/datum/design/clarke_right_arm - name = "Exosuit Right Arm (\"Clarke\")" - id = "clarke_right_arm" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/part/clarke_right_arm - materials = list(/datum/material/steel=15000) - construction_time = 150 - category = list(DCAT_CLARKE) - -//Exosuit Equipment -/datum/design/ripleyupgrade - name = "Ripley MK-I to MK-II conversion kit" - id = "ripleyupgrade" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/ripleyupgrade - materials = list(/datum/material/steel=10000,/datum/material/plasma=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_hydraulic_clamp - name = "Exosuit Engineering (Hydraulic Clamp)" - id = "mech_hydraulic_clamp" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_drill - name = "Exosuit Mining (Mining Drill)" - id = "mech_drill" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/drill - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_mining_scanner - name = "Exosuit Engineering (Mining Scanner)" - id = "mech_mscanner" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner - materials = list(/datum/material/steel=5000,/datum/material/glass = 2500) - construction_time = 50 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_extinguisher - name = "Exosuit Engineering (Extinguisher)" - id = "mech_extinguisher" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher - materials = list(/datum/material/steel=10000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_generator - name = "Exosuit Module (Plasma Generator)" - id = "mech_generator" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/generator - materials = list(/datum/material/steel=10000,/datum/material/glass = 1000,/datum/material/silver=2000,/datum/material/plasma=5000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_mousetrap_mortar - name = "H.O.N.K Weapon (Mousetrap Mortar)" - id = "mech_mousetrap_mortar" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar - materials = list(/datum/material/steel=20000,/datum/material/bananium=5000) - construction_time = 300 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_banana_mortar - name = "H.O.N.K Weapon (Banana Mortar)" - id = "mech_banana_mortar" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar - materials = list(/datum/material/steel=20000,/datum/material/bananium=5000) - construction_time = 300 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_honker - name = "H.O.N.K Weapon (HoNkER BlAsT 5000)" - id = "mech_honker" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker - materials = list(/datum/material/steel=20000,/datum/material/bananium=10000) - construction_time = 500 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mech_punching_glove - name = "H.O.N.K Weapon (Oingo Boingo Punch-face)" - id = "mech_punching_face" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove - materials = list(/datum/material/steel=20000,/datum/material/bananium=7500) - construction_time = 400 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS ///////////////////////////////////////// //////////////Borg Upgrades////////////// @@ -1079,25 +368,6 @@ mapload_design_flags = DESIGN_FAB_ROBOTICS //Misc -/datum/design/mecha_tracking - name = "Exosuit Tracker (Exosuit Tracking Beacon)" - id = "mecha_tracking" - build_type = MECHFAB - build_path =/obj/item/mecha_parts/mecha_tracking - materials = list(/datum/material/steel=500) - construction_time = 50 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - -/datum/design/mecha_tracking_ai_control - name = "AI Control Beacon" - id = "mecha_tracking_ai_control" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_tracking/ai_control - materials = list(/datum/material/steel = 1000, /datum/material/glass = 500, /datum/material/silver = 200) - construction_time = 50 - category = list(DCAT_SILICON) - mapload_design_flags = DESIGN_FAB_ROBOTICS /datum/design/synthetic_flash name = "Flash" @@ -1371,13 +641,6 @@ build_path = /obj/item/mod/module/gps department_type = MODULE_SUPPLY -/datum/design/module/mod_constructor - name = "MOD Module: Constructor" - id = "mod_constructor" - materials = list(/datum/material/steel = 1000, /datum/material/titanium = 500) - build_path = /obj/item/mod/module/constructor - department_type = MODULE_ENGINEERING - /datum/design/module/mod_quick_carry name = "MOD Module: Quick Carry" id = "mod_quick_carry" diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 7c5d5de4ea7..986e6f901b6 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -33,15 +33,6 @@ category = list(DCAT_BASIC_TOOL) mapload_design_flags = DESIGN_FAB_ENGINEERING -/datum/design/rpd - name = "Rapid Pipe Dispenser (RPD)" - id = "rpd_loaded" - build_type = FABRICATOR - materials = list(/datum/material/steel = 75000, /datum/material/glass = 37500) - build_path = /obj/item/pipe_dispenser - category = list(DCAT_CONSTRUCTION) - mapload_design_flags = DESIGN_FAB_ENGINEERING - /datum/design/wirebrush name = "Wirebrush" desc = "A tool to remove rust from walls." diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index 7d078111e6f..8e6b0319436 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -486,18 +486,6 @@ build_type = FABRICATOR | COMPONENT_PRINTER category = list(DCAT_WIREMOD, "Shells") -/datum/design/airlock_shell - name = "Airlock Shell" - desc = "A door shell that cannot be moved around when assembled." - id = "door_shell" - materials = list( - /datum/material/glass = 5000, - /datum/material/steel = 15000, - ) - build_path = /obj/item/shell/airlock - build_type = FABRICATOR | COMPONENT_PRINTER - category = list(DCAT_WIREMOD, "Shells") - /datum/design/dispenser_shell name = "Dispenser Shell" desc = "A dispenser shell that can dispense items." diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index c33905ca8f4..6f10641f2bc 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -304,17 +304,3 @@ Chilling extracts: user.visible_message(span_notice("[src] blooms into a beautiful flower!")) new /obj/item/clothing/head/peaceflower(get_turf(user)) ..() - -/obj/item/slimecross/chilling/rainbow - colour = "rainbow" - effect_desc = "Makes an unpassable wall in every door in the area." - -/obj/item/slimecross/chilling/rainbow/do_effect(mob/user) - var/area/area = get_area(user) - if(area.outdoors) - to_chat(user, span_warning("[src] can't affect such a large area.")) - return - user.visible_message(span_warning("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!")) - for(var/obj/machinery/door/airlock/door in area) - new /obj/effect/forcefield/slimewall/rainbow(door.loc) - return ..() diff --git a/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm b/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm index db81d763b5f..a8dd7e4ec15 100644 --- a/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm +++ b/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm @@ -29,14 +29,6 @@ /datum/keycard_auth_action/red_alert/trigger() set_security_level(SEC_LEVEL_RED) -/datum/keycard_auth_action/emergency_maintenance - name = "Emergency Maintenance Access" - ui_icon = "wrench" - -/datum/keycard_auth_action/emergency_maintenance/trigger() - make_maint_all_access() - - /datum/keycard_auth_action/bsa_firing_toggle name = "Bluespace Artillery Unlock" ui_icon = "meteor" @@ -48,4 +40,3 @@ GLOB.bsa_unlock = !GLOB.bsa_unlock minor_announce("Bluespace Artillery firing protocols have been [GLOB.bsa_unlock? "unlocked" : "locked"]", "Weapons Systems Update:") SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("bluespace artillery", GLOB.bsa_unlock? "unlocked" : "locked")) - diff --git a/code/modules/security_levels/keycard_auth/keycard_authentication.dm b/code/modules/security_levels/keycard_auth/keycard_authentication.dm index d60f25d4553..213865adcd9 100644 --- a/code/modules/security_levels/keycard_auth/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_auth/keycard_authentication.dm @@ -62,7 +62,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) data["waiting"] = waiting data["auth_required"] = event_source ? event_source.event : 0 data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0 - data["emergency_maint"] = GLOB.emergency_access data["bsa_unlock"] = GLOB.bsa_unlock return data @@ -144,29 +143,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer, message_type=DEADCHAT_ANNOUNCEMENT) event.trigger() -GLOBAL_VAR_INIT(emergency_access, FALSE) -/proc/make_maint_all_access() - for(var/area/station/maintenance/A in GLOB.areas) - for(var/turf/in_area as anything in A.get_contained_turfs()) - for(var/obj/machinery/door/airlock/D in in_area) - D.emergency = TRUE - D.update_icon(ALL, 0) - - minor_announce("Access restrictions on maintenance and external airlocks have been lifted.", "Attention! Station-wide emergency declared!",1) - GLOB.emergency_access = TRUE - SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled")) - -/proc/revoke_maint_all_access() - for(var/area/station/maintenance/A in GLOB.areas) - for(var/turf/in_area as anything in A.get_contained_turfs()) - for(var/obj/machinery/door/airlock/D in in_area) - D.emergency = FALSE - D.update_icon(ALL, 0) - minor_announce("Access restrictions in maintenance areas have been restored.", "Attention! Station-wide emergency rescinded:") - GLOB.emergency_access = FALSE - SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled")) - - #undef KEYCARD_RED_ALERT #undef KEYCARD_EMERGENCY_MAINTENANCE_ACCESS #undef KEYCARD_BSA_UNLOCK diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 6f8523837eb..259eeb675e7 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -170,30 +170,6 @@ All ShuttleMove procs go here /************************************Machinery move procs************************************/ -/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) - . = ..() - for(var/obj/machinery/door/airlock/other_airlock in range(2, src)) // includes src, extended because some escape pods have 1 plating turf exposed to space - other_airlock.shuttledocked = FALSE - other_airlock.air_tight = TRUE - spawn(-1) - if((other_airlock.close(FALSE, TRUE) || other_airlock.density) && other_airlock == src && moving_dock.bolt_doors) // force crush - if(locate(/turf/open/space) in orange(1, other_airlock)) - other_airlock.bolt() - -/obj/machinery/door/airlock/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) - . = ..() - if(istype(old_dock, /obj/docking_port/stationary/transit) && locked && moving_dock.bolt_doors) - unbolt() - -/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - var/current_area = get_area(src) - for(var/obj/machinery/door/airlock/other_airlock in orange(2, src)) // does not include src, extended because some escape pods have 1 plating turf exposed to space - if(get_area(other_airlock) != current_area) // does not include double-wide airlocks unless actually docked - // Cycle linking is only disabled if we are actually adjacent to another airlock - shuttledocked = TRUE - other_airlock.shuttledocked = TRUE - /obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) @@ -204,10 +180,6 @@ All ShuttleMove procs go here . = ..() GLOB.cameranet.addCamera(src) -/obj/machinery/mech_bay_recharge_port/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir) - . = ..() - recharging_turf = get_step(loc, dir) - /obj/machinery/computer/auxiliary_base/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() if(is_mining_level(z)) //Avoids double logging and landing on other Z-levels due to badminnery @@ -306,11 +278,6 @@ All ShuttleMove procs go here /************************************Structure move procs************************************/ -/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) - . = ..() - if(. & MOVE_AREA) - . |= MOVE_CONTENTS - /obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 24d46ac05fe..9a4d048dcbd 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -678,8 +678,6 @@ return ripple_turfs /obj/docking_port/mobile/proc/check_poddoors() - for(var/obj/machinery/door/poddoor/shuttledock/pod in INSTANCES_OF(/obj/machinery/door)) - pod.check() /obj/docking_port/mobile/proc/dock_id(id) var/port = SSshuttle.getDock(id) @@ -934,11 +932,6 @@ if(engines.len > 0) distant_source = engines[1] - else - for(var/A in areas) - distant_source = locate(/obj/machinery/door) in A - if(distant_source) - break if(distant_source) for(var/mob/M in SSmobs.clients_by_zlevel[z]) diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index 26e92d00bc3..00561c9a883 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -106,14 +106,6 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate params = NONE return ..() -/obj/machinery/door/airlock/shuttleRotate(rotation, params) - . = ..() - if(cyclelinkeddir && (params & ROTATE_DIR)) - cyclelinkeddir = angle2dir(rotation+dir2angle(cyclelinkeddir)) - // If we update the linked airlock here, the partner airlock might - // not be present yet, so don't do that. Just assume we're still - // partnered with the same airlock as before. - /obj/machinery/porta_turret/shuttleRotate(rotation, params) . = ..() if(wall_turret_direction && (params & ROTATE_DIR)) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 1aceac6b349..0c1f725656e 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/effect/portal, /obj/structure/extraction_point, /obj/machinery/syndicatebomb, - /obj/item/hilbertshotel, /obj/item/swapper, /obj/docking_port, /obj/machinery/launchpad, diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index 80baa734ade..8908a5b0ec0 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -70,10 +70,8 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/gun/magic/wand/resurrection, /obj/item/gun/magic/wand/polymorph, /obj/item/gun/magic/wand/teleport, - /obj/item/gun/magic/wand/door, /obj/item/gun/magic/wand/fireball, /obj/item/gun/magic/staff/healing, - /obj/item/gun/magic/staff/door, /obj/item/scrying, /obj/item/warpwhistle)) diff --git a/code/modules/spooky/abilities/knock_on_window_or_door.dm b/code/modules/spooky/abilities/knock_on_window_or_door.dm deleted file mode 100644 index dd948953d12..00000000000 --- a/code/modules/spooky/abilities/knock_on_window_or_door.dm +++ /dev/null @@ -1,24 +0,0 @@ -/datum/action/cooldown/knock_sound - name = "Knock" - desc = "Create an audio phenomena centered on a door or window." - - click_to_activate = TRUE - cooldown_time = 120 SECONDS - write_log = TRUE - ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' - -/datum/action/cooldown/knock_sound/is_valid_target(atom/cast_on) - return istype(cast_on, /obj/structure/window) || istype(cast_on, /obj/machinery/door) - -/datum/action/cooldown/knock_sound/Activate(atom/target) - . = ..() - if(istype(target, /obj/machinery/door)) - var/obj/machinery/door/D = target - D.knock_on() - - else if(istype(target, /obj/structure/window)) - var/obj/structure/window/W = target - W.knock_on() - - RECORD_GHOST_POWER(src) - diff --git a/code/modules/spooky/abilities/shatter_glass.dm b/code/modules/spooky/abilities/shatter_glass.dm deleted file mode 100644 index b56c7da3024..00000000000 --- a/code/modules/spooky/abilities/shatter_glass.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/action/cooldown/shatter_glass - name = "Resonance" - desc = "Vibrate a nearby glass object enough to cause integrity failure." - - click_to_activate = TRUE - cooldown_time = 30 MINUTES - write_log = TRUE - ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' - -/datum/action/cooldown/shatter_glass/is_valid_target(atom/cast_on) - if(istype(target, /obj/structure/window)) - var/obj/structure/window/W = target - if(W.reinf) - to_chat(owner, span_warning("I cannot shatter that, it is too strong.")) - return FALSE - return TRUE - - return istype(target, /obj/structure/table/glass) - -/datum/action/cooldown/shatter_glass/Activate(atom/target) - . = ..() - var/obj/structure/S = target - S.deconstruct() - - RECORD_GHOST_POWER(src) diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 2926e00a4f3..266d63cb2ce 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -514,20 +514,6 @@ TYPEINFO_DEF(/obj/structure/table) new framestack(T, framestackamount) qdel(src) -/obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16) - return FALSE - -/obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct the table.")) - qdel(src) - return TRUE - return FALSE - /obj/structure/table/proc/table_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) SIGNAL_HANDLER if(!shove_blocked) diff --git a/code/modules/unit_tests/__unit_tests.dm b/code/modules/unit_tests/__unit_tests.dm index e8c23a48d9b..2cd9a2e4ced 100644 --- a/code/modules/unit_tests/__unit_tests.dm +++ b/code/modules/unit_tests/__unit_tests.dm @@ -161,7 +161,6 @@ #include "preferences.dm" #include "projectiles.dm" #include "quirks.dm" -#include "rcd.dm" #include "resist.dm" #include "say.dm" #include "serving_tray.dm" diff --git a/code/modules/unit_tests/combat/__include.dm b/code/modules/unit_tests/combat/__include.dm index d18859ac5cb..4b8a19d67ba 100644 --- a/code/modules/unit_tests/combat/__include.dm +++ b/code/modules/unit_tests/combat/__include.dm @@ -3,7 +3,6 @@ #include "combat.dm" #include "combat_blocking.dm" #include "combat_cuffs.dm" -#include "combat_door_click.dm" #include "combat_emp_flashlight.dm" #include "combat_evidencebag.dm" #include "combat_flash.dm" diff --git a/code/modules/unit_tests/combat/combat_door_click.dm b/code/modules/unit_tests/combat/combat_door_click.dm deleted file mode 100644 index 886d07ce8fb..00000000000 --- a/code/modules/unit_tests/combat/combat_door_click.dm +++ /dev/null @@ -1,14 +0,0 @@ -/// Tests that airlocks can be closed by clicking on the floor, as [/datum/component/redirect_attack_hand_from_turf ] dictates -/datum/unit_test/combat/door_click - name = "COMBAT/INTERACTION: Doors Shall Open and Close On Click." - -/datum/unit_test/combat/door_click/Run() - var/mob/living/carbon/human/consistent/tider = ALLOCATE_BOTTOM_LEFT() - var/obj/machinery/door/airlock/public/glass/door = ALLOCATE_BOTTOM_LEFT() - - tider.forceMove(locate(door.x + 1, door.y, door.z)) - door.open() // this sleeps we just have to cope - TEST_ASSERT(!door.operating, "Airlock was operating after being opened.") - TEST_ASSERT(!door.density, "Airlock was not open after being opened.") - click_wrapper(tider, get_turf(door)) - TEST_ASSERT(door.operating, "Airlock was not closing after clicking the turf below, as per /datum/component/redirect_attack_hand_from_turf.") diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index dcaff3938fb..d6e36ff7d80 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -67,8 +67,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) ignore += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) //No heart to give ignore += typesof(/obj/structure/ethereal_crystal) - //No linked console - ignore += typesof(/mob/camera/ai_eye/remote/base_construction) //See above ignore += typesof(/mob/camera/ai_eye/remote/shuttle_docker) //Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky @@ -77,8 +75,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) ignore += typesof(/obj/effect/timestop) //Invoke async in init, skippppp ignore += typesof(/mob/living/silicon/robot/model) - //This lad also sleeps - ignore += typesof(/obj/item/hilbertshotel) //Stacks baseturfs, can't be tested here ignore += typesof(/obj/effect/landmark/ctf) //Our system doesn't support it without warning spam from unregister calls on things that never registered @@ -87,8 +83,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) ignore += typesof(/obj/item/pinpointer/shuttle) //This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK ignore += typesof(/obj/structure/alien/resin/flower_bud) - //Needs a linked mecha - ignore += typesof(/obj/effect/skyfall_landingzone) //Expects a mob to holderize, we have nothing to give ignore += typesof(/obj/item/mob_holder) //Needs cards passed into the initilazation args diff --git a/code/modules/unit_tests/mapping_standards/__include.dm b/code/modules/unit_tests/mapping_standards/__include.dm index 1a3d9e961bc..b4d24ad5293 100644 --- a/code/modules/unit_tests/mapping_standards/__include.dm +++ b/code/modules/unit_tests/mapping_standards/__include.dm @@ -7,4 +7,3 @@ #include "enforce_count\_enforce_count.dm" #include "enforce_count\lights.dm" -#include "enforce_count\doors.dm" diff --git a/code/modules/unit_tests/mapping_standards/enforce_count/doors.dm b/code/modules/unit_tests/mapping_standards/enforce_count/doors.dm deleted file mode 100644 index 38d2c2d27de..00000000000 --- a/code/modules/unit_tests/mapping_standards/enforce_count/doors.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/unit_test/mapping_standards/enforce_count/doors - abstract_type = /datum/unit_test/mapping_standards/enforce_count/doors - -/datum/unit_test/mapping_standards/enforce_count/doors/get_collection() - return INSTANCES_OF(/obj/machinery/door) - -/datum/unit_test/mapping_standards/enforce_count/doors/airlock - name = "MAPSTANDARDS: Tiles Must Have At Most 1 Airlock" - checked_type = /obj/machinery/door/airlock - failed_name = "Airlocks" - -/datum/unit_test/mapping_standards/enforce_count/doors/firedoor - name = "MAPSTANDARDS: Tiles Must Have At Most 1 Firedoor" - checked_type = /obj/machinery/door/firedoor - failed_name = "Firedoors" - -/datum/unit_test/mapping_standards/enforce_count/doors/blastdoor - name = "MAPSTANDARDS: Tiles Must Have At Most 1 Blast Door" - checked_type = /obj/machinery/door/poddoor - failed_name = "Blast Doors" diff --git a/code/modules/unit_tests/rcd.dm b/code/modules/unit_tests/rcd.dm deleted file mode 100644 index b65d02312a7..00000000000 --- a/code/modules/unit_tests/rcd.dm +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Simple unit test to ensure there's no regression in behaviour where machine frames should not be stacked. - * - * We attempt to use the RCD to build multiple stacked machine frames on a turf. If we end up with any number that - * is not equal to 1, this means we've either built no machine frames (bad) or built more than one (regression). - * - * If this is successful, we attempt to spawn in some no-density machines that result in machine frames and we run - * the test again on our turf containing our single frame, deconstructing the machines! This should also not spawn - * any stacked machine frames. - */ -/datum/unit_test/frame_stacking/Run() - // First test - RCDs stacking frames. - var/obj/item/construction/rcd/rcd = allocate(/obj/item/construction/rcd/combat/admin) - var/mob/living/carbon/human/engineer = allocate(/mob/living/carbon/human) - - engineer.put_in_hands(rcd, forced = TRUE) - - rcd.mode = RCD_MACHINE - - var/list/adjacent_turfs = get_adjacent_open_turfs(engineer) - - TEST_ASSERT(length(adjacent_turfs), "RCD Test failed - Lack of adjacent open turfs. This may be an issue with the unit test.") - - var/turf/adjacent_turf = adjacent_turfs[1] - - for(var/i in 1 to 10) - adjacent_turf.rcd_act(engineer, rcd, rcd.mode) - - var/frame_count = 0 - for(var/obj/structure/frame/machine_frame in adjacent_turf.contents) - frame_count++ - - TEST_ASSERT_EQUAL(frame_count, 1, "Expected RCD machine frame stacking test to end up with exactly 1 machine frame.") - - // Second test - Deconstructing stacked machines to stack frames. We'll recycle our old turf to accomplish this. - for(var/i in 1 to 10) - // This should be a type path to a machine with no density, that can be wrenched on a turf with another machine of the same type. - var/obj/machinery/new_machine = new /obj/machinery/recharger(adjacent_turf) - new_machine.deconstruct(TRUE) - - frame_count = 0 - for(var/obj/structure/frame/machine_frame in adjacent_turf.contents) - frame_count++ - - TEST_ASSERT_EQUAL(frame_count, 1, "Expected no density machine deconstruction frame stacking test to end up with exactly 1 machine frame.") diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 9001396e157..27260999295 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -82,13 +82,6 @@ item = /obj/item/storage/belt/military cost = 1 -/datum/uplink_item/device_tools/doorjack - name = "Airlock Authentication Override Card" - desc = "A specialized cryptographic sequencer specifically designed to override station airlock access codes. \ - After hacking a certain number of airlocks, the device will require some time to recharge." - item = /obj/item/card/emag/doorjack - cost = 3 - /datum/uplink_item/device_tools/fakenucleardisk name = "Decoy Nuclear Authentication Disk" desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \ diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index f5e5955a20d..db3470eeced 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -407,20 +407,6 @@ purchasable_from = UPLINK_NUKE_OPS illegal_tech = FALSE -/datum/uplink_item/ammo/mech/bag - name = "Mech Support Kit Bag" - desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech - cost = 4 - purchasable_from = UPLINK_NUKE_OPS - -/datum/uplink_item/ammo/mauler/bag - name = "Mauler Ammo Bag" - desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler - cost = 6 - purchasable_from = UPLINK_NUKE_OPS - /datum/uplink_item/explosives/bioterrorfoam name = "Bioterror Foam Grenade" desc = "A powerful chemical foam grenade which creates a deadly torrent of foam that will mute, blind, confuse, \ @@ -565,27 +551,6 @@ cost = 35 restricted = TRUE -/datum/uplink_item/support/gygax - name = "Dark Gygax Exosuit" - desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent \ - for hit-and-run style attacks. Features a scattershot shotgun, armor boosters against melee and ranged attacks, ion thrusters and a Tesla energy array." - item = /obj/vehicle/sealed/mecha/combat/gygax/dark/loaded - cost = 80 - -/datum/uplink_item/support/honker - name = "Dark H.O.N.K." - desc = "A clown combat mech equipped with bombanana peel and tearstache grenade launchers, as well as the ubiquitous HoNkER BlAsT 5000." - item = /obj/vehicle/sealed/mecha/combat/honker/dark/loaded - cost = 80 - purchasable_from = UPLINK_CLOWN_OPS - -/datum/uplink_item/support/mauler - name = "Mauler Exosuit" - desc = "A massive and incredibly deadly military-grade exosuit. Features long-range targeting, thrust vectoring \ - and deployable smoke. Comes equipped with an LMG, scattershot carbine, missile rack, an antiprojectile armor booster and a Tesla energy array." - item = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded - cost = 140 - /datum/uplink_item/support/turretbox name = "Disposable Sentry Gun" desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality." diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm deleted file mode 100644 index 6ef845bb14c..00000000000 --- a/code/modules/vehicles/mecha/_mecha.dm +++ /dev/null @@ -1,1319 +0,0 @@ -/***************** WELCOME TO MECHA.DM, ENJOY YOUR STAY *****************/ - -/** - * Mechs are now (finally) vehicles, this means you can make them multicrew - * They can also grant select ability buttons based on occupant bitflags - * - * Movement is handled through vehicle_move() which is called by relaymove - * Clicking is done by way of signals registering to the entering mob - * NOTE: MMIS are NOT mobs but instead contain a brain that is, so you need special checks - * AI also has special checks becaus it gets in and out of the mech differently - * Always call remove_occupant(mob) when leaving the mech so the mob is removed properly - * - * For multi-crew, you need to set how the occupants recieve ability bitflags corresponding to their status on the vehicle(i.e: driver, gunner etc) - * Abilities can then be set to only apply for certain bitflags and are assigned as such automatically - * - * Clicks are wither translated into mech_melee_attack (see mech_melee_attack.dm) - * Or are used to call action() on equipped gear - * Cooldown for gear is on the mech because exploits - */ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha) - default_armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha - name = "mecha" - desc = "Exosuit" - icon = 'icons/mecha/mecha.dmi' - resistance_flags = FIRE_PROOF | ACID_PROOF - max_integrity = 300 - force = 5 - movedelay = 1 SECONDS - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_EXTREMELY_STRONG - COOLDOWN_DECLARE(mecha_bump_smash) - light_system = OVERLAY_LIGHT_DIRECTIONAL - light_on = FALSE - light_outer_range = 8 - generic_canpass = FALSE - hud_possible = list( - DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi', - DIAG_BATT_HUD = 'icons/mob/huds/hud.dmi', - DIAG_MECH_HUD = 'icons/mob/huds/hud.dmi', - DIAG_TRACK_HUD = 'icons/mob/huds/hud.dmi' - ) - ///What direction will the mech face when entered/powered on? Defaults to South. - var/dir_in = SOUTH - ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. - var/normal_step_energy_drain = 10 - ///How much energy the mech will consume each time it moves. this is the current active energy consumed - var/step_energy_drain = 10 - ///How much energy we drain each time we mechpunch someone - var/melee_energy_drain = 15 - ///The minimum amount of energy charge consumed by leg overload - var/overload_step_energy_drain_min = 100 - ///Modifiers for directional damage reduction - var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 0.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 1.5) - ///if we cant use our equipment(such as due to EMP) - var/equipment_disabled = FALSE - /// Keeps track of the mech's cell - var/obj/item/stock_parts/cell/cell - /// Keeps track of the mech's scanning module - var/obj/item/stock_parts/scanning_module/scanmod - /// Keeps track of the mech's capacitor - var/obj/item/stock_parts/capacitor/capacitor - ///Whether the mechs maintenance protocols are on or off - var/construction_state = MECHA_LOCKED - ///Contains flags for the mecha - var/mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE - ///Stores the DNA enzymes of a carbon so tht only they can access the mech - var/dna_lock - ///Spark effects are handled by this datum - var/datum/effect_system/spark_spread/spark_system = new - ///How powerful our lights are - var/lights_power = 6 - ///Just stop the mech from doing anything - var/completely_disabled = FALSE - ///Whether this mech is allowed to move diagonally - var/allow_diagonal_movement = FALSE - ///Whether or not the mech destroys walls by running into it. - var/bumpsmash = FALSE - - ///////////ATMOS - ///Whether we are currrently drawing from the internal tank - var/use_internal_tank = FALSE - ///The setting of the valve on the internal tank - var/internal_tank_valve = ONE_ATMOSPHERE - ///The internal air tank obj of the mech - var/obj/machinery/portable_atmospherics/canister/air/internal_tank - ///Internal air mix datum - var/datum/gas_mixture/cabin_air - ///The connected air port, if we have one - var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port - - ///Special version of the radio, which is unsellable - var/obj/item/radio/mech/radio - var/list/trackers = list() - - var/max_temperature = 25000 - - ///Bitflags for internal damage - var/internal_damage = NONE - /// damage amount above which we can take internal damages - var/internal_damage_threshold = 15 - /// % chance for internal damage to occur - var/internal_damage_probability = 20 - /// list of possibly dealt internal damage for this mech type - var/possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT - /// damage threshold above which we take component damage - var/component_damage_threshold = 10 - - ///required access level for mecha operation - var/list/operation_req_access = list() - ///required access to change internal components - var/list/internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE) - - ///Typepath for the wreckage it spawns when destroyed - var/wreckage - - ///assoc list: key-typepathlist before init, key-equipmentlist after - var/list/equip_by_category = list( - MECHA_L_ARM = null, - MECHA_R_ARM = null, - MECHA_UTILITY = list(), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - ///assoc list: max equips for non-arm modules key-count - var/list/max_equip_by_category = list( - MECHA_UTILITY = 0, - MECHA_POWER = 1, - MECHA_ARMOR = 0, - ) - ///flat equipment for iteration - var/list/flat_equipment - - ///Whether our steps are silent due to no gravity - var/step_silent = FALSE - ///Sound played when the mech moves - var/stepsound = 'sound/mecha/mechstep.ogg' - ///Sound played when the mech walks - var/turnsound = 'sound/mecha/mechturn.ogg' - - ///Cooldown duration between melee punches - var/melee_cooldown = 10 - - ///TIme taken to leave the mech - var/exit_delay = 2 SECONDS - ///Time you get slept for if you get forcible ejected by the mech exploding - var/destruction_sleep_duration = 2 SECONDS - ///Whether outside viewers can see the pilot inside - var/enclosed = TRUE - ///In case theres a different iconstate for AI/MMI pilot(currently only used for ripley) - var/silbutton_icon_state = null - ///Currently ejecting, and unable to do things - var/is_currently_ejecting = FALSE - - var/datum/effect_system/fluid_spread/smoke/smoke_system = new - - ////Action vars - ///Ref to any active thrusters we might have - var/obj/item/mecha_parts/mecha_equipment/thrusters/active_thrusters - - ///Bool for energy shield on/off - var/defense_mode = FALSE - - ///Bool for leg overload on/off - var/leg_overload_mode = FALSE - ///Energy use modifier for leg overload - var/leg_overload_coeff = 100 - - //Bool for zoom on/off - var/zoom_mode = FALSE - - ///Remaining smoke charges - var/smoke_charges = 5 - ///Cooldown between using smoke - var/smoke_cooldown = 10 SECONDS - - ///check for phasing, if it is set to text (to describe how it is phasing: "flying", "phasing") it will let the mech walk through walls. - var/phasing = "" - ///Power we use every time we phaze through something - var/phasing_energy_drain = 200 - ///icon_state for flick() when phazing - var/phase_state = "" - - ///Wether we are strafing - var/strafe = FALSE - - ///Cooldown length between bumpsmashes - var/smashcooldown = 3 - - /// Ui size, so you can make the UI bigger if you let it load a lot of stuff - var/ui_x = 1100 - /// Ui size, so you can make the UI bigger if you let it load a lot of stuff - var/ui_y = 600 - /// ref to screen object that displays in the middle of the UI - var/atom/movable/screen/mech_view/ui_view - -/obj/item/radio/mech //this has to go somewhere - subspace_transmission = TRUE - canhear_range = 0 - -/obj/vehicle/sealed/mecha/Initialize(mapload) - . = ..() - ui_view = new(null, src) - if(enclosed) - internal_tank = new (src) - RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE , PROC_REF(disconnect_air)) - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(play_stepsound)) - RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) - - spark_system.set_up(2, 0, src) - spark_system.attach(src) - - smoke_system.set_up(3, src) - smoke_system.attach(src) - - radio = new(src) - radio.name = "[src] radio" - - cabin_air = new - cabin_air.volume = 200 - cabin_air.temperature = T20C - cabin_air.adjustMultipleGases(GAS_OXYGEN, (O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)), GAS_NITROGEN, (N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature))) - - add_cell() - add_scanmod() - add_capacitor() - START_PROCESSING(SSobj, src) - SSpoints_of_interest.make_point_of_interest(src) - log_message("[src.name] created.", LOG_MECHA) - SET_TRACKING(__TYPE__) - prepare_huds() - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_atom_to_hud(src) - diag_hud_set_mechhealth() - diag_hud_set_mechcell() - diag_hud_set_mechstat() - update_appearance() - - become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) - become_atmos_sensitive() - ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, ROUNDSTART_TRAIT) //protects pilots from ashstorms. - for(var/key in equip_by_category) - if(key == MECHA_L_ARM || key == MECHA_R_ARM) - var/path = equip_by_category[key] - if(!path) - continue - var/obj/item/mecha_parts/mecha_equipment/thing = new path - thing.attach(src, key == MECHA_R_ARM) - continue - for(var/path in equip_by_category[key]) - var/obj/item/mecha_parts/mecha_equipment/thing = new path - thing.attach(src, FALSE) - equip_by_category[key] -= path - -/obj/vehicle/sealed/mecha/Destroy() - for(var/ejectee in occupants) - mob_exit(ejectee, TRUE, TRUE) - - if(LAZYLEN(flat_equipment)) - for(var/obj/item/mecha_parts/mecha_equipment/equip as anything in flat_equipment) - equip.detach(loc) - qdel(equip) - radio = null - - STOP_PROCESSING(SSobj, src) - LAZYCLEARLIST(flat_equipment) - - QDEL_NULL(cell) - QDEL_NULL(scanmod) - QDEL_NULL(capacitor) - QDEL_NULL(internal_tank) - QDEL_NULL(cabin_air) - QDEL_NULL(spark_system) - QDEL_NULL(smoke_system) - QDEL_NULL(ui_view) - - UNSET_TRACKING(__TYPE__) - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.remove_atom_from_hud(src) //YEET - lose_atmos_sensitivity() - return ..() - -/obj/vehicle/sealed/mecha/atom_destruction() - loc.assume_air(cabin_air) - for(var/mob/living/occupant as anything in occupants) - if(isAI(occupant)) - occupant.gib() //No wreck, no AI to recover - continue - mob_exit(occupant, FALSE, TRUE) - occupant.SetSleeping(destruction_sleep_duration) - return ..() - - -/obj/vehicle/sealed/mecha/update_icon_state() - icon_state = get_mecha_occupancy_state() - return ..() - -//override this proc if you need to split up mecha control between multiple people (see savannah_ivanov.dm) -/obj/vehicle/sealed/mecha/auto_assign_occupant_flags(mob/M) - if(driver_amount() < max_drivers) - add_control_flags(M, FULL_MECHA_CONTROL) - -/obj/vehicle/sealed/mecha/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/strafe, VEHICLE_CONTROL_DRIVE) - -/obj/vehicle/sealed/mecha/proc/get_mecha_occupancy_state() - if((mecha_flags & SILICON_PILOT) && silbutton_icon_state) - return silbutton_icon_state - if(LAZYLEN(occupants)) - return base_icon_state - return "[base_icon_state]-open" - -/obj/vehicle/sealed/mecha/CanPassThrough(atom/blocker, movement_dir, blocker_opinion) - if(!phasing || get_charge() <= phasing_energy_drain || throwing) - return ..() - if(phase_state) - z_flick(phase_state, src) - var/turf/destination_turf = get_step(loc, movement_dir) - var/area/destination_area = destination_turf.loc - if(destination_area.area_flags & NOTELEPORT || SSmapping.level_trait(destination_turf.z, ZTRAIT_NOPHASE)) - return FALSE - return TRUE - -/obj/vehicle/sealed/mecha/get_cell() - return cell - -/obj/vehicle/sealed/mecha/rust_heretic_act() - take_damage(500, BRUTE) - -/obj/vehicle/sealed/mecha/proc/restore_equipment() - equipment_disabled = FALSE - for(var/occupant in occupants) - var/mob/mob_occupant = occupant - SEND_SOUND(mob_occupant, sound('sound/items/timer.ogg', volume=50)) - to_chat(mob_occupant, span_notice("Equipment control unit has been rebooted successfully.")) - mob_occupant.update_mouse_pointer() - -/obj/vehicle/sealed/mecha/CheckParts(list/parts_list) - . = ..() - cell = locate(/obj/item/stock_parts/cell) in contents - scanmod = locate(/obj/item/stock_parts/scanning_module) in contents - capacitor = locate(/obj/item/stock_parts/capacitor) in contents - update_part_values() - -/obj/vehicle/sealed/mecha/proc/update_part_values() ///Updates the values given by scanning module and capacitor tier, called when a part is removed or inserted. - if(scanmod) - normal_step_energy_drain = 20 - (5 * scanmod.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best - step_energy_drain = normal_step_energy_drain - else - normal_step_energy_drain = 500 - step_energy_drain = normal_step_energy_drain - if(capacitor) - setArmor(returnArmor().modifyRating(energy = (capacitor.rating * 5))) //Each level of capacitor protects the mech against emp by 5% - else //because we can still be hit without a cap, even if we can't move - setArmor(returnArmor().setRating(energy = 0)) - -//////////////////////// -////// Helpers ///////// -//////////////////////// - -///Adds a cell, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_cell(obj/item/stock_parts/cell/C=null) - QDEL_NULL(cell) - if(C) - C.forceMove(src) - cell = C - return - cell = new /obj/item/stock_parts/cell/high(src) - -///Adds a scanning module, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_scanmod(obj/item/stock_parts/scanning_module/sm=null) - QDEL_NULL(scanmod) - if(sm) - sm.forceMove(src) - scanmod = sm - return - scanmod = new /obj/item/stock_parts/scanning_module(src) - -///Adds a capacitor, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_capacitor(obj/item/stock_parts/capacitor/cap=null) - QDEL_NULL(capacitor) - if(cap) - cap.forceMove(src) - capacitor = cap - else - capacitor = new /obj/item/stock_parts/capacitor(src) - -//////////////////////////////////////////////////////////////////////////////// - -/obj/vehicle/sealed/mecha/examine(mob/user) - . = ..() - var/integrity = atom_integrity*100/max_integrity - switch(integrity) - if(85 to 100) - . += "It's fully intact." - if(65 to 85) - . += "It's slightly damaged." - if(45 to 65) - . += "It's badly damaged." - if(25 to 45) - . += "It's heavily damaged." - else - . += "It's falling apart." - if(LAZYLEN(flat_equipment)) - . += "It's equipped with:" - for(var/obj/item/mecha_parts/mecha_equipment/ME as anything in flat_equipment) - . += "[icon2html(ME, user)] \A [ME]." - if(enclosed) - return - if(mecha_flags & SILICON_PILOT) - . += "[src] appears to be piloting itself..." - else - for(var/occupante in occupants) - . += "You can see [occupante] inside." - if(ishuman(user)) - var/mob/living/carbon/human/H = user - for(var/held_item in H.held_items) - if(!isgun(held_item)) - continue - . += span_warning("It looks like you can hit the pilot directly if you target the center or above.") - break //in case user is holding two guns - -//processing internal damage, temperature, air regulation, alert updates, lights power use. -/obj/vehicle/sealed/mecha/process(delta_time) - if(internal_damage) - if(internal_damage & MECHA_INT_FIRE) - if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && DT_PROB(2.5, delta_time)) - clear_internal_damage(MECHA_INT_FIRE) - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - if(int_tank_air.returnPressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) - set_internal_damage(MECHA_INT_TANK_BREACH) - if(int_tank_air && int_tank_air.get_volume() > 0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(5,7.5)*delta_time) - if(cabin_air && cabin_air.get_volume()>0) - cabin_air.temperature = min(6000+T0C, cabin_air.temperature+rand(5,7.5)*delta_time) - if(cabin_air.temperature > max_temperature/2) - take_damage(delta_time*2/round(max_temperature/cabin_air.temperature,0.1), BURN, 0, 0) - - - if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.removeRatio(DT_PROB_RATE(0.05, delta_time)) - if(loc) - loc.assume_air(leaked_gas) - else - qdel(leaked_gas) - - if(internal_damage & MECHA_INT_SHORT_CIRCUIT) - if(get_charge()) - spark_system.start() - cell.charge -= min(10 * delta_time, cell.charge) - cell.maxcharge -= min(10 * delta_time, cell.maxcharge) - - if(!(internal_damage & MECHA_INT_TEMP_CONTROL)) - if(cabin_air && cabin_air.get_volume() > 0) - var/delta = cabin_air.temperature - T20C - cabin_air.temperature -= clamp(round(delta / 8, 0.1), -5, 5) * delta_time - - if(internal_tank) - var/datum/gas_mixture/tank_air = internal_tank.return_air() - - var/release_pressure = internal_tank_valve - var/cabin_pressure = cabin_air.returnPressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.returnPressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.temperature > 0) - transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = return_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.returnPressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.volume/(cabin_air.temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - qdel(removed) - - for(var/mob/living/occupant as anything in occupants) - if(!enclosed && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated. - visible_message(span_warning("[occupant] tumbles out of the cockpit!")) - mob_exit(occupant) //bye bye - continue - if(cell) - var/cellcharge = cell.charge/cell.maxcharge - switch(cellcharge) - if(0.75 to INFINITY) - occupant.clear_alert(ALERT_CHARGE) - if(0.5 to 0.75) - occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 1) - if(0.25 to 0.5) - occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 2) - if(0.01 to 0.25) - occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 3) - else - occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/emptycell/mech) - - var/integrity = atom_integrity/max_integrity*100 - switch(integrity) - if(30 to 45) - occupant.throw_alert(ALERT_MECH_DAMAGE, /atom/movable/screen/alert/low_mech_integrity, 1) - if(15 to 35) - occupant.throw_alert(ALERT_MECH_DAMAGE, /atom/movable/screen/alert/low_mech_integrity, 2) - if(-INFINITY to 15) - occupant.throw_alert(ALERT_MECH_DAMAGE, /atom/movable/screen/alert/low_mech_integrity, 3) - else - occupant.clear_alert(ALERT_MECH_DAMAGE) - var/atom/checking = occupant.loc - // recursive check to handle all cases regarding very nested occupants, - // such as brainmob inside brainitem inside MMI inside mecha - while(!isnull(checking)) - if(isturf(checking)) - // hit a turf before hitting the mecha, seems like they have been moved out - occupant.clear_alert(ALERT_CHARGE) - occupant.clear_alert(ALERT_MECH_DAMAGE) - occupant = null - break - else if (checking == src) - break // all good - checking = checking.loc - - if(mecha_flags & LIGHTS_ON) - use_power(2*delta_time) - -//Diagnostic HUD updates - diag_hud_set_mechhealth() - diag_hud_set_mechcell() - diag_hud_set_mechstat() - -/obj/vehicle/sealed/mecha/fire_act() //Check if we should ignite the pilot of an open-canopy mech - . = ..() - if(enclosed || mecha_flags & SILICON_PILOT) - return - for(var/mob/living/cookedalive as anything in occupants) - if(cookedalive.fire_stacks < 5) - cookedalive.adjust_fire_stacks(1) - cookedalive.ignite_mob() - -///Displays a special speech bubble when someone inside the mecha speaks -/obj/vehicle/sealed/mecha/proc/display_speech_bubble(datum/source, list/speech_args) - SIGNAL_HANDLER - var/list/speech_bubble_recipients = get_hearers_in_view(7,src) - for(var/mob/M in speech_bubble_recipients) - if(M.client) - speech_bubble_recipients.Add(M.client) - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), image('icons/mob/talk.dmi', src, "machine[say_test(speech_args[SPEECH_MESSAGE])]",MOB_LAYER+1), speech_bubble_recipients, 30) - -//////////////////////////// -///// Action processing //// -//////////////////////////// - -///Called when a driver clicks somewhere. Handles everything like equipment, punches, etc. -/obj/vehicle/sealed/mecha/proc/on_mouseclick(mob/user, atom/target, list/modifiers) - SIGNAL_HANDLER - if(modifiers[SHIFT_CLICK]) //Allows things to be examined. - return - if(!isturf(target) && !isturf(target.loc)) // Prevents inventory from being drilled - return - if(completely_disabled || is_currently_ejecting || (mecha_flags & CANNOT_INTERACT)) - return - if(isAI(user) == !LAZYACCESS(modifiers, MIDDLE_CLICK))//BASICALLY if a human uses MMB, or an AI doesn't, then do nothing. - return - if(phasing) - balloon_alert(user, "not while [phasing]!") - return - if(user.incapacitated()) - return - if(construction_state) - balloon_alert(user, "end maintenance first!") - return - if(!get_charge()) - return - if(src == target) - return - var/dir_to_target = get_dir(src,target) - if(!(mecha_flags & OMNIDIRECTIONAL_ATTACKS) && dir_to_target && !(dir_to_target & dir))//wrong direction - return - if(internal_damage & MECHA_INT_CONTROL_LOST) - target = pick(view(3,target)) - var/mob/living/livinguser = user - if(!(livinguser in return_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT))) - balloon_alert(user, "wrong seat for equipment!") - return - var/obj/item/mecha_parts/mecha_equipment/selected - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - selected = equip_by_category[MECHA_R_ARM] - else - selected = equip_by_category[MECHA_L_ARM] - if(!selected) - return - if(!Adjacent(target) && (selected.range & MECHA_RANGED)) - if(HAS_TRAIT(livinguser, TRAIT_PACIFISM) && selected.harmful) - to_chat(livinguser, span_warning("You don't want to harm other living beings!")) - return - if(SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_CLICK, livinguser, target) & COMPONENT_CANCEL_EQUIPMENT_CLICK) - return - INVOKE_ASYNC(selected, TYPE_PROC_REF(/obj/item/mecha_parts/mecha_equipment, action), user, target, modifiers) - return - if((selected.range & MECHA_MELEE) && Adjacent(target)) - if(isliving(target) && selected.harmful && HAS_TRAIT(livinguser, TRAIT_PACIFISM)) - to_chat(livinguser, span_warning("You don't want to harm other living beings!")) - return - if(SEND_SIGNAL(src, COMSIG_MECHA_EQUIPMENT_CLICK, livinguser, target) & COMPONENT_CANCEL_EQUIPMENT_CLICK) - return - INVOKE_ASYNC(selected, TYPE_PROC_REF(/obj/item/mecha_parts/mecha_equipment, action), user, target, modifiers) - return - if(!(livinguser in return_controllers_with_flag(VEHICLE_CONTROL_MELEE))) - to_chat(livinguser, span_warning("You're in the wrong seat to interact with your hands.")) - return - var/on_cooldown = TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MELEE_ATTACK) - var/adjacent = Adjacent(target) - if(SEND_SIGNAL(src, COMSIG_MECHA_MELEE_CLICK, livinguser, target, on_cooldown, adjacent) & COMPONENT_CANCEL_MELEE_CLICK) - return - if(on_cooldown || !adjacent) - return - if(internal_damage & MECHA_INT_CONTROL_LOST) - target = pick(oview(1,src)) - - if(!has_charge(melee_energy_drain)) - return - use_power(melee_energy_drain) - - if(force) - target.mech_melee_attack(src, user) - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown) - -/obj/vehicle/sealed/mecha/proc/on_middlemouseclick(mob/user, atom/target, params) - SIGNAL_HANDLER - if(isAI(user)) - on_mouseclick(user, target, params) - -////////////////////////////////// -//////// Movement procs //////// -////////////////////////////////// - -///Plays the mech step sound effect. Split from movement procs so that other mechs (HONK) can override this one specific part. -/obj/vehicle/sealed/mecha/proc/play_stepsound() - SIGNAL_HANDLER - if(mecha_flags & QUIET_STEPS) - return - playsound(src, stepsound, 40, TRUE) - -///Disconnects air tank- air port connection on mecha move -/obj/vehicle/sealed/mecha/proc/disconnect_air() - SIGNAL_HANDLER - if(internal_tank.disconnect()) // Something moved us and broke connection - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Air port connection has been severed!")]") - log_message("Lost connection to gas port.", LOG_MECHA) - -// Do whatever you do to mobs to these fuckers too -/obj/vehicle/sealed/mecha/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - . = ..() - if(.) - return TRUE - - var/atom/movable/backup = get_spacemove_backup(movement_dir, continuous_move) - if(backup) - if(!istype(backup) || !movement_dir || backup.anchored || continuous_move) //get_spacemove_backup() already checks if a returned turf is solid, so we can just go - return TRUE - last_pushoff = world.time - if(backup.newtonian_move(turn(movement_dir, 180), instant = TRUE)) - backup.last_pushoff = world.time - step_silent = TRUE - if(return_drivers()) - to_chat(occupants, "[icon2html(src, occupants)][span_info("The [src] push off [backup] to propel yourself.")]") - return TRUE - - if(active_thrusters?.thrust(movement_dir)) - step_silent = TRUE - return TRUE - return FALSE - -/obj/vehicle/sealed/mecha/relaymove(mob/living/user, direction) - . = TRUE - if(!canmove || !(user in return_drivers())) - return - vehicle_move(direction) - -/obj/vehicle/sealed/mecha/vehicle_move(direction, forcerotate = FALSE) - if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move)) - return FALSE - COOLDOWN_START(src, cooldown_vehicle_move, movedelay) - if(completely_disabled) - return FALSE - if(!direction) - return FALSE - if(internal_tank?.connected_port) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while connected to the air system port!")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(construction_state) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - - if(!Process_Spacemove(direction)) - return FALSE - if(zoom_mode) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while in zoom mode!")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!cell) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing power cell.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!scanmod || !capacitor) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [scanmod? "capacitor" : "scanning module"].")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!use_power(step_energy_drain)) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Insufficient power to move!")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - - var/olddir = dir - - if(internal_damage & MECHA_INT_CONTROL_LOST) - direction = pick(GLOB.alldirs) - - //only mechs with diagonal movement may move diagonally - if(!allow_diagonal_movement && ISDIAGONALDIR(direction)) - return TRUE - - var/keyheld = FALSE - if(strafe) - for(var/mob/driver as anything in return_drivers()) - if(driver.client?.keys_held["Alt"]) - keyheld = TRUE - break - - //if we're not facing the way we're going rotate us - if(dir != direction && !strafe || forcerotate || keyheld) - if(dir != direction && !(mecha_flags & QUIET_TURNS) && !step_silent) - playsound(src,turnsound,40,TRUE) - setDir(direction) - return TRUE - - set_glide_size(DELAY_TO_GLIDE_SIZE(movedelay)) - //Otherwise just walk normally - . = step(src,direction, dir) - if(phasing) - use_power(phasing_energy_drain) - if(strafe) - setDir(olddir) - - -/obj/vehicle/sealed/mecha/Bump(atom/obstacle) - . = ..() - if(phasing) //Theres only one cause for phasing canpass fails - to_chat(occupants, "[icon2html(src, occupants)][span_warning("A dull, universal force is preventing you from [phasing] here!")]") - spark_system.start() - return - if(.) //mech was thrown/door/whatever - return - if(bumpsmash) //Need a pilot to push the PUNCH button. - if(COOLDOWN_FINISHED(src, mecha_bump_smash)) - var/list/mob/mobster = return_drivers() - obstacle.mech_melee_attack(src, mobster[1]) - COOLDOWN_START(src, mecha_bump_smash, smashcooldown) - if(!obstacle || obstacle.CanPass(src, get_dir(obstacle, src) || dir)) // The else is in case the obstacle is in the same turf. - step(src,dir) - if(isobj(obstacle)) - var/obj/obj_obstacle = obstacle - if(!obj_obstacle.anchored && obj_obstacle.move_resist <= move_force) - step(obstacle, dir) - else if(ismob(obstacle)) - var/mob/mob_obstacle = obstacle - if(mob_obstacle.move_resist <= move_force) - step(obstacle, dir) - - - - - -/////////////////////////////////// -//////// Internal damage //////// -/////////////////////////////////// - -/// tries to repair any internal damage and plays fluff for it -/obj/vehicle/sealed/mecha/proc/try_repair_int_damage(mob/user, flag_to_heal) - balloon_alert(user, get_int_repair_fluff_start(flag_to_heal)) - log_message("[key_name(user)] starting internal damage repair for flag [flag_to_heal]", LOG_MECHA) - if(!do_after(user, src, 10 SECONDS)) - balloon_alert(user, get_int_repair_fluff_fail(flag_to_heal)) - log_message("Internal damage repair for flag [flag_to_heal] failed.", LOG_MECHA, color="red") - return - clear_internal_damage(flag_to_heal) - balloon_alert(user, get_int_repair_fluff_end(flag_to_heal)) - log_message("Finished internal damage repair for flag [flag_to_heal]", LOG_MECHA) - -///gets the starting balloon alert flufftext -/obj/vehicle/sealed/mecha/proc/get_int_repair_fluff_start(flag) - switch(flag) - if(MECHA_INT_FIRE) - return "activating internal fire supression..." - if(MECHA_INT_TEMP_CONTROL) - return "resetting temperature module..." - if(MECHA_INT_TANK_BREACH) - return "activating tank sealant..." - if(MECHA_INT_CONTROL_LOST) - return "recalibrating coordination system..." - -///gets the successful finish balloon alert flufftext -/obj/vehicle/sealed/mecha/proc/get_int_repair_fluff_end(flag) - switch(flag) - if(MECHA_INT_FIRE) - return "internal fire supressed" - if(MECHA_INT_TEMP_CONTROL) - return "temperature chip reactivated" - if(MECHA_INT_TANK_BREACH) - return "air tank sealed" - if(MECHA_INT_CONTROL_LOST) - return "coordination re-established" - -///gets the on-fail balloon alert flufftext -/obj/vehicle/sealed/mecha/proc/get_int_repair_fluff_fail(flag) - switch(flag) - if(MECHA_INT_FIRE) - return "fire supression canceled" - if(MECHA_INT_TEMP_CONTROL) - return "reset aborted" - if(MECHA_INT_TANK_BREACH) - return "sealant deactivated" - if(MECHA_INT_CONTROL_LOST) - return "recalibration failed" - -/obj/vehicle/sealed/mecha/proc/set_internal_damage(int_dam_flag) - internal_damage |= int_dam_flag - log_message("Internal damage of type [int_dam_flag].", LOG_MECHA) - SEND_SOUND(occupants, sound('sound/machines/warning-buzzer.ogg',wait=0)) - diag_hud_set_mechstat() - -/obj/vehicle/sealed/mecha/proc/clear_internal_damage(int_dam_flag) - if(internal_damage & int_dam_flag) - switch(int_dam_flag) - if(MECHA_INT_TEMP_CONTROL) - to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Life support system reactivated.")]") - if(MECHA_INT_FIRE) - to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Internal fire extinguished.")]") - if(MECHA_INT_TANK_BREACH) - to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Damaged internal tank has been sealed.")]") - internal_damage &= ~int_dam_flag - diag_hud_set_mechstat() - -///////////////////////////////////// -//////////// AI piloting //////////// -///////////////////////////////////// - -/obj/vehicle/sealed/mecha/attack_ai(mob/living/silicon/ai/user) - if(!isAI(user)) - return - //Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot. - if(user.can_dominate_mechs) - user.run_examinate(src) //Get diagnostic information! - for(var/obj/item/mecha_parts/mecha_tracking/B in trackers) - to_chat(user, span_danger("Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:")) - to_chat(user, "[B.get_mecha_info()]") - break - //Nothing like a big, red link to make the player feel powerful! - to_chat(user, "[span_userdanger("ASSUME DIRECT CONTROL?")]
    ") - return - - user.run_examinate(src) - - if(length(return_drivers()) > 0) - to_chat(user, span_warning("This exosuit has a pilot and cannot be controlled.")) - return - var/can_control_mech = FALSE - for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) - can_control_mech = TRUE - to_chat(user, "[span_notice("[icon2html(src, user)] Status of [name]:")]\n[A.get_mecha_info()]") - break - if(!can_control_mech) - to_chat(user, span_warning("You cannot control exosuits without AI control beacons installed.")) - return - to_chat(user, "[span_boldnotice("Take control of exosuit?")]
    ") - -/obj/vehicle/sealed/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) - . = ..() - if(!.) - return - - //Transfer from core or card to mech. Proc is called by mech. - switch(interaction) - if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. - if(!construction_state) //Mech must be in maint mode to allow carding. - to_chat(user, span_warning("[name] must have maintenance protocols active in order to allow a transfer.")) - return - var/list/ai_pilots = list() - for(var/mob/living/silicon/ai/aipilot in occupants) - ai_pilots += aipilot - if(!length(ai_pilots)) //Mech does not have an AI for a pilot - to_chat(user, span_warning("No AI detected in the [name] onboard computer.")) - return - if(length(ai_pilots) > 1) //Input box for multiple AIs, but if there's only one we'll default to them. - AI = tgui_input_list(user, "Which AI do you wish to card?", "AI Selection", sort_list(ai_pilots)) - else - AI = ai_pilots[1] - if(isnull(AI)) - return - if(!(AI in occupants) || !user.Adjacent(src)) - return //User sat on the selection window and things changed. - - AI.ai_restore_power()//So the AI initially has power. - AI.control_disabled = TRUE - AI.radio_enabled = FALSE - AI.disconnect_shell() - remove_occupant(AI) - mecha_flags &= ~SILICON_PILOT - AI.forceMove(card) - card.AI = AI - AI.controlled_equipment = null - AI.remote_control = null - to_chat(AI, span_notice("You have been downloaded to a mobile storage device. Wireless connection offline.")) - to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") - return - - if(AI_MECH_HACK) //Called by AIs on the mech - AI.linked_core = new /obj/structure/ai_core/deactivated(AI.loc) - if(AI.can_dominate_mechs && LAZYLEN(occupants)) //Oh, I am sorry, were you using that? - to_chat(AI, span_warning("Occupants detected! Forced ejection initiated!")) - to_chat(occupants, span_danger("You have been forcibly ejected!")) - for(var/ejectee in occupants) - mob_exit(ejectee, TRUE, TRUE) //IT IS MINE, NOW. SUCK IT, RD! - AI.can_shunt = FALSE //ONE AI ENTERS. NO AI LEAVES. - - if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech. - AI = card.AI - if(!AI) - to_chat(user, span_warning("There is no AI currently installed on this device.")) - return - if(AI.deployed_shell) //Recall AI if shelled so it can be checked for a client - AI.disconnect_shell() - if(AI.stat || !AI.client) - to_chat(user, span_warning("[AI.name] is currently unresponsive, and cannot be uploaded.")) - return - if((LAZYLEN(occupants) >= max_occupants) || dna_lock) //Normal AIs cannot steal mechs! - to_chat(user, span_warning("Access denied. [name] is [LAZYLEN(occupants) >= max_occupants ? "currently fully occupied" : "secured with a DNA lock"].")) - return - AI.control_disabled = FALSE - AI.radio_enabled = TRUE - to_chat(user, "[span_boldnotice("Transfer successful")]: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed.") - card.AI = null - ai_enter_mech(AI) - -///Hack and From Card interactions share some code, so leave that here for both to use. -/obj/vehicle/sealed/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI) - AI.ai_restore_power() - mecha_flags |= SILICON_PILOT - moved_inside(AI) - AI.cancel_camera() - AI.controlled_equipment = src - AI.remote_control = src - to_chat(AI, AI.can_dominate_mechs ? span_greenannounce("Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!") :\ - span_notice("You have been uploaded to a mech's onboard computer.")) - to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") - - -///Handles an actual AI (simple_animal mecha pilot) entering the mech -/obj/vehicle/sealed/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) - if(!pilot_mob?.Adjacent(src)) - return - if(LAZYLEN(occupants)) - return - LAZYSET(occupants, pilot_mob, NONE) - pilot_mob.mecha = src - pilot_mob.forceMove(src) - update_appearance() - -///Handles an actual AI (simple_animal mecha pilot) exiting the mech -/obj/vehicle/sealed/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) - LAZYREMOVE(occupants, pilot_mob) - if(pilot_mob.mecha == src) - pilot_mob.mecha = null - pilot_mob.forceMove(get_turf(src)) - update_appearance() - -/obj/vehicle/sealed/mecha/mob_try_enter(mob/M) - if(!ishuman(M)) // no silicons or drones in mechas. - return - if(HAS_TRAIT(M, TRAIT_PRIMITIVE)) //no lavalizards either. - to_chat(M, span_warning("The knowledge to use this device eludes you!")) - return - log_message("[M] tries to move into [src].", LOG_MECHA) - if(dna_lock && M.has_dna()) - var/mob/living/carbon/entering_carbon = M - if(entering_carbon.dna.unique_enzymes != dna_lock) - to_chat(M, span_warning("Access denied. [name] is secured with a DNA lock.")) - log_message("Permission denied (DNA LOCK).", LOG_MECHA) - return - if(!operation_allowed(M)) - to_chat(M, span_warning("Access denied. Insufficient operation keycodes.")) - log_message("Permission denied (No keycode).", LOG_MECHA) - return - . = ..() - if(.) - moved_inside(M) - -/obj/vehicle/sealed/mecha/enter_checks(mob/M) - if(atom_integrity <= 0) - to_chat(M, span_warning("You cannot get in the [src], it has been destroyed!")) - return FALSE - if(M.buckled) - to_chat(M, span_warning("You can't enter the exosuit while buckled.")) - log_message("Permission denied (Buckled).", LOG_MECHA) - return FALSE - if(M.has_buckled_mobs()) - to_chat(M, span_warning("You can't enter the exosuit with other creatures attached to you!")) - log_message("Permission denied (Attached mobs).", LOG_MECHA) - return FALSE - return ..() - - -/obj/vehicle/sealed/mecha/proc/moved_inside(mob/living/newoccupant) - if(!(newoccupant?.client)) - return FALSE - if(ishuman(newoccupant) && !Adjacent(newoccupant)) - return FALSE - add_occupant(newoccupant) - newoccupant.forceMove(src) - newoccupant.update_mouse_pointer() - add_fingerprint(newoccupant) - log_message("[newoccupant] moved in as pilot.", LOG_MECHA) - setDir(dir_in) - playsound(src, 'sound/machines/windowdoor.ogg', 50, TRUE) - if(!internal_damage) - SEND_SOUND(newoccupant, sound('sound/mecha/nominal.ogg',volume=50)) - return TRUE - -/obj/vehicle/sealed/mecha/proc/mmi_move_inside(obj/item/mmi/brain_obj, mob/user) - if(!(mecha_flags & MMI_COMPATIBLE)) - to_chat(user, span_warning("This mecha is not compatible with MMIs!")) - return FALSE - if(!brain_obj.brain_check(user)) - return FALSE - var/mob/living/brain/brain_mob = brain_obj.brainmob - if(LAZYLEN(occupants) >= max_occupants) - to_chat(user, span_warning("It's full!")) - return FALSE - if(dna_lock && (!brain_mob.stored_dna || (dna_lock != brain_mob.stored_dna.unique_enzymes))) - to_chat(user, span_warning("Access denied. [name] is secured with a DNA lock.")) - return FALSE - - visible_message(span_notice("[user] starts to insert an MMI into [name].")) - - if(!do_after(user, src, 4 SECONDS)) - to_chat(user, span_notice("You stop inserting the MMI.")) - return FALSE - if(LAZYLEN(occupants) < max_occupants) - return mmi_moved_inside(brain_obj, user) - to_chat(user, span_warning("Maximum occupants exceeded!")) - return FALSE - -/obj/vehicle/sealed/mecha/proc/mmi_moved_inside(obj/item/mmi/brain_obj, mob/user) - if(!(Adjacent(brain_obj) && Adjacent(user))) - return FALSE - if(!brain_obj.brain_check(user)) - return FALSE - - var/mob/living/brain/brain_mob = brain_obj.brainmob - if(!user.transferItemToLoc(brain_obj, src)) - to_chat(user, span_warning("[brain_obj] is stuck to your hand, you cannot put it in [src]!")) - return FALSE - - brain_obj.set_mecha(src) - add_occupant(brain_mob)//Note this forcemoves the brain into the mech to allow relaymove - mecha_flags |= SILICON_PILOT - brain_mob.reset_perspective(src) - brain_mob.remote_control = src - brain_mob.update_mouse_pointer() - setDir(dir_in) - log_message("[brain_obj] moved in as pilot.", LOG_MECHA) - if(!internal_damage) - SEND_SOUND(brain_obj, sound('sound/mecha/nominal.ogg',volume=50)) - log_game("[key_name(user)] has put the organ/posibrain of [key_name(brain_mob)] into [src] at [AREACOORD(src)]") - return TRUE - -/obj/vehicle/sealed/mecha/container_resist_act(mob/living/user) - if(isAI(user)) - var/mob/living/silicon/ai/AI = user - if(!AI.can_shunt) - to_chat(AI, span_notice("You can't leave a mech after dominating it!.")) - return FALSE - to_chat(user, span_notice("You begin the ejection procedure. Equipment is disabled during this process. Hold still to finish ejecting.")) - is_currently_ejecting = TRUE - if(do_after(user, src, has_gravity() ? exit_delay : 0)) - to_chat(user, span_notice("You exit the mech.")) - mob_exit(user, TRUE) - else - to_chat(user, span_notice("You stop exiting the mech. Weapons are enabled again.")) - is_currently_ejecting = FALSE - - -/obj/vehicle/sealed/mecha/mob_exit(mob/M, silent, forced) - var/atom/movable/mob_container - var/turf/newloc = get_turf(src) - if(ishuman(M)) - mob_container = M - else if(isbrain(M)) - var/mob/living/brain/brain = M - mob_container = brain.container - else if(isAI(M)) - var/mob/living/silicon/ai/AI = M - if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. - AI.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. - AI = null - mecha_flags &= ~SILICON_PILOT - return - else - if(!AI.linked_core) - if(!silent) - to_chat(AI, span_userdanger("Inactive core destroyed. Unable to return.")) - AI.linked_core = null - return - if(!silent) - to_chat(AI, span_notice("Returning to core...")) - AI.controlled_equipment = null - AI.remote_control = null - mob_container = AI - newloc = get_turf(AI.linked_core) - qdel(AI.linked_core) - else - return ..() - var/mob/living/ejector = M - mecha_flags &= ~SILICON_PILOT - mob_container.forceMove(newloc)//ejecting mob container - log_message("[mob_container] moved out.", LOG_MECHA) - SStgui.close_user_uis(M, src) - if(istype(mob_container, /obj/item/mmi)) - var/obj/item/mmi/mmi = mob_container - if(mmi.brainmob) - ejector.forceMove(mmi) - ejector.reset_perspective() - remove_occupant(ejector) - mmi.set_mecha(null) - mmi.update_appearance() - setDir(dir_in) - return ..() - - -/obj/vehicle/sealed/mecha/add_occupant(mob/M, control_flags) - . = ..() - if(!.) - return - - RegisterSignal(M, COMSIG_LIVING_DEATH, PROC_REF(mob_exit)) - RegisterSignal(M, COMSIG_MOB_CLICKON, PROC_REF(on_mouseclick)) - RegisterSignal(M, COMSIG_MOB_MIDDLECLICKON, PROC_REF(on_middlemouseclick)) //For AIs - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(display_speech_bubble)) - update_appearance() - -/obj/vehicle/sealed/mecha/remove_occupant(mob/M) - UnregisterSignal(M, COMSIG_LIVING_DEATH) - UnregisterSignal(M, COMSIG_MOB_CLICKON) - UnregisterSignal(M, COMSIG_MOB_MIDDLECLICKON) - UnregisterSignal(M, COMSIG_MOB_SAY) - M.clear_alert(ALERT_CHARGE) - M.clear_alert(ALERT_MECH_DAMAGE) - if(M.client) - M.update_mouse_pointer() - M.client.view_size.resetToDefault() - zoom_mode = FALSE - . = ..() - update_appearance() - -///////////////////////// -////// Access stuff ///// -///////////////////////// - -/obj/vehicle/sealed/mecha/proc/operation_allowed(mob/M) - req_access = operation_req_access - req_one_access = list() - return allowed(M) - -/obj/vehicle/sealed/mecha/proc/internals_access_allowed(mob/M) - req_one_access = internals_req_access - req_access = list() - return allowed(M) - - -/////////////////////// -///// Power stuff ///// -/////////////////////// - -/obj/vehicle/sealed/mecha/proc/has_charge(amount) - return (get_charge()>=amount) - -/obj/vehicle/sealed/mecha/proc/get_charge() - return cell?.charge - -/obj/vehicle/sealed/mecha/proc/use_power(amount) - return (get_charge() && cell.use(amount)) - -/obj/vehicle/sealed/mecha/proc/give_power(amount) - if(!isnull(get_charge())) - cell.give(amount) - return TRUE - return FALSE - - - -///////////////////////////////////// -//////// Atmospheric stuff //////// -///////////////////////////////////// - -/obj/vehicle/sealed/mecha/remove_air(amount) - if(use_internal_tank) - return cabin_air.remove(amount) - return ..() - -/obj/vehicle/sealed/mecha/return_air() - if(use_internal_tank) - return cabin_air - return ..() - -/obj/vehicle/sealed/mecha/return_analyzable_air() - return cabin_air - -///fetches pressure of the gas mixture we are using -/obj/vehicle/sealed/mecha/proc/returnPressure() - var/datum/gas_mixture/air = return_air() - return air?.returnPressure() - -///fetches temp of the gas mixture we are using -/obj/vehicle/sealed/mecha/return_temperature() - var/datum/gas_mixture/air = return_air() - return air?.temperature - - - -/////////////////////// -////// Ammo stuff ///// -/////////////////////// - -/obj/vehicle/sealed/mecha/proc/ammo_resupply(obj/item/mecha_ammo/A, mob/user,fail_chat_override = FALSE) - if(!A.rounds) - if(!fail_chat_override) - to_chat(user, span_warning("This box of ammo is empty!")) - return FALSE - var/ammo_needed - var/found_gun - for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in flat_equipment) - ammo_needed = 0 - - if(!istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type) - continue - found_gun = TRUE - if(A.direct_load) - ammo_needed = initial(gun.projectiles) - gun.projectiles - else - ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache - - if(!ammo_needed) - continue - if(ammo_needed < A.rounds) - if(A.direct_load) - gun.projectiles = gun.projectiles + ammo_needed - else - gun.projectiles_cache = gun.projectiles_cache + ammo_needed - playsound(get_turf(user),A.load_audio,50,TRUE) - to_chat(user, span_notice("You add [ammo_needed] [A.ammo_type][ammo_needed > 1?"s":""] to the [gun.name]")) - A.rounds = A.rounds - ammo_needed - if(A.custom_materials) - A.set_custom_materials(A.custom_materials, A.rounds / initial(A.rounds)) - A.update_appearance(UPDATE_NAME) - return TRUE - - if(A.direct_load) - gun.projectiles = gun.projectiles + A.rounds - else - gun.projectiles_cache = gun.projectiles_cache + A.rounds - playsound(get_turf(user),A.load_audio,50,TRUE) - to_chat(user, span_notice("You add [A.rounds] [A.ammo_type][A.rounds > 1?"s":""] to the [gun.name]")) - A.rounds = 0 - A.set_custom_materials(list(/datum/material/steel=2000)) - A.update_appearance(UPDATE_NAME) - return TRUE - if(!fail_chat_override) - if(found_gun) - to_chat(user, span_notice("You can't fit any more ammo of this type!")) - else - to_chat(user, span_notice("None of the equipment on this exosuit can use this ammo!")) - return FALSE - - -/// Special light eater handling -/obj/vehicle/sealed/mecha/proc/on_light_eater(obj/vehicle/sealed/source, datum/light_eater) - SIGNAL_HANDLER - if(mecha_flags & HAS_LIGHTS) - visible_message(span_danger("[src]'s lights burn out!")) - mecha_flags &= ~HAS_LIGHTS - set_light_on(FALSE) - for(var/occupant in occupants) - remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant) - return COMPONENT_BLOCK_LIGHT_EATER - -/// Sets the direction of the mecha and all of its occcupents, required for FOV. Alternatively one could make a recursive contents registration and register topmost direction changes in the fov component -/obj/vehicle/sealed/mecha/setDir(newdir) - . = ..() - for(var/mob/living/occupant as anything in occupants) - occupant.setDir(newdir) diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm deleted file mode 100644 index ee81174dc99..00000000000 --- a/code/modules/vehicles/mecha/combat/combat.dm +++ /dev/null @@ -1,19 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat) - default_armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat - force = 30 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) - mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' - destruction_sleep_duration = 40 - exit_delay = 40 - -/obj/vehicle/sealed/mecha/combat/restore_equipment() - mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' - return ..() - -/obj/vehicle/sealed/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this - for(var/obj/item/I as anything in flat_equipment) - if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic)) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I - gun.projectiles_cache = gun.projectiles_cache_max diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm deleted file mode 100644 index 4da9883c67d..00000000000 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ /dev/null @@ -1,262 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/durand) - default_armor = list(BLUNT = 40, PUNCTURE = 35, SLASH = 0, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/durand - desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." - name = "\improper Durand" - icon_state = "durand" - base_icon_state = "durand" - movedelay = 4 - dir_in = 1 //Facing North. - max_integrity = 400 - max_temperature = 30000 - force = 40 - wreckage = /obj/structure/mecha_wreckage/durand - max_equip_by_category = list( - MECHA_UTILITY = 1, - MECHA_POWER = 1, - MECHA_ARMOR = 3, - ) - var/obj/durand_shield/shield - - -/obj/vehicle/sealed/mecha/combat/durand/Initialize(mapload) - . = ..() - shield = new /obj/durand_shield(loc, src, layer, dir) - RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, PROC_REF(relay)) - RegisterSignal(src, COMSIG_PROJECTILE_PREHIT, PROC_REF(prehit)) - - -/obj/vehicle/sealed/mecha/combat/durand/Destroy() - if(shield) - QDEL_NULL(shield) - return ..() - - -/obj/vehicle/sealed/mecha/combat/durand/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_defense_mode) - -/obj/vehicle/sealed/mecha/combat/durand/process() - . = ..() - if(defense_mode && !use_power(100)) //Defence mode can only be on with a occupant so we check if one of them can toggle it and toggle - for(var/O in occupants) - var/mob/living/occupant = O - var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) - if(action) - action.Trigger() - break - -/obj/vehicle/sealed/mecha/combat/durand/Move(direction) - . = ..() - if(shield) - shield.forceMove(loc) - shield.setDir(dir) - -/obj/vehicle/sealed/mecha/combat/durand/forceMove(turf/T) - . = ..() - shield.forceMove(T) - -/obj/vehicle/sealed/mecha/combat/durand/mob_exit(mob/M, silent, randomstep, forced) - if(defense_mode) - var/datum/action/action = LAZYACCESSASSOC(occupant_actions, M, /datum/action/vehicle/sealed/mecha/mech_defense_mode) - if(action) - INVOKE_ASYNC(action, TYPE_PROC_REF(/datum/action, Trigger), FALSE) - return ..() - -///Relays the signal from the action button to the shield, and creates a new shield if the old one is MIA. -/obj/vehicle/sealed/mecha/combat/durand/proc/relay(datum/source, mob/owner, list/signal_args) - SIGNAL_HANDLER - if(!shield) //if the shield somehow got deleted - stack_trace("Durand triggered relay without a shield") - shield = new /obj/durand_shield(loc, src, layer) - shield.setDir(dir) - SEND_SIGNAL(shield, COMSIG_MECHA_ACTION_TRIGGER, owner, signal_args) - -//Redirects projectiles to the shield if defense_check decides they should be blocked and returns true. -/obj/vehicle/sealed/mecha/combat/durand/proc/prehit(obj/projectile/source, list/signal_args) - SIGNAL_HANDLER - if(defense_check(source.loc) && shield) - signal_args[2] = shield - -/**Checks if defense mode is enabled, and if the attacker is standing in an area covered by the shield. -Expects a turf. Returns true if the attack should be blocked, false if not.*/ -/obj/vehicle/sealed/mecha/combat/durand/proc/defense_check(turf/aloc) - if (!defense_mode || !shield || shield.switching) - return FALSE - . = FALSE - switch(dir) - if (1) - if(abs(x - aloc.x) <= (y - aloc.y) * -2) - . = TRUE - if (2) - if(abs(x - aloc.x) <= (y - aloc.y) * 2) - . = TRUE - if (4) - if(abs(y - aloc.y) <= (x - aloc.x) * -2) - . = TRUE - if (8) - if(abs(y - aloc.y) <= (x - aloc.x) * 2) - . = TRUE - return - -/obj/vehicle/sealed/mecha/combat/durand/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) - if(defense_check(user.loc)) - log_message("Attack absorbed by defense field. Attacker - [user].", LOG_MECHA, color="orange") - shield.attack_generic(user, damage_amount, damage_type, damage_flag, sound_effect, armor_penetration) - else - . = ..() - -/obj/vehicle/sealed/mecha/combat/durand/blob_act(obj/structure/blob/B) - if(defense_check(B.loc)) - log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red") - log_message("Attack absorbed by defense field.", LOG_MECHA, color="orange") - shield.blob_act(B) - else - . = ..() - -/obj/vehicle/sealed/mecha/combat/durand/attackby(obj/item/W as obj, mob/user as mob, params) - if(defense_check(user.loc)) - log_message("Attack absorbed by defense field. Attacker - [user], with [W]", LOG_MECHA, color="orange") - shield.attackby(W, user, params) - else - . = ..() - -/obj/vehicle/sealed/mecha/combat/durand/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(defense_check(AM.loc)) - log_message("Impact with [AM] absorbed by defense field.", LOG_MECHA, color="orange") - shield.hitby(AM, skipcatch, hitpush, blocked, throwingdatum) - else - . = ..() - -/datum/action/vehicle/sealed/mecha/mech_defense_mode - name = "Toggle an energy shield that blocks all attacks from the faced direction at a heavy power cost." - button_icon_state = "mech_defense_mode_off" - -/datum/action/vehicle/sealed/mecha/mech_defense_mode/Trigger(trigger_flags, forced_state = FALSE) - SEND_SIGNAL(chassis, COMSIG_MECHA_ACTION_TRIGGER, owner, args) //Signal sent to the mech, to be handed to the shield. See durand.dm for more details - -//////////////////////////// -///// Shield processing //// -//////////////////////////// - -/**An object to take the hit for us when using the Durand's defense mode. -It is spawned in during the durand's initilization, and always stays on the same tile. -Normally invisible, until defense mode is actvated. When the durand detects an attack that should be blocked, the -attack is passed to the shield. The shield takes the damage, uses it to calculate charge cost, and then sets its -own integrity back to max. Shield is automatically dropped if we run out of power or the user gets out.*/ - -/obj/durand_shield //projectiles get passed to this when defense mode is enabled - name = "defense grid" - icon = 'icons/mecha/durand_shield.dmi' - icon_state = "shield_null" - invisibility = INVISIBILITY_MAXIMUM //no showing on right-click - pixel_y = 4 - max_integrity = 10000 - anchored = TRUE - light_system = OVERLAY_LIGHT - light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE - light_power = 5 - light_color = LIGHT_COLOR_ELECTRIC_CYAN - light_on = FALSE - ///Our link back to the durand - var/obj/vehicle/sealed/mecha/combat/durand/chassis - ///To keep track of things during the animation - var/switching = FALSE - var/currentuser - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF //The shield should not take damage from fire, lava, or acid; that's the mech's job. - - -/obj/durand_shield/Initialize(mapload, _chassis, _layer, _dir) - . = ..() - chassis = _chassis - layer = _layer - setDir(_dir) - RegisterSignal(src, COMSIG_MECHA_ACTION_TRIGGER, PROC_REF(activate)) - - -/obj/durand_shield/Destroy() - if(chassis) - chassis.shield = null - chassis = null - return ..() - -/** - * Handles activating and deactivating the shield. - * - * This proc is called by a signal sent from the mech's action button and - * relayed by the mech itself. The "forced" variable, `signal_args[1]`, will - * skip the to-pilot text and is meant for when the shield is disabled by - * means other than the action button (like running out of power). - * - * Arguments: - * * source: the shield - * * owner: mob that activated the shield - * * signal_args: whether it's forced - */ -/obj/durand_shield/proc/activate(datum/source, mob/owner, list/signal_args) - SIGNAL_HANDLER - currentuser = owner - if(!LAZYLEN(chassis?.occupants)) - return - if(switching && !signal_args[1]) - return - if(!chassis.defense_mode && (!chassis.cell || chassis.cell.charge < 100)) //If it's off, and we have less than 100 units of power - chassis.balloon_alert(owner, "insufficient power") - return - switching = TRUE - chassis.defense_mode = !chassis.defense_mode - if(!signal_args[1]) - chassis.balloon_alert(owner, "shield [chassis.defense_mode?"enabled":"disabled"]") - chassis.log_message("User has toggled defense mode -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA) - else - chassis.log_message("defense mode state changed -- now [chassis.defense_mode?"enabled":"disabled"].", LOG_MECHA) - for(var/occupant in chassis.occupants) - var/datum/action/button = chassis.occupant_actions[occupant][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - button.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]" - button.build_all_button_icons() - - set_light_on(chassis.defense_mode) - - if(chassis.defense_mode) - invisibility = 0 - flick("shield_raise", src) - playsound(src, 'sound/mecha/mech_shield_raise.ogg', 50, FALSE) - set_light(l_outer_range = MINIMUM_USEFUL_LIGHT_RANGE , l_power = 5, l_color = "#00FFFF") - icon_state = "shield" - RegisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE, PROC_REF(resetdir)) - else - flick("shield_drop", src) - playsound(src, 'sound/mecha/mech_shield_drop.ogg', 50, FALSE) - set_light(0) - icon_state = "shield_null" - invisibility = INVISIBILITY_MAXIMUM //no showing on right-click - UnregisterSignal(chassis, COMSIG_ATOM_DIR_CHANGE) - switching = FALSE - -/obj/durand_shield/proc/resetdir(datum/source, olddir, newdir) - SIGNAL_HANDLER - setDir(newdir) - -/obj/durand_shield/take_damage() - if(!chassis) - qdel(src) - return - if(!chassis.defense_mode) //if defense mode is disabled, we're taking damage that we shouldn't be taking - return - . = ..() - flick("shield_impact", src) - if(!chassis.use_power((max_integrity - atom_integrity) * 100)) - chassis.cell?.charge = 0 - for(var/O in chassis.occupants) - var/mob/living/occupant = O - var/datum/action/action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) - action.Trigger() - atom_integrity = 10000 - -/obj/durand_shield/play_attack_sound() - playsound(src, 'sound/mecha/mech_shield_deflect.ogg', 100, TRUE) - -/obj/durand_shield/bullet_act() - play_attack_sound() - . = ..() diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm deleted file mode 100644 index cc928969d88..00000000000 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ /dev/null @@ -1,89 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/gygax) - default_armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/gygax - desc = "A lightweight, security exosuit. Popular among private and corporate security." - name = "\improper Gygax" - icon_state = "gygax" - base_icon_state = "gygax" - allow_diagonal_movement = TRUE - movedelay = 3 - dir_in = 1 //Facing North. - max_integrity = 250 - max_temperature = 25000 - leg_overload_coeff = 80 - force = 25 - wreckage = /obj/structure/mecha_wreckage/gygax - max_equip_by_category = list( - MECHA_UTILITY = 1, - MECHA_POWER = 1, - MECHA_ARMOR = 2, - ) - step_energy_drain = 3 - -/obj/vehicle/sealed/mecha/combat/gygax/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overload_mode) - -/datum/action/vehicle/sealed/mecha/mech_overload_mode - name = "Toggle leg actuators overload" - button_icon_state = "mech_overload_off" - -/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(trigger_flags, forced_state = null) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(!isnull(forced_state)) - chassis.leg_overload_mode = forced_state - else - chassis.leg_overload_mode = !chassis.leg_overload_mode - button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" - chassis.log_message("Toggled leg actuators overload.", LOG_MECHA) - if(chassis.leg_overload_mode) - chassis.movedelay = min(1, round(chassis.movedelay * 0.5)) - chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff) - chassis.balloon_alert(owner,"leg actuators overloaded") - else - chassis.movedelay = initial(chassis.movedelay) - chassis.step_energy_drain = chassis.normal_step_energy_drain - chassis.balloon_alert(owner, "you disable the overload") - build_all_button_icons() - -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/gygax/dark) - default_armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/gygax/dark - desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications." - name = "\improper Dark Gygax" - icon_state = "darkgygax" - base_icon_state = "darkgygax" - max_integrity = 300 - max_temperature = 35000 - leg_overload_coeff = 70 - force = 30 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) - wreckage = /obj/structure/mecha_wreckage/gygax/dark - max_equip_by_category = list( - MECHA_UTILITY = 2, - MECHA_POWER = 1, - MECHA_ARMOR = 3, - ) - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot, - MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), - MECHA_POWER = list(), - MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), - ) - destruction_sleep_duration = 20 - -/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize(mapload) - . = ..() - max_ammo() - -/obj/vehicle/sealed/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new /obj/item/stock_parts/cell/bluespace(src) diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm deleted file mode 100644 index 5b33a65cf47..00000000000 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ /dev/null @@ -1,67 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/honker) - default_armor = list(BLUNT = -20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/honker - desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!" - name = "\improper H.O.N.K" - icon_state = "honker" - base_icon_state = "honker" - movedelay = 3 - max_integrity = 140 - max_temperature = 25000 - operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) - wreckage = /obj/structure/mecha_wreckage/honker - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE - max_equip_by_category = list( - MECHA_UTILITY = 2, - MECHA_POWER = 1, - MECHA_ARMOR = 0, - ) - var/squeak = TRUE - -/obj/vehicle/sealed/mecha/combat/honker/play_stepsound() - if(squeak) - playsound(src, SFX_CLOWN_STEP, 70, 1) - squeak = !squeak - - -//DARK H.O.N.K. - -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/honker/dark) - default_armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/honker/dark - desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. This one has been painted black for maximum fun. HONK!" - name = "\improper Dark H.O.N.K" - icon_state = "darkhonker" - max_integrity = 300 - max_temperature = 35000 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) - wreckage = /obj/structure/mecha_wreckage/honker/dark - max_equip_by_category = list( - MECHA_UTILITY = 1, - MECHA_POWER = 1, - MECHA_ARMOR = 3, - ) - -/obj/vehicle/sealed/mecha/combat/honker/dark/loaded - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/honker, - MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - -/obj/vehicle/sealed/mecha/combat/honker/dark/add_cell(obj/item/stock_parts/cell/C) - if(C) - C.forceMove(src) - cell = C - return - cell = new /obj/item/stock_parts/cell/hyper(src) - -/obj/structure/mecha_wreckage/honker/dark - name = "\improper Dark H.O.N.K wreckage" - icon_state = "darkhonker-broken" diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm deleted file mode 100644 index c030cad9985..00000000000 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ /dev/null @@ -1,130 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/marauder) - default_armor = list(BLUNT = 50, PUNCTURE = 55, SLASH = 0, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/marauder - desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations." - name = "\improper Marauder" - icon_state = "marauder" - base_icon_state = "marauder" - movedelay = 5 - max_integrity = 500 - max_temperature = 60000 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS) - wreckage = /obj/structure/mecha_wreckage/marauder - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE - force = 45 - max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, - MECHA_ARMOR = 3, - ) - bumpsmash = TRUE - -/obj/vehicle/sealed/mecha/combat/marauder/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_smoke) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_zoom) - -/obj/vehicle/sealed/mecha/combat/marauder/loaded - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse, - MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), - MECHA_POWER = list(), - MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), - ) - -/obj/vehicle/sealed/mecha/combat/marauder/add_cell(obj/item/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new /obj/item/stock_parts/cell/bluespace(src) - -/datum/action/vehicle/sealed/mecha/mech_smoke - name = "Smoke" - button_icon_state = "mech_smoke" - -/datum/action/vehicle/sealed/mecha/mech_smoke/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_SMOKE) && chassis.smoke_charges>0) - chassis.smoke_system.start() - chassis.smoke_charges-- - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_SMOKE, chassis.smoke_cooldown) - -/datum/action/vehicle/sealed/mecha/mech_zoom - name = "Zoom" - button_icon_state = "mech_zoom_off" - -/datum/action/vehicle/sealed/mecha/mech_zoom/Trigger(trigger_flags) - if(!owner?.client || !chassis || !(owner in chassis.occupants)) - return - chassis.zoom_mode = !chassis.zoom_mode - button_icon_state = "mech_zoom_[chassis.zoom_mode ? "on" : "off"]" - chassis.log_message("Toggled zoom mode.", LOG_MECHA) - to_chat(owner, "[icon2html(chassis, owner)]Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") - if(chassis.zoom_mode) - owner.client.view_size.setTo(4.5) - SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg', volume=50)) - else - owner.client.view_size.resetToDefault() - build_all_button_icons() - -/obj/vehicle/sealed/mecha/combat/marauder/seraph - desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." - name = "\improper Seraph" - icon_state = "seraph" - base_icon_state = "seraph" - operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS) - movedelay = 3 - max_integrity = 550 - wreckage = /obj/structure/mecha_wreckage/seraph - force = 55 - max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, - MECHA_ARMOR = 3, - ) - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse, - MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), - MECHA_POWER = list(), - MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), - ) - -/obj/vehicle/sealed/mecha/combat/marauder/mauler - desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." - name = "\improper Mauler" - icon_state = "mauler" - base_icon_state = "mauler" - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) - wreckage = /obj/structure/mecha_wreckage/mauler - max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, - MECHA_ARMOR = 4, - ) - equip_by_category = list( - MECHA_L_ARM = null, - MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - destruction_sleep_duration = 20 - -/obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, - MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), - MECHA_POWER = list(), - MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), - ) - diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm deleted file mode 100644 index 6cfc83f5855..00000000000 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ /dev/null @@ -1,61 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/phazon) - default_armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/phazon - desc = "This is a Phazon exosuit. The pinnacle of scientific research and pride of Nanotrasen, it uses cutting edge bluespace technology and expensive materials." - name = "\improper Phazon" - icon_state = "phazon" - base_icon_state = "phazon" - movedelay = 2 - dir_in = 2 //Facing South. - step_energy_drain = 3 - max_integrity = 200 - max_temperature = 25000 - wreckage = /obj/structure/mecha_wreckage/phazon - force = 15 - max_equip_by_category = list( - MECHA_UTILITY = 1, - MECHA_POWER = 1, - MECHA_ARMOR = 2, - ) - phase_state = "phazon-phase" - -/obj/vehicle/sealed/mecha/combat/phazon/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_phasing) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_switch_damtype) - -/datum/action/vehicle/sealed/mecha/mech_switch_damtype - name = "Reconfigure arm microtool arrays" - button_icon_state = "mech_damtype_brute" - -/datum/action/vehicle/sealed/mecha/mech_switch_damtype/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - var/new_damtype - switch(chassis.damtype) - if(TOX) - new_damtype = BRUTE - chassis.balloon_alert(owner, "your punches will now deal brute damage") - if(BRUTE) - new_damtype = BURN - chassis.balloon_alert(owner, "your punches will now deal burn damage") - if(BURN) - new_damtype = TOX - chassis.balloon_alert(owner,"your punches will now deal toxin damage") - chassis.damtype = new_damtype - button_icon_state = "mech_damtype_[new_damtype]" - playsound(chassis, 'sound/mecha/mechmove01.ogg', 50, TRUE) - build_all_button_icons() - -/datum/action/vehicle/sealed/mecha/mech_toggle_phasing - name = "Toggle Phasing" - button_icon_state = "mech_phasing_off" - -/datum/action/vehicle/sealed/mecha/mech_toggle_phasing/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - chassis.phasing = chassis.phasing ? "" : "phasing" - button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" - chassis.balloon_alert(owner, "[chassis.phasing ? "enabled" : "disabled"] phasing") - build_all_button_icons() diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm deleted file mode 100644 index aea5c7c5122..00000000000 --- a/code/modules/vehicles/mecha/combat/reticence.dm +++ /dev/null @@ -1,32 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/reticence) - default_armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/reticence - desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins." - name = "\improper reticence" - icon_state = "reticence" - base_icon_state = "reticence" - movedelay = 2 - dir_in = 1 //Facing North. - max_integrity = 100 - max_temperature = 15000 - wreckage = /obj/structure/mecha_wreckage/reticence - operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE - max_equip_by_category = list( - MECHA_UTILITY = 1, - MECHA_POWER = 1, - MECHA_ARMOR = 1, - ) - step_energy_drain = 3 - color = "#87878715" - -/obj/vehicle/sealed/mecha/combat/reticence/loaded - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced, - MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/rcd, - MECHA_UTILITY = list(), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm deleted file mode 100644 index baff31224bd..00000000000 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ /dev/null @@ -1,366 +0,0 @@ -///how much time between charge_level going up by 1 -#define SKYFALL_SINGLE_CHARGE_TIME 2 SECONDS -///enough charge level to take off, basically done charging -#define SKYFALL_CHARGELEVEL_LAUNCH 5 - -///how much time you're in the air -#define TOTAL_SKYFALL_LEAP_TIME 3 SECONDS - -/** - * ## Savannah-Ivanov! - * - * A two person mecha that delegates moving to the driver and shooting to the pilot. - * ...Hilarious, right? - */ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/combat/savannah_ivanov) - default_armor = list(BLUNT = 45, PUNCTURE = 40, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/combat/savannah_ivanov - name = "\improper Savannah-Ivanov" - desc = "An insanely overbulked mecha that handily crushes single-pilot opponents. The price is that you need two pilots to use it." - icon = 'icons/mecha/coop_mech.dmi' - base_icon_state = "savannah_ivanov" - icon_state = "savannah_ivanov_0_0" - //does not include mmi compatibility - mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS - movedelay = 3 - max_integrity = 450 //really tanky, like damn - max_temperature = 30000 - wreckage = /obj/structure/mecha_wreckage/savannah_ivanov - max_occupants = 2 - max_equip_by_category = list( - MECHA_UTILITY = 1, - MECHA_POWER = 1, - MECHA_ARMOR = 3, - ) - //no tax on flying, since the power cost is in the leap itself. - phasing_energy_drain = 0 - -/obj/vehicle/sealed/mecha/combat/savannah_ivanov/get_mecha_occupancy_state() - var/driver_present = driver_amount() != 0 - var/gunner_present = return_amount_of_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT) > 0 - var/list/mob/drivers = return_drivers() - var/leap_state - if(length(drivers)) - var/datum/action/vehicle/sealed/mecha/skyfall/action = LAZYACCESSASSOC(occupant_actions, drivers[1], /datum/action/vehicle/sealed/mecha/skyfall) - leap_state = action.skyfall_charge_level > 2 ? "leap_" : "" - return "[base_icon_state]_[leap_state][gunner_present]_[driver_present]" - -/obj/vehicle/sealed/mecha/combat/savannah_ivanov/auto_assign_occupant_flags(mob/new_occupant) - if(driver_amount() < max_drivers) //movement - add_control_flags(new_occupant, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) - else //weapons - add_control_flags(new_occupant, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) - -/obj/vehicle/sealed/mecha/combat/savannah_ivanov/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/swap_seat) - . = ..() - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/skyfall, VEHICLE_CONTROL_DRIVE) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/ivanov_strike, VEHICLE_CONTROL_EQUIPMENT) - -///Savannah Skyfall -/datum/action/vehicle/sealed/mecha/skyfall - name = "Savannah Skyfall" - button_icon_state = "mech_savannah" - ///cooldown time between skyfall uses - var/skyfall_cooldown_time = 1 MINUTES - ///skyfall builds up in charges every 2 seconds, when it reaches 5 charges the ability actually starts - var/skyfall_charge_level = 0 - -/datum/action/vehicle/sealed/mecha/skyfall/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(chassis.phasing) - to_chat(owner, span_warning("You're already airborne!")) - return - if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_SKYFALL)) - var/timeleft = S_TIMER_COOLDOWN_TIMELEFT(chassis, COOLDOWN_MECHA_SKYFALL) - to_chat(owner, span_warning("You need to wait [DisplayTimeText(timeleft, 1)] before attempting to Skyfall.")) - return - if(skyfall_charge_level) - abort_skyfall() - return - chassis.balloon_alert(owner, "charging skyfall...") - INVOKE_ASYNC(src, PROC_REF(skyfall_charge_loop)) - -/** - * ## skyfall_charge_loop - * - * The actual skyfall loop itself. Repeatedly calls itself after a do_after, so any interruptions will call abort_skyfall and end the loop - * the other way the loop ends is if charge level (var it's ticking up) gets to SKYFALL_CHARGELEVEL_LAUNCH, in which case it ends the loop and does the ability. - */ -/datum/action/vehicle/sealed/mecha/skyfall/proc/skyfall_charge_loop() - if(!do_after(owner, chassis, SKYFALL_SINGLE_CHARGE_TIME)) - abort_skyfall() - return - skyfall_charge_level++ - switch(skyfall_charge_level) - if(1) - chassis.visible_message(span_warning("[chassis] clicks and whirrs for a moment, with a low hum emerging from the legs.")) - playsound(chassis, 'sound/items/rped.ogg', 50, TRUE) - if(2) - chassis.visible_message(span_warning("[chassis] begins to shake, the sounds of electricity growing louder.")) - chassis.Shake(1, 1, SKYFALL_SINGLE_CHARGE_TIME-1) // -1 gives space between the animates, so they don't interrupt eachother - if(3) - chassis.visible_message(span_warning("[chassis] assumes a pose as it rattles violently.")) - chassis.Shake(2, 2, SKYFALL_SINGLE_CHARGE_TIME-1) // -1 gives space between the animates, so they don't interrupt eachother - chassis.spark_system.start() - chassis.update_appearance(UPDATE_ICON_STATE) - if(4) - chassis.visible_message(span_warning("[chassis] sparks and shutters as it finalizes preparation.")) - playsound(chassis, 'sound/mecha/skyfall_power_up.ogg', 50, TRUE) - chassis.Shake(3, 3, SKYFALL_SINGLE_CHARGE_TIME-1) // -1 gives space between the animates, so they don't interrupt eachother - chassis.spark_system.start() - if(SKYFALL_CHARGELEVEL_LAUNCH) - chassis.visible_message(span_danger("[chassis] leaps into the air!")) - playsound(chassis, 'sound/weapons/gun/general/rocket_launch.ogg', 50, TRUE) - if(skyfall_charge_level != SKYFALL_CHARGELEVEL_LAUNCH) - skyfall_charge_loop() - return - S_TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_SKYFALL, skyfall_cooldown_time) - button_icon_state = "mech_savannah_cooldown" - build_all_button_icons() - addtimer(CALLBACK(src, PROC_REF(reset_button_icon)), skyfall_cooldown_time) - for(var/mob/living/shaken in range(7, chassis)) - shake_camera(shaken, 3, 3) - - var/turf/launch_turf = get_turf(chassis) - //new /obj/effect/hotspot(launch_turf) - launch_turf.create_fire(1, 10) - launch_turf.hotspot_expose(700, 50, 1) - new /obj/effect/skyfall_landingzone(launch_turf, chassis) - chassis.resistance_flags |= INDESTRUCTIBLE //not while jumping at least - chassis.mecha_flags |= QUIET_STEPS|QUIET_TURNS|CANNOT_INTERACT - chassis.phasing = "flying" - chassis.movedelay = 1 - chassis.density = FALSE - chassis.layer = ABOVE_ALL_MOB_LAYER - animate(chassis, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) - animate(chassis, pixel_z = 400, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) //Animate our rising mech (just like pods hehe) - addtimer(CALLBACK(src, PROC_REF(begin_landing)), 2 SECONDS) - -/** - * ## begin_landing - * - * Called by skyfall_charge_loop after some time if it reaches full charge level. - * it's just the animations of the mecha coming down + another timer for the final landing effect - */ -/datum/action/vehicle/sealed/mecha/skyfall/proc/begin_landing() - animate(chassis, pixel_z = 0, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) - animate(chassis, alpha = 255, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) - addtimer(CALLBACK(src, PROC_REF(land)), 1 SECONDS) - -/** - * ## land - * - * Called by skyfall_charge_loop after some time if it reaches full charge level. - * it's just the animations of the mecha coming down + another timer for the final landing effect - */ -/datum/action/vehicle/sealed/mecha/skyfall/proc/land() - chassis.visible_message(span_danger("[chassis] lands from above!")) - playsound(chassis, 'sound/effects/explosion1.ogg', 50, 1) - chassis.resistance_flags &= ~INDESTRUCTIBLE - chassis.mecha_flags &= ~(QUIET_STEPS|QUIET_TURNS|CANNOT_INTERACT) - chassis.phasing = initial(chassis.phasing) - chassis.movedelay = initial(chassis.movedelay) - chassis.density = TRUE - chassis.layer = initial(chassis.layer) - skyfall_charge_level = 0 - chassis.update_appearance(UPDATE_ICON_STATE) - for(var/mob/living/shaken in range(7, chassis)) - shake_camera(shaken, 5, 5) - var/turf/landed_on = get_turf(chassis) - for(var/thing in range(1, chassis)) - if(isopenturf(thing)) - var/turf/open/floor/crushed_tile = thing - crushed_tile.break_tile() - continue - if(isclosedturf(thing) && thing == landed_on) - var/turf/closed/crushed_wall = thing - crushed_wall.ScrapeAway() - continue - if(isobj(thing)) - var/obj/crushed_object = thing - if(crushed_object == chassis || crushed_object.loc == chassis) - continue - crushed_object.take_damage(150) //same as a hulk punch, makes sense to me - continue - if(isliving(thing)) - var/mob/living/crushed_victim = thing - if(crushed_victim in chassis.occupants) - continue - if(!(crushed_victim in landed_on)) - to_chat(crushed_victim, span_userdanger("The tremors from [chassis] landing sends you flying!")) - var/fly_away_direction = get_dir(chassis, crushed_victim) - crushed_victim.throw_at(get_edge_target_turf(crushed_victim, fly_away_direction), 4, 3) - crushed_victim.adjustBruteLoss(15) - continue - to_chat(crushed_victim, span_userdanger("[chassis] crashes down on you from above!")) - if(crushed_victim.stat != CONSCIOUS) - crushed_victim.gib(FALSE, FALSE, FALSE) - continue - crushed_victim.adjustBruteLoss(80) - -/** - * ## abort_skyfall - * - * Called by skyfall_charge_loop if the charging is interrupted. - * Applies cooldown and resets charge level - */ -/datum/action/vehicle/sealed/mecha/skyfall/proc/abort_skyfall() - chassis.balloon_alert(owner, "skyfall aborted") - S_TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_MISSILE_STRIKE, skyfall_charge_level * 10 SECONDS) //so aborting skyfall later in the process imposes a longer cooldown - skyfall_charge_level = 0 - chassis.update_appearance(UPDATE_ICON_STATE) - -/** - * ## reset_button_icon - * - * called after an addtimer when the cooldown is finished with the skyfall, resets the icon - */ -/datum/action/vehicle/sealed/mecha/skyfall/proc/reset_button_icon() - button_icon_state = "mech_savannah" - build_all_button_icons() - -/datum/action/vehicle/sealed/mecha/ivanov_strike - name = "Ivanov Strike" - button_icon_state = "mech_ivanov" - ///cooldown time between strike uses - var/strike_cooldown_time = 40 SECONDS - ///how many rockets can we send with ivanov strike - var/rockets_left = 0 - var/aiming_missile = FALSE - -/datum/action/vehicle/sealed/mecha/ivanov_strike/Destroy() - if(aiming_missile) - end_missile_targeting() - return ..() - -/datum/action/vehicle/sealed/mecha/ivanov_strike/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_MISSILE_STRIKE)) - var/timeleft = S_TIMER_COOLDOWN_TIMELEFT(chassis, COOLDOWN_MECHA_MISSILE_STRIKE) - to_chat(owner, span_warning("You need to wait [DisplayTimeText(timeleft, 1)] before firing another Ivanov Strike.")) - return - if(aiming_missile) - end_missile_targeting() - else - start_missile_targeting() - -/** - * ## reset_button_icon - * - * called after an addtimer when the cooldown is finished with the ivanov strike, resets the icon - */ -/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/reset_button_icon() - button_icon_state = "mech_ivanov" - build_all_button_icons() - -/** - * ## start_missile_targeting - * - * Called by the ivanov strike datum action, hooks signals into clicking to call drop_missile - * Plus other flavor like the overlay - */ -/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/start_missile_targeting() - chassis.balloon_alert(owner, "missile mode on (click to target)") - aiming_missile = TRUE - rockets_left = 3 - RegisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK, PROC_REF(on_melee_click)) - RegisterSignal(chassis, COMSIG_MECHA_EQUIPMENT_CLICK, PROC_REF(on_equipment_click)) - owner.client.mouse_override_icon = 'icons/effects/mouse_pointers/supplypod_down_target.dmi' - owner.update_mouse_pointer() - owner.overlay_fullscreen("ivanov", /atom/movable/screen/fullscreen/ivanov_display, 1) - SEND_SOUND(owner, 'sound/machines/terminal_on.ogg') //spammable so I don't want to make it audible to anyone else - -/** - * ## end_missile_targeting - * - * Called by the ivanov strike datum action or other actions that would end targetting - * Unhooks signals into clicking to call drop_missile plus other flavor like the overlay - */ -/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/end_missile_targeting() - aiming_missile = FALSE - rockets_left = 0 - UnregisterSignal(chassis, list(COMSIG_MECHA_MELEE_CLICK, COMSIG_MECHA_EQUIPMENT_CLICK)) - owner.client.mouse_override_icon = null - owner.update_mouse_pointer() - owner.clear_fullscreen("ivanov") - -///signal called from clicking with no equipment -/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/on_melee_click(datum/source, mob/living/pilot, atom/target, on_cooldown, is_adjacent) - SIGNAL_HANDLER - if(!target) - return - drop_missile(get_turf(target)) - -///signal called from clicking with equipment -/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/on_equipment_click(datum/source, mob/living/pilot, atom/target) - SIGNAL_HANDLER - if(!target) - return - drop_missile(get_turf(target)) - -/** - * ## drop_missile - * - * Called via intercepted clicks when the missile ability is active - * Spawns a droppod and starts the cooldown of the missile strike ability - * arguments: - * * target_turf: turf of the atom that was clicked on - */ -/datum/action/vehicle/sealed/mecha/ivanov_strike/proc/drop_missile(turf/target_turf) - rockets_left-- - if(rockets_left <= 0) - end_missile_targeting() - SEND_SOUND(owner, 'sound/machines/triple_beep.ogg') - S_TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_MISSILE_STRIKE, strike_cooldown_time) - podspawn(list( - "target" = target_turf, - "style" = STYLE_MISSILE, - "effectMissile" = TRUE, - "explosionSize" = list(0,0,1,2) - )) - button_icon_state = "mech_ivanov_cooldown" - build_all_button_icons() - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/ivanov_strike, reset_button_icon)), strike_cooldown_time) - -//misc effects - -///a simple indicator of where the skyfall is going to land. -/obj/effect/skyfall_landingzone - name = "Landing Zone Indicator" - desc = "A holographic projection designating the landing zone of something. It's probably best to stand back." - icon = 'icons/mob/telegraphing/telegraph_96x96.dmi' - icon_state = "target_largebox" - layer = BELOW_MOB_LAYER - pixel_x = -32 - pixel_y = -32 - alpha = 0 - ///reference to mecha following - var/obj/vehicle/sealed/mecha/combat/mecha - -/obj/effect/skyfall_landingzone/Initialize(mapload, obj/vehicle/sealed/mecha/combat/mecha) - . = ..() - if(!mecha) - stack_trace("Skyfall landing zone created without mecha") - return INITIALIZE_HINT_QDEL - src.mecha = mecha - animate(src, alpha = 255, TOTAL_SKYFALL_LEAP_TIME/2, easing = CIRCULAR_EASING|EASE_OUT) - RegisterSignal(mecha, COMSIG_MOVABLE_MOVED, PROC_REF(follow)) - QDEL_IN(src, TOTAL_SKYFALL_LEAP_TIME) //when the animations land - -/obj/effect/skyfall_landingzone/Destroy(force) - mecha = null - return ..() - -///called when the mecha moves -/obj/effect/skyfall_landingzone/proc/follow(datum/source_mecha) - SIGNAL_HANDLER - forceMove(get_turf(source_mecha)) - -#undef SKYFALL_SINGLE_CHARGE_TIME -#undef SKYFALL_CHARGELEVEL_LAUNCH - -#undef TOTAL_SKYFALL_LEAP_TIME diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm deleted file mode 100644 index 81553175040..00000000000 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ /dev/null @@ -1,198 +0,0 @@ -/** - * Mecha Equipment - * All mech equippables are currently childs of this - */ -/obj/item/mecha_parts/mecha_equipment - name = "mecha equipment" - icon = 'icons/mecha/mecha_equipment.dmi' - icon_state = "mecha_equip" - force = 5 - max_integrity = 300 - /// Determines what "slot" this attachment will try to attach to on a mech - var/equipment_slot = MECHA_WEAPON - ///Cooldown in ticks required between activations of the equipment - var/equip_cooldown = 0 - ///used for equipment that can be turned on/off, boolean - var/activated = TRUE - ///Chassis power cell quantity used on activation - var/energy_drain = 0 - ///Reference to mecha that this equipment is currently attached to - var/obj/vehicle/sealed/mecha/chassis - ///Bitflag. Determines the range of the equipment. - var/range = MECHA_MELEE - /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. - var/mech_flags = NONE - ///boolean: FALSE if this equipment can not be removed/salvaged - var/detachable = TRUE - ///Boolean: whether a pacifist can use this equipment - var/harmful = FALSE - ///Sound file: Sound to play when this equipment is destroyed while still attached to the mech - var/destroy_sound = 'sound/mecha/critdestr.ogg' - -/obj/item/mecha_parts/mecha_equipment/Destroy() - if(chassis) - detach(get_turf(src)) - log_message("[src] is destroyed.", LOG_MECHA) - if(LAZYLEN(chassis.occupants)) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_danger("[src] is destroyed!")]") - playsound(chassis, destroy_sound, 50) - chassis = null - return ..() - -/obj/item/mecha_parts/mecha_equipment/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(can_attach(M, attach_right)) - if(!user.temporarilyRemoveItemFromInventory(src)) - return FALSE - attach(M, attach_right) - user.visible_message(span_notice("[user] attaches [src] to [M]."), span_notice("You attach [src] to [M].")) - return TRUE - to_chat(user, span_warning("You are unable to attach [src] to [M]!")) - return FALSE - -/obj/item/mecha_parts/mecha_equipment/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - switch(action) - if("detach") - detach(get_turf(src)) - return TRUE - if("toggle") - activated = !activated - return TRUE - if("repair") - ui.close() // allow watching for baddies and the ingame effects - chassis.balloon_alert(usr, "starting repair") - while(do_after(usr, chassis, 1 SECONDS) && get_integrity() < max_integrity) - repair_damage(30) - if(get_integrity() == max_integrity) - balloon_alert(usr, "repair complete") - return FALSE - -/** - * Checks whether this mecha equipment can be activated - * Returns a bool - * Arguments: - * * target: atom we are activating/clicked on - */ -/obj/item/mecha_parts/mecha_equipment/proc/action_checks(atom/target) - if(!target) - return FALSE - if(!chassis) - return FALSE - if(!activated) - return FALSE - if(energy_drain && !chassis?.has_charge(energy_drain)) - return FALSE - if(chassis.is_currently_ejecting) - return FALSE - if(chassis.equipment_disabled) - to_chat(chassis.occupants, span_warning("Error -- Equipment control unit is unresponsive.")) - return FALSE - if(TIMER_COOLDOWN_CHECK(chassis, COOLDOWN_MECHA_EQUIPMENT(type))) - return FALSE - return TRUE - -/obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, list/modifiers) - TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment - chassis.use_power(energy_drain) - return TRUE - -/** - * Cooldown proc variant for using do_afters between activations instead of timers - * Example of usage is mech drills, rcds - * arguments: - * * target: targetted atom for action activation - * * user: occupant to display do after for - * * interaction_key: interaction key to pass to [/proc/do_after] - */ -/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key) - if(!chassis) - return FALSE - chassis.use_power(energy_drain) - return do_after(user, target, equip_cooldown, extra_checks = CALLBACK(src, PROC_REF(do_after_checks), target), interaction_key = interaction_key) - -///Do after wrapper for mecha equipment -/obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, mob/user, delay) - return do_after(user, target, delay, extra_checks = CALLBACK(src, PROC_REF(do_after_checks), target)) - -/// do after checks for the mecha equipment do afters -/obj/item/mecha_parts/mecha_equipment/proc/do_after_checks(atom/target) - return chassis && (get_dir(chassis, target) & chassis.dir) - -/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - return default_can_attach(M, attach_right) - -/obj/item/mecha_parts/mecha_equipment/proc/default_can_attach(obj/vehicle/sealed/mecha/mech, attach_right = FALSE) - if(equipment_slot == MECHA_WEAPON) - if(attach_right) - if(mech.equip_by_category[MECHA_R_ARM]) - return FALSE - else - if(mech.equip_by_category[MECHA_L_ARM]) - return FALSE - return TRUE - return length(mech.equip_by_category[equipment_slot]) < mech.max_equip_by_category[equipment_slot] - -/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - LAZYADD(M.flat_equipment, src) - var/to_equip_slot = equipment_slot - if(equipment_slot == MECHA_WEAPON) - if(attach_right) - to_equip_slot = MECHA_R_ARM - else - to_equip_slot = MECHA_L_ARM - if(islist(M.equip_by_category[to_equip_slot])) - M.equip_by_category[to_equip_slot] += src - else - M.equip_by_category[to_equip_slot] = src - chassis = M - forceMove(M) - log_message("[src] initialized.", LOG_MECHA) - -/** - * called to detach this equipment - * Args: - * * moveto: optional target to move this equipment to - */ -/obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto) - moveto = moveto || get_turf(chassis) - forceMove(moveto) - LAZYREMOVE(chassis.flat_equipment, src) - var/to_unequip_slot = equipment_slot - if(equipment_slot == MECHA_WEAPON) - if(chassis.equip_by_category[MECHA_R_ARM] == src) - to_unequip_slot = MECHA_R_ARM - else - to_unequip_slot = MECHA_L_ARM - if(islist(chassis.equip_by_category[to_unequip_slot])) - chassis.equip_by_category[to_unequip_slot] -= src - else - chassis.equip_by_category[to_unequip_slot] = null - log_message("[src] removed from equipment.", LOG_MECHA) - chassis = null - -/obj/item/mecha_parts/mecha_equipment/log_message(message, message_type=LOG_GAME, color=null, log_globally) - if(chassis) - return chassis.log_message("ATTACHMENT: [src] [message]", message_type, color) - return ..() - -/** - * ## get_snowflake_data - * handles the returning of snowflake data required by the UI of the mecha - * not the prettiest of procs honeslty - * returns: - * * an assoc list - * * must include an list("snowflake_id" = snowflake_id) - */ -/obj/item/mecha_parts/mecha_equipment/proc/get_snowflake_data() - return list() - -/** - * Proc for reloading weapons from HTML UI or by AI - * note that this is old and likely broken code - */ -/obj/item/mecha_parts/mecha_equipment/proc/rearm() - return FALSE - -/// AI mech pilot: returns TRUE if the Ai should try to reload the mecha -/obj/item/mecha_parts/mecha_equipment/proc/needs_rearm() - return FALSE diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm deleted file mode 100644 index 4d1002f5567..00000000000 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ /dev/null @@ -1,538 +0,0 @@ -// Sleeper, Medical Beam, and Syringe gun - -/obj/item/mecha_parts/mecha_equipment/medical - mech_flags = EXOSUIT_MODULE_MEDICAL - -/obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - . = ..() - if(!ismedicalmecha(M)) - return FALSE - - -/obj/item/mecha_parts/mecha_equipment/medical/attach(obj/vehicle/sealed/mecha/M) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/mecha_parts/mecha_equipment/medical/process() - if(!chassis) - return PROCESS_KILL - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/detach() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper - name = "mounted sleeper" - desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - energy_drain = 20 - range = MECHA_MELEE - equip_cooldown = 20 - ///ref to the patient loaded in the sleeper - var/mob/living/carbon/patient - /// amount of chems to inject into patient from other hands syringe gun - var/inject_amount = 10 - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Destroy() - for(var/atom/movable/content as anything in src) - content.forceMove(get_turf(src)) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/get_snowflake_data() - var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_SLEEPER) - if(!patient) - return data - data["patient"] = list( - "patientname" = patient.name, - "is_dead" = patient.stat == DEAD, - "patient_health" = patient.health/patient.maxHealth, - ) - return data - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/ui_act(action, list/params) - . = ..() - if(.) - return - switch(action) - if("eject") - go_out() - return TRUE - if("view_stats") - usr << browse(get_patient_stats(),"window=msleeper") - onclose(usr, "msleeper") - return FALSE - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/action(mob/source, atom/atomtarget, list/modifiers) - if(!action_checks(atomtarget)) - return - if(!iscarbon(atomtarget)) - return - var/mob/living/carbon/target = atomtarget - if(!patient_insertion_check(target)) - return - to_chat(source, "[icon2html(src, source)][span_notice("You start putting [target] into [src]...")]") - chassis.visible_message(span_warning("[chassis] starts putting [target] into \the [src].")) - if(!do_after(source, target, equip_cooldown, extra_checks=CALLBACK(src, PROC_REF(patient_insertion_check), target, source))) - return - if(!chassis || !(get_dir(chassis, target) & chassis.dir)) - return - target.forceMove(src) - patient = target - START_PROCESSING(SSobj, src) - to_chat(source, "[icon2html(src, source)][span_notice("[target] successfully loaded into [src]. Life support functions engaged.")]") - chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) - log_message("[target] loaded. Life support functions engaged.", LOG_MECHA) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/patient_insertion_check(mob/living/carbon/target, mob/user) - if(target.buckled) - to_chat(user, "[icon2html(src, user)][span_warning("[target] will not fit into the sleeper because [target.p_theyre()] buckled to [target.buckled]!")]") - return FALSE - if(target.has_buckled_mobs()) - to_chat(user, "[icon2html(src, user)][span_warning("[target] will not fit into the sleeper because of the creatures attached to it!")]") - return FALSE - if(patient) - to_chat(user, "[icon2html(src, user)][span_warning("The sleeper is already occupied!")]") - return FALSE - return TRUE - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/go_out() - if(!patient) - return - patient.forceMove(get_turf(src)) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("[patient] ejected. Life support functions disabled.")]") - log_message("[patient] ejected. Life support functions disabled.", LOG_MECHA) - STOP_PROCESSING(SSobj, src) - patient = null - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/detach() - if(patient) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Unable to detach [src] - equipment occupied!")]") - return - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Topic(href,href_list) - . = ..() - if(.) - return - if(!(usr in chassis.occupants)) - return - if(href_list["inject"]) - var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate() in chassis - var/datum/reagent/R = locate(href_list["inject"]) in SG.reagents.reagent_list - if(istype(R)) - inject_reagent(R, SG) - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats() - if(!patient) - return - return {" - - - [patient] statistics - - - - -

    Health statistics

    -
    - [get_patient_dam()] -
    -

    Reagents in bloodstream

    -
    - [get_patient_reagents()] -
    -
    - [get_available_reagents()] -
    - - "} - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_dam() - var/t1 - switch(patient.stat) - if(0) - t1 = "Conscious" - if(1) - t1 = "Unconscious" - if(2) - t1 = "*dead*" - else - t1 = "Unknown" - var/core_temp = "" - if(ishuman(patient)) - var/mob/living/carbon/human/humi = patient - core_temp = {"Body Temperature: [humi.bodytemperature-T0C]°C ([FAHRENHEIT(humi.bodytemperature)]°F)
    "} - return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
    - [core_temp] - Body Temperature: [patient.bodytemperature-T0C]°C ([FAHRENHEIT(patient.bodytemperature)]°F)
    - Brute Damage: [patient.getBruteLoss()]%
    - Respiratory Damage: [patient.getOxyLoss()]%
    - Toxin Content: [patient.getToxLoss()]%
    - Burn Severity: [patient.getFireLoss()]%
    - [span_danger("[patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]")]
    - [span_danger("[patient.getOrganLoss(ORGAN_SLOT_BRAIN) ? "Significant brain damage detected." : ""]")]
    - [span_danger("[length(patient.get_traumas()) ? "Brain Traumas detected." : ""]")]
    - "} - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents() - if(patient.reagents) - for(var/datum/reagent/R in patient.reagents.reagent_list) - if(R.volume > 0) - . += "[R]: [round(R.volume,0.01)]
    " - return . || "None" - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_available_reagents() - var/output - var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun) in chassis - if(SG && SG.reagents && islist(SG.reagents.reagent_list)) - for(var/datum/reagent/R in SG.reagents.reagent_list) - if(R.volume > 0) - output += "Inject [R.name]
    " - return output - - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/inject_reagent(datum/reagent/R,obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG) - if(!R || !patient || !SG || !(SG in chassis.flat_equipment)) - return - var/to_inject = min(R.volume, inject_amount) - if(to_inject && patient.reagents.get_reagent_amount(R.type) + to_inject <= inject_amount*2) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Injecting [patient] with [to_inject] units of [R.name].")]") - log_message("Injecting [patient] with [to_inject] units of [R.name].", LOG_MECHA) - log_combat(chassis.occupants, patient, "injected", "[name] ([R] - [to_inject] units)") - SG.reagents.trans_id_to(patient,R.type,to_inject) - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/container_resist_act(mob/living/user) - go_out() - -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/process(delta_time) - . = ..() - if(.) - return - if(!chassis.has_charge(energy_drain)) - log_message("Deactivated.", LOG_MECHA) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("[src] deactivated - no power.")]") - STOP_PROCESSING(SSobj, src) - return - var/mob/living/carbon/ex_patient = patient - if(!ex_patient) - return - if(ex_patient.loc != src) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("[patient] no longer detected. Life support functions diabled.")]") - log_message("[patient] no longer detected - Life support functions disabled.", LOG_MECHA) - STOP_PROCESSING(SSobj, src) - patient = null - if(ex_patient.health > 0) - ex_patient.adjustOxyLoss(-0.5 * delta_time) - ex_patient.AdjustStun(-40 * delta_time) - ex_patient.AdjustKnockdown(-40 * delta_time) - ex_patient.AdjustParalyzed(-40 * delta_time) - ex_patient.AdjustImmobilized(-40 * delta_time) - ex_patient.AdjustUnconscious(-40 * delta_time) - if(ex_patient.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5) - ex_patient.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5) - chassis.use_power(energy_drain) - - -///////////////////////////////// Syringe Gun /////////////////////////////////////////////////////////////// - -#define FIRE_SYRINGE_MODE 0 -#define ANALYZE_SYRINGE_MODE 1 - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun - name = "exosuit syringe gun" - desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur." - icon = 'icons/obj/guns/ballistic.dmi' - icon_state = "syringegun" - range = MECHA_MELEE|MECHA_RANGED - equip_cooldown = 10 - energy_drain = 10 - ///Lazylist of syringes that we've picked up - var/list/syringes - ///List of all scanned reagents, starts with epinephrine and multiver - var/list/known_reagents - ///List of reagents we want to be creating this processing tick - var/list/processed_reagents - ///Maximu amount of syringes we can hold - var/max_syringes = 10 - ///Maximum volume of reagents we can hold - var/max_volume = 75 - ///Reagent amount in units we produce per two seconds - var/synth_speed = 2.5 - ///Chooses what kind of action we should perform when clicking - var/mode = FIRE_SYRINGE_MODE // fire syringe or analyze reagents. - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize(mapload) - . = ..() - create_reagents(max_volume, NO_REACT) - known_reagents = list( - /datum/reagent/medicine/epinephrine = "Epinephrine", - /datum/reagent/medicine/dylovene = "Dylovene", - ) - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/create_reagents(max_vol, flags) - . = ..() - RegisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_PARENT_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles detaching signal hooks incase someone is crazy enough to make this edible. -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_PARENT_QDELETING)) - return NONE - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/vehicle/sealed/mecha/medical/M, attach_right = FALSE) - . = ..() - if(!istype(M)) - return FALSE - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_SYRINGE, - "mode" = mode == FIRE_SYRINGE_MODE ? "Launch" : "Analyze", - "syringe" = LAZYLEN(syringes), - "max_syringe" = max_syringes, - "reagents" = reagents.total_volume, - "total_reagents" = reagents.maximum_volume, - ) - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/ui_act(action, list/params) - . = ..() - if(.) - return - if(action == "change_mode") - mode = !mode - return TRUE - else if(action == "show_reagents") - usr << browse(get_reagents_page(),"window=msyringegun") - return FALSE - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/action(mob/source, atom/target, list/modifiers) - if(!action_checks(target)) - return - if(istype(target, /obj/item/reagent_containers/syringe)) - return load_syringe(target) - if(istype(target, /obj/item/storage))//Loads syringes from boxes - for(var/obj/item/reagent_containers/syringe/S in target.contents) - load_syringe(S, source) - return - if(mode == ANALYZE_SYRINGE_MODE) - return analyze_reagents(target, source) - //we're in syringe mode so lets do syringe stuff - if(!LAZYLEN(syringes)) - to_chat(source, "[icon2html(src, source)]No syringes loaded.") - return - if(reagents.total_volume<=0) - to_chat(source, "[icon2html(src, source)]No available reagents to load syringe with.") - return - if(HAS_TRAIT(source, TRAIT_PACIFISM)) - to_chat(source, span_alert("The [src] might be lethally chambered! You don't want to risk harming anyone...")) - return - var/obj/item/ammo_casing/syringegun/chambered = new /obj/item/ammo_casing/syringegun(src) - log_message("Fired [chambered] from [src] by [source], targeting [target].", LOG_MECHA) - chambered.fire_casing(target, source, null, 0, 0, null, 0, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Topic(href,href_list) - ..() - if (href_list["toggle_mode"]) - mode = !mode - return - if (href_list["select_reagents"]) - LAZYCLEARLIST(processed_reagents) - var/processingreagentamount = 0 - var/message - for(var/i=1 to known_reagents.len) - if(processingreagentamount >= synth_speed) - break - var/reagent = text2path(href_list["reagent_[i]"]) - if(reagent && (reagent in known_reagents)) - message = "[processingreagentamount ? ", " : null][known_reagents[reagent]]" - LAZYADD(processed_reagents, reagent) - processingreagentamount++ - if(LAZYLEN(processed_reagents)) - message += " added to production" - START_PROCESSING(SSobj, src) - to_chat(usr, message) - to_chat(usr, "[icon2html(src, usr)][span_notice("Reagent processing started.")]") - log_message("Reagent processing started.", LOG_MECHA) - return - if (href_list["purge_reagent"]) - var/reagent = href_list["purge_reagent"] - if(!reagent) - return - reagents.del_reagent(reagent) - return - if (href_list["purge_all"]) - reagents.clear_reagents() - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_page() - var/output = {" - - - Reagent Synthesizer - - - - -

    Current reagents:

    -
    - [get_current_reagents()] -
    -

    Reagents production:

    -
    - [get_reagents_form()] -
    - - - "} - return output - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_form() - var/r_list = get_reagents_list() - var/inputs - if(r_list) - inputs += "" - inputs += "" - inputs += "" - var/output = {"
    - [r_list || "No known reagents"] - [inputs] -
    - [r_list? "Only the first [synth_speed] selected reagent\s will be added to production" : null] - "} - return output - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_list() - var/output - for(var/i=1 to known_reagents.len) - var/reagent_id = known_reagents[i] - output += {" [known_reagents[reagent_id]]
    "} - return output - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_current_reagents() - var/output - for(var/datum/reagent/R in reagents.reagent_list) - if(R.volume > 0) - output += "[R]: [round(R.volume,0.001)] - Purge Reagent
    " - if(output) - output += "Total: [round(reagents.total_volume,0.001)]/[reagents.maximum_volume] - Purge All" - return output || "None" - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S, mob/user) - if(LAZYLEN(syringes) >= max_syringes) - to_chat(user, "[icon2html(src, user)][span_warning("[src]'s syringe chamber is full!")]") - return FALSE - if(!chassis.Adjacent(S)) - to_chat(user, "[icon2html(src, user)][span_warning("Unable to load syringe!")]") - return FALSE - S.reagents.trans_to(src, S.reagents.total_volume, transfered_by = user) - S.forceMove(src) - LAZYADD(syringes,S) - to_chat(user, "[icon2html(src, user)][span_notice("Syringe loaded.")]") - return TRUE - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/analyze_reagents(atom/A, mob/user) - if(get_dist(src,A) >= 4) - to_chat(user, "[icon2html(src, user)][span_notice("The object is too far away!")]") - return FALSE - if(!A.reagents || ismob(A)) - to_chat(user, "[icon2html(src, user)][span_warning("No reagent info gained from [A].")]") - return FALSE - to_chat(user, "[icon2html(src, user)][span_notice("Analyzing reagents...")]") - for(var/datum/reagent/R in A.reagents.reagent_list) - if(!(R.chemical_flags & REAGENT_INVISIBLE) && add_known_reagent(R.type,R.name)) - to_chat(user, "[icon2html(src, user)][span_notice("Reagent analyzed, identified as [R.name] and added to database.")]") - send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) - to_chat(user, "[icon2html(src, user)][span_notice("Analysis complete.")]") - return TRUE - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/add_known_reagent(r_id,r_name) - if(r_id in known_reagents) - return FALSE - known_reagents += r_id - known_reagents[r_id] = r_name - return TRUE - -/// Updates the equipment info list when the reagents change. Eats signal args. -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/on_reagent_change(datum/reagents/holder, ...) - SIGNAL_HANDLER - send_byjax(chassis.occupants,"msyringegun.browser","reagents",get_current_reagents()) - send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) - return NONE - - -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/process(delta_time) - . = ..() - if(.) - return - if(!LAZYLEN(processed_reagents) || reagents.total_volume >= reagents.maximum_volume || !chassis.has_charge(energy_drain)) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_alert("Reagent processing stopped.")]") - log_message("Reagent processing stopped.", LOG_MECHA) - return PROCESS_KILL - var/amount = delta_time * synth_speed / LAZYLEN(processed_reagents) - for(var/reagent in processed_reagents) - reagents.add_reagent(reagent,amount) - chassis.use_power(energy_drain) - -#undef FIRE_SYRINGE_MODE -#undef ANALYZE_SYRINGE_MODE - -///////////////////////////////// Medical Beam /////////////////////////////////////////////////////////////// - -TYPEINFO_DEF(/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam) - default_materials = list(/datum/material/steel = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000) - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam - name = "exosuit medical beamgun" - desc = "Equipment for medical exosuits. Generates a focused beam of medical nanites." - icon_state = "mecha_medigun" - energy_drain = 10 - range = MECHA_MELEE|MECHA_RANGED - equip_cooldown = 0 - ///The medical gun doing the actual healing. yes its wierd but its better than copypasting the entire thing - var/obj/item/gun/medbeam/mech/medigun - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Initialize(mapload) - . = ..() - medigun = new(src) - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Destroy() - QDEL_NULL(medigun) - return ..() - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/process(deltatime) - . = ..() - if(.) - return - medigun.process(SSOBJ_DT) - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/action(mob/source, atom/movable/target, list/modifiers) - medigun.do_fire_gun(target, loc) - -/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/detach() - STOP_PROCESSING(SSobj, src) - medigun.LoseTarget() - return ..() diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm deleted file mode 100644 index 409e85e1a1d..00000000000 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ /dev/null @@ -1,185 +0,0 @@ - -// Drill, Diamond drill, Mining scanner - -#define DRILL_BASIC 1 -#define DRILL_HARDENED 2 - - -/obj/item/mecha_parts/mecha_equipment/drill - name = "exosuit drill" - desc = "Equipment for engineering and combat exosuits. This is the drill that'll pierce the heavens!" - icon_state = "mecha_drill" - equip_cooldown = 15 - energy_drain = 10 - force = 15 - harmful = TRUE - range = MECHA_MELEE - tool_behaviour = TOOL_DRILL - toolspeed = 0.9 - var/drill_delay = 7 - var/drill_level = DRILL_BASIC - mech_flags = EXOSUIT_MODULE_WORKING | EXOSUIT_MODULE_COMBAT - -/obj/item/mecha_parts/mecha_equipment/drill/Initialize(mapload) - . = ..() - AddComponent(/datum/component/butchering, 50, 100, null, null, TRUE) - -/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) - // Check if we can even use the equipment to begin with. - if(!action_checks(target)) - return - - // We can only drill non-space turfs, living mobs and objects. - if(isspaceturf(target) || !(isliving(target) || isobj(target) || isturf(target))) - return - - // For whatever reason we can't drill things that acid won't even stick too, and probably - // shouldn't waste our time drilling indestructible things. - if(isobj(target)) - var/obj/target_obj = target - if(target_obj.resistance_flags & (UNACIDABLE | INDESTRUCTIBLE)) - return - - // You can't drill harder by clicking more. - if(!DOING_INTERACTION_WITH_TARGET(source, target) && do_after_cooldown(target, source, DOAFTER_SOURCE_MECHADRILL)) - - target.visible_message(span_warning("[chassis] starts to drill [target]."), \ - span_userdanger("[chassis] starts to drill [target]..."), \ - span_hear("You hear drilling.")) - - log_message("Started drilling [target]", LOG_MECHA) - // Drilling a turf is a one-and-done procedure. - if(isturf(target)) - var/turf/T = target - T.drill_act(src, source) - return ..() - // Drilling objects and mobs is a repeating procedure. - while(do_after_mecha(target, source, drill_delay)) - if(isliving(target)) - drill_mob(target, source) - playsound(src,'sound/weapons/drill.ogg',40,TRUE) - else if(isobj(target)) - var/obj/O = target - O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) - playsound(src,'sound/weapons/drill.ogg',40,TRUE) - - // If we caused a qdel drilling the target, we can stop drilling them. - // Prevents starting a do_after on a qdeleted target. - if(QDELETED(target)) - break - - return ..() - -/turf/proc/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) - return - -/turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) - for(var/turf/closed/mineral/M in range(drill.chassis,1)) - if(get_dir(drill.chassis,M)&drill.chassis.dir) - M.MinedAway() - drill.log_message("[user] drilled through [src]", LOG_MECHA) - drill.move_ores() - -/turf/open/misc/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - for(var/turf/open/misc/asteroid/M in range(1, drill.chassis)) - if((get_dir(drill.chassis,M) & drill.chassis.dir) && !M.dug) - M.getDug() - drill.log_message("Drilled through [src]", LOG_MECHA) - drill.move_ores() - - -/obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.flat_equipment && istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) - var/obj/vehicle/sealed/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ - R.collect_ore() - -/obj/item/mecha_parts/mecha_equipment/drill/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(..()) - if(istype(M, /obj/vehicle/sealed/mecha/working) || istype(M, /obj/vehicle/sealed/mecha/combat)) - return TRUE - return FALSE - -/obj/item/mecha_parts/mecha_equipment/drill/attach(obj/vehicle/sealed/mecha/M) - ..() - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = TRUE - -/obj/item/mecha_parts/mecha_equipment/drill/detach(atom/moveto) - ..() - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = FALSE - -/obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/living/user) - target.visible_message(span_danger("[chassis] is drilling [target] with [src]!"), \ - span_userdanger("[chassis] is drilling you with [src]!")) - log_combat(user, target, "drilled", "[name]", "Combat mode: [user.combat_mode ? "On" : "Off"])(DAMTYPE: [uppertext(damtype)])") - if(target.stat == DEAD && target.getBruteLoss() >= target.maxHealth) - log_combat(user, target, "gibbed", name) - if(LAZYLEN(target.butcher_results) || LAZYLEN(target.guaranteed_butcher_results)) - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.Butcher(chassis, target) - else - target.gib() - else - //drill makes a hole - var/obj/item/bodypart/target_part = target.get_bodypart(ran_zone(BODY_ZONE_CHEST)) - target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, BLUNT)) - - //blood splatters - var/splatter_dir = get_dir(chassis, target) - if(isalien(target)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target.drop_location(), splatter_dir) - else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir) - - //organs go everywhere - if(target_part && prob(10 * drill_level)) - target_part.dismember(DROPLIMB_BLUNT) - -/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill - name = "diamond-tipped exosuit drill" - desc = "Equipment for engineering and combat exosuits. This is an upgraded version of the drill that'll pierce the heavens!" - icon_state = "mecha_diamond_drill" - equip_cooldown = 10 - drill_delay = 4 - drill_level = DRILL_HARDENED - force = 15 - toolspeed = 0.7 - - -/obj/item/mecha_parts/mecha_equipment/mining_scanner - name = "exosuit mining scanner" - desc = "Equipment for working exosuits. It will automatically check surrounding rock for useful minerals." - icon_state = "mecha_analyzer" - equip_cooldown = 15 - equipment_slot = MECHA_UTILITY - var/scanning_time = 0 - mech_flags = EXOSUIT_MODULE_WORKING - -/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize(mapload) - . = ..() - START_PROCESSING(SSfastprocess, src) - -/obj/item/mecha_parts/mecha_equipment/mining_scanner/Destroy() - STOP_PROCESSING(SSfastprocess, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/mining_scanner/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(..()) - if(istype(M, /obj/vehicle/sealed/mecha/working)) - return TRUE - return FALSE - -/obj/item/mecha_parts/mecha_equipment/mining_scanner/process() - if(!loc) - STOP_PROCESSING(SSfastprocess, src) - qdel(src) - if(istype(loc, /obj/vehicle/sealed/mecha/working) && scanning_time <= world.time) - var/obj/vehicle/sealed/mecha/working/mecha = loc - if(!LAZYLEN(mecha.occupants)) - return - scanning_time = world.time + equip_cooldown - mineral_scan_pulse(get_turf(src)) - -#undef DRILL_BASIC -#undef DRILL_HARDENED diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm deleted file mode 100644 index e92f2779a2e..00000000000 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ /dev/null @@ -1,470 +0,0 @@ - -// Teleporter, Wormhole generator, Gravitational catapult, Armor booster modules, -// Repair droid, Tesla Energy relay, Generators - -////////////////////////////////////////////// TELEPORTER /////////////////////////////////////////////// - -/obj/item/mecha_parts/mecha_equipment/teleporter - name = "mounted teleporter" - desc = "An exosuit module that allows exosuits to teleport to any position in view." - icon_state = "mecha_teleport" - equip_cooldown = 150 - energy_drain = 1000 - range = MECHA_RANGED - var/teleport_range = 7 - -/obj/item/mecha_parts/mecha_equipment/teleporter/action(mob/source, atom/target, list/modifiers) - var/area/ourarea = get_area(src) - if(!action_checks(target) || ourarea.area_flags & NOTELEPORT) - return - var/turf/T = get_turf(target) - if(T && (loc.z == T.z) && (get_dist(loc, T) <= teleport_range)) - do_teleport(chassis, T, 4, channel = TELEPORT_CHANNEL_BLUESPACE) - return ..() - - - -////////////////////////////////////////////// WORMHOLE GENERATOR ////////////////////////////////////////// - -/obj/item/mecha_parts/mecha_equipment/wormhole_generator - name = "mounted wormhole generator" - desc = "An exosuit module that allows generating of small quasi-stable wormholes, allowing for long-range inneacurate teleportation." - icon_state = "mecha_wholegen" - equip_cooldown = 50 - energy_drain = 300 - range = MECHA_RANGED - - -/obj/item/mecha_parts/mecha_equipment/wormhole_generator/action(mob/source, atom/target, list/modifiers) - var/area/ourarea = get_area(src) - if(!action_checks(target) || ourarea.area_flags & NOTELEPORT) - return - var/area/targetarea = pick(get_areas_in_range(100, chassis)) - if(!targetarea)//Literally middle of nowhere how did you even get here - return - var/list/validturfs = list() - var/turf/ourturf = get_turf(src) - for(var/t in get_area_turfs(targetarea.type)) - var/turf/evaluated_turf = t - if(evaluated_turf.density || chassis.z != evaluated_turf.z) - continue - for(var/obj/evaluated_obj in evaluated_turf) - if(!evaluated_obj.density) - continue - validturfs += evaluated_turf - - var/turf/target_turf = pick(validturfs) - if(!target_turf) - return - var/list/obj/effect/portal/created = create_portal_pair(ourturf, target_turf, 300, 1, /obj/effect/portal/anom) - message_admins("[ADMIN_LOOKUPFLW(source)] used a Wormhole Generator in [ADMIN_VERBOSEJMP(ourturf)]") - log_game("[key_name(source)] used a Wormhole Generator in [AREACOORD(ourturf)]") - QDEL_LIST_IN(created, rand(150,300)) - return ..() - - -/////////////////////////////////////// GRAVITATIONAL CATAPULT /////////////////////////////////////////// - -#define GRAVSLING_MODE 1 -#define GRAVPUSH_MODE 2 - -/obj/item/mecha_parts/mecha_equipment/gravcatapult - name = "mounted gravitational catapult" - desc = "An exosuit mounted Gravitational Catapult." - icon_state = "mecha_teleport" - equip_cooldown = 10 - energy_drain = 100 - range = MECHA_MELEE|MECHA_RANGED - ///Which atom we are movable_target onto for - var/atom/movable/movable_target - ///Whether we will throw movable atomstothrow by locking onto them or just throw them back from where we click - var/mode = GRAVSLING_MODE - - -/obj/item/mecha_parts/mecha_equipment/gravcatapult/action(mob/source, atom/movable/target, list/modifiers) - if(!action_checks(target)) - return - switch(mode) - if(GRAVSLING_MODE) - if(!movable_target) - if(!istype(target) || target.anchored || target.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) - to_chat(source, "[icon2html(src, source)][span_warning("Unable to lock on [target]!")]") - return - if(ismob(target)) - var/mob/M = target - if(M.mob_negates_gravity()) - to_chat(source, "[icon2html(src, source)][span_warning("[target] immune to gravitational impulses, unable to lock!")]") - return - movable_target = target - to_chat(source, "[icon2html(src, source)][span_notice("locked on [target].")]") - else if(target!=movable_target) - if(movable_target in view(chassis)) - var/turf/targ = get_turf(target) - var/turf/orig = get_turf(movable_target) - movable_target.throw_at(target, 14, 1.5) - movable_target = null - log_game("[key_name(source)] used a Gravitational Catapult to throw [movable_target] (From [AREACOORD(orig)]) at [target] ([AREACOORD(targ)]).") - return ..() - movable_target = null - to_chat(source, "[icon2html(src, source)][span_notice("Lock on [movable_target] disengaged.")]") - - if(GRAVPUSH_MODE) - var/list/atomstothrow = list() - if(isturf(target)) - atomstothrow = range(3, target) - else - atomstothrow = orange(3, target) - for(var/atom/movable/scatter in atomstothrow) - if(scatter.anchored || scatter.move_resist >= MOVE_FORCE_EXTREMELY_STRONG) - continue - if(ismob(scatter)) - var/mob/scatter_mob = scatter - if(scatter_mob.mob_negates_gravity()) - continue - do_scatter(scatter, target) - var/turf/targetturf = get_turf(target) - log_game("[key_name(source)] used a Gravitational Catapult repulse wave on [AREACOORD(targetturf)]") - return ..() - -/obj/item/mecha_parts/mecha_equipment/gravcatapult/proc/do_scatter(atom/movable/scatter, atom/movable/target) - var/dist = 5 - get_dist(scatter, target) - var/delay = 2 - SSmove_manager.move_away(scatter, target, delay = delay, timeout = delay * dist, flags = MOVEMENT_LOOP_START_FAST, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) - -/obj/item/mecha_parts/mecha_equipment/gravcatapult/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "name" = "Gravity catapult", - "mode" = mode == GRAVPUSH_MODE ? "Push" : "Sling", - ) - -/obj/item/mecha_parts/mecha_equipment/gravcatapult/ui_act(action, list/params) - . = ..() - if(.) - return - if(action == "change_mode") - mode++ - if(mode > GRAVPUSH_MODE) - mode = GRAVSLING_MODE - return TRUE - -#undef GRAVSLING_MODE -#undef GRAVPUSH_MODE - -//////////////////////////// ARMOR BOOSTER MODULES ////////////////////////////////////////////////////////// -/obj/item/mecha_parts/mecha_equipment/armor - equipment_slot = MECHA_ARMOR - ///short protection name to display in the UI - var/protect_name = "you're mome" - ///icon in armor.dmi that shows in the UI - var/iconstate_name - //how much the armor of the mech is modified by - var/list/armor_mod = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - -/obj/item/mecha_parts/mecha_equipment/armor/attach(obj/vehicle/sealed/mecha/M, attach_right) - . = ..() - chassis.setArmor(chassis.returnArmor().modifyRating(arglist(armor_mod))) - -/obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) - var/list/removed_armor = armor_mod.Copy() - for(var/armor_type in removed_armor) - removed_armor[armor_type] = -removed_armor[armor_type] - chassis.setArmor(chassis.returnArmor().modifyRating(arglist(removed_armor))) - return ..() - -/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster - name = "armor booster module (Close Combat Weaponry)" - desc = "Boosts exosuit armor against melee attacks" - icon_state = "mecha_abooster_ccw" - iconstate_name = "melee" - protect_name = "Melee Armor" - armor_mod = list(BLUNT = 15, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - -/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster - name = "armor booster module (Ranged Weaponry)" - desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots." - icon_state = "mecha_abooster_proj" - iconstate_name = "range" - protect_name = "Ranged Armor" - armor_mod = list(BLUNT = 0, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - - -////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// - - -/obj/item/mecha_parts/mecha_equipment/repair_droid - name = "exosuit repair droid" - desc = "An automated repair droid for exosuits. Scans for damage and repairs it. Can fix almost all types of external or internal damage." - icon_state = "repair_droid" - energy_drain = 50 - range = 0 - activated = FALSE - equipment_slot = MECHA_UTILITY - /// Repaired health per second - var/health_boost = 0.5 - var/icon/droid_overlay - var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH) - -/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() - STOP_PROCESSING(SSobj, src) - chassis?.cut_overlay(droid_overlay) - return ..() - -/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - . = ..() - droid_overlay = new(src.icon, icon_state = "repair_droid") - M.add_overlay(droid_overlay) - -/obj/item/mecha_parts/mecha_equipment/repair_droid/detach() - chassis.cut_overlay(droid_overlay) - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/repair_droid/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(action != "toggle") - return - chassis.cut_overlay(droid_overlay) - if(activated) - START_PROCESSING(SSobj, src) - droid_overlay = new(src.icon, icon_state = "repair_droid_a") - log_message("Activated.", LOG_MECHA) - else - STOP_PROCESSING(SSobj, src) - droid_overlay = new(src.icon, icon_state = "repair_droid") - log_message("Deactivated.", LOG_MECHA) - chassis.add_overlay(droid_overlay) - - -/obj/item/mecha_parts/mecha_equipment/repair_droid/process(delta_time) - if(!chassis) - return PROCESS_KILL - var/h_boost = health_boost * delta_time - var/repaired = FALSE - if(chassis.internal_damage & MECHA_INT_SHORT_CIRCUIT) - h_boost *= -2 - else if(chassis.internal_damage && DT_PROB(8, delta_time)) - for(var/int_dam_flag in repairable_damage) - if(!(chassis.internal_damage & int_dam_flag)) - continue - chassis.clear_internal_damage(int_dam_flag) - repaired = TRUE - break - if(h_boost<0 || chassis.get_integrity() < chassis.max_integrity) - chassis.repair_damage(h_boost) - repaired = TRUE - if(repaired) - if(!chassis.use_power(energy_drain)) - activated = FALSE - return PROCESS_KILL - else //no repair needed, we turn off - chassis.cut_overlay(droid_overlay) - droid_overlay = new(src.icon, icon_state = "repair_droid") - chassis.add_overlay(droid_overlay) - activated = FALSE - return PROCESS_KILL - - -/////////////////////////////////////////// GENERATOR ///////////////////////////////////////////// - - -/obj/item/mecha_parts/mecha_equipment/generator - name = "plasma engine" - desc = "An exosuit module that generates power using solid plasma as fuel. Pollutes the environment." - icon_state = "tesla" - range = MECHA_MELEE - equipment_slot = MECHA_POWER - activated = FALSE - var/coeff = 100 - var/obj/item/stack/sheet/fuel - var/max_fuel = 150000 - /// Fuel used per second while idle, not generating - var/fuelrate_idle = 12.5 - /// Fuel used per second while actively generating - var/fuelrate_active = 100 - /// Energy recharged per second - var/rechargerate = 10 - -/obj/item/mecha_parts/mecha_equipment/generator/Initialize(mapload) - . = ..() - generator_init() - -/obj/item/mecha_parts/mecha_equipment/generator/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/mecha_parts/mecha_equipment/generator/proc/generator_init() - fuel = new /obj/item/stack/sheet/mineral/plasma(src, 0) - -/obj/item/mecha_parts/mecha_equipment/generator/detach() - STOP_PROCESSING(SSobj, src) - activated = FALSE - return ..() - -/obj/item/mecha_parts/mecha_equipment/generator/get_snowflake_data() - return list( - "active" = activated, - "fuel" = fuel.amount, - ) - -/obj/item/mecha_parts/mecha_equipment/generator/ui_act(action, list/params) - . = ..() - if(action == "toggle") - if(activated) - to_chat(usr, "[icon2html(src, usr)][span_warning("Power generation enabled.")]") - START_PROCESSING(SSobj, src) - log_message("Activated.", LOG_MECHA) - else - to_chat(usr, "[icon2html(src, usr)][span_warning("Power generation disabled.")]") - STOP_PROCESSING(SSobj, src) - log_message("Deactivated.", LOG_MECHA) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/generator/attackby(weapon, mob/user, params) - . = ..() - load_fuel(weapon, user) - -/obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(obj/item/stack/sheet/P, mob/user) - if(P.type == fuel.type && P.amount > 0) - var/to_load = max(max_fuel - fuel.amount*MINERAL_MATERIAL_AMOUNT,0) - if(to_load) - var/units = min(max(round(to_load / MINERAL_MATERIAL_AMOUNT),1),P.amount) - fuel.amount += units - P.use(units) - to_chat(user, "[icon2html(src, user)][span_notice("[units] unit\s of [fuel] successfully loaded.")]") - return units - else - to_chat(user, "[icon2html(src, user)][span_notice("Unit is full.")]") - return 0 - else - to_chat(user, "[icon2html(src, user)][span_warning("[fuel] traces in target minimal! [P] cannot be used as fuel.")]") - return - -/obj/item/mecha_parts/mecha_equipment/generator/attackby(weapon,mob/user, params) - load_fuel(weapon) - -/obj/item/mecha_parts/mecha_equipment/generator/process(delta_time) - if(!chassis) - activated = FALSE - return PROCESS_KILL - if(fuel.amount<=0) - activated = FALSE - log_message("Deactivated - no fuel.", LOG_MECHA) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Fuel reserves depleted.")]") - return PROCESS_KILL - var/cur_charge = chassis.get_charge() - if(isnull(cur_charge)) - activated = FALSE - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("No power cell detected.")]") - log_message("Deactivated.", LOG_MECHA) - return PROCESS_KILL - var/use_fuel = fuelrate_idle - if(cur_charge < chassis.cell.maxcharge) - use_fuel = fuelrate_active - chassis.give_power(rechargerate * delta_time) - fuel.amount -= min(delta_time * use_fuel / MINERAL_MATERIAL_AMOUNT, fuel.amount) - -/////////////////////////////////////////// THRUSTERS ///////////////////////////////////////////// - -/obj/item/mecha_parts/mecha_equipment/thrusters - name = "generic exosuit thrusters" //parent object, in-game sources will be a child object - desc = "A generic set of thrusters, from an unknown source. Uses not-understood methods to propel exosuits seemingly for free." - icon_state = "thrusters" - equipment_slot = MECHA_UTILITY - var/effect_type = /obj/effect/particle_effect/sparks - -/obj/item/mecha_parts/mecha_equipment/thrusters/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right) - for(var/obj/item/I in M.equip_by_category[MECHA_UTILITY]) - if(istype(I, src)) - to_chat(user, span_warning("[M] already has this thruster package!")) - return FALSE - return ..() - -/obj/item/mecha_parts/mecha_equipment/thrusters/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - M.active_thrusters = src //Enable by default - return ..() - -/obj/item/mecha_parts/mecha_equipment/thrusters/detach() - if(chassis?.active_thrusters == src) - chassis.active_thrusters = null - return ..() - -/obj/item/mecha_parts/mecha_equipment/thrusters/Destroy() - if(chassis?.active_thrusters == src) - chassis.active_thrusters = null - return ..() - -/obj/item/mecha_parts/mecha_equipment/thrusters/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(params["toggle"]) - if(activated) //inactive - START_PROCESSING(SSobj, src) - enable() - log_message("Activated.", LOG_MECHA) - else - STOP_PROCESSING(SSobj, src) - disable() - log_message("Deactivated.", LOG_MECHA) - -/obj/item/mecha_parts/mecha_equipment/thrusters/proc/enable() - if (chassis.active_thrusters == src) - return - chassis.active_thrusters = src - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("[src] enabled.")]") - -/obj/item/mecha_parts/mecha_equipment/thrusters/proc/disable() - if(chassis.active_thrusters != src) - return - chassis.active_thrusters = null - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("[src] disabled.")]") - -/obj/item/mecha_parts/mecha_equipment/thrusters/proc/thrust(movement_dir) - if(!chassis) - return FALSE - generate_effect(movement_dir) - return TRUE //This parent should never exist in-game outside admeme use, so why not let it be a creative thruster? - -/obj/item/mecha_parts/mecha_equipment/thrusters/proc/generate_effect(movement_dir) - var/obj/effect/particle_effect/E = new effect_type(get_turf(chassis)) - E.dir = turn(movement_dir, 180) - step(E, turn(movement_dir, 180)) - QDEL_IN(E, 5) - - -/obj/item/mecha_parts/mecha_equipment/thrusters/gas - name = "RCS thruster package" - desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments, by expelling gas from the internal life support tank." - effect_type = /obj/effect/particle_effect/fluid/smoke - var/move_cost = 20 //moles per step - -/obj/item/mecha_parts/mecha_equipment/thrusters/gas/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(!M.internal_tank) - to_chat(user, span_warning("[M] does not have an internal tank and cannot support this upgrade!")) - return FALSE - return ..() - -/obj/item/mecha_parts/mecha_equipment/thrusters/gas/thrust(movement_dir) - if(!chassis || !chassis.internal_tank) - return FALSE - var/datum/gas_mixture/our_mix = chassis.internal_tank.return_air() - var/moles = our_mix.total_moles - if(moles < move_cost) - our_mix.remove(moles) - return FALSE - our_mix.remove(move_cost) - generate_effect(movement_dir) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/thrusters/ion //for mechs with built-in thrusters, should never really exist un-attached to a mech - name = "Ion thruster package" - desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments." - detachable = FALSE - effect_type = /obj/effect/particle_effect/ion_trails - -/obj/item/mecha_parts/mecha_equipment/thrusters/ion/thrust(movement_dir) - if(!chassis) - return FALSE - if(chassis.use_power(chassis.step_energy_drain)) - generate_effect(movement_dir) - return TRUE - return FALSE diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm deleted file mode 100644 index 0f910997a18..00000000000 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ /dev/null @@ -1,412 +0,0 @@ - -//Hydraulic clamp, Kill clamp, Extinguisher, RCD, Cable layer. - - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp - name = "hydraulic clamp" - desc = "Equipment for engineering exosuits. Lifts objects and loads them into cargo." - icon_state = "mecha_clamp" - equip_cooldown = 15 - energy_drain = 10 - tool_behaviour = TOOL_RETRACTOR - range = MECHA_MELEE - toolspeed = 0.8 - harmful = TRUE - mech_flags = EXOSUIT_MODULE_RIPLEY - ///Bool for whether we beat the hell out of things we punch (and tear off their arms) - var/killer_clamp = FALSE - ///How much base damage this clamp does - var/clamp_damage = 20 - ///Var for the chassis we are attached to, needed to access ripley contents and such - var/obj/vehicle/sealed/mecha/working/ripley/cargo_holder - ///Audio for using the hydraulic clamp - var/clampsound = 'sound/mecha/hydraulic.ogg' - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - . = ..() - if(!.) - return - if(!istype(M, /obj/vehicle/sealed/mecha/working/ripley)) - return FALSE - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/attach(obj/vehicle/sealed/mecha/M) - . = ..() - cargo_holder = M - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/detach(atom/moveto = null) - . = ..() - cargo_holder = null - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(mob/living/source, atom/target, list/modifiers) - if(!action_checks(target)) - return - if(!cargo_holder) - return - if(ismecha(target)) - var/obj/vehicle/sealed/mecha/M = target - var/have_ammo - for(var/obj/item/mecha_ammo/box in cargo_holder.cargo) - if(istype(box, /obj/item/mecha_ammo) && box.rounds) - have_ammo = TRUE - if(M.ammo_resupply(box, source, TRUE)) - return - if(have_ammo) - to_chat(source, "No further supplies can be provided to [M].") - else - to_chat(source, "No providable supplies found in cargo hold") - - else if(isobj(target)) - var/obj/clamptarget = target - if(istype(clamptarget, /obj/machinery/door/firedoor)) - var/obj/machinery/door/firedoor/targetfiredoor = clamptarget - playsound(chassis, clampsound, 50, FALSE, -6) - targetfiredoor.try_to_crowbar(src, source) - return - if(istype(clamptarget, /obj/machinery/door/airlock/)) - var/obj/machinery/door/airlock/targetairlock = clamptarget - playsound(chassis, clampsound, 50, FALSE, -6) - targetairlock.try_to_crowbar(src, source) - return - if(clamptarget.anchored) - to_chat(source, "[icon2html(src, source)][span_warning("[target] is firmly secured!")]") - return - if(LAZYLEN(cargo_holder.cargo) >= cargo_holder.cargo_capacity) - to_chat(source, "[icon2html(src, source)][span_warning("Not enough room in cargo compartment!")]") - return - playsound(chassis, clampsound, 50, FALSE, -6) - chassis.visible_message(span_notice("[chassis] lifts [target] and starts to load it into cargo compartment.")) - clamptarget.set_anchored(TRUE) - if(!do_after_cooldown(target, source)) - clamptarget.set_anchored(initial(clamptarget.anchored)) - return - LAZYADD(cargo_holder.cargo, clamptarget) - clamptarget.forceMove(chassis) - clamptarget.set_anchored(FALSE) - if(!cargo_holder.box && istype(clamptarget, /obj/structure/ore_box)) - cargo_holder.box = clamptarget - to_chat(source, "[icon2html(src, source)][span_notice("[target] successfully loaded.")]") - log_message("Loaded [clamptarget]. Cargo compartment capacity: [cargo_holder.cargo_capacity - LAZYLEN(cargo_holder.cargo)]", LOG_MECHA) - - else if(isliving(target)) - var/mob/living/M = target - if(M.stat == DEAD) - return - - if(!source.combat_mode) - step_away(M,chassis) - if(killer_clamp) - target.visible_message(span_danger("[chassis] tosses [target] like a piece of paper!"), \ - span_userdanger("[chassis] tosses you like a piece of paper!")) - else - to_chat(source, "[icon2html(src, source)][span_notice("You push [target] out of the way.")]") - chassis.visible_message(span_notice("[chassis] pushes [target] out of the way."), \ - span_notice("[chassis] pushes you aside.")) - return ..() - else if(LAZYACCESS(modifiers, RIGHT_CLICK) && iscarbon(M))//meme clamp here - if(!killer_clamp) - to_chat(source, span_notice("You longingly wish to tear [M]'s arms off.")) - return - var/mob/living/carbon/C = target - var/torn_off = FALSE - var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM) - if(affected != null) - affected.dismember(DROPLIMB_BLUNT) - torn_off = TRUE - affected = C.get_bodypart(BODY_ZONE_R_ARM) - if(affected != null) - affected.dismember(DROPLIMB_BLUNT) - torn_off = TRUE - if(!torn_off) - to_chat(source, span_notice("[M]'s arms are already torn off, you must find a challenger worthy of the kill clamp!")) - return - playsound(src, get_dismember_sound(), 80, TRUE) - target.visible_message(span_danger("[chassis] rips [target]'s arms off!"), \ - span_userdanger("[chassis] rips your arms off!")) - log_combat(source, M, "removed both arms with a real clamp,", "[name]", "(COMBAT MODE: [uppertext(source.combat_mode)] (DAMTYPE: [uppertext(damtype)])") - return ..() - - M.take_overall_damage(clamp_damage) - if(!M) //get gibbed stoopid - return - M.adjustOxyLoss(round(clamp_damage/2)) - M.updatehealth() - target.visible_message(span_danger("[chassis] squeezes [target]!"), \ - span_userdanger("[chassis] squeezes you!"),\ - span_hear("You hear something crack.")) - log_combat(source, M, "attacked", "[name]", "(Combat mode: [source.combat_mode ? "On" : "Off"]) (DAMTYPE: [uppertext(damtype)])") - return ..() - - - -//This is pretty much just for the death-ripley -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill - name = "\improper KILL CLAMP" - desc = "They won't know what clamped them! This time for real!" - killer_clamp = TRUE - - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/fake//harmless fake for pranks - desc = "They won't know what clamped them!" - energy_drain = 0 - clamp_damage = 0 - killer_clamp = FALSE - - -/obj/item/mecha_parts/mecha_equipment/extinguisher - name = "exosuit extinguisher" - desc = "Equipment for engineering exosuits. A rapid-firing high capacity fire extinguisher." - icon_state = "mecha_exting" - equip_cooldown = 5 - energy_drain = 0 - equipment_slot = MECHA_UTILITY - range = MECHA_MELEE|MECHA_RANGED - mech_flags = EXOSUIT_MODULE_WORKING - ///Minimum amount of reagent needed to activate. - var/required_amount = 80 - -/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize(mapload) - . = ..() - create_reagents(400) - reagents.add_reagent(/datum/reagent/water, 400) - -/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/spray_extinguisher(mob/user) - if(reagents.total_volume < required_amount) - return - - for(var/turf/targetturf in RANGE_TURFS(1, chassis)) - var/obj/effect/particle_effect/water/extinguisher/water = new /obj/effect/particle_effect/water/extinguisher(targetturf) - var/datum/reagents/water_reagents = new /datum/reagents(required_amount/8) //required_amount/8, because the water usage is split between eight sprays. As of this comment, required_amount/8 = 10u each. - water.reagents = water_reagents - water_reagents.my_atom = water - reagents.trans_to(water, required_amount/8) - water.move_at(get_step(chassis, get_dir(targetturf, chassis)), 2, 4) //Target is the tile opposite of the mech as the starting turf. - - playsound(chassis, 'sound/effects/extinguish.ogg', 75, TRUE, -3) - - -/** - * Handles attemted refills of the extinguisher. - * - * The mech can only refill an extinguisher that is in front of it. - * Only water tank objects can be used. - */ -/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/attempt_refill(mob/user) - if(reagents.maximum_volume == reagents.total_volume) - return - var/turf/in_front = get_step(chassis, chassis.dir) - var/obj/structure/reagent_dispensers/watertank/refill_source = locate(/obj/structure/reagent_dispensers/watertank) in in_front - if(!refill_source) - to_chat(user, span_notice("Refill failed. No compatible tank found.")) - return - if(!refill_source.reagents?.total_volume) - to_chat(user, span_notice("Refill failed. Source tank empty.")) - return - - refill_source.reagents.trans_to(src, reagents.maximum_volume) - playsound(chassis, 'sound/effects/refill.ogg', 50, TRUE, -6) - -/obj/item/mecha_parts/mecha_equipment/extinguisher/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_EXTINGUISHER, - "reagents" = reagents.total_volume, - "total_reagents" = reagents.maximum_volume, - "minimum_requ" = required_amount, - ) - -/obj/item/mecha_parts/mecha_equipment/extinguisher/ui_act(action, list/params) - . = ..() - if(.) - return TRUE - switch(action) - if("activate") - spray_extinguisher(usr) - return TRUE - if("refill") - attempt_refill(usr) - return TRUE - - -/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - . = ..() - if(!.) - return - if(!istype(M, /obj/vehicle/sealed/mecha/working)) - return FALSE - - -#define MODE_DECONSTRUCT 0 -#define MODE_WALL 1 -#define MODE_AIRLOCK 2 - -/obj/item/mecha_parts/mecha_equipment/rcd - name = "mounted RCD" - desc = "An exosuit-mounted Rapid Construction Device." - icon_state = "mecha_rcd" - equip_cooldown = 10 - energy_drain = 250 - range = MECHA_MELEE|MECHA_RANGED - item_flags = NO_MAT_REDEMPTION - ///determines what we'll so when clicking on a turf - var/mode = MODE_DECONSTRUCT - -/obj/item/mecha_parts/mecha_equipment/rcd/Initialize(mapload) - . = ..() - SET_TRACKING(TRACKING_KEY_RCD) - -/obj/item/mecha_parts/mecha_equipment/rcd/Destroy() - UNSET_TRACKING(TRACKING_KEY_RCD) - return ..() - -/obj/item/mecha_parts/mecha_equipment/rcd/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "name" = "RCD control", - "mode" = get_mode_name(), - ) - -/// fetches the mode name to display in the UI -/obj/item/mecha_parts/mecha_equipment/rcd/proc/get_mode_name() - switch(mode) - if(MODE_DECONSTRUCT) - return "Deconstruct" - if(MODE_WALL) - return "Build wall" - if(MODE_AIRLOCK) - return "Build Airlock" - else - return "Someone didnt set this" - -/obj/item/mecha_parts/mecha_equipment/rcd/ui_act(action, list/params) - . = ..() - if(.) - return - if(action == "change_mode") - mode++ - if(mode > MODE_AIRLOCK) - mode = MODE_DECONSTRUCT - switch(mode) - if(MODE_DECONSTRUCT) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Switched RCD to Deconstruct.")]") - energy_drain = initial(energy_drain) - if(MODE_WALL) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Switched RCD to Construct Walls and Flooring.")]") - energy_drain = 2*initial(energy_drain) - if(MODE_AIRLOCK) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Switched RCD to Construct Airlock.")]") - energy_drain = 2*initial(energy_drain) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/rcd/action(mob/source, atom/target, list/modifiers) - if(!isturf(target) && !istype(target, /obj/machinery/door/airlock)) - target = get_turf(target) - if(!action_checks(target) || get_dist(chassis, target)>3 || istype(target, /turf/open/space/transit)) - return - playsound(chassis, 'sound/machines/click.ogg', 50, TRUE) - - switch(mode) - if(MODE_DECONSTRUCT) - to_chat(source, "[icon2html(src, source)][span_notice("Deconstructing [target]...")]") - if(iswallturf(target)) - var/turf/closed/constructed_wall/W = target - if(!do_after_cooldown(W, source)) - return - W.ScrapeAway() - else if(isfloorturf(target)) - var/turf/open/floor/F = target - if(!do_after_cooldown(target, source)) - return - F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - else if (istype(target, /obj/machinery/door/airlock)) - if(!do_after_cooldown(target, source)) - return - qdel(target) - if(MODE_WALL) - if(isspaceturf(target)) - var/turf/open/space/S = target - to_chat(source, "[icon2html(src, source)][span_notice("Building Floor...")]") - if(!do_after_cooldown(S, source)) - return - S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - else if(isfloorturf(target)) - var/turf/open/floor/F = target - to_chat(source, "[icon2html(src, source)][span_notice("Building Wall...")]") - if(!do_after_cooldown(F, source)) - return - F.PlaceOnTop(/turf/closed/constructed_wall) - if(MODE_AIRLOCK) - if(isfloorturf(target)) - to_chat(source, "[icon2html(src, source)][span_notice("Building Airlock...")]") - if(!do_after_cooldown(target, source)) - return - var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) - T.autoclose = TRUE - playsound(target, 'sound/effects/sparks2.ogg', 50, TRUE) - chassis.spark_system.start() - playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) - return ..() - -#undef MODE_DECONSTRUCT -#undef MODE_WALL -#undef MODE_AIRLOCK - -//Dunno where else to put this so shrug -/obj/item/mecha_parts/mecha_equipment/ripleyupgrade - name = "Ripley MK-II Conversion Kit" - desc = "A pressurized canopy attachment kit for an Autonomous Power Loader Unit \"Ripley\" MK-I mecha, to convert it to the slower, but space-worthy MK-II design. This kit cannot be removed, once applied." - icon_state = "ripleyupgrade" - mech_flags = EXOSUIT_MODULE_RIPLEY - -/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/can_attach(obj/vehicle/sealed/mecha/working/ripley/M, attach_right = FALSE) - if(M.type != /obj/vehicle/sealed/mecha/working/ripley) - to_chat(loc, span_warning("This conversion kit can only be applied to APLU MK-I models.")) - return FALSE - if(LAZYLEN(M.cargo)) - to_chat(loc, span_warning("[M]'s cargo hold must be empty before this conversion kit can be applied.")) - return FALSE - if(!(M.mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) //non-removable upgrade, so lets make sure the pilot or owner has their say. - to_chat(loc, span_warning("[M] must have maintenance protocols active in order to allow this conversion kit.")) - return FALSE - if(LAZYLEN(M.occupants)) //We're actualy making a new mech and swapping things over, it might get weird if players are involved - to_chat(loc, span_warning("[M] must be unoccupied before this conversion kit can be applied.")) - return FALSE - if(!M.cell) //Turns out things break if the cell is missing - to_chat(loc, span_warning("The conversion process requires a cell installed.")) - return FALSE - return TRUE - -/obj/item/mecha_parts/mecha_equipment/ripleyupgrade/attach(obj/vehicle/sealed/mecha/markone, attach_right = FALSE) - var/obj/vehicle/sealed/mecha/working/ripley/mk2/marktwo = new (get_turf(markone),1) - if(!marktwo) - return - QDEL_NULL(marktwo.cell) - if (markone.cell) - marktwo.cell = markone.cell - markone.cell.forceMove(marktwo) - markone.cell = null - QDEL_NULL(marktwo.scanmod) - if (markone.scanmod) - marktwo.scanmod = markone.scanmod - markone.scanmod.forceMove(marktwo) - markone.scanmod = null - QDEL_NULL(marktwo.capacitor) - if (markone.capacitor) - marktwo.capacitor = markone.capacitor - markone.capacitor.forceMove(marktwo) - markone.capacitor = null - marktwo.update_part_values() - for(var/obj/item/mecha_parts/mecha_equipment/equipment in markone.flat_equipment) //Move the equipment over... - if(istype(equipment, /obj/item/mecha_parts/mecha_equipment/ejector)) - continue //the MK2 already has one. - var/righthandgun = markone.equip_by_category[MECHA_R_ARM] == equipment - equipment.detach(marktwo) - equipment.attach(marktwo, righthandgun) - marktwo.dna_lock = markone.dna_lock - marktwo.mecha_flags = markone.mecha_flags - marktwo.strafe = markone.strafe - //Integ set to the same percentage integ as the old mecha, rounded to be whole number - marktwo.update_integrity(round((markone.get_integrity() / markone.max_integrity) * marktwo.get_integrity())) - if(markone.name != initial(markone.name)) - marktwo.name = markone.name - markone.wreckage = FALSE - qdel(markone) - playsound(get_turf(marktwo),'sound/items/ratchet.ogg',50,TRUE) diff --git a/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm b/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm deleted file mode 100644 index c4673c38e26..00000000000 --- a/code/modules/vehicles/mecha/equipment/weapons/mecha_ammo.dm +++ /dev/null @@ -1,95 +0,0 @@ -/obj/item/mecha_ammo - name = "generic ammo box" - desc = "A box of ammo for an unknown weapon." - w_class = WEIGHT_CLASS_BULKY - icon = 'icons/mecha/mecha_ammo.dmi' - icon_state = "empty" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - var/rounds = 0 - var/direct_load //For weapons where we re-load the weapon itself rather than adding to the ammo storage. - var/load_audio = 'sound/weapons/gun/general/mag_bullet_insert.ogg' - var/ammo_type - -/obj/item/mecha_ammo/update_name() - . = ..() - name = "[rounds ? null : "empty "][initial(name)]" - -/obj/item/mecha_ammo/update_desc() - . = ..() - desc = rounds ? initial(desc) : "An exosuit ammuniton box that has since been emptied. Please recycle." - -/obj/item/mecha_ammo/update_icon_state() - icon_state = rounds ? initial(icon_state) : "empty" - return ..() - -/obj/item/mecha_ammo/attack_self(mob/user) - ..() - if(rounds) - to_chat(user, span_warning("You cannot flatten the ammo box until it's empty!")) - return - - to_chat(user, span_notice("You fold [src] flat.")) - var/trash = new /obj/item/stack/sheet/steel(user.loc) - qdel(src) - user.put_in_hands(trash) - -/obj/item/mecha_ammo/examine(mob/user) - . = ..() - if(rounds) - . += "There [rounds > 1?"are":"is"] [rounds] [ammo_type][rounds > 1?"s":""] left." - -/obj/item/mecha_ammo/incendiary - name = "incendiary ammo box" - desc = "A box of incendiary ammunition for use with exosuit weapons." - icon_state = "incendiary" - rounds = 24 - ammo_type = MECHA_AMMO_INCENDIARY - -/obj/item/mecha_ammo/scattershot - name = "scattershot ammo box" - desc = "A box of scaled-up buckshot, for use in exosuit shotguns." - icon_state = "scattershot" - rounds = 40 - ammo_type = MECHA_AMMO_BUCKSHOT - -/obj/item/mecha_ammo/lmg - name = "machine gun ammo box" - desc = "A box of linked ammunition, designed for the Ultra AC 2 exosuit weapon." - icon_state = "lmg" - rounds = 300 - ammo_type = MECHA_AMMO_LMG - -/obj/item/mecha_ammo/missiles_br - name = "breaching missiles" - desc = "A box of large missiles, ready for loading into a BRM-6 exosuit missile rack." - icon_state = "missile_br" - rounds = 6 - direct_load = TRUE - load_audio = 'sound/weapons/gun/general/mag_bullet_insert.ogg' - ammo_type = MECHA_AMMO_MISSILE_HE - -/obj/item/mecha_ammo/missiles_he - name = "anti-armor missiles" - desc = "A box of large missiles, ready for loading into an SRM-8 exosuit missile rack." - icon_state = "missile_he" - rounds = 8 - direct_load = TRUE - load_audio = 'sound/weapons/gun/general/mag_bullet_insert.ogg' - ammo_type = MECHA_AMMO_MISSILE_AP - - -/obj/item/mecha_ammo/flashbang - name = "launchable flashbangs" - desc = "A box of smooth flashbangs, for use with a large exosuit launcher. Cannot be primed by hand." - icon_state = "flashbang" - rounds = 6 - ammo_type = MECHA_AMMO_FLASHBANG - -/obj/item/mecha_ammo/clusterbang - name = "launchable flashbang clusters" - desc = "A box of clustered flashbangs, for use with a specialized exosuit cluster launcher. Cannot be primed by hand." - icon_state = "clusterbang" - rounds = 3 - direct_load = TRUE - ammo_type = MECHA_AMMO_CLUSTERBANG diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm deleted file mode 100644 index 231c4eca71c..00000000000 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ /dev/null @@ -1,519 +0,0 @@ -/obj/item/mecha_parts/mecha_equipment/weapon - name = "mecha weapon" - range = MECHA_RANGED - equipment_slot = MECHA_WEAPON - destroy_sound = 'sound/mecha/weapdestr.ogg' - var/projectile - var/fire_sound - var/projectiles_per_shot = 1 - var/variance = 0 - var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter - var/projectile_delay = 0 - var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. - var/kickback = TRUE //Will using this weapon in no grav push mecha back. - mech_flags = EXOSUIT_MODULE_COMBAT - -/obj/item/mecha_parts/mecha_equipment/weapon/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(!..()) - return FALSE - if(istype(M, /obj/vehicle/sealed/mecha/combat)) - return TRUE - return FALSE - -/obj/item/mecha_parts/mecha_equipment/weapon/action(mob/source, atom/target, list/modifiers) - if(!action_checks(target)) - return FALSE - var/newtonian_target = turn(chassis.dir,180) - . = ..()//start the cooldown early because of sleeps - for(var/i in 1 to projectiles_per_shot) - if(energy_drain && !chassis.has_charge(energy_drain))//in case we run out of energy mid-burst, such as emp - break - var/spread = 0 - if(variance) - if(randomspread) - spread = round((rand() - 0.5) * variance) - else - spread = round((i / projectiles_per_shot - 0.5) * variance) - - var/obj/projectile/projectile_obj = new projectile(get_turf(src)) - projectile_obj.firer = chassis - projectile_obj.preparePixelProjectile(target, source, modifiers, spread) - if(source.client && isliving(source)) //dont want it to happen from syndie mecha npc mobs, they do direct fire anyways - var/mob/living/shooter = source - projectile_obj.hit_prone_targets = shooter.combat_mode - projectile_obj.fire() - if(!projectile_obj.suppressed && firing_effect_type) - new firing_effect_type(get_turf(src), chassis.dir) - playsound(chassis, fire_sound, 50, TRUE) - - sleep(max(0, projectile_delay)) - - if(kickback) - chassis.newtonian_move(newtonian_target) - chassis.log_message("Fired from [name], targeting [target].", LOG_ATTACK) - -//Base energy weapon type -/obj/item/mecha_parts/mecha_equipment/weapon/energy - name = "general energy weapon" - firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - equip_cooldown = 8 - name = "\improper CH-PS \"Immolator\" laser" - desc = "A weapon for combat exosuits. Shoots basic lasers." - icon_state = "mecha_laser" - energy_drain = 30 - projectile = /obj/projectile/beam/laser - fire_sound = 'sound/weapons/laser.ogg' - harmful = TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler - equip_cooldown = 8 - name = "\improper CH-DS \"Peacemaker\" disabler" - desc = "A weapon for combat exosuits. Shoots basic disablers." - icon_state = "mecha_disabler" - energy_drain = 30 - projectile = /obj/projectile/beam/disabler - fire_sound = 'sound/weapons/taser2.ogg' - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy - equip_cooldown = 15 - name = "\improper CH-LC \"Solaris\" laser cannon" - desc = "A weapon for combat exosuits. Shoots heavy lasers." - icon_state = "mecha_laser" - energy_drain = 60 - projectile = /obj/projectile/beam/laser/heavylaser - fire_sound = 'sound/weapons/lasercannonfire.ogg' - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion - equip_cooldown = 20 - name = "\improper MKIV ion heavy cannon" - desc = "A weapon for combat exosuits. Shoots technology-disabling ion beams. Don't catch yourself in the blast!" - icon_state = "mecha_ion" - energy_drain = 120 - projectile = /obj/projectile/ion - fire_sound = 'sound/weapons/laser.ogg' - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla - equip_cooldown = 35 - name = "\improper MKI Tesla Cannon" - desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine." - icon_state = "mecha_ion" - energy_drain = 500 - projectile = /obj/projectile/energy/tesla/cannon - fire_sound = 'sound/magic/lightningbolt.ogg' - harmful = TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse - equip_cooldown = 30 - name = "eZ-13 MK2 heavy pulse rifle" - desc = "A weapon for combat exosuits. Shoots powerful destructive blasts capable of demolishing obstacles." - icon_state = "mecha_pulse" - energy_drain = 120 - projectile = /obj/projectile/beam/pulse/heavy - fire_sound = 'sound/weapons/marauder.ogg' - harmful = TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma - equip_cooldown = 10 - name = "217-D Heavy Plasma Cutter" - desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." - icon_state = "mecha_plasmacutter" - inhand_icon_state = "plasmacutter" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - energy_drain = 30 - projectile = /obj/projectile/plasma/adv/mech - fire_sound = 'sound/weapons/plasma_cutter.ogg' - harmful = TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(..()) //combat mech - return TRUE - else if(default_can_attach(M, attach_right)) - return TRUE - return FALSE - -/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser - name = "\improper PBT \"Pacifier\" mounted taser" - desc = "A weapon for combat exosuits. Shoots non-lethal stunning electrodes." - icon_state = "mecha_taser" - energy_drain = 20 - equip_cooldown = 8 - projectile = /obj/projectile/energy/electrode - fire_sound = 'sound/weapons/taser.ogg' - - -/obj/item/mecha_parts/mecha_equipment/weapon/honker - name = "\improper HoNkER BlAsT 5000" - desc = "Equipment for clown exosuits. Spreads fun and joy to everyone around. Honk!" - icon_state = "mecha_honker" - energy_drain = 200 - equip_cooldown = 150 - range = MECHA_MELEE|MECHA_RANGED - kickback = FALSE - mech_flags = EXOSUIT_MODULE_HONK - -/obj/item/mecha_parts/mecha_equipment/weapon/honker/can_attach(obj/vehicle/sealed/mecha/mecha, attach_right = FALSE) - . = ..() - if(!.) - return - if(!istype(mecha, /obj/vehicle/sealed/mecha/combat/honker)) - return FALSE - - -/obj/item/mecha_parts/mecha_equipment/weapon/honker/action(mob/source, atom/target, list/modifiers) - if(!action_checks(target)) - return - playsound(chassis, 'sound/items/airhorn.ogg', 100, TRUE) - to_chat(source, "[icon2html(src, source)]HONK") - for(var/mob/living/carbon/M in ohearers(6, chassis)) - if(!M.can_hear()) - continue - var/turf/turf_check = get_turf(M) - if(isspaceturf(turf_check) && !turf_check.Adjacent(src)) //in space nobody can hear you honk. - continue - to_chat(M, "HONK") - M.SetSleeping(0) - M.adjust_timed_status_effect(40 SECONDS, /datum/status_effect/speech/stutter) - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) - if(ears) - ears.adjustEarDamage(0, 30) - M.Paralyze(60) - if(prob(30)) - M.Stun(200) - M.Unconscious(80) - else - M.set_timed_status_effect(1000 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - - log_message("Honked from [src.name]. HONK!", LOG_MECHA) - var/turf/T = get_turf(src) - message_admins("[ADMIN_LOOKUPFLW(source)] used a Mecha Honker in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(source)] used a Mecha Honker in [AREACOORD(T)]") - return ..() - - -//Base ballistic weapon type -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic - name = "general ballistic weapon" - fire_sound = 'sound/weapons/gun/smg/shot.ogg' - var/projectiles - var/projectiles_cache //ammo to be loaded in, if possible. - var/projectiles_cache_max - var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand - var/ammo_type - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target) - if(!..()) - return FALSE - if(projectiles <= 0) - return FALSE - return TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(action == "reload") - rearm() - return TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm() - if(projectiles < initial(projectiles)) - var/projectiles_to_add = initial(projectiles) - projectiles - if(!projectiles_cache) - return FALSE - if(projectiles_to_add <= projectiles_cache) - projectiles = projectiles + projectiles_to_add - projectiles_cache = projectiles_cache - projectiles_to_add - else - projectiles = projectiles + projectiles_cache - projectiles_cache = 0 - log_message("Rearmed [src].", LOG_MECHA) - return TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/needs_rearm() - return projectiles <= 0 - - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(mob/source, atom/target, list/modifiers) - . = ..() - if(!.) - return - projectiles -= projectiles_per_shot - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine - name = "\improper FNX-99 \"Hades\" Carbine" - desc = "A weapon for combat exosuits. Shoots incendiary bullets." - icon_state = "mecha_carbine" - equip_cooldown = 10 - projectile = /obj/projectile/bullet/incendiary/fnx99 - projectiles = 24 - projectiles_cache = 24 - projectiles_cache_max = 96 - harmful = TRUE - ammo_type = MECHA_AMMO_INCENDIARY - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced - name = "\improper S.H.H. \"Quietus\" Carbine" - desc = "A weapon for combat exosuits. A mime invention, field tests have shown that targets cannot even scream before going down." - fire_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - icon_state = "mecha_mime" - equip_cooldown = 30 - projectile = /obj/projectile/bullet/mime - projectiles = 6 - projectiles_cache = 999 - harmful = TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - name = "\improper LBX AC 10 \"Scattershot\"" - desc = "A weapon for combat exosuits. Shoots a spread of pellets." - icon_state = "mecha_scatter" - equip_cooldown = 20 - projectile = /obj/projectile/bullet/scattershot - projectiles = 40 - projectiles_cache = 40 - projectiles_cache_max = 160 - projectiles_per_shot = 4 - variance = 25 - harmful = TRUE - ammo_type = MECHA_AMMO_BUCKSHOT - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - name = "\improper Ultra AC 2" - desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst." - icon_state = "mecha_uac2" - equip_cooldown = 10 - projectile = /obj/projectile/bullet/lmg - projectiles = 300 - projectiles_cache = 300 - projectiles_cache_max = 1200 - projectiles_per_shot = 3 - variance = 6 - randomspread = 1 - projectile_delay = 2 - harmful = TRUE - ammo_type = MECHA_AMMO_LMG - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack - name = "\improper SRM-8 missile rack" - desc = "A weapon for combat exosuits. Launches light explosive missiles." - icon_state = "mecha_missilerack" - projectile = /obj/projectile/bullet/a84mm/he - fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' - projectiles = 8 - projectiles_cache = 0 - projectiles_cache_max = 0 - disabledreload = TRUE - equip_cooldown = 60 - harmful = TRUE - ammo_type = MECHA_AMMO_MISSILE_HE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching - name = "\improper BRM-6 missile rack" - desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target." - icon_state = "mecha_missilerack_six" - projectile = /obj/projectile/bullet/a84mm_br - fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' - projectiles = 6 - projectiles_cache = 0 - projectiles_cache_max = 0 - disabledreload = TRUE - equip_cooldown = 60 - harmful = TRUE - ammo_type = MECHA_AMMO_MISSILE_AP - - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher - var/missile_speed = 2 - var/missile_range = 30 - var/diags_first = FALSE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/action(mob/source, atom/target, list/modifiers) - if(!action_checks(target)) - return - var/obj/O = new projectile(chassis.loc) - playsound(chassis, fire_sound, 50, TRUE) - log_message("Launched a [O.name] from [name], targeting [target].", LOG_MECHA) - projectiles-- - proj_init(O, source) - O.throw_at(target, missile_range, missile_speed, source, FALSE, diagonals_first = diags_first) - return TRUE - -//used for projectile initilisation (priming flashbang) and additional logging -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/proc/proj_init(obj/O, mob/user) - return - - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang - name = "\improper SGL-6 grenade launcher" - desc = "A weapon for combat exosuits. Launches primed flashbangs." - icon_state = "mecha_grenadelnchr" - projectile = /obj/item/grenade/flashbang - fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' - projectiles = 6 - projectiles_cache = 6 - projectiles_cache_max = 24 - missile_speed = 1.5 - equip_cooldown = 60 - ammo_type = MECHA_AMMO_FLASHBANG - var/det_time = 20 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(obj/item/grenade/flashbang/F, mob/user) - var/turf/T = get_turf(src) - message_admins("[ADMIN_LOOKUPFLW(user)] fired a [F] in [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(user)] fired a [F] in [AREACOORD(T)]") - addtimer(CALLBACK(F, TYPE_PROC_REF(/obj/item/grenade/flashbang, detonate)), det_time) - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang //Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze - name = "\improper SOB-3 grenade launcher" - desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster." - projectiles = 3 - projectiles_cache = 0 - projectiles_cache_max = 0 - disabledreload = TRUE - projectile = /obj/item/grenade/clusterbuster - equip_cooldown = 90 - ammo_type = MECHA_AMMO_CLUSTERBANG - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar - name = "banana mortar" - desc = "Equipment for clown exosuits. Launches banana peels." - icon_state = "mecha_bananamrtr" - projectile = /obj/item/grown/bananapeel - fire_sound = 'sound/items/bikehorn.ogg' - projectiles = 15 - missile_speed = 1.5 - projectiles_cache = 999 - equip_cooldown = 20 - mech_flags = EXOSUIT_MODULE_HONK - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M, attach_right = FALSE) - if(..()) - if(istype(M)) - return 1 - return 0 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar - name = "mousetrap mortar" - desc = "Equipment for clown exosuits. Launches armed mousetraps." - icon_state = "mecha_mousetrapmrtr" - projectile = /obj/item/assembly/mousetrap/armed - fire_sound = 'sound/items/bikehorn.ogg' - projectiles = 15 - missile_speed = 1.5 - projectiles_cache = 999 - equip_cooldown = 10 - mech_flags = EXOSUIT_MODULE_HONK - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/can_attach(obj/vehicle/sealed/mecha/combat/honker/M, attach_right = FALSE) - if(..()) - if(istype(M)) - return 1 - return 0 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(obj/item/assembly/mousetrap/armed/M) - M.secured = 1 - - -//Classic extending punching glove, but weaponised! -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove - name = "\improper Oingo Boingo Punch-face" - desc = "Equipment for clown exosuits. Delivers fun right to your face!" - icon_state = "mecha_punching_glove" - energy_drain = 250 - equip_cooldown = 20 - range = MECHA_MELEE|MECHA_RANGED - missile_range = 5 - projectile = /obj/item/punching_glove - fire_sound = 'sound/items/bikehorn.ogg' - projectiles = 10 - projectiles_cache = 999 - harmful = TRUE - diags_first = TRUE - /// Damage done by the glove on contact. Also used to determine throw distance (damage / 5) - var/punch_damage = 35 - mech_flags = EXOSUIT_MODULE_HONK - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/can_attach(obj/vehicle/sealed/mecha/combat/honker/M, attach_right = FALSE) - if(..()) - if(istype(M)) - return 1 - return 0 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "mode" = harmful ? "LETHAL FISTING" : "Cuddles", - ) - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/ui_act(action, list/params) - . = ..() - if(action == "toggle") - harmful = !harmful - if(harmful) - to_chat(usr, "[icon2html(src, usr)][span_warning("Lethal Fisting Enabled.")]") - else - to_chat(usr, "[icon2html(src, usr)][span_warning("Lethal Fisting Disabled.")]") - return TRUE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/action(mob/source, atom/target, list/modifiers) - . = ..() - if(.) - to_chat(usr, "[icon2html(src, usr)]HONK") - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/proj_init(obj/item/punching_glove/PG) - if(!istype(PG)) - return - - if(harmful) - PG.throwforce = punch_damage - else - PG.throwforce = 0 - - chassis.Beam(PG, icon_state = "chain", time = missile_range * 20, maxdistance = missile_range + 2) - -/obj/item/punching_glove - name = "punching glove" - desc = "INCOMING HONKS" - throwforce = 35 - icon_state = "punching_glove" - -/obj/item/punching_glove/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(!..()) - if(ismovable(hit_atom)) - var/atom/movable/AM = hit_atom - AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), clamp(round(throwforce/5), 2, 20), 2, force = MOVE_FORCE_EXTREMELY_STRONG) //Throws them equal to damage/5, with a min range of 2 and max range of 20 - qdel(src) - -///dark honk weapons - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana - name = "bombanana mortar" - desc = "Equipment for clown exosuits. Launches exploding banana peels." - icon_state = "mecha_bananamrtr" - projectile = /obj/item/grown/bananapeel/bombanana - projectiles = 8 - projectiles_cache = 999 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana/can_attach(obj/vehicle/sealed/mecha/combat/honker/M, attach_right = FALSE) - if(..()) - if(istype(M)) - return TRUE - return FALSE - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/tearstache - name = "\improper HONKeR-6 grenade launcher" - desc = "A weapon for combat exosuits. Launches primed tear-stache grenades." - icon_state = "mecha_grenadelnchr" - projectile = /obj/item/grenade/chem_grenade/teargas/moustache - fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' - projectiles = 6 - missile_speed = 1.5 - projectiles_cache = 999 - equip_cooldown = 60 - det_time = 20 - -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/tearstache/can_attach(obj/vehicle/sealed/mecha/combat/honker/M, attach_right = FALSE) - if(..()) - if(istype(M)) - return TRUE - return FALSE diff --git a/code/modules/vehicles/mecha/mech_bay.dm b/code/modules/vehicles/mecha/mech_bay.dm deleted file mode 100644 index fe735d9510f..00000000000 --- a/code/modules/vehicles/mecha/mech_bay.dm +++ /dev/null @@ -1,174 +0,0 @@ -/obj/machinery/mech_bay_recharge_port - name = "mech bay power port" - desc = "This port recharges a mech's internal power cell." - density = TRUE - dir = EAST - icon = 'icons/mecha/mech_bay.dmi' - icon_state = "recharge_port" - circuit = /obj/item/circuitboard/machine/mech_recharger - ///Weakref to currently recharging mech on our recharging_turf - var/datum/weakref/recharging_mech_ref - ///Ref to charge console for seeing charge for this port, cyclical reference - var/obj/machinery/computer/mech_bay_power_console/recharge_console - ///Power unit per second to charge by - var/recharge_power = 25 - ///turf that will be checked when a mech wants to charge. directly one turf in the direction it is facing - var/turf/recharging_turf - -/obj/machinery/mech_bay_recharge_port/Initialize(mapload) - . = ..() - recharging_turf = get_step(loc, dir) - - if(!mapload) - return - - var/area/my_area = get_area(src) - if(!(my_area.type in GLOB.the_station_areas)) - return - - var/area_name = get_area_name(src, format_text = TRUE) - if(area_name in GLOB.roundstart_station_mechcharger_areas) - return - GLOB.roundstart_station_mechcharger_areas += area_name - -/obj/machinery/mech_bay_recharge_port/Destroy() - if (recharge_console?.recharge_port == src) - recharge_console.recharge_port = null - return ..() - -/obj/machinery/mech_bay_recharge_port/setDir(new_dir) - . = ..() - recharging_turf = get_step(loc, dir) - -/obj/machinery/mech_bay_recharge_port/RefreshParts() - . = ..() - var/total_rating = 0 - for(var/obj/item/stock_parts/capacitor/cap in component_parts) - total_rating += cap.rating - recharge_power = total_rating * 12.5 - -/obj/machinery/mech_bay_recharge_port/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Recharge power [siunit(recharge_power, "W", 1)].") - -/obj/machinery/mech_bay_recharge_port/process(delta_time) - if(machine_stat & NOPOWER || !recharge_console) - return - var/obj/vehicle/sealed/mecha/recharging_mech = recharging_mech_ref?.resolve() - if(!recharging_mech) - recharging_mech = locate(/obj/vehicle/sealed/mecha) in recharging_turf - if(recharging_mech) - recharging_mech_ref = WEAKREF(recharging_mech) - recharge_console.update_appearance() - if(!recharging_mech?.cell) - return - if(recharging_mech.cell.charge < recharging_mech.cell.maxcharge) - var/delta = min(recharge_power * delta_time, recharging_mech.cell.maxcharge - recharging_mech.cell.charge) - recharging_mech.give_power(delta) - use_power(delta + active_power_usage) - else - recharge_console.update_appearance() - if(recharging_mech.loc != recharging_turf) - recharging_mech_ref = null - recharge_console.update_appearance() - - -/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I)) - return - - if(default_change_direction_wrench(user, I)) - recharging_turf = get_step(loc, dir) - return - - if(default_deconstruction_crowbar(I)) - return - return ..() - -/obj/machinery/computer/mech_bay_power_console - name = "mech bay power control console" - desc = "Displays the status of mechs connected to the recharge station." - icon_screen = "recharge_comp" - icon_keyboard = "rd_key" - circuit = /obj/item/circuitboard/computer/mech_bay_power_console - light_color = LIGHT_COLOR_PINK - ///Ref to charge port fwe are viewing data for, cyclical reference - var/obj/machinery/mech_bay_recharge_port/recharge_port - -/obj/machinery/computer/mech_bay_power_console/Initialize(mapload) - . = ..() - reconnect() - -/obj/machinery/computer/mech_bay_power_console/Destroy() - if (recharge_port?.recharge_console == src) - recharge_port.recharge_console = null - return ..() - -/obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "MechBayPowerConsole", name) - ui.open() - -/obj/machinery/computer/mech_bay_power_console/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("reconnect") - reconnect() - . = TRUE - update_appearance() - -/obj/machinery/computer/mech_bay_power_console/ui_data(mob/user) - var/list/data = list() - if(QDELETED(recharge_port)) - return data - - data["recharge_port"] = list("mech" = null) - var/obj/vehicle/sealed/mecha/recharging_mech = recharge_port.recharging_mech_ref?.resolve() - - if(!recharging_mech) - return data - data["recharge_port"]["mech"] = list("health" = recharging_mech.get_integrity(), "maxhealth" = recharging_mech.max_integrity, "cell" = null, "name" = recharging_mech.name,) - - if(QDELETED(recharging_mech.cell)) - return data - data["recharge_port"]["mech"]["cell"] = list( - "charge" = recharging_mech.cell.charge, - "maxcharge" = recharging_mech.cell.maxcharge - ) - return data - -///Checks for nearby recharge ports to link to -/obj/machinery/computer/mech_bay_power_console/proc/reconnect() - if(recharge_port) - return - recharge_port = locate(/obj/machinery/mech_bay_recharge_port) in range(1) - if(!recharge_port) - for(var/direction in GLOB.cardinals) - var/turf/target = get_step(src, direction) - target = get_step(target, direction) - recharge_port = locate(/obj/machinery/mech_bay_recharge_port) in target - if(recharge_port) - break - if(!recharge_port) - return - if(!recharge_port.recharge_console) - recharge_port.recharge_console = src - else - recharge_port = null - -/obj/machinery/computer/mech_bay_power_console/update_overlays() - . = ..() - if(machine_stat & (NOPOWER|BROKEN)) - return - var/obj/vehicle/sealed/mecha/recharging_mech = recharge_port?.recharging_mech_ref?.resolve() - - if(!recharging_mech?.cell) - return - if(recharging_mech.cell.charge >= recharging_mech.cell.maxcharge) - return - . += "recharge_comp_on" diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm deleted file mode 100644 index 578ca76d25b..00000000000 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ /dev/null @@ -1,74 +0,0 @@ -/** - * ## Mech melee attack - * Called when a mech melees a target with fists - * Handles damaging the target & associated effects - * return value is number of damage dealt - * Arguments: - * * mecha_attacker: Mech attacking this target - * * user: mob that initiated the attack from inside the mech as a controller - */ -/atom/proc/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) - SHOULD_CALL_PARENT(TRUE) - log_combat(user, src, "attacked", mecha_attacker, "(COMBAT MODE: [uppertext(user.combat_mode)] (DAMTYPE: [uppertext(mecha_attacker.damtype)])") - return 0 - -/obj/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) - mecha_attacker.do_attack_animation(src) - switch(mecha_attacker.damtype) - if(BRUTE) - playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 50, TRUE) - else - return 0 - mecha_attacker.visible_message(span_danger("[mecha_attacker] hits [src]!"), span_danger("You hit [src]!"), null, COMBAT_MESSAGE_RANGE) - ..() - return take_damage(mecha_attacker.force * 3, mecha_attacker.damtype, BLUNT, FALSE, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. - -/obj/structure/window/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) - if(!can_be_reached()) - return 0 - return ..() - -/mob/living/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) - if(!user.combat_mode) - step_away(src, mecha_attacker) - log_combat(user, src, "pushed", mecha_attacker) - visible_message(span_warning("[mecha_attacker] pushes [src] out of the way."), \ - span_warning("[mecha_attacker] pushes you out of the way."), span_hear("You hear aggressive shuffling!"), 5, list(mecha_attacker)) - to_chat(mecha_attacker, span_danger("You push [src] out of the way.")) - return 0 - - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, span_warning("You don't want to harm other living beings!")) - return 0 - mecha_attacker.do_attack_animation(src) - if(mecha_attacker.damtype == BRUTE) - step_away(src, mecha_attacker, 15) - var/obj/item/bodypart/selected_zone = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD)) - if(selected_zone) - var/dmg = rand(mecha_attacker.force * 0.5, mecha_attacker.force) - switch(mecha_attacker.damtype) - if(BRUTE) - if(mecha_attacker.force > 35) // durand and other heavy mechas - Unconscious(20) - else if(mecha_attacker.force > 20 && !IsKnockdown()) // lightweight mechas like gygax - Knockdown(40) - selected_zone.receive_damage(dmg, 0, updating_health = TRUE) - playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) - if(FIRE) - selected_zone.receive_damage(0, dmg, updating_health = TRUE) - playsound(src, 'sound/items/welder.ogg', 50, TRUE) - if(TOX) - playsound(src, 'sound/effects/spray2.ogg', 50, TRUE) - if((reagents.get_reagent_amount(/datum/reagent/cryptobiolin) + mecha_attacker.force) < mecha_attacker.force*2) - reagents.add_reagent(/datum/reagent/cryptobiolin, mecha_attacker.force/2) - if((reagents.get_reagent_amount(/datum/reagent/toxin) + mecha_attacker.force) < mecha_attacker.force*2) - reagents.add_reagent(/datum/reagent/toxin, mecha_attacker.force/2.5) - else - return 0 - . = dmg - visible_message(span_danger("[mecha_attacker.name] hits [src]!"), \ - span_userdanger("[mecha_attacker.name] hits you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, list(mecha_attacker)) - to_chat(mecha_attacker, span_danger("You hit [src]!")) - ..() diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm deleted file mode 100644 index a740fd64e74..00000000000 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ /dev/null @@ -1,137 +0,0 @@ -/***************** MECHA ACTIONS *****************/ - -/obj/vehicle/sealed/mecha/generate_action_type() - . = ..() - if(istype(., /datum/action/vehicle/sealed/mecha)) - var/datum/action/vehicle/sealed/mecha/mecha = . - mecha.chassis = src - - -/datum/action/vehicle/sealed/mecha - button_icon = 'icons/mob/actions/actions_mecha.dmi' - var/obj/vehicle/sealed/mecha/chassis - -/datum/action/vehicle/sealed/mecha/Destroy() - chassis = null - return ..() - -/datum/action/vehicle/sealed/mecha/mech_eject - name = "Eject From Mech" - button_icon_state = "mech_eject" - -/datum/action/vehicle/sealed/mecha/mech_eject/Trigger(trigger_flags) - if(!owner) - return - if(!chassis || !(owner in chassis.occupants)) - return - chassis.container_resist_act(owner) - -/datum/action/vehicle/sealed/mecha/mech_toggle_internals - name = "Toggle Internal Airtank Usage" - button_icon_state = "mech_internals_off" - -/datum/action/vehicle/sealed/mecha/mech_toggle_internals/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - - chassis.use_internal_tank = !chassis.use_internal_tank - button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" - chassis.balloon_alert(owner, "taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"]") - chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - build_all_button_icons() - -/datum/action/vehicle/sealed/mecha/mech_toggle_lights - name = "Toggle Lights" - button_icon_state = "mech_lights_off" - -/datum/action/vehicle/sealed/mecha/mech_toggle_lights/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - - if(!(chassis.mecha_flags & HAS_LIGHTS)) - chassis.balloon_alert(owner, "the mech lights are broken!") - return - chassis.mecha_flags ^= LIGHTS_ON - if(chassis.mecha_flags & LIGHTS_ON) - button_icon_state = "mech_lights_on" - else - button_icon_state = "mech_lights_off" - chassis.set_light_on(chassis.mecha_flags & LIGHTS_ON) - chassis.balloon_alert(owner, "toggled lights [chassis.mecha_flags & LIGHTS_ON ? "on":"off"]") - playsound(chassis,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) - chassis.log_message("Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) - build_all_button_icons() - -/datum/action/vehicle/sealed/mecha/mech_view_stats - name = "View Stats" - button_icon_state = "mech_view_stats" - -/datum/action/vehicle/sealed/mecha/mech_view_stats/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - - chassis.ui_interact(owner) - - -/datum/action/vehicle/sealed/mecha/strafe - name = "Toggle Strafing. Disabled when Alt is held." - button_icon_state = "strafe" - -/datum/action/vehicle/sealed/mecha/strafe/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - - chassis.toggle_strafe() - -/obj/vehicle/sealed/mecha/AltClick(mob/living/user) - if(!(user in occupants) || !user.canUseTopic(src)) - return - if(!(user in return_controllers_with_flag(VEHICLE_CONTROL_DRIVE))) - to_chat(user, span_warning("You're in the wrong seat to control movement.")) - return - - toggle_strafe() - -/obj/vehicle/sealed/mecha/proc/toggle_strafe() - if(!(mecha_flags & CANSTRAFE)) - to_chat(occupants, "this mecha doesn't support strafing!") - return - - strafe = !strafe - - to_chat(occupants, "strafing mode [strafe?"on":"off"].") - log_message("Toggled strafing mode [strafe?"on":"off"].", LOG_MECHA) - - for(var/occupant in occupants) - var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/strafe) - action?.build_all_button_icons() - -///swap seats, for two person mecha -/datum/action/vehicle/sealed/mecha/swap_seat - name = "Switch Seats" - button_icon_state = "mech_seat_swap" - -/datum/action/vehicle/sealed/mecha/swap_seat/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - - if(chassis.occupants.len == chassis.max_occupants) - chassis.balloon_alert(owner, "other seat occupied!") - return - var/list/drivers = chassis.return_drivers() - chassis.balloon_alert(owner, "moving to other seat...") - chassis.is_currently_ejecting = TRUE - if(!do_after(owner, chassis, chassis.has_gravity() ? chassis.exit_delay : 0)) - chassis.balloon_alert(owner, "interrupted!") - chassis.is_currently_ejecting = FALSE - return - chassis.is_currently_ejecting = FALSE - if(owner in drivers) - chassis.balloon_alert(owner, "controlling gunner seat") - chassis.remove_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) - chassis.add_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) - else - chassis.balloon_alert(owner, "controlling pilot seat") - chassis.remove_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) - chassis.add_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) - chassis.update_icon_state() diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm deleted file mode 100644 index 939ebbacfca..00000000000 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ /dev/null @@ -1,1476 +0,0 @@ -//////////////////////////////// -///// Construction datums ////// -//////////////////////////////// -/datum/component/construction/mecha - var/base_icon - - // Component typepaths. - // most must be defined unless - // get_steps is overriden. - - // Circuit board typepaths. - // circuit_control and circuit_periph must be defined - // unless get_circuit_steps is overriden. - var/circuit_control - var/circuit_periph - var/circuit_weapon - - // Armor plating typepaths. both must be defined - // unless relevant step procs are overriden. amounts - // must be defined if using /obj/item/stack/sheet types - var/inner_plating - var/inner_plating_amount - - var/outer_plating - var/outer_plating_amount - -/datum/component/construction/mecha/spawn_result() - if(!result) - return - // Remove default mech power cell, as we replace it with a new one. - var/obj/vehicle/sealed/mecha/M = new result(drop_location()) - QDEL_NULL(M.cell) - QDEL_NULL(M.scanmod) - QDEL_NULL(M.capacitor) - - var/obj/item/mecha_parts/chassis/parent_chassis = parent - M.CheckParts(parent_chassis.contents) - - SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) - QDEL_NULL(parent) - -// Default proc to generate mech steps. -// Override if the mech needs an entirely custom process (See HONK mech) -// Otherwise override specific steps as needed (Ripley, Clarke, Phazon) -/datum/component/construction/mecha/proc/get_steps() - return get_frame_steps() + get_circuit_steps() + (circuit_weapon ? get_circuit_weapon_steps() : list()) + get_stockpart_steps() + get_inner_plating_steps() + get_outer_plating_steps() - -/datum/component/construction/mecha/update_parent(step_index) - steps = get_steps() - ..() - // By default, each step in mech construction has a single icon_state: - // "[base_icon][index - 1]" - // For example, Ripley's step 1 icon_state is "ripley0". - var/atom/parent_atom = parent - if(!steps[index]["icon_state"] && base_icon) - parent_atom.icon_state = "[base_icon][index - 1]" - -/datum/component/construction/unordered/mecha_chassis/custom_action(obj/item/I, mob/living/user, typepath) - . = user.transferItemToLoc(I, parent) - if(.) - var/atom/parent_atom = parent - user.visible_message(span_notice("[user] connects [I] to [parent]."), span_notice("You connect [I] to [parent].")) - parent_atom.add_overlay(I.icon_state+"+o") - qdel(I) - -/datum/component/construction/unordered/mecha_chassis/spawn_result() - var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construction.dmi' - parent_atom.set_density(TRUE) - parent_atom.cut_overlays() - ..() - -// Default proc for the first steps of mech construction. -/datum/component/construction/mecha/proc/get_frame_steps() - return list( - list( - "key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are disconnected." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ) - ) - -// Default proc for the circuit board steps of a mech. -// Second set of steps by default. -/datum/component/construction/mecha/proc/get_circuit_steps() - return list( - list( - "key" = circuit_control, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is adjusted." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Central control module is installed." - ), - list( - "key" = circuit_periph, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Central control module is secured." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Peripherals control module is installed." - ) - ) - -// Default proc for weapon circuitboard steps -// Used by combat mechs -/datum/component/construction/mecha/proc/get_circuit_weapon_steps() - return list( - list( - "key" = circuit_weapon, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Peripherals control module is secured." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Weapons control module is installed." - ) - ) - -// Default proc for stock part installation -// Third set of steps by default -/datum/component/construction/mecha/proc/get_stockpart_steps() - var/prevstep_text = circuit_weapon ? "Weapons control module is secured." : "Peripherals control module is secured." - return list( - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = prevstep_text - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed." - ) - ) - -// Default proc for inner armor plating -// Fourth set of steps by default -/datum/component/construction/mecha/proc/get_inner_plating_steps() - var/list/first_step - if(ispath(inner_plating, /obj/item/stack/sheet)) - first_step = list( - list( - "key" = inner_plating, - "amount" = inner_plating_amount, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ) - ) - else - first_step = list( - list( - "key" = inner_plating, - "action" = ITEM_DELETE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The power cell is secured." - ) - ) - - return first_step + list( - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "Inner plating is installed." - ), - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "Inner Plating is wrenched." - ) - ) - -// Default proc for outer armor plating -// Fifth set of steps by default -/datum/component/construction/mecha/proc/get_outer_plating_steps() - var/list/first_step - if(ispath(outer_plating, /obj/item/stack/sheet)) - first_step = list( - list( - "key" = outer_plating, - "amount" = outer_plating_amount, - "back_key" = TOOL_WELDER, - "desc" = "Inner plating is welded." - ) - ) - else - first_step = list( - list( - "key" = outer_plating, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Inner plating is welded." - ) - ) - - return first_step + list( - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ) - ) - - -/datum/component/construction/unordered/mecha_chassis/ripley - result = /datum/component/construction/mecha/ripley - steps = list( - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg - ) - -/datum/component/construction/mecha/ripley - result = /obj/vehicle/sealed/mecha/working/ripley - base_icon = "ripley" - - circuit_control = /obj/item/circuitboard/mecha/ripley/main - circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals - - inner_plating=/obj/item/stack/sheet/steel - inner_plating_amount = 5 - - outer_plating=/obj/item/stack/rods - outer_plating_amount = 10 - -/datum/component/construction/mecha/ripley/get_outer_plating_steps() - return list( - list( - "key" = /obj/item/stack/rods, - "amount" = 10, - "back_key" = TOOL_WELDER, - "desc" = "Outer Plating is welded." - ), - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WIRECUTTER, - "desc" = "Cockpit wire screen is installed." - ), - ) - -/datum/component/construction/mecha/ripley/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - switch(index) - if(1) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I]."), span_notice("You install [I].")) - else - user.visible_message(span_notice("[user] unsecures the capacitor from [parent]."), span_notice("You unsecure the capacitor from [parent].")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) - else - user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the external reinforced armor layer to [parent]."), span_notice("You install the external reinforced armor layer to [parent].")) - else - user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the external armor layer."), span_notice("You secure the external reinforced armor layer.")) - else - user.visible_message(span_notice("[user] pries external armor layer from [parent]."), span_notice("You pry external armor layer from [parent].")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the external armor layer to [parent]."), span_notice("You weld the external armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the external armor layer."), span_notice("You unfasten the external armor layer.")) - return TRUE - -/datum/component/construction/unordered/mecha_chassis/gygax - result = /datum/component/construction/mecha/gygax - steps = list( - /obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg, - /obj/item/mecha_parts/part/gygax_head - ) - -/datum/component/construction/mecha/gygax - result = /obj/vehicle/sealed/mecha/combat/gygax - base_icon = "gygax" - - circuit_control = /obj/item/circuitboard/mecha/gygax/main - circuit_periph = /obj/item/circuitboard/mecha/gygax/peripherals - circuit_weapon = /obj/item/circuitboard/mecha/gygax/targeting - - inner_plating = /obj/item/stack/sheet/steel - inner_plating_amount = 5 - - outer_plating=/obj/item/mecha_parts/part/gygax_armor - outer_plating_amount=1 - -/datum/component/construction/mecha/gygax/action(datum/source, atom/used_atom, mob/user) - return INVOKE_ASYNC(src, PROC_REF(check_step), used_atom,user) - -/datum/component/construction/mecha/gygax/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - switch(index) - if(1) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the weapon control module."), span_notice("You secure the weapon control module.")) - else - user.visible_message(span_notice("[user] removes the weapon control module from [parent]."), span_notice("You remove the weapon control module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the weapon control module."), span_notice("You unfasten the weapon control module.")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the capacitor."), span_notice("You unfasten the capacitor.")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) - else - user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) - if(21) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures Gygax Armor Plates."), span_notice("You secure Gygax Armor Plates.")) - else - user.visible_message(span_notice("[user] pries Gygax Armor Plates from [parent]."), span_notice("You pry Gygax Armor Plates from [parent].")) - if(22) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds Gygax Armor Plates to [parent]."), span_notice("You weld Gygax Armor Plates to [parent].")) - else - user.visible_message(span_notice("[user] unfastens Gygax Armor Plates."), span_notice("You unfasten Gygax Armor Plates.")) - return TRUE - -/datum/component/construction/unordered/mecha_chassis/clarke - result = /datum/component/construction/mecha/clarke - steps = list( - /obj/item/mecha_parts/part/clarke_torso, - /obj/item/mecha_parts/part/clarke_left_arm, - /obj/item/mecha_parts/part/clarke_right_arm, - /obj/item/mecha_parts/part/clarke_head - ) - -/datum/component/construction/mecha/clarke - result = /obj/vehicle/sealed/mecha/working/clarke - base_icon = "clarke" - - circuit_control = /obj/item/circuitboard/mecha/clarke/main - circuit_periph = /obj/item/circuitboard/mecha/clarke/peripherals - - inner_plating = /obj/item/stack/sheet/plasteel - inner_plating_amount = 5 - - outer_plating = /obj/item/stack/sheet/mineral/gold - outer_plating_amount = 5 - -/datum/component/construction/mecha/clarke/get_frame_steps() - return list( - list( - "key" = /obj/item/stack/conveyor, - "amount" = 4, - "desc" = "The treads are added." - ), - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "The hydraulic systems are disconnected." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WRENCH, - "desc" = "The hydraulic systems are connected." - ), - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The hydraulic systems are active." - ), - list( - "key" = TOOL_WIRECUTTER, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The wiring is added." - ) - ) - - - -/datum/component/construction/mecha/clarke/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message(span_notice("[user] adds the tread systems."), span_notice("You add the tread systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] removes the tread systems."), span_notice("You remove the tread systems.")) - - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the capacitor."), span_notice("You unfasten the capacitor.")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) - else - user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the external armor layer to [parent]."), span_notice("You install the external reinforced armor layer to [parent].")) - else - user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the external armor layer."), span_notice("You secure the external reinforced armor layer.")) - else - user.visible_message(span_notice("[user] pries the external armor layer from [parent]."), span_notice("You pry the external armor layer from [parent].")) - if(21) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the external armor layer to [parent]."), span_notice("You weld the external armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the external armor layer."), span_notice("You unfasten the external armor layer.")) - return TRUE - - -/datum/component/construction/unordered/mecha_chassis/honker - result = /datum/component/construction/mecha/honker - steps = list( - /obj/item/mecha_parts/part/honker_torso, - /obj/item/mecha_parts/part/honker_left_arm, - /obj/item/mecha_parts/part/honker_right_arm, - /obj/item/mecha_parts/part/honker_left_leg, - /obj/item/mecha_parts/part/honker_right_leg, - /obj/item/mecha_parts/part/honker_head - ) - -/datum/component/construction/mecha/honker - result = /obj/vehicle/sealed/mecha/combat/honker - steps = list( - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/circuitboard/mecha/honker/main, - "action" = ITEM_DELETE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/circuitboard/mecha/honker/peripherals, - "action" = ITEM_DELETE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/circuitboard/mecha/honker/targeting, - "action" = ITEM_DELETE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/clothing/mask/gas/clown_hat, - "action" = ITEM_DELETE - ), - list( - "key" = /obj/item/bikehorn - ), - list( - "key" = /obj/item/clothing/shoes/clown_shoes, - "action" = ITEM_DELETE - ), - list( - "key" = /obj/item/bikehorn - ), - ) - -/datum/component/construction/mecha/honker/get_steps() - return steps - -// HONK doesn't have any construction step icons, so we just set an icon once. -/datum/component/construction/mecha/honker/update_parent(step_index) - if(step_index == 1) - var/atom/parent_atom = parent - parent_atom.icon = 'icons/mecha/mech_construct.dmi' - parent_atom.icon_state = "honker_chassis" - ..() - -/datum/component/construction/mecha/honker/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - if(istype(I, /obj/item/bikehorn)) - playsound(parent, 'sound/items/bikehorn.ogg', 50, TRUE) - user.visible_message(span_danger("HONK!")) - - //TODO: better messages. - switch(index) - if(2) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - if(4) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - if(6) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - if(8) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - if(10) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - if(12) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - if(14) - user.visible_message(span_notice("[user] puts [I] on [parent]."), span_notice("You put [I] on [parent].")) - if(16) - user.visible_message(span_notice("[user] puts [I] on [parent]."), span_notice("You put [I] on [parent].")) - return TRUE - -/datum/component/construction/unordered/mecha_chassis/durand - result = /datum/component/construction/mecha/durand - steps = list( - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg, - /obj/item/mecha_parts/part/durand_head - ) - -/datum/component/construction/mecha/durand - result = /obj/vehicle/sealed/mecha/combat/durand - base_icon = "durand" - - circuit_control = /obj/item/circuitboard/mecha/durand/main - circuit_periph = /obj/item/circuitboard/mecha/durand/peripherals - circuit_weapon = /obj/item/circuitboard/mecha/durand/targeting - - inner_plating = /obj/item/stack/sheet/steel - inner_plating_amount = 5 - - outer_plating = /obj/item/mecha_parts/part/durand_armor - outer_plating_amount = 1 - -/datum/component/construction/mecha/durand/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the weapon control module."), span_notice("You secure the weapon control module.")) - else - user.visible_message(span_notice("[user] removes the weapon control module from [parent]."), span_notice("You remove the weapon control module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the weapon control module."), span_notice("You unfasten the weapon control module.")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the capacitor."), span_notice("You unfasten the capacitor.")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) - else - user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) - if(21) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures Durand Armor Plates."), span_notice("You secure Durand Armor Plates.")) - else - user.visible_message(span_notice("[user] pries Durand Armor Plates from [parent]."), span_notice("You pry Durand Armor Plates from [parent].")) - if(22) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds Durand Armor Plates to [parent]."), span_notice("You weld Durand Armor Plates to [parent].")) - else - user.visible_message(span_notice("[user] unfastens Durand Armor Plates."), span_notice("You unfasten Durand Armor Plates.")) - return TRUE - -//PHAZON - -/datum/component/construction/unordered/mecha_chassis/phazon - result = /datum/component/construction/mecha/phazon - steps = list( - /obj/item/mecha_parts/part/phazon_torso, - /obj/item/mecha_parts/part/phazon_left_arm, - /obj/item/mecha_parts/part/phazon_right_arm, - /obj/item/mecha_parts/part/phazon_left_leg, - /obj/item/mecha_parts/part/phazon_right_leg, - /obj/item/mecha_parts/part/phazon_head - ) - -/datum/component/construction/mecha/phazon - result = /obj/vehicle/sealed/mecha/combat/phazon - base_icon = "phazon" - - circuit_control = /obj/item/circuitboard/mecha/phazon/main - circuit_periph = /obj/item/circuitboard/mecha/phazon/peripherals - circuit_weapon = /obj/item/circuitboard/mecha/phazon/targeting - - inner_plating = /obj/item/stack/sheet/plasteel - inner_plating_amount = 5 - - outer_plating = /obj/item/mecha_parts/part/phazon_armor - outer_plating_amount = 1 - -/datum/component/construction/mecha/phazon/get_stockpart_steps() - return list( - list( - "key" = /obj/item/stock_parts/scanning_module, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Weapon control module is secured." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Scanner module is installed." - ), - list( - "key" = /obj/item/stock_parts/capacitor, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Scanner module is secured." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "Capacitor is installed." - ), - list( - "key" = /obj/item/stack/ore/bluespace_crystal, - "amount" = 1, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured." - ), - list( - "key" = /obj/item/stack/cable_coil, - "amount" = 5, - "back_key" = TOOL_CROWBAR, - "desc" = "The bluespace crystal is installed." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_WIRECUTTER, - "desc" = "The bluespace crystal is connected." - ), - list( - "key" = /obj/item/stock_parts/cell, - "action" = ITEM_MOVE_INSIDE, - "back_key" = TOOL_SCREWDRIVER, - "desc" = "The bluespace crystal is engaged." - ), - list( - "key" = TOOL_SCREWDRIVER, - "back_key" = TOOL_CROWBAR, - "desc" = "The power cell is installed.", - "icon_state" = "phazon17" - // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. - ) - ) - -/datum/component/construction/mecha/phazon/get_outer_plating_steps() - return list( - list( - "key" = outer_plating, - "amount" = 1, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), - list( - "key" = /obj/item/assembly/signaler/anomaly/bluespace, - "action" = ITEM_DELETE, - "back_key" = TOOL_WELDER, - "desc" = "Bluespace anomaly core socket is open.", - "icon_state" = "phazon24" - ) - ) - -/datum/component/construction/mecha/phazon/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the weapon control module."), span_notice("You secure the weapon control module.")) - else - user.visible_message(span_notice("[user] removes the weapon control module from [parent]."), span_notice("You remove the weapon control module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the weapon control module."), span_notice("You unfasten the weapon control module.")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I]."), span_notice("You install [I].")) - else - user.visible_message(span_notice("[user] unsecures the capacitor from [parent]."), span_notice("You unsecure the capacitor from [parent].")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] connects the bluespace crystal."), span_notice("You connect the bluespace crystal.")) - else - user.visible_message(span_notice("[user] removes the bluespace crystal from [parent]."), span_notice("You remove the bluespace crystal from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] engages the bluespace crystal."), span_notice("You engage the bluespace crystal.")) - else - user.visible_message(span_notice("[user] disconnects the bluespace crystal from [parent]."), span_notice("You disconnect the bluespace crystal from [parent].")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disengages the bluespace crystal."), span_notice("You disengage the bluespace crystal.")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the phase armor layer to [parent]."), span_notice("You install the phase armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(21) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the phase armor layer."), span_notice("You secure the phase armor layer.")) - else - user.visible_message(span_notice("[user] pries the phase armor layer from [parent]."), span_notice("You pry the phase armor layer from [parent].")) - if(22) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the phase armor layer to [parent]."), span_notice("You weld the phase armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the phase armor layer."), span_notice("You unfasten the phase armor layer.")) - if(23) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] cuts phase armor layer from [parent]."), span_notice("You cut the phase armor layer from [parent].")) - if(24) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures Phazon Armor Plates."), span_notice("You secure Phazon Armor Plates.")) - else - user.visible_message(span_notice("[user] pries Phazon Armor Plates from [parent]."), span_notice("You pry Phazon Armor Plates from [parent].")) - if(25) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds Phazon Armor Plates to [parent]."), span_notice("You weld Phazon Armor Plates to [parent].")) - else - user.visible_message(span_notice("[user] unfastens Phazon Armor Plates."), span_notice("You unfasten Phazon Armor Plates.")) - if(26) - if(diff==FORWARD) - user.visible_message(span_notice("[user] carefully inserts the bluespace anomaly core into [parent] and secures it."), - span_notice("You slowly place the bluespace anomaly core into its socket and close its chamber.")) - return TRUE - -//savannah_ivanov - -/datum/component/construction/unordered/mecha_chassis/savannah_ivanov - result = /datum/component/construction/mecha/savannah_ivanov - steps = list( - /obj/item/mecha_parts/part/savannah_ivanov_torso, - /obj/item/mecha_parts/part/savannah_ivanov_head, - /obj/item/mecha_parts/part/savannah_ivanov_left_arm, - /obj/item/mecha_parts/part/savannah_ivanov_right_arm, - /obj/item/mecha_parts/part/savannah_ivanov_left_leg, - /obj/item/mecha_parts/part/savannah_ivanov_right_leg - ) - -/datum/component/construction/mecha/savannah_ivanov - result = /obj/vehicle/sealed/mecha/combat/savannah_ivanov - base_icon = "savannah_ivanov" - - circuit_control = /obj/item/circuitboard/mecha/savannah_ivanov/main - circuit_periph = /obj/item/circuitboard/mecha/savannah_ivanov/peripherals - circuit_weapon = /obj/item/circuitboard/mecha/savannah_ivanov/targeting - - inner_plating = /obj/item/stack/sheet/plasteel - inner_plating_amount = 10 - - outer_plating = /obj/item/mecha_parts/part/savannah_ivanov_armor - outer_plating_amount = 1 - -/datum/component/construction/mecha/savannah_ivanov/custom_action(obj/item/I, mob/living/user, diff) - . = ..() - if(!.) - return FALSE - - switch(index) - if(1) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the Savannah peripherals control module."), span_notice("You secure the Savannah peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the Savannah peripherals control module from [parent]."), span_notice("You remove the Savannah peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the Savannah peripherals control module."), span_notice("You unfasten the Savannah peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the Ivanov weapon control module."), span_notice("You secure the Ivanov weapon control module.")) - else - user.visible_message(span_notice("[user] removes the Ivanov weapon control module from [parent]."), span_notice("You remove the Ivanov weapon control module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the Ivanov weapon control module."), span_notice("You unfasten the Ivanov weapon control module.")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the capacitor."), span_notice("You unfasten the capacitor.")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) - else - user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) - if(21) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures Savannah-Ivanov Armor Plates."), span_notice("You secure Savannah-Ivanov Armor Plates.")) - else - user.visible_message(span_notice("[user] pries Savannah-Ivanov Armor Plates from [parent]."), span_notice("You pry Savannah-Ivanov Armor Plates from [parent].")) - if(22) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds Savannah-Ivanov Armor Plates to [parent]."), span_notice("You weld Savannah-Ivanov Armor Plates to [parent].")) - else - user.visible_message(span_notice("[user] unfastens Savannah-Ivanov Armor Plates."), span_notice("You unfasten Savannah-Ivanov Armor Plates.")) - return TRUE - -//ODYSSEUS - -/datum/component/construction/unordered/mecha_chassis/odysseus - result = /datum/component/construction/mecha/odysseus - steps = list( - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg - ) - -/datum/component/construction/mecha/odysseus - result = /obj/vehicle/sealed/mecha/medical/odysseus - base_icon = "odysseus" - - circuit_control = /obj/item/circuitboard/mecha/odysseus/main - circuit_periph = /obj/item/circuitboard/mecha/odysseus/peripherals - - inner_plating = /obj/item/stack/sheet/steel - inner_plating_amount = 5 - - outer_plating = /obj/item/stack/sheet/plasteel - outer_plating_amount = 5 - -/datum/component/construction/mecha/odysseus/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message(span_notice("[user] connects [parent] hydraulic systems."), span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message(span_notice("[user] activates [parent] hydraulic systems."), span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message(span_notice("[user] disconnects [parent] hydraulic systems."), span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adds the wiring to [parent]."), span_notice("You add the wiring to [parent].")) - else - user.visible_message(span_notice("[user] deactivates [parent] hydraulic systems."), span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message(span_notice("[user] adjusts the wiring of [parent]."), span_notice("You adjust the wiring of [parent].")) - else - user.visible_message(span_notice("[user] removes the wiring from [parent]."), span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] disconnects the wiring of [parent]."), span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the mainboard."), span_notice("You secure the mainboard.")) - else - user.visible_message(span_notice("[user] removes the central control module from [parent]."), span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the mainboard."), span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the peripherals control module."), span_notice("You secure the peripherals control module.")) - else - user.visible_message(span_notice("[user] removes the peripherals control module from [parent]."), span_notice("You remove the peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the peripherals control module."), span_notice("You unfasten the peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the scanner module."), span_notice("You secure the scanner module.")) - else - user.visible_message(span_notice("[user] removes the scanner module from [parent]."), span_notice("You remove the scanner module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] to [parent]."), span_notice("You install [I] to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the scanner module."), span_notice("You unfasten the scanner module.")) - if(12) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the capacitor."), span_notice("You secure the capacitor.")) - else - user.visible_message(span_notice("[user] removes the capacitor from [parent]."), span_notice("You remove the capacitor from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs [I] into [parent]."), span_notice("You install [I] into [parent].")) - else - user.visible_message(span_notice("[user] unfastens the capacitor."), span_notice("You unfasten the capacitor.")) - if(14) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the power cell."), span_notice("You secure the power cell.")) - else - user.visible_message(span_notice("[user] pries the power cell from [parent]."), span_notice("You pry the power cell from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the internal armor layer to [parent]."), span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the power cell."), span_notice("You unfasten the power cell.")) - if(16) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the internal armor layer."), span_notice("You secure the internal armor layer.")) - else - user.visible_message(span_notice("[user] pries internal armor layer from [parent]."), span_notice("You pry internal armor layer from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the internal armor layer to [parent]."), span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the internal armor layer."), span_notice("You unfasten the internal armor layer.")) - if(18) - if(diff==FORWARD) - user.visible_message(span_notice("[user] installs the external armor layer to [parent]."), span_notice("You install the external reinforced armor layer to [parent].")) - else - user.visible_message(span_notice("[user] cuts the internal armor layer from [parent]."), span_notice("You cut the internal armor layer from [parent].")) - if(19) - if(diff==FORWARD) - user.visible_message(span_notice("[user] secures the external armor layer."), span_notice("You secure the external reinforced armor layer.")) - else - user.visible_message(span_notice("[user] pries the external armor layer from [parent]."), span_notice("You pry the external armor layer from [parent].")) - if(20) - if(diff==FORWARD) - user.visible_message(span_notice("[user] welds the external armor layer to [parent]."), span_notice("You weld the external armor layer to [parent].")) - else - user.visible_message(span_notice("[user] unfastens the external armor layer."), span_notice("You unfasten the external armor layer.")) - return TRUE diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm deleted file mode 100644 index 92cb8ed29c4..00000000000 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ /dev/null @@ -1,160 +0,0 @@ -/obj/machinery/computer/mecha - name = "exosuit control console" - desc = "Used to remotely locate or lockdown exosuits." - icon_screen = "mecha" - icon_keyboard = "tech_key" - req_access = list(ACCESS_ROBOTICS) - circuit = /obj/item/circuitboard/computer/mecha_control - -/obj/machinery/computer/mecha/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ExosuitControlConsole", name) - ui.open() - -/obj/machinery/computer/mecha/ui_data(mob/user) - var/list/data = list() - - var/list/trackerlist = list() - for(var/obj/vehicle/sealed/mecha/MC as anything in INSTANCES_OF(/obj/vehicle/sealed/mecha)) - trackerlist += MC.trackers - - data["mechs"] = list() - for(var/obj/item/mecha_parts/mecha_tracking/MT in trackerlist) - if(!MT.chassis) - continue - var/obj/vehicle/sealed/mecha/M = MT.chassis - var/list/mech_data = list( - name = M.name, - integrity = round((M.get_integrity() / M.max_integrity) * 100), - charge = M.cell ? round(M.cell.percent()) : null, - airtank = M.internal_tank ? M.returnPressure() : null, - pilot = M.return_drivers(), - location = get_area_name(M, TRUE), - emp_recharging = MT.recharging, - tracker_ref = REF(MT) - ) - if(istype(M, /obj/vehicle/sealed/mecha/working/ripley)) - var/obj/vehicle/sealed/mecha/working/ripley/RM = M - mech_data += list( - cargo_space = round((LAZYLEN(RM.cargo) / RM.cargo_capacity) * 100) - ) - - data["mechs"] += list(mech_data) - - return data - -/obj/machinery/computer/mecha/ui_act(action, params) - . = ..() - if(.) - return - - switch(action) - if("send_message") - var/obj/item/mecha_parts/mecha_tracking/MT = locate(params["tracker_ref"]) - if(!istype(MT)) - return - var/message = tgui_input_text(usr, "Input message", "Transmit message") - var/obj/vehicle/sealed/mecha/M = MT.chassis - if(trim(message) && M) - to_chat(M.occupants, message) - to_chat(usr, span_notice("Message sent.")) - . = TRUE - if("shock") - var/obj/item/mecha_parts/mecha_tracking/MT = locate(params["tracker_ref"]) - if(!istype(MT)) - return - var/obj/vehicle/sealed/mecha/M = MT.chassis - if(M) - MT.shock() - log_game("[key_name(usr)] has activated remote EMP on exosuit [M], located at [loc_name(M)], which is currently [LAZYLEN(M.occupants) ? "occupied by [M.occupants.Join(",")][ADMIN_FLW(M)]." : "without a pilot."]") - message_admins("[key_name_admin(usr)][ADMIN_FLW(usr)] has activated remote EMP on exosuit [M][ADMIN_JMP(M)], which is currently [LAZYLEN(M.occupants) ? "occupied by [M.occupants.Join(",")][ADMIN_FLW(M)]." : "without a pilot."]") - . = TRUE - -/obj/item/mecha_parts/mecha_tracking - name = "exosuit tracking beacon" - desc = "Device used to transmit exosuit data." - icon = 'icons/obj/device.dmi' - icon_state = "motion2" - w_class = WEIGHT_CLASS_SMALL - /// If this beacon allows for AI control. Exists to avoid using istype() on checking - var/ai_beacon = FALSE - /// Cooldown variable for EMP pulsing - var/recharging = FALSE - /// The Mecha that this tracking beacon is attached to - var/obj/vehicle/sealed/mecha/chassis - -/** - * Returns a html formatted string describing attached mech status - */ -/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() - if(!chassis) - return FALSE - - var/cell_charge = chassis.get_charge() - var/answer = {"Name: [chassis.name]
    - Integrity: [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%
    - Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
    - Airtank: [chassis.internal_tank ? "[round(chassis.returnPressure(), 0.01)]" : "Not Equipped"] kPa
    - Pilot: [chassis.return_drivers() || "None"]
    - Location: [get_area_name(chassis, TRUE) || "Unknown"]"} - if(istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) - var/obj/vehicle/sealed/mecha/working/ripley/RM = chassis - answer += "
    Used Cargo Space: [round((LAZYLEN(RM.cargo) / RM.cargo_capacity * 100), 0.01)]%" - - return answer - -/obj/item/mecha_parts/mecha_tracking/emp_act() - . = ..() - if(!(. & EMP_PROTECT_SELF)) - qdel(src) - -/obj/item/mecha_parts/mecha_tracking/Destroy() - if(chassis) - if(src in chassis.trackers) - chassis.trackers -= src - chassis = null - return ..() - -/obj/item/mecha_parts/mecha_tracking/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(!..()) - return - M.trackers += src - M.diag_hud_set_mechtracking() - chassis = M - -/** - * Attempts to EMP mech that the tracker is attached to, if there is one and tracker is not on cooldown - */ -/obj/item/mecha_parts/mecha_tracking/proc/shock() - if(recharging) - return - if(chassis) - chassis.emp_act(EMP_HEAVY) - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/mecha_parts/mecha_tracking, recharge)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - recharging = TRUE - -/** - * Resets recharge variable, allowing tracker to be EMP pulsed again - */ -/obj/item/mecha_parts/mecha_tracking/proc/recharge() - recharging = FALSE - -/obj/item/mecha_parts/mecha_tracking/ai_control - name = "exosuit AI control beacon" - desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit." - ai_beacon = TRUE - -/obj/item/storage/box/mechabeacons - name = "exosuit tracking beacons" - -/obj/item/storage/box/mechabeacons/PopulateContents() - ..() - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm deleted file mode 100644 index d996c1bfa6b..00000000000 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ /dev/null @@ -1,365 +0,0 @@ -/*! - * # Mecha defence explanation - * Mechs focus is on a more heavy-but-slower damage approach - * For this they have the following mechanics - * - * ## Backstab - * Basically the tldr is that mechs are less flexible so we encourage good positioning, pretty simple - * ## Armor modules - * Pretty simple, adds armor, you can choose against what - * ## Internal damage - * When taking damage will force you to take some time to repair, encourages improvising in a fight - * Targetting different def zones will damage them to encurage a more strategic approach to fights - * where they target the "dangerous" modules - */ - -/// returns a number for the damage multiplier for this relative angle/dir -/obj/vehicle/sealed/mecha/proc/get_armour_facing(relative_dir) - switch(relative_dir) - if(180) // BACKSTAB! - return facing_modifiers[MECHA_BACK_ARMOUR] - if(0, 45) // direct or 45 degrees off - return facing_modifiers[MECHA_FRONT_ARMOUR] - return facing_modifiers[MECHA_SIDE_ARMOUR] //if its not a front hit or back hit then assume its from the side - -///tries to deal internal damaget depending on the damage amount -/obj/vehicle/sealed/mecha/proc/try_deal_internal_damage(damage) - if(damage < internal_damage_threshold) - return - if(!prob(internal_damage_probability)) - return - var/internal_damage_to_deal = possible_int_damage - internal_damage_to_deal &= ~mecha_flags - if(internal_damage_to_deal) - set_internal_damage(pick(bitfield_to_list(internal_damage_to_deal))) - -/// tries to damage mech equipment depending on damage and where is being targetted -/obj/vehicle/sealed/mecha/proc/try_damage_component(damage, def_zone) - if(damage < component_damage_threshold) - return - var/obj/item/mecha_parts/mecha_equipment/gear - switch(def_zone) - if(BODY_ZONE_L_ARM) - gear = equip_by_category[MECHA_L_ARM] - if(BODY_ZONE_R_ARM) - gear = equip_by_category[MECHA_R_ARM] - if(!gear) - return - var/brokenstatus = gear.get_integrity() - // always leave at least 1 health - brokenstatus-- - var/damage_to_deal = min(brokenstatus, damage) - if(!damage_to_deal) - return - gear.take_damage(damage_to_deal) - -/obj/vehicle/sealed/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) - . = ..() - if(. && atom_integrity > 0) - spark_system.start() - try_deal_internal_damage(.) - if(. >= 5 || prob(33)) - to_chat(occupants, "[icon2html(src, occupants)][span_userdanger("Taking damage!")]") - log_message("Took [.] points of damage. Damage type: [damage_type]", LOG_MECHA) - -/obj/vehicle/sealed/mecha/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penentration) - . = ..() - if(attack_dir) - var/facing_modifier = get_armour_facing(abs(dir2angle(dir) - dir2angle(attack_dir))) - if(.) - . *= facing_modifier - -/obj/vehicle/sealed/mecha/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - user.changeNext_move(CLICK_CD_MELEE) // Ugh. Ideally we shouldn't be setting cooldowns outside of click code. - user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - playsound(loc, 'sound/weapons/tap.ogg', 40, TRUE, -1) - user.visible_message(span_danger("[user] hits [src]. Nothing happens."), null, null, COMBAT_MESSAGE_RANGE) - log_message("Attack by hand/paw (no damage). Attacker - [user].", LOG_MECHA, color="red") - -/obj/vehicle/sealed/mecha/attack_paw(mob/user, list/modifiers) - return attack_hand(user, modifiers) - -/obj/vehicle/sealed/mecha/attack_alien(mob/living/user, list/modifiers) - log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") - playsound(loc, 'sound/weapons/slash.ogg', 100, TRUE) - attack_generic(user, rand(user.melee_damage_lower, user.melee_damage_upper), BRUTE, BLUNT, 0) - -/obj/vehicle/sealed/mecha/attack_animal(mob/living/simple_animal/user, list/modifiers) - log_message("Attack by simple animal. Attacker - [user].", LOG_MECHA, color="red") - if(!user.melee_damage_upper && !user.obj_damage) - user.emote("custom", message = "[user.friendly_verb_continuous] [src].") - return 0 - else - var/play_soundeffect = 1 - if(user.environment_smash) - play_soundeffect = 0 - playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - var/animal_damage = rand(user.melee_damage_lower,user.melee_damage_upper) - if(user.obj_damage) - animal_damage = user.obj_damage - animal_damage = min(animal_damage, 20*user.environment_smash) - log_combat(user, src, "attacked") - attack_generic(user, animal_damage, user.melee_damage_type, BLUNT, play_soundeffect) - return 1 - - -/obj/vehicle/sealed/mecha/hulk_damage() - return 15 - -/obj/vehicle/sealed/mecha/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(.) - log_message("Attack by hulk. Attacker - [user].", LOG_MECHA, color="red") - log_combat(user, src, "punched", "hulk powers") - -/obj/vehicle/sealed/mecha/blob_act(obj/structure/blob/B) - log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red") - take_damage(30, BRUTE, BLUNT, 0, get_dir(src, B)) - -/obj/vehicle/sealed/mecha/attack_tk() - return - -/obj/vehicle/sealed/mecha/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //wrapper - log_message("Hit by [AM].", LOG_MECHA, color="red") - return ..() - -/obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) //wrapper - if(!enclosed && LAZYLEN(occupants) && !(mecha_flags & SILICON_PILOT) && (hitting_projectile.def_zone == BODY_ZONE_HEAD || hitting_projectile.def_zone == BODY_ZONE_CHEST)) //allows bullets to hit the pilot of open-canopy mechs - for(var/mob/living/hitmob as anything in occupants) - hitmob.bullet_act(hitting_projectile, def_zone, piercing_hit) //If the sides are open, the occupant can be hit - return BULLET_ACT_HIT - log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") - // yes we *have* to run the armor calc proc here I love tg projectile code too - try_damage_component(run_atom_armor(hitting_projectile.damage, hitting_projectile.damage_type, hitting_projectile.armor_flag, 0, REVERSE_DIR(hitting_projectile.dir), hitting_projectile.armor_penetration), hitting_projectile.def_zone) - return ..() - -/obj/vehicle/sealed/mecha/ex_act(severity, target) - log_message("Affected by explosion of severity: [severity].", LOG_MECHA, color="red") - return ..() - -/obj/vehicle/sealed/mecha/contents_explosion(severity, target) - severity-- - - switch(severity) - if(EXPLODE_DEVASTATE) - if(flat_equipment) - EX_ACT_LIST(flat_equipment, EXPLODE_DEVASTATE) - if(trackers) - EX_ACT_LIST(trackers, EXPLODE_DEVASTATE) - if(occupants) - EX_ACT_LIST(occupants, EXPLODE_DEVASTATE) - if(EXPLODE_HEAVY) - if(flat_equipment) - EX_ACT_LIST(flat_equipment, EXPLODE_HEAVY) - if(trackers) - EX_ACT_LIST(trackers, EXPLODE_HEAVY) - if(occupants) - EX_ACT_LIST(occupants, EXPLODE_HEAVY) - if(EXPLODE_LIGHT) - if(flat_equipment) - EX_ACT_LIST(flat_equipment, EXPLODE_LIGHT) - if(trackers) - EX_ACT_LIST(trackers, EXPLODE_LIGHT) - if(occupants) - EX_ACT_LIST(occupants, EXPLODE_LIGHT) - -/obj/vehicle/sealed/mecha/handle_atom_del(atom/A) - if(A in occupants) //todo does not work and in wrong file - LAZYREMOVE(occupants, A) - icon_state = initial(icon_state)+"-open" - setDir(dir_in) - -/obj/vehicle/sealed/mecha/emp_act(severity) - . = ..() - if (. & EMP_PROTECT_SELF) - return - if(get_charge()) - use_power((cell.charge/3)/(severity*2)) - take_damage(30 / severity, BURN, ENERGY, 1) - log_message("EMP detected", LOG_MECHA, color="red") - - if(istype(src, /obj/vehicle/sealed/mecha/combat)) //todo this stupid mouse icon should be a flag - mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse-disable.dmi' - for(var/occus in occupants) - var/mob/living/occupant = occus - occupant.update_mouse_pointer() - if(!equipment_disabled && LAZYLEN(occupants)) //prevent spamming this message with back-to-back EMPs - to_chat(occupants, span_warning("Error -- Connection to equipment control unit has been lost.")) - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/mecha, restore_equipment)), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) - equipment_disabled = TRUE - -/obj/vehicle/sealed/mecha/atmos_expose(datum/gas_mixture/air, exposed_temperature) - if(exposed_temperature > max_temperature) - log_message("Exposed to dangerous temperature.", LOG_MECHA, color="red") - take_damage(5, BURN, 0, 1) - -/obj/vehicle/sealed/mecha/attackby_secondary(obj/item/weapon, mob/user, params) - if(istype(weapon, /obj/item/mecha_parts)) - var/obj/item/mecha_parts/parts = weapon - parts.try_attach_part(user, src, TRUE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - return ..() - -/obj/vehicle/sealed/mecha/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/mmi)) - if(mmi_move_inside(W,user)) - to_chat(user, span_notice("[src]-[W] interface initialized successfully.")) - else - to_chat(user, span_warning("[src]-[W] interface initialization failed.")) - return - - if(istype(W, /obj/item/mecha_ammo)) - ammo_resupply(W, user) - return - - if(W.GetID()) - if((mecha_flags & ADDING_ACCESS_POSSIBLE) || (mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) - if(internals_access_allowed(user)) - ui_interact(user) - return - to_chat(user, span_warning("Invalid ID: Access denied.")) - return - to_chat(user, span_warning("Maintenance protocols disabled by operator.")) - return - - if(istype(W, /obj/item/stock_parts/cell)) - if(construction_state == MECHA_OPEN_HATCH) - if(!cell) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - var/obj/item/stock_parts/cell/C = W - to_chat(user, span_notice("You install the power cell.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - cell = C - log_message("Power cell installed", LOG_MECHA) - else - to_chat(user, span_warning("There's already a power cell installed!")) - return - - if(istype(W, /obj/item/stock_parts/scanning_module)) - if(construction_state == MECHA_OPEN_HATCH) - if(!scanmod) - if(!user.transferItemToLoc(W, src)) - return - to_chat(user, span_notice("You install the scanning module.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - scanmod = W - log_message("[W] installed", LOG_MECHA) - update_part_values() - else - to_chat(user, span_warning("There's already a scanning module installed!")) - return - - if(istype(W, /obj/item/stock_parts/capacitor)) - if(construction_state == MECHA_OPEN_HATCH) - if(!capacitor) - if(!user.transferItemToLoc(W, src)) - return - to_chat(user, span_notice("You install the capacitor.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - capacitor = W - log_message("[W] installed", LOG_MECHA) - update_part_values() - else - to_chat(user, span_warning("There's already a capacitor installed!")) - return - - if(istype(W, /obj/item/mecha_parts)) - var/obj/item/mecha_parts/P = W - P.try_attach_part(user, src, FALSE) - return - . = ..() - log_message("Attacked by [W]. Attacker - [user], Damage - [.]", LOG_MECHA) - if(isliving(user)) - var/mob/living/living_user = user - try_damage_component(., living_user.zone_selected) - -/obj/vehicle/sealed/mecha/wrench_act(mob/living/user, obj/item/I) - ..() - . = TRUE - if(construction_state == MECHA_SECURE_BOLTS) - construction_state = MECHA_LOOSE_BOLTS - to_chat(user, span_notice("You undo the securing bolts.")) - return - if(construction_state == MECHA_LOOSE_BOLTS) - construction_state = MECHA_SECURE_BOLTS - to_chat(user, span_notice("You tighten the securing bolts.")) - -/obj/vehicle/sealed/mecha/crowbar_act(mob/living/user, obj/item/I) - ..() - . = TRUE - if(construction_state == MECHA_LOOSE_BOLTS) - construction_state = MECHA_OPEN_HATCH - to_chat(user, span_notice("You open the hatch to the power unit.")) - return - if(construction_state == MECHA_OPEN_HATCH) - construction_state = MECHA_LOOSE_BOLTS - to_chat(user, span_notice("You close the hatch to the power unit.")) - -/obj/vehicle/sealed/mecha/welder_act(mob/living/user, obj/item/W) - . = ..() - if(user.combat_mode) - return - . = TRUE - if(atom_integrity < max_integrity) - if(!W.use_tool(src, user, 0, volume=50, amount=1)) - return - user.visible_message(span_notice("[user] repairs some damage to [name]."), span_notice("You repair some damage to [src].")) - atom_integrity += min(10, max_integrity-atom_integrity) - if(atom_integrity == max_integrity) - to_chat(user, span_notice("It looks to be fully repaired now.")) - return - to_chat(user, span_warning("[src] is at full integrity!")) - -/obj/vehicle/sealed/mecha/proc/full_repair(charge_cell) - atom_integrity = max_integrity - if(cell && charge_cell) - cell.charge = cell.maxcharge - if(internal_damage & MECHA_INT_FIRE) - clear_internal_damage(MECHA_INT_FIRE) - if(internal_damage & MECHA_INT_TEMP_CONTROL) - clear_internal_damage(MECHA_INT_TEMP_CONTROL) - if(internal_damage & MECHA_INT_SHORT_CIRCUIT) - clear_internal_damage(MECHA_INT_SHORT_CIRCUIT) - if(internal_damage & MECHA_INT_TANK_BREACH) - clear_internal_damage(MECHA_INT_TANK_BREACH) - if(internal_damage & MECHA_INT_CONTROL_LOST) - clear_internal_damage(MECHA_INT_CONTROL_LOST) - -/obj/vehicle/sealed/mecha/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!no_effect && !visual_effect_icon) - visual_effect_icon = ATTACK_EFFECT_SMASH - if(damtype == BURN) - visual_effect_icon = ATTACK_EFFECT_MECHFIRE - else if(damtype == TOX) - visual_effect_icon = ATTACK_EFFECT_MECHTOXIN - ..() - -/obj/vehicle/sealed/mecha/atom_destruction() - if(wreckage) - var/mob/living/silicon/ai/AI - for(var/crew in occupants) - if(isAI(crew)) - if(AI) - var/mob/living/silicon/ai/unlucky_ais = crew - unlucky_ais.gib() - continue - AI = crew - var/obj/structure/mecha_wreckage/WR = new wreckage(loc, AI) - for(var/obj/item/mecha_parts/mecha_equipment/E in flat_equipment) - if(E.detachable && prob(30)) - WR.crowbar_salvage += E - E.detach(WR) //detaches from src into WR - E.activated = TRUE - else - E.detach(loc) - qdel(E) - if(cell) - WR.crowbar_salvage += cell - cell.forceMove(WR) - cell.charge = rand(0, cell.charge) - cell = null - . = ..() diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm deleted file mode 100644 index 60a6837bb8e..00000000000 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ /dev/null @@ -1,433 +0,0 @@ -///////////////////////// -////// Mecha Parts ////// -///////////////////////// - -/obj/item/mecha_parts - name = "mecha part" - icon = 'icons/mecha/mech_construct.dmi' - icon_state = "blank" - w_class = WEIGHT_CLASS_GIGANTIC - flags_1 = CONDUCT_1 - -/obj/item/mecha_parts/proc/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) //For attaching parts to a finished mech - if(!user.transferItemToLoc(src, M)) - to_chat(user, span_warning("\The [src] is stuck to your hand, you cannot put it in \the [M]!")) - return FALSE - user.visible_message(span_notice("[user] attaches [src] to [M]."), span_notice("You attach [src] to [M].")) - return TRUE - -/obj/item/mecha_parts/part/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) - return - -/obj/item/mecha_parts/chassis - name = "Mecha Chassis" - icon_state = "backbone" - interaction_flags_item = NONE //Don't pick us up!! - var/construct_type - -/obj/item/mecha_parts/chassis/Initialize(mapload) - . = ..() - if(construct_type) - AddComponent(construct_type) - -/////////// Ripley - -/obj/item/mecha_parts/chassis/ripley - name = "\improper Ripley chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/ripley - -/obj/item/mecha_parts/part/ripley_torso - name = "\improper Ripley torso" - desc = "A torso part of Ripley APLU. Contains power unit, processing core and life support systems." - icon_state = "ripley_harness" - -/obj/item/mecha_parts/part/ripley_left_arm - name = "\improper Ripley left arm" - desc = "A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "ripley_l_arm" - -/obj/item/mecha_parts/part/ripley_right_arm - name = "\improper Ripley right arm" - desc = "A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "ripley_r_arm" - -/obj/item/mecha_parts/part/ripley_left_leg - name = "\improper Ripley left leg" - desc = "A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "ripley_l_leg" - -/obj/item/mecha_parts/part/ripley_right_leg - name = "\improper Ripley right leg" - desc = "A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." - icon_state = "ripley_r_leg" - -///////// Odysseus - -/obj/item/mecha_parts/chassis/odysseus - name = "\improper Odysseus chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/odysseus - -/obj/item/mecha_parts/part/odysseus_head - name = "\improper Odysseus head" - desc = "An Odysseus head. Contains an integrated medical HUD scanner." - icon_state = "odysseus_head" - -/obj/item/mecha_parts/part/odysseus_torso - name = "\improper Odysseus torso" - desc="A torso part of Odysseus. Contains power unit, processing core and life support systems along with an attachment port for a mounted sleeper." - icon_state = "odysseus_torso" - -/obj/item/mecha_parts/part/odysseus_left_arm - name = "\improper Odysseus left arm" - desc = "An Odysseus left arm. Data and power sockets are compatible with specialized medical equipment." - icon_state = "odysseus_l_arm" - -/obj/item/mecha_parts/part/odysseus_right_arm - name = "\improper Odysseus right arm" - desc = "An Odysseus right arm. Data and power sockets are compatible with specialized medical equipment." - icon_state = "odysseus_r_arm" - -/obj/item/mecha_parts/part/odysseus_left_leg - name = "\improper Odysseus left leg" - desc = "An Odysseus left leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients." - icon_state = "odysseus_l_leg" - -/obj/item/mecha_parts/part/odysseus_right_leg - name = "\improper Odysseus right leg" - desc = "An odysseus right leg. Contains complex servodrives and balance maintaining systems to maintain stability for critical patients." - icon_state = "odysseus_r_leg" - -///////// Gygax - -/obj/item/mecha_parts/chassis/gygax - name = "\improper Gygax chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/gygax - -/obj/item/mecha_parts/part/gygax_torso - name = "\improper Gygax torso" - desc = "A torso part of Gygax. Contains power unit, processing core and life support systems." - icon_state = "gygax_harness" - -/obj/item/mecha_parts/part/gygax_head - name = "\improper Gygax head" - desc = "A Gygax head. Houses advanced surveillance and targeting sensors." - icon_state = "gygax_head" - -/obj/item/mecha_parts/part/gygax_left_arm - name = "\improper Gygax left arm" - desc = "A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons." - icon_state = "gygax_l_arm" - -/obj/item/mecha_parts/part/gygax_right_arm - name = "\improper Gygax right arm" - desc = "A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons." - icon_state = "gygax_r_arm" - -/obj/item/mecha_parts/part/gygax_left_leg - name = "\improper Gygax left leg" - desc = "A Gygax left leg. Constructed with advanced servomechanisms and actuators to enable faster speed." - icon_state = "gygax_l_leg" - -/obj/item/mecha_parts/part/gygax_right_leg - name = "\improper Gygax right leg" - desc = "A Gygax right leg. Constructed with advanced servomechanisms and actuators to enable faster speed." - icon_state = "gygax_r_leg" - -/obj/item/mecha_parts/part/gygax_armor - gender = PLURAL - name = "\improper Gygax armor plates" - desc = "A set of armor plates designed for the Gygax. Designed to effectively deflect damage with a lightweight construction." - icon_state = "gygax_armor" - - -//////////// Durand - -/obj/item/mecha_parts/chassis/durand - name = "\improper Durand chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/durand - -/obj/item/mecha_parts/part/durand_torso - name = "\improper Durand torso" - desc = "A torso part of Durand. Contains power unit, processing core and life support systems within a robust protective frame." - icon_state = "durand_harness" - -/obj/item/mecha_parts/part/durand_head - name = "\improper Durand head" - desc = "A Durand head. Houses advanced surveillance and targeting sensors." - icon_state = "durand_head" - -/obj/item/mecha_parts/part/durand_left_arm - name = "\improper Durand left arm" - desc = "A Durand left arm. Data and power sockets are compatible with most exosuit tools and weapons. Packs a really mean punch as well." - icon_state = "durand_l_arm" - -/obj/item/mecha_parts/part/durand_right_arm - name = "\improper Durand right arm" - desc = "A Durand right arm. Data and power sockets are compatible with most exosuit tools and weapons. Packs a really mean punch as well." - icon_state = "durand_r_arm" - -/obj/item/mecha_parts/part/durand_left_leg - name = "\improper Durand left leg" - desc = "A Durand left leg. Built particularly sturdy to support the Durand's heavy weight and defensive needs." - icon_state = "durand_l_leg" - -/obj/item/mecha_parts/part/durand_right_leg - name = "\improper Durand right leg" - desc = "A Durand right leg. Built particularly sturdy to support the Durand's heavy weight and defensive needs." - icon_state = "durand_r_leg" - -/obj/item/mecha_parts/part/durand_armor - gender = PLURAL - name = "\improper Durand armor plates" - desc = "A set of armor plates for the Durand. Built heavy to resist an incredible amount of brute force." - icon_state = "durand_armor" - -////////// Clarke - -/obj/item/mecha_parts/chassis/clarke - name = "\improper Clarke chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/clarke - -/obj/item/mecha_parts/part/clarke_torso - name = "\improper Clarke torso" - desc = "A torso part of Clarke. Contains power unit, processing core and life support systems." - icon_state = "clarke_harness" - -/obj/item/mecha_parts/part/clarke_head - name = "\improper Clarke head" - desc = "A Clarke head. Contains an integrated diagnostic HUD scanner." - icon_state = "clarke_head" - -/obj/item/mecha_parts/part/clarke_left_arm - name = "\improper Clarke left arm" - desc = "A Clarke left arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "clarke_l_arm" - -/obj/item/mecha_parts/part/clarke_right_arm - name = "\improper Clarke right arm" - desc = "A Clarke right arm. Data and power sockets are compatible with most exosuit tools." - icon_state = "clarke_r_arm" - -////////// HONK - -/obj/item/mecha_parts/chassis/honker - name = "\improper H.O.N.K chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/honker - -/obj/item/mecha_parts/part/honker_torso - name = "\improper H.O.N.K torso" - desc = "A torso part of H.O.N.K. Contains chuckle unit, bananium core and honk support systems." - icon_state = "honker_harness" - -/obj/item/mecha_parts/part/honker_head - name = "\improper H.O.N.K head" - desc = "A H.O.N.K head. Appears to lack a face plate." - icon_state = "honker_head" - -/obj/item/mecha_parts/part/honker_left_arm - name = "\improper H.O.N.K left arm" - desc = "A H.O.N.K left arm. With unique sockets that accept odd weaponry designed by clown scientists." - icon_state = "honker_l_arm" - -/obj/item/mecha_parts/part/honker_right_arm - name = "\improper H.O.N.K right arm" - desc = "A H.O.N.K right arm. With unique sockets that accept odd weaponry designed by clown scientists." - icon_state = "honker_r_arm" - -/obj/item/mecha_parts/part/honker_left_leg - name = "\improper H.O.N.K left leg" - desc = "A H.O.N.K left leg. The foot appears just large enough to fully accommodate a clown shoe." - icon_state = "honker_l_leg" - -/obj/item/mecha_parts/part/honker_right_leg - name = "\improper H.O.N.K right leg" - desc = "A H.O.N.K right leg. The foot appears just large enough to fully accommodate a clown shoe." - icon_state = "honker_r_leg" - - -////////// Phazon - -/obj/item/mecha_parts/chassis/phazon - name = "\improper Phazon chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/phazon - -/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, params) - . = ..() - if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/bluespace)) - to_chat(user, "The anomaly core socket only accepts bluespace anomaly cores!") - -/obj/item/mecha_parts/part/phazon_torso - name="\improper Phazon torso" - desc="A Phazon torso part. The socket for the bluespace core that powers the exosuit's unique phase drives is located in the middle." - icon_state = "phazon_harness" - -/obj/item/mecha_parts/part/phazon_head - name="\improper Phazon head" - desc="A Phazon head. Its sensors are carefully calibrated to provide vision and data even when the exosuit is phasing." - icon_state = "phazon_head" - -/obj/item/mecha_parts/part/phazon_left_arm - name="\improper Phazon left arm" - desc="A Phazon left arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand." - icon_state = "phazon_l_arm" - -/obj/item/mecha_parts/part/phazon_right_arm - name="\improper Phazon right arm" - desc="A Phazon right arm. Several microtool arrays are located under the armor plating, which can be adjusted to the situation at hand." - icon_state = "phazon_r_arm" - -/obj/item/mecha_parts/part/phazon_left_leg - name="\improper Phazon left leg" - desc="A Phazon left leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged." - icon_state = "phazon_l_leg" - -/obj/item/mecha_parts/part/phazon_right_leg - name="\improper Phazon right leg" - desc="A Phazon right leg. It contains the unique phase drives that allow the exosuit to phase through solid matter when engaged." - icon_state = "phazon_r_leg" - -/obj/item/mecha_parts/part/phazon_armor - name="Phazon armor" - desc="Phazon armor plates. They are layered with plasma to protect the pilot from the stress of phasing and have unusual properties." - icon_state = "phazon_armor" - -// Savannah-Ivanov - -/obj/item/mecha_parts/chassis/savannah_ivanov - name = "\improper Savannah-Ivanov chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/savannah_ivanov - -/obj/item/mecha_parts/part/savannah_ivanov_torso - name="\improper Savannah-Ivanov torso" - desc="A Savannah-Ivanov torso part. It's missing a huge chunk of space..." - icon_state = "savannah_ivanov_harness" - -/obj/item/mecha_parts/part/savannah_ivanov_head - name="\improper Savannah-Ivanov head" - desc="A Savannah-Ivanov head. It's sensors have been adjusted to support graceful landings." - icon_state = "savannah_ivanov_head" - -/obj/item/mecha_parts/part/savannah_ivanov_left_arm - name="\improper Savannah-Ivanov left arm" - desc="A Savannah-Ivanov left arm. Hidden rocket fabrication included in the wrists." - icon_state = "savannah_ivanov_l_arm" - -/obj/item/mecha_parts/part/savannah_ivanov_right_arm - name="\improper Savannah-Ivanov right arm" - desc="A Savannah-Ivanov left arm. Hidden rocket fabrication included in the wrists." - icon_state = "savannah_ivanov_r_arm" - -/obj/item/mecha_parts/part/savannah_ivanov_left_leg - name="\improper Savannah-Ivanov left leg" - desc="A Savannah-Ivanov left leg. In production they were designed to carry more than two passengers, so the leaping functionality was added as to not waste potential." - icon_state = "savannah_ivanov_l_leg" - -/obj/item/mecha_parts/part/savannah_ivanov_right_leg - name="\improper Savannah-Ivanov right leg" - desc="A Savannah-Ivanov left leg. In production they were designed to carry more than two passengers, so the leaping functionality was added as to not waste potential." - icon_state = "savannah_ivanov_r_leg" - -/obj/item/mecha_parts/part/savannah_ivanov_armor - name="Savannah-Ivanov armor" - desc="Savannah-Ivanov armor plates. They are uniquely shaped and reinforced to deal with the stresses of two pilots, grandiose leaps, and missiles." - icon_state = "savannah_ivanov_armor" - -///////// Circuitboards - -/obj/item/circuitboard/mecha - name = "exosuit circuit board" - icon = 'icons/obj/module.dmi' - icon_state = "std_mod" - inhand_icon_state = "electronic" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - flags_1 = CONDUCT_1 - force = 5 - w_class = WEIGHT_CLASS_SMALL - - throwforce = 0 - throw_range = 7 - -/obj/item/circuitboard/mecha/ripley/peripherals - name = "Ripley Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/ripley/main - name = "Ripley Central Control module (Exosuit Board)" - icon_state = "mainboard" - - -/obj/item/circuitboard/mecha/gygax/peripherals - name = "Gygax Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/gygax/targeting - name = "Gygax Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/gygax/main - name = "Gygax Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/durand/peripherals - name = "Durand Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/durand/targeting - name = "Durand Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/durand/main - name = "Durand Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/honker/peripherals - name = "H.O.N.K Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/honker/targeting - name = "H.O.N.K Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/honker/main - name = "H.O.N.K Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/odysseus/peripherals - name = "Odysseus Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/odysseus/main - name = "Odysseus Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/phazon/peripherals - name = "Phazon Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/phazon/targeting - name = "Phazon Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/phazon/main - name = "Phazon Central Control module (Exosuit Board)" - -/obj/item/circuitboard/mecha/clarke/peripherals - name = "Clarke Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/clarke/main - name = "Clarke Central Control module (Exosuit Board)" - icon_state = "mainboard" - -/obj/item/circuitboard/mecha/savannah_ivanov/peripherals - name = "Savannah Peripherals Control module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/savannah_ivanov/targeting - name = "Ivanov Weapon Control and Targeting module (Exosuit Board)" - icon_state = "mcontroller" - -/obj/item/circuitboard/mecha/savannah_ivanov/main - name = "Savannah-Ivanov Combination Control Lock module (Exosuit Board)" - icon_state = "mainboard" diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm deleted file mode 100644 index 0182b5b8f69..00000000000 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ /dev/null @@ -1,321 +0,0 @@ -/// A preview of the mech for the UI -/atom/movable/screen/mech_view - name = "mechview" - del_on_map_removal = FALSE - layer = OBJ_LAYER - plane = GAME_PLANE - - /// The body that is displayed - var/obj/vehicle/sealed/mecha/owner - ///list of plane masters to apply to owners - var/list/plane_masters = list() - -/atom/movable/screen/mech_view/Initialize(mapload, obj/vehicle/sealed/mecha/newowner) - . = ..() - owner = newowner - assigned_map = "mech_view_[REF(owner)]" - set_position(1, 1) - for(var/plane_master_type in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness) - var/atom/movable/screen/plane_master/plane_master = new plane_master_type() - plane_master.screen_loc = "[assigned_map]:CENTER" - plane_masters += plane_master - -/atom/movable/screen/mech_view/Destroy() - QDEL_LIST(plane_masters) - owner = null - return ..() - -/obj/vehicle/sealed/mecha/ui_close(mob/user) - . = ..() - user.client?.screen -= ui_view.plane_masters - user.client?.clear_map(ui_view.assigned_map) - -/obj/vehicle/sealed/mecha/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Mecha", name, ui_x, ui_y) - ui.open() - user.client?.screen |= ui_view.plane_masters - user.client?.register_map_obj(ui_view) - -/obj/vehicle/sealed/mecha/ui_status(mob/user) - if(contains(user)) - return UI_INTERACTIVE - return min( - ui_status_user_is_abled(user, src), - ui_status_user_has_free_hands(user, src), - ui_status_user_is_advanced_tool_user(user), - ui_status_only_living(user), - max( - ui_status_user_is_adjacent(user, src), - ui_status_silicon_has_access(user, src), - ) - ) - -/obj/vehicle/sealed/mecha/ui_assets(mob/user) - return list(get_asset_datum(/datum/asset/spritesheet/mechaarmor)) - -/obj/vehicle/sealed/mecha/ui_static_data(mob/user) - var/list/data = list() - data["cabin_dangerous_highpressure"] = WARNING_HIGH_PRESSURE - data["mineral_material_amount"] = MINERAL_MATERIAL_AMOUNT - //map of relevant flags to check tgui side, not every flag needs to be here - data["mechflag_keys"] = list( - "ADDING_ACCESS_POSSIBLE" = ADDING_ACCESS_POSSIBLE, - "ADDING_MAINT_ACCESS_POSSIBLE" = ADDING_MAINT_ACCESS_POSSIBLE, - "LIGHTS_ON" = LIGHTS_ON, - "HAS_LIGHTS" = HAS_LIGHTS, - ) - data["internal_damage_keys"] = list( - "MECHA_INT_FIRE" = MECHA_INT_FIRE, - "MECHA_INT_TEMP_CONTROL" = MECHA_INT_TEMP_CONTROL, - "MECHA_INT_TANK_BREACH" = MECHA_INT_TANK_BREACH, - "MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST, - ) - data["mech_electronics"] = list( - "minfreq" = MIN_FREE_FREQ, - "maxfreq" = MAX_FREE_FREQ, - ) - return data - -/obj/vehicle/sealed/mecha/ui_data(mob/user) - var/list/data = list() - var/isoperator = (user in occupants) //maintenance mode outside of mech - data["isoperator"] = isoperator - if(!isoperator) - data["name"] = name - data["mecha_flags"] = mecha_flags - data["internal_tank_valve"] = internal_tank_valve - data["cell"] = cell?.name - data["scanning"] = scanmod?.name - data["capacitor"] = capacitor?.name - data["operation_req_access"] = list() - data["idcard_access"] = list() - for(var/code in operation_req_access) - data["operation_req_access"] += list(list("name" = SSid_access.get_access_desc(code), "number" = code)) - if(!isliving(user)) - return data - var/mob/living/living_user = user - var/obj/item/card/id/card = living_user.get_idcard(TRUE) - if(!card) - return data - for(var/idcode in card.access) - if(idcode in operation_req_access) - continue - var/accessname = SSid_access.get_access_desc(idcode) - if(!accessname) - continue //there's some strange access without a name - data["idcard_access"] += list(list("name" = accessname, "number" = idcode)) - return data - ui_view.appearance = appearance - var/datum/gas_mixture/int_tank_air = internal_tank?.return_air() - data["name"] = name - data["integrity"] = atom_integrity/max_integrity - data["power_level"] = cell?.charge - data["power_max"] = cell?.maxcharge - data["mecha_flags"] = mecha_flags - data["internal_damage"] = internal_damage - data["air_source"] = use_internal_tank ? "Internal Airtank" : "Environment" - data["airtank_pressure"] = int_tank_air ? round(int_tank_air.returnPressure(), 0.01) : null - data["airtank_temp"] = int_tank_air?.temperature - data["port_connected"] = internal_tank?.connected_port ? TRUE : FALSE - data["cabin_pressure"] = round(returnPressure(), 0.01) - data["cabin_temp"] = return_temperature() - data["dna_lock"] = dna_lock - data["mech_view"] = ui_view.assigned_map - if(radio) - data["mech_electronics"] = list( - "microphone" = radio.get_broadcasting(), - "speaker" = radio.get_listening(), - "frequency" = radio.get_frequency(), - ) - if(equip_by_category[MECHA_L_ARM]) - var/obj/item/mecha_parts/mecha_equipment/l_gun = equip_by_category[MECHA_L_ARM] - var/isballisticweapon = istype(l_gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) - data["left_arm_weapon"] = list( - "name" = l_gun.name, - "desc" = l_gun.desc, - "ref" = REF(l_gun), - "integrity" = (l_gun.get_integrity()/l_gun.max_integrity), - "isballisticweapon" = isballisticweapon, - "energy_per_use" = l_gun.energy_drain, - "snowflake" = l_gun.get_snowflake_data(), - ) - if(isballisticweapon) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/weapon = l_gun - data["left_arm_weapon"] += list( - "projectiles" = weapon.projectiles, - "max_magazine" = initial(weapon.projectiles), - "projectiles_cache" = weapon.projectiles_cache, - "projectiles_cache_max" = weapon.projectiles_cache_max, - "disabledreload" = weapon.disabledreload, - "ammo_type" = weapon.ammo_type, - ) - if(equip_by_category[MECHA_R_ARM]) - var/obj/item/mecha_parts/mecha_equipment/r_gun = equip_by_category[MECHA_R_ARM] - var/isballisticweapon = istype(r_gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) - data["right_arm_weapon"] = list( - "name" = r_gun.name, - "desc" = r_gun.desc, - "ref" = REF(r_gun), - "integrity" = (r_gun.get_integrity()/r_gun.max_integrity), - "isballisticweapon" = isballisticweapon, - "energy_per_use" = r_gun.energy_drain, - "snowflake" = r_gun.get_snowflake_data(), - ) - if(isballisticweapon) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/weapon = r_gun - data["right_arm_weapon"] += list( - "projectiles" = weapon.projectiles, - "max_magazine" = initial(weapon.projectiles), - "projectiles_cache" = weapon.projectiles_cache, - "projectiles_cache_max" = weapon.projectiles_cache_max, - "disabledreload" = weapon.disabledreload, - "ammo_type" = weapon.ammo_type, - ) - data["mech_equipment"] = list("utility" = list(), "power" = list(), "armor" = list()) - for(var/obj/item/mecha_parts/mecha_equipment/utility as anything in equip_by_category[MECHA_UTILITY]) - data["mech_equipment"]["utility"] += list(list( - "name" = utility.name, - "activated" = utility.activated, - "snowflake" = utility.get_snowflake_data(), - "ref" = REF(utility), - )) - for(var/obj/item/mecha_parts/mecha_equipment/power as anything in equip_by_category[MECHA_POWER]) - data["mech_equipment"]["power"] += list(list( - "name" = power.name, - "activated" = power.activated, - "snowflake" = power.get_snowflake_data(), - "ref" = REF(power), - )) - for(var/obj/item/mecha_parts/mecha_equipment/armor/armor as anything in equip_by_category[MECHA_ARMOR]) - data["mech_equipment"]["armor"] += list(list( - "protect_name" = armor.protect_name, - "iconstate_name" = armor.iconstate_name, - "ref" = REF(armor), - )) - return data - -/obj/vehicle/sealed/mecha/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - if(!(usr in occupants)) - switch(action) - if("stopmaint") - if(construction_state > MECHA_LOCKED) - to_chat(usr, span_warning("You must end Maintenance Procedures first!")) - return - mecha_flags &= ~ADDING_MAINT_ACCESS_POSSIBLE - ui.close() - return FALSE - if("togglemaint") - if(!(mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) - return FALSE - if(construction_state == MECHA_LOCKED) - construction_state = MECHA_SECURE_BOLTS - to_chat(usr, span_notice("The securing bolts are now exposed.")) - else if(construction_state == MECHA_SECURE_BOLTS) - construction_state = MECHA_LOCKED - to_chat(usr, span_notice("The securing bolts are now hidden.")) - if("drop_cell") - if(construction_state != MECHA_OPEN_HATCH) - return - cell.forceMove(get_turf(src)) - cell = null - if("drop_scanning") - if(construction_state == MECHA_OPEN_HATCH) - return - scanmod.forceMove(get_turf(src)) - scanmod = null - if("drop_capacitor") - if(construction_state == MECHA_OPEN_HATCH) - return - capacitor.forceMove(get_turf(src)) - capacitor = null - if("set_pressure") - var/new_pressure = tgui_input_number(usr, "Enter new pressure", "Cabin pressure change", internal_tank_valve) - if(isnull(new_pressure) || !construction_state) - return - internal_tank_valve = new_pressure - to_chat(usr, span_notice("The internal pressure valve has been set to [internal_tank_valve]kPa.")) - if("add_req_access") - if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) - return - if(!(params["added_access"] == "all")) - operation_req_access += params["added_access"] - else - var/mob/living/living_user = usr - var/obj/item/card/id/card = living_user.get_idcard(TRUE) - operation_req_access += card.access - if("del_req_access") - if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) - return - if(!(params["removed_access"] == "all")) - operation_req_access -= params["removed_access"] - else - operation_req_access = list() - if("lock_req_edit") - mecha_flags &= ~ADDING_ACCESS_POSSIBLE - return TRUE - //usr is in occupants - switch(action) - if("changename") - var/userinput = tgui_input_text(usr, "Choose a new exosuit name", "Rename exosuit", max_length = MAX_NAME_LEN) - if(!userinput) - return - if(is_ic_filtered(userinput) || is_soft_ic_filtered(userinput)) - tgui_alert(usr, "You cannot set a name that contains a word prohibited in IC chat!") - return - name = userinput - if("dna_lock") - var/mob/living/carbon/user = usr - if(!istype(user) || !user.dna) - to_chat(user, "[icon2html(src, occupants)][span_notice("You can't create a DNA lock with no DNA!.")]") - return - dna_lock = user.dna.unique_enzymes - to_chat(user, "[icon2html(src, occupants)][span_notice("You feel a prick as the needle takes your DNA sample.")]") - if("reset_dna") - dna_lock = null - if("view_dna") - tgui_alert(usr, "Enzymes detected: " + dna_lock) - return FALSE - if("toggle_airsource") - use_internal_tank = !use_internal_tank - balloon_alert(usr, "taking air from [use_internal_tank ? "internal airtank" : "environment"]") - log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - if("toggle_port") - if(internal_tank.connected_port) - if(internal_tank.disconnect()) - to_chat(occupants, "[icon2html(src, occupants)][span_notice("Disconnected from the air system port.")]") - log_message("Disconnected from gas port.", LOG_MECHA) - return TRUE - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to disconnect from the air system port!")]") - return - var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in loc - if(internal_tank.connect(possible_port)) - to_chat(occupants, "[icon2html(src, occupants)][span_notice("Connected to the air system port.")]") - log_message("Connected to gas port.", LOG_MECHA) - return TRUE - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to connect with air system port!")]") - if("toggle_maintenance") - if(construction_state) - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect")]") - return - mecha_flags ^= ADDING_MAINT_ACCESS_POSSIBLE - if("toggle_id_panel") - mecha_flags ^= ADDING_ACCESS_POSSIBLE - if("toggle_microphone") - radio.set_broadcasting(!radio.get_broadcasting()) - if("toggle_speaker") - radio.set_listening(!radio.get_listening()) - if("set_frequency") - radio.set_frequency(sanitize_frequency(params["new_frequency"], radio.freerange)) - if("repair_int_damage") - ui.close() //if doing this you're likely want to watch for bad people so close the UI - try_repair_int_damage(usr, params["flag"]) - return FALSE - if("equip_act") - var/obj/item/mecha_parts/mecha_equipment/gear = locate(params["ref"]) in flat_equipment - return gear?.ui_act(params["gear_action"], params, ui, state) - return TRUE diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm deleted file mode 100644 index e6cc11b9413..00000000000 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ /dev/null @@ -1,231 +0,0 @@ -/////////////////////////////////// -//////// Mecha wreckage //////// -/////////////////////////////////// - - -/obj/structure/mecha_wreckage - name = "exosuit wreckage" - desc = "Remains of some unfortunate mecha. Completely irreparable, but perhaps something can be salvaged." - icon = 'icons/mecha/mecha.dmi' - density = TRUE - anchored = FALSE - opacity = FALSE - var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel, /obj/item/stack/sheet/steel, /obj/item/stack/rods) - var/salvage_num = 5 - var/list/crowbar_salvage = list() - var/wires_removed = FALSE - var/mob/living/silicon/ai/AI //AIs to be salvaged - var/list/parts - -/obj/structure/mecha_wreckage/Initialize(mapload, mob/living/silicon/ai/AI_pilot) - . = ..() - if(parts) - for(var/i in 1 to 2) - if(!parts.len) - break - if(prob(60)) - continue - var/part = pick(parts) - welder_salvage += part - parts = null - if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy() - return - AI = AI_pilot - AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down - INVOKE_ASYNC(AI, TYPE_PROC_REF(/mob/living/silicon, death)) //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. - AI.forceMove(src) //Put the dead AI inside the wreckage for recovery - add_overlay(mutable_appearance('icons/obj/guns/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon - AI.controlled_equipment = null - AI.remote_control = null - -/obj/structure/mecha_wreckage/Destroy() - if(AI) - QDEL_NULL(AI) - QDEL_LIST(crowbar_salvage) - return ..() - -/obj/structure/mecha_wreckage/examine(mob/user) - . = ..() - if(!AI) - return - . += span_notice("The AI recovery beacon is active.") - -/obj/structure/mecha_wreckage/welder_act(mob/living/user, obj/item/I) - ..() - . = TRUE - if(salvage_num <= 0 || !length(welder_salvage)) - to_chat(user, span_notice("You don't see anything that can be cut with [I]!")) - return - if(!I.use_tool(src, user, 0, volume=50)) - return - if(prob(30)) - to_chat(user, span_notice("You fail to salvage anything valuable from [src]!")) - return - var/type = pick(welder_salvage) - var/N = new type(get_turf(user)) - user.visible_message(span_notice("[user] cuts [N] from [src]."), span_notice("You cut [N] from [src].")) - if(!istype(N, /obj/item/stack)) - welder_salvage -= type - salvage_num-- - -/obj/structure/mecha_wreckage/wirecutter_act(mob/living/user, obj/item/I) - ..() - . = TRUE - if(wires_removed) - to_chat(user, span_notice("You don't see anything that can be cut with [I]!")) - return - var/N = new /obj/item/stack/cable_coil(get_turf(user), rand(1,3)) - user.visible_message(span_notice("[user] cuts [N] from [src]."), span_notice("You cut [N] from [src].")) - wires_removed = TRUE - -/obj/structure/mecha_wreckage/crowbar_act(mob/living/user, obj/item/I) - ..() - . = TRUE - if(crowbar_salvage.len) - var/obj/S = pick(crowbar_salvage) - S.forceMove(user.drop_location()) - user.visible_message(span_notice("[user] pries [S] from [src]."), span_notice("You pry [S] from [src].")) - crowbar_salvage -= S - return - to_chat(user, span_notice("You don't see anything that can be cut with [I]!")) - -/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, mob/living/silicon/ai/ai_mob, obj/item/aicard/card) - if(!..()) - return - - //Proc called on the wreck by the AI card. - if(interaction != AI_TRANS_TO_CARD) //AIs can only be transferred in one direction, from the wreck to the card. - return - if(!AI) //No AI in the wreck - to_chat(user, span_warning("No AI backups found.")) - return - cut_overlays() //Remove the recovery beacon overlay - AI.forceMove(card) //Move the dead AI to the card. - card.AI = AI - if(AI.client) //AI player is still in the dead AI and is connected - to_chat(AI, span_notice("The remains of your file system have been recovered on a mobile storage device.")) - else //Give the AI a heads-up that it is probably going to get fixed. - AI.notify_ghost_revival("You have been recovered from the wreckage!", source = card) - to_chat(user, "[span_boldnotice("Backup files recovered")]: [AI.name] ([rand(1000,9999)].exe) salvaged from [name] and stored within local memory.") - AI = null - -/obj/structure/mecha_wreckage/gygax - name = "\improper Gygax wreckage" - icon_state = "gygax-broken" - parts = list( - /obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_head, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg - ) - -/obj/structure/mecha_wreckage/gygax/dark - name = "\improper Dark Gygax wreckage" - icon_state = "darkgygax-broken" - -/obj/structure/mecha_wreckage/marauder - name = "\improper Marauder wreckage" - icon_state = "marauder-broken" - -/obj/structure/mecha_wreckage/mauler - name = "\improper Mauler wreckage" - icon_state = "mauler-broken" - desc = "The syndicate won't be very happy about this..." - -/obj/structure/mecha_wreckage/seraph - name = "\improper Seraph wreckage" - icon_state = "seraph-broken" - -/obj/structure/mecha_wreckage/reticence - name = "\improper Reticence wreckage" - icon_state = "reticence-broken" - color = "#87878715" - desc = "..." - -/obj/structure/mecha_wreckage/ripley - name = "\improper Ripley wreckage" - icon_state = "ripley-broken" - parts = list( - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg) - -/obj/structure/mecha_wreckage/ripley/mk2 - name = "\improper Ripley MK-II wreckage" - icon_state = "ripleymkii-broken" - -/obj/structure/mecha_wreckage/clarke - name = "\improper Clarke wreckage" - icon_state = "clarke-broken" - parts = list( - /obj/item/mecha_parts/part/clarke_torso, - /obj/item/mecha_parts/part/clarke_head, - /obj/item/mecha_parts/part/clarke_left_arm, - /obj/item/mecha_parts/part/clarke_right_arm, - /obj/item/stack/conveyor) - -/obj/structure/mecha_wreckage/ripley/deathripley - name = "\improper Death-Ripley wreckage" - icon_state = "deathripley-broken" - parts = null - -/obj/structure/mecha_wreckage/honker - name = "\improper H.O.N.K wreckage" - icon_state = "honker-broken" - desc = "All is right in the universe." - parts = list( - /obj/item/mecha_parts/part/honker_torso, - /obj/item/mecha_parts/part/honker_head, - /obj/item/mecha_parts/part/honker_left_arm, - /obj/item/mecha_parts/part/honker_right_arm, - /obj/item/mecha_parts/part/honker_left_leg, - /obj/item/mecha_parts/part/honker_right_leg) - -/obj/structure/mecha_wreckage/durand - name = "\improper Durand wreckage" - icon_state = "durand-broken" - parts = list( - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_head, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg) - -/obj/structure/mecha_wreckage/phazon - name = "\improper Phazon wreckage" - icon_state = "phazon-broken" - parts = list( - /obj/item/mecha_parts/part/phazon_torso, - /obj/item/mecha_parts/part/phazon_head, - /obj/item/mecha_parts/part/phazon_left_arm, - /obj/item/mecha_parts/part/phazon_right_arm, - /obj/item/mecha_parts/part/phazon_left_leg, - /obj/item/mecha_parts/part/phazon_right_leg) - -/obj/structure/mecha_wreckage/savannah_ivanov - name = "\improper Savannah-Ivanov wreckage" - icon = 'icons/mecha/coop_mech.dmi' - icon_state = "savannah_ivanov-broken" - parts = list( - /obj/item/mecha_parts/part/savannah_ivanov_torso, - /obj/item/mecha_parts/part/savannah_ivanov_head, - /obj/item/mecha_parts/part/savannah_ivanov_left_arm, - /obj/item/mecha_parts/part/savannah_ivanov_right_arm, - /obj/item/mecha_parts/part/savannah_ivanov_left_leg, - /obj/item/mecha_parts/part/savannah_ivanov_right_leg) - -/obj/structure/mecha_wreckage/odysseus - name = "\improper Odysseus wreckage" - icon_state = "odysseus-broken" - parts = list( - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg) diff --git a/code/modules/vehicles/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm deleted file mode 100644 index 6bc7807fdc0..00000000000 --- a/code/modules/vehicles/mecha/medical/odysseus.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/vehicle/sealed/mecha/medical/odysseus - desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)." - name = "\improper Odysseus" - icon_state = "odysseus" - base_icon_state = "odysseus" - allow_diagonal_movement = TRUE - movedelay = 2 - max_temperature = 15000 - max_integrity = 120 - wreckage = /obj/structure/mecha_wreckage/odysseus - step_energy_drain = 6 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_MEDICAL) - -/obj/vehicle/sealed/mecha/medical/odysseus/moved_inside(mob/living/carbon/human/H) - . = ..() - if(. && !HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) - var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - hud.show_to(H) - ADD_TRAIT(H, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) - -/obj/vehicle/sealed/mecha/medical/odysseus/remove_occupant(mob/living/carbon/human/H) - if(isliving(H) && HAS_TRAIT_FROM(H, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)) - var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - hud.hide_from(H) - REMOVE_TRAIT(H, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) - return ..() - -/obj/vehicle/sealed/mecha/medical/odysseus/mmi_moved_inside(obj/item/mmi/M, mob/user) - . = ..() - if(. && !HAS_TRAIT(M, TRAIT_MEDICAL_HUD)) - var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - var/mob/living/brain/B = M.brainmob - hud.show_to(B) diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm deleted file mode 100644 index a13590bd2f0..00000000000 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ /dev/null @@ -1,112 +0,0 @@ -///Lavaproof, fireproof, fast mech with low armor and higher energy consumption, cannot strafe and has an internal ore box. -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/working/clarke) - default_armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 20, ENERGY = 10, BOMB = 60, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/working/clarke - desc = "Combining man and machine for a better, stronger engineer. Can even resist lava!" - name = "\improper Clarke" - icon_state = "clarke" - base_icon_state = "clarke" - max_temperature = 65000 - max_integrity = 200 - movedelay = 1.25 - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - lights_power = 7 - step_energy_drain = 15 //slightly higher energy drain since you movin those wheels FAST - equip_by_category = list( - MECHA_L_ARM = null, - MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/orebox_manager), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 1, - MECHA_ARMOR = 1, - ) - wreckage = /obj/structure/mecha_wreckage/clarke - enter_delay = 40 - mecha_flags = ADDING_ACCESS_POSSIBLE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS - internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) - -/obj/vehicle/sealed/mecha/working/clarke/Initialize(mapload) - . = ..() - box = new(src) - -/obj/vehicle/sealed/mecha/working/clarke/Destroy() - INVOKE_ASYNC(box, TYPE_PROC_REF(/obj/structure/ore_box, dump_box_contents)) - return ..() - -/obj/vehicle/sealed/mecha/working/clarke/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_search_ruins) - -//Ore Box Controls - -///Special equipment for the Clarke mech, handles moving ore without giving the mech a hydraulic clamp and cargo compartment. -/obj/item/mecha_parts/mecha_equipment/orebox_manager - name = "ore storage module" - desc = "An automated ore box management device." - icon = 'icons/obj/mining.dmi' - icon_state = "bin" - equipment_slot = MECHA_UTILITY - detachable = FALSE - /// Var to avoid istype checking every time the topic button is pressed. This will only work inside Clarke mechs. - var/obj/vehicle/sealed/mecha/working/clarke/hostmech - -/obj/item/mecha_parts/mecha_equipment/orebox_manager/attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - . = ..() - if(istype(M, /obj/vehicle/sealed/mecha/working/clarke)) - hostmech = M - -/obj/item/mecha_parts/mecha_equipment/orebox_manager/detach() - hostmech = null //just in case - return ..() - -/obj/item/mecha_parts/mecha_equipment/orebox_manager/ui_act(action, list/params) - . = ..() - if(action == "toggle") - hostmech.box?.dump_box_contents() - activated = TRUE - -#define SEARCH_COOLDOWN 1 MINUTES - -/datum/action/vehicle/sealed/mecha/mech_search_ruins - name = "Search for Ruins" - button_icon_state = "mech_search_ruins" - COOLDOWN_DECLARE(search_cooldown) - -/datum/action/vehicle/sealed/mecha/mech_search_ruins/Trigger(trigger_flags) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(!COOLDOWN_FINISHED(src, search_cooldown)) - chassis.balloon_alert(owner, "on cooldown!") - return - if(!isliving(owner)) - return - var/mob/living/living_owner = owner - button_icon_state = "mech_search_ruins_cooldown" - build_all_button_icons() - COOLDOWN_START(src, search_cooldown, SEARCH_COOLDOWN) - addtimer(VARSET_CALLBACK(src, button_icon_state, "mech_search_ruins"), SEARCH_COOLDOWN) - addtimer(CALLBACK(src, PROC_REF(build_all_button_icons)), SEARCH_COOLDOWN) - var/obj/pinpointed_ruin - for(var/obj/effect/landmark/ruin/ruin_landmark as anything in GLOB.ruin_landmarks) - if(ruin_landmark.z != chassis.z) - continue - if(!pinpointed_ruin || get_dist(ruin_landmark, chassis) < get_dist(pinpointed_ruin, chassis)) - pinpointed_ruin = ruin_landmark - if(!pinpointed_ruin) - chassis.balloon_alert(living_owner, "no ruins!") - return - -/datum/status_effect/agent_pinpointer/ruin/proc/cancel_self(datum/source, atom/old_loc) - SIGNAL_HANDLER - qdel(src) - -/atom/movable/screen/alert/status_effect/agent_pinpointer/ruin - name = "Ruin Target" - desc = "Searching for valuables..." - -#undef SEARCH_COOLDOWN diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm deleted file mode 100644 index 838ced38e0f..00000000000 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ /dev/null @@ -1,247 +0,0 @@ -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/working/ripley) - default_armor = list(BLUNT = 40, PUNCTURE = 20, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/working/ripley - desc = "Autonomous Power Loader Unit MK-I. Designed primarily around heavy lifting, the Ripley can be outfitted with utility equipment to fill a number of roles." - name = "\improper APLU MK-I \"Ripley\"" - icon_state = "ripley" - base_icon_state = "ripley" - silbutton_icon_state = "ripley-empty" - movedelay = 1.5 //Move speed, lower is faster. - max_temperature = 20000 - max_integrity = 200 - ui_x = 1200 - lights_power = 7 - max_equip_by_category = list( - MECHA_UTILITY = 2, - MECHA_POWER = 1, - MECHA_ARMOR = 1, - ) - wreckage = /obj/structure/mecha_wreckage/ripley - possible_int_damage = MECHA_INT_FIRE|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT - internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) - enclosed = FALSE //Normal ripley has an open cockpit design - enter_delay = 10 //can enter in a quarter of the time of other mechs - exit_delay = 10 - /// Custom Ripley step and turning sounds (from TGMC) - stepsound = 'sound/mecha/powerloader_step.ogg' - turnsound = 'sound/mecha/powerloader_turn2.ogg' - equip_by_category = list( - MECHA_L_ARM = null, - MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/ejector), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - /// Amount of Goliath hides attached to the mech - var/hides = 0 - /// List of all things in Ripley's Cargo Compartment - var/list/cargo - /// How much things Ripley can carry in their Cargo Compartment - var/cargo_capacity = 15 - /// How fast the mech is in low pressure - var/fast_pressure_step_in = 1.5 - /// How fast the mech is in normal pressure - var/slow_pressure_step_in = 2 - -/obj/vehicle/sealed/mecha/working/ripley/Move() - . = ..() - update_pressure() - -/obj/vehicle/sealed/mecha/working/ripley/generate_actions() //isnt allowed to have internal air - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) - -/obj/vehicle/sealed/mecha/working/ripley/Initialize(mapload) - . = ..() - AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide, list(BLUNT = 10, PUNCTURE = 5, LASER = 5)) - - -/obj/vehicle/sealed/mecha/working/ripley/Destroy() - for(var/atom/movable/A in cargo) - A.forceMove(drop_location()) - step_rand(A) - QDEL_LIST(cargo) - return ..() - -TYPEINFO_DEF(/obj/vehicle/sealed/mecha/working/ripley/mk2) - default_armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, FIRE = 100, ACID = 100) - -/obj/vehicle/sealed/mecha/working/ripley/mk2 - desc = "Autonomous Power Loader Unit MK-II. This prototype Ripley is refitted with a pressurized cabin, trading its prior speed for atmospheric protection and armor." - name = "\improper APLU MK-II \"Ripley\"" - icon_state = "ripleymkii" - base_icon_state = "ripleymkii" - fast_pressure_step_in = 2 //step_in while in low pressure conditions - slow_pressure_step_in = 4 //step_in while in normal pressure conditions - movedelay = 4 - max_temperature = 30000 - max_integrity = 250 - possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT - wreckage = /obj/structure/mecha_wreckage/ripley/mk2 - enclosed = TRUE - enter_delay = 40 - silbutton_icon_state = null - -/obj/vehicle/sealed/mecha/working/ripley/mk2/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) - -/obj/vehicle/sealed/mecha/working/ripley/deathripley - desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" - name = "\improper DEATH-RIPLEY" - icon_state = "deathripley" - base_icon_state = "deathripley" - fast_pressure_step_in = 2 //step_in while in low pressure conditions - slow_pressure_step_in = 3 //step_in while in normal pressure conditions - movedelay = 4 - lights_power = 7 - wreckage = /obj/structure/mecha_wreckage/ripley/deathripley - step_energy_drain = 0 - enclosed = TRUE - enter_delay = 40 - silbutton_icon_state = null - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/fake, - MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/ejector), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - -/obj/vehicle/sealed/mecha/working/ripley/deathripley/real - desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" - equip_by_category = list( - MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill, - MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/ejector), - MECHA_POWER = list(), - MECHA_ARMOR = list(), - ) - -/obj/vehicle/sealed/mecha/working/ripley/mining - desc = "An old, dusty mining Ripley." - name = "\improper APLU \"Miner\"" - -/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize(mapload) - . = ..() - take_damage(125) // Low starting health - -/obj/vehicle/sealed/mecha/working/ripley/mining/Initialize(mapload) - . = ..() - if(cell) - cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge - if(prob(70)) //Maybe add a drill - if(prob(15)) //Possible diamond drill... Feeling lucky? - var/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill/D = new - D.attach(src) - else - var/obj/item/mecha_parts/mecha_equipment/drill/D = new - D.attach(src) - - else //Add plasma cutter if no drill - var/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/P = new - P.attach(src) - - //Attach hydraulic clamp - var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new - HC.attach(src, TRUE) - var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new - scanner.attach(src) - -/obj/vehicle/sealed/mecha/working/ripley/cargo - desc = "An ailing, old, repurposed cargo hauler. Most of its equipment wires are frayed or missing and its frame is rusted." - name = "\improper APLU \"Big Bess\"" - icon_state = "hauler" - base_icon_state = "hauler" - max_integrity = 100 //Has half the health of a normal RIPLEY mech, so it's harder to use as a weapon. - -/obj/vehicle/sealed/mecha/working/ripley/cargo/Initialize(mapload) - . = ..() - if(cell) - cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge - - //Attach hydraulic clamp ONLY - var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new - HC.attach(src) - - take_damage(max_integrity * 0.5, sound_effect=FALSE) //Low starting health - -/obj/vehicle/sealed/mecha/working/ripley/Exit(atom/movable/leaving, direction) - if(leaving in cargo) - return FALSE - return ..() - -/obj/vehicle/sealed/mecha/working/ripley/contents_explosion(severity, target) - for(var/i in cargo) - var/obj/cargoobj = i - if(prob(10 * severity)) - LAZYREMOVE(cargo, cargoobj) - cargoobj.forceMove(drop_location()) - return ..() - -/obj/item/mecha_parts/mecha_equipment/ejector - name = "Cargo compartment" - equipment_slot = MECHA_UTILITY - detachable = FALSE - -/obj/item/mecha_parts/mecha_equipment/ejector/get_snowflake_data() - var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_EJECTOR, "cargo" = list()) - var/obj/vehicle/sealed/mecha/working/ripley/miner = chassis - for(var/obj/crate in miner.cargo) - data["cargo"] += list(list( - "name" = crate.name, - "ref" = REF(crate), - )) - return data - -/obj/item/mecha_parts/mecha_equipment/ejector/ui_act(action, list/params) - . = ..() - if(.) - return TRUE - if(action == "eject") - var/obj/vehicle/sealed/mecha/working/ripley/miner = chassis - var/obj/crate = locate(params["cargoref"]) in miner.cargo - if(!crate) - return FALSE - to_chat(miner.occupants, "[icon2html(src, miner.occupants)][span_notice("You unload [crate].")]") - crate.forceMove(drop_location()) - LAZYREMOVE(miner.cargo, crate) - if(crate == miner.box) - miner.box = null - log_message("Unloaded [crate]. Cargo compartment capacity: [miner.cargo_capacity - LAZYLEN(miner.cargo)]", LOG_MECHA) - return TRUE - - -/obj/vehicle/sealed/mecha/working/ripley/relay_container_resist_act(mob/living/user, obj/O) - to_chat(user, span_notice("You lean on the back of [O] and start pushing so it falls out of [src].")) - if(do_after(user, O, 300)) - if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) - return - to_chat(user, span_notice("You successfully pushed [O] out of [src]!")) - O.forceMove(drop_location()) - LAZYREMOVE(cargo, O) - else - if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. - to_chat(user, span_warning("You fail to push [O] out of [src]!")) - -/// Increases movement and drill speed in lower pressure environments because of less air resistance or something -/obj/vehicle/sealed/mecha/working/ripley/proc/update_pressure() - var/turf/T = get_turf(loc) - var/datum/gas_mixture/environment = T.unsafe_return_air() - var/pressure = environment.returnPressure() - - if(pressure < 20) - movedelay = fast_pressure_step_in - for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in flat_equipment) - drill.equip_cooldown = initial(drill.equip_cooldown) * 0.5 - - else - movedelay = slow_pressure_step_in - for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in flat_equipment) - drill.equip_cooldown = initial(drill.equip_cooldown) diff --git a/code/modules/vehicles/mecha/working/working.dm b/code/modules/vehicles/mecha/working/working.dm deleted file mode 100644 index 3138fc0121c..00000000000 --- a/code/modules/vehicles/mecha/working/working.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/vehicle/sealed/mecha/working - allow_diagonal_movement = TRUE - /// Handles an internal ore box for working mechs - var/obj/structure/ore_box/box - -/obj/vehicle/sealed/mecha/working/Destroy() - QDEL_NULL(box) - return ..() - -/obj/vehicle/sealed/mecha/working/Move() - . = ..() - if(.) - collect_ore() - -/** - * Handles collecting ore. - * - * Checks for a hydraulic clamp or ore box manager and if it finds an ore box inside them puts ore in the ore box. - */ -/obj/vehicle/sealed/mecha/working/proc/collect_ore() - if(!box) - return - if(!(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in flat_equipment) && !(locate(/obj/item/mecha_parts/mecha_equipment/orebox_manager) in equip_by_category[MECHA_UTILITY])) - return - for(var/obj/item/stack/ore/ore in range(1, src)) - if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! - ore.forceMove(box) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index fe757ac59a0..dfefa77b70f 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -26,14 +26,6 @@ if(ismob(gone)) remove_occupant(gone) -// so that we can check the access of the vehicle's occupants. Ridden vehicles do this in the riding component, but these don't have that -/obj/vehicle/sealed/Bump(atom/A) - . = ..() - if(istype(A, /obj/machinery/door)) - var/obj/machinery/door/conditionalwall = A - for(var/occupant in occupants) - conditionalwall.bumpopen(occupant) - /obj/vehicle/sealed/after_add_occupant(mob/M) . = ..() ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, VEHICLE_TRAIT) diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index bfbde9b6a0e..7151dd48962 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -12,18 +12,14 @@ /obj/item/grenade/chem_grenade/metalfoam = 10, /obj/item/geiger_counter = 5, /obj/item/stock_parts/cell/high = 10, - /obj/item/electronics/airlock = 10, /obj/item/electronics/apc = 10, /obj/item/electronics/airalarm = 10, - /obj/item/electronics/firealarm = 10, - /obj/item/electronics/firelock = 10 ) contraband = list( /obj/item/stock_parts/cell/potato = 3 ) premium = list( /obj/item/storage/belt/utility = 3, - /obj/item/construction/rcd/loaded = 2, ) refill_canister = /obj/item/vending_refill/engivend default_price = PAYCHECK_EASY diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index ed97774dbd8..4c96d687e15 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -48,7 +48,6 @@ /obj/item/canvas/twentyfour_twentyfour = 5, /obj/item/canvas/thirtysix_twentyfour = 3, /obj/item/canvas/fortyfive_twentyseven = 3, - /obj/item/airlock_painter = 1, /obj/item/melee/skateboard/pro = 3, /obj/item/clothing/shoes/wheelys/rollerskates= 3, /obj/item/melee/skateboard/hoverboard = 1, diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm deleted file mode 100644 index 465517d1c64..00000000000 --- a/code/modules/wiremod/shell/airlock.dm +++ /dev/null @@ -1,196 +0,0 @@ -/datum/wires/airlock/shell - holder_type = /obj/machinery/door/airlock/shell - proper_name = "Circuit Airlock" - -/datum/wires/airlock/shell/on_cut(wire, mend) - // Don't allow them to re-enable autoclose. - if(wire == WIRE_TIMING) - return - return ..() - -/obj/machinery/door/airlock/shell - name = "circuit airlock" - autoclose = FALSE - -/obj/machinery/door/airlock/shell/Initialize(mapload) - . = ..() - AddComponent( \ - /datum/component/shell, \ - unremovable_circuit_components = list(new /obj/item/circuit_component/airlock, new /obj/item/circuit_component/airlock_access_event), \ - capacity = SHELL_CAPACITY_LARGE, \ - shell_flags = SHELL_FLAG_ALLOW_FAILURE_ACTION|SHELL_FLAG_REQUIRE_ANCHOR \ - ) - -/obj/machinery/door/airlock/shell/check_access(obj/item/I) - return FALSE - -/obj/machinery/door/airlock/shell/canAIControl(mob/user) - return FALSE - -/obj/machinery/door/airlock/shell/canAIHack(mob/user) - return FALSE - -/obj/machinery/door/airlock/shell/allowed(mob/user) - if(SEND_SIGNAL(src, COMSIG_AIRLOCK_SHELL_ALLOWED, user) & COMPONENT_AIRLOCK_SHELL_ALLOW) - return TRUE - return isAdminGhostAI(user) - -/obj/machinery/door/airlock/shell/set_wires() - return new /datum/wires/airlock/shell(src) - -/obj/item/circuit_component/airlock - display_name = "Airlock" - desc = "The general interface with an airlock. Includes general statuses of the airlock" - - /// The shell, if it is an airlock. - var/obj/machinery/door/airlock/attached_airlock - - /// Bolts the airlock (if possible) - var/datum/port/input/bolt - /// Unbolts the airlock (if possible) - var/datum/port/input/unbolt - /// Opens the airlock (if possible) - var/datum/port/input/open - /// Closes the airlock (if possible) - var/datum/port/input/close - - /// Contains whether the airlock is open or not - var/datum/port/output/is_open - /// Contains whether the airlock is bolted or not - var/datum/port/output/is_bolted - - /// Called when the airlock is opened. - var/datum/port/output/opened - /// Called when the airlock is closed - var/datum/port/output/closed - - /// Called when the airlock is bolted - var/datum/port/output/bolted - /// Called when the airlock is unbolted - var/datum/port/output/unbolted - -/obj/item/circuit_component/airlock/populate_ports() - // Input Signals - bolt = add_input_port("Bolt", PORT_TYPE_SIGNAL) - unbolt = add_input_port("Unbolt", PORT_TYPE_SIGNAL) - open = add_input_port("Open", PORT_TYPE_SIGNAL) - close = add_input_port("Close", PORT_TYPE_SIGNAL) - // States - is_open = add_output_port("Is Open", PORT_TYPE_NUMBER) - is_bolted = add_output_port("Is Bolted", PORT_TYPE_NUMBER) - // Output Signals - opened = add_output_port("Opened", PORT_TYPE_SIGNAL) - closed = add_output_port("Closed", PORT_TYPE_SIGNAL) - bolted = add_output_port("Bolted", PORT_TYPE_SIGNAL) - unbolted = add_output_port("Unbolted", PORT_TYPE_SIGNAL) - -/obj/item/circuit_component/airlock/register_shell(atom/movable/shell) - . = ..() - if(istype(shell, /obj/machinery/door/airlock)) - attached_airlock = shell - RegisterSignal(shell, COMSIG_AIRLOCK_SET_BOLT, PROC_REF(on_airlock_set_bolted)) - RegisterSignal(shell, COMSIG_AIRLOCK_OPEN, PROC_REF(on_airlock_open)) - RegisterSignal(shell, COMSIG_AIRLOCK_CLOSE, PROC_REF(on_airlock_closed)) - -/obj/item/circuit_component/airlock/unregister_shell(atom/movable/shell) - attached_airlock = null - UnregisterSignal(shell, list( - COMSIG_AIRLOCK_SET_BOLT, - COMSIG_AIRLOCK_OPEN, - COMSIG_AIRLOCK_CLOSE, - )) - return ..() - -/obj/item/circuit_component/airlock/proc/on_airlock_set_bolted(datum/source, should_bolt) - SIGNAL_HANDLER - is_bolted.set_output(should_bolt) - if(should_bolt) - bolted.set_output(COMPONENT_SIGNAL) - else - unbolted.set_output(COMPONENT_SIGNAL) - -/obj/item/circuit_component/airlock/proc/on_airlock_open(datum/source, force) - SIGNAL_HANDLER - is_open.set_output(TRUE) - opened.set_output(COMPONENT_SIGNAL) - -/obj/item/circuit_component/airlock/proc/on_airlock_closed(datum/source, forced) - SIGNAL_HANDLER - is_open.set_output(FALSE) - closed.set_output(COMPONENT_SIGNAL) - -/obj/item/circuit_component/airlock/input_received(datum/port/input/port) - - if(!attached_airlock) - return - - if(COMPONENT_TRIGGERED_BY(bolt, port)) - attached_airlock.bolt() - if(COMPONENT_TRIGGERED_BY(unbolt, port)) - attached_airlock.unbolt() - if(COMPONENT_TRIGGERED_BY(open, port) && attached_airlock.density) - INVOKE_ASYNC(attached_airlock, TYPE_PROC_REF(/obj/machinery/door/airlock, open)) - if(COMPONENT_TRIGGERED_BY(close, port) && !attached_airlock.density) - INVOKE_ASYNC(attached_airlock, TYPE_PROC_REF(/obj/machinery/door/airlock, close)) - - -/obj/item/circuit_component/airlock_access_event - display_name = "Airlock Access Event" - desc = "An event that can be handled through circuit components to determine if the door should open or not for an entity that might be trying to access it." - circuit_flags = CIRCUIT_FLAG_INSTANT - - /// The shell, if it is an airlock. - var/obj/machinery/door/airlock/attached_airlock - - /// Tells the event to open the airlock. - var/datum/port/input/open_airlock - - /// The person trying to open the airlock. - var/datum/port/output/accessing_entity - - /// The signal sent when this event is triggered - var/datum/port/output/event_triggered - - -/obj/item/circuit_component/airlock_access_event/register_shell(atom/movable/shell) - . = ..() - if(istype(shell, /obj/machinery/door/airlock)) - attached_airlock = shell - RegisterSignal(shell, COMSIG_AIRLOCK_SHELL_ALLOWED , PROC_REF(handle_allowed)) - -/obj/item/circuit_component/airlock_access_event/unregister_shell(atom/movable/shell) - attached_airlock = null - UnregisterSignal(shell, list( - COMSIG_AIRLOCK_SHELL_ALLOWED , - )) - return ..() - - -/obj/item/circuit_component/airlock_access_event/populate_ports() - open_airlock = add_input_port("Should Open Airlock", PORT_TYPE_RESPONSE_SIGNAL, trigger = PROC_REF(should_open_airlock)) - accessing_entity = add_output_port("Accessing Entity", PORT_TYPE_ATOM) - event_triggered = add_output_port("Event Triggered", PORT_TYPE_INSTANT_SIGNAL) - - -/obj/item/circuit_component/airlock_access_event/proc/should_open_airlock(datum/port/input/port, list/return_values) - CIRCUIT_TRIGGER - if(!return_values) - return - return_values["should_open"] = TRUE - -/obj/item/circuit_component/airlock_access_event/proc/handle_allowed(datum/source, mob/accesser) - SIGNAL_HANDLER - if(!attached_airlock) - return - - SScircuit_component.queue_instant_run() - accessing_entity.set_output(accesser) - event_triggered.set_output(COMPONENT_SIGNAL) - var/list/result = SScircuit_component.execute_instant_run() - - if(!result) - attached_airlock.visible_message(span_warning("[attached_airlock]'s circuitry overheats!")) - return - - if(result["should_open"]) - return COMPONENT_AIRLOCK_SHELL_ALLOW diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm index e0cbb292011..82294fe9274 100644 --- a/code/modules/wiremod/shell/shell_items.dm +++ b/code/modules/wiremod/shell/shell_items.dm @@ -46,13 +46,6 @@ shell_to_spawn = /obj/structure/server screw_delay = 10 SECONDS -/obj/item/shell/airlock - name = "circuit airlock assembly" - icon = 'icons/obj/doors/airlocks/station/airlock.dmi' - icon_state = "construction" - shell_to_spawn = /obj/machinery/door/airlock/shell - screw_delay = 10 SECONDS - /obj/item/shell/dispenser name = "circuit dispenser assembly" icon_state = "setup_drone_arms-open" diff --git a/dionysus.dme b/dionysus.dme index c1680097400..a38ef61fac2 100644 --- a/dionysus.dme +++ b/dionysus.dme @@ -378,7 +378,6 @@ #include "code\__HELPERS\colors.dm" #include "code\__HELPERS\combat_helpers.dm" #include "code\__HELPERS\config.dm" -#include "code\__HELPERS\construction.dm" #include "code\__HELPERS\dates.dm" #include "code\__HELPERS\datums.dm" #include "code\__HELPERS\dna.dm" @@ -1274,7 +1273,6 @@ #include "code\datums\weather\weather_types\void_storm.dm" #include "code\datums\wires\_wires.dm" #include "code\datums\wires\airalarm.dm" -#include "code\datums\wires\airlock.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" #include "code\datums\wires\conveyor.dm" @@ -1330,7 +1328,6 @@ #include "code\game\machinery\autoclave.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" -#include "code\game\machinery\buttons.dm" #include "code\game\machinery\canister_frame.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\constructable_frame.dm" @@ -1343,7 +1340,6 @@ #include "code\game\machinery\ecto_sniffer.dm" #include "code\game\machinery\fat_sucker.dm" #include "code\game\machinery\fax_machine.dm" -#include "code\game\machinery\firealarm.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\gigabeacon.dm" #include "code\game\machinery\gulag_item_reclaimer.dm" @@ -1436,19 +1432,6 @@ #include "code\game\machinery\datanet\p2p_phones\subtypes.dm" #include "code\game\machinery\datanet\test_equipment\test_equipment_radio.dm" #include "code\game\machinery\datanet\test_equipment\test_equipment_wired.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\passworddoor.dm" -#include "code\game\machinery\doors\poddoor.dm" -#include "code\game\machinery\doors\shutters.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\access_controller.dm" #include "code\game\machinery\embedded_controller\airlock_controller.dm" #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" #include "code\game\machinery\embedded_controller\simple_vent_controller.dm" @@ -1456,7 +1439,6 @@ #include "code\game\machinery\newscaster\newscaster_machine.dm" #include "code\game\machinery\newscaster\newspaper.dm" #include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" #include "code\game\machinery\porta_turret\portable_turret.dm" #include "code\game\machinery\porta_turret\portable_turret_construct.dm" #include "code\game\machinery\porta_turret\portable_turret_cover.dm" @@ -1561,7 +1543,6 @@ #include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" #include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" #include "code\game\objects\items\AI_modules.dm" -#include "code\game\objects\items\airlock_painter.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\binoculars.dm" #include "code\game\objects\items\blueprints.dm" @@ -1627,10 +1608,7 @@ #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" #include "code\game\objects\items\puzzle_pieces.dm" -#include "code\game\objects\items\RCD.dm" #include "code\game\objects\items\religion.dm" -#include "code\game\objects\items\RPD.dm" -#include "code\game\objects\items\RSF.dm" #include "code\game\objects\items\scrolls.dm" #include "code\game\objects\items\secret_documents.dm" #include "code\game\objects\items\sharpener.dm" @@ -1862,8 +1840,6 @@ #include "code\game\objects\structures\destructible_structures.dm" #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\divine.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\door_assembly_types.dm" #include "code\game\objects\structures\dresser.dm" #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" @@ -1872,7 +1848,6 @@ #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\grille.dm" #include "code\game\objects\structures\guillotine.dm" #include "code\game\objects\structures\guncase.dm" #include "code\game\objects\structures\gym.dm" @@ -1909,8 +1884,6 @@ #include "code\game\objects\structures\traps.dm" #include "code\game\objects\structures\votingbox.dm" #include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\beds_chairs\alien_nest.dm" #include "code\game\objects\structures\beds_chairs\bed.dm" #include "code\game\objects\structures\beds_chairs\chair.dm" @@ -1919,9 +1892,6 @@ #include "code\game\objects\structures\cannons\cannon.dm" #include "code\game\objects\structures\cannons\cannon_instructions.dm" #include "code\game\objects\structures\cannons\cannonballs.dm" -#include "code\game\objects\structures\construction_console\construction_actions.dm" -#include "code\game\objects\structures\construction_console\construction_console.dm" -#include "code\game\objects\structures\construction_console\construction_console_centcom.dm" #include "code\game\objects\structures\crates_lockers\closets.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" @@ -2367,7 +2337,6 @@ #include "code\modules\art\statues.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\doorcontrol.dm" #include "code\modules\assembly\flash.dm" #include "code\modules\assembly\health.dm" #include "code\modules\assembly\helpers.dm" @@ -3002,7 +2971,6 @@ #include "code\modules\events\meateor_wave.dm" #include "code\modules\events\meteor_wave.dm" #include "code\modules\events\portal_storm.dm" -#include "code\modules\events\prison_break.dm" #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\rpgtitles.dm" @@ -3390,7 +3358,6 @@ #include "code\modules\mafia\outfits.dm" #include "code\modules\mafia\roles.dm" #include "code\modules\mapfluff\centcom\nuke_ops.dm" -#include "code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\asteroid4.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\bigderelict1.dm" @@ -3400,7 +3367,6 @@ #include "code\modules\mapfluff\ruins\spaceruin_code\crashedship.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\deepstorage.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\DJstation.dm" -#include "code\modules\mapfluff\ruins\spaceruin_code\hilbertshotel.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\oldstation.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\spacehotel.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\TheDerelict.dm" @@ -3413,9 +3379,7 @@ #include "code\modules\mapping\ruins.dm" #include "code\modules\mapping\verify.dm" #include "code\modules\mapping\access_helpers\_access_helpers.dm" -#include "code\modules\mapping\access_helpers\airlock_all_access.dm" #include "code\modules\mapping\embedded_controller\_embedded_controller.dm" -#include "code\modules\mapping\embedded_controller\door_control_linker.dm" #include "code\modules\mapping\embedded_controller\static_id_setter.dm" #include "code\modules\mapping\modular_map_loader\modular_map_loader.dm" #include "code\modules\mapping\space_management\multiz_helpers.dm" @@ -3788,7 +3752,6 @@ #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" -#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" @@ -3993,7 +3956,6 @@ #include "code\modules\paperwork\pen.dm" #include "code\modules\paperwork\photocopier.dm" #include "code\modules\paperwork\stamps.dm" -#include "code\modules\paperwork\ticketmachine.dm" #include "code\modules\photography\_pictures.dm" #include "code\modules\photography\camera\camera.dm" #include "code\modules\photography\camera\camera_image_capturing.dm" @@ -4275,7 +4237,6 @@ #include "code\modules\research\designs\electronics_designs.dm" #include "code\modules\research\designs\limbgrower_designs.dm" #include "code\modules\research\designs\machine_designs.dm" -#include "code\modules\research\designs\mecha_designs.dm" #include "code\modules\research\designs\mechfabricator_designs.dm" #include "code\modules\research\designs\medical_designs.dm" #include "code\modules\research\designs\mining_designs.dm" @@ -4439,8 +4400,6 @@ #include "code\modules\spooky\abilities\chilling_presence.dm" #include "code\modules\spooky\abilities\flicker.dm" #include "code\modules\spooky\abilities\ghost_light.dm" -#include "code\modules\spooky\abilities\knock_on_window_or_door.dm" -#include "code\modules\spooky\abilities\shatter_glass.dm" #include "code\modules\spooky\abilities\shatter_light.dm" #include "code\modules\spooky\abilities\sleep_whisper.dm" #include "code\modules\spooky\components\spook_factor.dm" @@ -4621,35 +4580,6 @@ #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" #include "code\modules\vehicles\cars\vim.dm" -#include "code\modules\vehicles\mecha\_mecha.dm" -#include "code\modules\vehicles\mecha\mech_bay.dm" -#include "code\modules\vehicles\mecha\mech_melee_attack.dm" -#include "code\modules\vehicles\mecha\mecha_actions.dm" -#include "code\modules\vehicles\mecha\mecha_construction_paths.dm" -#include "code\modules\vehicles\mecha\mecha_control_console.dm" -#include "code\modules\vehicles\mecha\mecha_defense.dm" -#include "code\modules\vehicles\mecha\mecha_parts.dm" -#include "code\modules\vehicles\mecha\mecha_ui.dm" -#include "code\modules\vehicles\mecha\mecha_wreckage.dm" -#include "code\modules\vehicles\mecha\combat\combat.dm" -#include "code\modules\vehicles\mecha\combat\durand.dm" -#include "code\modules\vehicles\mecha\combat\gygax.dm" -#include "code\modules\vehicles\mecha\combat\honker.dm" -#include "code\modules\vehicles\mecha\combat\marauder.dm" -#include "code\modules\vehicles\mecha\combat\phazon.dm" -#include "code\modules\vehicles\mecha\combat\reticence.dm" -#include "code\modules\vehicles\mecha\combat\savannah_ivanov.dm" -#include "code\modules\vehicles\mecha\equipment\mecha_equipment.dm" -#include "code\modules\vehicles\mecha\equipment\tools\medical_tools.dm" -#include "code\modules\vehicles\mecha\equipment\tools\mining_tools.dm" -#include "code\modules\vehicles\mecha\equipment\tools\other_tools.dm" -#include "code\modules\vehicles\mecha\equipment\tools\work_tools.dm" -#include "code\modules\vehicles\mecha\equipment\weapons\mecha_ammo.dm" -#include "code\modules\vehicles\mecha\equipment\weapons\weapons.dm" -#include "code\modules\vehicles\mecha\medical\odysseus.dm" -#include "code\modules\vehicles\mecha\working\clarke.dm" -#include "code\modules\vehicles\mecha\working\ripley.dm" -#include "code\modules\vehicles\mecha\working\working.dm" #include "code\modules\vending\_vending.dm" #include "code\modules\vending\access_vending.dm" #include "code\modules\vending\assist.dm" @@ -4791,7 +4721,6 @@ #include "code\modules\wiremod\datatypes\composite\list.dm" #include "code\modules\wiremod\preset\hello_world.dm" #include "code\modules\wiremod\preset\speech_relay.dm" -#include "code\modules\wiremod\shell\airlock.dm" #include "code\modules\wiremod\shell\assembly.dm" #include "code\modules\wiremod\shell\bot.dm" #include "code\modules\wiremod\shell\brain_computer_interface.dm"