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"