diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm
index a187a17056..97f93bab18 100644
--- a/code/defines/obj/machinery.dm
+++ b/code/defines/obj/machinery.dm
@@ -212,6 +212,16 @@
var/id = null
var/range = 10
var/normaldoorcontrol = 0
+ var/desiredstate = 0 // Zero is closed, 1 is open.
+ var/specialfunctions = 1
+ /*
+ Bitflag, 1= open
+ 2= idscan,
+ 4= bolts
+ 8= shock
+ 16= door safties
+
+ */
anchored = 1.0
use_power = 1
idle_power_usage = 2
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 8999a1d54b..cf4cde2780 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -18,14 +18,39 @@
if(normaldoorcontrol)
for(var/obj/machinery/door/airlock/D in range(range))
if(D.id_tag == src.id)
- if (D.density)
- spawn( 0 )
- D.open()
- return
+ if(desiredstate == 1)
+ if(specialfunctions & OPEN)
+ if (D.density)
+ spawn( 0 )
+ D.open()
+ return
+ if(specialfunctions & IDSCAN)
+ D.aiDisabledIdScanner = 1
+ if(specialfunctions & BOLTS)
+ spawn(5)
+ D.locked = 1
+ if(specialfunctions & SHOCK)
+ D.secondsElectrified = -1
+ if(specialfunctions & SAFE)
+ D.safe = 0
+
else
- spawn( 0 )
- // D.close()
- return
+ if(specialfunctions & OPEN)
+ if (!D.density)
+ spawn( 0 )
+ D.close()
+ return
+ if(specialfunctions & IDSCAN)
+ D.aiDisabledIdScanner = 0
+ if(specialfunctions & BOLTS)
+ spawn(5)
+ D.locked = 0
+ if(specialfunctions & SHOCK)
+ D.secondsElectrified = 0
+ if(specialfunctions & SAFE)
+ D.safe = 1
+
+
else
for(var/obj/machinery/door/poddoor/M in machines)
@@ -39,6 +64,7 @@
M.close()
return
+ desiredstate = !desiredstate
spawn(15)
if(!(stat & NOPOWER))
icon_state = "doorctrl0"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e17849799b..6f13e31e9e 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -148,7 +148,7 @@
sleep(2)
var/area/a = get_area(usr.loc)
- if((istype(src.loc, /turf/space)) || (a.has_gravity == 0))
+ if((istype(usr.loc, /turf/space)) || (a.has_gravity == 0))
user.inertia_dir = get_dir(target, user)
step(user, user.inertia_dir)
diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm
index 35b17ceb80..0887c2c888 100644
--- a/code/game/objects/items/weapons/grenades.dm
+++ b/code/game/objects/items/weapons/grenades.dm
@@ -93,6 +93,7 @@ FLASHBANG
var
active = 0
det_time = 30
+ banglet = 0
proc
bang(var/turf/T , var/mob/living/carbon/M)
prime()
@@ -206,14 +207,16 @@ FLASHBANG
if (M.eye_stat >= 20)
M << "\red Your eyes start to burn badly!"
M.disabilities |= 1
- if (prob(M.eye_stat - 20 + 1))
- M << "\red You can't see anything!"
- M.sdisabilities |= 1
+ if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang)))
+ if (prob(M.eye_stat - 20 + 1))
+ M << "\red You can't see anything!"
+ M.sdisabilities |= 1
if (M.ear_damage >= 15)
M << "\red Your ears start to ring badly!"
- if (prob(M.ear_damage - 10 + 5))
- M << "\red You can't hear anything!"
- M.sdisabilities |= 4
+ if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang)))
+ if (prob(M.ear_damage - 10 + 5))
+ M << "\red You can't hear anything!"
+ M.sdisabilities |= 4
else
if (M.ear_damage >= 5)
M << "\red Your ears start to ring!"
@@ -232,9 +235,7 @@ FLASHBANG
for(var/mob/living/carbon/M in viewers(T, null))
bang(T, M)
-
-//Blob damage here
- for(var/obj/effect/blob/B in view(8,T))
+ for(var/obj/effect/blob/B in view(8,T)) //Blob damage here
var/damage = round(30/(get_dist(B,T)+1))
B.health -= damage
B.update()
@@ -255,6 +256,12 @@ FLASHBANG
return
+ attack_hand()
+ walk(src, null, null)
+ ..()
+ return
+
+
clown_check(var/mob/living/user)
if ((user.mutations & CLUMSY) && prob(50))
user << "\red Huh? How does this thing work?!"
@@ -266,12 +273,80 @@ FLASHBANG
return 0
return 1
-
-
-
-
-
-
+/obj/item/weapon/flashbang/clusterbang
+ desc = "Use of this weapon may constiute a war crime in your area, consult your local captain."
+ name = "Clusterbang"
+ icon = 'grenade.dmi'
+ icon_state = "clusterbang"
+ var/child = 0
+
+ attack_self(mob/user as mob)
+ if(!active)
+ //world << "cluster attack self"
+ user << "\red You prime the clusterbang! [det_time/10] seconds!"
+ src.active = 1
+ src.icon_state = "clusterbang1"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(src.det_time)
+ arm(user)
+ return
+
+ afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
+ if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
+ if((user.equipped() == src)&&(!active))
+ //world << "cluster after attack"
+ arm(user)
+ user.dir = get_dir(user, target)
+ user.drop_item()
+ var/t = (isturf(target) ? target : target.loc)
+ walk_towards(src, t, 3)
+ return
+
+/obj/item/weapon/flashbang/clusterbang/proc/arm(mob/user as mob)
+
+ //world << "Armed!"
+ var/numspawned = rand(4,8)
+// world << numspawned
+ var/again = 0
+ if(!child)
+ for(var/more = numspawned,more > 0,more--)
+ if(prob(35))
+ again++
+ numspawned --
+
+ for(,numspawned > 0, numspawned--)
+ //world << "Spawned Flashbang!"
+ spawn(0)
+ var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(src)
+ F.loc = src.loc
+ F.icon_state = "flashbang1"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ F.active = 1
+ F.banglet = 1
+ var/stepdist = rand(1,3)
+ step_away(F,src,stepdist)
+ var/dettime = rand(15,60)
+ spawn(dettime)
+ F.prime()
+
+ for(,again > 0, again--)
+ //world << "Spawned CFlashbang!"
+ spawn(0)
+ var/obj/item/weapon/flashbang/clusterbang/F = new /obj/item/weapon/flashbang/clusterbang(src)
+ F.loc = src.loc
+ F.active = 1
+ F.child = 1
+ F.icon_state = "clusterbang1"
+ var/stepdist = rand(1,3)
+ step_away(F,src,stepdist)
+ spawn(30)
+ F.arm()
+
+ spawn(70)
+ prime()
+
+ return
diff --git a/code/game/objects/secstorage/secstorage.dm b/code/game/objects/secstorage/secstorage.dm
index 9c6f5e324c..c981897c27 100644
--- a/code/game/objects/secstorage/secstorage.dm
+++ b/code/game/objects/secstorage/secstorage.dm
@@ -13,6 +13,7 @@
var/l_hacking = 0
var/emagged = 0
var/open = 0
+ var/internalstorage = 3
w_class = 3.0
/obj/item/weapon/secstorage/examine()
@@ -111,7 +112,7 @@
else
user << "You short out the lock on [src]."
return
- if ((W.w_class > 3 || istype(W, /obj/item/weapon/secstorage)))
+ if ((W.w_class > internalstorage || istype(W, /obj/item/weapon/secstorage)))
return
if ((istype(W, /obj/item/weapon/screwdriver)) && (src.locked == 1))
sleep(6)
diff --git a/code/game/objects/secstorage/ssafe.dm b/code/game/objects/secstorage/ssafe.dm
index 28d58e713d..b288245490 100644
--- a/code/game/objects/secstorage/ssafe.dm
+++ b/code/game/objects/secstorage/ssafe.dm
@@ -7,7 +7,8 @@
icon_sparking = "safespark"
flags = FPRINT | TABLEPASS
force = 8.0
- w_class = 4.0
+ w_class = 8.0
+ internalstorage = 8
anchored = 1.0
density = 0
@@ -16,5 +17,9 @@
new /obj/item/weapon/paper(src)
new /obj/item/weapon/pen(src)
+/obj/item/weapon/secstorage/ssafe/HoS/New()
+ ..()
+ new /obj/item/weapon/storage/lockbox/clusterbang(src)
+
/obj/item/weapon/secstorage/ssafe/attack_hand(mob/user as mob)
return attack_self(user)
\ No newline at end of file
diff --git a/code/game/objects/storage/lockbox.dm b/code/game/objects/storage/lockbox.dm
index 49b9d3b3fd..a5f64ab0e6 100644
--- a/code/game/objects/storage/lockbox.dm
+++ b/code/game/objects/storage/lockbox.dm
@@ -74,4 +74,14 @@
new /obj/item/weapon/implantcase/loyalty(src)
new /obj/item/weapon/implantcase/loyalty(src)
new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implanter/loyalty(src)
\ No newline at end of file
+ new /obj/item/weapon/implanter/loyalty(src)
+
+
+/obj/item/weapon/storage/lockbox/clusterbang
+ name = "Lockbox (Clusterbang)"
+ desc = "You have a bad feeling about opening this."
+ req_access = list(access_security)
+
+ New()
+ ..()
+ new /obj/item/weapon/flashbang/clusterbang(src)
\ No newline at end of file
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 3b8dfb28af..774bb3c438 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -832,6 +832,13 @@
if (href_list["BlueSpaceArtillery"])
var/mob/M = locate(href_list["BlueSpaceArtillery"])
+ if(!M)
+ return
+
+ var/choice = alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No")
+ if (choice == "No")
+ return
+
M << "You've been hit by bluespace artillery!"
log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
@@ -857,6 +864,36 @@
M.Weaken(20)
M.stuttering = 20
+ if (href_list["CentcommReply"])
+ var/mob/M = locate(href_list["CentcommReply"])
+ if(!M)
+ return
+ if(!istype(M, /mob/living/carbon/human))
+ alert("Centcomm cannot transmit to non-humans.")
+ return
+ if(!istype(M:ears, /obj/item/device/radio/headset))
+ alert("The person you're trying to reply to doesn't have a headset! Centcomm cannot transmit directly to them.")
+ return
+ var/input = input(src.owner, "Please enter a message to reply to [key_name(M)] via their headset.","Outgoing message from Centcomm", "")
+ if(!input)
+ return
+ M << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\""
+
+ if (href_list["SyndicateReply"])
+ var/mob/M = locate(href_list["SyndicateReply"])
+ if(!M)
+ return
+ if(!istype(M, /mob/living/carbon/human))
+ alert("The Syndicate cannot transmit to non-humans.")
+ return
+ if(!istype(M:ears, /obj/item/device/radio/headset))
+ alert("The person you're trying to reply to doesn't have a headset! The Syndicate cannot transmit directly to them.")
+ return
+ var/input = input(src.owner, "Please enter a message to reply to [key_name(M)] via their headset.","Outgoing message from The Syndicate", "")
+ if(!input)
+ return
+ M << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\""
+
if (href_list["jumpto"])
if(rank in list("Badmin", "Game Admin", "Game Master"))
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 6f0a925218..9321cfee14 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -30,7 +30,7 @@
for (var/mob/M in world)
if (M.client && M.client.holder)
- M << "\blue CENTCOMM:[key_name(Sender, M)] (PP) (VV) (SM) (JMP) (CA) (BSA): [msg]"
+ M << "\blue CENTCOMM:[key_name(Sender, M)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
/proc/Syndicate_announce(var/text , var/mob/Sender)
@@ -38,5 +38,5 @@
for (var/mob/M in world)
if (M.client && M.client.holder)
- M << "\blue SYNDICATE:[key_name(Sender, M)] (PP) (VV) (SM) (JMP) (CA) (BSA): [msg]"
+ M << "\blue SYNDICATE:[key_name(Sender, M)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index b0cd43d9b5..d5c661a51d 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -333,9 +333,11 @@
//First check to see if we can do things
if(restrained()) return 0
+ /*
if(istype(src,/mob/living/carbon))
if(src.l_hand && src.r_hand)
return 0
+ */
var/dense_object = 0
for(var/turf/turf in oview(1,src))
diff --git a/code/setup.dm b/code/setup.dm
index 9fb30cd42b..9be9049588 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -190,6 +190,13 @@ var/const
#define MAINT 8 // under maintaince
#define EMPED 16 // temporary broken by EMP pulse
+//bitflags for door switches.
+#define OPEN 1
+#define IDSCAN 2
+#define BOLTS 4
+#define SHOCK 8
+#define SAFE 16
+
#define ENGINE_EJECT_Z 3
//metal, glass, rod stacks
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 4a1369f69f..0d5f9892b9 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index c53de910da..9f57c1a1a0 100644
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -65,7 +65,7 @@
"abm" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/security/hos)
"abn" = (/obj/machinery/door_control{id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -2; pixel_y = 2; req_access_txt = ""},/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "carpet"},/area/security/hos)
"abo" = (/obj/structure/stool/chair{dir = 8},/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/security/hos)
-"abp" = (/obj/machinery/camera{c_tag = "Head Security's Office"; dir = 8; network = "SS13"},/obj/structure/disposalpipe/segment,/obj/machinery/keycard_auth{pixel_x = 24},/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/security/hos)
+"abp" = (/obj/machinery/camera{c_tag = "Head Security's Office"; dir = 8; network = "SS13"},/obj/structure/disposalpipe/segment,/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 10},/obj/item/device/radio/intercom{pixel_x = 30; pixel_y = -10},/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/security/hos)
"abq" = (/obj/machinery/computer/security,/turf/simulated/floor,/area/security/main)
"abr" = (/obj/machinery/computer/secure_data,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor,/area/security/main)
"abs" = (/obj/machinery/power/apc{dir = 1; name = "Security APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/security/main)
@@ -81,7 +81,7 @@
"abC" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/thermal,/turf/simulated/floor{icon_state = "carpet"},/area/security/hos)
"abD" = (/obj/item/weapon/stamp/hos,/obj/structure/table/woodentable,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/security/hos)
"abE" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/woodentable,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/security/hos)
-"abF" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{pixel_x = 28; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/security/hos)
+"abF" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/secstorage/ssafe/HoS{pixel_x = 35},/turf/simulated/floor{dir = 4; icon_state = "carpetside"},/area/security/hos)
"abG" = (/obj/structure/stool/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/main)
"abH" = (/obj/structure/stool/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor,/area/security/main)
"abI" = (/obj/structure/table,/obj/item/kitchen/donut_box,/turf/simulated/floor,/area/security/main)
@@ -222,11 +222,11 @@
"aen" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/security/range)
"aeo" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/security/range)
"aep" = (/obj/machinery/light/small{dir = 8},/obj/effect/decal/cleanable/cobweb,/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen{layer = 4},/turf/simulated/floor,/area/security/brig)
-"aeq" = (/obj/machinery/camera{c_tag = "Brig Secure Cell 1"; dir = 0; name = "Secure Cell 1"},/turf/simulated/floor,/area/security/brig)
+"aeq" = (/obj/machinery/camera{c_tag = "Brig Secure Cell 1"; dir = 0; name = "Secure Cell 1"},/obj/item/device/radio/intercom{desc = "Talk... listen through this."; name = "Station Intercom (Brig Radio)"; pixel_y = 25; wires = 2},/turf/simulated/floor,/area/security/brig)
"aer" = (/obj/structure/stool/bed,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig)
"aes" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen{layer = 4},/turf/simulated/floor,/area/security/brig)
-"aet" = (/obj/machinery/camera{c_tag = "Brig Secure Cell 2"; dir = 0; name = "Secure Cell 2"},/turf/simulated/floor,/area/security/brig)
-"aeu" = (/obj/machinery/camera{c_tag = "Brig Secure Cell 3"; dir = 0; name = "Secure Cell 3"},/turf/simulated/floor,/area/security/brig)
+"aet" = (/obj/machinery/camera{c_tag = "Brig Secure Cell 2"; dir = 0; name = "Secure Cell 2"},/obj/item/device/radio/intercom{desc = "Talk... listen through this."; name = "Station Intercom (Brig Radio)"; pixel_y = 25; wires = 2},/turf/simulated/floor,/area/security/brig)
+"aeu" = (/obj/machinery/camera{c_tag = "Brig Secure Cell 3"; dir = 0; name = "Secure Cell 3"},/obj/item/device/radio/intercom{desc = "Talk... listen through this."; name = "Station Intercom (Brig Radio)"; pixel_y = 25; wires = 2},/turf/simulated/floor,/area/security/brig)
"aev" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/main)
"aew" = (/obj/structure/rack,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aex" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j2s"; sortType = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -6218,7 +6218,7 @@
"cpD" = (/obj/machinery/door/airlock/external,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "NTrasen"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"cpE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom)
"cpF" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control)
-"cpG" = (/obj/structure/table,/obj/item/assembly/shock_kit{icon = 'icons/obj/assemblies.dmi'},/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/centcom/control)
+"cpG" = (/obj/structure/table,/obj/item/assembly/shock_kit{icon = 'assemblies.dmi'},/obj/item/device/assembly/signaler,/obj/item/weapon/handcuffs,/obj/item/weapon/melee/classic_baton,/turf/unsimulated/floor{icon_state = "whiteshiny"},/area/centcom/control)
"cpH" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/shuttle/specops/centcom)
"cpI" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops/centcom)
"cpJ" = (/obj/effect/landmark{name = "Commando-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
diff --git a/tgstation.dme b/tgstation.dme
index cd78de76d6..97b4cb9341 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -162,6 +162,7 @@
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
+#define FILE_DIR "maps/backup"
#define FILE_DIR "sound"
#define FILE_DIR "sound/ambience"
#define FILE_DIR "sound/announcer"