diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
index 454b5e4fb6b..398b065cfbd 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
@@ -198,8 +198,8 @@
/turf/simulated/floor/beach/sand,
/area/ruin/powered/beach)
"aL" = (
-/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/sand,
+/obj/machinery/vending/cigarette/beach,
/turf/simulated/floor/plasteel,
/area/ruin/powered/beach)
"aM" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
index 451e6b84aa0..5822d05aa8a 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
@@ -120,10 +120,10 @@
/area/ruin/powered/animal_hospital)
"aq" = (
/obj/structure/table,
-/obj/item/cautery{
- pixel_x = 4
- },
/obj/item/surgicaldrill,
+/obj/item/bonegel,
+/obj/item/bonesetter,
+/obj/item/FixOVein,
/turf/simulated/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
"ar" = (
@@ -243,6 +243,9 @@
/obj/structure/table,
/obj/item/retractor,
/obj/item/hemostat,
+/obj/item/cautery{
+ pixel_x = 4
+ },
/turf/simulated/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
"aE" = (
@@ -480,15 +483,13 @@
/turf/simulated/floor/plasteel,
/area/ruin/powered/animal_hospital)
"bm" = (
-/obj/structure/chair/comfy/teal{
- dir = 8
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/obj/machinery/vending/crittercare,
/turf/simulated/floor/plasteel,
/area/ruin/powered/animal_hospital)
"bn" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
index be387f22047..b097156d39a 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -11,6 +11,7 @@
id_tag = "seed_vault_inner";
locked = 1
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
"d" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 49f725e0e0f..85ded0449e0 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -1052,9 +1052,6 @@
dir = 8;
level = 2
},
-/obj/machinery/pipedispenser{
- pixel_y = 0
- },
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"bM" = (
@@ -3565,12 +3562,12 @@
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hV" = (
-/obj/structure/filingcabinet/chestdrawer,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/autolathe,
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hW" = (
@@ -4948,7 +4945,6 @@
dir = 8;
pixel_x = 24
},
-/obj/machinery/vending/coffee,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -4960,6 +4956,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/vending/coffee/free,
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"kr" = (
@@ -5166,9 +5163,9 @@
dir = 4;
pixel_x = 26
},
-/obj/machinery/vending/cigarette,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/machinery/vending/cigarette/syndicate/free,
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"kN" = (
@@ -5746,6 +5743,9 @@
/obj/item/stock_parts/cell/high/plus,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
+/obj/item/rpd{
+ pixel_y = 3
+ },
/turf/simulated/floor/plasteel,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"mh" = (
@@ -6840,6 +6840,12 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"yU" = (
+/turf/simulated/wall/mineral/plastitanium/explosive,
+/area/ruin/unpowered/syndicate_lava_base/chemistry)
+"Au" = (
+/turf/simulated/wall/mineral/plastitanium/explosive,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"BF" = (
/obj/structure/grille,
/obj/structure/window/plastitanium,
@@ -6893,6 +6899,10 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"Qt" = (
+/obj/machinery/atmospherics/pipe/simple/visible/yellow,
+/turf/simulated/wall/mineral/plastitanium/explosive,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"RE" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -7158,7 +7168,7 @@ ab
ab
ab
mn
-mn
+mo
mM
nh
mM
@@ -7237,7 +7247,7 @@ ab
ab
ab
eh
-eh
+gj
eh
eh
eh
@@ -7537,7 +7547,7 @@ ab
ab
ab
eh
-eh
+gj
eI
eI
gt
@@ -7709,7 +7719,7 @@ lf
bw
jy
jy
-jy
+jP
np
aH
mT
@@ -7779,7 +7789,7 @@ ab
ab
ab
ae
-ae
+aL
aq
aq
qG
@@ -8293,7 +8303,7 @@ fH
gG
he
hA
-hz
+hO
id
im
bX
@@ -8388,7 +8398,7 @@ dI
dZ
ew
as
-as
+yU
as
gJ
hh
@@ -8812,7 +8822,7 @@ bL
bO
bQ
bi
-bQ
+Qt
oB
ju
ju
@@ -8885,7 +8895,7 @@ ab
ab
ab
dy
-dy
+dP
eE
fe
dy
@@ -9005,7 +9015,7 @@ ab
ju
kD
bB
-ju
+Au
kD
bB
ju
diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm
index 96b460ea36b..66ed729e9d6 100644
--- a/_maps/map_files/generic/Lavaland.dmm
+++ b/_maps/map_files/generic/Lavaland.dmm
@@ -898,6 +898,7 @@
opacity = 0;
req_access_txt = "54"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"ck" = (
@@ -1706,6 +1707,7 @@
opacity = 0;
req_access_txt = "54"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/eva)
"dZ" = (
@@ -2920,6 +2922,7 @@
name = "Labor Camp Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"gv" = (
@@ -2930,6 +2933,7 @@
opacity = 0;
req_one_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/production)
"gw" = (
@@ -2940,6 +2944,7 @@
opacity = 0;
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/production)
"gx" = (
@@ -2949,6 +2954,7 @@
locked = 1;
name = "Labor Camp External Access"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"gy" = (
@@ -3009,6 +3015,7 @@
locked = 1;
name = "Labor Camp External Access"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"gF" = (
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 65372fed1c8..34ad4d69e54 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -43,6 +43,7 @@
#define ROLE_DRONE "drone"
#define ROLE_DEATHSQUAD "deathsquad"
#define ROLE_EVENTMISC "eventmisc"
+#define ROLE_GHOST "ghost role"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
diff --git a/code/__DEFINES/rolebans.dm b/code/__DEFINES/rolebans.dm
index b2eb79e26be..d6e54abf14a 100644
--- a/code/__DEFINES/rolebans.dm
+++ b/code/__DEFINES/rolebans.dm
@@ -25,6 +25,7 @@ var/global/list/other_roles = list(
ROLE_SENTIENT,
ROLE_NYMPH,
ROLE_ERT,
+ ROLE_GHOST,
"AntagHUD",
"Records"
)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 8689c6fb1d9..f1f5d4af878 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -175,136 +175,174 @@
/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.Integrate(src)
+ return FALSE
+
+/atom/movable/lighting_object/swarmer_act()
+ return FALSE
/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
- return
+ return FALSE
/turf/simulated/floor/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
- return
+ return FALSE
/obj/machinery/atmospherics/swarmer_act()
- return
+ return FALSE
/obj/structure/disposalpipe/swarmer_act()
- return
+ return FALSE
/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DismantleMachine(src)
+ return TRUE
/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
toggle_cam(S, 0)
+ return TRUE
/obj/structure/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) // Since the console is still parented to this
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(!active)
S.DisIntegrate(src)
- return
+ return TRUE
to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.")
+ return FALSE
/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
+ return TRUE
/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.")
+ return FALSE
/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.")
+ return FALSE
/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.")
+ return FALSE
/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Destroying this object would cause a chain reaction. Aborting.")
+ return FALSE
/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.")
+ return FALSE
/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. ")
+ return FALSE
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
+ return FALSE
/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This bluespace source will be important to us later. Aborting.")
+ return FALSE
/obj/machinery/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/structure/cryofeed/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This cryogenic feed should be preserved, it will be a useful resource to our masters in the future. Aborting.")
+ return FALSE
/obj/machinery/computer/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.")
+ return FALSE
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space) || istype(T, /turf/simulated/floor/plating/airless))
to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- return
- ..()
+ return FALSE
+ return ..()
/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space))
to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- return
- ..()
+ return FALSE
+ return ..()
/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
to_chat(S, "This object does not contain enough materials to work with.")
+ return FALSE
/obj/item/circuitboard/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This object does not contain enough materials to work with.")
+ return FALSE
/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")
+ return FALSE
/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Destroying this vehicle would destroy us. Aborting.")
+ return FALSE
/obj/machinery/clonepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(occupant)
to_chat(S, "Destroying this machine while it is occupied would result in biological and sentient resources to be harmed. Aborting.")
- return
- ..()
+ return FALSE
+ return ..()
/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisperseTarget(src)
+ return TRUE
/mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.")
+ return FALSE
+/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ to_chat(S, "We have created these for our own benefit. Aborting.")
+ return FALSE
////END CTRL CLICK FOR SWARMERS////
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 46138139ce8..bc2af073fc6 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -284,6 +284,7 @@
var/turf/simulated/wall/mineral/plastitanium/explosive/E = wall
if(E.explosive_wall_group == explosive_wall_group)
E.self_destruct()
+ sleep(5)
///Bomb Cores///
@@ -301,6 +302,7 @@
var/range_medium = 9
var/range_light = 17
var/range_flame = 17
+ var/admin_log = TRUE
/obj/item/bombcore/ex_act(severity) //Little boom can chain a big boom
detonate()
@@ -314,7 +316,7 @@
if(adminlog)
message_admins(adminlog)
log_game(adminlog)
- explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame)
+ explosion(get_turf(src), range_heavy, range_medium, range_light, flame_range = range_flame, adminlog = admin_log)
if(loc && istype(loc, /obj/machinery/syndicatebomb))
qdel(loc)
qdel(src)
@@ -405,6 +407,9 @@
range_light = 20
range_flame = 20
+/obj/item/bombcore/large/explosive_wall
+ admin_log = FALSE
+
/obj/item/bombcore/large/underwall
layer = ABOVE_OPEN_TURF_LAYER
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 3688b4abe9b..b2a62492c7c 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1053,6 +1053,36 @@
/obj/machinery/vending/cigarette/free
prices = list()
+/obj/machinery/vending/cigarette/syndicate
+ products = list(/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7,
+ /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_robust = 2,
+ /obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_midori = 1,
+ /obj/item/storage/box/matches = 10,
+ /obj/item/lighter/zippo = 4,
+ /obj/item/storage/fancy/rollingpapers = 5)
+
+/obj/machinery/vending/cigarette/syndicate/free
+ prices = list()
+
+/obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin
+ name = "\improper ShadyCigs Ultra"
+ desc = "Now with extra premium products!"
+ product_ads = "Probably not bad for you!;Dope will get you through times of no money better than money will get you through times of no dope!;It's good for you!"
+ product_slogans = "Turn on, tune in, drop out!;Better living through chemistry!;Toke!;Don't forget to keep a smile on your lips and a song in your heart!"
+ products = list(/obj/item/storage/fancy/cigarettes = 5,
+ /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_robust = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_carp = 3,
+ /obj/item/storage/fancy/cigarettes/cigpack_midori = 3,
+ /obj/item/storage/box/matches = 10,
+ /obj/item/lighter/random = 4,
+ /obj/item/storage/fancy/rollingpapers = 5)
+ premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2,
+ /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1,
+ /obj/item/lighter/zippo = 3)
+
/obj/machinery/vending/cigarette/New()
..()
component_parts = list()
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index f21bbb69c02..87f489513d2 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -1,6 +1,6 @@
//TODO: Flash range does nothing currently
-/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null, breach = TRUE)
+/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0, silent = 0, smoke = 1, cause = null, breach = TRUE)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 50cab97ee48..af9e0abc920 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -136,7 +136,9 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
/obj/item/clothing/suit/space/eva/plasmaman/miner,
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner,
/obj/item/clothing/suit/hooded/explorer,
- /obj/item/clothing/head/hooded/explorer
+ /obj/item/clothing/head/hooded/explorer,
+ /obj/item/clothing/suit/space/eva/plasmaman/explorer,
+ /obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
))
/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 02c183353d8..21f29e3db47 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -277,6 +277,7 @@
/turf/simulated/wall/mineral/plastitanium/explosive
var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE
+ smooth = SMOOTH_MORE
/turf/simulated/wall/mineral/plastitanium/explosive/Initialize(mapload)
. = ..()
@@ -287,9 +288,12 @@
return ..()
/turf/simulated/wall/mineral/plastitanium/explosive/proc/self_destruct()
- var/obj/item/bombcore/large/bombcore = new(get_turf(src))
+ var/obj/item/bombcore/large/explosive_wall/bombcore = new(get_turf(src))
bombcore.detonate()
+/turf/simulated/wall/mineral/plastitanium/explosive/ex_act(severity)
+ return
+
//have to copypaste this code
/turf/simulated/wall/mineral/plastitanium/interior/copyTurf(turf/T)
if(T.type != type)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 9ca42122410..19090102611 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -180,8 +180,8 @@
if(L)
qdel(L)
-/turf/proc/TerraformTurf(path)
- return ChangeTurf(path)
+/turf/proc/TerraformTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
+ return ChangeTurf(path, defer_change, keep_icon, ignore_air)
//Creates a new turf
/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 37a29d8e79e..d217aacb253 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -28,7 +28,7 @@
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
var/mob_color //Change the mob's color
var/assignedrole
- var/banType = "lavaland"
+ var/banType = ROLE_GHOST
var/ghost_usable = TRUE
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 2675d778366..35f346402f9 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -258,8 +258,8 @@
item_state = "head_mirror"
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi',
- "Drask" = 'icons/mob/species/drask/head.dmi',
- "Grey" = 'icons/mob/species/grey/head.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Drask" = 'icons/mob/species/drask/head.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi'
)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 02808eda485..289250befac 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -71,8 +71,12 @@
resistance_flags = FIRE_PROOF
sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/mask.dmi',
+ "Unathi" = 'icons/mob/species/unathi/mask.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi',
- "Grey" = 'icons/mob/species/grey/mask.dmi',
+ "Grey" = 'icons/mob/species/grey/mask.dmi'
)
/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 57588f29d62..e355aead650 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -235,6 +235,16 @@
base_state = "plasmamanMiner_helmet"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+/obj/item/clothing/suit/space/eva/plasmaman/explorer
+ name = "plasmaman explorer suit"
+ icon_state = "plasmamanExplorer_suit"
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
+ name = "plasmaman explorer helmet"
+ icon_state = "plasmamanExplorer_helmet0"
+ base_state = "plasmamanExplorer_helmet"
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
// MEDSCI
diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm
index 9fc396f5eff..f36e493ce3f 100644
--- a/code/modules/library/random_books.dm
+++ b/code/modules/library/random_books.dm
@@ -49,7 +49,7 @@
if(prob(25))
category = null
var/c = category? " AND category='[sanitizeSQL(category)]'" :""
- var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE isnull(flagged)[c] GROUP BY title ORDER BY rand() LIMIT [amount];")
+ var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE (isnull(flagged) OR flagged = 0)[c] GROUP BY title ORDER BY rand() LIMIT [amount];")
query_get_random_books.Execute()
while(query_get_random_books.NextRow())
var/obj/item/book/B = new(location)
diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm
index 9cae3f42f19..6453f54c979 100644
--- a/code/modules/mining/explorer_gear.dm
+++ b/code/modules/mining/explorer_gear.dm
@@ -14,15 +14,30 @@
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Drask" = 'icons/mob/species/drask/suit.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi'
+ )
+
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = HEAD
- flags = BLOCKHAIR
+ flags = BLOCKHAIR | NODROP
flags_cover = HEADCOVERSEYES
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = FIRE_PROOF
+
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Drask" = 'icons/mob/species/drask/head.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi',
+ "Skrell" = 'icons/mob/species/skrell/head.dmi'
+ )
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index 0e0d248d8b7..17887b8eae7 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -26,6 +26,17 @@
if(prob(15))
harvest(null, TRUE)
+/obj/structure/flora/ash/ex_act(severity, target)
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
+ if(prob(80))
+ qdel(src)
+ if(3)
+ if(prob(50))
+ qdel(src)
+
/obj/structure/flora/ash/proc/harvest(user, no_drop)
if(harvested)
return 0
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index a213a7cfe17..971a1fc6827 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -198,7 +198,7 @@
user.visible_message("[user] turns \the [T] into [transform_string]!")
message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).")
log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).")
- T.ChangeTurf(turf_type)
+ T.TerraformTurf(turf_type, keep_icon = FALSE)
timer = world.time + create_cooldown
qdel(L)
else
@@ -207,7 +207,7 @@
return
else
user.visible_message("[user] turns \the [T] into [reset_string]!")
- T.ChangeTurf(reset_turf_type)
+ T.TerraformTurf(reset_turf_type, keep_icon = FALSE)
timer = world.time + reset_cooldown
playsound(T,'sound/magic/fireball.ogg', 200, 1)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 796cf1ce8f5..524990e992e 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -441,7 +441,7 @@
/obj/machinery/sleeper/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "sleeper-open"
- density = 0
+ density = FALSE
/obj/machinery/sleeper/survival_pod/New()
..()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2cd524f8a15..bc0c33c233d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1711,8 +1711,8 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/IsAdvancedToolUser()
if(dna.species.has_fine_manipulation)
- return 1
- return 0
+ return TRUE
+ return FALSE
/mob/living/carbon/human/get_permeability_protection()
var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0)
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index bb900cdb5b6..785d737aec2 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -130,8 +130,8 @@
suit=/obj/item/clothing/suit/space/eva/plasmaman/cargo
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
if("Shaft Miner")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/miner
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/explorer
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
if("Botanist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/botanist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm
index 72ee0f99cc2..7cfae3f59ae 100644
--- a/code/modules/mob/living/carbon/human/species/unathi.dm
+++ b/code/modules/mob/living/carbon/human/species/unathi.dm
@@ -115,5 +115,7 @@
language = "Sinta'unathi"
default_language = "Sinta'unathi"
+ has_fine_manipulation = FALSE
+
slowdown = -0.80
- species_traits = list(NO_BREATHE, NOGUNS)
\ No newline at end of file
+ species_traits = list(NO_BREATHE, NOGUNS)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 9486f1b11bb..68db8cb1274 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -130,7 +130,7 @@ Difficulty: Medium
playsound(T,'sound/magic/fireball.ogg', 200, 1)
new /obj/effect/temp_visual/fireball(T)
sleep(12)
- explosion(T, 0, 0, 1, 0, 0, 0, 1)
+ explosion(T, 0, 0, 1, 0, 0, 0, 1, 1)
/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
anger_modifier = Clamp(((maxHealth - health)/50),0,20)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 67fb7722198..efc18895141 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -140,7 +140,7 @@
move_resist = MOVE_FORCE_VERY_STRONG
pull_force = MOVE_FORCE_VERY_STRONG
var/pre_attack = 0
- loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER})
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
..()
@@ -223,46 +223,3 @@
else
spawn(50)
qdel(src)
-
-/obj/item/asteroid/goliath_hide
- name = "goliath hide plates"
- desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
- icon = 'icons/obj/items.dmi'
- icon_state = "goliath_hide"
- flags = NOBLUDGEON
- w_class = WEIGHT_CLASS_NORMAL
- layer = 4
-
-/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
- if(proximity_flag)
- if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
- var/obj/item/clothing/C = target
- var/current_armor = C.armor
- if(current_armor["melee"] < 60)
- current_armor["melee"] = min(current_armor["melee"] + 10, 60)
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
- qdel(src)
- else
- to_chat(user, "You can't improve [C] any further.")
- return
- if(istype(target, /obj/mecha/working/ripley))
- var/obj/mecha/D = target
- if(D.icon_state != "ripley-open")
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
- return
- var/list/damage_absorption = D.damage_absorption
- if(damage_absorption["brute"] > 0.3)
- damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
- damage_absorption["bullet"] = damage_absorption["bullet"] - 0.05
- damage_absorption["fire"] = damage_absorption["fire"] - 0.05
- damage_absorption["laser"] = damage_absorption["laser"] - 0.025
- to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
- qdel(src)
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- if(damage_absorption["brute"] == 0.3)
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
- else
- to_chat(user, "You can't improve [D] any further!")
- return
diff --git a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm
index 686bc77ceaa..7800b3eb9ab 100644
--- a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm
+++ b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm
@@ -67,7 +67,8 @@
move_resist = MOVE_FORCE_NORMAL
density = FALSE
flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \
- You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest."
+ You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \
+
You are free to attack miners and other outsiders. DO NOT leave Lavaland without admin permission! DO NOT attack the mining outpost without being provoked."
assignedrole = "Ash Walker"
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/carbon/human/new_spawn)
diff --git a/code/modules/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
index 0f092ab4509..25f7b289e53 100644
--- a/code/modules/ruins/lavalandruin_code/syndicate_base.dm
+++ b/code/modules/ruins/lavalandruin_code/syndicate_base.dm
@@ -28,12 +28,14 @@
death = FALSE
icon = 'icons/obj/cryogenic2.dmi'
icon_state = "sleeper_s"
- flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. The base is rigged with explosives, do not abandon it or let it fall into enemy hands! \
+
You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission."
outfit = /datum/outfit/lavaland_syndicate
assignedrole = "Lavaland Syndicate"
/obj/effect/mob_spawn/human/lavaland_syndicate/Destroy()
- new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
+ var/obj/structure/fluff/empty_sleeper/syndicate/S = new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
+ S.setDir(dir)
return ..()
/datum/outfit/lavaland_syndicate
@@ -55,11 +57,13 @@
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
name = "Syndicate Comms Agent sleeper"
mob_name = "Syndicate Comms Agent"
- flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. DO NOT abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands! \
+
You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission."
outfit = /datum/outfit/lavaland_syndicate/comms
/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space
- flavour_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13. Monitor enemy activity as best you can, and try to keep a low profile. DO NOT abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
+ flavour_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13. Monitor enemy activity as best you can, and try to keep a low profile. Do not abandon the base. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands! \
+
You are free to attack anyone not aligned with the Syndicate in the vicinity of your base. DO NOT work against Syndicate personnel (such as traitors or nuclear operatives). You may work with or against non-Syndicate antagonists on a case-by-case basis. DO NOT leave your base without admin permission."
/obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize(mapload)
. = ..()
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index ca22fb5cb0e..29a4509ae7a 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -80,19 +80,18 @@ var/list/GPS_list = list()
popup.open()
/obj/item/gps/Topic(href, href_list)
- if(..(state = inventory_state))
+ if(..())
return 1
if(href_list["tag"] )
- var/a = input("Please enter desired tag.", name, gpstag) as text|null
- if(!a || ..(state = inventory_state))
- return 1
+ var/tag = input("Please enter desired tag.", name, gpstag) as text|null
+ if(!tag || ..())
+ return TRUE
- a = uppertext(sanitize(copytext(a, 1, 5)))
- if(src.loc == usr)
- gpstag = a
- name = "global positioning system ([gpstag])"
- attack_self(usr)
+ tag = uppertext(sanitize(copytext(tag, 1, 5)))
+ gpstag = tag
+ name = "global positioning system ([gpstag])"
+ attack_self(usr)
/obj/item/gps/science
icon_state = "gps-s"
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 35694b3719e..26526f68951 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/species/drask/head.dmi b/icons/mob/species/drask/head.dmi
index 41bf78cc8c6..fadfc1ed68d 100644
Binary files a/icons/mob/species/drask/head.dmi and b/icons/mob/species/drask/head.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index 697c3888f77..a5fa1e95a3c 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/grey/head.dmi b/icons/mob/species/grey/head.dmi
index e24367a10e2..201e1032562 100644
Binary files a/icons/mob/species/grey/head.dmi and b/icons/mob/species/grey/head.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
index 188db97e788..bd5465857d8 100644
Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
index 42832013f85..c4d1a7a2b3c 100644
Binary files a/icons/mob/species/plasmaman/suit.dmi and b/icons/mob/species/plasmaman/suit.dmi differ
diff --git a/icons/mob/species/skrell/head.dmi b/icons/mob/species/skrell/head.dmi
new file mode 100644
index 00000000000..ec5e8dd62e4
Binary files /dev/null and b/icons/mob/species/skrell/head.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index 8cb76c80b75..3b2c1891c07 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index 1b7299cc8fb..bcc02304de0 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a4218e5af40..5274697cdc1 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 6e2c3d9836d..3c372768f16 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index fb0c9962a07..7d9f2999e27 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index 971978ccff4..b836b78538f 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 3af770d719a..0716073b931 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index 8f7f7f103c2..43b527266b8 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi
index 61d5e4b3b67..751ecf7626d 100644
Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
index 1d85d184ad1..fc76e521d55 100644
Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
index 43d69f5fa82..78ddd94dedb 100644
Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and b/icons/obj/clothing/species/plasmaman/suits.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index e212d9c5882..5a976767f11 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index e30d7888844..baa04328498 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ