diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 656507316d..07642f1d08 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -7441,14 +7441,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/crew_quarters/fitness)
-"aqt" = (
-/obj/effect/landmark/syndicate_breach_area,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/crew_quarters/fitness)
"aqu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -14777,7 +14769,6 @@
/turf/open/floor/plating,
/area/chapel/main)
"aHr" = (
-/obj/effect/landmark/marauder_entry,
/turf/open/space,
/area/space)
"aHs" = (
@@ -100719,7 +100710,7 @@ aaa
aaa
aaa
aaa
-aqt
+aqs
aro
aro
aro
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 67107bf501..21180a53bd 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -178,7 +178,6 @@
/turf/open/floor/plasteel/airless/solarpanel,
/area/solar/port/fore)
"aav" = (
-/obj/effect/landmark/marauder_entry,
/turf/open/space,
/area/space)
"aaw" = (
@@ -2225,14 +2224,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/fitness/recreation)
-"aeD" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/effect/landmark/syndicate_breach_area,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/crew_quarters/fitness/recreation)
"aeE" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -129060,7 +129051,7 @@ aaa
aaa
bii
aaa
-aeD
+aeC
afD
afD
afD
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 12d1d8abe7..14282b7ebf 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -38904,7 +38904,7 @@
volume_rate = 200
},
/turf/open/space/basic,
-/area/space)
+/area/engine/engineering)
"bxd" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 05f0897465..72a05373eb 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -5751,6 +5751,10 @@
/obj/structure/mirror{
pixel_x = 28
},
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
/turf/open/floor/plasteel/freezer{
dir = 2
},
@@ -6101,7 +6105,7 @@
/area/syndicate_mothership/control)
"qp" = (
/obj/structure/chair/stool,
-/obj/effect/landmark/syndicate_spawn,
+/obj/effect/landmark/start/nukeop,
/turf/open/floor/plasteel/bar{
dir = 2
},
@@ -6506,6 +6510,7 @@
/area/syndicate_mothership/control)
"rj" = (
/obj/structure/closet/cardboard,
+/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"rk" = (
@@ -7623,7 +7628,7 @@
/turf/open/floor/wood,
/area/syndicate_mothership/control)
"tT" = (
-/obj/effect/landmark/syndicate_spawn,
+/obj/effect/landmark/start/nukeop_leader,
/turf/open/floor/wood,
/area/syndicate_mothership/control)
"tU" = (
@@ -8025,6 +8030,9 @@
/area/syndicate_mothership/control)
"vb" = (
/obj/structure/closet/cardboard/metal,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"vc" = (
@@ -9731,7 +9739,6 @@
/area/wizard_station)
"zj" = (
/obj/structure/table/wood,
-/obj/effect/landmark/teleport_scroll,
/obj/item/dice/d20,
/obj/item/dice,
/turf/open/floor/carpet,
@@ -13652,6 +13659,44 @@
},
/turf/open/floor/holofloor,
/area/holodeck/rec_center/school)
+"QT" = (
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
+"QU" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
+"QV" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
+"QW" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
+"QX" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
+"QY" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
+"QZ" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/syndicate_mothership/control)
(1,1,1) = {"
aa
@@ -34895,7 +34940,7 @@ lG
hm
aa
kl
-qs
+QT
rk
rl
rm
@@ -34903,7 +34948,7 @@ tl
rm
ux
vc
-qs
+QY
kl
aa
aa
@@ -36180,7 +36225,7 @@ hq
hm
aa
kl
-qt
+QU
ro
rm
sd
@@ -36437,7 +36482,7 @@ hq
hm
aa
kl
-qs
+QV
rp
ro
rm
@@ -36445,7 +36490,7 @@ tl
rm
uy
ve
-qs
+QZ
kl
aa
aa
@@ -36695,13 +36740,13 @@ hm
aa
kl
qs
-qs
+QW
se
se
se
se
se
-qs
+QX
qs
kl
aa
@@ -76391,9 +76436,9 @@ dM
QJ
QL
fg
-QO
-QQ
-QR
+QL
+QK
+QL
dM
fN
fQ
@@ -76903,11 +76948,11 @@ dM
QI
dM
QK
-QM
+QL
QN
-QP
+QL
fr
-QS
+QL
dM
fN
ab
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 830a25fb0a..2e0b359fac 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -12,6 +12,7 @@
#define HIGH_TURF_LAYER 2.03
#define ABOVE_OPEN_TURF_LAYER 2.04
#define CLOSED_TURF_LAYER 2.05
+#define BULLET_HOLE_LAYER 2.06
#define ABOVE_NORMAL_TURF_LAYER 2.08
#define LATTICE_LAYER 2.2
#define DISPOSAL_PIPE_LAYER 2.3
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 540ec9fb63..e5478adff4 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -474,7 +474,7 @@
#error Remie said that lummox was adding a way to get a lists
#error contents via list.values, if that is true remove this
#error otherwise, update the version and bug lummox
-#elseif
+#endif
//Flattens a keyed list into a list of it's contents
/proc/flatten_list(list/key_list)
if(!islist(key_list))
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a20cad1cf2..c2398982c2 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -502,28 +502,12 @@ Turf and target are separate in case you want to teleport some distance from a t
var/y=arcsin(x/sqrt(1+x*x))
return y
-/atom/proc/GetAllContents(list/ignore_typecache)
- var/list/processing_list = list(src)
- var/list/assembled = list()
- if(ignore_typecache) //If there's a typecache, use it.
- while(processing_list.len)
- var/atom/A = processing_list[1]
- processing_list -= A
- if(ignore_typecache[A.type])
- continue
- processing_list |= (A.contents - assembled)
- assembled |= A
-
- else //If there's none, only make this check once for performance.
- while(processing_list.len)
- var/atom/A = processing_list[1]
- processing_list -= A
-
- processing_list |= (A.contents - assembled)
-
- assembled |= A
-
- return assembled
+/atom/proc/GetAllContents(list/output=list())
+ . = output
+ output += src
+ for(var/i in 1 to contents.len)
+ var/atom/thing = contents[i]
+ thing.GetAllContents(output)
//Step-towards method of determining whether one atom can see another. Similar to viewers()
/proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index a2d30b1528..d031c01223 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -33,6 +33,8 @@ GLOBAL_LIST_EMPTY(department_security_spawns) //list of all department security
GLOBAL_LIST_EMPTY(generic_event_spawns) //list of all spawns for events
GLOBAL_LIST_EMPTY(wizardstart)
+GLOBAL_LIST_EMPTY(nukeop_start)
+GLOBAL_LIST_EMPTY(nukeop_leader_start)
GLOBAL_LIST_EMPTY(newplayer_start)
GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these
GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here
diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm
index efab785d12..e62884ecbc 100644
--- a/code/citadel/cit_guns.dm
+++ b/code/citadel/cit_guns.dm
@@ -172,6 +172,27 @@
spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
recoil = 1
+///toy memes///
+
+/obj/item/ammo_box/magazine/toy/x9
+ name = "foam force X9 magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9magazine"
+ max_ammo = 30
+ multiple_sprites = 2
+
+/obj/item/gun/ballistic/automatic/x9/toy
+ name = "donksoft X9"
+ desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "toy9"
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = /obj/item/ammo_box/magazine/toy/x9
+ casing_ejector = 0
+ spread = 45 //MAXIMUM XCOM MEMES (actually that'd be 90 spread)
+
+
////////XCOM2 Magpistol/////////
//////projectiles//////
@@ -213,7 +234,7 @@
//////magazines/////
-/obj/item/ammo_box/magazine/mmags
+/obj/item/ammo_box/magazine/mmag/small
name = "magpistol magazine (non-lethal disabler)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "nlmagmag"
@@ -223,7 +244,7 @@
max_ammo = 7
multiple_sprites = 2
-/obj/item/ammo_box/magazine/mmags/lethal
+/obj/item/ammo_box/magazine/mmag/small/lethal
name = "magpistol magazine (lethal)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "smallmagmag"
@@ -239,7 +260,7 @@
icon_state = "magpistol"
force = 10
fire_sound = 'sound/weapons/magpistol.ogg'
- mag_type = /obj/item/ammo_box/magazine/mmags
+ mag_type = /obj/item/ammo_box/magazine/mmag/small
can_suppress = 0
casing_ejector = 0
fire_delay = 5
@@ -276,7 +297,7 @@
req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
- build_path = /obj/item/ammo_box/magazine/mmags/lethal
+ build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
category = list("Ammo")
/datum/design/mag_magpistol/nl
@@ -285,7 +306,7 @@
id = "mag_magpistol_nl"
req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5)
materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
- build_path = /obj/item/ammo_box/magazine/mmags
+ build_path = /obj/item/ammo_box/magazine/mmag/small
//////toy memes/////
@@ -339,3 +360,412 @@
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
build_path = /obj/item/gun/ballistic/shotgun/toy/mag
category = list("hacked", "Misc")
+
+//////Magrifle//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/magrifle
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-large"
+ damage = 30
+ armour_penetration = 25
+ light_range = 3
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile-large-nl"
+ damage = 5
+ knockdown = 30
+ stamina = 75
+ armour_penetration = 0
+ light_range = 3
+ light_color = LIGHT_COLOR_BLUE
+
+///ammo casings///
+
+/obj/item/ammo_casing/caseless/amagm
+ desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
+ caliber = "magm"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/magrifle
+
+/obj/item/ammo_casing/caseless/anlmagm
+ desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
+ caliber = "magm"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mag-casing-live"
+ projectile_type = /obj/item/projectile/bullet/nlmagrifle
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mmag/
+ name = "magrifle magazine (non-lethal disabler)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ origin_tech = "magnets=6"
+ ammo_type = /obj/item/ammo_casing/caseless/anlmagm
+ caliber = "magm"
+ max_ammo = 15
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/mmag/lethal
+ name = "magrifle magazine (lethal)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "mediummagmag"
+ origin_tech = "combat=6"
+ ammo_type = /obj/item/ammo_casing/caseless/amagm
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/magrifle
+ name = "\improper Magnetic Rifle"
+ desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magrifle"
+ item_state = "arg"
+ slot_flags = 0
+ origin_tech = "combat=6;engineering=6;magnets=6"
+ mag_type = /obj/item/ammo_box/magazine/mmag
+ fire_sound = 'sound/weapons/magrifle.ogg'
+ can_suppress = 0
+ burst_size = 3
+ fire_delay = 2
+ spread = 15
+ recoil = 1
+ casing_ejector = 0
+
+///research///
+
+/obj/item/gun/ballistic/automatic/magrifle/nopin
+ pin = null
+
+/datum/design/magrifle
+ name = "Magrifle"
+ desc = "An upscaled Magpistol in rifle form."
+ id = "magrifle"
+ req_tech = list("combat" = 7, "magnets" = 7, "powerstorage" = 7)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
+ build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
+ category = list("Weapons")
+
+/datum/design/mag_magrifle
+ name = "Magrifle Magazine (Lethal)"
+ desc = "A 15 round magazine for the Magrifle."
+ id = "mag_magrifle"
+ req_tech = list("combat" = 7, "magnets" = 7, "materials" = 5, "syndicate" = 4)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
+ build_path = /obj/item/ammo_box/magazine/mmag/lethal
+ category = list("Ammo")
+
+/datum/design/mag_magrifle/nl
+ name = "Magrifle Magazine (Non-Lethal)"
+ desc = "A 15 round non-lethal magazine for the Magrifle."
+ id = "mag_magrifle_nl"
+ req_tech = list("combat" = 7, "magnets" = 7, "materials" = 5)
+ materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
+ build_path = /obj/item/ammo_box/magazine/mmag
+
+//////Hyper-Burst Rifle//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/mags/hyper
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "magjectile"
+ damage = 10
+ armour_penetration = 10
+ stamina = 10
+ forcedodge = TRUE
+ range = 6
+ light_range = 1
+ light_color = LIGHT_COLOR_RED
+
+/obj/item/projectile/bullet/mags/hyper/inferno
+ icon_state = "magjectile-large"
+ stamina = 0
+ forcedodge = FALSE
+ range = 25
+ light_range = 4
+
+/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 1, 2, 4, 5)
+ return 1
+
+///ammo casings///
+
+/obj/item/ammo_casing/caseless/ahyper
+ desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
+ caliber = "hypermag"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hyper-casing-live"
+ projectile_type = /obj/item/projectile/bullet/mags/hyper
+ pellets = 12
+ variance = 40
+
+/obj/item/ammo_casing/caseless/ahyper/inferno
+ projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno
+ pellets = 1
+ variance = 0
+
+///magazines///
+
+/obj/item/ammo_box/magazine/mhyper
+ name = "hyper-burst rifle magazine"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hypermag-4"
+ ammo_type = /obj/item/ammo_casing/caseless/ahyper
+ caliber = "hypermag"
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range."
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/mhyper/update_icon()
+ ..()
+ icon_state = "hypermag-[ammo_count() ? "4" : "0"]"
+
+/obj/item/ammo_box/magazine/mhyper/inferno
+ name = "hyper-burst rifle magazine (inferno)"
+ ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno
+ desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light."
+
+///gun itself///
+
+/obj/item/gun/ballistic/automatic/hyperburst
+ name = "\improper Hyper-Burst Rifle"
+ desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "hyperburst"
+ item_state = "arg"
+ slot_flags = 0
+ origin_tech = "combat=6;engineering=6;magnets=6;syndicate=6"
+ mag_type = /obj/item/ammo_box/magazine/mhyper
+ fire_sound = 'sound/weapons/magburst.ogg'
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 40
+ recoil = 2
+ casing_ejector = 0
+ weapon_weight = WEAPON_HEAVY
+
+/obj/item/gun/ballistic/automatic/hyperburst/update_icon()
+ ..()
+ icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
+
+/* made redundant by reskinnable stetchkins
+//////Stealth Pistol//////
+
+/obj/item/gun/ballistic/automatic/pistol/stealth
+ name = "stealth pistol"
+ desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "stealthpistol"
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "combat=3;materials=3;syndicate=4"
+ mag_type = /obj/item/ammo_box/magazine/m10mm
+ can_suppress = 0
+ fire_sound = 'sound/weapons/gunshot_silenced.ogg'
+ suppressed = 1
+ burst_size = 1
+
+/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("stealthpistol-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+*/
+
+//////10mm soporific bullets//////
+
+obj/item/projectile/bullet/c10mm/soporific
+ name ="10mm soporific bullet"
+ armour_penetration = 0
+ nodamage = TRUE
+ dismemberment = 0
+ knockdown = 0
+
+/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.blur_eyes(6)
+ if(L.staminaloss >= 40)
+ L.Sleeping(250)
+ else
+ L.adjustStaminaLoss(58)
+ return 1
+
+/obj/item/ammo_casing/c10mm/soporific
+ name = ".10mm soporific bullet casing"
+ desc = "A 10mm soporific bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm/soporific
+
+/obj/item/ammo_box/magazine/m10mm/soporific
+ name = "pistol magazine (10mm soporific)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "9x19pS"
+ desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target."
+ ammo_type = /obj/item/ammo_casing/c10mm/soporific
+
+/obj/item/ammo_box/c10mm/soporific
+ name = "ammo box (10mm soporific)"
+ ammo_type = /obj/item/ammo_casing/c10mm/soporific
+ max_ammo = 24
+
+//////Flechette Launcher//////
+
+///projectiles///
+
+/obj/item/projectile/bullet/cflechetteap //shreds armor
+ name = "flechette (armor piercing)"
+ damage = 8
+ armour_penetration = 80
+
+/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
+ name = "flechette (serrated)"
+ damage = 8
+ dismemberment = 10
+ armour_penetration = -80
+
+/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.bleed(10)
+ return ..()
+
+///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
+
+/obj/item/ammo_casing/caseless/flechetteap
+ name = "flechette (armor piercing)"
+ desc = "A flechette made with a tungsten alloy."
+ projectile_type = /obj/item/projectile/bullet/cflechetteap
+ caliber = "flechette"
+ throwforce = 1
+ throw_speed = 3
+
+/obj/item/ammo_casing/caseless/flechettes
+ name = "flechette (serrated)"
+ desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+ caliber = "flechette"
+ throwforce = 2
+ throw_speed = 3
+ embed_chance = 75
+
+///magazine///
+
+/obj/item/ammo_box/magazine/flechette
+ name = "flechette magazine (armor piercing)"
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettemag"
+ origin_tech = "combat=5;syndicate=1"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteap
+ caliber = "flechette"
+ max_ammo = 40
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/flechette/s
+ name = "flechette magazine (serrated)"
+ ammo_type = /obj/item/ammo_casing/caseless/flechettes
+
+///the gun itself///
+
+/obj/item/gun/ballistic/automatic/flechette
+ name = "\improper CX Flechette Launcher"
+ desc = "A flechette launching machine pistol with an unconventional bullpup frame."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "flechettegun"
+ item_state = "gun"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = 0
+ /obj/item/device/firing_pin/implant/pindicate
+ origin_tech = "combat=6;materials=2;syndicate=5"
+ mag_type = /obj/item/ammo_box/magazine/flechette/
+ fire_sound = 'sound/weapons/gunshot_smg.ogg'
+ can_suppress = 0
+ burst_size = 5
+ fire_delay = 1
+ casing_ejector = 0
+ spread = 20
+
+/obj/item/gun/ballistic/automatic/flechette/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("flechettegun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+///unique variant///
+
+/obj/item/projectile/bullet/cflechetteshredder
+ name = "flechette (shredder)"
+ damage = 5
+ dismemberment = 40
+
+/obj/item/ammo_casing/caseless/flechetteshredder
+ name = "flechette (shredder)"
+ desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
+ projectile_type = /obj/item/projectile/bullet/cflechettes
+
+/obj/item/ammo_box/magazine/flechette/shredder
+ name = "flechette magazine (shredder)"
+ icon_state = "shreddermag"
+ ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
+
+/obj/item/gun/ballistic/automatic/flechette/shredder
+ name = "\improper CX Shredder"
+ desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
+ w_class = WEIGHT_CLASS_SMALL
+ mag_type = /obj/item/ammo_box/magazine/flechette/shredder
+ spread = 30
+
+/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
+ ..()
+ if(magazine)
+ cut_overlays()
+ add_overlay("shreddergun-magazine")
+ else
+ cut_overlays()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+//////modular pistol////// (reskinnable stetchkins)
+
+/obj/item/gun/ballistic/automatic/pistol/modular
+ name = "modular pistol"
+ desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
+ icon = 'icons/obj/guns/cit_guns.dmi'
+ icon_state = "cde"
+ can_unsuppress = TRUE
+ unique_rename = TRUE
+ unique_reskin = list("Default" = "cde",
+ "NT-99" = "n99",
+ "Stealth" = "stealthpistol",
+ "HKVP-78" = "vp78",
+ "Luger" = "p08b",
+ "Mk.58" = "secguncomp",
+ "PX4 Storm" = "px4"
+ )
+
+/obj/item/gun/ballistic/automatic/pistol/modular/update_icon()
+ ..()
+ if(current_skin)
+ icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ else
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ if(magazine && suppressed)
+ cut_overlays()
+ add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay
+ else if (magazine)
+ cut_overlays()
+ add_overlay("[unique_reskin[current_skin]]-magazine")
+ else
+ cut_overlays()
\ No newline at end of file
diff --git a/code/controllers/subsystem/squeak.dm b/code/controllers/subsystem/squeak.dm
index 16b722c71b..964d970e2b 100644
--- a/code/controllers/subsystem/squeak.dm
+++ b/code/controllers/subsystem/squeak.dm
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(squeak)
/datum/controller/subsystem/squeak/Initialize(timeofday)
trigger_migration(config.mice_roundstart)
+ return ..()
/datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10)
if(!num_mice)
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index f245b0766c..97d84a0d3b 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -57,6 +57,9 @@ SUBSYSTEM_DEF(throwing)
var/pure_diagonal
var/diagonal_error
var/datum/callback/callback
+ var/paused = FALSE
+ var/delayed_time = 0
+ var/last_move = 0
/datum/thrownthing/proc/tick()
var/atom/movable/AM = thrownthing
@@ -64,14 +67,20 @@ SUBSYSTEM_DEF(throwing)
finalize()
return
+ if(paused)
+ delayed_time += world.time - last_move
+ return
+
if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept
finalize()
return
var/atom/step
+ last_move = world.time
+
//calculate how many tiles to move, making up for any missed ticks.
- var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait))
+ var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time + delayed_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait))
while (tilestomove-- > 0)
if ((dist_travelled >= maxrange || AM.loc == target_turf) && AM.has_gravity(AM.loc))
finalize()
diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm
index 230a4d64e4..f51b22dde2 100644
--- a/code/datums/antagonists/ninja.dm
+++ b/code/datums/antagonists/ninja.dm
@@ -1,6 +1,5 @@
/datum/antagonist/ninja
name = "Ninja"
- var/team
var/helping_station = 0
var/give_objectives = TRUE
@@ -19,36 +18,8 @@
..(new_owner)
helping_station = rand(0,1)
-/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current, safety=0)//Safety in case you need to unequip stuff for existing characters.
- if(safety)
- qdel(H.w_uniform)
- qdel(H.wear_suit)
- qdel(H.wear_mask)
- qdel(H.head)
- qdel(H.shoes)
- qdel(H.gloves)
-
- var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
- var/obj/item/dash/energy_katana/EK = new(H)
- theSuit.energyKatana = EK
-
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(H), slot_shoes)
- H.equip_to_slot_or_del(theSuit, slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(H), slot_wear_mask)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
- H.equip_to_slot_or_del(EK, slot_belt)
- H.equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(H), slot_l_store)
- H.equip_to_slot_or_del(new /obj/item/tank/internals/emergency_oxygen(H), slot_s_store)
- H.equip_to_slot_or_del(new /obj/item/tank/jetpack/carbondioxide(H), slot_back)
- theSuit.randomize_param()
-
- var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
- E.implant(H)
- return 1
+/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current)
+ return H.equipOutfit(/datum/outfit/ninja)
/datum/antagonist/ninja/proc/addMemories()
owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 8d4413171d..3c3ab905ea 100755
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -102,10 +102,10 @@
if(implants)
for(var/implant_type in implants)
var/obj/item/implant/I = new implant_type(H)
- I.implant(H, null, silent=TRUE)
+ I.implant(H, null, TRUE)
H.update_body()
- return 1
+ return TRUE
/datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H)
if(!istype(H))
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index eb4e4f8211..fd9ca0a658 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -9,7 +9,7 @@
var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new
var/datum/action/innate/set_droppoint/set_droppoint_action = new
var/obj/machinery/abductor/console/console
- z_lock = ZLEVEL_STATION_PRIMARY
+ station_lock_override = TRUE
icon = 'icons/obj/abductor.dmi'
icon_state = "camera"
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 4c21f9688b..acf55e4036 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -22,27 +22,17 @@
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
+ var/list/pre_nukeops = list()
/datum/game_mode/nuclear/pre_setup()
- var/n_players = num_players()
- var/n_agents = min(round(n_players / 10, 1), agents_possible)
-
- if(antag_candidates.len < n_agents) //In the case of having less candidates than the selected number of agents
- n_agents = antag_candidates.len
-
- while(n_agents > 0)
- var/datum/mind/new_syndicate = pick(antag_candidates)
- syndicates += new_syndicate
- antag_candidates -= new_syndicate //So it doesn't pick the same guy each time.
- n_agents--
-
- for(var/datum/mind/synd_mind in syndicates)
- synd_mind.assigned_role = "Syndicate"
- synd_mind.special_role = "Syndicate"//So they actually have a special role/N
- log_game("[synd_mind.key] (ckey) has been selected as a nuclear operative")
-
- return 1
-
+ var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
+ for(var/i = 0, i < n_agents, ++i)
+ var/datum/mind/new_op = pick_n_take(antag_candidates)
+ pre_nukeops += new_op
+ new_op.assigned_role = "Nuclear Operative"
+ new_op.special_role = "Nuclear Operative"
+ log_game("[new_op.key] (ckey) has been selected as a nuclear operative")
+ return TRUE
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
@@ -60,48 +50,36 @@
////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/nuclear/post_setup()
-
- var/list/turf/synd_spawn = list()
-
- for(var/obj/effect/landmark/A in GLOB.landmarks_list)
- if(A.name == "Syndicate-Spawn")
- synd_spawn += get_turf(A)
- continue
-
var/nuke_code = random_nukecode()
- var/leader_selected = 0
var/agent_number = 1
- var/spawnpos = 1
+ var/datum/mind/leader = pick(pre_nukeops)
+ syndicates += pre_nukeops
+ for(var/i = 1 to pre_nukeops.len)
+ var/datum/mind/op = pre_nukeops[i]
- for(var/datum/mind/synd_mind in syndicates)
- if(spawnpos > synd_spawn.len)
- spawnpos = 2
- synd_mind.current.loc = synd_spawn[spawnpos]
-
- forge_syndicate_objectives(synd_mind)
- greet_syndicate(synd_mind)
- equip_syndicate(synd_mind.current)
+ forge_syndicate_objectives(op)
+ greet_syndicate(op)
+ equip_syndicate(op.current)
if(nuke_code)
- synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
- to_chat(synd_mind.current, "The nuclear authorization code is: [nuke_code]")
+ op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
+ to_chat(op.current, "The nuclear authorization code is: [nuke_code]")
- if(!leader_selected)
- prepare_syndicate_leader(synd_mind, nuke_code)
- leader_selected = 1
+ if(op == leader)
+ op.current.forceMove(pick(GLOB.nukeop_leader_start))
+ prepare_syndicate_leader(op, nuke_code)
else
- synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
- agent_number++
- spawnpos++
- update_synd_icons_added(synd_mind)
- synd_mind.current.playsound_local(get_turf(synd_mind.current), 'sound/ambience/antag/ops.ogg',100,0)
- var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
+ op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1])
+ op.current.real_name = "[syndicate_name()] Operative #[agent_number++]"
+ update_synd_icons_added(op)
+ op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0)
+
+ var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
if(nuke)
nuke.r_code = nuke_code
return ..()
-
/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code)
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
spawn(1)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 75ed90d712..c00328243a 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -121,7 +121,7 @@
return target
/datum/objective/assassinate/check_completion()
- return !target || !considered_alive(target)
+ return !considered_alive(target) || considered_afk(target)
/datum/objective/assassinate/update_explanation_text()
..()
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 8384892044..d538c7f75e 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -154,8 +154,7 @@
var/obj/item/device/assembly/flash/T = new(mob)
- var/obj/item/toy/crayon/spraycan/R = new(mob)
- var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob)
+ var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -163,13 +162,8 @@
"right pocket" = slot_r_store
)
var/where = mob.equip_in_one_of_slots(T, slots)
- var/where2 = mob.equip_in_one_of_slots(C, slots)
- mob.equip_in_one_of_slots(R,slots)
-
- if (!where2)
- to_chat(mob, "The Syndicate were unfortunately unable to get you a chameleon security HUD.")
- else
- to_chat(mob, "The chameleon security HUD in your [where2] will help you keep track of who is mindshield-implanted, and unable to be recruited.")
+ S.Insert(mob, special = FALSE, drop_if_replaced = FALSE)
+ to_chat(mob, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.")
if (!where)
to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.")
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 3d5b8f026b..711ed6e55b 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -3,7 +3,8 @@
desc = "Used to access the various cameras on the station."
icon_screen = "cameras"
icon_keyboard = "security_key"
- var/z_lock = null // Lock use to this zlevel
+ var/list/z_lock = list() // Lock use to these z levels
+ var/station_lock_override = FALSE
var/mob/camera/aiEye/remote/eyeobj
var/mob/living/current_user = null
var/list/networks = list("SS13")
@@ -13,6 +14,11 @@
light_color = LIGHT_COLOR_RED
+/obj/machinery/computer/camera_advanced/Initialize()
+ . = ..()
+ if(station_lock_override)
+ z_lock = GLOB.station_z_levels.Copy()
+
/obj/machinery/computer/camera_advanced/syndie
icon_keyboard = "syndie_key"
@@ -76,7 +82,7 @@
if(!eyeobj.eye_initialized)
var/camera_location
for(var/obj/machinery/camera/C in GLOB.cameranet.cameras)
- if(!C.can_use() || z_lock && C.z != z_lock)
+ if(!C.can_use() || z_lock.len && !(C.z in z_lock))
continue
if(C.network & networks)
camera_location = get_turf(C)
@@ -201,7 +207,7 @@
var/list/L = list()
for (var/obj/machinery/camera/cam in GLOB.cameranet.cameras)
- if(origin.z_lock && cam.z != origin.z_lock)
+ if(origin.z_lock.len && !(cam.z in origin.z_lock))
continue
L.Add(cam)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 3fb3447f61..34d2edc56c 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -213,6 +213,8 @@ GLOBAL_LIST_INIT(pipeID2State, list(
return ..()
if (!isturf(src.loc))
return 1
+
+ add_fingerprint(user)
fixdir()
if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER))
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 7401797a47..68a1cb773c 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -157,11 +157,27 @@
/obj/effect/landmark/start/wizard
name = "wizard"
-/obj/effect/landmark/start/wizard/Initialize(mapload)
+/obj/effect/landmark/start/wizard/Initialize()
..()
GLOB.wizardstart += loc
return INITIALIZE_HINT_QDEL
+/obj/effect/landmark/start/nukeop
+ name = "nukeop"
+
+/obj/effect/landmark/start/nukeop/Initialize()
+ ..()
+ GLOB.nukeop_start += loc
+ return INITIALIZE_HINT_QDEL
+
+/obj/effect/landmark/start/nukeop_leader
+ name = "nukeop leader"
+
+/obj/effect/landmark/start/nukeop_leader/Initialize()
+ ..()
+ GLOB.nukeop_leader_start += loc
+ return INITIALIZE_HINT_QDEL
+
/obj/effect/landmark/start/new_player
name = "New Player"
@@ -205,23 +221,6 @@
/obj/effect/landmark/tripai
name = "tripai"
-// marauder entry (XXX WTF IS MAURADER ENTRY???)
-
-/obj/effect/landmark/marauder_entry
- name = "Marauder Entry"
-
-// syndicate breach area (XXX I DON'T KNOW WHAT THIS IS EITHER)
-
-/obj/effect/landmark/syndicate_breach_area
- name = "Syndicate Breach Area"
-
-// teleport scroll landmark, XXX DOES THIS DO ANYTHING?
-/obj/effect/landmark/teleport_scroll
- name = "Teleport-Scroll"
-
-/obj/effect/landmark/syndicate_spawn
- name = "Syndicate-Spawn"
-
// xenos.
/obj/effect/landmark/xeno_spawn
name = "xeno_spawn"
diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm
index 62471505d0..70128be7ee 100644
--- a/code/game/objects/effects/proximity.dm
+++ b/code/game/objects/effects/proximity.dm
@@ -33,7 +33,7 @@
if(!force_rebuild && range == current_range)
return FALSE
. = TRUE
-
+
current_range = range
var/list/checkers_local = checkers
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 15a7c1ab0b..f04f8d4441 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -234,6 +234,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M))
return ..()
+ if(M.on_fire && !lit)
+ light("[user] lights [src] with [M]'s burning body. What a cold-blooded badass.")
+ return
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == INTENT_HELP)
if(cig.lit)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index eb521d8510..2e7163bfa1 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -26,6 +26,14 @@ GLOBAL_LIST_EMPTY(PDAs)
var/obj/item/cartridge/cartridge = null //current cartridge
var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge.
var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file.
+ var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again.
+ var/font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" //The currently selected font.
+ var/background_color = "#808000" //The currently selected background color.
+
+ #define FONT_VT 0
+ #define FONT_SHARE 1
+ #define FONT_ORBITRON 2
+ #define FONT_MONO 3
//Secondary variables
var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner.
@@ -121,7 +129,8 @@ GLOBAL_LIST_EMPTY(PDAs)
hidden_uplink.interact(user)
return
- var/dat = "
Personal Data Assistant"
+ var/dat = "Personal Data Assistant"
+
dat += " Refresh"
@@ -130,6 +139,12 @@ GLOBAL_LIST_EMPTY(PDAs)
if (mode)
dat += " | Return"
+ if (mode == 0)
+ dat += "