Adds the Nuclear training bomb, second try (#25352)

* Adds the Nuclear training bomb

* boxstation

* other maps

* moved camera

* missing cable

* last fixes

* delta, last fix

* Update code/datums/wires/nuclearbomb_wires.dm

Co-authored-by: Charlie Nolan <funnyman3595@gmail.com>
Signed-off-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* cyberiad missing floor

---------

Signed-off-by: Henri215 <77684085+Henri215@users.noreply.github.com>
Co-authored-by: Charlie Nolan <funnyman3595@gmail.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Henri215
2024-05-14 12:53:00 +00:00
committed by GitHub
co-authored by Charlie Nolan Burzah
parent 69f20e250b
commit 9e04910ce6
17 changed files with 854 additions and 353 deletions
+44 -9
View File
@@ -258,6 +258,10 @@
/obj/item/target,
/obj/item/target,
/obj/item/target,
/obj/item/target/syndicate,
/obj/item/target/syndicate,
/obj/item/target/syndicate,
/obj/item/target/syndicate,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"acD" = (
@@ -453,7 +457,6 @@
/obj/machinery/camera{
c_tag = "Firing Range"
},
/obj/machinery/syndicatebomb/training,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/station/security/range)
@@ -466,7 +469,7 @@
name = "east bump";
pixel_x = 24
},
/turf/simulated/floor/plating,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"adn" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -522,9 +525,8 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/item/radio/intercom/department/security{
pixel_y = -28
},
/obj/machinery/nuclearbomb/training,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"adE" = (
@@ -537,13 +539,34 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/syndicatebomb/training,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"adG" = (
/obj/item/disk/nuclear/training{
pixel_y = -2;
pixel_x = -7
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/obj/effect/decal/cleanable/dirt,
/obj/structure/table/reinforced,
/obj/item/paper/nuclear_guide_spacing{
pixel_x = 10;
pixel_y = 7
},
/obj/item/paper/nuclear_guide_defusing{
pixel_x = 9;
pixel_y = 4
},
/obj/item/disk/nuclear/training{
pixel_x = -5
},
/obj/item/paper/nuclear_guide_operating{
pixel_x = 8;
pixel_y = 1
},
/turf/simulated/floor/plasteel,
/area/station/security/range)
"adH" = (
@@ -1696,10 +1719,22 @@
/area/station/command/office/hos)
"aij" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/rack,
/obj/item/target/syndicate,
/obj/item/target/syndicate,
/obj/item/target/syndicate,
/obj/item/storage/toolbox/mechanical{
pixel_x = 3;
pixel_y = 6
},
/obj/item/multitool{
pixel_y = -5;
pixel_x = 5
},
/obj/item/clothing/head/welding{
pixel_y = -2;
pixel_x = -6
},
/obj/structure/table/reinforced,
/obj/item/radio/intercom/department/security{
pixel_x = 28
},
/turf/simulated/floor/plasteel,
/area/station/security/range)
"aio" = (
+290 -151
View File
@@ -2486,13 +2486,6 @@
/obj/machinery/ai_status_display,
/turf/simulated/wall/r_wall,
/area/station/turret_protected/aisat/interior)
"apu" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/lootdrop/maintenance,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
},
/area/station/maintenance/fore2)
"apw" = (
/obj/structure/table,
/obj/item/storage/toolbox/emergency,
@@ -2752,37 +2745,41 @@
/turf/simulated/floor/plating/asteroid/ancient,
/area/station/maintenance/fpmaint)
"ard" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/small,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/area/station/security/permabrig)
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/machinery/syndicatebomb/training,
/obj/machinery/light,
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"arh" = (
/obj/item/vending_refill/cola,
/obj/item/multitool,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/grouped_spawner{
group_id = "tunnelbats";
max_per_spawner = 1;
name = "bat spawner";
path_to_spawn = /mob/living/simple_animal/hostile/scarybat;
total_amount = 20
/obj/item/disk/nuclear/training{
pixel_y = -2;
pixel_x = -7
},
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
/obj/structure/table/reinforced,
/obj/item/paper/nuclear_guide_spacing{
pixel_x = 10;
pixel_y = 7
},
/area/station/maintenance/fore2)
"ark" = (
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
/obj/item/paper/nuclear_guide_defusing{
pixel_x = 9;
pixel_y = 4
},
/area/station/maintenance/fore2)
"arl" = (
/obj/structure/closet/emcloset,
/turf/simulated/floor/plating,
/area/station/maintenance/fore2)
/obj/item/disk/nuclear/training{
pixel_x = -5
},
/obj/item/paper/nuclear_guide_operating{
pixel_x = 8;
pixel_y = 1
},
/turf/simulated/floor/plasteel{
icon_state = "redcorner"
},
/area/station/security/defusal)
"arm" = (
/obj/machinery/door/airlock/maintenance{
name = "Fore Asteroid Maintenance Access"
@@ -5829,6 +5826,13 @@
"aMC" = (
/turf/simulated/mineral/ancient,
/area/station/medical/break_room)
"aME" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
},
/area/station/security/permabrig)
"aMJ" = (
/obj/machinery/firealarm{
dir = 1;
@@ -12062,19 +12066,21 @@
pixel_x = -3;
pixel_y = -2
},
/obj/item/clothing/glasses/sunglasses,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"bsP" = (
/obj/item/radio/intercom{
pixel_y = -28;
name = "custom placement"
},
/obj/structure/table/reinforced,
/obj/item/clothing/glasses/sunglasses{
pixel_x = 3;
pixel_y = 3
},
/turf/simulated/floor/plasteel,
/area/station/security/range)
"bsP" = (
/obj/machinery/syndicatebomb/training,
/obj/structure/closet/bombclosetsecurity,
/obj/item/radio/intercom{
pixel_y = -28;
name = "custom placement"
/obj/item/clothing/glasses/sunglasses,
/obj/item/storage/box/flashbangs{
pixel_x = -16
},
/turf/simulated/floor/plasteel,
/area/station/security/range)
@@ -25812,13 +25818,16 @@
/turf/simulated/floor/wood,
/area/station/legal/magistrate)
"cKZ" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/access/all/security/general,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/obj/item/radio/intercom{
name = "custom placement";
pixel_y = 28
},
/area/station/maintenance/fore2)
/obj/machinery/camera{
c_tag = "Defusal Workshop"
},
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"cLa" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -28999,6 +29008,23 @@
icon_state = "darkyellow"
},
/area/station/engineering/atmos)
"cZi" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
/obj/structure/cable/orange{
d2 = 2;
icon_state = "0-2"
},
/obj/machinery/power/apc/directional/west,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "redcorner"
},
/area/station/security/defusal)
"cZr" = (
/obj/structure/chair{
dir = 8
@@ -29371,13 +29397,11 @@
/area/station/security/prison/cell_block/A)
"ddl" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable/orange{
d1 = 1;
d2 = 4;
icon_state = "1-4"
},
/obj/structure/cable/orange,
/obj/machinery/door/firedoor,
/obj/structure/cable/orange{
d2 = 4;
icon_state = "0-4"
},
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"ddn" = (
@@ -33955,6 +33979,17 @@
icon_state = "yellowcorner"
},
/area/station/hallway/primary/central/east)
"dEa" = (
/obj/machinery/light_switch{
name = "north bump";
pixel_y = 24
},
/obj/machinery/alarm/directional/west,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "redcorner"
},
/area/station/security/defusal)
"dEi" = (
/obj/structure/table/wood,
/obj/item/ammo_box/shotgun/beanbag,
@@ -34819,6 +34854,24 @@
icon_state = "bluered"
},
/area/station/hallway/secondary/entry/west)
"dQG" = (
/obj/machinery/door/airlock/security/glass{
name = "Defusal Workshop"
},
/obj/effect/mapping_helpers/airlock/access/all/security/general,
/obj/machinery/door/firedoor,
/obj/structure/cable/orange{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "red"
},
/area/station/security/defusal)
"dQR" = (
/obj/machinery/door/airlock/maintenance{
name = "Aft Asteroid Maintenance"
@@ -36720,15 +36773,6 @@
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"eAn" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/firecloset,
/obj/item/crowbar/red,
/obj/machinery/light{
dir = 1
},
/turf/simulated/floor/plating,
/area/station/maintenance/fore2)
"eAu" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/recharge_station,
@@ -41487,6 +41531,25 @@
/obj/effect/spawner/random_spawners/dirt_often,
/turf/simulated/floor/transparent/glass/reinforced,
/area/station/maintenance/apmaint)
"gmV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
/obj/structure/table/reinforced,
/obj/item/clothing/head/welding{
pixel_x = 12;
pixel_y = 6
},
/obj/item/multitool{
pixel_x = -4;
pixel_y = 6
},
/obj/item/storage/toolbox/mechanical{
pixel_x = -3;
pixel_y = -2
},
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"gmZ" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
@@ -42842,6 +42905,21 @@
icon_state = "whitebluecorner"
},
/area/station/medical/surgery/secondary)
"gLb" = (
/obj/item/vending_refill/cola,
/obj/item/multitool,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/grouped_spawner{
group_id = "tunnelbats";
max_per_spawner = 1;
name = "bat spawner";
path_to_spawn = /mob/living/simple_animal/hostile/scarybat;
total_amount = 20
},
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
},
/area/station/security/permabrig)
"gLj" = (
/obj/structure/table/wood,
/obj/effect/spawner/lootdrop/maintenance/eight,
@@ -43849,6 +43927,15 @@
icon_state = "red"
},
/area/station/security/storage)
"hcm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/firecloset,
/obj/item/crowbar/red,
/obj/machinery/light{
dir = 1
},
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"hco" = (
/obj/structure/cable/orange{
d1 = 4;
@@ -44431,6 +44518,14 @@
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
/area/station/turret_protected/aisat/interior/secondary)
"hnL" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/machinery/firealarm{
name = "north bump";
pixel_y = 24
},
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"hoa" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -50739,12 +50834,12 @@
/turf/simulated/floor/plating,
/area/station/hallway/primary/central/west)
"jjh" = (
/obj/structure/cable/orange{
d1 = 2;
d2 = 8;
icon_state = "2-8"
},
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/orange{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/turf/simulated/floor/plasteel,
/area/station/security/permabrig)
"jjp" = (
@@ -53865,20 +53960,6 @@
temperature = 80
},
/area/station/science/xenobiology)
"khV" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable/orange{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/structure/cable/orange{
d2 = 8;
icon_state = "0-8"
},
/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
/area/station/security/brig)
"kic" = (
/obj/structure/closet/wardrobe/grey,
/turf/simulated/floor/mineral/titanium/blue,
@@ -59525,6 +59606,15 @@
icon_state = "cafeteria"
},
/area/station/service/kitchen)
"lQa" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/machinery/door/firedoor,
/obj/structure/cable/orange{
d2 = 8;
icon_state = "0-8"
},
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"lQy" = (
/obj/machinery/optable,
/obj/machinery/light{
@@ -60954,11 +61044,6 @@
/obj/effect/spawner/random_spawners/dirt_often,
/turf/simulated/floor/plating,
/area/station/maintenance/disposal/external/southwest)
"moQ" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating,
/area/station/maintenance/fore2)
"moY" = (
/obj/structure/closet/secure_closet/medical3,
/obj/machinery/light,
@@ -62522,15 +62607,6 @@
},
/turf/simulated/floor/plating,
/area/station/security/brig)
"mSf" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable/orange{
d2 = 8;
icon_state = "0-8"
},
/obj/machinery/door/firedoor,
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"mSh" = (
/obj/structure/girder,
/turf/simulated/floor/plating,
@@ -62825,13 +62901,12 @@
/turf/simulated/floor/plating,
/area/station/maintenance/maintcentral)
"mVr" = (
/obj/item/clothing/shoes/orange,
/obj/item/clothing/under/color/orange/prison,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
/obj/machinery/nuclearbomb/training,
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "redcorner"
},
/area/station/maintenance/fore2)
/area/station/security/defusal)
"mVs" = (
/obj/structure/disposalpipe/segment/corner{
dir = 8;
@@ -63272,6 +63347,16 @@
/obj/structure/sign/securearea,
/turf/simulated/wall,
/area/station/engineering/tech_storage)
"nde" = (
/obj/structure/cable/orange{
d1 = 2;
d2 = 8;
icon_state = "2-8"
},
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
/area/station/security/permabrig)
"ndl" = (
/obj/effect/spawner/window/reinforced/polarized/grilled{
id = "rd"
@@ -65368,6 +65453,11 @@
icon_state = "neutralcorner"
},
/area/station/hallway/primary/fore/east)
"nNB" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"nNF" = (
/obj/machinery/door/airlock/maintenance{
name = "Service SMES Access"
@@ -65403,6 +65493,10 @@
},
/turf/simulated/floor/plating,
/area/station/hallway/primary/port/north)
"nOr" = (
/obj/structure/closet/emcloset,
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"nOu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/disposalpipe/segment,
@@ -69524,6 +69618,9 @@
icon_state = "dark"
},
/area/station/turret_protected/ai)
"peU" = (
/turf/simulated/wall/r_wall,
/area/station/security/defusal)
"pfe" = (
/obj/structure/chair/wood{
dir = 1
@@ -77318,6 +77415,30 @@
},
/turf/simulated/floor/plasteel,
/area/station/public/locker)
"rGv" = (
/obj/structure/cable/orange{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/structure/cable/orange{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/area/station/security/brig)
"rGw" = (
/obj/structure/disposalpipe/segment/corner,
/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
@@ -83573,16 +83694,18 @@
/area/station/maintenance/port)
"tFL" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable/orange{
d2 = 8;
icon_state = "0-8"
},
/obj/structure/cable/orange{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/machinery/door/firedoor,
/obj/structure/cable/orange{
d1 = 1;
d2 = 4;
icon_state = "1-4"
},
/obj/structure/cable/orange{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/obj/structure/cable/orange,
/turf/simulated/floor/plating,
/area/station/security/permabrig)
"tFY" = (
@@ -91618,6 +91741,14 @@
icon_state = "darkyellow"
},
/area/station/engineering/control)
"weh" = (
/obj/item/clothing/shoes/orange,
/obj/item/clothing/under/color/orange/prison,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
},
/area/station/security/permabrig)
"weN" = (
/obj/structure/cable{
d1 = 4;
@@ -92002,6 +92133,13 @@
},
/turf/simulated/floor/plasteel,
/area/station/hallway/primary/aft/west)
"wiU" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/lootdrop/maintenance,
/turf/simulated/floor/plating{
icon_state = "asteroidplating"
},
/area/station/security/permabrig)
"wiV" = (
/obj/structure/mirror{
pixel_x = -28
@@ -98575,6 +98713,7 @@
/obj/machinery/light/small{
dir = 4
},
/obj/structure/closet/bombclosetsecurity,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -118888,7 +119027,7 @@ rHj
cDb
rHj
aQL
aQL
nde
tFL
rNK
rNK
@@ -119146,10 +119285,10 @@ gLk
cVR
amO
myY
tFL
lQa
rNK
rNK
khV
lPn
yfX
fOj
awv
@@ -119403,11 +119542,11 @@ dpC
rHj
adc
rHj
mSf
rNK
rNK
lPn
yfX
peU
peU
peU
peU
wGz
uaJ
awB
uqz
@@ -119660,12 +119799,12 @@ rHj
rHj
vNP
sFU
afd
afd
afd
afd
wGz
uaJ
peU
dEa
cZi
dQG
dsy
rGv
dtr
uqz
aLp
@@ -119917,10 +120056,10 @@ rHj
cgX
tkn
dqz
tkn
rHj
peU
hnL
ard
afd
peU
daG
sVX
daG
@@ -120170,13 +120309,13 @@ aTz
afd
aTz
aTz
rHj
aTz
aTz
afd
afd
cKZ
aME
mYJ
peU
cKZ
gmV
fqh
eBm
krP
@@ -120427,11 +120566,11 @@ afd
afd
aTz
aTz
aTz
aTz
aTz
afd
vXM
tkn
weh
gLb
peU
mVr
arh
fqh
@@ -120684,13 +120823,13 @@ abW
abW
afd
aTz
aTz
aTz
aTz
afd
eAn
moQ
ark
hcm
nNB
adc
peU
peU
peU
fqh
xax
pZs
@@ -120939,15 +121078,15 @@ rNK
cRv
abW
abW
abW
afd
aTz
afd
vNP
wiU
nOr
afd
aTz
aTz
aTz
afd
vrQ
apu
arl
asu
atc
eZh
@@ -121196,15 +121335,15 @@ rNK
cRv
cRv
cRv
abW
afd
aTz
aTz
aTz
aTz
afd
afd
aTz
afd
aTz
aTz
fqh
bOR
gyQ
+94 -55
View File
@@ -28019,6 +28019,34 @@
icon_state = "neutralfull"
},
/area/station/hallway/primary/port/north)
"bDD" = (
/obj/item/disk/nuclear/training{
pixel_y = -2;
pixel_x = -7
},
/obj/structure/table/reinforced,
/obj/item/paper/nuclear_guide_spacing{
pixel_x = 10;
pixel_y = 7
},
/obj/item/paper/nuclear_guide_defusing{
pixel_x = 9;
pixel_y = 4
},
/obj/item/disk/nuclear/training{
pixel_x = -5
},
/obj/item/paper/nuclear_guide_operating{
pixel_x = 8;
pixel_y = 1
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
},
/obj/machinery/alarm/directional/south,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"bDE" = (
/obj/item/kirbyplants,
/obj/machinery/status_display{
@@ -35212,7 +35240,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/table,
/obj/machinery/syndicatebomb/training,
/obj/item/toy/figure/crew/secofficer,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -40235,6 +40263,16 @@
/turf/simulated/floor/plasteel,
/area/station/security/range)
"cju" = (
/obj/machinery/syndicatebomb/training,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"cjv" = (
/obj/structure/window/reinforced{
dir = 8
},
/turf/simulated/floor/plating,
/area/station/security/range)
"cjw" = (
/obj/structure/table/reinforced,
/obj/machinery/recharger{
pixel_x = -6;
@@ -40247,27 +40285,8 @@
pixel_x = 7;
pixel_y = 3
},
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"cjv" = (
/obj/structure/window/reinforced{
dir = 8
},
/turf/simulated/floor/plating,
/area/station/security/range)
"cjw" = (
/obj/structure/sign/securearea{
pixel_y = 32
},
/turf/simulated/floor/plating,
/area/station/security/range)
"cjx" = (
/obj/machinery/light{
dir = 1
},
/turf/simulated/floor/plating,
/area/station/security/range)
"cjy" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/plating,
@@ -40863,9 +40882,6 @@
icon_state = "4-8"
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
@@ -40901,10 +40917,13 @@
d2 = 8;
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 1
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"clf" = (
@@ -41413,7 +41432,6 @@
icon_state = "1-2"
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"cmC" = (
@@ -41437,18 +41455,8 @@
/turf/simulated/floor/plating,
/area/station/security/range)
"cmF" = (
/obj/structure/table/reinforced,
/obj/machinery/alarm/directional/south,
/obj/item/gun/energy/laser/practice,
/obj/item/gun/energy/laser/practice,
/obj/item/clothing/ears/earmuffs,
/obj/item/clothing/ears/earmuffs,
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
},
/obj/effect/turf_decal/stripes/line{
dir = 6
},
/obj/machinery/nuclearbomb/training,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"cmG" = (
@@ -44275,13 +44283,6 @@
icon_state = "neutralfull"
},
/area/station/hallway/primary/starboard/south)
"cut" = (
/obj/machinery/light,
/obj/structure/sign/securearea{
pixel_y = -32
},
/turf/simulated/floor/plating,
/area/station/security/range)
"cuu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -59862,6 +59863,14 @@
icon_state = "whitebluefull"
},
/area/station/maintenance/starboard)
"dxV" = (
/obj/structure/table/reinforced,
/obj/item/gun/energy/laser/practice,
/obj/item/gun/energy/laser/practice,
/obj/item/clothing/ears/earmuffs,
/obj/item/clothing/ears/earmuffs,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"dyb" = (
/turf/simulated/floor/plating,
/area/station/maintenance/theatre)
@@ -67079,6 +67088,23 @@
/obj/structure/cable,
/turf/simulated/floor/plasteel/white,
/area/station/science/explab)
"eOg" = (
/obj/structure/table/reinforced,
/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/item/clothing/head/welding{
pixel_x = 9;
pixel_y = 10
},
/obj/item/multitool{
pixel_x = -6;
pixel_y = 8
},
/obj/item/storage/toolbox/mechanical{
pixel_y = -2;
pixel_x = -3
},
/turf/simulated/floor/plasteel,
/area/station/security/range)
"eOt" = (
/obj/structure/table/glass,
/obj/structure/cable{
@@ -69896,6 +69922,19 @@
dir = 5
},
/area/space/nearstation)
"gAP" = (
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"gAR" = (
/obj/structure/closet/wardrobe/pjs,
/obj/structure/cable{
@@ -80599,7 +80638,6 @@
"ngl" = (
/obj/structure/table,
/obj/item/storage/fancy/donut_box,
/obj/item/toy/figure/crew/secofficer,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -92501,7 +92539,8 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/turf/simulated/floor/plating,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel,
/area/station/security/range)
"tVV" = (
/turf/simulated/floor/plasteel{
@@ -152270,9 +152309,9 @@ cgr
hFc
cgr
jIs
cjv
iCU
cjv
eOg
gAP
bDD
cjr
brS
bHF
@@ -152529,7 +152568,7 @@ ccL
jIs
cjw
tVO
cjz
dxV
cjr
eeN
lnU
@@ -152784,9 +152823,9 @@ ccM
ceC
cgo
jIs
cjx
tVO
cut
cjv
iCU
cjv
cjr
cpa
cqI
+153 -46
View File
@@ -47039,13 +47039,25 @@
/turf/simulated/floor/wood,
/area/station/service/bar)
"exm" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable{
d2 = 8;
icon_state = "0-8"
/obj/machinery/door/airlock/security/glass,
/obj/effect/mapping_helpers/airlock/autoname,
/obj/effect/mapping_helpers/airlock/access/any/security/general,
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
/turf/simulated/floor/plating,
/area/station/security/main)
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/turf/simulated/floor/plasteel{
icon_state = "redfull"
},
/area/station/security/defusal)
"exI" = (
/obj/structure/table/glass,
/obj/item/hand_labeler,
@@ -48601,6 +48613,37 @@
},
/turf/simulated/floor/carpet,
/area/station/legal/lawoffice)
"ffH" = (
/obj/item/disk/nuclear/training{
pixel_y = -2;
pixel_x = -7
},
/obj/item/paper/nuclear_guide_spacing{
pixel_x = 10;
pixel_y = 7
},
/obj/item/paper/nuclear_guide_defusing{
pixel_x = 9;
pixel_y = 4
},
/obj/item/disk/nuclear/training{
pixel_x = -5
},
/obj/item/paper/nuclear_guide_operating{
pixel_x = 8;
pixel_y = 1
},
/obj/structure/table,
/obj/machinery/camera{
c_tag = "Defusal Workshop"
},
/obj/machinery/firealarm{
dir = 4;
pixel_x = 24;
name = "east bump"
},
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"fga" = (
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment{
@@ -49971,6 +50014,24 @@
/obj/effect/decal/cleanable/blood,
/turf/simulated/floor/bluegrid,
/area/station/maintenance/starboard)
"fFo" = (
/obj/structure/table,
/obj/item/radio/intercom{
name = "south bump";
pixel_y = -28
},
/obj/item/clothing/head/welding{
pixel_x = -4;
pixel_y = 19
},
/obj/item/multitool{
pixel_x = 7;
pixel_y = 13
},
/obj/item/storage/toolbox/mechanical,
/obj/machinery/alarm/directional/east,
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"fFL" = (
/obj/machinery/atmospherics/meter,
/obj/machinery/atmospherics/pipe/simple/visible/yellow,
@@ -50216,12 +50277,12 @@
/area/station/hallway/primary/central/north)
"fJr" = (
/obj/machinery/disposal,
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/structure/disposalpipe/trunk,
/obj/structure/cable{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/turf/simulated/floor/plasteel{
icon_state = "darkred"
},
@@ -59769,6 +59830,23 @@
"jKj" = (
/turf/simulated/wall/r_wall,
/area/station/engineering/ai_transit_tube)
"jKG" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "red"
},
/area/station/security/defusal)
"jKP" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -60570,6 +60648,14 @@
},
/turf/simulated/floor/plating,
/area/station/medical/virology)
"jXY" = (
/obj/machinery/nuclearbomb/training,
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "red"
},
/area/station/security/defusal)
"jYj" = (
/obj/machinery/atmospherics/pipe/manifold/visible/cyan{
dir = 8;
@@ -69542,6 +69628,9 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/external,
/turf/simulated/floor/plating,
/area/station/engineering/control)
"nEV" = (
/turf/simulated/wall/r_wall,
/area/station/security/defusal)
"nFf" = (
/obj/structure/table/glass,
/obj/item/reagent_containers/dropper,
@@ -79380,6 +79469,21 @@
icon_state = "dark"
},
/area/station/security/permabrig)
"rOj" = (
/obj/machinery/syndicatebomb/training,
/obj/machinery/light_switch{
dir = 4;
name = "west bump";
pixel_x = -24
},
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
},
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "red"
},
/area/station/security/defusal)
"rOp" = (
/obj/machinery/door/airlock/tranquillite{
name = "Old Mime's Storage"
@@ -79608,6 +79712,22 @@
icon_state = "whitebluefull"
},
/area/station/medical/exam_room)
"rUg" = (
/obj/structure/table,
/obj/machinery/light{
dir = 4
},
/obj/item/book/manual/wiki/hacking{
pixel_x = 3;
pixel_y = 3
},
/obj/machinery/power/apc/directional/east,
/obj/structure/cable{
d2 = 8;
icon_state = "0-8"
},
/turf/simulated/floor/plasteel,
/area/station/security/defusal)
"rUl" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/heat_exchanging{
@@ -83827,10 +83947,6 @@
icon_state = "cafeteria"
},
/area/station/service/kitchen)
"tNe" = (
/obj/effect/spawner/random_spawners/wall_rusted_probably,
/turf/simulated/wall/r_wall,
/area/station/maintenance/fore)
"tNg" = (
/obj/machinery/door/firedoor,
/turf/simulated/floor/plasteel{
@@ -88699,15 +88815,6 @@
},
/area/station/medical/surgery/observation)
"vVR" = (
/obj/structure/table,
/obj/item/screwdriver{
pixel_x = -2;
pixel_y = 18
},
/obj/item/wirecutters{
pixel_y = 5
},
/obj/machinery/syndicatebomb/training,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "red"
@@ -124916,7 +125023,7 @@ aaa
aaa
laH
aaa
apO
sRw
fJr
hwP
vgv
@@ -125174,11 +125281,11 @@ aaa
laH
abq
apO
jSU
apO
nEV
nEV
exm
apO
apO
nEV
nEV
xyP
apO
apO
@@ -125431,11 +125538,11 @@ aaa
aaa
aaa
laH
aaa
aaa
aaa
aaa
tNe
nEV
jXY
jKG
rOj
nEV
oQV
ajg
jiR
@@ -125688,11 +125795,11 @@ aaa
aaa
aaa
laH
aaa
aaa
aaa
aaa
ahH
nEV
ffH
rUg
fFo
nEV
alW
akR
aDY
@@ -125945,11 +126052,11 @@ aaa
aaa
aaa
laH
aaa
aaa
aaa
aaa
ahH
nEV
nEV
nEV
nEV
nEV
aDY
wLB
cnV
@@ -126207,8 +126314,8 @@ abq
abq
abq
ajg
ajg
aVY
ahH
ahH
ajg
aWv
cXu
+5 -3
View File
@@ -46,9 +46,11 @@
#define WIRE_BOMB_ACTIVATE "Activate" // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut.
// Nuclear bomb
#define WIRE_BOMB_LIGHT "Bomb Light"
#define WIRE_BOMB_TIMING "Bomb Timing"
#define WIRE_BOMB_SAFETY "Bomb Safety"
#define WIRE_NUKE_SAFETY "Safety"
#define WIRE_NUKE_DETONATOR "Detonator"
#define WIRE_NUKE_DISARM "Disarm"
#define WIRE_NUKE_LIGHT "Lights"
#define WIRE_NUKE_CONTROL "Control Panel"
// Particle accelerator
#define WIRE_PARTICLE_POWER "Power Toggle" // Toggles whether the PA is on or not.
+3
View File
@@ -35,6 +35,9 @@ GLOBAL_LIST_EMPTY(beacons)
GLOBAL_LIST_EMPTY(shuttle_caller_list) //list of all communication consoles, comms consoles circuit and AIs, for automatic shuttle calls when there are none.
GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
GLOBAL_LIST_EMPTY(pinpointer_list) //list of all pinpointers. Used to change stuff they are pointing to all at once.
GLOBAL_LIST_EMPTY(nuke_list) //list of (real) nukes
GLOBAL_LIST_EMPTY(syndi_nuke_list) //list of syndicate nukes
GLOBAL_LIST_EMPTY(nad_list) //list of (real) nuclear authentication disks
GLOBAL_LIST_EMPTY(nuclear_uplink_list) //list of all existing nuke ops uplinks
GLOBAL_LIST_EMPTY(abductor_equipment) //list of all abductor equipment
GLOBAL_LIST_EMPTY(global_intercoms) //list of all intercomms, across all z-levels
+50 -24
View File
@@ -1,11 +1,12 @@
/datum/wires/nuclearbomb
holder_type = /obj/machinery/nuclearbomb
labelled = TRUE
randomize = TRUE
wire_count = 7 // 3 actual, 4 duds.
wire_count = 5
proper_name = "Nuclear bomb"
/datum/wires/nuclearbomb/New(atom/_holder)
wires = list(WIRE_BOMB_LIGHT, WIRE_BOMB_TIMING, WIRE_BOMB_SAFETY)
wires = list(WIRE_NUKE_SAFETY, WIRE_NUKE_DETONATOR, WIRE_NUKE_DISARM, WIRE_NUKE_LIGHT, WIRE_NUKE_CONTROL)
return ..()
/datum/wires/nuclearbomb/interactable(mob/user)
@@ -18,39 +19,64 @@
. = ..()
var/obj/machinery/nuclearbomb/N = holder
. += "The device is [N.timing ? "shaking!" : "still."]"
. += "The device is [N.safety ? "quiet" : "whirring"]."
. += "The lights are [N.lighthack ? "static" : "functional"]."
. += "The control panel is [is_cut(WIRE_NUKE_CONTROL) ? "turned off" : "functional"]."
. += "The disarm controls are [is_cut(WIRE_NUKE_DISARM) || is_cut(WIRE_NUKE_CONTROL) ? "disabled" : "functional"]."
. += "The safety controls are [is_cut(WIRE_NUKE_SAFETY) || is_cut(WIRE_NUKE_CONTROL) ? "disabled" : "functional"]."
. += "The lights are [is_cut(WIRE_NUKE_LIGHT) ? "static" : "functional"]."
/datum/wires/nuclearbomb/on_pulse(wire)
var/obj/machinery/nuclearbomb/N = holder
switch(wire)
if(WIRE_BOMB_LIGHT)
N.lighthack = !N.lighthack
addtimer(CALLBACK(N, TYPE_PROC_REF(/obj/machinery/nuclearbomb, reset_lighthack_callback)), 10 SECONDS)
if(WIRE_NUKE_SAFETY)
if(!is_cut(WIRE_NUKE_CONTROL))
N.audible_message("<span class='notice'>The safety controls flicker.</span>", hearing_distance = 1)
if(WIRE_BOMB_TIMING)
if(WIRE_NUKE_DETONATOR)
if(N.timing)
message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (<A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[holder.x];Y=[holder.y];Z=[holder.z]'>JMP</a>)")
if(!N.training)
message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonator wire, causing it to explode (<a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[holder.x];Y=[holder.y];Z=[holder.z]'>JMP</a>)")
N.explode()
else
N.audible_message("<span class='warning'>[N] whirrs ominously.</span>", hearing_distance = 1)
if(WIRE_BOMB_SAFETY)
N.safety = !N.safety
addtimer(CALLBACK(N, TYPE_PROC_REF(/obj/machinery/nuclearbomb, reset_safety_callback)), 10 SECONDS)
if(WIRE_NUKE_DISARM)
if(N.timing && is_cut(WIRE_NUKE_CONTROL))
if(!is_cut(WIRE_NUKE_LIGHT))
N.icon_state = N.sprite_prefix + "nuclearbomb1"
N.timing = FALSE
N.audible_message("<span class='boldnotice'>The timer on [N] stops!</span>", hearing_distance = 1)
N.update_icon(UPDATE_OVERLAYS)
if(!N.training)
GLOB.bomb_set = FALSE
if(!N.is_syndicate && !N.training)
SSsecurity_level.set_level(N.previous_level)
else if(N.timing && !is_cut(WIRE_NUKE_CONTROL))
N.audible_message("<span class='boldnotice'>The disarm controls flash with an error. You need to disable the control panel first!</span>", hearing_distance = 1)
else if(!is_cut(WIRE_NUKE_CONTROL))
N.audible_message("<span class='notice'>The disarm controls flicker.</span>", hearing_distance = 1)
if(WIRE_NUKE_LIGHT)
N.audible_message("<span class='notice'>The lights on [N] flicker.</span>", hearing_distance = 1)
flick(N.sprite_prefix + "nuclearbombc", N)
if(WIRE_NUKE_CONTROL)
N.audible_message("<span class='notice'>[N]'s control panel flickers.</span>", hearing_distance = 1)
/datum/wires/nuclearbomb/on_cut(wire, mend)
var/obj/machinery/nuclearbomb/N = holder
switch(wire)
if(WIRE_BOMB_SAFETY)
if(N.timing)
message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (<A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[holder.x];Y=[holder.y];Z=[holder.z]'>JMP</a>)")
if(WIRE_NUKE_DETONATOR)
if(N.timing && !mend)
if(!N.training)
message_admins("[key_name_admin(usr)] cut a nuclear bomb's detonator wire, causing it to explode (<a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[holder.x];Y=[holder.y];Z=[holder.z]'>JMP</a>)")
N.explode()
if(WIRE_BOMB_TIMING)
if(!N.lighthack)
if(N.icon_state == "nuclearbomb2")
N.icon_state = "nuclearbomb1"
N.timing = FALSE
GLOB.bomb_set = FALSE
if(WIRE_BOMB_LIGHT)
N.lighthack = !N.lighthack
if(WIRE_NUKE_LIGHT)
if(!mend)
N.icon_state = N.sprite_prefix + "nuclearbomb0"
if(mend)
if(N.timing)
N.icon_state = N.sprite_prefix + "nuclearbomb2"
else
N.icon_state = N.sprite_prefix + "nuclearbomb1"
N.update_icon(UPDATE_OVERLAYS)
+4
View File
@@ -2,6 +2,8 @@
/datum/wires
/// TRUE if the wires will be different every time a new wire datum is created.
var/randomize = FALSE
/// TRUE if the wires are labelled for every user
var/labelled = FALSE
/// The atom the wires belong too. For example: an airlock.
var/atom/holder
/// The holder type; used to make sure that the holder is the correct type.
@@ -281,6 +283,8 @@
var/can_probably_see_wires = FALSE
var/obj/item/held_item = user.get_active_hand()
var/obj/item/offhand = user.get_inactive_hand()
if(labelled)
can_probably_see_wires = TRUE
if(istype(held_item) && HAS_TRAIT(held_item, TRAIT_SHOW_WIRE_INFO))
can_probably_see_wires = TRUE
if(istype(offhand) && HAS_TRAIT(offhand, TRAIT_SHOW_WIRE_INFO))
@@ -106,6 +106,10 @@
name = "\improper Firing Range"
icon_state = "firingrange"
/area/station/security/defusal
name = "\improper Defusal Workshop"
icon_state = "defusal"
// Checkpoints
/area/station/security/checkpoint
+153 -62
View File
@@ -15,7 +15,7 @@ GLOBAL_VAR(bomb_set)
name = "\improper Nuclear Fission Explosive"
desc = "Uh oh. RUN!!!!"
icon = 'icons/obj/nuclearbomb.dmi'
icon_state = "nuclearbomb0"
icon_state = "nuclearbomb1"
density = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags_2 = NO_MALF_EFFECT_2 | CRITICAL_ATOM_2
@@ -25,8 +25,6 @@ GLOBAL_VAR(bomb_set)
/// Are our bolts *supposed* to be in the floor, may not actually cause anchoring if the bolts are cut
var/extended = TRUE
/// If true, prevents the lights on the nuke
var/lighthack = FALSE
/// Countdown to boom
var/timeleft = 120
/// Are we counting down?
@@ -55,6 +53,10 @@ GLOBAL_VAR(bomb_set)
var/core_stage = NUKE_CORE_EVERYTHING_FINE
///How many sheets of various metals we need to fix it
var/sheets_to_fix = 5
/// Is this a training bomb?
var/training = FALSE
/// Prefix to add, if any, on icon states for this bomb
var/sprite_prefix = ""
///Bombs Internal Radio
var/obj/item/radio/radio
@@ -70,9 +72,10 @@ GLOBAL_VAR(bomb_set)
. = ..()
r_code = rand(10000, 99999) // Creates a random code upon object spawn.
wires = new/datum/wires/nuclearbomb(src)
ADD_TRAIT(src, TRAIT_OBSCURED_WIRES, ROUNDSTART_TRAIT)
previous_level = SSsecurity_level.get_current_level_as_text()
GLOB.poi_list |= src
if(!training)
GLOB.poi_list |= src
GLOB.nuke_list |= src
core = new /obj/item/nuke_core/plutonium(src)
STOP_PROCESSING(SSobj, core) //Let us not irradiate the vault by default.
update_icon(UPDATE_OVERLAYS)
@@ -81,14 +84,26 @@ GLOBAL_VAR(bomb_set)
radio.follow_target = src
radio.config(list("Special Ops" = 0))
/obj/machinery/nuclearbomb/syndicate/Initialize()
. = ..()
wires.labelled = FALSE
ADD_TRAIT(src, TRAIT_OBSCURED_WIRES, ROUNDSTART_TRAIT)
GLOB.syndi_nuke_list |= src
/obj/machinery/nuclearbomb/Destroy()
SStgui.close_uis(wires)
QDEL_NULL(wires)
QDEL_NULL(core)
QDEL_NULL(radio)
GLOB.poi_list.Remove(src)
if(!training)
GLOB.poi_list.Remove(src)
GLOB.nuke_list.Remove(src)
return ..()
/obj/machinery/nuclearbomb/syndicate/Destroy()
GLOB.syndi_nuke_list.Remove(src)
. = ..()
/obj/machinery/nuclearbomb/process()
if(timing)
GLOB.bomb_set = TRUE // So long as there is one nuke timing, it means one nuke is armed.
@@ -99,6 +114,8 @@ GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb/examine(mob/user)
. = ..()
if(training)
. += "<span class='notice'><b>Alt-Click</b> to reset the bomb.</span>"
if(!panel_open)
. += "<span class='notice'>The outer panel is <b>screwed shut</b>.</span>"
switch(removal_stage)
@@ -126,15 +143,15 @@ GLOBAL_VAR(bomb_set)
underlays.Cut()
set_light(0)
if(!lighthack)
underlays += emissive_appearance(icon, "nuclearbomb_lightmask")
if(!wires.is_cut(WIRE_NUKE_LIGHT))
underlays += emissive_appearance(icon, sprite_prefix + "nukelights_lightmask")
set_light(1, LIGHTING_MINIMUM_POWER)
if(panel_open)
. += "hackpanel_open"
. += sprite_prefix + "hackpanel_open"
if(anchored) // Using anchored due to removal_stage deanchoring having multiple steps
. += "nukebolts"
. += sprite_prefix + "nukebolts"
// Selected stage lets us show the open core, even if the front panel is closed
var/selected_stage = removal_stage
@@ -151,6 +168,12 @@ GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/disk/nuclear))
if(extended)
if(auth)
to_chat(user, "<span class='warning'>There's already a disk in the slot!</span>")
return
if((istype(O, /obj/item/disk/nuclear/training) && !training) || (training && !istype(O, /obj/item/disk/nuclear/training)))
to_chat(user, "<span class='warning'>[O] doesn't fit into [src]!</span>")
return
if(!user.drop_item())
to_chat(user, "<span class='notice'>[O] is stuck to your hand!</span>")
return
@@ -212,12 +235,15 @@ GLOBAL_VAR(bomb_set)
if(!I.tool_use_check(user, 0))
return
if(removal_stage == NUKE_COVER_OFF)
user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...")
user.visible_message("<span class='notice'>[user] starts forcing open the bolt covers on [src].</span>", "<span class='notice'>You start forcing open the anchoring bolt covers with [I]...</span>")
if(!I.use_tool(src, user, 15, volume = I.tool_volume) || removal_stage != NUKE_COVER_OFF)
return
user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.")
user.visible_message("<span class='notice'>[user] forces open the bolt covers on [src].</span>", "<span class='notice'>You force open the bolt covers.</span>")
removal_stage = NUKE_COVER_OPEN
if(removal_stage == NUKE_CORE_EVERYTHING_FINE)
if(training)
to_chat(user, "<span class='notice'>This is where you'd take off the plate to access the internal core, but this training bomb doesn't have one.</span>")
return
user.visible_message("<span class='notice'>[user] starts removing [src]'s outer core plate...</span>", "<span class='notice'>You start removing [src]'s outer core plate...</span>")
if(!I.use_tool(src, user, 4 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_CORE_EVERYTHING_FINE)
return
@@ -235,10 +261,10 @@ GLOBAL_VAR(bomb_set)
if(core)
START_PROCESSING(SSobj, core)
if(removal_stage == NUKE_UNWRENCHED)
user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...")
user.visible_message("<span class='notice'>[user] begins lifting [src] off of the anchors.</span>", "<span class='notice'>You begin lifting the device off the anchors...</span>")
if(!I.use_tool(src, user, 8 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED)
return
user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!")
user.visible_message("<span class='notice'>[user] crowbars [src] off of the anchors. It can now be moved.</span>", "<span class='notice'>You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!</span>")
anchored = FALSE
removal_stage = NUKE_MOBILE
update_icon(UPDATE_OVERLAYS)
@@ -251,10 +277,10 @@ GLOBAL_VAR(bomb_set)
. = TRUE
if(!I.tool_use_check(user, 0))
return
user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...")
user.visible_message("<span class='notice'>[user] begins unwrenching the anchoring bolts on [src].</span>", "<span class='notice'>You begin unwrenching the anchoring bolts...</span>")
if(!I.use_tool(src, user, 50, volume = I.tool_volume) || removal_stage != NUKE_SEALANT_OPEN)
return
user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.")
user.visible_message("<span class='notice'>[user] unwrenches the anchoring bolts on [src].</span>", "<span class='notice'>You unwrench the anchoring bolts.</span>")
removal_stage = NUKE_UNWRENCHED
update_icon(UPDATE_OVERLAYS)
@@ -273,23 +299,23 @@ GLOBAL_VAR(bomb_set)
if(auth || (istype(I, /obj/item/screwdriver/nuke) && !is_syndicate))
if(!panel_open)
panel_open = TRUE
to_chat(user, "You unscrew the control panel of [src].")
to_chat(user, "<span class='notice'>You unscrew the control panel of [src].</span>")
anchor_stage = removal_stage
removal_stage = core_stage
else
panel_open = FALSE
to_chat(user, "You screw the control panel of [src] back on.")
to_chat(user, "<span class='notice'>You screw the control panel of [src] back on.</span>")
core_stage = removal_stage
removal_stage = anchor_stage
else
if(!panel_open)
to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.")
to_chat(user, "<span class='warning'>[src] emits a buzzing noise, the panel staying locked in.</span>")
if(panel_open)
panel_open = FALSE
to_chat(user, "You screw the control panel of [src] back on.")
to_chat(user, "<span class='notice'>You screw the control panel of [src] back on.</span>")
core_stage = removal_stage
removal_stage = anchor_stage
flick("nuclearbombc", src)
flick(sprite_prefix + "nuclearbombc", src)
update_icon(UPDATE_OVERLAYS)
/obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I)
@@ -397,6 +423,8 @@ GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb/proc/is_auth(mob/user)
if(auth)
if(istype(auth, /obj/item/disk/nuclear/training) && !training)
return FALSE
return TRUE
else if(user.can_admin_interact())
return TRUE
@@ -409,6 +437,9 @@ GLOBAL_VAR(bomb_set)
. = TRUE
if(exploded)
return
if(wires.is_cut(WIRE_NUKE_CONTROL))
to_chat(usr, "<span class='warning'>The control panel isn't responding! Something must be wrong with its wiring!</span>")
return FALSE
switch(action)
if("deploy")
if(removal_stage != NUKE_MOBILE)
@@ -416,9 +447,9 @@ GLOBAL_VAR(bomb_set)
visible_message("<span class='warning'>With a steely snap, bolts slide out of [src] and anchor it to the flooring!</span>")
else
visible_message("<span class='warning'>[src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.</span>")
if(!lighthack)
flick("nuclearbombc", src)
icon_state = "nuclearbomb1"
if(!wires.is_cut(WIRE_NUKE_LIGHT))
flick(sprite_prefix + "nuclearbombc", src)
icon_state = sprite_prefix + "nuclearbomb1"
update_icon(UPDATE_OVERLAYS)
extended = TRUE
return
@@ -433,6 +464,8 @@ GLOBAL_VAR(bomb_set)
else
var/obj/item/I = usr.get_active_hand()
if(istype(I, /obj/item/disk/nuclear))
if((istype(I, /obj/item/disk/nuclear/training) && !training) || (training && !istype(I, /obj/item/disk/nuclear/training)))
return
usr.drop_item()
I.forceMove(src)
auth = I
@@ -491,43 +524,57 @@ GLOBAL_VAR(bomb_set)
return
timeleft = time
if("toggle_safety")
if(wires.is_cut(WIRE_NUKE_SAFETY))
to_chat(usr, "<span class='warning'>The safety isn't responding! Something must be wrong with its wiring!</span>")
return FALSE
safety = !(safety)
if(safety)
if(!is_syndicate)
if(!is_syndicate && !training)
SSsecurity_level.set_level(previous_level)
timing = FALSE
GLOB.bomb_set = FALSE
if(!training)
GLOB.bomb_set = FALSE
if("toggle_armed")
if(safety)
to_chat(usr, "<span class='notice'>The safety is still on.</span>")
return
if(!core)
if(!core && !training)
to_chat(usr, "<span class='danger'>[src]'s screen blinks red! There is no plutonium core in [src]!</span>")
return
timing = !(timing)
if(timing)
if(!lighthack)
icon_state = "nuclearbomb2"
if(!timing)
if(wires.is_cut(WIRE_NUKE_DETONATOR))
to_chat(usr, "<span class='warning'>[src] isn't arming! Something must be wrong with its wiring!</span>")
return FALSE
timing = TRUE
if(!wires.is_cut(WIRE_NUKE_LIGHT))
icon_state = sprite_prefix + "nuclearbomb2"
update_icon(UPDATE_OVERLAYS)
if(!safety)
if(!safety && !training)
message_admins("[key_name_admin(usr)] engaged a nuclear bomb [ADMIN_JMP(src)]")
if(!is_syndicate && SSsecurity_level.get_current_level_as_number() != SEC_LEVEL_EPSILON)
SSsecurity_level.set_level(SEC_LEVEL_DELTA)
GLOB.bomb_set = TRUE // There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke
if(SSsecurity_level.get_current_level_as_number() == SEC_LEVEL_EPSILON)
radio.autosay("<span class='reallybig'>The Nuclear Bomb has been armed, retreat from the station immediately!</span>", name, "Special Ops")
else
else if(!training)
GLOB.bomb_set = TRUE
else
if(!is_syndicate)
if(wires.is_cut(WIRE_NUKE_DISARM))
to_chat(usr, "<span class='warning'>[src] isn't disarming! Something must be wrong with its wiring!</span>")
return FALSE
timing = FALSE
if(!is_syndicate && !training)
SSsecurity_level.set_level(previous_level)
GLOB.bomb_set = FALSE
if(!lighthack)
icon_state = "nuclearbomb1"
if(!training)
GLOB.bomb_set = FALSE
if(!wires.is_cut(WIRE_NUKE_LIGHT))
icon_state = sprite_prefix + "nuclearbomb1"
update_icon(UPDATE_OVERLAYS)
/obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B)
if(training)
qdel(src)
return
if(exploded)
return
if(timing) //boom
@@ -567,16 +614,19 @@ GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb/proc/explode()
if(training)
atom_say("You've triggered the detonate wire. You are dead.")
return
if(safety)
timing = FALSE
return
exploded = TRUE
yes_code = FALSE
safety = TRUE
if(!lighthack)
icon_state = "nuclearbomb3"
if(!wires.is_cut(WIRE_NUKE_LIGHT))
icon_state = sprite_prefix + "nuclearbomb3"
update_icon(UPDATE_OVERLAYS)
playsound(src,'sound/machines/alarm.ogg',100,0,5)
playsound(src, 'sound/machines/alarm.ogg', 100, FALSE, 5)
if(SSticker && SSticker.mode)
SSticker.mode.explosion_in_progress = TRUE
SSticker.event_blackbox(outcome = ROUND_END_NUCLEAR)
@@ -618,23 +668,6 @@ GLOBAL_VAR(bomb_set)
return
return
/obj/machinery/nuclearbomb/proc/reset_lighthack_callback()
lighthack = !lighthack
/obj/machinery/nuclearbomb/proc/reset_safety_callback()
safety = !safety
if(safety == 1)
if(!is_syndicate)
SSsecurity_level.set_level(previous_level)
visible_message("<span class='notice'>[src] quiets down.</span>")
if(!lighthack)
if(icon_state == "nuclearbomb2")
icon_state = "nuclearbomb1"
update_icon(UPDATE_OVERLAYS)
else
visible_message("<span class='notice'>[src] emits a quiet whirling noise!</span>")
//==========DAT FUKKEN DISK===============
/obj/item/disk/nuclear
name = "nuclear authentication disk"
@@ -645,6 +678,8 @@ GLOBAL_VAR(bomb_set)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/// Is the disk restricted to the station? If true, also respawns the disk when deleted
var/restricted_to_station = TRUE
/// Is this a training disk?
var/training = FALSE
/obj/item/disk/nuclear/unrestricted
name = "unrestricted nuclear authentication disk"
@@ -655,7 +690,9 @@ GLOBAL_VAR(bomb_set)
..()
if(restricted_to_station)
START_PROCESSING(SSobj, src)
GLOB.poi_list |= src
if(!training)
GLOB.poi_list |= src
GLOB.nad_list |= src
/obj/item/disk/nuclear/process()
if(!restricted_to_station)
@@ -682,26 +719,32 @@ GLOBAL_VAR(bomb_set)
/obj/item/disk/nuclear/Destroy(force)
var/turf/diskturf = get_turf(src)
if(training)
return ..()
if(force)
message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[diskturf.x];Y=[diskturf.y];Z=[diskturf.z]'>JMP</a>":"nonexistent location"]).")
message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - <a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[diskturf.x];Y=[diskturf.y];Z=[diskturf.z]'>JMP</a>":"nonexistent location"]).")
log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).")
GLOB.poi_list.Remove(src)
GLOB.nad_list.Remove(src)
STOP_PROCESSING(SSobj, src)
return ..()
if(!restricted_to_station) // Non-restricted NADs should be allowed to be deleted, otherwise it becomes a restricted NAD when teleported
message_admins("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[diskturf.x];Y=[diskturf.y];Z=[diskturf.z]'>JMP</a>":"nonexistent location"]). It will not respawn.")
message_admins("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - <a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[diskturf.x];Y=[diskturf.y];Z=[diskturf.z]'>JMP</a>":"nonexistent location"]). It will not respawn.")
log_game("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]). It will not respawn.")
GLOB.poi_list.Remove(src)
GLOB.nad_list.Remove(src)
STOP_PROCESSING(SSobj, src)
return ..()
var/turf/new_spawn = find_respawn()
if(new_spawn)
GLOB.poi_list.Remove(src)
GLOB.nad_list.Remove(src)
var/obj/item/disk/nuclear/NEWDISK = new(new_spawn)
transfer_fingerprints_to(NEWDISK)
message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[diskturf.x];Y=[diskturf.y];Z=[diskturf.z]'>JMP</a>). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[NEWDISK.x];Y=[NEWDISK.y];Z=[NEWDISK.z]'>JMP</a>).")
message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - <a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[diskturf.x];Y=[diskturf.y];Z=[diskturf.z]'>JMP</a>). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - <a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[NEWDISK.x];Y=[NEWDISK.y];Z=[NEWDISK.z]'>JMP</a>).")
log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y], [diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
..()
return QDEL_HINT_HARDDEL_NOW // We want this to be deleted ASAP, but we want refs properly cleared too
@@ -720,6 +763,54 @@ GLOBAL_VAR(bomb_set)
if(length(open_turfs))
return pick(open_turfs)
/// MARK: TRAINING NUKE
/obj/machinery/nuclearbomb/training
name = "training nuclear bomb"
desc = "A fake nuke used to practice nuclear device operations. \
The '1' key on the keypad appears to be significantly more worn than the other keys."
icon_state = "t_nuclearbomb1"
resistance_flags = null
training = TRUE
sprite_prefix = "t_"
/obj/machinery/nuclearbomb/training/Initialize()
. = ..()
r_code = 11111 //Uuh.. one!
qdel(core)
/obj/machinery/nuclearbomb/training/process()
if(timing)
timeleft = max(timeleft - 2, 0) // 2 seconds per process()
if(timeleft <= 0)
INVOKE_ASYNC(src, PROC_REF(training_detonation))
/obj/machinery/nuclearbomb/training/blob_act(obj/structure/blob/B)
qdel(src)
/obj/machinery/nuclearbomb/training/AltClick(mob/user)
. = ..()
to_chat(user, "<span class='notice'>You hit the reset button on [src].</span>")
training_reset()
/obj/machinery/nuclearbomb/training/proc/training_detonation()
atom_say("Nuclear device detonated. Resetting...")
training_reset()
/obj/machinery/nuclearbomb/training/proc/training_reset()
if(auth)
auth.forceMove(get_turf(src))
new /obj/machinery/nuclearbomb/training(get_turf(src))
qdel(src)
/obj/item/disk/nuclear/training
name = "training authentication disk"
desc = "The code is 11111."
icon_state = "trainingdisk"
resistance_flags = null
restricted_to_station = FALSE
training = TRUE
#undef NUKE_INTACT
#undef NUKE_COVER_OFF
#undef NUKE_COVER_OPEN
+3 -3
View File
@@ -96,15 +96,15 @@
/obj/item/pinpointer/proc/scandisk()
if(!the_disk)
the_disk = locate() in GLOB.poi_list
the_disk = locate() in GLOB.nad_list
/obj/item/pinpointer/proc/scanbomb()
if(!syndicate)
if(!the_bomb)
the_bomb = locate() in GLOB.poi_list
the_bomb = locate() in GLOB.nuke_list
else
if(!the_s_bomb)
the_s_bomb = locate() in GLOB.poi_list
the_s_bomb = locate() in GLOB.syndi_nuke_list
/obj/item/pinpointer/proc/point_at_target(atom/target)
if(!target)
+5
View File
@@ -106,6 +106,11 @@
protected_jobs = list("Captain")
location_override = "the Captain's Office"
/datum/theft_objective/nukedisc/check_special_completion(obj/item/I)
if(istype(I, /obj/item/disk/nuclear/training)) //Haha no
return FALSE
return TRUE
/datum/theft_objective/reactive
name = "any type of reactive armor"
typepath = /obj/item/clothing/suit/armor/reactive
+36
View File
@@ -660,6 +660,42 @@
header = "<p><img style='display: block; margin-left: auto; margin-right: auto;' src='ntlogo.png' width='220' height='135' /></p><hr />"
info = ""
/obj/item/paper/nuclear_guide_operating
name = "nuclear guide : 'Operating the Nuclear Device'"
info = "<b>ARMING THE NUCLEAR DEVICE</b><hr /> \
1. Insert the NAD. <br> \
2. Enter the code provided by Central Command. For this training device, the code is 11111.<br> \
3. (Optional) Set a specific timer for detonation. Default and minimum is 2 minutes.<br> \
4. Disable the safety.<br> \
5. Arm the nuclear device.<br> \
6. Take out the NAD to ensure the device stays armed.<hr /> \
<b>DISARMING THE NUCLEAR DEVICE</b><hr /> \
Follow step 1 and 2, then hit the disarm. If you have the NAD but don't know the code, refer to the Defusing guide. If you have neither, refer to the Spacing guide."
/obj/item/paper/nuclear_guide_defusing
name = "nuclear guide : 'Defusing the Nuclear Device'"
info = "<b>DEFUSING THE NUCLEAR DEVICE</b><hr /> \
<b>IF YOU DON'T HAVE THE NAD :</b> Refer to the Spacing guide, you cannot defuse the nuclear device.<hr /> \
1. Insert the NAD. <br> \
2. Use a SCREWDRIVER and open the device's panel.<br> \
3. CUT the CONTROL wire using WIRECUTTERS to short out the control panel and bypass it.<br>\
4. PULSE the DISARM wire using a MULTITOOL to stop the bomb's timer.<hr /> \
<b>WARNING</b> : Nuclear devices deployed by hostile operatives will likely have unlabelled wires.<br> \
PULSING or CUTTING the DETONATOR wire will prematurely detonate the bomb if the timer is active.<br> \
Depending on the timer left on the bomb, try your luck or refer to the Spacing guide."
/obj/item/paper/nuclear_guide_spacing
name = "nuclear guide : 'Spacing the Nuclear Device'"
info = "<b>SPACING THE NUCLEAR DEVICE</b><hr /> \
To be used on assets of hostile operatives only. Any loss of NT nuclear devices following this guide will be charged as Grand Theft per Space Law.<hr /> \
1. Ensure the device's access panel is closed. Use a screwdriver to close it if it isn't. <br> \
2. Use a WELDING TOOL to cut the anchoring bolt covers.<br> \
3. Use a CROWBAR to pry the bolts open.<br> \
4. Use a WELDING TOOL to cut the anchoring system sealant.<br> \
5. Use a WRENCH to unwrench the anchoring bolts.<br> \
6. Use a CROWBAR to pry the nuclear device off its anchors.<br> \
7. DRAG the nuclear device to the closest opening to SPACE, and PUSH it away from the station."
/obj/item/paper/central_command
name = "paper"
header ="<p><img style='display: block; margin-left: auto; margin-right: auto;' src='ntlogo.png' alt='' width='220' height='135' /></p><hr /><h3 style='text-align: center;font-family: Verdana;'><b> Nanotrasen Central Command</h3><p style='text-align: center;font-family:Verdana;'>Official Expedited Memorandum</p></b><hr />"
@@ -51,6 +51,16 @@
build_path = /obj/item/disk/tech_disk
category = list("Miscellaneous")
/datum/design/training_disk
name = "Training Authentification Disk"
desc = "Replacement authentication disk for the nuclear training bomb."
id = "training_nad"
req_tech = list("programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
build_path = /obj/item/disk/nuclear/training
category = list("Miscellaneous")
/datum/design/digital_camera
name = "Digital Camera"
desc = "Produce an enhanced version of the standard issue camera."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB