diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
index cfe522aeb415..bda6fb742d53 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
@@ -373,7 +373,7 @@
name = "charge rifle"
},
/obj/item/gun/energy/lasercannon{
- pixel_y = 5;
+ pixel_y = 5
},
/obj/item/gun/energy/lasercannon,
/obj/effect/turf_decal/industrial/hatch,
diff --git a/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm b/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm
index ea1a18b11c4b..6a81ff12aaac 100644
--- a/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm
@@ -67,6 +67,11 @@
},
/turf/open/water/beach/deep,
/area/overmap_encounter/planetoid/beachplanet/explored)
+"eB" = (
+/obj/item/storage/box/ammo/c38,
+/obj/structure/closet/crate/wooden,
+/turf/open/floor/wood,
+/area/ruin/beach)
"eJ" = (
/obj/effect/turf_decal/siding/wood{
dir = 5
@@ -200,12 +205,6 @@
/obj/structure/railing/corner,
/turf/open/water/beach/deep,
/area/overmap_encounter/planetoid/beachplanet/explored)
-"kj" = (
-/obj/structure/closet/cabinet,
-/obj/item/pneumatic_cannon/speargun,
-/obj/item/melee/knife/hunting,
-/turf/open/floor/wood,
-/area/ruin/beach)
"kr" = (
/obj/effect/turf_decal/weather/sand/corner{
dir = 1
@@ -280,11 +279,6 @@
},
/turf/open/floor/plating/asteroid/sand,
/area/overmap_encounter/planetoid/cave/explored)
-"mq" = (
-/obj/item/ammo_box/c38_box,
-/obj/structure/closet/crate/wooden,
-/turf/open/floor/wood,
-/area/ruin/beach)
"my" = (
/obj/effect/turf_decal/weather/sand{
dir = 5
@@ -745,12 +739,27 @@
},
/turf/open/floor/wood/ebony,
/area/overmap_encounter/planetoid/beachplanet/explored)
+"CJ" = (
+/obj/structure/closet/cabinet,
+/obj/item/pneumatic_cannon/speargun,
+/obj/item/melee/knife/hunting,
+/obj/machinery/light/small/directional/east{
+ light_color = "#d8b1b1"
+ },
+/turf/open/floor/wood,
+/area/ruin/beach)
"CV" = (
/obj/machinery/grill,
/obj/effect/turf_decal/corner/opaque/pink/diagonal,
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plastic,
/area/ruin/beach)
+"DG" = (
+/obj/structure/closet/cabinet,
+/obj/item/pneumatic_cannon/speargun,
+/obj/item/melee/knife/hunting,
+/turf/open/floor/wood,
+/area/ruin/beach)
"DL" = (
/obj/effect/turf_decal/siding/wood{
dir = 4
@@ -1047,15 +1056,6 @@
/obj/effect/turf_decal/siding/white/corner,
/turf/open/water/beach,
/area/overmap_encounter/planetoid/beachplanet/explored)
-"PB" = (
-/obj/structure/closet/cabinet,
-/obj/item/pneumatic_cannon/speargun,
-/obj/item/melee/knife/hunting,
-/obj/machinery/light/small/directional/east{
- light_color = "#d8b1b1"
- },
-/turf/open/floor/wood,
-/area/ruin/beach)
"PC" = (
/obj/effect/turf_decal/weather/sand{
dir = 10
@@ -2186,9 +2186,9 @@ sz
ut
Ty
oS
-mq
-kj
-PB
+eB
+DG
+CJ
ut
BW
BN
diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
index 997f6bb56703..839e87815f93 100644
--- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
@@ -666,13 +666,8 @@
/obj/structure/table/reinforced{
color = "#c1b6a5"
},
-/obj/item/ammo_box/c38_box{
- pixel_x = 10;
- pixel_y = 8
- },
-/obj/item/ammo_box/c38_box{
- pixel_x = 10
- },
+/obj/item/storage/box/ammo/c38,
+/obj/item/storage/box/ammo/c38,
/obj/structure/sign/poster/contraband/energy_swords{
pixel_x = -32
},
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
index 29710e094f64..42aa6b288469 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
@@ -383,7 +383,7 @@
"EF" = (
/obj/effect/decal/cleanable/blood/gibs/torso,
/obj/structure/safe,
-/obj/item/ammo_box/a12g/slug,
+/obj/item/storage/box/ammo/a12g_slug,
/obj/item/melee/knife/combat,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm
index aab9b566f78e..f6efbca453e2 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm
@@ -3050,7 +3050,7 @@
/obj/item/clothing/under/rank/security/officer/blueshirt,
/obj/item/clothing/gloves/combat,
/obj/item/clothing/shoes/jackboots,
-/obj/item/ammo_box/c9mm,
+/obj/item/storage/box/ammo/c9mm,
/obj/machinery/light/small/broken/directional/north,
/obj/effect/turf_decal/corner/transparent/bar/three_quarters{
dir = 4
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm
index 4d63ae26b5bb..8f3921ed0520 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm
@@ -92,7 +92,7 @@
name = "armory locker";
req_one_access_txt = "1"
},
-/obj/item/ammo_box/a12g,
+/obj/item/storage/box/ammo/a12g_buckshot,
/turf/open/floor/mineral/plastitanium,
/area/ruin/unpowered/crashed_starwalker)
"bL" = (
@@ -942,7 +942,7 @@
/obj/effect/turf_decal/industrial/outline/yellow,
/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/structure/closet/crate/secure/gear,
-/obj/item/ammo_box/c10mm/surplus,
+/obj/item/storage/box/ammo/c10mm_surplus,
/obj/item/weaponcrafting/stock,
/obj/item/weaponcrafting/stock{
pixel_x = -6
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_lava_canyon.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_lava_canyon.dmm
index 92fa7dfb9203..6ad3e8ba7458 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_lava_canyon.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_lava_canyon.dmm
@@ -883,7 +883,7 @@
/area/overmap_encounter/planetoid/lava/explored)
"zb" = (
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner{
- loot = list(/obj/item/melee/transforming/cleaving_saw,/obj/item/gun/energy/kinetic_accelerator,/obj/item/keycard/gatedrop/lavacanyon);
+ loot = list(/obj/item/melee/transforming/cleaving_saw,/obj/item/gun/energy/kinetic_accelerator,/obj/item/keycard/gatedrop/lavacanyon)
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/overmap_encounter/planetoid/cave/explored)
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm
index ef9240170e41..183df18879da 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm
@@ -2745,7 +2745,7 @@
/area/ruin/rockplanet/nanotrasen)
"WY" = (
/obj/structure/frame/computer{
- dir = 1;
+ dir = 1
},
/obj/effect/turf_decal/corner/opaque/red/diagonal,
/turf/open/floor/plasteel/tech/techmaint,
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
index 2fd3caa4c42f..3926cffbbf81 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
@@ -3086,7 +3086,7 @@
pixel_x = -3
},
/obj/item/ammo_box/magazine/illestren_a850r,
-/obj/item/ammo_box/c9mm/ap,
+/obj/item/storage/box/ammo/c9mm/ap,
/obj/item/ammo_box/magazine/illestren_a850r,
/obj/item/ammo_box/magazine/co9mm{
start_empty = 1
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
index a86efe2e9744..a47ad168fb72 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm
@@ -1862,10 +1862,7 @@
pixel_x = 5;
pixel_y = 7
},
-/obj/item/ammo_box/foambox/riot{
- pixel_x = -3;
- pixel_y = -3
- },
+/obj/item/storage/box/ammo/foam_darts/riot,
/obj/structure/cable{
icon_state = "4-8"
},
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_shippingdock.dmm b/_maps/RandomRuins/RockRuins/rockplanet_shippingdock.dmm
index 3394913e2d2d..f18742a8aadb 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_shippingdock.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_shippingdock.dmm
@@ -2002,7 +2002,7 @@
},
/obj/item/ammo_box/magazine/m9mm_rattlesnake,
/obj/item/ammo_box/magazine/m9mm_rattlesnake,
-/obj/item/storage/pistolcase/ringneck,
+/obj/item/gun/ballistic/automatic/pistol/rattlesnake/no_mag,
/turf/open/floor/plasteel/mono/dark,
/area/ruin/rockplanet/shippingdocksecure)
"rK" = (
diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
index b903fd3cce78..c7b060634951 100644
--- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
+++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
@@ -1301,7 +1301,7 @@
"XP" = (
/obj/structure/table,
/obj/item/trash/can,
-/obj/item/ammo_box/c45/surplus,
+/obj/item/storage/box/ammo/c45_surplus,
/turf/open/floor/concrete,
/area/ruin)
"XS" = (
diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm
index 397dff3689ee..6906e1dd2bed 100644
--- a/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm
+++ b/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm
@@ -1447,7 +1447,7 @@
/obj/machinery/door/airlock/hatch{
welded = 1
},
-/turf/template_noop,
+/turf/open/floor/plating,
/area/ruin/whitesands/pubbycrash/split)
"ET" = (
/obj/structure/cable/yellow{
diff --git a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
index 3d05cfb13d35..e126234531f2 100644
--- a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
+++ b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
@@ -2694,8 +2694,8 @@
/obj/structure/closet/crate/secure/weapon{
name = "Ammo Crate"
},
-/obj/item/ammo_box/c9mm/surplus,
-/obj/item/ammo_box/c9mm/surplus,
+/obj/item/storage/box/ammo/c9mm_surplus,
+/obj/item/storage/box/ammo/c9mm_surplus,
/obj/item/ammo_box/magazine/co9mm,
/obj/item/ammo_box/magazine/co9mm,
/turf/open/floor/plasteel,
diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
index db3f30c15f76..6b75031ae8ba 100644
--- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
@@ -320,7 +320,7 @@
/obj/item/toy/talking/AI{
pixel_x = 20
},
-/obj/item/ammo_box/foambox/riot,
+/obj/item/storage/box/ammo/foam_darts/riot,
/obj/item/gun/ballistic/shotgun/toy,
/turf/open/floor/light,
/area/ruin/space/has_grav/spacemall/shop2)
@@ -2434,7 +2434,7 @@
/area/ruin/space/has_grav/spacemall)
"jm" = (
/obj/structure/rack,
-/obj/item/ammo_box/c9mm,
+/obj/item/storage/box/ammo/c9mm,
/obj/item/ammo_box/magazine/co9mm{
pixel_x = 5
},
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm
index aa5797d05a95..dba9f5e3c3c9 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm
@@ -118,13 +118,13 @@
/area/ruin/powered)
"gw" = (
/obj/structure/table,
-/obj/item/ammo_box/c45,
+/obj/item/storage/box/ammo/c45,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/mono/white,
/area/ruin/powered)
"gx" = (
/obj/structure/table,
-/obj/item/ammo_box/c9mm/rubbershot,
+/obj/item/storage/box/ammo/c9mm_rubber,
/turf/open/floor/plasteel/mono/white,
/area/ruin/powered)
"gz" = (
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm
index 934b648c0bd6..adab5732e0c1 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm
@@ -23,7 +23,7 @@
/area/ruin/wasteplanet)
"bc" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/ammo_box/c9mm,
+/obj/item/storage/box/ammo/c9mm,
/turf/open/floor/plating/wasteplanet,
/area/ruin/wasteplanet)
"bd" = (
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_yard.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_yard.dmm
index 60325851692d..a53934c91013 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_yard.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_yard.dmm
@@ -3042,10 +3042,10 @@
icon_state = "0-2"
},
/obj/structure/closet/wall/directional/west,
-/obj/item/gun/ballistic/revolver,
/obj/item/clothing/suit/hooded/wintercoat/captain,
/obj/item/storage/firstaid/o2,
/obj/machinery/light/small/broken/directional/north,
+/obj/item/gun/ballistic/revolver/viper/indie,
/turf/open/floor/plasteel/wasteplanet,
/area/ruin/wasteplanet/wasteplanet_shipbreaking/ship)
"Mf" = (
diff --git a/_maps/shuttles/independent/independent_dwayne.dmm b/_maps/shuttles/independent/independent_dwayne.dmm
index d1cc698c0c92..7f8e7b569c68 100644
--- a/_maps/shuttles/independent/independent_dwayne.dmm
+++ b/_maps/shuttles/independent/independent_dwayne.dmm
@@ -272,9 +272,9 @@
dir = 9
},
/obj/effect/decal/cleanable/dirt,
-/obj/item/ammo_box/c38_box,
-/obj/item/ammo_box/c38_box,
-/obj/item/ammo_box/c38_box,
+/obj/item/storage/box/ammo/c38,
+/obj/item/storage/box/ammo/c38,
+/obj/item/storage/box/ammo/c38,
/obj/structure/closet/crate/secure/plasma{
name = "ammo crate";
desc = "A secure ammo crate."
diff --git a/_maps/shuttles/independent/independent_kilo.dmm b/_maps/shuttles/independent/independent_kilo.dmm
index 35f955ff0b3d..f9504be9d31e 100644
--- a/_maps/shuttles/independent/independent_kilo.dmm
+++ b/_maps/shuttles/independent/independent_kilo.dmm
@@ -661,7 +661,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/obj/item/ammo_box/a12g/rubbershot,
+/obj/item/storage/box/ammo/a12g_rubbershot,
/obj/item/gun/ballistic/shotgun/doublebarrel/presawn{
spawnwithmagazine = 0
},
@@ -1875,7 +1875,7 @@
icon_state = "9-10"
},
/obj/effect/decal/cleanable/oil,
-/obj/item/ammo_box/a12g,
+/obj/item/storage/box/ammo/a12g_buckshot,
/obj/item/gun/ballistic/shotgun/doublebarrel/no_mag,
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm
index d6cb54aed39c..d87ae083832b 100644
--- a/_maps/shuttles/independent/independent_rigger.dmm
+++ b/_maps/shuttles/independent/independent_rigger.dmm
@@ -4132,7 +4132,7 @@
name = "ammunition locker";
req_access_txt = "1"
},
-/obj/item/ammo_box/c38_box,
+/obj/item/storage/box/ammo/c38,
/obj/item/ammo_box/magazine/m45/rubber,
/obj/item/ammo_box/magazine/m45/rubber,
/obj/item/ammo_box/magazine/m45,
diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm
index 3bf95ea99b6f..75784c301eda 100644
--- a/_maps/shuttles/independent/independent_shetland.dmm
+++ b/_maps/shuttles/independent/independent_shetland.dmm
@@ -3475,7 +3475,7 @@
req_access_txt = "1";
req_ship_access = 1
},
-/obj/item/ammo_box/c38_box,
+/obj/item/storage/box/ammo/c38,
/obj/effect/turf_decal/box,
/obj/item/ammo_box/c38,
/obj/item/ammo_box/c38,
diff --git a/_maps/shuttles/inteq/inteq_colossus.dmm b/_maps/shuttles/inteq/inteq_colossus.dmm
index 74ac142692c6..70f32bfb60f2 100644
--- a/_maps/shuttles/inteq/inteq_colossus.dmm
+++ b/_maps/shuttles/inteq/inteq_colossus.dmm
@@ -2224,9 +2224,7 @@
name = "folder"
},
/obj/item/pen/fourcolor,
-/obj/item/stamp/hos{
- name = "vanguard's rubber stamp"
- },
+/obj/item/stamp/inteq/vanguard,
/obj/item/reagent_containers/food/drinks/coffee{
pixel_y = 20
},
@@ -4212,9 +4210,7 @@
desc = "A slick black folder stamped 'Property of Inteq Risk Management Group.'";
name = "folder"
},
-/obj/item/stamp/law{
- name = "master at arms' rubber stamp"
- },
+/obj/item/stamp/inteq/maa,
/obj/item/table_bell{
pixel_y = 13
},
diff --git a/_maps/shuttles/inteq/inteq_hound.dmm b/_maps/shuttles/inteq/inteq_hound.dmm
index da82ccbf26b7..c6f9e34a653d 100644
--- a/_maps/shuttles/inteq/inteq_hound.dmm
+++ b/_maps/shuttles/inteq/inteq_hound.dmm
@@ -50,10 +50,7 @@
pixel_x = -11;
pixel_y = 5
},
-/obj/item/ammo_box/a762_40/inteq{
- pixel_x = 5;
- pixel_y = 12
- },
+/obj/item/storage/box/ammo/a762_40/inteq,
/obj/item/reagent_containers/food/drinks/bottle/whiskey{
pixel_x = -7;
pixel_y = 6
@@ -2346,9 +2343,7 @@
/obj/item/gps{
pixel_x = 12
},
-/obj/item/stamp/hos{
- name = "vanguard's rubber stamp"
- },
+/obj/item/stamp/inteq/vanguard,
/obj/item/pen/fountain,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm
index 2ab9a9405507..79ec309513f8 100644
--- a/_maps/shuttles/inteq/inteq_talos.dmm
+++ b/_maps/shuttles/inteq/inteq_talos.dmm
@@ -2529,9 +2529,7 @@
/obj/effect/turf_decal/corner/opaque/yellow{
dir = 1
},
-/obj/item/stamp/hos{
- name = "vanguard's rubber stamp"
- },
+/obj/item/stamp/inteq/vanguard,
/obj/machinery/airalarm/directional/north,
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
@@ -5797,9 +5795,7 @@
desc = "A slick black folder stamped 'Property of Inteq Risk Management Group.'";
name = "folder"
},
-/obj/item/stamp/law{
- name = "master at arms' rubber stamp"
- },
+/obj/item/stamp/inteq/maa,
/obj/item/table_bell{
pixel_x = -15
},
@@ -7830,9 +7826,7 @@
/obj/item/megaphone/cargo{
name = "engineering megaphone"
},
-/obj/item/stamp/ce{
- name = "honorable artificer's rubber stamp"
- },
+/obj/item/stamp/inteq/artificer,
/obj/item/clothing/glasses/meson/engine,
/obj/item/clothing/glasses/welding,
/obj/item/pipe_dispenser,
diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm
index 3f709a261b15..00b25f936eab 100644
--- a/_maps/shuttles/inteq/inteq_valor.dmm
+++ b/_maps/shuttles/inteq/inteq_valor.dmm
@@ -100,6 +100,8 @@
/obj/machinery/suit_storage_unit/inherit,
/obj/effect/turf_decal/industrial/outline/yellow,
/obj/machinery/light/small/directional/north,
+/obj/item/clothing/suit/space/inteq,
+/obj/item/clothing/head/helmet/space/inteq,
/turf/open/floor/plasteel,
/area/ship/crew/office)
"bx" = (
@@ -663,6 +665,7 @@
/obj/item/clothing/glasses/hud/security/sunglasses/inteq,
/obj/item/clothing/head/helmet/swat/inteq,
/obj/item/clothing/mask/gas/sechailer,
+/obj/item/radio/intercom/directional/north,
/turf/open/floor/plasteel,
/area/ship/crew/office)
"gb" = (
@@ -746,8 +749,8 @@
"gq" = (
/obj/machinery/light_switch{
dir = 1;
- pixel_y = -20;
- pixel_x = -3
+ pixel_x = -3;
+ pixel_y = -20
},
/turf/open/floor/plasteel/mono/dark,
/area/ship/cargo)
@@ -1042,14 +1045,32 @@
/turf/open/floor/plating,
/area/ship/medical/surgery)
"jN" = (
-/obj/structure/chair/office,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/effect/turf_decal/corner/opaque/brown{
+ dir = 4
},
-/obj/effect/turf_decal/corner/transparent/inteqbrown/half,
-/turf/open/floor/plasteel,
-/area/ship/crew/office)
+/obj/effect/turf_decal/corner/opaque/yellow,
+/obj/effect/turf_decal/corner/opaque/brown{
+ dir = 8
+ },
+/obj/machinery/airalarm/directional/east,
+/obj/structure/rack,
+/obj/item/storage/belt/security/webbing/inteq{
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/item/storage/belt/security/webbing/inteq{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/item/clothing/head/helmet/inteq{
+ pixel_x = -9;
+ pixel_y = 6
+ },
+/obj/item/clothing/head/helmet/inteq{
+ pixel_x = -7
+ },
+/turf/open/floor/plasteel/dark,
+/area/ship/security)
"jQ" = (
/obj/structure/catwalk/over/plated_catwalk,
/obj/machinery/light/directional/east,
@@ -1087,8 +1108,8 @@
},
/obj/machinery/light_switch{
dir = 1;
- pixel_y = -20;
- pixel_x = 4
+ pixel_x = 4;
+ pixel_y = -20
},
/turf/open/floor/plasteel/patterned/ridged,
/area/ship/medical)
@@ -1178,22 +1199,8 @@
/obj/structure/reagent_dispensers/peppertank{
pixel_y = 28
},
-/obj/structure/rack,
-/obj/item/storage/belt/security/webbing/inteq{
- pixel_x = 6;
- pixel_y = 8
- },
-/obj/item/storage/belt/security/webbing/inteq{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/item/clothing/head/helmet/inteq{
- pixel_x = -9;
- pixel_y = 6
- },
-/obj/item/clothing/head/helmet/inteq{
- pixel_x = -7
- },
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/suit/space/hardsuit/security/independent/inteq,
/turf/open/floor/plasteel/dark,
/area/ship/security)
"kL" = (
@@ -1296,15 +1303,18 @@
/area/ship/crew/canteen)
"lN" = (
/obj/structure/table,
-/obj/machinery/door/window/southleft,
+/obj/item/paper_bin,
+/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
- dir = 8
+ dir = 4
},
/obj/machinery/door/firedoor/border_only,
/obj/machinery/door/firedoor/border_only{
dir = 1
},
/obj/effect/turf_decal/corner/transparent/inteqbrown/full,
+/obj/item/folder/yellow,
+/obj/item/pen,
/turf/open/floor/plasteel/patterned,
/area/ship/crew/office)
"lW" = (
@@ -1995,9 +2005,6 @@
/area/ship/maintenance/port)
"rY" = (
/obj/effect/turf_decal/corner/opaque/yellow,
-/obj/effect/turf_decal/corner/opaque/brown{
- dir = 4
- },
/obj/effect/turf_decal/corner/opaque/brown{
dir = 8
},
@@ -2008,7 +2015,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 10
},
-/obj/machinery/airalarm/directional/east,
/turf/open/floor/plasteel/dark,
/area/ship/security)
"sb" = (
@@ -2598,11 +2604,9 @@
/area/ship/medical)
"xr" = (
/obj/structure/table,
-/obj/item/paper_bin,
-/obj/item/pen,
-/obj/structure/window/reinforced,
+/obj/machinery/door/window/southleft,
/obj/structure/window/reinforced{
- dir = 4
+ dir = 8
},
/obj/machinery/door/firedoor/border_only,
/obj/machinery/door/firedoor/border_only{
@@ -2938,7 +2942,6 @@
dir = 1
},
/obj/effect/turf_decal/steeldecal/steel_decals_central7,
-/obj/machinery/airalarm/directional/north,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -3092,14 +3095,10 @@
/turf/template_noop,
/area/template_noop)
"BC" = (
-/obj/structure/filingcabinet/double,
/obj/structure/sign/poster/official/help_others{
pixel_y = 32
},
-/obj/effect/turf_decal/corner/transparent/inteqbrown/border{
- dir = 1
- },
-/turf/open/floor/plasteel,
+/turf/closed/wall/mineral/plastitanium,
/area/ship/crew/office)
"BL" = (
/obj/effect/turf_decal/corner/opaque/brown{
@@ -3592,10 +3591,11 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
"Gm" = (
+/obj/effect/turf_decal/corner/transparent/inteqbrown/half,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-4"
},
-/obj/effect/turf_decal/corner/transparent/inteqbrown/half,
+/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/plasteel,
/area/ship/crew/office)
"Go" = (
@@ -4430,6 +4430,7 @@
/obj/item/storage/lockbox/medal/sec,
/obj/item/clothing/glasses/hud/security/sunglasses/inteq,
/obj/item/clothing/head/inteq_peaked,
+/obj/item/stamp/inteq/vanguard,
/turf/open/floor/carpet/orange,
/area/ship/bridge)
"Od" = (
@@ -4670,8 +4671,8 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
-/obj/item/radio/intercom/directional/south,
/obj/effect/turf_decal/corner/transparent/inteqbrown/half,
+/obj/structure/chair/office,
/turf/open/floor/plasteel,
/area/ship/crew/office)
"Qw" = (
@@ -4753,7 +4754,26 @@
/turf/open/floor/plasteel/dark,
/area/ship/medical/surgery)
"Rh" = (
-/turf/closed/wall/mineral/plastitanium,
+/obj/structure/sign/poster/official/safety_report{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/corner/opaque/brown{
+ dir = 4
+ },
+/obj/effect/turf_decal/corner/opaque/yellow,
+/obj/effect/turf_decal/corner/opaque/yellow{
+ dir = 1
+ },
+/obj/structure/rack,
+/obj/item/storage/box/ammo/c9mm_rubber{
+ pixel_x = 5;
+ pixel_y = 10
+ },
+/obj/item/storage/box/ammo/c9mm{
+ pixel_x = -2;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/dark,
/area/ship/security)
"RA" = (
/obj/item/storage/backpack/messenger/inteq,
@@ -4805,6 +4825,7 @@
/obj/item/clothing/glasses/hud/health/sunglasses,
/obj/item/storage/box/hypospray/CMO,
/obj/item/clothing/gloves/color/latex/nitrile,
+/obj/item/stamp/inteq/corpsman,
/turf/open/floor/carpet/blue,
/area/ship/bridge)
"RT" = (
@@ -4832,6 +4853,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/airalarm/directional/north,
/turf/open/floor/plasteel/patterned/grid,
/area/ship/hallway/port)
"Sh" = (
@@ -5071,21 +5093,10 @@
/obj/effect/turf_decal/corner/opaque/brown{
dir = 4
},
-/obj/effect/turf_decal/corner/opaque/yellow,
-/obj/structure/rack,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/item/ammo_box/c9mm/rubbershot{
- pixel_x = 5;
- pixel_y = 10
- },
-/obj/item/ammo_box/c9mm{
- pixel_x = -2;
- pixel_y = 2
- },
/obj/machinery/light/small/directional/north,
-/obj/structure/sign/poster/official/safety_report{
- pixel_x = 32
- },
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/suit/space/hardsuit/security/independent/inteq,
/turf/open/floor/plasteel/dark,
/area/ship/security)
"Vy" = (
@@ -5901,7 +5912,7 @@ SL
(11,1,1) = {"
Zu
Rh
-Rh
+jN
Zu
uB
ua
@@ -5934,8 +5945,8 @@ SL
(12,1,1) = {"
tZ
BC
-jN
-lN
+oO
+oO
gh
zs
fN
@@ -6001,7 +6012,7 @@ SL
tZ
mG
Qo
-tZ
+lN
An
Sd
HC
diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm
index 92e024ba7bf6..9ea8b60d9b89 100644
--- a/_maps/shuttles/inteq/inteq_vaquero.dmm
+++ b/_maps/shuttles/inteq/inteq_vaquero.dmm
@@ -51,12 +51,13 @@
/turf/open/floor/plasteel/dark,
/area/ship/security)
"bg" = (
-/obj/structure/railing{
- dir = 8
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel/stairs,
+/obj/structure/weightmachine/weightlifter,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"bi" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
@@ -72,6 +73,19 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/plasteel/tech,
/area/ship/maintenance/starboard)
+"bl" = (
+/obj/structure/closet/crate/freezer/blood,
+/obj/machinery/iv_drip,
+/obj/machinery/light/small/directional/south,
+/obj/item/radio/intercom/directional/east,
+/obj/effect/turf_decal/steeldecal/steel_decals10{
+ dir = 5
+ },
+/obj/effect/turf_decal/steeldecal/steel_decals10{
+ dir = 6
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/medical)
"bn" = (
/obj/machinery/power/smes/shuttle/precharged{
dir = 4
@@ -87,14 +101,13 @@
/turf/open/floor/engine/hull/reinforced,
/area/ship/maintenance/port)
"bq" = (
-/obj/effect/turf_decal/box/corners,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
- },
/obj/item/trash/energybar,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"bt" = (
@@ -110,7 +123,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/computer/helm/viewscreen/directional/south,
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
"bz" = (
@@ -136,12 +148,15 @@
/turf/open/floor/plasteel/patterned/grid,
/area/ship/hallway/central)
"bL" = (
-/obj/structure/bed,
-/obj/structure/curtain/bounty,
-/obj/item/bedsheet/brown,
/obj/structure/sign/poster/clip/lanchester{
pixel_y = -32
},
+/obj/machinery/light/small/directional/east,
+/obj/effect/spawner/bunk_bed,
+/obj/structure/curtain/bounty,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
/turf/open/floor/carpet/black,
/area/ship/crew)
"ce" = (
@@ -173,12 +188,17 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/dark,
/area/ship/security)
-"dq" = (
-/obj/effect/turf_decal/industrial/traffic{
- dir = 8
+"cH" = (
+/obj/item/radio/intercom/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/tech,
+/area/ship/security)
+"dq" = (
+/obj/effect/turf_decal/box/corners{
+ dir = 4
},
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
@@ -268,9 +288,6 @@
/obj/item/gun/ballistic/automatic/pistol/commander/inteq{
pixel_y = -5
},
-/obj/structure/sign/poster/contraband/peacemaker{
- pixel_x = 32
- },
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/tech/grid,
/area/ship/security)
@@ -323,6 +340,7 @@
dir = 10
},
/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/turf_decal/box/corners,
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"fI" = (
@@ -344,7 +362,7 @@
/area/ship/security)
"fJ" = (
/turf/closed/wall/mineral/plastitanium,
-/area/ship/security)
+/area/ship/medical)
"fV" = (
/obj/structure/catwalk/over/plated_catwalk,
/obj/structure/cable{
@@ -362,6 +380,13 @@
/obj/structure/railing/corner,
/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
+"fZ" = (
+/obj/structure/marker_beacon{
+ picked_color = "Yellow"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/external/dark)
"gh" = (
/obj/machinery/photocopier,
/obj/effect/turf_decal/corner/opaque/brown{
@@ -385,27 +410,11 @@
/obj/effect/turf_decal/industrial/traffic{
dir = 1
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
- },
-/obj/machinery/button/shieldwallgen{
- dir = 1;
- id = "vaquero_cargo";
- pixel_x = 5;
- pixel_y = -19
- },
-/obj/machinery/button/door{
- dir = 1;
- id = "vaquero_cargo";
- name = "Cargo Door Control";
- pixel_x = -4;
- pixel_y = -20
+ dir = 4
},
-/obj/effect/turf_decal/industrial/caution{
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
@@ -425,17 +434,9 @@
/obj/item/pickaxe/mini,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/siding/thinplating/dark,
-/obj/structure/extinguisher_cabinet/directional/north,
+/obj/item/radio/intercom/directional/north,
/turf/open/floor/plasteel/tech,
/area/ship/cargo)
-"gO" = (
-/obj/effect/turf_decal/trimline/opaque/yellow/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine/hull/reinforced,
-/area/ship/external/dark)
"gY" = (
/obj/structure/table/reinforced,
/obj/item/spacecash/bundle/c500,
@@ -568,13 +569,12 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
"if" = (
-/obj/effect/turf_decal/industrial/traffic{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel/patterned,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/obj/machinery/airalarm/directional/east,
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/suit/space/inteq,
+/obj/item/clothing/head/helmet/space/inteq,
+/turf/open/floor/plasteel/tech,
/area/ship/cargo)
"iu" = (
/obj/structure/cable{
@@ -658,6 +658,9 @@
/turf/open/floor/plasteel/dark,
/area/ship/security)
"jg" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
/turf/open/floor/carpet/black,
/area/ship/crew)
"jw" = (
@@ -684,9 +687,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 9
},
-/obj/item/stamp/hos{
- name = "vanguard's rubber stamp"
- },
+/obj/item/stamp/inteq/vanguard,
/obj/structure/cable{
icon_state = "1-8"
},
@@ -704,12 +705,9 @@
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"jE" = (
-/obj/structure/bed,
-/obj/structure/curtain/bounty,
-/obj/item/bedsheet/brown,
-/obj/machinery/light/small/directional/east,
-/obj/machinery/airalarm/directional/north,
/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/bunk_bed,
+/obj/structure/curtain/bounty,
/turf/open/floor/carpet/black,
/area/ship/crew)
"jI" = (
@@ -816,7 +814,7 @@
/obj/item/clothing/suit/space/inteq,
/obj/item/clothing/head/helmet/space/inteq,
/obj/effect/turf_decal/siding/thinplating/dark,
-/obj/item/radio/intercom/directional/north,
+/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/plasteel/tech,
/area/ship/cargo)
"lm" = (
@@ -864,16 +862,23 @@
/turf/open/floor/plasteel/tech,
/area/ship/maintenance/starboard)
"lL" = (
-/obj/structure/closet/crate/freezer/blood,
-/obj/machinery/iv_drip,
-/obj/machinery/light/small/directional/south,
-/obj/item/radio/intercom/directional/east,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 10
+ },
+/obj/machinery/firealarm/directional/west,
/obj/effect/turf_decal/steeldecal/steel_decals10{
dir = 5
},
/obj/effect/turf_decal/steeldecal/steel_decals10{
dir = 6
},
+/obj/structure/bed,
/turf/open/floor/plasteel/patterned/brushed,
/area/ship/medical)
"lU" = (
@@ -936,7 +941,6 @@
/obj/machinery/suit_storage_unit/inherit,
/obj/item/clothing/suit/space/inteq,
/obj/item/clothing/head/helmet/space/inteq,
-/obj/machinery/airalarm/directional/east,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/siding/thinplating/dark,
/turf/open/floor/plasteel/tech,
@@ -959,10 +963,22 @@
/obj/effect/turf_decal/trimline/opaque/yellow/warning{
dir = 1
},
-/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
/turf/open/floor/engine/hull/reinforced,
/area/ship/external/dark)
"nm" = (
+/obj/docking_port/mobile{
+ dir = 2;
+ launch_status = 0;
+ port_direction = 8;
+ preferred_direction = 4
+ },
+/obj/machinery/porta_turret/ship/inteq{
+ dir = 5;
+ id = "vaquero_grid"
+ },
/turf/closed/wall/mineral/plastitanium,
/area/ship/medical)
"ox" = (
@@ -1075,12 +1091,21 @@
/turf/closed/wall/mineral/plastitanium,
/area/ship/crew/office)
"qE" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/effect/turf_decal/industrial/warning/fulltile,
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine/hull/reinforced,
-/area/ship/external/dark)
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ id = "vaquero_cargo";
+ locked = 1
+ },
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "vaquero_cargo"
+ },
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ship/cargo)
"qQ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -1132,6 +1157,11 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/obj/machinery/light/small/directional/east,
/obj/item/trash/chips,
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 20;
+ pixel_y = -10
+ },
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
"rD" = (
@@ -1145,6 +1175,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/turf/open/floor/carpet/orange,
/area/ship/bridge)
+"rP" = (
+/obj/effect/turf_decal/trimline/opaque/yellow/warning{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/external/dark)
"sm" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -1272,11 +1309,29 @@
},
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ship/security)
+"vs" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/turf_decal/box/corners,
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/glass/twenty,
+/obj/item/stack/sheet/metal/twenty,
+/turf/open/floor/plasteel/patterned,
+/area/ship/cargo)
+"vw" = (
+/obj/structure/marker_beacon{
+ picked_color = "Yellow"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/external/dark)
"vN" = (
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"vT" = (
/obj/effect/turf_decal/trimline/opaque/yellow/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/engine/hull/reinforced,
/area/ship/external/dark)
"vU" = (
@@ -1309,20 +1364,17 @@
/turf/template_noop,
/area/template_noop)
"wy" = (
-/obj/effect/turf_decal/box/corners,
-/obj/structure/closet/crate,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/item/stack/sheet/metal/twenty,
-/obj/item/stack/sheet/glass/twenty,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"wI" = (
-/obj/effect/turf_decal/box/corners{
- dir = 4
- },
/obj/structure/weightmachine/weightlifter,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"wU" = (
@@ -1487,27 +1539,23 @@
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"zr" = (
-/obj/effect/turf_decal/industrial/traffic{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+ dir = 5
},
-/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/box/corners,
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"zG" = (
-/obj/effect/turf_decal/trimline/opaque/yellow/warning{
- dir = 1
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/effect/turf_decal/industrial/warning/fulltile,
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "vaquero_cargo"
},
-/turf/open/floor/engine/hull/reinforced,
-/area/ship/external/dark)
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ship/cargo)
"zM" = (
/obj/machinery/power/terminal{
dir = 8
@@ -1588,13 +1636,12 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
},
-/obj/machinery/newscaster/directional/south,
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
"Am" = (
@@ -1668,21 +1715,32 @@
/turf/open/floor/plasteel/tech,
/area/ship/maintenance/port)
"Bj" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/turf/open/floor/engine/hull/reinforced,
-/area/ship/external/dark)
-"Bl" = (
+/obj/effect/turf_decal/industrial/warning/fulltile,
/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/corner/opaque/yellow,
-/obj/effect/turf_decal/corner/opaque/brown{
- dir = 8
+ icon_state = "0-8"
},
-/obj/machinery/newscaster/directional/south,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/power/shieldwallgen/atmos{
+ anchored = 1;
+ dir = 1;
+ id = "vaquero_cargo";
+ locked = 1
+ },
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "vaquero_cargo"
+ },
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ship/cargo)
+"Bl" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/corner/opaque/yellow,
+/obj/effect/turf_decal/corner/opaque/brown{
+ dir = 8
+ },
+/obj/machinery/newscaster/directional/south,
+/turf/open/floor/plasteel/dark,
/area/ship/security)
"Bu" = (
/obj/structure/closet/wall/directional/north{
@@ -1758,6 +1816,19 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/plasteel/showroomfloor,
/area/ship/crew/toilet)
+"Ch" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/plasteel/patterned,
+/area/ship/cargo)
"Ci" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
@@ -1773,12 +1844,13 @@
/turf/open/floor/plasteel/dark,
/area/ship/security)
"Cl" = (
-/obj/effect/turf_decal/industrial/warning/fulltile,
-/obj/machinery/door/poddoor{
- dir = 4;
- id = "vaquero_cargo"
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
},
-/turf/open/floor/engine/hull/reinforced/interior,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"Cq" = (
/turf/closed/wall/mineral/plastitanium,
@@ -1876,7 +1948,6 @@
},
/obj/effect/turf_decal/siding/thinplating/dark,
/obj/machinery/firealarm/directional/south,
-/obj/item/radio/intercom/directional/east,
/turf/open/floor/plasteel/tech,
/area/ship/security)
"Dh" = (
@@ -1955,33 +2026,21 @@
/turf/open/floor/plasteel/patterned/grid,
/area/ship/hallway/central)
"Ex" = (
+/obj/structure/catwalk/over/plated_catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/machinery/door/airlock/medical/glass{
- dir = 4;
- name = "Infirmary"
- },
-/obj/effect/turf_decal/steeldecal/steel_decals10{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 1
},
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 8
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
},
-/obj/machinery/door/firedoor/border_only{
+/obj/structure/railing/corner{
dir = 8
},
-/turf/open/floor/plasteel/tech,
-/area/ship/medical)
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
"EB" = (
/obj/machinery/door/window/northleft{
dir = 8;
@@ -2073,51 +2132,31 @@
/obj/machinery/computer/helm/viewscreen/directional/south,
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
+"FO" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/security)
"Gq" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ship/crew)
"GB" = (
-/obj/machinery/door/airlock{
- name = "Dormitory"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 5
- },
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 6
+/obj/structure/table,
+/obj/item/flashlight/lamp/green,
+/obj/machinery/newscaster/directional/west,
+/obj/structure/window/reinforced{
+ dir = 1
},
-/turf/open/floor/plasteel/grimy,
+/turf/open/floor/carpet/black,
/area/ship/crew)
"GI" = (
-/obj/structure/weightmachine/weightlifter,
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"GQ" = (
-/obj/item/clothing/under/syndicate/inteq,
-/obj/item/clothing/under/syndicate/inteq,
-/obj/item/clothing/under/syndicate/inteq,
-/obj/item/clothing/under/syndicate/inteq/skirt,
-/obj/item/clothing/under/syndicate/inteq/skirt,
-/obj/item/clothing/under/syndicate/inteq/skirt,
-/obj/item/clothing/shoes/combat,
-/obj/item/clothing/shoes/combat,
-/obj/item/clothing/shoes/combat,
-/obj/item/clothing/shoes/sneakers/black,
-/obj/item/clothing/shoes/sneakers/black,
-/obj/item/clothing/shoes/sneakers/black,
-/obj/structure/closet/wall/directional/north{
- icon_door = "orange_wall";
- name = "uniform closet"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/turf/open/floor/carpet/black,
/area/ship/crew)
"Ha" = (
@@ -2181,36 +2220,15 @@
/turf/open/floor/plasteel/tech/grid,
/area/ship/security)
"HN" = (
-/obj/structure/closet/secure_closet/wall/directional/north{
- icon_door = "med_wall";
- name = "medical locker";
- req_access_txt = "5"
- },
-/obj/item/storage/firstaid/regular{
- pixel_x = 6;
- pixel_y = 3
- },
-/obj/item/storage/firstaid/toxin{
- pixel_x = 2;
- pixel_y = 1
- },
-/obj/item/storage/firstaid/fire{
- pixel_x = -2;
- pixel_y = -1
- },
-/obj/item/storage/firstaid/advanced{
- pixel_x = -6;
- pixel_y = -3
- },
-/obj/structure/sink{
- dir = 8;
- pixel_x = 12
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/structure/sign/poster/official/cleanliness{
- pixel_x = 32
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 1
@@ -2232,7 +2250,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
"In" = (
@@ -2427,23 +2445,17 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/box/corners,
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"LW" = (
-/obj/effect/turf_decal/industrial/warning/fulltile,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- id = "vaquero_cargo";
- locked = 1
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
},
-/obj/machinery/door/poddoor{
- dir = 4;
- id = "vaquero_cargo"
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/turf/open/floor/engine/hull/reinforced/interior,
+/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"Me" = (
/obj/structure/railing{
@@ -2523,12 +2535,19 @@
/turf/open/floor/plasteel/patterned/grid,
/area/ship/hallway/central)
"NO" = (
-/obj/machinery/porta_turret/ship/inteq{
- dir = 6;
- id = "vaquero_grid"
+/obj/structure/railing,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/security)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/cargo)
"NR" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -2644,21 +2663,20 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
"Pn" = (
-/obj/effect/turf_decal/industrial/warning/fulltile,
+/obj/effect/turf_decal/industrial/traffic/corner{
+ dir = 1
+ },
/obj/structure/cable{
- icon_state = "0-8"
+ icon_state = "1-8"
},
-/obj/machinery/power/shieldwallgen/atmos{
- anchored = 1;
- dir = 1;
- id = "vaquero_cargo";
- locked = 1
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/door/poddoor{
- dir = 4;
- id = "vaquero_cargo"
+/obj/structure/sign/warning/incident{
+ pixel_y = -30
},
-/turf/open/floor/engine/hull/reinforced/interior,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"Pp" = (
/obj/machinery/power/smes/engineering,
@@ -2674,23 +2692,40 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
"PD" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/structure/closet/secure_closet/wall/directional/north{
+ icon_door = "med_wall";
+ name = "medical locker";
+ req_access_txt = "5"
},
-/obj/item/storage/backpack/duffelbag/med/surgery,
-/obj/machinery/light_switch{
- dir = 4;
- pixel_x = -20;
- pixel_y = 10
+/obj/item/storage/firstaid/regular{
+ pixel_x = 6;
+ pixel_y = 3
},
-/obj/machinery/firealarm/directional/west,
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 5
+/obj/item/storage/firstaid/toxin{
+ pixel_x = 2;
+ pixel_y = 1
},
-/obj/effect/turf_decal/steeldecal/steel_decals10{
- dir = 6
+/obj/item/storage/firstaid/fire{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/storage/firstaid/advanced{
+ pixel_x = -6;
+ pixel_y = -3
+ },
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = 12
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/cleanliness{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
},
-/obj/structure/bed,
/turf/open/floor/plasteel/patterned/brushed,
/area/ship/medical)
"Qy" = (
@@ -2793,26 +2828,45 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
"RU" = (
-/obj/structure/dresser,
-/obj/machinery/firealarm/directional/west,
/obj/item/radio/intercom/directional/south,
/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/obj/structure/closet/wardrobe/orange{
+ name = "uniform wardrobe";
+ populate = 0
+ },
+/obj/item/storage/backpack/messenger/inteq,
+/obj/item/storage/backpack/messenger/inteq,
+/obj/item/storage/backpack/messenger/inteq,
+/obj/item/clothing/head/beret/sec/inteq,
+/obj/item/clothing/head/beret/sec/inteq,
+/obj/item/clothing/head/beret/sec/inteq,
+/obj/item/clothing/head/soft/inteq,
+/obj/item/clothing/head/soft/inteq,
+/obj/item/clothing/head/soft/inteq,
+/obj/item/clothing/suit/hooded/wintercoat/security/inteq,
+/obj/item/clothing/suit/hooded/wintercoat/security/inteq,
+/obj/item/clothing/suit/hooded/wintercoat/security/inteq,
+/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt,
+/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt,
+/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
/turf/open/floor/carpet/black,
/area/ship/crew)
"RX" = (
/obj/structure/catwalk/over/plated_catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/structure/railing/corner{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
+/obj/structure/railing,
/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"Sc" = (
@@ -2832,6 +2886,9 @@
/area/ship/hallway/central)
"Tc" = (
/obj/structure/ore_box,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"Ti" = (
@@ -2845,11 +2902,9 @@
/turf/open/floor/plasteel/patterned/grid,
/area/ship/hallway/central)
"Tn" = (
-/obj/machinery/suit_storage_unit/inherit,
-/obj/item/clothing/suit/space/inteq,
-/obj/item/clothing/head/helmet/space/inteq,
/obj/machinery/light/directional/north,
/obj/effect/turf_decal/siding/thinplating/dark,
+/obj/structure/rack,
/turf/open/floor/plasteel/tech,
/area/ship/cargo)
"TC" = (
@@ -2861,8 +2916,8 @@
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/turretid/ship{
- pixel_y = 26;
- id = "vaquero_grid"
+ id = "vaquero_grid";
+ pixel_y = 26
},
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
@@ -2907,62 +2962,58 @@
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/bridge)
"TX" = (
-/obj/item/storage/backpack/messenger/inteq,
-/obj/item/storage/backpack/messenger/inteq,
-/obj/item/storage/backpack/messenger/inteq,
-/obj/item/clothing/head/beret/sec/inteq,
-/obj/item/clothing/head/beret/sec/inteq,
-/obj/item/clothing/head/beret/sec/inteq,
-/obj/item/clothing/head/soft/inteq,
-/obj/item/clothing/head/soft/inteq,
-/obj/item/clothing/head/soft/inteq,
-/obj/structure/closet/wall/directional/north{
- icon_door = "orange_wall";
- name = "uniform closet"
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 8
- },
-/obj/item/clothing/suit/hooded/wintercoat/security/inteq,
-/obj/item/clothing/suit/hooded/wintercoat/security/inteq,
-/obj/item/clothing/suit/hooded/wintercoat/security/inteq,
-/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt,
-/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt,
-/obj/item/clothing/suit/hooded/wintercoat/security/inteq/alt,
/turf/open/floor/carpet/black,
/area/ship/crew)
"Uf" = (
-/obj/structure/table,
-/obj/item/flashlight/lamp/green,
/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
/turf/open/floor/carpet/black,
/area/ship/crew)
"Ul" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ship/bridge)
"Ur" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
+/obj/structure/closet/wardrobe/orange{
+ name = "uniform wardrobe";
+ populate = 0
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+/obj/item/clothing/under/syndicate/inteq,
+/obj/item/clothing/under/syndicate/inteq,
+/obj/item/clothing/under/syndicate/inteq,
+/obj/item/clothing/under/syndicate/inteq/skirt,
+/obj/item/clothing/under/syndicate/inteq/skirt,
+/obj/item/clothing/under/syndicate/inteq/skirt,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/shoes/sneakers/black,
+/obj/item/clothing/shoes/sneakers/black,
+/obj/item/clothing/shoes/sneakers/black,
+/turf/open/floor/carpet/black,
+/area/ship/crew)
+"Uy" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/obj/structure/dresser{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
},
-/obj/machinery/light/small/directional/west,
/turf/open/floor/carpet/black,
/area/ship/crew)
"UO" = (
-/obj/docking_port/mobile{
- dir = 2;
- launch_status = 0;
- port_direction = 8;
- preferred_direction = 4
- },
-/obj/machinery/porta_turret/ship/inteq{
- dir = 5;
- id = "vaquero_grid"
+/obj/structure/railing{
+ dir = 8
},
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/medical)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/turf/open/floor/plasteel/stairs,
+/area/ship/cargo)
"UV" = (
/obj/machinery/door/airlock/public/glass{
dir = 4;
@@ -3044,13 +3095,24 @@
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/plasteel/patterned/grid,
/area/ship/hallway/central)
+"VZ" = (
+/obj/machinery/porta_turret/ship/inteq{
+ dir = 6;
+ id = "vaquero_grid"
+ },
+/turf/closed/wall/mineral/plastitanium,
+/area/ship/security)
"Wd" = (
-/obj/structure/marker_beacon{
- picked_color = "Yellow"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/engine/hull/reinforced,
/area/ship/external/dark)
+"Wl" = (
+/obj/effect/turf_decal/trimline/opaque/yellow/warning,
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/external/dark)
"WH" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
name = "exhaust injector"
@@ -3059,9 +3121,6 @@
/turf/open/floor/engine/hull/reinforced,
/area/ship/external/dark)
"WM" = (
-/obj/effect/turf_decal/box/corners{
- dir = 4
- },
/obj/structure/closet/crate,
/obj/item/target/syndicate{
pixel_x = -5;
@@ -3078,6 +3137,9 @@
pixel_y = 5
},
/obj/item/clothing/ears/earmuffs,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
/turf/open/floor/plasteel/patterned/cargo_one,
/area/ship/cargo)
"Xb" = (
@@ -3112,26 +3174,38 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
"Xi" = (
-/obj/structure/marker_beacon{
- picked_color = "Yellow"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
/turf/open/floor/engine/hull/reinforced,
/area/ship/external/dark)
"Xo" = (
/obj/structure/cable{
- icon_state = "0-8"
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/machinery/power/apc/auto_name/directional/north,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
+/obj/machinery/door/airlock/medical/glass{
+ dir = 4;
+ name = "Infirmary"
},
-/obj/effect/turf_decal/siding/thinplating/dark{
+/obj/effect/turf_decal/steeldecal/steel_decals10{
dir = 1
},
-/turf/open/floor/plasteel/patterned/brushed,
+/obj/effect/turf_decal/steeldecal/steel_decals10{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech,
/area/ship/medical)
"XD" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
@@ -3156,6 +3230,21 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plating,
/area/ship/maintenance/port)
+"XL" = (
+/obj/structure/sign/poster/contraband/peacemaker{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/opaque/yellow/line{
+ dir = 1
+ },
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/suit/space/hardsuit/security/independent/inteq,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/security)
"XO" = (
/obj/structure/closet/secure_closet/freezer{
anchored = 1;
@@ -3250,19 +3339,31 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/office)
"Zh" = (
-/obj/effect/turf_decal/industrial/traffic/corner{
+/obj/effect/turf_decal/industrial/traffic{
dir = 1
},
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/sign/warning/incident{
- pixel_y = -30
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
+ },
+/obj/machinery/button/shieldwallgen{
+ dir = 1;
+ id = "vaquero_cargo";
+ pixel_x = 5;
+ pixel_y = -19
+ },
+/obj/machinery/button/door{
+ dir = 1;
+ id = "vaquero_cargo";
+ name = "Cargo Door Control";
+ pixel_x = -4;
+ pixel_y = -20
+ },
+/obj/effect/turf_decal/industrial/caution{
+ dir = 1
},
-/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"Zi" = (
@@ -3349,14 +3450,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = 5;
- pixel_y = -20
- },
-/obj/structure/extinguisher_cabinet/directional/south{
- pixel_x = -6
- },
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
@@ -3367,9 +3460,8 @@
name = "folder";
pixel_x = 5
},
-/obj/item/stamp/law{
- name = "master at arms' rubber stamp";
- pixel_x = 5
+/obj/item/stamp/inteq/maa{
+ pixel_x = 6
},
/obj/item/table_bell{
pixel_x = -4;
@@ -3659,7 +3751,7 @@ VI
Ul
VD
Ag
-Gq
+GQ
GQ
Uf
LB
@@ -3679,7 +3771,7 @@ jB
Ul
sS
bu
-Gq
+TX
TX
jg
LB
@@ -3699,7 +3791,7 @@ TQ
Ul
rA
ZA
-Gq
+Uy
jE
bL
Gq
@@ -3789,7 +3881,7 @@ ww
ww
QJ
kW
-mR
+NO
wI
bq
vN
@@ -3812,9 +3904,9 @@ mE
RX
bg
zr
-if
-dq
+vN
dq
+vs
Zh
te
Ci
@@ -3827,11 +3919,11 @@ ww
(23,1,1) = {"
ww
ww
-nm
-lo
+Eh
+if
Ex
-lo
-lo
+UO
+Ch
LW
Cl
Cl
@@ -3840,27 +3932,27 @@ te
te
OK
te
-fJ
+te
ww
ww
"}
(24,1,1) = {"
ww
ww
-ww
+fJ
lo
Xo
-PD
+lo
lo
qE
zG
-gO
+zG
Bj
te
Hw
fI
te
-ww
+FO
ww
ww
"}
@@ -3888,7 +3980,27 @@ ww
ww
ww
ww
-UO
+lo
+PD
+bl
+lo
+fZ
+rP
+Wl
+vw
+te
+XL
+cH
+te
+ww
+ww
+ww
+"}
+(27,1,1) = {"
+ww
+ww
+ww
+nm
lo
lo
lo
@@ -3899,7 +4011,7 @@ ww
te
te
te
-NO
+VZ
ww
ww
ww
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm b/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm
index 9e5d93f7af77..72bd430d743b 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm
@@ -5189,9 +5189,9 @@
/obj/item/reagent_containers/spray/pepper,
/obj/item/ammo_box/magazine/co9mm,
/obj/item/ammo_box/magazine/co9mm,
-/obj/item/ammo_box/c9mm,
-/obj/item/ammo_box/c9mm,
-/obj/item/ammo_box/c9mm/rubbershot,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm_rubber,
/obj/effect/turf_decal/trimline/opaque/vired/line,
/obj/item/storage/belt/security,
/obj/item/melee/knife/survival,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
index a5673c22d7bc..a02ec78fc9e6 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
@@ -13072,22 +13072,10 @@
pixel_x = 5;
pixel_y = 4
},
-/obj/item/ammo_box/c9mm{
- pixel_x = 4;
- pixel_y = -6
- },
-/obj/item/ammo_box/c9mm{
- pixel_x = 4;
- pixel_y = 1
- },
-/obj/item/ammo_box/c9mm{
- pixel_x = 4;
- pixel_y = 9
- },
-/obj/item/ammo_box/c9mm/ap{
- pixel_y = 17;
- pixel_x = 4
- },
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm/ap,
/obj/item/stock_parts/cell/gun{
pixel_x = -3;
pixel_y = -5
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
index 07b8722e5e7b..d70424c08c84 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
@@ -1750,11 +1750,11 @@
/obj/structure/chair/handrail{
dir = 4
},
-/obj/item/ammo_box/c9mm,
-/obj/item/ammo_box/c9mm,
-/obj/item/ammo_box/c9mm/rubbershot,
-/obj/item/ammo_box/c9mm,
-/obj/item/ammo_box/c9mm,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm_rubber,
+/obj/item/storage/box/ammo/c9mm,
+/obj/item/storage/box/ammo/c9mm,
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 10
},
diff --git a/_maps/shuttles/pirate/pirate_tortuga.dmm b/_maps/shuttles/pirate/pirate_tortuga.dmm
index fc08d44db510..3e48d25a962c 100644
--- a/_maps/shuttles/pirate/pirate_tortuga.dmm
+++ b/_maps/shuttles/pirate/pirate_tortuga.dmm
@@ -667,10 +667,7 @@
/area/ship/security/armory)
"hU" = (
/obj/structure/rack,
-/obj/item/ammo_box/c45{
- pixel_x = -9;
- pixel_y = 8
- },
+/obj/item/storage/box/ammo/c45,
/obj/item/storage/toolbox/ammo/a762_40{
pixel_x = 5;
pixel_y = 6
@@ -3141,7 +3138,7 @@
/obj/item/clothing/shoes/jackboots{
pixel_y = -13
},
-/obj/item/ammo_box/c38_box/surplus,
+/obj/item/storage/box/ammo/c38_surplus,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/carpet/nanoweave,
/area/ship/crew/crewtwo)
diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm
index 0e501c62ed57..23c64f4681a6 100644
--- a/_maps/shuttles/roumain/srm_elder.dmm
+++ b/_maps/shuttles/roumain/srm_elder.dmm
@@ -337,18 +337,12 @@
pixel_y = 14;
pixel_x = 5
},
-/obj/item/ammo_box/c38_box{
- pixel_x = -6;
- pixel_y = 7
- },
+/obj/item/storage/box/ammo/c38,
/obj/item/ammo_box/magazine/illestren_a850r{
pixel_x = 8;
pixel_y = 6
},
-/obj/item/ammo_box/c38_box{
- pixel_x = -6;
- pixel_y = 1
- },
+/obj/item/storage/box/ammo/c38,
/obj/item/ammo_box/magazine/illestren_a850r{
pixel_x = 8
},
@@ -2025,7 +2019,7 @@
pixel_x = -7
},
/obj/item/storage/backpack/satchel/leather,
-/obj/item/ammo_box/a44roum,
+/obj/item/storage/box/ammo/a44roum,
/obj/item/storage/pistolcase/montagne,
/obj/item/clothing/accessory/waistcoat/roumain,
/turf/open/floor/wood/mahogany,
@@ -2698,7 +2692,7 @@
/obj/item/gun/ballistic/revolver/detective,
/obj/item/ammo_box/c38,
/obj/item/ammo_box/c38,
-/obj/item/ammo_box/c38_box,
+/obj/item/storage/box/ammo/c38,
/obj/item/clothing/head/cowboy/sec/roumain/colligne,
/obj/item/clothing/suit/armor/roumain/colligne,
/obj/structure/closet/secure_closet/collignes,
diff --git a/_maps/shuttles/solgov/solgov_chronicle.dmm b/_maps/shuttles/solgov/solgov_chronicle.dmm
index bacabd6cc23c..f08281a47103 100644
--- a/_maps/shuttles/solgov/solgov_chronicle.dmm
+++ b/_maps/shuttles/solgov/solgov_chronicle.dmm
@@ -273,7 +273,7 @@
/obj/item/spacecash/bundle/loadsamoney,
/obj/item/clothing/neck/cloak/solgovcap,
/obj/item/storage/pistolcase/modelh,
-/obj/item/ammo_box/ferroslugbox,
+/obj/item/storage/box/ammo/ferroslug,
/turf/open/floor/carpet/royalblue,
/area/ship/crew/office)
"cg" = (
diff --git a/_maps/shuttles/solgov/solgov_inkwell.dmm b/_maps/shuttles/solgov/solgov_inkwell.dmm
index 27427f9bbfa2..1a38d735246b 100644
--- a/_maps/shuttles/solgov/solgov_inkwell.dmm
+++ b/_maps/shuttles/solgov/solgov_inkwell.dmm
@@ -5934,7 +5934,7 @@
/obj/item/pen/fountain/solgov,
/obj/item/clothing/neck/cloak/solgovcap,
/obj/item/storage/pistolcase/modelh,
-/obj/item/ammo_box/ferroslugbox,
+/obj/item/storage/box/ammo/ferroslug,
/turf/open/floor/wood/maple,
/area/ship/crew/dorm/dormtwo)
"LJ" = (
diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm
index 9cfda7a14c0d..e062f70d011d 100644
--- a/_maps/shuttles/solgov/solgov_paracelsus.dmm
+++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm
@@ -3582,7 +3582,7 @@
/obj/item/pen/fountain/solgov,
/obj/item/clothing/neck/cloak/solgovcap,
/obj/item/storage/pistolcase/modelh,
-/obj/item/ammo_box/ferroslugbox,
+/obj/item/storage/box/ammo/ferroslug,
/turf/open/floor/carpet/royalblue,
/area/ship/crew)
"IZ" = (
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
index 66133d79d47a..7d0278f8b906 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
@@ -65,7 +65,7 @@
/obj/item/ammo_box/a357/match,
/obj/item/pen/edagger,
/obj/item/storage/pistolcase/a357,
-/obj/item/ammo_box/a357_box,
+/obj/item/storage/box/ammo/a357,
/turf/open/floor/carpet/black,
/area/ship/bridge)
"bJ" = (
@@ -301,8 +301,8 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/airalarm/directional/north,
/obj/effect/turf_decal/industrial/outline,
-/obj/item/ammo_box/a12g,
-/obj/item/ammo_box/c10mm,
+/obj/item/storage/box/ammo/a12g_buckshot,
+/obj/item/storage/box/ammo/c10mm,
/turf/open/floor/mineral/plastitanium,
/area/ship/security/armory)
"fC" = (
@@ -762,9 +762,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/obj/item/stamp/qm{
- name = "foreman's rubber stamp"
- },
+/obj/item/stamp/ngr/foreman,
/obj/machinery/button/shieldwallgen{
dir = 1;
id = "hyena_cargo";
@@ -795,10 +793,12 @@
/area/ship/bridge)
"oF" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/documents/syndicate/mining,
-/obj/structure/filingcabinet,
+/obj/structure/filingcabinet{
+ dir = 1
+ },
/obj/machinery/firealarm/directional/west,
/obj/effect/turf_decal/borderfloorblack,
+/obj/item/folder/documents/syndicate/ngr,
/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"oJ" = (
@@ -1870,14 +1870,17 @@
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/paper_bin/carbon,
-/obj/item/folder/documents/syndicate/red,
/obj/item/pen/fountain/captain,
-/obj/item/stamp/hos{
- name = "captain's rubber stamp"
- },
/obj/effect/turf_decal/borderfloorblack{
dir = 1
},
+/obj/item/stamp/ngr{
+ pixel_x = 13;
+ pixel_y = 7
+ },
+/obj/item/stamp/ngr/captain{
+ pixel_x = 13
+ },
/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"Ge" = (
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index c466f5351f9c..4b42a90bbb26 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -5387,7 +5387,7 @@
},
/obj/item/ammo_box/magazine/m10mm_ringneck,
/obj/item/ammo_box/magazine/m10mm_ringneck,
-/obj/item/ammo_box/c10mm,
+/obj/item/storage/box/ammo/c10mm,
/obj/item/clothing/gloves/tackler/combat/insulated,
/obj/structure/closet/secure_closet/wall/directional/west{
icon_state = "sec_wall";
diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
index 29f4bc28922b..3a3438c8f2f8 100644
--- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
+++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
@@ -7376,7 +7376,7 @@
},
/obj/item/storage/belt/sabre/solgov,
/obj/item/storage/pistolcase/modelh,
-/obj/item/ammo_box/ferroslugbox,
+/obj/item/storage/box/ammo/ferroslug,
/turf/open/floor/mineral/plastitanium,
/area/ship/bridge)
"Qv" = (
@@ -8879,7 +8879,7 @@
name = "Armory Access";
req_access = list(3,150)
},
-/obj/item/ammo_box/c10mm,
+/obj/item/storage/box/ammo/c10mm,
/turf/open/floor/mineral/plastitanium,
/area/ship/security)
"YJ" = (
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 7120afd8cf45..5bf9e3add6ad 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -136,8 +136,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define ishostile(A) (istype(A, /mob/living/simple_animal/hostile))
-#define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian))
-
#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct))
#define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna))
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 602473b6086d..e52d9af56251 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -92,6 +92,7 @@
#define VV_HK_AUTO_RENAME "auto_rename"
#define VV_HK_RADIATE "radiate"
#define VV_HK_EDIT_FILTERS "edit_filters"
+#define VV_HK_SELL "sell_item"
#define VV_HK_EDIT_PARTICLES "edit_particles"
// /obj
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 3eefdb7c2f02..61d6ebf7f4ef 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -445,26 +445,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "alien_noqueen"
alerttooltipstyle = "alien"
-//GUARDIANS
-
-/atom/movable/screen/alert/cancharge
- name = "Charge Ready"
- desc = "You are ready to charge at a location!"
- icon_state = "guardian_charge"
- alerttooltipstyle = "parasite"
-
-/atom/movable/screen/alert/canstealth
- name = "Stealth Ready"
- desc = "You are ready to enter stealth!"
- icon_state = "guardian_canstealth"
- alerttooltipstyle = "parasite"
-
-/atom/movable/screen/alert/instealth
- name = "In Stealth"
- desc = "You are in stealth and your next attack will do bonus damage!"
- icon_state = "guardian_instealth"
- alerttooltipstyle = "parasite"
-
//SILICONS
/atom/movable/screen/alert/nocell
diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm
deleted file mode 100644
index 8f79bfedf1bf..000000000000
--- a/code/_onclick/hud/guardian.dm
+++ /dev/null
@@ -1,179 +0,0 @@
-/datum/hud/guardian
- ui_style = 'icons/mob/guardian.dmi'
-
-/datum/hud/guardian/New(mob/living/simple_animal/hostile/guardian/owner)
- ..()
- var/atom/movable/screen/using
-
- pull_icon = new /atom/movable/screen/pull()
- pull_icon.icon = ui_style
- pull_icon.update_appearance()
- pull_icon.screen_loc = ui_living_pull
- pull_icon.hud = src
- static_inventory += pull_icon
-
- healths = new /atom/movable/screen/healths/guardian()
- healths.hud = src
- infodisplay += healths
-
- using = new /atom/movable/screen/guardian/Manifest()
- using.screen_loc = ui_hand_position(2)
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/guardian/Recall()
- using.screen_loc = ui_hand_position(1)
- using.hud = src
- static_inventory += using
-
- using = new owner.toggle_button_type()
- using.screen_loc = ui_storage1
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/guardian/ToggleLight()
- using.screen_loc = ui_inventory
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/guardian/Communicate()
- using.screen_loc = ui_back
- using.hud = src
- static_inventory += using
-
-/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian
- ..()
- var/atom/movable/screen/using
- if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous))
- var/atom/movable/screen/inventory/inv_box
-
- inv_box = new /atom/movable/screen/inventory()
- inv_box.name = "internal storage"
- inv_box.icon = ui_style
- inv_box.icon_state = "suit_storage"
- inv_box.screen_loc = ui_id
- inv_box.slot_id = ITEM_SLOT_DEX_STORAGE
- inv_box.hud = src
- static_inventory += inv_box
-
- using = new /atom/movable/screen/guardian/Communicate()
- using.screen_loc = ui_sstore1
- using.hud = src
- static_inventory += using
-
- else
-
- using = new /atom/movable/screen/guardian/Communicate()
- using.screen_loc = ui_id
- using.hud = src
- static_inventory += using
-
- pull_icon = new /atom/movable/screen/pull()
- pull_icon.icon = 'icons/mob/guardian.dmi'
- pull_icon.update_appearance()
- pull_icon.screen_loc = ui_living_pull
- pull_icon.hud = src
- static_inventory += pull_icon
-
- healths = new /atom/movable/screen/healths/guardian()
- healths.hud = src
- infodisplay += healths
-
- using = new /atom/movable/screen/guardian/Manifest()
- using.screen_loc = ui_belt
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/guardian/Recall()
- using.screen_loc = ui_back
- using.hud = src
- static_inventory += using
-
- using = new owner.toggle_button_type()
- using.screen_loc = ui_storage2
- using.hud = src
- static_inventory += using
-
- using = new /atom/movable/screen/guardian/ToggleLight()
- using.screen_loc = ui_inventory
- using.hud = src
- static_inventory += using
-
-/datum/hud/dextrous/guardian/persistent_inventory_update()
- if(!mymob)
- return
- if(istype(mymob, /mob/living/simple_animal/hostile/guardian/dextrous))
- var/mob/living/simple_animal/hostile/guardian/dextrous/D = mymob
-
- if(hud_shown)
- if(D.internal_storage)
- D.internal_storage.screen_loc = ui_id
- D.client.screen += D.internal_storage
- else
- if(D.internal_storage)
- D.internal_storage.screen_loc = null
-
- ..()
-
-/atom/movable/screen/guardian
- icon = 'icons/mob/guardian.dmi'
-
-/atom/movable/screen/guardian/Manifest
- icon_state = "manifest"
- name = "Manifest"
- desc = "Spring forth into battle!"
-
-/atom/movable/screen/guardian/Manifest/Click()
- if(isguardian(usr))
- var/mob/living/simple_animal/hostile/guardian/G = usr
- G.Manifest()
-
-
-/atom/movable/screen/guardian/Recall
- icon_state = "recall"
- name = "Recall"
- desc = "Return to your user."
-
-/atom/movable/screen/guardian/Recall/Click()
- if(isguardian(usr))
- var/mob/living/simple_animal/hostile/guardian/G = usr
- G.Recall()
-
-/atom/movable/screen/guardian/ToggleMode
- icon_state = "toggle"
- name = "Toggle Mode"
- desc = "Switch between ability modes."
-
-/atom/movable/screen/guardian/ToggleMode/Click()
- if(isguardian(usr))
- var/mob/living/simple_animal/hostile/guardian/G = usr
- G.ToggleMode()
-
-/atom/movable/screen/guardian/ToggleMode/Inactive
- icon_state = "notoggle" //greyed out so it doesn't look like it'll work
-
-/atom/movable/screen/guardian/ToggleMode/Assassin
- icon_state = "stealth"
- name = "Toggle Stealth"
- desc = "Enter or exit stealth."
-
-/atom/movable/screen/guardian/Communicate
- icon_state = "communicate"
- name = "Communicate"
- desc = "Communicate telepathically with your user."
-
-/atom/movable/screen/guardian/Communicate/Click()
- if(isguardian(usr))
- var/mob/living/simple_animal/hostile/guardian/G = usr
- G.Communicate()
-
-
-/atom/movable/screen/guardian/ToggleLight
- icon_state = "light"
- name = "Toggle Light"
- desc = "Glow like star dust."
-
-/atom/movable/screen/guardian/ToggleLight/Click()
- if(isguardian(usr))
- var/mob/living/simple_animal/hostile/guardian/G = usr
- G.ToggleLight()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index bf171d339912..81b614c2af43 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -597,12 +597,6 @@
icon = 'icons/hud/screen_cyborg.dmi'
screen_loc = ui_borg_health
-/atom/movable/screen/healths/guardian
- name = "summoner health"
- icon = 'icons/mob/guardian.dmi'
- icon_state = "base"
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
/atom/movable/screen/healths/revenant
name = "essence"
icon = 'icons/mob/actions/backgrounds.dmi'
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index e8cd514eb48b..b64dab12d301 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -160,8 +160,6 @@ SUBSYSTEM_DEF(throwing)
finalize()
return
- dist_travelled++
-
if(actual_target && !(actual_target.pass_flags_self & LETPASSTHROW) && actual_target.loc == AM.loc) // we crossed a movable with no density (e.g. a mouse or APC) we intend to hit anyway.
finalize(TRUE, actual_target)
return
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 9688f008ffba..1b31fc270700 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -52,7 +52,6 @@ SUBSYSTEM_DEF(traumas)
/mob/living/simple_animal/pet/penguin)),
"birds" = typecacheof(list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
/mob/living/simple_animal/pet/penguin)),
- "anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian))
)
phobia_objs = list(
diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm
index 40a8c1cc947b..84adc6f9666f 100644
--- a/code/datums/proximity_monitor/fields/timestop.dm
+++ b/code/datums/proximity_monitor/fields/timestop.dm
@@ -29,9 +29,6 @@
for(var/mob/living/L in GLOB.player_list)
if(locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects
immune[L] = TRUE
- for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.parasites)
- if(G.summoner && locate(/obj/effect/proc_holder/spell/aoe_turf/timestop) in G.summoner.mind.spell_list) //It would only make sense that a person's stand would also be immune.
- immune[G] = TRUE
if(start)
INVOKE_ASYNC(src, PROC_REF(timestop))
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e7c9c19325a6..84744a9187d6 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1067,6 +1067,7 @@
VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion")
VV_DROPDOWN_OPTION(VV_HK_RADIATE, "Radiate")
VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters")
+ VV_DROPDOWN_OPTION(VV_HK_SELL, "Export Item")
/atom/vv_do_topic(list/href_list)
. = ..()
@@ -1138,6 +1139,9 @@
var/client/C = usr.client
C?.open_filter_editor(src)
+ if(href_list[VV_HK_SELL] && check_rights(R_ADMIN|R_DEBUG) && check_rights(R_VAREDIT))
+ export_item_and_contents(src, allowed_categories = ALL, apply_elastic = FALSE)
+
/atom/vv_get_header()
. = ..()
var/refid = REF(src)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index c3c39c72e34a..1e4fde83ae56 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -826,7 +826,7 @@ DEFINE_BITFIELD(turret_flags, list(
. = ..()
if(in_range(user, src) || isobserver(user))
if(!(machine_stat & BROKEN))
- . += "[src] reports its integrity is currently [round(obj_integrity / max_integrity) * 100] percent."
+ . += "[src] reports its integrity is currently [round((obj_integrity / max_integrity) * 100)] percent."
/obj/machinery/porta_turret/ship/weak
max_integrity = 120
@@ -908,6 +908,39 @@ DEFINE_BITFIELD(turret_flags, list(
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
max_integrity = 300
+/* New Gorlex Republic Turrets */
+// Midline ballistic turrets
+
+/obj/machinery/porta_turret/ship/ngr
+ name = "Oasis Turret"
+ desc = "A turret manufactured by the New Gorlex Republic for its ships and installations. Proudly manufactured within the nation!"
+ stun_projectile = /obj/projectile/bullet/c45/rubber
+ stun_projectile_sound = 'sound/weapons/gun/smg/cobra.ogg'
+ lethal_projectile = /obj/projectile/bullet/c45
+ lethal_projectile_sound = 'sound/weapons/gun/smg/cobra.ogg'
+ faction = list(FACTION_NGR, FACTION_PLAYER_SYNDICATE, "turret") //player_syndicate is just to be safe
+
+/obj/machinery/porta_turret/ship/ngr/light
+ name = "Sonoran Turret"
+ desc = "A light turret manufactured by the New Gorlex Republic for its ships and installations. Proudly manufactured within the Nation, using locally produced munitions!"
+ stun_projectile = /obj/projectile/bullet/c57x39mm/rubber
+ stun_projectile_sound = 'sound/weapons/gun/smg/sidewinder.ogg'
+ lethal_projectile = /obj/projectile/bullet/c57x39mm
+ lethal_projectile_sound = 'sound/weapons/gun/smg/sidewinder.ogg'
+ scan_range = 7
+ shot_delay = 10
+
+/obj/machinery/porta_turret/ship/ngr/heavy
+ name = "Cliff Turret"
+ desc = "A heavy turret manufactured by the New Gorlex Republic for its ships and installations. Has a reputation of being extremely dangerous."
+ stun_projectile = /obj/projectile/bullet/a65clip/rubber
+ stun_projectile_sound = 'sound/weapons/gun/sniper/cmf90.ogg'
+ lethal_projectile = /obj/projectile/bullet/a65clip
+ lethal_projectile_sound = 'sound/weapons/gun/sniper/cmf90.ogg'
+ scan_range = 14
+ shot_delay = 30
+
+
/* Inteq Turrets */
//slower rof, higher damage + range
@@ -980,6 +1013,47 @@ DEFINE_BITFIELD(turret_flags, list(
lethal_projectile = /obj/projectile/beam/hitscan/kalix/pgf/sniper //fwoom
lethal_projectile_sound = 'sound/weapons/gun/laser/heavy_laser.ogg'
+/// Frontiersmen Turrets
+
+// fast and spitty
+
+/obj/machinery/porta_turret/ship/frontiersmen
+ name = "Spitter Turret"
+ desc = "A juryrigged mishmash of a 9mm SMG and targetting system. Stand clear!"
+ faction = list(FACTION_FRONTIER, "Turret")
+ subsystem_type = /datum/controller/subsystem/processing/fastprocess
+ integrity_failure = 0.6
+ max_integrity = 180
+
+ icon_state = "standard_lethal"
+ base_icon_state = "standard"
+
+ stun_projectile = /obj/projectile/bullet/c9mm
+ stun_projectile_sound = 'sound/weapons/gun/smg/spitter.ogg'
+ lethal_projectile = /obj/projectile/bullet/c9mm
+ lethal_projectile_sound = 'sound/weapons/gun/smg/spitter.ogg'
+ shot_delay = 2
+ scan_range = 6
+
+/obj/machinery/porta_turret/ship/frontiersmen/light
+ name = "Pounder Turret"
+ desc = "A low caliber SMG with an atrociously high cycle rate, frankensteined together with a targetting assembly."
+ stun_projectile = /obj/projectile/bullet/c22lr
+ stun_projectile_sound = 'sound/weapons/gun/smg/pounder.ogg'
+ lethal_projectile = /obj/projectile/bullet/c22lr
+ lethal_projectile_sound = 'sound/weapons/gun/smg/pounder.ogg'
+ shot_delay = 1
+
+/obj/machinery/porta_turret/ship/frontiersmen/heavy
+ name = "Mulcher Turret"
+ desc = "An abombination made out of the components of a Shredder and an automatic targetting system. Careful now."
+ stun_projectile = /obj/projectile/bullet/slug/beanbag
+ stun_projectile_sound = 'sound/weapons/gun/hmg/shredder.ogg'
+ lethal_projectile = /obj/projectile/bullet/slug
+ lethal_projectile_sound = 'sound/weapons/gun/hmg/shredder.ogg'
+ shot_delay = 3
+ scan_range = 8
+
////////////////////////
//Turret Control Panel//
////////////////////////
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index e6e754c4b807..5dc0117b634c 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -205,6 +205,7 @@
var/locked = TRUE
var/shield_range = 8
var/shocked = FALSE
+ var/crashing = FALSE
var/obj/structure/cable/attached // the attached cable
/obj/machinery/power/shieldwallgen/xenobiologyaccess //use in xenobiology containment
@@ -252,16 +253,25 @@
if(!active_power_usage || surplus() >= active_power_usage)
add_load(active_power_usage)
else
- visible_message(span_danger("The [src.name] shuts down due to lack of power!"), "If this message is ever seen, something is wrong.",span_hear("You hear heavy droning fade out."))
- active = FALSE
- log_game("[src] deactivated due to lack of power at [AREACOORD(src)]")
- for(var/direction in GLOB.cardinals)
- cleanup_field(direction)
+ if(!crashing)
+ balloon_alert_to_viewers("[src] blares an alarm!")
+ playsound(src, 'sound/machines/cryo_warning.ogg', 100)
+ crashing = TRUE
+ addtimer(CALLBACK(src, PROC_REF(kill_shield)), 6 SECONDS)
+
else
for(var/direction in GLOB.cardinals)
cleanup_field(direction)
update_appearance()
+/obj/machinery/power/shieldwallgen/proc/kill_shield()
+ visible_message(span_danger("The [src.name] shuts down due to lack of power!"), "If this message is ever seen, something is wrong.",span_hear("You hear heavy droning fade out."))
+ log_game("[src] deactivated due to lack of power at [AREACOORD(src)]")
+ active = FALSE
+ crashing = FALSE
+ for(var/direction in GLOB.cardinals)
+ cleanup_field(direction)
+
/obj/machinery/power/shieldwallgen/update_icon_state()
if(active)
icon_state = initial(icon_state) + "_on"
diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm
index 0febe3327cb6..9e5c6732d1cb 100644
--- a/code/game/mecha/equipment/weapons/mecha_ammo.dm
+++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm
@@ -83,7 +83,7 @@
/obj/item/mecha_ammo/tank_shell
name = "anti-armor missile"
desc = "A large missle, intended to be loaded into a Type 207."
- icon = 'icons/obj/ammo_bullets.dmi'
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
icon_state = "srm-8"
rounds = 1
throw_range = 0
diff --git a/code/game/objects/effects/anomalies/_anomalies.dm b/code/game/objects/effects/anomalies/_anomalies.dm
index 4a85f9321154..6477446a2b72 100644
--- a/code/game/objects/effects/anomalies/_anomalies.dm
+++ b/code/game/objects/effects/anomalies/_anomalies.dm
@@ -8,9 +8,7 @@
anchored = TRUE
light_range = 3
- //aSignal drops as the core, bSignal allows people to signal to detonate
- var/obj/item/assembly/signaler/anomaly/aSignal = /obj/item/assembly/signaler/anomaly
- var/obj/item/assembly/signaler/anomaly/bSignal = /obj/item/assembly/signaler/anomaly/det_signal
+ var/obj/item/assembly/signaler/anomaly/core = /obj/item/assembly/signaler/anomaly
var/area/impact_area
var/lifespan = 990
@@ -46,27 +44,17 @@
pulse_delay = rand(pulse_delay*0.5, pulse_delay*1.5)
src.drops_core = drops_core
- if(aSignal)
- aSignal = new aSignal(src)
- aSignal.code = rand(1,100)
- aSignal.anomaly_type = type
- aSignal.research = research_value
+ if(core)
+ core = new core(src)
+ core.code = rand(1,100)
+ core.code_b = rand(1,100)
+ core.anomaly_type = type
+ core.research = research_value
var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ)
if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven!
frequency++
- aSignal.set_frequency(frequency)
-
- if(bSignal)
- bSignal = new bSignal(src)
- bSignal.code = rand(1,100)
- bSignal.anomaly_type = type
- var/frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ)
- if(ISMULTIPLE(frequency, 2))//signaller frequencies are always uneven!
- frequency++
- bSignal.set_frequency(frequency)
-
-
+ core.set_frequency(frequency)
if(lifespan)
if(new_lifespan)
@@ -97,7 +85,7 @@
/obj/effect/anomaly/Destroy()
STOP_PROCESSING(SSobj, src)
QDEL_NULL(countdown)
- QDEL_NULL(aSignal)
+ QDEL_NULL(core)
return ..()
/obj/effect/anomaly/proc/anomalyEffect(seconds_per_tick)
@@ -118,30 +106,26 @@
/obj/effect/anomaly/proc/anomalyNeutralize()
new /obj/effect/particle_effect/smoke/bad(loc)
-
if(drops_core)
- if(isnull(aSignal))
+ if(isnull(core))
stack_trace("An anomaly ([src]) exists that drops a core, yet has no core!")
else
- aSignal.forceMove(drop_location())
- aSignal = null
+ core.forceMove(drop_location())
+ core = null
// else, anomaly core gets deleted by qdel(src).
qdel(src)
/obj/effect/anomaly/attackby(obj/item/weapon, mob/user, params)
- if(weapon.tool_behaviour == TOOL_ANALYZER && aSignal)
+ if(weapon.tool_behaviour == TOOL_ANALYZER && core)
to_chat(user, span_notice("You start analyzing [src]."))
if(do_after(user, 20, src, hidden = TRUE))
- to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code]."))
- if(bSignal)
- to_chat(user, span_notice("A second field is fluctuating along [format_frequency(bSignal.frequency)], code [bSignal.code]. It is highly unstable." ))
- return TRUE
+ to_chat(user, span_notice("[src]'s primary field is fluctuating along frequency [format_frequency(core.frequency)], code [core.code]."))
+ return TRUE
return ..()
-
/obj/effect/anomaly/examine(mob/user)
. = ..()
if(user.research_scanner == TRUE)
diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm
index f7012e532944..d5825181295c 100644
--- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm
+++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm
@@ -2,9 +2,9 @@
/obj/effect/anomaly/bluespace
name = "jumper"
icon_state = "bluespace"
- desc = "A mysterious anomaly that causes teleportation around it."
+ desc = "A hole in the fabric of bluespace, perforating reality around it."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/bluespace
+ core = /obj/item/assembly/signaler/anomaly/bluespace
///range from which we can teleport someone
effectrange = 3
var/reagent_amount = 3
diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm
index b1318953f4a6..4eaddefdcae0 100644
--- a/code/game/objects/effects/anomalies/anomalies_flux.dm
+++ b/code/game/objects/effects/anomalies/anomalies_flux.dm
@@ -1,9 +1,10 @@
/obj/effect/anomaly/flux
name = "tesla"
- icon_state = "flux"
- desc = "A mysterious anomaly that sends out a near constant stream of electrical arcs."
+ icon_state = "tesla"
+ //double-check that these only happen in atmosphere now
+ desc = "A break in the atmosphere, small yet potent lightning arcs flashing off it."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/flux
+ core = /obj/item/assembly/signaler/anomaly/flux
pulse_delay = 2 SECONDS
effectrange = 0
var/canshock = FALSE
@@ -99,3 +100,7 @@
/obj/effect/anomaly/flux/big/planetary
immortal = TRUE
immobile = TRUE
+
+/obj/effect/anomaly/flux/storm
+ drops_core = FALSE
+ explosive = FLUX_LOW_EXPLOSIVE
diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm
index 1dea7049fc97..20cc30dcc74d 100644
--- a/code/game/objects/effects/anomalies/anomalies_gravity.dm
+++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm
@@ -9,10 +9,9 @@
/obj/effect/anomaly/grav
name = "throngler"
icon_state = "gravity"
- desc = "A mysterious anomaly that sucks things towards it with a gravitational field, ending in what has been termed a 'throngling'."
+ desc = "A miniature gravity well, constantly pulling the world around it into a 'throngling'."
density = FALSE
- aSignal = /obj/item/assembly/signaler/anomaly/grav
- bSignal = null
+ core = /obj/item/assembly/signaler/anomaly/grav
effectrange = 4
var/boing = 0
///Warp effect holder for displacement filter to "pulse" the anomaly
diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm
index ab859a3b3215..e48a1879f257 100644
--- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm
+++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm
@@ -2,7 +2,8 @@
/obj/effect/anomaly/hallucination
name = "hallucination anomaly"
icon_state = "hallucination"
- aSignal = /obj/item/assembly/signaler/anomaly/hallucination
+ desc = "A shimmering mirage suspended above the ground, never in the same place as it was a second ago."
+ core = /obj/item/assembly/signaler/anomaly/hallucination
/// Time passed since the last effect, increased by delta_time of the SSobj
var/ticks = 0
/// How many seconds between each small hallucination pulses
@@ -18,6 +19,8 @@
var/turf/open/our_turf = get_turf(src)
if(istype(our_turf))
hallucination_pulse(our_turf, 5)
+ pixel_x = pixel_x + clamp(rand(-5, 5), -16, 16)
+ pixel_y = pixel_y + clamp(rand(-5, 5), -16, 16)
/obj/effect/anomaly/hallucination/detonate()
var/turf/open/our_turf = get_turf(src)
diff --git a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm
index 1b691d898436..ff111fe4882c 100644
--- a/code/game/objects/effects/anomalies/anomalies_heartbeat.dm
+++ b/code/game/objects/effects/anomalies/anomalies_heartbeat.dm
@@ -1,9 +1,9 @@
/obj/effect/anomaly/heartbeat
name = "heartbeat"
icon_state = "heartbeat"
- desc = "A mysterious anomaly, it ionizes the world around it."
+ desc = "A throbbing vertex, spreading a cancer to the world around itself."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/heartbeat
+ core = /obj/item/assembly/signaler/anomaly/heartbeat
effectrange = 3
pulse_delay = 6 SECONDS
var/reagent_amount = 5
diff --git a/code/game/objects/effects/anomalies/anomalies_melter.dm b/code/game/objects/effects/anomalies/anomalies_melter.dm
index d906d4f4bad2..3c99fd7eab5a 100644
--- a/code/game/objects/effects/anomalies/anomalies_melter.dm
+++ b/code/game/objects/effects/anomalies/anomalies_melter.dm
@@ -1,10 +1,10 @@
/obj/effect/anomaly/melter
name = "melter"
icon_state = "melter"
- desc = "A mysterious anomaly. Everburning green flames with a horrid sizzle, melting what's near"
+ desc = "Everburning green flames, eager to lash out at anything that intrudes near."
effectrange = 2
pulse_delay = 10 SECONDS
- aSignal = /obj/item/assembly/signaler/anomaly/melter
+ core = /obj/item/assembly/signaler/anomaly/melter
/obj/effect/anomaly/melter/anomalyEffect(seconds_per_tick)
..()
@@ -20,7 +20,7 @@
I.acid_act(20, 20)
I.update_appearance()
for (var/obj/item/melt in range(effectrange, src))
-
+ //don't melt yourself
if(istype(melt, /obj/item/assembly/signaler/anomaly))
return
else
diff --git a/code/game/objects/effects/anomalies/anomalies_phantom.dm b/code/game/objects/effects/anomalies/anomalies_phantom.dm
index 9407bbcbf920..e2225c4c843e 100644
--- a/code/game/objects/effects/anomalies/anomalies_phantom.dm
+++ b/code/game/objects/effects/anomalies/anomalies_phantom.dm
@@ -1,9 +1,9 @@
/obj/effect/anomaly/phantom
name = "phantom"
icon_state = "phantom"
- desc = "A mysterious anomaly, the outline of a humanoid, endlessly screaming in agony."
+ desc = "A familiar outline, it calls out for companionship. It screams for you."
density = FALSE
- aSignal = /obj/item/assembly/signaler/anomaly/phantom
+ core = /obj/item/assembly/signaler/anomaly/phantom
effectrange = 3
pulse_delay = 2 SECONDS
diff --git a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm
index 006d42ac28d3..f2d9bf6308a5 100644
--- a/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm
+++ b/code/game/objects/effects/anomalies/anomalies_plasmasoul.dm
@@ -1,9 +1,9 @@
/obj/effect/anomaly/plasmasoul
name = "plasma soul"
icon_state = "plasmasoul"
- desc = "A mysterious anomaly, it slowly leaks plasma into the world around it."
+ desc = "A plasmatic pool, small crystals growing around it, spreading into the ground."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/plasmasoul
+ core = /obj/item/assembly/signaler/anomaly/plasmasoul
effectrange = 3
pulse_delay = 6 SECONDS
var/reagent_amount = 5
diff --git a/code/game/objects/effects/anomalies/anomalies_pulsar.dm b/code/game/objects/effects/anomalies/anomalies_pulsar.dm
index 1f75acee56b8..360e004b2adf 100644
--- a/code/game/objects/effects/anomalies/anomalies_pulsar.dm
+++ b/code/game/objects/effects/anomalies/anomalies_pulsar.dm
@@ -1,9 +1,9 @@
/obj/effect/anomaly/pulsar
name = "pulsar"
icon_state = "pulsar"
- desc = "A mysterious anomaly, endless electromagnetic disturbances roll out from it"
+ desc = "A near transparent shell hovering, containing a near constant electromagnetic turmoil."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/pulsar
+ core = /obj/item/assembly/signaler/anomaly/pulsar
effectrange = 4
pulse_delay = 15 SECONDS
diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
index b4c93868e670..fef1c8b38a0b 100644
--- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
+++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
@@ -2,17 +2,16 @@
/obj/effect/anomaly/pyro
name = "plasmaball"
icon_state = "pyroclastic"
- desc = "A mysterious anomaly, made of an everburning gas. Those who approach it tend to absorb it's heat, or even ignite."
+ desc = "A floating orb of everburning gas, not unlike a sun. It radiates a dangerous amount of heat."
effectrange = 4
pulse_delay = 10 SECONDS
- aSignal = /obj/item/assembly/signaler/anomaly/pyro
+ core = /obj/item/assembly/signaler/anomaly/pyro
/obj/effect/anomaly/pyro/anomalyEffect(seconds_per_tick)
..()
for(var/mob/living/carbon/nearby in range(effectrange, src))
nearby.adjust_bodytemperature(20)
- visible_message("[src] pulses!")
if(!COOLDOWN_FINISHED(src, pulse_cooldown))
return
@@ -21,7 +20,7 @@
for(var/mob/living/carbon/nearby in range(effectrange/2, src))
nearby.fire_stacks += 3
nearby.IgniteMob()
- visible_message("[src] ignites [nearby]!")
+ visible_message("[src] lets out a flare, igniting [nearby]!")
/obj/effect/anomaly/pyro/Bumped(atom/movable/AM)
@@ -84,3 +83,6 @@
/obj/effect/anomaly/pyro/big/planetary
immortal = TRUE
immobile = TRUE
+
+/obj/effect/anomaly/pyro/storm
+ drops_core = FALSE
diff --git a/code/game/objects/effects/anomalies/anomalies_sparkler.dm b/code/game/objects/effects/anomalies/anomalies_sparkler.dm
index 0b26e6fd6a1c..79dd55cf21a7 100644
--- a/code/game/objects/effects/anomalies/anomalies_sparkler.dm
+++ b/code/game/objects/effects/anomalies/anomalies_sparkler.dm
@@ -1,9 +1,9 @@
/obj/effect/anomaly/sparkler
name = "sparkler"
icon_state = "sparkler"
- desc = "A mysterious anomaly, constantly throwing sparks into its vicinity."
+ desc = "A series of shimmering sparks flying to and fro. They try to spread, yet fail."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/sparkler
+ core = /obj/item/assembly/signaler/anomaly/sparkler
effectrange = 4
pulse_delay = 1 SECONDS
diff --git a/code/game/objects/effects/anomalies/anomalies_static.dm b/code/game/objects/effects/anomalies/anomalies_static.dm
index ab574ee475dd..5b5bb76badf2 100644
--- a/code/game/objects/effects/anomalies/anomalies_static.dm
+++ b/code/game/objects/effects/anomalies/anomalies_static.dm
@@ -1,9 +1,25 @@
+GLOBAL_LIST_INIT(tvstatic_sayings, list(
+ "... Help me...",
+ "... I need to get out ...",
+ "...No hope....",
+ "...Let me loose...",
+ "...stay with me...",
+ "...Not like this...",
+ "...please don't go...",
+ "...don't forget me...",
+ "...Are you there...?",
+ "...it hurts...",
+ "...the eyes...",
+ "...need to run...",
+ "...is anyone there..."
+))
+
/obj/effect/anomaly/tvstatic
name = "static"
icon_state = "static"
- desc = "A mysterious anomaly. A hole in the world, endless buzzing emitting from it."
+ desc = "A hole in the world emitting an endless buzzing. It hides something precious."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/tvstatic
+ core = /obj/item/assembly/signaler/anomaly/tvstatic
effectrange = 4
pulse_delay = 4 SECONDS
verb_say = "pleads"
@@ -48,7 +64,7 @@
var/mob/living/carbon/victim = looking
var/obj/effect/anomaly/tvstatic/planetary/expansion
expansion = new(get_turf(victim))
- visible_message(span_warning("The static overtakes [victim], [expansion] taking their place!"))
+ visible_message(span_warning("[src] overtakes [victim], [expansion] taking their place!"))
victim.death()
expansion.stored_mob = victim
victim.forceMove(expansion)
@@ -58,44 +74,18 @@
anomalyEffect()
/obj/effect/anomaly/tvstatic/proc/say_fucky_things()
- switch(rand(1, 13))
- if(1)
- say("... Help me...")
- if(2)
- say("... I need to get out ...")
- if(3)
- say("...No hope....")
- if(4)
- say("....Let me loose...")
- if(5)
- say("...stay with me...")
- if(6)
- say("...I hope I live...")
- if(7)
- say("...please don't go...")
- if(8)
- say("...don't forget me...")
- if(9)
- say("...Are you there...?")
- if(10)
- say("...it hurts...")
- if(11)
- say("...the eyes...")
- if(12)
- say("...need to run...")
- if(13)
- say("...don't become like me...")
+ say(pick(GLOB.tvstatic_sayings))
return
/obj/effect/anomaly/tvstatic/detonate()
for(var/mob/living/carbon/human/looking in range(effectrange, src))
- visible_message(span_boldwarning(" The static lashes out, agony filling your mind as its tendrils scrape your thoughts!"))
+ visible_message(span_boldwarning("[src] lashes out, agony filling your mind as its tendrils scrape your thoughts!"))
if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD)
looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 200)
playsound(src, 'sound/effects/stall.ogg', 100)
if(stored_mob)
mangle_corpse()
- visible_message(span_warning("The static sputters out [stored_mob], their body coming out in a burst of blood and gore!"))
+ visible_message(span_warning("[src] sputters out [stored_mob], their body coming out in a burst of blood and gore!"))
new /obj/effect/gibspawner/human(loc)
stored_mob.forceMove(get_turf(src))
stored_mob = null
@@ -111,7 +101,7 @@
var/turf/T = get_turf(src)
if(T)
if(stored_mob)
- visible_message(span_warning("The static spits out [stored_mob], their body coming out in a burst!"))
+ visible_message(span_warning("[src] spits out [stored_mob], their body coming out in a burst!"))
stored_mob.forceMove(get_turf(src))
stored_mob = null
. = ..()
diff --git a/code/game/objects/effects/anomalies/anomalies_transfusion.dm b/code/game/objects/effects/anomalies/anomalies_transfusion.dm
new file mode 100644
index 000000000000..f233f9c0a3c4
--- /dev/null
+++ b/code/game/objects/effects/anomalies/anomalies_transfusion.dm
@@ -0,0 +1,69 @@
+/obj/effect/anomaly/transfusion
+ name = "transfusion"
+ icon_state = "transfusion"
+ desc = "A throbbing field floating mid-air, crimson particulate hovering within it."
+ density = TRUE
+ core = /obj/item/assembly/signaler/anomaly/transfusion
+ effectrange = 3
+ pulse_delay = 5 SECONDS
+
+/obj/effect/anomaly/transfusion/anomalyEffect()
+ ..()
+
+ if(!COOLDOWN_FINISHED(src, pulse_cooldown))
+ return
+
+ COOLDOWN_START(src, pulse_cooldown, pulse_delay)
+ blood_music()
+ return
+
+/obj/effect/anomaly/transfusion/proc/blood_music() //by greg bear
+ //this is hacky *because* in an ideal world - it would involve making the core have a reagent container for the blood
+ //however - I am a lazy bitch
+ for(var/mob/living/carbon/victim in range(effectrange, src))
+ //if we're not hungry, we're not hungry.
+ if (core?:get_blood_max() < core?:get_blood_stored())
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(src.loc, rand(1, 8))
+ visible_message(span_boldwarning("[src] vomits up blood, seemingly satiated!"))
+ core?:set_blood_stored(core?:get_blood_max())
+ return
+ //if there's blood to take, take it
+ if (victim.blood_volume > BLOOD_VOLUME_SAFE)
+ var/bleeder
+ bleeder = rand(10,30)
+ victim.bleed(bleeder)
+ victim.spray_blood(get_dir(victim, src), splatter_strength = 1) //slurp
+ visible_message(span_boldwarning("Ichor flows out of [victim], and into [src]!"))
+ core?:set_blood_stored(bleeder)
+ break
+ //but if there's blood to give, share.
+ if(victim.blood_volume < BLOOD_VOLUME_SAFE && core?:get_blood_stored() > (core?:get_blood_max() / 2))
+ var/present_time
+ present_time = rand((core?:get_blood_stored() / 10), (core?:get_blood_stored() / 2))
+ visible_message(span_boldwarning("Globules of ichor fly away from [src], and into [victim]!"))
+ core?:set_blood_stored(-present_time)
+ victim.blood_volume += present_time
+ break
+ return
+
+/obj/effect/anomaly/transfusion/Bumped(atom/movable/AM)
+ if(!COOLDOWN_FINISHED(src, pulse_secondary_cooldown))
+ return
+ COOLDOWN_START(src, pulse_secondary_cooldown, 10)
+ if(istype(AM, /mob/living/carbon))
+ var/mob/living/carbon/victim = AM
+ visible_message(span_boldwarning("[victim] touches [src], and as they pull away their blood flows away from them!"))
+ var/amount = rand(50, 200)
+ victim.bleed(amount)
+ core?:set_blood_stored(amount)
+
+/obj/effect/anomaly/transfusion/detonate()
+ for(var/mob/living/carbon/victim in range(effectrange, src))
+ victim.bleed(rand(100, 250))
+ victim.spray_blood(get_dir(src, victim), splatter_strength = 3) //slurp
+ visible_message(span_boldwarning("[src] screams as it tries to pull all the blood around into itself!"))
+ . = ..()
+
+/obj/effect/anomaly/transfusion/planetary
+ immortal = TRUE
+ immobile = TRUE
diff --git a/code/game/objects/effects/anomalies/anomalies_veins.dm b/code/game/objects/effects/anomalies/anomalies_veins.dm
index 416e325ccdbd..b148f2d01666 100644
--- a/code/game/objects/effects/anomalies/anomalies_veins.dm
+++ b/code/game/objects/effects/anomalies/anomalies_veins.dm
@@ -1,9 +1,9 @@
/obj/effect/anomaly/veins
name = "veins"
icon_state = "veins"
- desc = "A mysterious anomaly, throbbing purple veins, suspended midair."
+ desc = "Throbbing purple veins, an exposed artery of the world. It thirsts."
density = TRUE
- aSignal = /obj/item/assembly/signaler/anomaly/veins
+ core = /obj/item/assembly/signaler/anomaly/veins
effectrange = 3
pulse_delay = 4 SECONDS
diff --git a/code/game/objects/effects/anomalies/anomalies_vortex.dm b/code/game/objects/effects/anomalies/anomalies_vortex.dm
index 16a30cbaa9c6..5e5875077660 100644
--- a/code/game/objects/effects/anomalies/anomalies_vortex.dm
+++ b/code/game/objects/effects/anomalies/anomalies_vortex.dm
@@ -2,9 +2,8 @@
/obj/effect/anomaly/vortex
name = "vortex"
icon_state = "vortex"
- desc = "A mysterious anomaly, this one destroys everything around it."
- aSignal = /obj/item/assembly/signaler/anomaly/vortex
- bSignal = null
+ desc = "An incredibly compact black orb, its hunger unquenchable."
+ core = /obj/item/assembly/signaler/anomaly/vortex
/obj/effect/anomaly/vortex/anomalyEffect()
..()
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 364ddeb72298..1163a5520631 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -805,6 +805,7 @@
/obj/effect/anomaly/plasmasoul/planetary,
/obj/effect/anomaly/phantom/planetary,
/obj/effect/anomaly/melter/planetary,
+ /obj/effect/anomaly/transfusion/planetary,
)
/obj/effect/spawner/lootdrop/anomaly/safe
@@ -815,6 +816,7 @@
/obj/effect/anomaly/sparkler/planetary,
/obj/effect/anomaly/veins/planetary,
/obj/effect/anomaly/phantom/planetary,
+ /obj/effect/anomaly/transfusion/planetary,
)
/obj/effect/spawner/lootdrop/anomaly/dangerous
@@ -999,8 +1001,8 @@
/obj/effect/spawner/lootdrop/anomaly/storm
loot = list(
- /obj/effect/anomaly/flux,
- /obj/effect/anomaly/pyro,
+ /obj/effect/anomaly/flux/storm,
+ /obj/effect/anomaly/pyro/storm,
/obj/effect/anomaly/sparkler,
/obj/effect/anomaly/veins,
/obj/effect/anomaly/phantom,
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 2b82f656ac48..92c92655cb8c 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -207,16 +207,6 @@
icon_state = "blspell"
duration = 5
-/obj/effect/temp_visual/guardian
- randomdir = 0
-
-/obj/effect/temp_visual/guardian/phase
- duration = 5
- icon_state = "phasein"
-
-/obj/effect/temp_visual/guardian/phase/out
- icon_state = "phaseout"
-
/obj/effect/temp_visual/decoy
desc = "It's a decoy!"
duration = 15
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 7548625b31f6..883265896fe5 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -575,7 +575,7 @@ RLD
/obj/item/rcd_ammo
name = "compressed matter cartridge"
desc = "Highly compressed matter for the RCD."
- icon = 'icons/obj/ammo.dmi'
+ icon = 'icons/obj/ammunition/ammo.dmi'
icon_state = "rcd"
item_state = "rcdammo"
w_class = WEIGHT_CLASS_TINY
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 6b7b364118d4..7e0cf768de5d 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -333,11 +333,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM
reagents?.add_reagent(/datum/reagent/toxin/carpotoxin , 3) // They lied
/obj/item/clothing/mask/cigarette/syndicate
- desc = "An unknown brand cigarette."
+ desc = "An obscure brand of cigarette."
chem_volume = 60
smoketime = 60
smoke_all = TRUE
- list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/medicine/omnizine = 15)
+ list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/drug/aranesp = 5, /datum/reagent/medicine/synaptizine = 5)
/obj/item/clothing/mask/cigarette/xeno
desc = "A Xeno Filtered brand cigarette."
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index 631eb7d2fc8f..62c33aa9665a 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -71,7 +71,8 @@
/obj/item/soap/syndie
desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster."
icon_state = "soapsyndie"
- cleanspeed = 5 //faster than mop so it is useful for traitors who want to clean crime scenes
+ cleanspeed = 27 // ever so slightly better than NT
+ uses = 300
/obj/item/soap/omega
name = "omega soap"
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 204371ca0e51..50b8e3958043 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -170,10 +170,8 @@
toolspeed = 0.5
/obj/item/multitool/syndie
- name = "suspicious-looking multitool"
desc = "A darkened multitool with a matte finish and an ominous glowing screen."
icon_state = "multitool_syndie"
- toolspeed = 0.5
/obj/item/multitool/old
desc = "Used for pulsing wires to test which to cut. This one looks... 'retro'. It wasn't recommended by doctors then and won't be recommended by doctors now."
diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm
index 2fb225fd2fb9..e7e78abb4abc 100644
--- a/code/game/objects/items/documents.dm
+++ b/code/game/objects/items/documents.dm
@@ -49,6 +49,11 @@
/obj/item/documents/syndicate/mining
desc = "\"Top Secret\" documents detailing Syndicate plasma mining operations."
+/obj/item/documents/syndicate/ngr
+ name = "Second Battlegroup secret documents"
+ desc = "\"Top Secret\" documents belonging to the Second Battlegroup of New Gorlex Republic. They are filled with sensitive operational intelligence. These documents are verified with a red wax seal."
+ icon_state = "docs_red"
+
/obj/item/documents/photocopy
desc = "A copy of some top-secret documents. Nobody will notice they aren't the originals... right?"
var/forgedseal = 0
diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index f0198b7f1a0b..fb19cfe31700 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -150,7 +150,18 @@
/obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
var/obj/projectile/P = hitby
- if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
+ var/list/valid_hands = list(FALSE, FALSE)
+
+ //checks if the projectile hits an arm holding a grenade
+ if (istype(owner.held_items[1], (/obj/item/grenade)))
+ if (P.def_zone == "l_arm")
+ valid_hands[1] = TRUE
+
+ if (istype(owner.held_items[2], (/obj/item/grenade)))
+ if (P.def_zone == "r_arm")
+ valid_hands[2] = TRUE
+
+ if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && (valid_hands[1] || valid_hands[2]) && prob(5)) //5% chance to go off
owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!")
var/turf/T = get_turf(src)
log_game("A projectile ([hitby]) detonated a grenade held by [key_name(owner)] at [COORD(T)]")
diff --git a/code/game/objects/items/melee/weaponry.dm b/code/game/objects/items/melee/weaponry.dm
index 11c1b118570b..131e5e1aab20 100644
--- a/code/game/objects/items/melee/weaponry.dm
+++ b/code/game/objects/items/melee/weaponry.dm
@@ -75,7 +75,7 @@
/obj/item/throwing_star/magspear
name = "magnetic spear"
desc = "A reusable spear that is typically loaded into kinetic spearguns."
- icon = 'icons/obj/ammo_bullets.dmi'
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
icon_state = "magspear"
throwforce = 25 //kills regular carps in one hit
force = 10
diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm
index 959649c8c59b..249ee7dc41ed 100644
--- a/code/game/objects/items/shrapnel.dm
+++ b/code/game/objects/items/shrapnel.dm
@@ -20,7 +20,7 @@
/obj/item/shrapnel/bullet // bullets
name = "bullet"
- icon = 'icons/obj/ammo_bullets.dmi'
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
icon_state = "pistol-brass"
item_flags = NONE
diff --git a/code/game/objects/items/storage/ammo_can.dm b/code/game/objects/items/storage/ammo_can.dm
new file mode 100644
index 000000000000..7962621674ad
--- /dev/null
+++ b/code/game/objects/items/storage/ammo_can.dm
@@ -0,0 +1,52 @@
+//No idea why this is a toolbox but I'm not fixing that right now
+/obj/item/storage/toolbox/ammo
+ name = "ammo can"
+ desc = "A metal container for storing multiple boxes of ammunition or grenades."
+ icon_state = "ammobox"
+ item_state = "ammobox"
+ drop_sound = 'sound/items/handling/ammobox_drop.ogg'
+ pickup_sound = 'sound/items/handling/ammobox_pickup.ogg'
+ material_flags = NONE
+ has_latches = FALSE
+
+/obj/item/storage/toolbox/ammo/a850r/PopulateContents()
+ name = "ammo can (8x50mmR)"
+ icon_state = "ammobox_850"
+ for(var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/a8_50r(src)
+
+/obj/item/storage/toolbox/ammo/a762_40/PopulateContents()
+ name = "ammo can (7.62x40mm CLIP)"
+ icon_state = "ammobox_762"
+ for (var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/a762_40(src)
+
+/obj/item/storage/toolbox/ammo/a308/PopulateContents()
+ name = "ammo can (.308)"
+ icon_state = "ammobox_308"
+ for (var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/a308(src)
+
+/obj/item/storage/toolbox/ammo/c45/PopulateContents()
+ name = "ammo can (.45)"
+ icon_state = "ammobox_45"
+ for (var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/c45(src)
+
+/obj/item/storage/toolbox/ammo/c9mm/PopulateContents()
+ name = "ammo can (9mm)"
+ icon_state = "ammobox_9mm"
+ for (var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/c9mm(src)
+
+/obj/item/storage/toolbox/ammo/c10mm/PopulateContents()
+ name = "ammo can (10mm)"
+ icon_state = "ammobox_10mm"
+ for (var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/c10mm(src)
+
+/obj/item/storage/toolbox/ammo/shotgun/PopulateContents()
+ name = "ammo can (12ga)"
+ icon_state = "ammobox_12ga"
+ for (var/i in 1 to 4)
+ new /obj/item/storage/box/ammo/a12g_buckshot(src)
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 1d787e24e4d3..34eba9a25191 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -596,7 +596,7 @@
new /obj/item/clothing/shoes/magboots/syndie(src)
new /obj/item/storage/firstaid/tactical(src)
new /obj/item/gun/ballistic/automatic/toy(src)
- new /obj/item/ammo_box/foambox/riot(src)
+ new /obj/item/storage/box/ammo/foam_darts/riot(src)
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes."
@@ -607,7 +607,7 @@
new /obj/item/gun/syringe/syndicate(src)
new /obj/item/gun/ballistic/automatic/toy(src)
new /obj/item/storage/box/syringes(src)
- new /obj/item/ammo_box/foambox/riot(src)
+ new /obj/item/storage/box/ammo/foam_darts/riot(src)
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
if(prob(5))
new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index c6d55e03ef48..3b7de4f3ad1d 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -285,7 +285,6 @@
/obj/item/ammo_box/magazine,
/obj/item/ammo_box/c38, //speed loaders don't have a common path like magazines. pain.
/obj/item/ammo_box/a357, //some day we should refactor these into an ammo_box/speedloader type
- /obj/item/ammo_box/a4570, //but not today
/obj/item/ammo_box/a858, //oh boy stripper clips too
/obj/item/ammo_box/vickland_a308,
/obj/item/ammo_box/a300,
@@ -299,7 +298,8 @@
/obj/item/clothing/gloves,
/obj/item/restraints/legcuffs/bola,
/obj/item/holosign_creator/security,
- /obj/item/stock_parts/cell/gun //WS edit Gun cells fit where they should and not where they dont
+ /obj/item/stock_parts/cell/gun,
+ /obj/item/ammo_box/magazine/ammo_stack, //handfuls of bullets
))
/obj/item/storage/belt/security/full/PopulateContents()
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index e0768391dae5..6a47c8544bb9 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -158,11 +158,9 @@
new /obj/item/stack/cable_coil(src,MAXCOIL,pickedcolor)
/obj/item/storage/toolbox/syndicate
- name = "suspicious looking toolbox"
+ name = "black and red toolbox"
icon_state = "syndicate"
item_state = "toolbox_syndi"
- force = 15
- throwforce = 18
material_flags = NONE
/obj/item/storage/toolbox/syndicate/ComponentInitialize()
@@ -172,11 +170,11 @@
/obj/item/storage/toolbox/syndicate/PopulateContents()
new /obj/item/screwdriver/nuke(src)
- new /obj/item/wrench/syndie(src) //WS Edit - Cool Syndie Tools
+ new /obj/item/wrench/syndie(src)
new /obj/item/weldingtool/largetank(src)
- new /obj/item/crowbar/syndie(src) //WS Begin - Cool Syndie Tools
+ new /obj/item/crowbar/syndie(src)
new /obj/item/wirecutters/syndie(src)
- new /obj/item/multitool/syndie(src) //WS End
+ new /obj/item/multitool/syndie(src)
new /obj/item/clothing/gloves/color/yellow(src)
/obj/item/storage/toolbox/syndicate/empty
@@ -225,58 +223,6 @@
new /obj/item/stack/cable_coil/cyan(src)
new /obj/item/stack/cable_coil/white(src)
-/obj/item/storage/toolbox/ammo
- name = "ammo can"
- desc = "A metal container for storing multiple boxes of ammunition or grenades."
- icon_state = "ammobox"
- item_state = "ammobox"
- drop_sound = 'sound/items/handling/ammobox_drop.ogg'
- pickup_sound = 'sound/items/handling/ammobox_pickup.ogg'
- material_flags = NONE
- has_latches = FALSE
-
-/obj/item/storage/toolbox/ammo/a850r/PopulateContents()
- name = "ammo can (8x50mmR)"
- icon_state = "ammobox_850"
- for(var/i in 1 to 4)
- new /obj/item/ammo_box/c8x50mm_box(src)
-
-/obj/item/storage/toolbox/ammo/a762_40/PopulateContents()
- name = "ammo can (7.62x40mm CLIP)"
- icon_state = "ammobox_762"
- for (var/i in 1 to 4)
- new /obj/item/ammo_box/a762_40(src)
-
-/obj/item/storage/toolbox/ammo/a308/PopulateContents()
- name = "ammo can (.308)"
- icon_state = "ammobox_308"
- for (var/i in 1 to 4)
- new /obj/item/ammo_box/a308(src)
-
-/obj/item/storage/toolbox/ammo/c45/PopulateContents()
- name = "ammo can (.45)"
- icon_state = "ammobox_45"
- for (var/i in 1 to 4)
- new /obj/item/ammo_box/c45(src)
-
-/obj/item/storage/toolbox/ammo/c9mm/PopulateContents()
- name = "ammo can (9mm)"
- icon_state = "ammobox_9mm"
- for (var/i in 1 to 4)
- new /obj/item/ammo_box/c9mm(src)
-
-/obj/item/storage/toolbox/ammo/c10mm/PopulateContents()
- name = "ammo can (10mm)"
- icon_state = "ammobox_10mm"
- for (var/i in 1 to 4)
- new /obj/item/ammo_box/c10mm(src)
-
-/obj/item/storage/toolbox/ammo/shotgun/PopulateContents()
- name = "ammo can (12ga)"
- icon_state = "ammobox_12ga"
- for (var/i in 1 to 4)
- new /obj/item/ammo_box/a12g(src)
-
/obj/item/storage/toolbox/infiltrator
name = "insidious case"
desc = "Bearing the emblem of the Syndicate, this case contains a full infiltrator stealth suit, and has enough room to fit weaponry if necessary."
diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm
index fd9b3859cd3b..5b9da6611bd9 100644
--- a/code/game/objects/items/theft_tools.dm
+++ b/code/game/objects/items/theft_tools.dm
@@ -80,12 +80,8 @@
//snowflake screwdriver, works as a key to start nuke theft, traitor only
/obj/item/screwdriver/nuke
- name = "screwdriver"
- desc = "A screwdriver with an ultra thin tip that's carefully designed to boost screwing speed."
-// icon = 'icons/obj/nuke_tools.dmi' WS edit - better tool sprites
icon_state = "screwdriver_nuke"
item_state = "screwdriver_nuke"
- toolspeed = 0.5
random_color = FALSE
/obj/item/paper/guides/antag/nuke_instructions
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 26509776dd16..c53fb57a8bd3 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -117,10 +117,7 @@
toolspeed = 0.5
/obj/item/crowbar/syndie
- name = "suspicious-looking crowbar"
- desc = "It has special counterweights that adjust to the amount of pressure put on it by using a complex array of springs and screws."
icon_state = "crowbar_syndie"
- toolspeed = 0.5
force = 8
/obj/item/crowbar/old
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index e2dfc9a81dc3..383cbd027395 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -85,10 +85,7 @@
random_color = FALSE
/obj/item/wirecutters/syndie
- name = "suspicious-looking wirecutters"
- desc = "The blades of these wirecutters have suspiciously fine serrated teeth."
icon_state = "cutters_syndie"
- toolspeed = 0.5
random_color = FALSE
/obj/item/wirecutters/old
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 3e9898d87508..b6b99c7c8282 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -95,10 +95,7 @@
return ..()
/obj/item/wrench/syndie
- name = "suspicious-looking wrench"
- desc = "It's one of those fancy wrenches that you turn backward without twisting the bolt for faster action."
icon_state = "wrench_syndie"
- toolspeed = 0.5
/obj/item/wrench/crescent
name = "crescent wrench"
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 6d6d258b5b0c..81e6ea9d54ec 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -245,7 +245,7 @@
/obj/item/toy/ammo/gun
name = "capgun ammo"
desc = "Make sure to recyle the box in an autolathe when it gets empty."
- icon = 'icons/obj/ammo.dmi'
+ icon = 'icons/obj/ammunition/ammo.dmi'
icon_state = "357OLD-7"
w_class = WEIGHT_CLASS_TINY
custom_materials = list(/datum/material/iron=10, /datum/material/glass=10)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 23aa2df0ab5a..77497b671617 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -328,10 +328,10 @@
..()
for(var/i in 1 to 3)
new /obj/item/storage/box/lethalshot(src)
- new /obj/item/ammo_box/magazine/co9mm(src) //WS edit - begin - better safe than sorry
new /obj/item/ammo_box/magazine/co9mm(src)
new /obj/item/ammo_box/magazine/co9mm(src)
- new /obj/item/ammo_box/magazine/co9mm(src) //WS edit - end
+ new /obj/item/ammo_box/magazine/co9mm(src)
+ new /obj/item/ammo_box/magazine/co9mm(src)
/obj/structure/closet/secure_closet/labor_camp_security
name = "labor camp security locker"
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index d5b1710b6296..f99cb8b9818b 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -701,9 +701,13 @@
return
if(user.body_position == LYING_DOWN || user.usable_legs < 2)
return
+
+ if(user.a_intent != INTENT_HARM)
+ to_chat(user, span_danger("You aren't HARMFUL enough to beat the rack."))
+ return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
- user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE)
+ user.visible_message(span_danger("[user] kicks [src]."), null, null, COMBAT_MESSAGE_RANGE)
take_damage(rand(4,8), BRUTE, "melee", 1)
/obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm
index 77c091d2126a..f76bf026e12c 100644
--- a/code/modules/antagonists/gang/outfits.dm
+++ b/code/modules/antagonists/gang/outfits.dm
@@ -30,10 +30,7 @@
backpack_contents = list(/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/teargas = 1,
/obj/item/storage/box/flashbangs = 1,
- /obj/item/shield/riot/tele = 1,
- /obj/item/ammo_box/magazine/m45 = 3,
- /obj/item/ammo_box/c45 = 2)
-
+ /obj/item/shield/riot/tele = 1)
/datum/outfit/families_police/beatcop/armored
name = "Families: Armored Beat Cop"
@@ -53,8 +50,7 @@
backpack_contents = list(/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/teargas = 1,
/obj/item/storage/box/flashbangs = 1,
- /obj/item/shield/riot/tele = 1,
- /obj/item/storage/box/lethalshot = 2)
+ /obj/item/shield/riot/tele = 1)
/datum/outfit/families_police/beatcop/fbi
name = "Families: Space FBI Officer"
@@ -65,8 +61,7 @@
/obj/item/storage/box/teargas = 1,
/obj/item/storage/box/flashbangs = 1,
/obj/item/shield/riot/tele = 1,
- /obj/item/ammo_box/magazine/smgm9mm = 3,
- /obj/item/ammo_box/c9mm = 2)
+ /obj/item/ammo_box/magazine/smgm9mm = 3)
/datum/outfit/families_police/beatcop/military
name = "Families: Space Military"
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 4bd2f5c8a525..378aa7dbe14a 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -306,18 +306,6 @@
item_path = /obj/item/antag_spawner/contract
category = "Assistance"
-/datum/spellbook_entry/item/guardian
- name = "Guardian Deck"
- desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \
- It would be wise to avoid buying these with anything capable of causing you to swap bodies with others."
- item_path = /obj/item/guardiancreator/choose/wizard
- category = "Assistance"
-
-/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
- . = ..()
- if(.)
- new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user))
-
/datum/spellbook_entry/item/bloodbottle
name = "Bottle of Blood"
desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
diff --git a/code/modules/assembly/anomalies.dm b/code/modules/assembly/anomalies.dm
new file mode 100644
index 000000000000..0b390b39e8b4
--- /dev/null
+++ b/code/modules/assembly/anomalies.dm
@@ -0,0 +1,248 @@
+///Base anomaly signaller
+// Embedded signaller used in anomalies.
+/obj/item/assembly/signaler/anomaly
+ name = "anomaly core"
+ desc = "The stabilized core of an anomaly. It'd probably be valuable for research."
+ icon_state = "anomaly core"
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ resistance_flags = FIRE_PROOF
+ //allows anomaly cores to recieve multiple signals
+ var/code_b = DEFAULT_SIGNALER_CODE
+ var/anomaly_type = /obj/effect/anomaly
+ var/research
+
+/obj/item/assembly/signaler/anomaly/Initialize()
+ . = ..()
+ set_frequency(frequency)
+
+/obj/item/assembly/signaler/anomaly/attack_self()
+ return
+
+/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
+ if(!signal)
+ return FALSE
+ if(signal.data["code"] == code)
+ for(var/obj/effect/anomaly/Anomaly in get_turf(src))
+ Anomaly.anomalyNeutralize()
+ return TRUE
+ if(signal.data["code"] == code_b )
+ for(var/obj/effect/anomaly/Anomaly in get_turf(src))
+ Anomaly.detonate()
+ anomaly_core_detonation()
+ return TRUE
+ return FALSE
+
+//extend this on a per anomaly basis.
+/obj/item/assembly/signaler/anomaly/proc/anomaly_core_detonation()
+ new /obj/effect/particle_effect/smoke/bad(loc)
+ qdel(src)
+
+/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_ANALYZER)
+ to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code]. An unstable frequency is present at code [code_b].")
+ ..()
+
+///Bluespace Anomaly
+/obj/item/assembly/signaler/anomaly/bluespace
+ name = "\improper bluespace anomaly core"
+ desc = "The stabilized core of a bluespace anomaly. It keeps phasing in and out of view."
+ icon_state = "anomaly core"
+
+/obj/item/assembly/signaler/anomaly/bluespace/anomaly_core_detonation()
+ //just teleports people
+ visible_message(span_warning("[src] creates a bluespace fracture around itself!"))
+ for(var/mob/living/Mob in range(1,src))
+ do_teleport(Mob, locate(Mob.x, Mob.y, Mob.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE)
+ ..()
+
+//Flux Anomaly
+/obj/item/assembly/signaler/anomaly/flux
+ name = "\improper flux anomaly core"
+ desc = "The stabilized core of a flux anomaly. Touching it makes your skin tingle."
+ icon_state = "flux core"
+
+/obj/item/assembly/signaler/anomaly/flux/anomaly_core_detonation()
+ //zap
+ visible_message(span_warning("Electrical arcs flash off of [src] as it fizzles out!"))
+ tesla_zap(src, 3, 1000, ZAP_FUSION_FLAGS)
+ ..()
+
+///Gravity Anomaly
+/obj/item/assembly/signaler/anomaly/grav
+ name = "\improper gravitational anomaly core"
+ desc = "The stabilized core of a gravitational anomaly. It feels much heavier than it looks."
+ icon_state = "grav core"
+
+/obj/item/assembly/signaler/anomaly/grav/anomaly_core_detonation()
+ //throngles u cutely
+ visible_message(span_warning("[src] implodes into itself, light itself bending for a split second!"))
+ for(var/mob/living/carbon/carbon in range(1,src))
+ if(carbon.run_armor_check(attack_flag = "melee") >= 20)
+ carbon.break_random_bone()
+ else if(carbon.run_armor_check(attack_flag = "melee") >= 40)
+ carbon.break_all_bones() //crunch
+ carbon.apply_damage(20, BRUTE)
+
+///Hallucination Anomaly
+/obj/item/assembly/signaler/anomaly/hallucination
+ name = "\improper hallucination anomaly core"
+ desc = "The stabilized core of a hallucination anomaly. It's never entirely there."
+ icon_state = "hallucination_core"
+
+///Heartbeat Anomaly
+/obj/item/assembly/signaler/anomaly/heartbeat
+ name = "\improper heartbeat anomaly core"
+ desc = "The stabilized core of a heartbeat anomaly. Pulses of heat run across its shell."
+
+/obj/item/assembly/signaler/anomaly/heartbeat/anomaly_core_detonation()
+ visible_message(span_warning("[src] expands and throbs, before shattering into dozens of fragments!"))
+ radiation_pulse(src, 500, 2)
+ new /obj/effect/decal/cleanable/glass/strange(src)
+ ..()
+
+///Melter Anomaly
+/obj/item/assembly/signaler/anomaly/melter
+ name = "\improper melter anomaly core"
+ desc = "The stabilized core of a melter anomaly. It sizzles and crackles."
+ icon_state = "pyro core"
+
+/obj/item/assembly/signaler/anomaly/melter/anomaly_core_detonation()
+ visible_message(span_warning("[src] melts into a glowing residue!"))
+ new /obj/effect/decal/cleanable/greenglow(src.loc)
+ ..()
+
+///Phantom Anomaly
+/obj/item/assembly/signaler/anomaly/phantom
+ name = "\improper phantom anomaly core"
+ desc = "The stabilized core of a phantom anomaly. It quietly screams."
+
+/obj/item/assembly/signaler/anomaly/phantom/anomaly_core_detonation()
+ playsound(src,'sound/hallucinations/far_noise.ogg', 100, 0, 50, TRUE, TRUE)
+ visible_message(span_warning("[src] screams as it disappates!"))
+ ..()
+
+///Plasmasoul Anomaly
+/obj/item/assembly/signaler/anomaly/plasmasoul
+ name = "\improper plasmasoul anomaly core"
+ desc = "The stabilized core of a plasmasoul anomaly. The air around it hisses."
+
+/obj/item/assembly/signaler/anomaly/plasmasoul/anomaly_core_detonation()
+ visible_message(span_warning("[src] rapidly delaminates, leaving behind trace vapors!"))
+ ..()
+
+///Pulsar Anomaly
+/obj/item/assembly/signaler/anomaly/pulsar
+ name = "\improper pulsar anomaly core"
+ desc = "The stabilized core of a pulsar anomaly. Electromagnetic crackles come off it."
+
+/obj/item/assembly/signaler/anomaly/pulsar/anomaly_core_detonation()
+ visible_message(span_warning("[src] gives off one last pulse as it melts!"))
+ empulse(loc, 3, 1)
+ ..()
+
+///Pyroclastic Anomaly
+/obj/item/assembly/signaler/anomaly/pyro
+ name = "\improper pyroclastic anomaly core"
+ desc = "The stabilized core of a pyroclastic anomaly. It almost burns to touch."
+ icon_state = "pyro core"
+
+//glorified molotov
+/obj/item/assembly/signaler/anomaly/pyro/anomaly_core_detonation()
+ //this is tg's ash heretic ash heretic ascenscion power tuned down a bit.
+ visible_message(span_warning("[src] loses coherence, bursting into brilliant flames!"))
+ for(var/i in 0 to 3)
+ for(var/turf/nearby_turf as anything in spiral_range_turfs(i + 1, src.loc))
+ var/obj/effect/hotspot/flame_tile = locate(nearby_turf) || new(nearby_turf)
+ flame_tile.alpha = 125
+ nearby_turf.hotspot_expose(750, 25, 1)
+ qdel(src)
+
+///Sparkler Anomaly
+/obj/item/assembly/signaler/anomaly/sparkler
+ name = "\improper sparkler anomaly core"
+ desc = "The stabilized core of a sparkler anomaly. Tiny electrical sparks arc off it."
+
+/obj/item/assembly/signaler/anomaly/sparkler/anomaly_core_detonation()
+ visible_message(span_warning("[src] shoots out one last assortment of sparks!"))
+ tesla_zap(src, 2, 5000, ZAP_FUSION_FLAGS)
+ ..()
+
+///Static Anomaly
+/obj/item/assembly/signaler/anomaly/tvstatic
+ name = "\improper static anomaly core"
+ desc = "The stabilized core of a static anomaly. Your head hurts just staring at it"
+
+/obj/item/assembly/signaler/anomaly/tvstatic/anomaly_core_detonation()
+ visible_message(span_warning("[src] withdraws into itself, one last message escaping it!"))
+ say(pick(GLOB.tvstatic_sayings))
+ for(var/mob/living/carbon/human/looking in range(4, src))
+ if (!HAS_TRAIT(looking, TRAIT_MINDSHIELD) && looking.stat != DEAD)
+ looking.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 40)
+ playsound(src, 'sound/effects/stall.ogg', 100)
+ ..()
+
+///Transfusion Anomaly
+/obj/item/assembly/signaler/anomaly/transfusion
+ name = "\improper transfusion anomaly core"
+ desc = "The stabilized core of a tranfusion anomaly. Crimson slowly seeps out of the containment unit."
+ icon_state = "pyro core"
+ var/blood_stored
+ var/blood_max
+
+/obj/item/assembly/signaler/anomaly/transfusion/Initialize()
+ . = ..()
+ blood_max = rand(400, 1200)
+
+/obj/item/assembly/signaler/anomaly/transfusion/proc/set_blood_stored(int)
+ blood_stored += int
+
+/obj/item/assembly/signaler/anomaly/transfusion/proc/set_blood_max(int)
+ blood_max = int
+
+/obj/item/assembly/signaler/anomaly/transfusion/proc/get_blood_stored()
+ return blood_stored
+
+/obj/item/assembly/signaler/anomaly/transfusion/proc/get_blood_max()
+ return blood_max
+
+/obj/item/assembly/signaler/anomaly/transfusion/anomaly_core_detonation()
+ visible_message(span_warning("Ichor flies out of [src], trying to force itself into everything around!"))
+ while(blood_stored > 0)
+ for(var/mob/living/carbon/victim in range(2, src))
+ var/present_time
+ present_time = rand((blood_stored / 10), (blood_stored / 2))
+ visible_message(span_boldwarning("[victim] finds themselves transfused with the crimson ichor!"))
+ victim.blood_volume += present_time
+ blood_stored += -present_time
+ ..()
+
+///Veins Anomaly
+/obj/item/assembly/signaler/anomaly/veins
+ name = "\improper fountain anomaly core"
+ desc = "The stabilized core of a fountain anomaly. It's slippery, like an intestine."
+
+/obj/item/assembly/signaler/anomaly/veins/anomaly_core_detonation()
+ //goreshit
+ var/obj/effect/gibspawner/mess = pick(list(
+ /obj/effect/gibspawner/human,
+ /obj/effect/gibspawner/xeno,
+ /obj/effect/gibspawner/generic/animal
+ ))
+ visible_message(span_warning("[src] erupts into a fountain of gore and viserca!"))
+ new mess(src.loc)
+ ..()
+
+///Vortex Anomaly
+/obj/item/assembly/signaler/anomaly/vortex
+ name = "\improper vortex anomaly core"
+ desc = "The stabilized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it."
+ icon_state = "vortex core"
+
+/obj/item/assembly/signaler/anomaly/vortex/anomaly_core_detonation()
+ //disappears bigly
+ playsound(src,'sound/effects/phasein.ogg', 100, 0, 50, TRUE, TRUE)
+ new /obj/effect/particle_effect/sparks/quantum(loc)
+ visible_message(span_warning("[src] shakes violently and - hey, where'd it go?"))
+ ..()
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 0bfac86ee0df..b1203d358e7f 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -144,126 +144,6 @@
return
return ..(signal)
-// Embedded signaller used in anomalies.
-/obj/item/assembly/signaler/anomaly
- name = "anomaly core"
- desc = "The neutralized core of an anomaly. It'd probably be valuable for research."
- icon_state = "anomaly core"
- item_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- resistance_flags = FIRE_PROOF
- var/anomaly_type = /obj/effect/anomaly
- var/research
-
-/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
- if(!signal)
- return FALSE
- if(signal.data["code"] != code)
- return FALSE
- for(var/obj/effect/anomaly/Anomaly in get_turf(src))
- Anomaly.anomalyNeutralize()
- return TRUE
-
-/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_ANALYZER)
- to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].")
- ..()
-
-/obj/item/assembly/signaler/anomaly/det_signal
- name = "anomaly field"
- research = null
- anomaly_type = null
-
-/obj/item/assembly/signaler/anomaly/det_signal/receive_signal(datum/signal/signal)
- if(!signal)
- return FALSE
- if(signal.data["code"] != code)
- return FALSE
- for(var/obj/effect/anomaly/Anomaly in get_turf(src))
- Anomaly.detonate()
- return TRUE
-
-
-//Anomaly cores
-
-/obj/item/assembly/signaler/anomaly/pyro
- name = "\improper pyroclastic anomaly core"
- desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research."
- icon_state = "pyro core"
- anomaly_type = /obj/effect/anomaly/pyro
-
-/obj/item/assembly/signaler/anomaly/grav
- name = "\improper gravitational anomaly core"
- desc = "The neutralized core of a gravitational anomaly. It feels much heavier than it looks. It'd probably be valuable for research."
- icon_state = "grav core"
- anomaly_type = /obj/effect/anomaly/grav
-
-/obj/item/assembly/signaler/anomaly/flux
- name = "\improper flux anomaly core"
- desc = "The neutralized core of a flux anomaly. Touching it makes your skin tingle. It'd probably be valuable for research."
- icon_state = "flux core"
- anomaly_type = /obj/effect/anomaly/flux
-
-/obj/item/assembly/signaler/anomaly/bluespace
- name = "\improper bluespace anomaly core"
- desc = "The neutralized core of a bluespace anomaly. It keeps phasing in and out of view. It'd probably be valuable for research."
- icon_state = "anomaly core"
- anomaly_type = /obj/effect/anomaly/bluespace
-
-/obj/item/assembly/signaler/anomaly/vortex
- name = "\improper vortex anomaly core"
- desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research."
- icon_state = "vortex core"
- anomaly_type = /obj/effect/anomaly/vortex
-
-/obj/item/assembly/signaler/anomaly/hallucination
- name = "\improper hallucination anomaly core"
- desc = "The neutralized core of a hallucination anomaly. It seems to be moving, but it's probably your imagination. It'd probably be valuable for research."
- icon_state = "hallucination_core"
- anomaly_type = /obj/effect/anomaly/hallucination
-
-/obj/item/assembly/signaler/anomaly/sparkler
- name = "\improper sparkler anomaly core"
- desc = "The neutralized core of a sparkler anomaly. Tiny electrical sparks arc off it."
- anomaly_type = /obj/effect/anomaly/sparkler
-
-/obj/item/assembly/signaler/anomaly/veins
- name = "\improper fountain anomaly core"
- desc = "The neutralized core of a fountain anomaly. Blood drips off of it."
- anomaly_type = /obj/effect/anomaly/sparkler
-
-/obj/item/assembly/signaler/anomaly/phantom
- name = "\improper phantom anomaly core"
- desc = "The neutralized core of a phantom anomaly. It quietly screams."
- anomaly_type = /obj/effect/anomaly/phantom
-
-/obj/item/assembly/signaler/anomaly/pulsar
- name = "\improper pulsar anomaly core"
- desc = "The neutralized core of a pulsar anomaly. Electromagnetic crackles come off it."
-
-/obj/item/assembly/signaler/anomaly/plasmasoul
- name = "\improper plasmasoul anomaly core"
- desc = "The neutralized core of a plasmasoul anomaly. The air around it hisses."
-
-/obj/item/assembly/signaler/anomaly/heartbeat
- name = "\improper heartbeat anomaly core"
- desc = "The neutralized core of a heartbeat anomaly. It's concerningly warm to the touch."
-
-/obj/item/assembly/signaler/anomaly/tvstatic
- name = "\improper static anomaly core"
- desc = "The neutralized core of a static anomaly. Your head hurts just staring at it"
-
-/obj/item/assembly/signaler/anomaly/melter
- name = "\improper melter anomaly core"
- desc = "The neutralized core of a melter anomaly. It sizzles and crackles. It'd probably be valuable for research."
- icon_state = "pyro core"
-
-
-
-/obj/item/assembly/signaler/anomaly/attack_self()
- return
-
/obj/item/assembly/signaler/cyborg
/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 4920de28e364..d233b74ee69c 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -114,15 +114,21 @@
"stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png',
"stamp-solgov" = 'icons/stamp_icons/large_stamp-solgov.png',
"stamp-inteq" = 'icons/stamp_icons/large_stamp-inteq.png',
- "stamp-vanguard" = 'icons/stamp_icons/large_stamp-vanguard.png',
- "stamp-maa" = 'icons/stamp_icons/large_stamp-maa.png',
- "stamp-artificer" = 'icons/stamp_icons/large_stamp-artificer.png',
+ "stamp-inteq_vanguard" = 'icons/stamp_icons/large_stamp-inteq_vanguard.png',
+ "stamp-inteq_maa" = 'icons/stamp_icons/large_stamp-inteq_maa.png',
+ "stamp-inteq_artificer" = 'icons/stamp_icons/large_stamp-inteq_artificer.png',
+ "stamp-inteq_corpsman" = 'icons/stamp_icons/large_stamp-inteq_corpsman.png',
"stamp-clip" = 'icons/stamp_icons/large_stamp-clip.png',
"stamp-bard" = 'icons/stamp_icons/large_stamp-bard.png',
"stamp-gold" = 'icons/stamp_icons/large_stamp-gold.png',
"stamp-cybersun" = 'icons/stamp_icons/large_stamp-cybersun.png',
"stamp-biodynamics" = 'icons/stamp_icons/large_stamp-biodynamics.png',
- "stamp-donk" = 'icons/stamp_icons/large_stamp-donk.png'
+ "stamp-donk" = 'icons/stamp_icons/large_stamp-donk.png',
+ "stamp-ngr" = 'icons/stamp_icons/large_stamp-ngr.png',
+ "stamp-ngr_cap" = 'icons/stamp_icons/large_stamp-ngr_captain.png',
+ "stamp-ngr_fore" = 'icons/stamp_icons/large_stamp-ngr_foreman.png',
+ "stamp-ngr_lieu" = 'icons/stamp_icons/large_stamp-ngr_lieutenant.png',
+ "stamp-ngr_ensign" = 'icons/stamp_icons/large_stamp-ngr_ensign.png'
)
/datum/asset/simple/fuckywucky
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
index d5489edeb3e0..434a80c6416d 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
@@ -28,7 +28,7 @@
/datum/blackmarket_item/ammo/himehabu_box
name = ".22 LR Ammo Box"
desc = "A 75 round ammo box of .22 LR. Trust me, you'll need every shot."
- item = /obj/item/ammo_box/c22lr_box
+ item = /obj/item/storage/box/ammo/c22lr
price_min = 100
price_max = 300
@@ -39,7 +39,7 @@
/datum/blackmarket_item/ammo/a357_box
name = ".357 Ammo Box"
desc = "A 50 round ammo box of .357."
- item = /obj/item/ammo_box/a357_box
+ item = /obj/item/storage/box/ammo/a357
price_min = 150
price_max = 500
@@ -60,7 +60,7 @@
/datum/blackmarket_item/ammo/c299
name = "Eoehoma .299 Caseless Ammo Box"
desc = "This ammunition for the E-40 Hybrid Rifle is probably worth more than the people you're shooting it at."
- item = /obj/item/ammo_box/c299
+ item = /obj/item/storage/box/ammo/c299
price_min = 300
price_max = 700
@@ -253,7 +253,7 @@
/datum/blackmarket_item/ammo/a4570hp
name = ".45-70 Hollow Point Ammo Box"
desc = "Put the hollow in hollow point by blowing a crater in some random sod with this devastating .45-70 cartridge."
- item = /obj/item/ammo_box/a4570/hp
+ item = /obj/item/storage/box/ammo/a4570_hp
price_min = 600
price_max = 1000
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
index 412ba303b977..f361f4e758ff 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm
@@ -11,17 +11,6 @@
stock = 1
availability_prob = 20
-/datum/blackmarket_item/tool/syndi_toolbox
- name = "Syndicate Toolbox"
- desc = "A set of specialized tools, built to precision perfection and certified by the GEC."
- item = /obj/item/storage/toolbox/syndicate
-
- price_min = 500
- price_max = 2000
- stock_min = 1
- stock_max = 3
- availability_prob = 40
-
/datum/blackmarket_item/tool/surgery_duffel
name = "Cybersun Advanced Surgical Kit"
desc = "You might say it's morally wrong to steal. I say it's justified when it's Cybersun."
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
index be3ec7a26599..165cfb6c1196 100644
--- a/code/modules/cargo/exports.dm
+++ b/code/modules/cargo/exports.dm
@@ -59,7 +59,8 @@ then the player gets the profit from selling his own wasted time.
if(!dry_run && (sold || delete_unsold))
if(ismob(thing))
thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO)
- qdel(thing)
+ if(!dry_run)
+ qdel(AM)
return report
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index c585ecb25a98..722333fac2db 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -23,8 +23,7 @@
/datum/export/lavaland/major //valuable chest/ruin loot and staff of storms
cost = 10000
unit_name = "lava planet artifact"
- export_types = list(/obj/item/guardiancreator,
- /obj/item/rod_of_asclepius,
+ export_types = list(/obj/item/rod_of_asclepius,
/obj/item/clothing/suit/space/hardsuit/ert/paranormal,
/obj/item/prisoncube,
/obj/item/staff/storm,
@@ -45,7 +44,6 @@
/obj/machinery/anomalous_crystal,
/obj/item/mayhem,
/obj/item/blood_contract,
- /obj/item/guardiancreator/miner/choose//this is basically the most valulable mining loot so good luck getting a miner to part ways
)
/*
/datum/export/lavaland/trophycommon
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index 8d8f47a05f65..716cb51d1e97 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -1,6 +1,7 @@
/datum/supply_pack/ammo
group = "Ammunition"
crate_type = /obj/structure/closet/crate/secure/gear
+ crate_name = "ammo crate"
/*
Pistol ammo
@@ -45,7 +46,7 @@
/datum/supply_pack/ammo/mag_556mm
name = "5.56 Pistole C Magazine Crate"
desc = "Contains a 5.56mm magazine for the Pistole C, containing twelve rounds."
- contains = list(/obj/item/ammo_box/magazine/pistol556mm)
+ contains = list(/obj/item/storage/box/ammo/c556mm)
cost = 750
faction = FACTION_SOLGOV
@@ -62,21 +63,21 @@
/datum/supply_pack/ammo/buckshot
name = "Buckshot Crate"
- desc = "Contains a box of twenty-five buckshot shells for use in lethal persuasion."
+ desc = "Contains a box of 32 buckshot shells for use in lethal persuasion."
cost = 500
- contains = list(/obj/item/ammo_box/a12g)
+ contains = list(/obj/item/storage/box/ammo/a12g_buckshot)
/datum/supply_pack/ammo/slugs
name = "Shotgun Slug Crate"
- desc = "Contains a box of twenty-five slug shells for use in lethal persuasion."
+ desc = "Contains a box of 32 slug shells for use in lethal persuasion."
cost = 500
- contains = list(/obj/item/ammo_box/a12g/slug)
-
+ contains = list(/obj/item/storage/box/ammo/a12g_slug
+)
/datum/supply_pack/ammo/blank_shells
name = "Blank Shell Crate"
desc = "Contains a box of blank shells."
cost = 500
- contains = list(/obj/item/ammo_box/a12g/blanks)
+ contains = list(/obj/item/storage/box/ammo/a12g_blank)
/datum/supply_pack/ammo/blank_ammo_disk
name = "Blank Ammo Design Disk Crate"
@@ -92,9 +93,9 @@
/datum/supply_pack/ammo/rubbershot
name = "Rubbershot Crate"
- desc = "Contains a box of twenty-five rubbershot shells for use in crowd control or training."
+ desc = "Contains a box of 32 rubbershot shells for use in crowd control or training."
cost = 500
- contains = list(/obj/item/ammo_box/a12g/rubbershot)
+ contains = list(/obj/item/storage/box/ammo/a12g_rubbershot)
/*
.38 ammo
@@ -104,8 +105,8 @@
name = ".38 Ammo Boxes Crate"
desc = "Contains two 50 round ammo boxes for refilling .38 weapons."
cost = 250
- contains = list(/obj/item/ammo_box/c38_box,
- /obj/item/ammo_box/c38_box)
+ contains = list(/obj/item/storage/box/ammo/c38,
+ /obj/item/storage/box/ammo/c38)
crate_name = "ammo crate"
/datum/supply_pack/ammo/match
@@ -195,134 +196,136 @@
/datum/supply_pack/ammo/a762_ammo_box
name = "7.62x40mm CLIP Ammo Box Crate"
- desc = "Contains a one hundred and twenty-round 7.62x40mm CLIP box for the SKM rifles."
- contains = list(/obj/item/ammo_box/a762_40)
+ desc = "Contains two 60-round 7.62x40mm CLIP boxes for the SKM rifles."
+ contains = list(/obj/item/storage/box/ammo/a762_40,
+ /obj/item/storage/box/ammo/a762_40)
cost = 500
/datum/supply_pack/ammo/a556_ammo_box
name = "5.56x42mm CLIP Ammo Box Crate"
- desc = "Contains a one hundred and twenty-round 5.56x42mm CLIP box for most newer rifles."
- contains = list(/obj/item/ammo_box/a556_42)
+ desc = "Contains two 60-round 5.56x42mm CLIP boxes for most newer rifles."
+ contains = list(/obj/item/storage/box/ammo/a556_42,
+ /obj/item/storage/box/ammo/a556_42)
cost = 450
/datum/supply_pack/ammo/a357_ammo_box
name = ".357 Ammo Box Crate"
- desc = "Contains a fifty-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand."
- contains = list(/obj/item/ammo_box/a357_box)
+ desc = "Contains a 48-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand."
+ contains = list(/obj/item/storage/box/ammo/a357)
cost = 250
/datum/supply_pack/ammo/c556mmHITP_ammo_box
name = "5.56 Caseless Ammo Box Crate"
- desc = "Contains a fifty-round 5.56mm caseless box for SolGov sidearms like the Pistole C."
- contains = list(/obj/item/ammo_box/c556mmHITP)
+ desc = "Contains a 48-round 5.56mm caseless box for SolGov sidearms like the Pistole C."
+ contains = list(/obj/item/storage/box/ammo/c556mm)
cost = 250
/datum/supply_pack/ammo/c45_ammo_box
name = ".45 Ammo Box Crate"
- desc = "Contains a fifty-round .45 box for pistols and SMGs like the Candor or the C-20r."
- contains = list(/obj/item/ammo_box/c45)
+ desc = "Contains a 48-round .45 box for pistols and SMGs like the Candor or the C-20r."
+ contains = list(/obj/item/storage/box/ammo/c45)
cost = 250
/datum/supply_pack/ammo/c10mm_ammo_box
name = "10mm Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box for pistols and SMGs like the Ringneck or the SkM-44(k)."
- contains = list(/obj/item/ammo_box/c10mm)
+ desc = "Contains a 48-round 10mm box for pistols and SMGs like the Ringneck or the SkM-44(k)."
+ contains = list(/obj/item/storage/box/ammo/c10mm)
cost = 250
/datum/supply_pack/ammo/c9mm_ammo_box
name = "9mm Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box for pistols and SMGs such as the Commander or Saber."
- contains = list(/obj/item/ammo_box/c9mm)
+ desc = "Contains a 48-round 9mm box for pistols and SMGs such as the Commander or Saber."
+ contains = list(/obj/item/storage/box/ammo/c9mm)
cost = 200
/datum/supply_pack/ammo/a308_ammo_box
name = "308 Ammo Box Crate"
desc = "Contains a thirty-round .308 box for DMRs such as the SsG-04 and CM-GAL-S."
- contains = list(/obj/item/ammo_box/a308)
+ contains = list(/obj/item/storage/box/ammo/a308)
cost = 500
/datum/supply_pack/ammo/c9mmap_ammo_box
name = "9mm AP Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box loaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c9mm/ap)
+ desc = "Contains a 48-round 9mm box loaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c9mm/ap)
cost = 400
/datum/supply_pack/ammo/a357match_ammo_box
name = ".357 Match Ammo Box Crate"
- desc = "Contains a fifty-round .357 match box for better performance against armor."
- contains = list(/obj/item/ammo_box/a357_box/match)
+ desc = "Contains a 48-round .357 match box for better performance against armor."
+ contains = list(/obj/item/storage/box/ammo/a357_match)
cost = 500
/datum/supply_pack/ammo/c556mmHITPap_ammo_box
name = "5.56 caseless AP Ammo Box Crate"
- desc = "Contains a fifty-round 5.56mm caseless boxloaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c556mmHITP/ap)
+ desc = "Contains a 48-round 5.56mm caseless boxloaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c556mm_ap)
cost = 500
/datum/supply_pack/ammo/c45ap_ammo_box
name = ".45 AP Ammo Box Crate"
- desc = "Contains a fifty-round .45 box loaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c45/ap)
+ desc = "Contains a 48-round .45 box loaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c45_ap)
cost = 500
/datum/supply_pack/ammo/c10mmap_ammo_box
name = "10mm AP Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c10mm/ap)
+ desc = "Contains a 48-round 10mm box loaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c10mm_ap)
cost = 500
/datum/supply_pack/ammo/c9mmhp_ammo_box
name = "9mm HP Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c9mm/hp)
+ desc = "Contains a 48-round 9mm box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c9mm_hp)
cost = 400
/datum/supply_pack/ammo/a357hp_ammo_box
name = ".357 HP Ammo Box Crate"
- desc = "Contains a fifty-round .357 box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/a357_box/hp)
+ desc = "Contains a 48-round .357 box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/a357_hp)
cost = 500
/datum/supply_pack/ammo/c10mmhp_ammo_box
name = "10mm HP Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c10mm/hp)
+ desc = "Contains a 48-round 10mm box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c10mm_hp)
cost = 500
+
/datum/supply_pack/ammo/c45hp_ammo_box
name = ".45 HP Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c45/hp)
+ desc = "Contains a 48-round 10mm box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c45_hp)
cost = 500
/datum/supply_pack/ammo/c556mmhitphp_ammo_box
name = "5.56 Caseless HP Ammo Box Crate"
- desc = "Contains a fifty-round 5.56mm caseless box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c556mmHITP/hp)
+ desc = "Contains a 48-round 5.56mm caseless box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c556mm_hp)
cost = 500
/datum/supply_pack/ammo/c9mmrubber_ammo_box
name = "9mm Rubber Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c9mm/rubbershot)
+ desc = "Contains a 48-round 9mm box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c9mm_rubber)
cost = 200
/datum/supply_pack/ammo/c10mmrubber_ammo_box
name = "10mm Rubber Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c10mm/rubbershot)
+ desc = "Contains a 48-round 10mm box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c10mm_rubber)
cost = 250
/datum/supply_pack/ammo/c45mmrubber_ammo_box
name = ".45 Rubber Ammo Box Crate"
- desc = "Contains a fifty-round .45 box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c45/rubbershot)
+ desc = "Contains a 48-round .45 box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c45_rubber)
cost = 250
-
/datum/supply_pack/ammo/c556HITPrubber_ammo_box
name = "5.56 Caseless Rubber Ammo Box Crate"
- desc = "Contains a fifty-round 5.56 caseless box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c556mmHITP/rubbershot)
+ desc = "Contains a 48-round 5.56 caseless box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c556mm_rubber)
cost = 250
/datum/supply_pack/ammo/guncell
@@ -339,93 +342,90 @@
/datum/supply_pack/ammo/c57x39mm_boxcrate
name = "5.7x39mm Ammo Box Crate"
- desc = "Contains a fifty-round 5.7x39mm box for PDWs such as the Sidewinder."
- contains = list(/obj/item/ammo_box/c57x39mm_box)
+ desc = "Contains a 48-round 5.7x39mm box for PDWs such as the Sidewinder."
+ contains = list(/obj/item/storage/box/ammo/c57x39)
cost = 250
/datum/supply_pack/ammo/c46x30mm_boxcrate
name = "4.6x30mm Ammo Box Crate"
- desc = "Contains a fifty-round 4.6x30mm box for PDWs such as the WT-550."
- contains = list(/obj/item/ammo_box/c46x30mm_box)
+ desc = "Contains a 60-round 4.6x30mm box for PDWs such as the WT-550."
+ contains = list(/obj/item/storage/box/ammo/c46x30mm)
cost = 250
/datum/supply_pack/ammo/c8x50mm_boxcrate
name = "8x50mm Ammo Box Crate"
- desc = "Contains a twenty-round 8x50mm ammo box for rifles such as the Illestren."
- contains = list(/obj/item/ammo_box/c8x50mm_box)
+ desc = "Contains a 30-round 8x50mm ammo box for rifles such as the Illestren."
+ contains = list(/obj/item/storage/box/ammo/a8_50r)
cost = 250
/datum/supply_pack/ammo/c8x50mm_boxhp_boxcrate
name = "8x50mm Hollow Point Crate"
- desc = "Contains a twenty-round 8x50mm ammo box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c8x50mmhp_box)
+ desc = "Contains a 30y-round 8x50mm ammo box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/a8_50r_hp)
cost = 500
/datum/supply_pack/ammo/a300_box
name = ".300 Ammo Box Crate"
desc = "Contains a twenty-round .300 Magnum ammo box for sniper rifles such as the HP Scout."
- contains = list(/obj/item/ammo_box/a300_box)
+ contains = list(/obj/item/storage/box/ammo/a300)
cost = 400
/datum/supply_pack/ammo/a65clip_box
name = "6.5x57mm CLIP Ammo Box Crate"
desc = "Contains a twenty-round 6.5x57mm CLIP ammo box for various sniper rifles such as the CM-F90 and the Boomslang series."
- contains = list(/obj/item/ammo_box/a65clip_box)
+ contains = list(/obj/item/storage/box/ammo/a65clip)
cost = 400
-
/datum/supply_pack/ammo/a4570_box
name = ".45-70 Ammo Box Crate"
- desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition."
- contains = list(/obj/item/ammo_box/a4570)
+ desc = "Contains a 20-round box containing devastatingly powerful .45-70 caliber ammunition."
+ contains = list(/obj/item/storage/box/ammo/a4570)
cost = 500
/datum/supply_pack/ammo/a4570_box/match
name = ".45-70 Match Crate"
- desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets."
- contains = list(/obj/item/ammo_box/a4570/match)
+ desc = "Contains a 20-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets."
+ contains = list(/obj/item/storage/box/ammo/a4570_match)
cost = 750
/datum/supply_pack/ammo/ferropelletboxcrate
name = "Ferromagnetic Pellet Box Crate"
- desc = "Contains a fifty-round ferromagnetic pellet ammo box for gauss guns such as the Claris."
- contains = list(/obj/item/ammo_box/ferropelletbox)
+ desc = "Contains a 48-round ferromagnetic pellet ammo box for gauss guns such as the Claris."
+ contains = list(/obj/item/storage/box/ammo/ferropellet)
cost = 250
/datum/supply_pack/ammo/ferroslugboxcrate
name = "Ferromagnetic Slug Box Crate"
desc = "Contains a twenty-round ferromagnetic slug for gauss guns such as the Model-H."
- contains = list(/obj/item/ammo_box/ferroslugbox)
+ contains = list(/obj/item/storage/box/ammo/ferroslug)
cost = 250
/datum/supply_pack/ammo/ferrolanceboxcrate
name = "Ferromagnetic Lance Box Crate"
- desc = "Contains a fifty-round box for high-powered gauss guns such as the GAR assault rifle."
- contains = list(/obj/item/ammo_box/ferrolancebox)
+ desc = "Contains a 48-round box for high-powered gauss guns such as the GAR assault rifle."
+ contains = list(/obj/item/storage/box/ammo/ferrolance)
cost = 250
/datum/supply_pack/ammo/a44roum
name = ".44 Roumain Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne."
- contains = list(/obj/item/ammo_box/a44roum)
+ desc = "Contains a 48-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne."
+ contains = list(/obj/item/storage/box/ammo/a44roum)
cost = 250
/datum/supply_pack/ammo/a44roum_rubber
name = ".44 Roumain Rubber Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/a44roum/rubber)
+ desc = "Contains a 48-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/a44roum_rubber)
cost = 250
/datum/supply_pack/ammo/a44roum_hp
name = ".44 Roumain Hollow Point Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/a44roum/hp)
+ desc = "Contains a 48-round box of .44 roumain hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/a44roum_hp)
cost = 500
/datum/supply_pack/ammo/c22lr
name = ".22 LR Ammo Box Crate"
- desc = "Contains two 75 round ammo boxes for refilling .22 LR weapons."
- contains = list(/obj/item/ammo_box/c22lr_box,
- /obj/item/ammo_box/c22lr_box)
- crate_name = "ammo crate"
+ desc = "Contains a 60-round ammo box for refilling .22 LR weapons."
+ contains = list(/obj/item/storage/box/ammo/c22lr)
cost = 250
diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm
index 3759dc6d8d11..41401dbce477 100644
--- a/code/modules/cargo/packs/emergency.dm
+++ b/code/modules/cargo/packs/emergency.dm
@@ -24,8 +24,8 @@
name = "Plasmaman Internals Crate"
desc = "Contains two plasmaman belt tanks, for when you just can't bear to refill a normal tank with plasma. Plasma canisters sold separately."
cost = 100
- contains = list(/obj/item/tank/internals/plasmaman/belt,
- /obj/item/tank/internals/plasmaman/belt)
+ contains = list(/obj/item/tank/internals/plasmaman/belt/full,
+ /obj/item/tank/internals/plasmaman/belt/full)
crate_name = "plasmaman internals crate"
/datum/supply_pack/emergency/plasmaman_suit
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index 7ac3668aaf77..6371b5c14f12 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -330,6 +330,8 @@
icon_state = "clip_m10_correspondant"
item_state = "clip_m10_correspondant"
+ supports_variations = VOX_VARIATION
+
/obj/item/clothing/head/helmet/riot/clip
name = "\improper Minutemen riot helmet"
desc = "Designed to protect against close range attacks. Mainly used by the CMM-BARD against hostile xenofauna, it also sees prolific use on some Minutemen member worlds."
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index 8401455bf7d8..b685e0e4b8bb 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -89,11 +89,11 @@
var/loops = rand(1,3)
for(var/i in 1 to loops)
var/ammotype = pick(list(
- /obj/item/ammo_box/c8x50mm_box,
- /obj/item/ammo_box/c45,
- /obj/item/ammo_box/a357_box,
- /obj/item/ammo_box/c45,
- /obj/item/ammo_box/a4570,
+ /obj/item/storage/box/ammo/a8_50r,
+ /obj/item/storage/box/ammo/c45,
+ /obj/item/storage/box/ammo/a357,
+ /obj/item/storage/box/ammo/c45,
+ /obj/item/storage/box/ammo/a4570,
/obj/item/stock_parts/cell/gun/mini))
backpack_contents += ammotype
@@ -220,7 +220,11 @@
l_hand = /obj/item/flamethrower/full/tank
- backpack_contents = list(/obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1,/obj/item/ammo_box/a12g=1,/obj/item/extinguisher=2,/obj/item/radio=1)
+ backpack_contents = list(
+ /obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1, \
+ /obj/item/storage/box/ammo/a12g_slug = 1, \
+ /obj/item/extinguisher = 2, \
+ /obj/item/radio=1)
/datum/outfit/job/frontiersmen/ert/sentry_lmg
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 9a6b10e0444b..6016def705b5 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -12,6 +12,7 @@
idle_power_usage = IDLE_DRAW_MINIMAL
active_power_usage = ACTIVE_DRAW_MINIMAL
circuit = /obj/item/circuitboard/machine/smartfridge
+ integrity_failure = 0.4
var/max_n_of_items = 1500
var/allow_ai_retrieve = FALSE
@@ -40,7 +41,10 @@
. += "The status display reads: This unit can hold a maximum of [max_n_of_items] items."
/obj/machinery/smartfridge/update_icon_state()
- if(machine_stat)
+ if(machine_stat & BROKEN)
+ icon_state = "[initial(icon_state)]-broken"
+ return ..()
+ else if(!powered())
icon_state = "[initial(icon_state)]-off"
return ..()
@@ -53,10 +57,8 @@
icon_state = "[initial(icon_state)]"
if(1 to 25)
icon_state = "[initial(icon_state)]1"
- if(26 to 75)
+ if(26 to INFINITY)
icon_state = "[initial(icon_state)]2"
- if(76 to INFINITY)
- icon_state = "[initial(icon_state)]3"
return ..()
/obj/machinery/smartfridge/update_overlays()
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 406259246db1..4d5a07d4130f 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -232,7 +232,7 @@
new /obj/item/gun/ballistic/automatic/toy/pistol(src)
new /obj/item/gun/ballistic/automatic/toy(src)
new /obj/item/gun/ballistic/automatic/toy(src)
- new /obj/item/ammo_box/foambox(src)
+ new /obj/item/storage/box/ammo/foam_darts(src)
if(98)
for(var/i in 1 to 3)
new /mob/living/simple_animal/hostile/poison/bees/toxin(src)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 60debde823ef..5ead7fcb9296 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -47,10 +47,7 @@
if(15)
new /obj/item/book_of_babel(src)
if(16)
- if(prob(75))
- new /obj/item/guardiancreator/miner(src)
- else
- new /obj/item/guardiancreator/miner/choose (src)
+ new /obj/item/ship_in_a_bottle(src)
if(17)
if(prob(50))
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
@@ -118,10 +115,7 @@
if(15)
new /obj/item/book_of_babel(src)
if(16)
- if(prob(75))
- new /obj/item/guardiancreator/miner(src)
- else
- new /obj/item/guardiancreator/miner/choose (src)
+ new /obj/item/ship_in_a_bottle(src)
if(17)
if(prob(50))
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
index 34d8dd274668..10eb5ae7d6eb 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
@@ -90,29 +90,21 @@
name = "Bowlcut 2"
icon_state = "hair_bowlcut2"
-/datum/sprite_accessory/hair/braid
- name = "Braid (Floorlength)"
- icon_state = "hair_braid"
-
-/datum/sprite_accessory/hair/braided
- name = "Braided"
- icon_state = "hair_braided"
-
-/datum/sprite_accessory/hair/front_braid
- name = "Braided Front"
- icon_state = "hair_braidfront"
-
-/datum/sprite_accessory/hair/not_floorlength_braid
- name = "Braid (High)"
+/datum/sprite_accessory/hair/ponytail_braided
+ name = "Ponytail (Braided)"
icon_state = "hair_braid2"
-/datum/sprite_accessory/hair/lowbraid
- name = "Braid (Low)"
- icon_state = "hair_hbraid"
+/datum/sprite_accessory/hair/ponytail_braided_short
+ name = "Ponytail (Braided Short)"
+ icon_state = "hair_braid"
-/datum/sprite_accessory/hair/shortbraid
- name = "Braid (Short)"
- icon_state = "hair_shortbraid"
+/datum/sprite_accessory/hair/ponytail_straight
+ name = "Ponytail (Straight)"
+ icon_state = "hair_longstraightponytail"
+
+/datum/sprite_accessory/hair/ponytail_straight_short
+ name = "Ponytail (Straight Short)"
+ icon_state = "hair_highponytail"
/datum/sprite_accessory/hair/braidtail
name = "Braided Tail"
@@ -503,12 +495,8 @@
icon_state = "hair_ponytail"
/datum/sprite_accessory/hair/ponytail2
- name = "Ponytail 2"
- icon_state = "hair_ponytail2"
-
-/datum/sprite_accessory/hair/ponytail3
- name = "Ponytail 3"
- icon_state = "hair_ponytail3"
+ name = "Ponytail (Grace)"
+ icon_state = "hair_ponytailgrace"
/datum/sprite_accessory/hair/ponytail4
name = "Ponytail 4"
@@ -526,21 +514,14 @@
name = "Ponytail 7"
icon_state = "hair_ponytail7"
-/datum/sprite_accessory/hair/highponytail
- name = "Ponytail (High)"
- icon_state = "hair_highponytail"
/datum/sprite_accessory/hair/stail
name = "Ponytail (Short)"
icon_state = "hair_stail"
-/datum/sprite_accessory/hair/longponytail
- name = "Ponytail (Long)"
- icon_state = "hair_longstraightponytail"
-
/datum/sprite_accessory/hair/countryponytail
name = "Ponytail (Country)"
- icon_state = "hair_country"
+ icon_state = "hair_ponytailcountry"
/datum/sprite_accessory/hair/fringetail
name = "Ponytail (Fringe)"
@@ -722,6 +703,10 @@
name = "Ruby"
icon_state = "hair_ruby"
+/datum/sprite_accessory/hair/rubylong
+ name = "Ruby (Long)"
+ icon_state = "hair_rubylong"
+
/datum/sprite_accessory/hair/undercut
name = "Undercut"
icon_state = "hair_undercut"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 76800ce87b1f..741dfcc16015 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1147,13 +1147,6 @@
mind.transfer_to(new_mob)
else
new_mob.key = key
-
- for(var/para in hasparasites())
- var/mob/living/simple_animal/hostile/guardian/G = para
- G.summoner = new_mob
- G.Recall()
- to_chat(G, "Your summoner has changed form!")
-
/mob/living/rad_act(amount)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
deleted file mode 100644
index 538a015c163b..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ /dev/null
@@ -1,786 +0,0 @@
-
-GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
-
-#define GUARDIAN_HANDS_LAYER 1
-#define GUARDIAN_TOTAL_LAYERS 1
-
-/mob/living/simple_animal/hostile/guardian
- name = "Guardian Spirit"
- real_name = "Guardian Spirit"
- desc = "A mysterious being that stands by its charge, ever vigilant."
- speak_emote = list("hisses")
- gender = NEUTER
- mob_biotypes = NONE
- bubble_icon = "guardian"
- response_help_continuous = "passes through"
- response_help_simple = "pass through"
- response_disarm_continuous = "flails at"
- response_disarm_simple = "flail at"
- response_harm_continuous = "punches"
- response_harm_simple = "punch"
- icon = 'icons/mob/guardian.dmi'
- icon_state = "magicbase"
- icon_living = "magicbase"
- icon_dead = "magicbase"
- speed = 0
- a_intent = INTENT_HARM
- stop_automated_movement = 1
- movement_type = FLYING // Immunity to chasms and landmines, etc.
- attack_sound = 'sound/weapons/punch1.ogg'
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- maxbodytemp = INFINITY
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- maxHealth = INFINITY //The spirit itself is invincible
- health = INFINITY
- healable = FALSE //don't brusepack the guardian
- damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES
- obj_damage = 40
- melee_damage_lower = 15
- melee_damage_upper = 15
- butcher_results = list(/obj/item/ectoplasm = 1)
- AIStatus = AI_OFF
- light_system = MOVABLE_LIGHT
- light_range = 3
- light_on = FALSE
- hud_type = /datum/hud/guardian
- dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it.
- var/mutable_appearance/cooloverlay
- var/guardiancolor
- var/recolorentiresprite
- var/theme
- var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS]
- var/reset = 0 //if the summoner has reset the guardian already
- var/cooldown = 0
- var/mob/living/summoner
- var/range = 10 //how far from the user the spirit can be
- var/toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses
- var/playstyle_string = "You are a Guardian without any type. You shouldn't exist!"
- var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!"
- var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!"
- var/carp_fluff_string = "CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP"
- var/miner_fluff_string = "You encounter... Mythril, it shouldn't exist... Submit a bug report!"
- var/slime_fluff_string = "The crystal grows and creaks, then glitches terribly! Tell a coder if you've seen this!"
-
-/mob/living/simple_animal/hostile/guardian/Initialize(mapload, theme)
- GLOB.parasites += src
- updatetheme(theme)
- ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)//local flying mob drifts in space, more news at six
- . = ..()
-
-/mob/living/simple_animal/hostile/guardian/med_hud_set_health()
- if(summoner)
- var/image/holder = hud_list[HEALTH_HUD]
- holder.icon_state = "hud[RoundHealth(summoner)]"
-
-/mob/living/simple_animal/hostile/guardian/med_hud_set_status()
- if(summoner)
- var/image/holder = hud_list[STATUS_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- if(summoner.stat == DEAD)
- holder.icon_state = "huddead"
- else
- holder.icon_state = "hudhealthy"
-
-/mob/living/simple_animal/hostile/guardian/Destroy()
- GLOB.parasites -= src
- return ..()
-
-/mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme
- if(!theme)
- theme = pick("magic", "tech", "carp", "miner")
- switch(theme)//should make it easier to create new stand designs in the future if anyone likes that
- if("magic")
- name = "Guardian Spirit"
- real_name = "Guardian Spirit"
- bubble_icon = "guardian"
- icon_state = "magicbase"
- icon_living = "magicbase"
- icon_dead = "magicbase"
- if("tech")
- name = "Holoparasite"
- real_name = "Holoparasite"
- bubble_icon = "holo"
- icon_state = "techbase"
- icon_living = "techbase"
- icon_dead = "techbase"
- if("miner")
- name = "Power Miner"
- real_name = "Power Miner"
- bubble_icon = "guardian"
- icon_state = "minerbase"
- icon_living = "minerbase"
- icon_dead = "minerbase"
- if("carp")
- name = "Holocarp"
- real_name = "Holocarp"
- bubble_icon = "holo"
- icon_state = "holocarp"
- icon_living = "holocarp"
- icon_dead = "holocarp"
- speak_emote = list("gnashes")
- desc = "A mysterious fish that stands by its charge, ever vigilant."
- attack_verb_continuous = "bites"
- attack_verb_simple = "bite"
- attack_sound = 'sound/weapons/bite.ogg'
- recolorentiresprite = TRUE
- if("slime")
- bubble_icon = "guardian"
- icon_state = "slimebase"
- icon_living = "slimebase"
- icon_dead = "slimebase"
- friendly_verb_continuous = "nourishes"
- friendly_verb_simple = "nourish"
- attack_verb_continuous = "glomps"
- attack_verb_simple = "glomp"
- speak_emote = list("blorbles")
- attack_sound = 'sound/effects/blobattack.ogg'
- desc = "A mysterious slime that stands by its charge, ever vigilant."
- attack_sound = 'sound/weapons/bite.ogg'
-
- if(!recolorentiresprite) //we want this to proc before stand logs in, so the overlay isnt gone for some reason
- cooloverlay = mutable_appearance(icon, theme)
- add_overlay(cooloverlay)
-
-/mob/living/simple_animal/hostile/guardian/Login() //if we have a mind, set its name to ours when it logs in
- . = ..()
- if(!. || !client)
- return FALSE
- if(mind)
- mind.name = "[real_name]"
- if(!summoner)
- to_chat(src, "For some reason, somehow, you have no summoner. Please report this bug immediately.")
- return
- to_chat(src, "You are a [real_name], bound to serve [summoner.real_name].")
- to_chat(src, "You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.")
- to_chat(src, "While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.")
- to_chat(src, playstyle_string)
- if(!guardiancolor)
- guardianrename()
- guardianrecolor()
-
-/mob/living/simple_animal/hostile/guardian/proc/guardianrecolor()
- guardiancolor = input(src,"What would you like your color to be?","Choose Your Color","#ffffff") as color|null
- if(!guardiancolor) //redo proc until we get a color
- to_chat(src, "Not a valid color, please try again.")
- guardianrecolor()
- return
- if(!recolorentiresprite)
- cooloverlay.color = guardiancolor
- cut_overlay(cooloverlay) //we need to get our new color
- add_overlay(cooloverlay)
- else
- add_atom_colour(guardiancolor, FIXED_COLOUR_PRIORITY)
-
-/mob/living/simple_animal/hostile/guardian/proc/guardianrename()
- var/new_name = sanitize_name(reject_bad_text(stripped_input(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN)))
- if(!new_name) //redo proc until we get a good name
- to_chat(src, "Not a valid name, please try again.")
- guardianrename()
- return
- visible_message("Your new name [new_name] anchors itself in your mind.")
- fully_replace_character_name(null, new_name)
-
-/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
- . = ..()
- update_health_hud() //we need to update all of our health displays to match our summoner and we can't practically give the summoner a hook to do it
- med_hud_set_health()
- med_hud_set_status()
- if(!QDELETED(summoner))
- if(summoner.stat == DEAD)
- forceMove(summoner.loc)
- to_chat(src, "Your summoner has died!")
- visible_message("\The [src] dies along with its user!")
- summoner.visible_message("[summoner]'s body is completely consumed by the strain of sustaining [src]!")
- for(var/obj/item/W in summoner)
- if(!summoner.dropItemToGround(W))
- qdel(W)
- summoner.dust()
- death(TRUE)
- qdel(src)
- else
- to_chat(src, "Your summoner has died!")
- visible_message("[src] dies along with its user!")
- death(TRUE)
- qdel(src)
- snapback()
-
-/mob/living/simple_animal/hostile/guardian/get_status_tab_items()
- . += ..()
- if(summoner)
- var/resulthealth
- if(iscarbon(summoner))
- resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100)
- else
- resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5)
- . += "Summoner Health: [resulthealth]%"
- if(cooldown >= world.time)
- . += "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]"
-
-/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
- . = ..()
- snapback()
-
-/mob/living/simple_animal/hostile/guardian/proc/snapback()
- if(summoner)
- if(get_dist(get_turf(summoner),get_turf(src)) <= range)
- return
- else
- to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!")
- visible_message("\The [src] jumps back to its user.")
- if(istype(summoner.loc, /obj/effect))
- Recall(TRUE)
- else
- new /obj/effect/temp_visual/guardian/phase/out(loc)
- forceMove(summoner.loc)
- new /obj/effect/temp_visual/guardian/phase(loc)
-
-/mob/living/simple_animal/hostile/guardian/proc/is_deployed()
- return loc != summoner
-
-/mob/living/simple_animal/hostile/guardian/AttackingTarget()
- if(!is_deployed())
- to_chat(src, "You must be manifested to attack!")
- return FALSE
- else
- return ..()
-
-/mob/living/simple_animal/hostile/guardian/death()
- drop_all_held_items()
- ..()
- if(summoner)
- to_chat(summoner, "Your [name] died somehow!")
- summoner.dust()
-
-/mob/living/simple_animal/hostile/guardian/update_health_hud()
- if(summoner && hud_used && hud_used.healths)
- var/resulthealth
- if(iscarbon(summoner))
- resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100)
- else
- resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5)
- hud_used.healths.maptext = "[resulthealth]%
"
-
-/mob/living/simple_animal/hostile/guardian/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //The spirit is invincible, but passes on damage to the summoner
- . = amount
- if(summoner)
- if(loc == summoner)
- return FALSE
- summoner.adjustBruteLoss(amount)
- if(amount > 0)
- to_chat(summoner, "Your [name] is under attack! You take damage!")
- summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!")
- switch(summoner.stat)
- if(UNCONSCIOUS, HARD_CRIT)
- to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!")
- summoner.adjustCloneLoss(amount * 0.5) //dying hosts take 50% bonus damage as cloneloss
- update_health_hud()
-
-/mob/living/simple_animal/hostile/guardian/ex_act(severity, target)
- switch(severity)
- if(1)
- gib()
- return
- if(2)
- adjustBruteLoss(60)
- if(3)
- adjustBruteLoss(30)
-
-/mob/living/simple_animal/hostile/guardian/gib()
- if(summoner)
- to_chat(summoner, "Your [src] was blown up!")
- summoner.gib()
- ghostize()
- qdel(src)
-
-//HAND HANDLING
-
-/mob/living/simple_animal/hostile/guardian/equip_to_slot(obj/item/I, slot)
- if(!slot)
- return FALSE
- if(!istype(I))
- return FALSE
-
- . = TRUE
- var/index = get_held_index_of_item(I)
- if(index)
- held_items[index] = null
- update_inv_hands()
-
- if(I.pulledby)
- I.pulledby.stop_pulling()
-
- I.screen_loc = null // will get moved if inventory is visible
- I.forceMove(src)
- I.equipped(src, slot)
- I.layer = ABOVE_HUD_LAYER
- I.plane = ABOVE_HUD_PLANE
-
-/mob/living/simple_animal/hostile/guardian/proc/apply_overlay(cache_index)
- if((. = guardian_overlays[cache_index]))
- add_overlay(.)
-
-/mob/living/simple_animal/hostile/guardian/proc/remove_overlay(cache_index)
- var/I = guardian_overlays[cache_index]
- if(I)
- cut_overlay(I)
- guardian_overlays[cache_index] = null
-
-/mob/living/simple_animal/hostile/guardian/update_inv_hands()
- remove_overlay(GUARDIAN_HANDS_LAYER)
- var/list/hands_overlays = list()
- var/obj/item/l_hand = get_item_for_held_index(1)
- var/obj/item/r_hand = get_item_for_held_index(2)
-
- if(r_hand)
- hands_overlays += r_hand.build_worn_icon(default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
-
- if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
- r_hand.layer = ABOVE_HUD_LAYER
- r_hand.plane = ABOVE_HUD_PLANE
- r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand))
- client.screen |= r_hand
-
- if(l_hand)
- hands_overlays += l_hand.build_worn_icon(default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
-
- if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
- l_hand.layer = ABOVE_HUD_LAYER
- l_hand.plane = ABOVE_HUD_PLANE
- l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand))
- client.screen |= l_hand
-
- if(hands_overlays.len)
- guardian_overlays[GUARDIAN_HANDS_LAYER] = hands_overlays
- apply_overlay(GUARDIAN_HANDS_LAYER)
-
-/mob/living/simple_animal/hostile/guardian/regenerate_icons()
- update_inv_hands()
-
-//MANIFEST, RECALL, TOGGLE MODE/LIGHT, SHOW TYPE
-
-/mob/living/simple_animal/hostile/guardian/proc/Manifest(forced)
- if(istype(summoner.loc, /obj/effect) || (cooldown > world.time && !forced))
- return FALSE
- if(loc == summoner)
- forceMove(summoner.loc)
- new /obj/effect/temp_visual/guardian/phase(loc)
- cooldown = world.time + 10
- reset_perspective()
- return TRUE
- return FALSE
-
-/mob/living/simple_animal/hostile/guardian/proc/Recall(forced)
- if(!summoner || loc == summoner || (cooldown > world.time && !forced))
- return FALSE
- new /obj/effect/temp_visual/guardian/phase/out(loc)
-
- forceMove(summoner)
- cooldown = world.time + 10
- return TRUE
-
-/mob/living/simple_animal/hostile/guardian/proc/ToggleMode()
- to_chat(src, "You don't have another mode!")
-
-
-/mob/living/simple_animal/hostile/guardian/proc/ToggleLight()
- if(!light_on)
- to_chat(src, "You activate your light.")
- set_light_on(TRUE)
- else
- to_chat(src, "You deactivate your light.")
- set_light_on(FALSE)
-
-
-/mob/living/simple_animal/hostile/guardian/verb/ShowType()
- set name = "Check Guardian Type"
- set category = "Guardian"
- set desc = "Check what type you are."
- to_chat(src, playstyle_string)
-
-//COMMUNICATION
-
-/mob/living/simple_animal/hostile/guardian/proc/Communicate()
- if(summoner)
- var/sender_key = key
- var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
- if(sender_key != key || !input) //guardian got reset, or did not enter anything
- return
-
- var/preliminary_message = "[input]" //apply basic color/bolding
- var/my_message = "[src]: [preliminary_message]" //add source, color source with the guardian's color
-
- to_chat(summoner, my_message)
- var/list/guardians = summoner.hasparasites()
- for(var/para in guardians)
- to_chat(para, my_message)
- for(var/M in GLOB.dead_mob_list)
- var/link = FOLLOW_LINK(M, src)
- to_chat(M, "[link] [my_message]")
-
- src.log_talk(input, LOG_SAY, tag="guardian")
-
-/mob/living/proc/guardian_comm()
- set name = "Communicate"
- set category = "Guardian"
- set desc = "Communicate telepathically with your guardian."
- var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
- if(!input)
- return
-
- var/preliminary_message = "[input]" //apply basic color/bolding
- var/my_message = "[src]: [preliminary_message]" //add source, color source with default grey...
-
- to_chat(src, my_message)
- var/list/guardians = hasparasites()
- for(var/para in guardians)
- var/mob/living/simple_animal/hostile/guardian/G = para
- to_chat(G, "[src]: [preliminary_message]" )
- for(var/M in GLOB.dead_mob_list)
- var/link = FOLLOW_LINK(M, src)
- to_chat(M, "[link] [my_message]")
-
- src.log_talk(input, LOG_SAY, tag="guardian")
-
-//FORCE RECALL/RESET
-
-/mob/living/proc/guardian_recall()
- set name = "Recall Guardian"
- set category = "Guardian"
- set desc = "Forcibly recall your guardian."
- var/list/guardians = hasparasites()
- for(var/para in guardians)
- var/mob/living/simple_animal/hostile/guardian/G = para
- G.Recall()
-
-/mob/living/proc/guardian_reset()
- set name = "Reset Guardian Player (One Use)"
- set category = "Guardian"
- set desc = "Re-rolls which ghost will control your Guardian. One use per Guardian."
-
- var/list/guardians = hasparasites()
- for(var/para in guardians)
- var/mob/living/simple_animal/hostile/guardian/P = para
- if(P.reset)
- guardians -= P //clear out guardians that are already reset
- if(guardians.len)
- var/mob/living/simple_animal/hostile/guardian/G = input(src, "Pick the guardian you wish to reset", "Guardian Reset") as null|anything in sortNames(guardians)
- if(G)
- to_chat(src, "You attempt to reset [G.real_name]'s personality...")
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100)
- if(LAZYLEN(candidates))
- var/mob/dead/observer/C = pick(candidates)
- to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.")
- to_chat(src, "Your [G.real_name] has been successfully reset.")
- message_admins("[key_name_admin(C)] has taken control of ([ADMIN_LOOKUPFLW(G)])")
- G.ghostize(0)
- G.guardianrecolor()
- G.guardianrename() //give it a new color and name, to show it's a new person
- G.key = C.key
- G.reset = 1
- switch(G.theme)
- if("tech")
- to_chat(src, "[G.real_name] is now online!")
- if("magic")
- to_chat(src, "[G.real_name] has been summoned!")
- if("carp")
- to_chat(src, "[G.real_name] has been caught!")
- if("miner")
- to_chat(src, "[G.real_name] has appeared!")
- if("slime")
- to_chat(src, "[G.real_name] has taken shape!")
- guardians -= G
- if(!guardians.len)
- remove_verb(src, /mob/living/proc/guardian_reset)
- else
- to_chat(src, "There were no ghosts willing to take control of [G.real_name]. Looks like you're stuck with it for now.")
- else
- to_chat(src, "You decide not to reset [guardians.len > 1 ? "any of your guardians":"your guardian"].")
- else
- remove_verb(src, /mob/living/proc/guardian_reset)
-
-////////parasite tracking/finding procs
-
-/mob/living/proc/hasparasites() //returns a list of guardians the mob is a summoner for
- . = list()
- for(var/P in GLOB.parasites)
- var/mob/living/simple_animal/hostile/guardian/G = P
- if(G.summoner == src)
- . += G
-
-/mob/living/simple_animal/hostile/guardian/proc/hasmatchingsummoner(mob/living/simple_animal/hostile/guardian/G) //returns 1 if the summoner matches the target's summoner
- return (istype(G) && G.summoner == summoner)
-
-
-////////Creation
-
-/obj/item/guardiancreator
- name = "enchanted deck of tarot cards"
- desc = "An enchanted deck of tarot cards, rumored to be a source of unimaginable power."
- icon = 'icons/obj/toy.dmi'
- icon_state = "deck_tarot_full"
- var/used = FALSE
- var/theme = "magic"
- var/mob_name = "Guardian Spirit"
- var/use_message = "You shuffle the deck..."
- var/used_message = "All the cards seem to be blank now."
- var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later."
- var/ling_failure = "The deck refuses to respond to a souless creature such as you."
- var/list/possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support", "Gravitokinetic")
- var/random = TRUE
- var/allowmultiple = FALSE
- var/allowling = TRUE
- var/allowguardian = FALSE
-
-/obj/item/guardiancreator/attack_self(mob/living/user)
- if(isguardian(user) && !allowguardian)
- to_chat(user, "[mob_name] chains are not allowed.")
- return
- var/list/guardians = user.hasparasites()
- if(guardians.len && !allowmultiple)
- to_chat(user, "You already have a [mob_name]!")
- return
- if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling) && !allowling)
- to_chat(user, "[ling_failure]")
- return
- if(used == TRUE)
- to_chat(user, "[used_message]")
- return
- used = TRUE
- to_chat(user, "[use_message]")
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE)
-
- if(LAZYLEN(candidates))
- var/mob/dead/observer/C = pick(candidates)
- spawn_guardian(user, C.key)
- else
- to_chat(user, "[failure_message]")
- used = FALSE
-
-
-/obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, key)
- var/guardiantype = "Standard"
- if(random)
- guardiantype = pick(possible_guardians)
- else
- guardiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in sortList(possible_guardians)
- if(!guardiantype)
- to_chat(user, "[failure_message]" )
- used = FALSE
- return
- var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
- switch(guardiantype)
-
- if("Chaos")
- pickedtype = /mob/living/simple_animal/hostile/guardian/fire
-
- if("Standard")
- pickedtype = /mob/living/simple_animal/hostile/guardian/punch
-
- if("Ranged")
- pickedtype = /mob/living/simple_animal/hostile/guardian/ranged
-
- if("Support")
- pickedtype = /mob/living/simple_animal/hostile/guardian/healer
-
- if("Explosive")
- pickedtype = /mob/living/simple_animal/hostile/guardian/bomb
-
- if("Lightning")
- pickedtype = /mob/living/simple_animal/hostile/guardian/beam
-
- if("Protector")
- pickedtype = /mob/living/simple_animal/hostile/guardian/protector
-
- if("Charger")
- pickedtype = /mob/living/simple_animal/hostile/guardian/charger
-
- if("Assassin")
- pickedtype = /mob/living/simple_animal/hostile/guardian/assassin
-
- if("Dextrous")
- pickedtype = /mob/living/simple_animal/hostile/guardian/dextrous
-
- if("Gravitokinetic")
- pickedtype = /mob/living/simple_animal/hostile/guardian/gravitokinetic
-
- if("Slime")
- pickedtype = /mob/living/simple_animal/hostile/guardian/slime
-
- var/list/guardians = user.hasparasites()
- if(guardians.len && !allowmultiple)
- to_chat(user, "You already have a [mob_name]!" )
- used = FALSE
- return
- var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user, theme)
- G.name = mob_name
- G.summoner = user
- G.key = key
- G.mind.enslave_mind_to_creator(user)
- log_game("[key_name(user)] has summoned [key_name(G)], a [guardiantype] holoparasite.")
- switch(theme)
- if("tech")
- to_chat(user, "[G.tech_fluff_string]")
- to_chat(user, "[G.real_name] is now online!")
- if("magic")
- to_chat(user, "[G.magic_fluff_string]")
- to_chat(user, "[G.real_name] has been summoned!")
- if("carp")
- to_chat(user, "[G.carp_fluff_string]")
- to_chat(user, "[G.real_name] has been caught!")
- if("miner")
- to_chat(user, "[G.miner_fluff_string]")
- to_chat(user, "[G.real_name] has appeared!")
- if("slime")
- to_chat(user, "[G.slime_fluff_string]")
- to_chat(user, "[G.real_name] was created using slime science!")
- add_verb(user, list(/mob/living/proc/guardian_comm, \
- /mob/living/proc/guardian_recall, \
- /mob/living/proc/guardian_reset))
- G?.client.init_verbs()
-
-/obj/item/guardiancreator/choose
- random = FALSE
-
-/obj/item/guardiancreator/choose/dextrous
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
-
-/obj/item/guardiancreator/choose/wizard
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard",)
- allowmultiple = TRUE
-
-/obj/item/guardiancreator/tech
- name = "holoparasite injector"
- desc = "It contains an alien nanoswarm of unknown origin. Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, it requires an organic host as a home base and source of fuel."
- icon = 'icons/obj/syringe.dmi'
- icon_state = "combat_hypo"
- theme = "tech"
- mob_name = "Holoparasite"
- use_message = "You start to power on the injector..."
- used_message = "The injector has already been used."
- failure_message = "...ERROR. BOOT SEQUENCE ABORTED. AI FAILED TO INTIALIZE. PLEASE CONTACT SUPPORT OR TRY AGAIN LATER."
- ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you."
-
-/obj/item/guardiancreator/tech/choose/traitor
- possible_guardians = list("Assassin", "Chaos", "Charger", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
- allowling = FALSE
-
-/obj/item/guardiancreator/tech/choose
- random = FALSE
-
-/obj/item/guardiancreator/tech/choose/dextrous
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")//"Gravokinetic" to re-add guardians to lists like this one
-
-/obj/item/paper/guides/antag/guardian
- name = "Holoparasite Guide"
- default_raw_text = {"A list of Holoparasite Types
-
-
-Assassin: Does medium damage and takes full damage, but can enter stealth, causing its next attack to do massive damage and ignore armor. However, it becomes briefly unable to recall after attacking from stealth.
-
-Chaos: Ignites enemies on touch and causes them to hallucinate all nearby people as the parasite. Automatically extinguishes the user if they catch on fire.
-
-Charger: Moves extremely fast, does medium damage on attack, and can charge at targets, damaging the first target hit and forcing them to drop any items they are holding.
-
-Dexterous: Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item.
-
-Explosive: High damage resist and medium power attack that may explosively teleport targets. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay.
-
-Lightning: Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage.
-
-Protector: Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower.
-
-Ranged: Has two modes. Ranged; which fires a constant stream of weak, armor-ignoring projectiles. Scout; Cannot attack, but can move through walls and is quite hard to see. Can lay surveillance snares, which alert it when crossed, in either mode.
-
-Standard: Devastating close combat attacks and high damage resist. Can smash through weak walls.
-
-Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
-
-"}
-
-/obj/item/paper/guides/antag/guardian/wizard
- name = "Guardian Guide"
- default_raw_text = {"A list of Guardian Types
-
-
-Assassin: Does medium damage and takes full damage, but can enter stealth, causing its next attack to do massive damage and ignore armor. However, it becomes briefly unable to recall after attacking from stealth.
-
-Chaos: Ignites enemies on touch and causes them to hallucinate all nearby people as the guardian. Automatically extinguishes the user if they catch on fire.
-
-Charger: Moves extremely fast, does medium damage on attack, and can charge at targets, damaging the first target hit and forcing them to drop any items they are holding.
-
-Dexterous: Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item.
-
-Explosive: High damage resist and medium power attack that may explosively teleport targets. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay.
-
-Lightning: Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage.
-
-Protector: Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower.
-
-Ranged: Has two modes. Ranged; which fires a constant stream of weak, armor-ignoring projectiles. Scout; Cannot attack, but can move through walls and is quite hard to see. Can lay surveillance snares, which alert it when crossed, in either mode.
-
-Standard: Devastating close combat attacks and high damage resist. Can smash through weak walls.
-
-Gravitokinetic: Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user.
-
-"}
-
-
-/obj/item/storage/box/syndie_kit/guardian
- name = "holoparasite injector kit"
-
-/obj/item/storage/box/syndie_kit/guardian/PopulateContents()
- new /obj/item/guardiancreator/tech/choose/dextrous(src) //WS Edit - Dextrous Guardians
- new /obj/item/paper/guides/antag/guardian(src)
-
-/obj/item/guardiancreator/carp
- name = "holocarp fishsticks"
- desc = "Using the power of Carp'sie, you can catch a carp from byond the veil of Carpthulu, and bind it to your fleshy flesh form."
- icon = 'icons/obj/food/food.dmi'
- icon_state = "fishfingers"
- theme = "carp"
- mob_name = "Holocarp"
- use_message = "You put the fishsticks in your mouth..."
- used_message = "Someone's already taken a bite out of these fishsticks! Ew."
- failure_message = "You couldn't catch any carp spirits from the seas of Lake Carp. Maybe there are none, maybe you fucked up."
- ling_failure = "Carp'sie seems to not have taken you as the chosen one. Maybe it's because of your horrifying origin."
- allowmultiple = TRUE
-
-/obj/item/guardiancreator/carp/choose
- random = FALSE
-
-/obj/item/guardiancreator/miner
- name = "dusty shard"
- desc = "Seems to be a very old rock, may have originated from a strange meteor."
- icon = 'icons/obj/lavaland/artefacts.dmi'
- icon_state = "dustyshard"
- theme = "miner"
- mob_name = "Power Miner"
- use_message = "You pierce your skin with the shard..."
- used_message = "This shard seems to have lost all its' power..."
- failure_message = "The shard hasn't reacted at all. Maybe try again later..."
- ling_failure = "The power of the shard seems to not react with your horrifying, mutated body."
-
-/obj/item/guardiancreator/miner/choose
- random = FALSE
- name = "glimmering shard"
- desc = "Seems to be a very old rock, may have originated from a strange meteor. This one looks exceptionally pure."
- possible_guardians = list("Assassin", "Chaos", "Charger", "Dextrous", "Explosive", "Lightning", "Protector", "Ranged", "Standard", "Support")
- allowmultiple = TRUE//if you *somehow* get the extremely rare minerchoose guardian(25% chance to spawn, for an item in a table of around 30 options) while you already have a guardian, you can stack it. The ultimate gambling.
-
-/obj/item/guardiancreator/slime
- name = "slime shard"
- desc = "A shard of crystallized slime."
- icon = 'icons/obj/lavaland/artefacts.dmi'
- icon_state = "dustyshard"
- color = "#00ff15"
- theme = "slime"
- mob_name = "Standing Slime"
- use_message = "You squeeze the shard inhand, and it grows warm..."
- used_message = "You squeeze the shard, but nothing happens. Maybe it's been used already."
- failure_message = "The shard grows cold. Maybe try again later?"
- ling_failure = "The shard seems to quiver and twist away from you."
- possible_guardians = list("Slime")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
deleted file mode 100644
index 7cfed9d167db..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ /dev/null
@@ -1,101 +0,0 @@
-//Assassin
-/mob/living/simple_animal/hostile/guardian/assassin
- melee_damage_lower = 15
- melee_damage_upper = 15
- attack_verb_continuous = "slashes"
- attack_verb_simple = "slash"
- attack_sound = 'sound/weapons/bladeslice.ogg'
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
- playstyle_string = "As an assassin type you do medium damage and have no damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage."
- magic_fluff_string = "..And draw the Space Ninja, a lethal, invisible assassin."
- tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space."
- miner_fluff_string = "You encounter... Glass, a sharp, fragile attacker."
- toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Assassin
- var/toggle = FALSE
- var/stealthcooldown = 100
- var/atom/movable/screen/alert/canstealthalert
- var/atom/movable/screen/alert/instealthalert
- speed = -1
-
-/mob/living/simple_animal/hostile/guardian/assassin/Initialize()
- . = ..()
- stealthcooldown = 0
-
-/mob/living/simple_animal/hostile/guardian/assassin/Life()
- . = ..()
- updatestealthalert()
- if(loc == summoner && toggle)
- ToggleMode(0)
-
-/mob/living/simple_animal/hostile/guardian/assassin/get_status_tab_items()
- . = ..()
- if(stealthcooldown >= world.time)
- . += "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]"
-
-/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
- . = ..()
- if(.)
- if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
- ToggleMode(1)
-
-/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0 && toggle)
- ToggleMode(1)
-
-/mob/living/simple_animal/hostile/guardian/assassin/Recall()
- if(..() && toggle)
- ToggleMode(0)
-
-/mob/living/simple_animal/hostile/guardian/assassin/ToggleMode(forced = 0)
- if(toggle)
- melee_damage_lower = initial(melee_damage_lower)
- melee_damage_upper = initial(melee_damage_upper)
- armour_penetration = initial(armour_penetration)
- obj_damage = initial(obj_damage)
- environment_smash = initial(environment_smash)
- alpha = initial(alpha)
- if(!forced)
- to_chat(src, "You exit stealth.")
- else
- visible_message("\The [src] suddenly appears!")
- stealthcooldown = world.time + initial(stealthcooldown) //we were forced out of stealth and go on cooldown
- cooldown = world.time + 40 //can't recall for 4 seconds
- updatestealthalert()
- toggle = FALSE
- else if(stealthcooldown <= world.time)
- if(src.loc == summoner)
- to_chat(src, "You have to be manifested to enter stealth!")
- return
- melee_damage_lower = 50
- melee_damage_upper = 50
- armour_penetration = 100
- obj_damage = 0
- environment_smash = ENVIRONMENT_SMASH_NONE
- new /obj/effect/temp_visual/guardian/phase/out(get_turf(src))
- alpha = 20
- if(!forced)
- to_chat(src, "You enter stealth, empowering your next attack.")
- updatestealthalert()
- toggle = TRUE
- else if(!forced)
- to_chat(src, "You cannot yet enter stealth, wait another [DisplayTimeText(stealthcooldown - world.time)]!")
-
-/mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert()
- if(stealthcooldown <= world.time)
- if(toggle)
- if(!instealthalert)
- instealthalert = throw_alert("instealth", /atom/movable/screen/alert/instealth)
- clear_alert("canstealth")
- canstealthalert = null
- else
- if(!canstealthalert)
- canstealthalert = throw_alert("canstealth", /atom/movable/screen/alert/canstealth)
- clear_alert("instealth")
- instealthalert = null
- else
- clear_alert("instealth")
- instealthalert = null
- clear_alert("canstealth")
- canstealthalert = null
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
deleted file mode 100644
index 7ebd3c8b3cca..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-//Charger
-/mob/living/simple_animal/hostile/guardian/charger
- melee_damage_lower = 15
- melee_damage_upper = 15
- ranged = 1 //technically
- ranged_message = "charges"
- ranged_cooldown_time = 10
- speed = 2//slow when not charging
- damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6)
- playstyle_string = "As a charger type you are a formidable close range fighter, but move slowly when not charging. You can charge at a location, damaging any target hit and potentially knocking them flat."
- magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault."
- tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..."
- miner_fluff_string = "You encounter... Titanium, a lightweight, agile fighter."
- var/charging = 0
- var/atom/movable/screen/alert/chargealert
-
-/mob/living/simple_animal/hostile/guardian/charger/Life()
- . = ..()
- if(ranged_cooldown <= world.time)
- if(!chargealert)
- chargealert = throw_alert("charge", /atom/movable/screen/alert/cancharge)
- else
- clear_alert("charge")
- chargealert = null
-
-/mob/living/simple_animal/hostile/guardian/charger/OpenFire(atom/A)
- if(!charging)
- visible_message("[src] [ranged_message] at [A]!")
- ranged_cooldown = world.time + ranged_cooldown_time
- clear_alert("charge")
- chargealert = null
- Shoot(A)
-
-/mob/living/simple_animal/hostile/guardian/charger/Shoot(atom/targeted_atom)
- charging = 1
- throw_at(targeted_atom, range, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(charging_end)))
-
-/mob/living/simple_animal/hostile/guardian/charger/proc/charging_end()
- charging = 0
-
-/mob/living/simple_animal/hostile/guardian/charger/Move()
- if(charging)
- new /obj/effect/temp_visual/decoy/fading(loc,src)
- . = ..()
-
-/mob/living/simple_animal/hostile/guardian/charger/snapback()
- if(!charging)
- ..()
-
-/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(!charging)
- return ..()
-
- else if(hit_atom)
- if(isliving(hit_atom) && hit_atom != summoner)
- var/mob/living/L = hit_atom
- var/blocked = FALSE
- if(hasmatchingsummoner(hit_atom)) //if the summoner matches don't hurt them
- blocked = TRUE
- if(ishuman(hit_atom))
- var/mob/living/carbon/human/H = hit_atom
- if(H.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK))
- blocked = TRUE
- if(!blocked)
- L.visible_message("[src] slams into [L]!", "[src] slams into you!")
- if(prob(25))
- L.drop_all_held_items()
- L.Knockdown(10)
- L.visible_message("[L] is knocked clean over!", "You are flung to the ground by the impact!")
- L.apply_damage(30, BRUTE)
- playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, TRUE)
- shake_camera(L, 4, 3)
- shake_camera(src, 2, 3)
-
- charging = 0
-
diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm
deleted file mode 100644
index 48fb3db7b7bd..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm
+++ /dev/null
@@ -1,85 +0,0 @@
-//Dextrous
-/mob/living/simple_animal/hostile/guardian/dextrous//very few buffs needed, this is arguably the most "powerful" holoparasite for the reason that is: GUN.
- melee_damage_lower = 10
- melee_damage_upper = 10
- damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75)
- playstyle_string = "As a dextrous type you can hold items, store an item within yourself, and have medium damage resistance, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!"
- magic_fluff_string = "..And draw the Drone, a dextrous master of construction and repair."
- tech_fluff_string = "Boot sequence complete. Dextrous combat modules loaded. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! You caught one! It can hold stuff in its fins, sort of."
- miner_fluff_string = "You encounter... Gold, a malleable constructor."
- dextrous = TRUE
- held_items = list(null, null)
- var/obj/item/internal_storage //what we're storing within ourself
-
-/mob/living/simple_animal/hostile/guardian/dextrous/death(gibbed)
- ..()
- if(internal_storage)
- dropItemToGround(internal_storage)
-
-/mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user)
- if(dextrous)
- . = list("This is [icon2html(src)] \a [src]!\n[desc]")
- for(var/obj/item/I in held_items)
- if(!(I.item_flags & ABSTRACT))
- . += "It has [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
- if(internal_storage && !(internal_storage.item_flags & ABSTRACT))
- . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage."
- . += ""
- else
- return ..()
-
-/mob/living/simple_animal/hostile/guardian/dextrous/Recall(forced)
- if(!summoner || loc == summoner || (cooldown > world.time && !forced))
- return FALSE
- drop_all_held_items()
- return ..() //lose items, then return
-
-/mob/living/simple_animal/hostile/guardian/dextrous/snapback()
- if(summoner && !(get_dist(get_turf(summoner),get_turf(src)) <= range))
- drop_all_held_items()
- ..() //lose items, then return
-
-//SLOT HANDLING BULLSHIT FOR INTERNAL STORAGE
-/mob/living/simple_animal/hostile/guardian/dextrous/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
- if(..())
- update_inv_hands()
- if(I == internal_storage)
- internal_storage = null
- update_inv_internal_storage()
- return TRUE
- return FALSE
-
-/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
- switch(slot)
- if(ITEM_SLOT_DEX_STORAGE)
- if(internal_storage)
- return FALSE
- return TRUE
- ..()
-
-/mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/I, slot)
- if(!..())
- return
-
- switch(slot)
- if(ITEM_SLOT_DEX_STORAGE)
- internal_storage = I
- update_inv_internal_storage()
- else
- to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")
-
-/mob/living/simple_animal/hostile/guardian/dextrous/getBackSlot()
- return ITEM_SLOT_DEX_STORAGE
-
-/mob/living/simple_animal/hostile/guardian/dextrous/getBeltSlot()
- return ITEM_SLOT_DEX_STORAGE
-
-/mob/living/simple_animal/hostile/guardian/dextrous/proc/update_inv_internal_storage()
- if(internal_storage && client && hud_used && hud_used.hud_shown)
- internal_storage.screen_loc = ui_id
- client.screen += internal_storage
-
-/mob/living/simple_animal/hostile/guardian/dextrous/regenerate_icons()
- ..()
- update_inv_internal_storage()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
deleted file mode 100644
index f93f70d8ffb3..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-#define UNREGISTER_BOMB_SIGNALS(A) \
- do { \
- UnregisterSignal(A, boom_signals); \
- UnregisterSignal(A, COMSIG_PARENT_EXAMINE); \
- } while (0)
-
-//Bomb
-/mob/living/simple_animal/hostile/guardian/bomb
- melee_damage_lower = 35
- melee_damage_upper = 35
- next_move_modifier = 1.5//attacks are 50% slower
- damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6)//relatively delicate, for a holopara
- attack_sound = 'sound/effects/gravhit.ogg'
- range = 5//tiny range
- speed = 4//slow af
- playstyle_string = "As an explosive type, you have powerful but slow blasting punches, may explode targets for bonus damage on attack, and are capable of converting nearby items and objects into disguised bombs via alt click. However, you are slow, and your range is very low. Make it count!"
- magic_fluff_string = "..And draw the Scientist, master of explosive death."
- tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! Caught one! It's an explosive carp! Boom goes the fishy."
- miner_fluff_string = "You encounter... Gibtonite, an explosive fighter."
- var/bomb_cooldown = 0
- var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND)
-
-/mob/living/simple_animal/hostile/guardian/bomb/get_status_tab_items()
- . = ..()
- if(bomb_cooldown >= world.time)
- . += "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]"
-
-/mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget()
- . = ..()
- if(. && prob(65) && isliving(target))
- var/mob/living/M = target
- if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
- new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
- for(var/mob/living/L in range(1, M))
- if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
- continue
- if(L != src && L != summoner)
- L.apply_damage(20, BRUTE)
- new /obj/effect/temp_visual/explosion(get_turf(M))
-
-/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
- if(!istype(A))
- return
- if(loc == summoner)
- to_chat(src, "You must be manifested to create bombs!")
- return
- if(isobj(A) && Adjacent(A))
- if(bomb_cooldown <= world.time && !stat)
- to_chat(src, "Success! Bomb armed!")
- bomb_cooldown = world.time + 200
- RegisterSignal(A, COMSIG_PARENT_EXAMINE, PROC_REF(display_examine))
- RegisterSignal(A, boom_signals, PROC_REF(kaboom))
- addtimer(CALLBACK(src, PROC_REF(disable), A), 600, TIMER_UNIQUE|TIMER_OVERRIDE)
- else
- to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.")
-
-/mob/living/simple_animal/hostile/guardian/bomb/proc/kaboom(atom/source, mob/living/explodee)
- if(!istype(explodee))
- return
- if(explodee == src || explodee == summoner || hasmatchingsummoner(explodee))
- return
- to_chat(explodee, "[source] was boobytrapped!")
- to_chat(src, "Success! Your trap caught [explodee]")
- var/turf/T = get_turf(source)
- playsound(T,'sound/effects/explosion2.ogg', 200, TRUE)
- new /obj/effect/temp_visual/explosion(T)
- explodee.ex_act(EXPLODE_HEAVY)
- UNREGISTER_BOMB_SIGNALS(source)
-
-/mob/living/simple_animal/hostile/guardian/bomb/proc/disable(atom/A)
- to_chat(src, "Failure! Your trap didn't catch anyone this time.")
- UNREGISTER_BOMB_SIGNALS(A)
-
-/mob/living/simple_animal/hostile/guardian/bomb/proc/display_examine(datum/source, mob/user, text)
- text += "It glows with a strange light!"
-
-#undef UNREGISTER_BOMB_SIGNALS
diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
deleted file mode 100644
index 2d7a34a8bbf8..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-//Fire
-/mob/living/simple_animal/hostile/guardian/fire
- a_intent = INTENT_HELP
- melee_damage_lower = 7
- melee_damage_upper = 7
- attack_sound = 'sound/items/welder.ogg'
- attack_verb_continuous = "ignites"
- attack_verb_simple = "ignite"
- damage_coeff = list(BRUTE = 0.6, BURN = 0.4, TOX = 0.6, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- range = 7
- playstyle_string = "As a chaos type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, your melee attacks will cause human targets to see everyone as you, and will cook simple animals from the inside, doing bonus damage."
- magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!"
- tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish."
- miner_fluff_string = "You encounter... Plasma, the bringer of fire."
-
-/mob/living/simple_animal/hostile/guardian/fire/Life()
- . = ..()
- if(summoner)
- summoner.ExtinguishMob()
- summoner.adjust_fire_stacks(-20)
-
-/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
- . = ..()
- if(. && ishuman(target) && target != summoner)
- new /datum/hallucination/delusion(target,TRUE,"custom",200,0, icon_state,icon)
- melee_damage_lower = 7
- melee_damage_upper = 7
- if(. && isanimal(target) && target != summoner)
- melee_damage_lower = 40
- melee_damage_upper = 40
-
-/mob/living/simple_animal/hostile/guardian/fire/on_entered(datum/source, AM as mob|obj)
- . = ..()
- collision_ignite(AM)
-
-/mob/living/simple_animal/hostile/guardian/fire/Bumped(atom/movable/AM)
- ..()
- collision_ignite(AM)
-
-/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
- ..()
- collision_ignite(AM)
-
-/mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj)
- if(isliving(AM))
- var/mob/living/M = AM
- if(!hasmatchingsummoner(M) && M != summoner && M.fire_stacks < 7)
- M.fire_stacks = 7
- M.IgniteMob()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
deleted file mode 100644
index a86e38db7772..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-//gravitokinetic
-/mob/living/simple_animal/hostile/guardian/gravitokinetic
- melee_damage_lower = 15
- melee_damage_upper = 15
- damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75)
- playstyle_string = "As a gravitokinetic type, you can alt click to make the gravity on the ground stronger, and punching applies this effect to a target."
- magic_fluff_string = "..And draw the Singularity, an anomalous force of terror."
- tech_fluff_string = "Boot sequence complete. Gravitokinetic modules loaded. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?"
- miner_fluff_string = "You encounter... Bananium, a master of gravity business."
- var/list/gravito_targets = list()
- var/gravity_power_range = 10 //how close the stand must stay to the target to keep the heavy gravity
-
-///Removes gravity from affected mobs upon guardian death to prevent permanent effects
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/death()
- . = ..()
- for(var/i in gravito_targets)
- remove_gravity(i)
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/AttackingTarget()
- . = ..()
- if(isliving(target) && target != src)
- to_chat(src, "Your punch has applied heavy gravity to [target]!")
- add_gravity(target, 2)
- to_chat(target, "Everything feels really heavy!")
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/AltClickOn(atom/A)
- if(isopenturf(A) && is_deployed() && stat != DEAD && in_range(src, A) && !incapacitated())
- var/turf/T = A
- if(isspaceturf(T))
- to_chat(src, "You cannot add gravity to space!")
- return
- visible_message("[src] slams their fist into the [T]!", "You modify the gravity of the [T].")
- do_attack_animation(T)
- add_gravity(T, 4)
- return
- return ..()
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/Recall(forced)
- . = ..()
- to_chat(src, "You have released your gravitokinetic powers!")
- for(var/i in gravito_targets)
- remove_gravity(i)
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/Moved(oldLoc, dir)
- . = ..()
- for(var/i in gravito_targets)
- if(get_dist(src, i) > gravity_power_range)
- remove_gravity(i)
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/add_gravity(atom/A, new_gravity = 2)
- if(gravito_targets[A])
- return
- A.AddElement(/datum/element/forced_gravity, new_gravity)
- gravito_targets[A] = new_gravity
- RegisterSignal(A, COMSIG_MOVABLE_MOVED, PROC_REF(__distance_check))
- playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE)
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/remove_gravity(atom/target)
- if(isnull(gravito_targets[target]))
- return
- UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
- target.RemoveElement(/datum/element/forced_gravity, gravito_targets[target])
- gravito_targets -= target
-
-/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/__distance_check(atom/movable/AM, OldLoc, Dir, Forced)
- if(get_dist(src, AM) > gravity_power_range)
- remove_gravity(AM)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm
deleted file mode 100644
index a70bf4edae24..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm
+++ /dev/null
@@ -1,113 +0,0 @@
-//Beam
-/obj/effect/ebeam/chain
- name = "lightning chain"
- layer = LYING_MOB_LAYER
-
-/mob/living/simple_animal/hostile/guardian/beam
- melee_damage_lower = 7
- melee_damage_upper = 7
- attack_verb_continuous = "shocks"
- attack_verb_simple = "shock"
- melee_damage_type = BURN
- attack_sound = 'sound/machines/defib_zap.ogg'
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- range = 7
- playstyle_string = "As a lightning type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them."
- magic_fluff_string = "..And draw the Tesla, a shocking, lethal source of power."
- tech_fluff_string = "Boot sequence complete. Lightning modules active. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! Caught one! It's a lightning carp! Everyone else goes zap zap."
- miner_fluff_string = "You encounter... Iron, a conductive master of lightning."
- var/datum/beam/summonerchain
- var/list/enemychains = list()
- var/successfulshocks = 0
-
-/mob/living/simple_animal/hostile/guardian/beam/AttackingTarget()
- . = ..()
- if(. && isliving(target) && target != src && target != summoner)
- cleardeletedchains()
- for(var/chain in enemychains)
- var/datum/beam/B = chain
- if(B.target == target)
- return //oh this guy already HAS a chain, let's not chain again
- if(enemychains.len > 2)
- var/datum/beam/C = pick(enemychains)
- qdel(C)
- enemychains -= C
- enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain)
-
-/mob/living/simple_animal/hostile/guardian/beam/Destroy()
- removechains()
- return ..()
-
-/mob/living/simple_animal/hostile/guardian/beam/Manifest()
- . = ..()
- if(.)
- if(summoner)
- summonerchain = Beam(summoner, "lightning[rand(1,12)]", time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain)
- while(loc != summoner)
- if(successfulshocks > 5)
- successfulshocks = 0
- if(shockallchains())
- successfulshocks++
- SLEEP_CHECK_DEATH(3)
-
-/mob/living/simple_animal/hostile/guardian/beam/Recall()
- . = ..()
- if(.)
- removechains()
-
-/mob/living/simple_animal/hostile/guardian/beam/proc/cleardeletedchains()
- if(summonerchain && QDELETED(summonerchain))
- summonerchain = null
- if(enemychains.len)
- for(var/chain in enemychains)
- var/datum/cd = chain
- if(!chain || QDELETED(cd))
- enemychains -= chain
-
-/mob/living/simple_animal/hostile/guardian/beam/proc/shockallchains()
- . = 0
- cleardeletedchains()
- if(summoner)
- if(!summonerchain)
- summonerchain = Beam(summoner, "lightning[rand(1,12)]", time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain)
- . += chainshock(summonerchain)
- if(enemychains.len)
- for(var/chain in enemychains)
- . += chainshock(chain)
-
-/mob/living/simple_animal/hostile/guardian/beam/proc/removechains()
- if(summonerchain)
- qdel(summonerchain)
- summonerchain = null
- if(enemychains.len)
- for(var/chain in enemychains)
- qdel(chain)
- enemychains = list()
-
-/mob/living/simple_animal/hostile/guardian/beam/proc/chainshock(datum/beam/B)
- . = 0
- var/list/turfs = list()
- for(var/E in B.elements)
- var/obj/effect/ebeam/chainpart = E
- if(chainpart && chainpart.x && chainpart.y && chainpart.z)
- var/turf/T = get_turf_pixel(chainpart)
- turfs |= T
- if(T != get_turf(B.origin) && T != get_turf(B.target))
- for(var/turf/TU in circlerange(T, 1))
- turfs |= TU
- for(var/turf in turfs)
- var/turf/T = turf
- for(var/mob/living/L in T)
- if(L.stat != DEAD && L != src && L != summoner)
- if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
- continue
- if(successfulshocks > 4)
- L.electrocute_act(0)
- L.visible_message(
- "[L] was shocked by the lightning chain!", \
- "You are shocked by the lightning chain!", \
- "You hear a heavy electrical crack." \
- )
- L.adjustFireLoss(1.2) //adds up very rapidly
- . = 1
diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm
deleted file mode 100644
index e42dcb62e2ef..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm
+++ /dev/null
@@ -1,72 +0,0 @@
-//Protector
-/mob/living/simple_animal/hostile/guardian/protector
- melee_damage_lower = 30
- melee_damage_upper = 30
- range = 20
- damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4)
- playstyle_string = "As a protector type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you take almost no damage and have reduced damage. While in protection mode, you move significantly slower, and have extremely low range."
- magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge."
- tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy."
- miner_fluff_string = "You encounter... Uranium, a very resistant guardian."
- toggle_button_type = /atom/movable/screen/guardian/ToggleMode
- var/toggle = FALSE
-
-/mob/living/simple_animal/hostile/guardian/protector/ex_act(severity)
- if(severity == 1)
- adjustBruteLoss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner
- else
- ..()
- if(QDELETED(src))
- return
- if(toggle)
- visible_message("The explosion glances off [src]'s energy shielding!")
-
-/mob/living/simple_animal/hostile/guardian/protector/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0 && toggle)
- var/image/I = new('icons/effects/effects.dmi', src, "shield-flash", MOB_LAYER+0.01, dir = pick(GLOB.cardinals))
- if(guardiancolor)
- I.color = guardiancolor
- flick_overlay_view(I, src, 5)
-
-/mob/living/simple_animal/hostile/guardian/protector/ToggleMode()
- if(cooldown > world.time)
- return 0
- cooldown = world.time + 10
- if(toggle)
- cut_overlays()
- melee_damage_lower = initial(melee_damage_lower)
- melee_damage_upper = initial(melee_damage_upper)
- speed = initial(speed)
- damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4)
- to_chat(src, "You switch to combat mode.")
- toggle = FALSE
- else
- var/mutable_appearance/shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey")
- if(guardiancolor)
- shield_overlay.color = guardiancolor
- add_overlay(shield_overlay)
- melee_damage_lower = 15
- melee_damage_upper = 15
- speed = 4
- range = 5
- damage_coeff = list(BRUTE = 0.05, BURN = 0.05, TOX = 0.05, CLONE = 0.05, STAMINA = 0, OXY = 0.05) //damage? what's damage?
- to_chat(src, "You switch to protection mode.")
- toggle = TRUE
-
-/mob/living/simple_animal/hostile/guardian/protector/snapback() //snap to what? snap to the guardian!
- if(summoner)
- if(get_dist(get_turf(summoner),get_turf(src)) <= range)
- return
- else
- if(istype(summoner.loc, /obj/effect))
- to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!")
- visible_message("\The [src] jumps back to its user.")
- Recall(TRUE)
- else
- to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!")
- summoner.visible_message("\The [summoner] jumps back to [summoner.p_their()] protector.")
- new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner))
- summoner.forceMove(get_turf(src))
- new /obj/effect/temp_visual/guardian/phase(get_turf(summoner))
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
deleted file mode 100644
index 105ae8b35ec8..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ /dev/null
@@ -1,154 +0,0 @@
-//Ranged
-/obj/projectile/guardian//now featuring anime-accurate unpredictable richochet. Hit your master! Hit yourself! Salt in dchat when your own richochet puts you into crit.
- name = "crystal spray"
- icon_state = "guardian"
- damage = 15
- damage_type = BRUTE
- armour_penetration = 100
- ricochets_max = 2
- ricochet_chance = 65
- ricochet_auto_aim_range = 0
- ricochet_incidence_leeway = 50
- projectile_piercing = PASSMOB
-
-/mob/living/simple_animal/hostile/guardian/ranged
- a_intent = INTENT_HELP
- friendly_verb_continuous = "quietly assesses"
- friendly_verb_simple = "quietly assess"
- melee_damage_lower = 10
- melee_damage_upper = 10
- damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9)
- projectiletype = /obj/projectile/guardian
- ranged_cooldown_time = 1 //fast!
- projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
- ranged = 1
- range = 13
- playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit."
- magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat."
- tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean."
- miner_fluff_string = "You encounter... Diamond, a powerful projectile thrower."
- see_invisible = SEE_INVISIBLE_LIVING
- see_in_dark = 8
- toggle_button_type = /atom/movable/screen/guardian/ToggleMode
- var/list/snares = list()
- var/toggle = FALSE
- speed = -2//very fast!
-
-/mob/living/simple_animal/hostile/guardian/ranged/ToggleMode()
- if(loc == summoner)
- if(toggle)
- ranged = initial(ranged)
- melee_damage_lower = initial(melee_damage_lower)
- melee_damage_upper = initial(melee_damage_upper)
- obj_damage = initial(obj_damage)
- environment_smash = initial(environment_smash)
- alpha = 255
- range = initial(range)
- to_chat(src, "You switch to combat mode.")
- toggle = FALSE
- else
- ranged = 0
- melee_damage_lower = 0
- melee_damage_upper = 0
- obj_damage = 0
- environment_smash = ENVIRONMENT_SMASH_NONE
- alpha = 45
- range = 255
- to_chat(src, "You switch to scout mode.")
- toggle = TRUE
- else
- to_chat(src, "You have to be recalled to toggle modes!")
-
-/mob/living/simple_animal/hostile/guardian/ranged/Shoot(atom/targeted_atom)
- . = ..()
- if(istype(., /obj/projectile))
- var/obj/projectile/P = .
- if(guardiancolor)
- P.color = guardiancolor
-
-/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight()
- var/msg
- switch(lighting_alpha)
- if (LIGHTING_PLANE_ALPHA_VISIBLE)
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
- msg = "You activate your night vision."
- if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- msg = "You increase your night vision."
- if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
- lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
- msg = "You maximize your night vision."
- else
- lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
- msg = "You deactivate your night vision."
-
- to_chat(src, "[msg]")
-
-
-/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare()
- set name = "Set Surveillance Snare"
- set category = "Guardian"
- set desc = "Set an invisible snare that will alert you when living creatures walk over it. Max of 5"
- if(snares.len <6)
- var/turf/snare_loc = get_turf(loc)
- var/obj/effect/snare/S = new /obj/effect/snare(snare_loc)
- S.spawner = src
- S.name = "[get_area(snare_loc)] snare ([rand(1, 1000)])"
- snares |= S
- to_chat(src, "Surveillance snare deployed!")
- else
- to_chat(src, "You have too many snares deployed. Remove some first.")
-
-/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare()
- set name = "Remove Surveillance Snare"
- set category = "Guardian"
- set desc = "Disarm unwanted surveillance snares."
- var/picked_snare = input(src, "Pick which snare to remove", "Remove Snare") as null|anything in sortNames(snares)
- if(picked_snare)
- snares -= picked_snare
- qdel(picked_snare)
- to_chat(src, "Snare disarmed.")
-
-/obj/effect/snare
- name = "snare"
- desc = "You shouldn't be seeing this!"
- var/mob/living/simple_animal/hostile/guardian/spawner
- invisibility = INVISIBILITY_ABSTRACT
-
-/obj/effect/snare/Initialize()
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-
-/obj/effect/snare/proc/on_entered(datum/source, AM as mob|obj)
- SIGNAL_HANDLER
- if(isliving(AM) && spawner && spawner.summoner && AM != spawner && !spawner.hasmatchingsummoner(AM))
- to_chat(spawner.summoner, "[AM] has crossed surveillance snare, [name].")
- var/list/guardians = spawner.summoner.hasparasites()
- for(var/para in guardians)
- to_chat(para, "[AM] has crossed surveillance snare, [name].")
-
-/obj/effect/snare/singularity_act()
- return
-
-/obj/effect/snare/singularity_pull()
- return
-
-/mob/living/simple_animal/hostile/guardian/ranged/Manifest(forced)
- if (toggle)
- incorporeal_move = INCORPOREAL_MOVE_BASIC
- . = ..()
-
-/mob/living/simple_animal/hostile/guardian/ranged/Recall(forced)
- // To stop scout mode from moving when recalled
- incorporeal_move = FALSE
- . = ..()
-
-/mob/living/simple_animal/hostile/guardian/ranged/AttackingTarget()
- if(toggle)
- return
- ..()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/slime.dm b/code/modules/mob/living/simple_animal/guardian/types/slime.dm
deleted file mode 100644
index bf38ffed2ef2..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/slime.dm
+++ /dev/null
@@ -1,73 +0,0 @@
-//Slime guardian- modified support guardian who has higher utility but is less potent in battle
-/mob/living/simple_animal/hostile/guardian/slime
- a_intent = INTENT_HARM
- speed = 0
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- melee_damage_lower = 10
- melee_damage_upper = 10
- melee_damage_type = TOX
- playstyle_string = "As a slime type, you can toggle between a weak combat mode, and a strong healing mode that nourishes and repairs damage. This mode also works on slimes. Be warned: You are more vulnerable to damage then most holoparasites."
- magic_fluff_string = "..And draw the Xenobiologist, a purveyor of godlike power."
- carp_fluff_string = "CARP CARP CARP! You caught a slimy carp. Gross, maybe you should throw this one back."
- tech_fluff_string = "Boot sequence complete. Xenobiological support module active. Holoparasite swarm online."
- miner_fluff_string = "You encounter... Slime, the master of xenobiology."
- slime_fluff_string = "The crystal in your hand shatters into mist, which forms a strange, slimy figure!"
- toggle_button_type = /atom/movable/screen/guardian/ToggleMode
- var/toggle = FALSE
-
-/mob/living/simple_animal/hostile/guardian/slime/Initialize()
- . = ..()
- var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
- medsensor.add_hud_to(src)
-
-/mob/living/simple_animal/hostile/guardian/slime/AttackingTarget()
- . = ..()
- if(is_deployed() && toggle && isslime(target))
- var/mob/living/simple_animal/slime/slime = target
- slime.add_nutrition(rand(14, 30))
- slime.adjustHealth(10)
- return
-
- if(is_deployed() && toggle && iscarbon(target))
- var/mob/living/carbon/C = target
- C.adjustBruteLoss(-7)
- C.adjustFireLoss(-7)
- C.adjustOxyLoss(-7)
- C.adjustToxLoss(-7)
- C.adjustCloneLoss(-0.5)
- C.adjust_nutrition(10)
- var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
- if(guardiancolor)
- H.color = guardiancolor
- if(C == summoner)
- update_health_hud()
- med_hud_set_health()
- med_hud_set_status()
-
- if(is_deployed() && toggle == FALSE && iscarbon(target))
- if(prob(20))
- var/mob/living/carbon/D = target
- D.Paralyze(25)
- D.visible_message("\The [src] knocks down \the [D]!", \
- "\The [src] knocks you down!")
-
-/mob/living/simple_animal/hostile/guardian/slime/ToggleMode()
- if(src.loc == summoner)
- if(toggle)
- a_intent = INTENT_HARM
- speed = -1
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.2, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- melee_damage_lower = 15
- melee_damage_upper = 15
- to_chat(src, "Blorble... You switch to combat mode.")
- toggle = FALSE
- else
- a_intent = INTENT_HELP
- speed = 2
- damage_coeff = list(BRUTE = 1.2, BURN = 1.2, TOX = 0.7, CLONE = 1.2, STAMINA = 0, OXY = 1.2)
- melee_damage_lower = 0
- melee_damage_upper = 0
- to_chat(src, "You switch to nourshing mode. Yummy.")
- toggle = TRUE
- else
- to_chat(src, "You have to be recalled to toggle modes!")
diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm
deleted file mode 100644
index 2528a0914717..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm
+++ /dev/null
@@ -1,36 +0,0 @@
-//Standard
-/mob/living/simple_animal/hostile/guardian/punch
- melee_damage_lower = 20
- melee_damage_upper = 20
- obj_damage = 80
- next_move_modifier = 0.6 //attacks 40% faster
- environment_smash = ENVIRONMENT_SMASH_WALLS
- playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
- magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
- tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online."
- carp_fluff_string = "CARP CARP CARP! You caught one! It's really boring and standard. Better punch some walls to ease the tension."
- miner_fluff_string = "You encounter... Adamantine, a powerful attacker."
- var/battlecry = "AT"
- speed = 4//unlike funny jojo man, the punch ghost is actually balanced by their low mobility
-
-/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry()
- set name = "Set Battlecry"
- set category = "Guardian"
- set desc = "Choose what you shout as you punch people."
- var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
- if(input)
- battlecry = input
-
-
-
-/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
- . = ..()
- if(isliving(target))
- say("[battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry][battlecry]!!", ignore_spam = TRUE)
- playsound(loc, src.attack_sound, 50, TRUE, TRUE)
- playsound(loc, src.attack_sound, 50, TRUE, TRUE)
- playsound(loc, src.attack_sound, 50, TRUE, TRUE)
- playsound(loc, src.attack_sound, 50, TRUE, TRUE)
- if(isanimal(target))
- var/mob/living/C = target
- C.apply_damage(35, BRUTE)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
deleted file mode 100644
index 57f1b1892f9d..000000000000
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ /dev/null
@@ -1,148 +0,0 @@
-//Healer
-/mob/living/simple_animal/hostile/guardian/healer
- a_intent = INTENT_HARM
- friendly_verb_continuous = "heals"
- friendly_verb_simple = "heal"
- speed = 0
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- melee_damage_lower = 15
- melee_damage_upper = 15
- playstyle_string = "As a support type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay."
- magic_fluff_string = "..And draw the CMO, a potent force of life... and death."
- carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!"
- tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online."
- miner_fluff_string = "You encounter... Bluespace, the master of support."
- toggle_button_type = /atom/movable/screen/guardian/ToggleMode
- var/obj/structure/receiving_pad/beacon
- var/beacon_cooldown = 0
- var/toggle = FALSE
-
-/mob/living/simple_animal/hostile/guardian/healer/Initialize()
- . = ..()
- var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
- medsensor.add_hud_to(src)
-
-/mob/living/simple_animal/hostile/guardian/healer/get_status_tab_items()
- . = ..()
- if(beacon_cooldown >= world.time)
- . += "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]"
-
-/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
- . = ..()
- if(is_deployed() && toggle && iscarbon(target))
- var/mob/living/carbon/C = target
- C.adjustBruteLoss(-5)
- C.adjustFireLoss(-5)
- C.adjustOxyLoss(-5)
- C.adjustToxLoss(-5)
- var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
- if(guardiancolor)
- H.color = guardiancolor
- if(C == summoner)
- update_health_hud()
- med_hud_set_health()
- med_hud_set_status()
-
-/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
- if(src.loc == summoner)
- if(toggle)
- a_intent = INTENT_HARM
- speed = -2
- damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7)
- melee_damage_lower = 5
- melee_damage_upper = 5
- next_move_modifier = 0.3///attack as fast as you can click, but your actual hits are basically tickle damage :))
- to_chat(src, "You switch to combat mode.")
- toggle = FALSE
- else
- a_intent = INTENT_HELP
- speed = 1
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
- melee_damage_lower = 0
- melee_damage_upper = 0
- to_chat(src, "You switch to healing mode.")
- toggle = TRUE
- else
- to_chat(src, "You have to be recalled to toggle modes!")
-
-
-/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon()
- set name = "Place Bluespace Beacon"
- set category = "Guardian"
- set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work at extreme distances."
-
- if(beacon_cooldown >= world.time)
- to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.")
- return
-
- var/turf/beacon_loc = get_turf(src.loc)
- if(!isfloorturf(beacon_loc))
- return
-
- if(beacon)
- beacon.disappear()
- beacon = null
-
- beacon = new(beacon_loc, src)
-
- to_chat(src, "Beacon placed! You may now warp targets and objects to it, including your user, via Alt+Click.")
-
- beacon_cooldown = world.time + 3000
-
-/obj/structure/receiving_pad
- name = "bluespace receiving pad"
- icon = 'icons/turf/floors.dmi'
- desc = "A receiving zone for bluespace teleportations."
- icon_state = "light_on_flicker-1"
- light_range = MINIMUM_USEFUL_LIGHT_RANGE
- density = FALSE
- anchored = TRUE
- layer = ABOVE_OPEN_TURF_LAYER
-
-/obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G)
- . = ..()
- if(G?.guardiancolor)
- add_atom_colour(G.guardiancolor, FIXED_COLOUR_PRIORITY)
-
-/obj/structure/receiving_pad/proc/disappear()
- visible_message("[src] vanishes!")
- qdel(src)
-
-/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A)
- if(!istype(A))
- return
- if(src.loc == summoner)
- to_chat(src, "You must be manifested to warp a target!")
- return
- if(!beacon)
- to_chat(src, "You need a beacon placed to warp things!")
- return
- if(!Adjacent(A))
- to_chat(src, "You must be adjacent to your target!")
- return
- if(A.anchored)
- to_chat(src, "Your target cannot be anchored!")
- return
-
- var/turf/T = get_turf(A)
- if(beacon.virtual_z() != T.virtual_z())
- to_chat(src, "The beacon is too far away to warp to!")
- return
-
- to_chat(src, "You begin to warp [A].")
- A.visible_message("[A] starts to glow faintly!", \
- "You start to faintly glow, and you feel strangely weightless!")
- do_attack_animation(A)
-
- if(!do_after(src, 6 SECONDS, A)) //now start the channel
- to_chat(src, "You need to hold still!")
- return
-
- new /obj/effect/temp_visual/guardian/phase/out(T)
- if(isliving(A))
- var/mob/living/L = A
- L.flash_act()
- A.visible_message("[A] disappears in a flash of light!", \
- "Your vision is obscured by a flash of light!")
- do_teleport(A, beacon, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
- new /obj/effect/temp_visual/guardian/phase(get_turf(A))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
index 4869d4a95c1c..86224e131747 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -461,8 +461,8 @@
/obj/item/assembly/flash/handheld = 5,
/obj/item/storage/box/evidence = 6,
/obj/item/flashlight/seclite = 4,
- /obj/item/ammo_box/c9mm/rubbershot = 3,
- /obj/item/ammo_box/c9mm = 1,
+ /obj/item/storage/box/ammo/c9mm_rubber = 3,
+ /obj/item/storage/box/ammo/c9mm = 1,
/obj/item/stock_parts/cell/gun = 3,
/obj/item/coin/antagtoken = 1,
/obj/item/grenade/stingbang = 1
diff --git a/code/modules/paperwork/folders_premade.dm b/code/modules/paperwork/folders_premade.dm
index 48b7cb763785..5237358e34b1 100644
--- a/code/modules/paperwork/folders_premade.dm
+++ b/code/modules/paperwork/folders_premade.dm
@@ -61,6 +61,10 @@
/obj/item/folder/documents/syndicate/mining
document = /obj/item/documents/syndicate/mining
+/obj/item/folder/documents/syndicate/ngr
+ document = /obj/item/documents/syndicate/ngr
+ icon_state = "folder_ngr"
+
/obj/item/folder/documents/solgov
document = /obj/item/documents/solgov
desc = "A blue folder with a SolGov seal."
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 22e9a722634b..fecf2b17dac6 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -106,6 +106,31 @@
icon_state = "stamp-biodynamics"
dye_color = DYE_CMO
+/obj/item/stamp/ngr
+ name = "New Gorlex Republic rubber stamp"
+ icon_state = "stamp-ngr"
+ dye_color = DYE_REDCOAT
+
+/obj/item/stamp/ngr/captain
+ name = "Captain's rubber stamp"
+ icon_state = "stamp-ngr_cap"
+ dye_color = DYE_QM
+
+/obj/item/stamp/ngr/foreman
+ name = "Foreman's rubber stamp"
+ icon_state = "stamp-ngr_fore"
+ dye_color = DYE_QM
+
+/obj/item/stamp/ngr/lieutenant
+ name = "Lieutenant's rubber stamp"
+ icon_state = "stamp-ngr_lieu"
+ dye_color = DYE_QM
+
+/obj/item/stamp/ngr/ensign
+ name = "Ensign's rubber stamp"
+ icon_state = "stamp-ngr_ensign"
+ dye_color = DYE_QM
+
/obj/item/stamp/solgov
name = "SolGov rubber stamp"
icon_state = "stamp-solgov"
@@ -115,32 +140,33 @@
icon_state = "stamp-inteq"
dye_color = DYE_QM
-/obj/item/stamp/vanguard
+/obj/item/stamp/inteq/vanguard
name = "Vanguard's rubber stamp"
- icon_state = "stamp-vanguard"
- dye_color = DYE_QM
+ icon_state = "stamp-inteq_vanguard"
-/obj/item/stamp/maa
+/obj/item/stamp/inteq/maa
name = "Master at Arms' rubber stamp"
- icon_state = "stamp-maa"
- dye_color = DYE_QM
+ icon_state = "stamp-inteq_maa"
-/obj/item/stamp/artificer
- name = "Class II Artificer's rubber stamp"
- icon_state = "stamp-artificer"
- dye_color = DYE_QM
+/obj/item/stamp/inteq/artificer
+ name = "Honorable Artificer's rubber stamp"
+ icon_state = "stamp-inteq_artificer"
+
+/obj/item/stamp/inteq/corpsman
+ name = "Honorable Corpsman's rubber stamp"
+ icon_state = "stamp-inteq_corpsman"
/obj/item/stamp/clip
name = "CLIP Minutemen rubber stamp"
icon_state = "stamp-cmm"
dye_color = DYE_FO
-/obj/item/stamp/gold
+/obj/item/stamp/clip/gold
name = "GOLD rubber stamp"
icon_state = "stamp-gold"
dye_color = DYE_FO
-/obj/item/stamp/bard
+/obj/item/stamp/clip/bard
name = "BARD rubber stamp"
icon_state = "stamp-bard"
dye_color = DYE_FO
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammo_casing.dm
similarity index 51%
rename from code/modules/projectiles/ammunition/_ammunition.dm
rename to code/modules/projectiles/ammunition/_ammo_casing.dm
index b216296cfe8d..57b6e9b27b57 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammo_casing.dm
@@ -1,7 +1,7 @@
/obj/item/ammo_casing
name = "bullet casing"
desc = "A bullet casing."
- icon = 'icons/obj/ammo_bullets.dmi'
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
icon_state = "pistol-brass"
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
@@ -30,16 +30,109 @@
/// Disable for things like rockets or other heavy ammunition that should only appear right-side up.
var/auto_rotate = TRUE
- var/pellets = 1 //Pellets for spreadshot
- var/variance = 0 //Variance for inaccuracy fundamental to the casing
- var/randomspread = FALSE //Randomspread for automatics
- var/delay = 0 //Delay for energy weapons
- var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ ///Pellets for spreadshot
+ var/pellets = 1
+ ///Variance for inaccuracy fundamental to the casing
+ var/variance = 0
+ ///Randomspread for automatics
+ var/randomspread = FALSE
+ ///Delay for energy weapons
+ var/delay = 0
+ ///Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ var/click_cooldown_override = 0
+ ///If true, overrides the bouncing sfx from the turf to this one
+ var/list/bounce_sfx_override
+
+ ///What this casing can be stacked into.
+ var/obj/item/ammo_box/magazine/stack_type = /obj/item/ammo_box/magazine/ammo_stack
+ ///Maximum stack size of ammunition
+ var/stack_size = 12
+
+/obj/item/ammo_casing/attackby(obj/item/attacking_item, mob/user, params)
+ if(istype(attacking_item, /obj/item/ammo_box) && user.is_holding(src))
+ add_fingerprint(user)
+ var/obj/item/ammo_box/ammo_box = attacking_item
+ var/obj/item/ammo_casing/other_casing = ammo_box.get_round(TRUE)
+
+ if(try_stacking(other_casing, user))
+ ammo_box.stored_ammo -= other_casing
+ ammo_box.update_ammo_count()
+ return
- var/list/bounce_sfx_override // if true, overrides the bouncing sfx from the turf to this one
+ else if(istype(attacking_item, /obj/item/ammo_box/magazine/ammo_stack))
+ add_fingerprint(user)
+ var/obj/item/ammo_box/magazine/ammo_stack = attacking_item
+ if(isturf(loc))
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in loc)
+ if(bullet == src)
+ continue
+ if(!bullet.BB)
+ continue
+ if(length(ammo_stack.stored_ammo) >= ammo_stack.max_ammo)
+ break
+ if(ammo_stack.give_round(bullet, FALSE))
+ boolets++
+ break
+ if((boolets <= 0) && BB && !(length(ammo_stack.stored_ammo) >= ammo_stack.max_ammo))
+ if(ammo_stack.give_round(src, FALSE))
+ boolets++
+ if(boolets > 0)
+ ammo_stack.update_ammo_count()
+ to_chat(user, span_notice("You collect [boolets] round\s. [ammo_stack] now contains [length(ammo_stack.stored_ammo)] round\s."))
+ else
+ to_chat(user, span_warning("You can't stack any more!"))
+ return
- var/bullet_per_box
+ else if(istype(attacking_item, /obj/item/ammo_casing))
+ try_stacking(attacking_item, user)
+ return
+ return ..()
+
+/obj/item/ammo_casing/proc/try_stacking(obj/item/ammo_casing/other_casing, mob/living/user)
+ if(user)
+ add_fingerprint(user)
+ if(!other_casing.stack_type)
+ if(user)
+ to_chat(user, span_warning("[other_casing] can't be stacked."))
+ return
+ if(!stack_type)
+ if(user)
+ to_chat(user, span_warning("[src] can't be stacked."))
+ return
+ if(name != other_casing.name) //Has to match exactly
+ if(user)
+ to_chat(user, span_warning("You can't stack different types of ammunition."))
+ return
+ if(stack_type != other_casing.stack_type)
+ if(user)
+ to_chat(user, span_warning("You can't stack [other_casing] with [src]."))
+ return
+ if(!BB || !other_casing.BB) //maybe allow empty casing stacking at a later date, when there's a feature to recycle casings
+ if(user)
+ to_chat(user, span_warning("You can't stack empty casings."))
+ return
+ if((item_flags & IN_STORAGE) || (other_casing.item_flags & IN_STORAGE))
+ if(user)
+ to_chat(user, span_warning("You can't stack casings while they are inside storage."))
+ return
+ var/obj/item/ammo_box/magazine/ammo_stack/ammo_stack = other_casing.stack_with(src)
+ if(user)
+ user.put_in_hands(ammo_stack)
+ to_chat(user, span_notice("[src] has been stacked with [other_casing]."))
+ return ammo_stack
+
+/obj/item/ammo_casing/proc/stack_with(obj/item/ammo_casing/other_casing)
+ var/obj/item/ammo_box/magazine/ammo_stack/ammo_stack = new stack_type(drop_location())
+ ammo_stack.name = "handful of [name]s" //"handful of .9mm bullet casings"
+ ammo_stack.base_icon_state = other_casing.icon_state
+ ammo_stack.caliber = caliber
+ ammo_stack.max_ammo = stack_size
+ ammo_stack.give_round(src)
+ ammo_stack.give_round(other_casing)
+ ammo_stack.update_ammo_count()
+ return ammo_stack
/obj/item/ammo_casing/spent
name = "spent bullet casing"
@@ -53,7 +146,7 @@
pixel_y = base_pixel_y + rand(-10, 10)
item_flags |= NO_PIXEL_RANDOM_DROP
if(auto_rotate)
- transform = transform.Turn(pick(0, 90, 180, 270))
+ transform = transform.Turn(round(45 * rand(0, 32) / 2))
update_appearance()
/obj/item/ammo_casing/Destroy()
@@ -72,33 +165,11 @@
desc = "[initial(desc)][BB ? null : " This one is spent."]"
return ..()
-//proc to magically refill a casing with a new projectile
+///Proc to magically refill a casing with a new projectile
/obj/item/ammo_casing/proc/newshot() //For energy weapons, syringe gun, shotgun shells and wands (!).
if(!BB)
BB = new projectile_type(src, src)
-/obj/item/ammo_casing/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/ammo_box))
- var/obj/item/ammo_box/box = I
- if(isturf(loc))
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in loc)
- if (box.stored_ammo.len >= box.max_ammo)
- break
- if (bullet.BB)
- if (box.give_round(bullet, 0))
- boolets++
- else
- continue
- if (boolets > 0)
- box.update_appearance()
- to_chat(user, "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.")
- else
- to_chat(user, "You fail to collect anything!")
- else
- return ..()
-
-
/obj/item/ammo_casing/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
bounce_away(FALSE, NONE)
. = ..()
@@ -111,7 +182,6 @@
var/angle_of_movement = !isnull(shooter) ? (rand(-3000, 3000) / 100) + dir2angle(turn(shooter.dir, 180)) : rand(-3000, 3000) / 100
AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(400, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = bounce_sfx_override)
-
/obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3)
if(!heavy_metal)
return
diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm
index d46001951ba4..90030e7b0944 100644
--- a/code/modules/projectiles/ammunition/ballistic/lmg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm
@@ -6,7 +6,6 @@
icon_state = "rifle-steel"
caliber = "7.12x82mm"
projectile_type = /obj/projectile/bullet/mm712x82
- bullet_per_box = 100
/obj/item/ammo_casing/mm712x82/ap
name = "7.12x82mm armor-piercing bullet casing"
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index e8cb64a673d2..9e1f880ffe1b 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -6,7 +6,6 @@
icon_state = "pistol-steel"
caliber = "10mm"
projectile_type = /obj/projectile/bullet/c10mm
- bullet_per_box = 50
/obj/item/ammo_casing/c10mm/surplus
name = "10mm surplus bullet casing"
@@ -46,7 +45,7 @@
icon_state = "pistol-brass"
caliber = "9mm"
projectile_type = /obj/projectile/bullet/c9mm
- bullet_per_box = 50
+ stack_size = 15
/obj/item/ammo_casing/c9mm/surplus
name = "9mm surplus bullet casing"
@@ -58,7 +57,7 @@
name = "9mm armor-piercing bullet casing"
desc = "A 9mm armor-piercing bullet casing."
bullet_skin = "ap"
- projectile_type =/obj/projectile/bullet/c9mm/ap
+ projectile_type = /obj/projectile/bullet/c9mm/ap
/obj/item/ammo_casing/c9mm/hp
name = "9mm hollow point bullet casing"
@@ -86,7 +85,7 @@
icon_state = "pistol-steel"
caliber = ".45"
projectile_type = /obj/projectile/bullet/c45
- bullet_per_box = 50
+ stack_size = 12
/obj/item/ammo_casing/c45/surplus
name = ".45 surplus bullet casing"
@@ -125,18 +124,17 @@
desc = "A .50 AE bullet casing."
caliber = ".50 AE"
projectile_type = /obj/projectile/bullet/a50AE
- bullet_per_box = 20
/obj/item/ammo_casing/a50AE/hp
name = ".50 AE hollow point bullet casing"
desc = "A .50 AE hollow point bullet casing."
projectile_type = /obj/projectile/bullet/a50AE/hp
-// .22 LR (Himehabu)
+// .22 LR (Himehabu, Pounder)
+
/obj/item/ammo_casing/c22lr
name = ".22 LR bullet casing"
desc = "A .22 LR bullet casing."
projectile_type = /obj/projectile/bullet/c22lr
caliber = "22lr"
- bullet_per_box = 75
-
+ stack_size = 15
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index 8705a932b392..5b6e8b2e0961 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -6,7 +6,6 @@
caliber = ".357"
icon_state = "magnum-brass"
projectile_type = /obj/projectile/bullet/a357
- bullet_per_box = 50
/obj/item/ammo_casing/a357/match
name = ".357 match bullet casing"
@@ -29,7 +28,7 @@
caliber = ".45-70"
icon_state = "magnum-brass"
projectile_type = /obj/projectile/bullet/a4570
- bullet_per_box = 12
+ stack_size = 5
/obj/item/ammo_casing/a4570/match
name = ".45-70 match bullet casing"
@@ -55,14 +54,12 @@
desc = "A .38 Special bullet casing."
caliber = ".38"
projectile_type = /obj/projectile/bullet/c38
- bullet_per_box = 50
/obj/item/ammo_casing/c38/surplus
name = ".38 surplus bullet casing"
desc = "A .38 surplus bullet casing."
projectile_type = /obj/projectile/bullet/c38/surplus
-
/obj/item/ammo_casing/c38/trac
name = ".38 TRAC bullet casing"
desc = "A .38 \"TRAC\" bullet casing."
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
index 9f71e2973848..04545410300b 100644
--- a/code/modules/projectiles/ammunition/ballistic/rifle.dm
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -6,7 +6,7 @@
icon_state = "rifle-brass"
caliber = "8x50mmR"
projectile_type = /obj/projectile/bullet/a8_50r
- bullet_per_box = 20
+ stack_size = 10
/obj/item/ammo_casing/a8_50rhp
name = "8x50mmR hollow point bullet casing"
@@ -14,7 +14,7 @@
icon_state = "rifle-brass-hollow"
caliber = "8x50mmR"
projectile_type = /obj/projectile/bullet/a8_50rhp
-
+ stack_size = 10
// 8x58mm Caseless (SSG-669C)
@@ -24,7 +24,7 @@
icon_state = "caseless"
caliber = "a858"
projectile_type = /obj/projectile/bullet/a858
- bullet_per_box = 20
+ stack_size = 10
// .300 Magnum (Smile Rifle)
@@ -34,7 +34,7 @@
icon_state = "rifle-steel"
caliber = "a300"
projectile_type = /obj/projectile/bullet/a300
- bullet_per_box = 20
+ stack_size = 15
// 5.56x42mm CLIP (CM82, Hydra variants)
@@ -44,7 +44,7 @@
icon_state = "rifle-brass"
caliber = "5.56x42mm"
projectile_type = /obj/projectile/bullet/a556_42
- bullet_per_box = 80
+ stack_size = 5
// 5.45x39mm (SKM-24v)
@@ -55,7 +55,7 @@
caliber = "5.45x39mm"
randomspread = TRUE
projectile_type = /obj/projectile/bullet/a545_39
- bullet_per_box = 80
+ stack_size = 15
/obj/item/ammo_casing/a545_39/recycled
name = "recycled 5.45x39mm bullet casing"
@@ -63,6 +63,7 @@
bullet_skin = "surplus"
caliber = "5.45x39mm"
projectile_type = /obj/projectile/bullet/a545_39
+ stack_size = 15
// 7.62x40mm CLIP (SKM Rifles)
@@ -72,7 +73,7 @@
icon_state = "rifle-brass"
caliber = "7.62x40mm"
projectile_type = /obj/projectile/bullet/a762_40
- bullet_per_box = 80
+ stack_size = 15
//.308 (M514 EBR & CM-GAL-S)
@@ -82,7 +83,7 @@
icon_state = "rifle-brass"
caliber = ".308"
projectile_type = /obj/projectile/bullet/a308
- bullet_per_box = 20
+ stack_size = 10
/obj/item/ammo_casing/caseless/c299
name = ".299 Eoehoma caseless bullet casing"
@@ -90,7 +91,7 @@
icon_state = "caseless"
caliber = ".299 caseless"
projectile_type = /obj/projectile/bullet/c299
- bullet_per_box = 100
+ stack_size = 5
/obj/item/ammo_casing/a65clip
name = "6.5x57mm CLIP bullet casing"
@@ -98,3 +99,4 @@
icon_state = "big-brass"
caliber = "6.5CLIP"
projectile_type = /obj/projectile/bullet/a65clip
+ stack_size = 5
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 24854030c041..2bf041a0e661 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -3,12 +3,11 @@
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12-gauge lead slug."
- icon = 'icons/obj/ammo_shotshells.dmi'
icon_state = "slug"
caliber = "12ga"
custom_materials = list(/datum/material/iron=4000)
projectile_type = /obj/projectile/bullet/slug
- bullet_per_box = 25
+ stack_size = 8 //Make sure this matches max_ammo variable on prefilled stacks (magazine/ammo_stack/prefilled)
bounce_sfx_override = 'sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg'
@@ -28,6 +27,7 @@
name = "beanbag slug"
desc = "A weak beanbag slug for riot control."
icon_state = "beanbag"
+ caliber = "12ga beanbag"
custom_materials = list(/datum/material/iron=250)
projectile_type = /obj/projectile/bullet/slug/beanbag
@@ -35,6 +35,7 @@
name = "rubber shot"
desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
icon_state = "rubber"
+ caliber = "12ga rubber"
projectile_type = /obj/projectile/bullet/pellet/rubbershot
pellets = 8
variance = 25
@@ -44,6 +45,7 @@
name = "incendiary slug"
desc = "An incendiary-coated shotgun slug."
icon_state = "incendiary"
+ caliber = "12ga incendiary"
projectile_type = /obj/projectile/bullet/incendiary/shotgun
/obj/item/ammo_casing/shotgun/blank
@@ -57,6 +59,7 @@
name = "improvised shell"
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
icon_state = "improvised"
+ caliber = "improvised 12ga"
projectile_type = /obj/projectile/bullet/pellet/improvised
custom_materials = list(/datum/material/iron=250)
pellets = 10
diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm
index 39086b8cc66f..5e0602da6db2 100644
--- a/code/modules/projectiles/ammunition/ballistic/smg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/smg.dm
@@ -6,7 +6,6 @@
icon_state = "rifle-steel"
caliber = "5.7x39mm"
projectile_type = /obj/projectile/bullet/c57x39mm
- bullet_per_box = 50
// 4.6x30mm (WT-550 Automatic Rifle & SKM-24v)
@@ -16,7 +15,7 @@
icon_state = "rifle-brass"
caliber = "4.6x30mm"
projectile_type = /obj/projectile/bullet/c46x30mm
- bullet_per_box = 50
+ stack_size = 15
/obj/item/ammo_casing/c46x30mm/ap
name = "4.6x30mm armor-piercing bullet casing"
@@ -29,7 +28,6 @@
desc = "A 4.6x30mm incendiary bullet casing."
bullet_skin = "incen"
projectile_type = /obj/projectile/bullet/incendiary/c46x30mm
- bullet_per_box = 50
// 4.73x33mm caseless (Solar)
@@ -39,7 +37,6 @@
icon_state = "caseless"
caliber = "4.73x33mm caseless"
projectile_type = /obj/projectile/bullet/c47x33mm
- bullet_per_box = 50
// 5.56mm HITP caseless (Pistole C)
diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm
index e4b668c2228f..af7369204e6d 100644
--- a/code/modules/projectiles/ammunition/ballistic/sniper.dm
+++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm
@@ -6,7 +6,6 @@
icon_state = "big-steel"
caliber = ".50 BMG"
projectile_type = /obj/projectile/bullet/p50
- bullet_per_box = 20
/obj/item/ammo_casing/p50/soporific
name = ".50 BMG soporific bullet casing"
diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
index 0051680fd1e8..3c71d31eb5ed 100644
--- a/code/modules/projectiles/ammunition/caseless/foam.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -9,7 +9,6 @@
custom_materials = list(/datum/material/iron = 11.25)
harmful = FALSE
var/modified = FALSE
- bullet_per_box = 40
/obj/item/ammo_casing/caseless/foam_dart/update_icon_state()
. = ..()
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 7f92dfad16a6..57fb71d17f32 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -4,7 +4,7 @@
/obj/item/ammo_box
name = "ammo box (null_reference_exception)"
desc = "A box of ammo."
- icon = 'icons/obj/ammo.dmi'
+ icon = 'icons/obj/ammunition/ammo.dmi'
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
item_state = "syringe_kit"
@@ -26,7 +26,7 @@
///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines
var/caliber
///Allows multiple bullets to be loaded in from one click of another box/magazine
- var/multiload = TRUE
+ var/multiload = FALSE
///Whether or not an ammo box skips the do_after process (e.g. speedloaders)
var/instant_load = FALSE
///Whether the magazine should start with nothing in it
@@ -40,22 +40,42 @@
. = ..()
if(!base_icon_state)
base_icon_state = icon_state
- if (!bullet_cost)
+
+ if(!bullet_cost)
for (var/material in custom_materials)
var/material_amount = custom_materials[material]
LAZYSET(base_cost, material, (material_amount * 0.10))
material_amount *= 0.90 // 10% for the container
material_amount /= max_ammo
- LAZYSET(bullet_cost, material, material_amount)
+ LAZYSET(bullet_cost, material, material_amount).
+
if(!start_empty)
- for(var/i = 1, i <= max_ammo, i++)
- stored_ammo += new ammo_type(src)
- update_ammo_count()
+ top_off(starting = TRUE)
+
+ update_appearance()
+
+/*
+ * top_off is used to refill the magazine to max, in case you want to increase the size of a magazine with VV then refill it at once
+ * Arguments:
+ * load_type - if you want to specify a specific ammo casing type to load, enter the path here, otherwise it'll use the basic [/obj/item/ammo_box/var/ammo_type]. Must be a compatible round
+ * starting - Relevant for revolver cylinders, if FALSE then we mind the nulls that represent the empty cylinders (since those nulls don't exist yet if we haven't initialized when this is TRUE)
+ */
+/obj/item/ammo_box/proc/top_off(load_type, starting=FALSE)
+ if(!load_type) //this check comes first so not defining an argument means we just go with default ammo
+ load_type = ammo_type
+
+ var/obj/item/ammo_casing/round_check = load_type
+ if(!starting && (caliber && initial(round_check.caliber) != caliber) || (!caliber && load_type != ammo_type))
+ stack_trace("Tried loading unsupported ammocasing type [load_type] into ammo box [type].")
+ return
+
+ for(var/i = max(1, stored_ammo.len), i <= max_ammo, i++)
+ stored_ammo += new round_check(src)
///gets a round from the magazine, if keep is TRUE the round will stay in the gun
/obj/item/ammo_box/proc/get_round(keep = FALSE)
- if (!stored_ammo.len)
+ if(!stored_ammo.len)
return null
else
var/b = stored_ammo[stored_ammo.len]
@@ -70,7 +90,7 @@
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
return FALSE
- if (stored_ammo.len < max_ammo)
+ if(stored_ammo.len < max_ammo)
stored_ammo += R
R.forceMove(src)
return TRUE
@@ -93,12 +113,14 @@
/obj/item/ammo_box/attackby(obj/item/attacking_obj, mob/user, params, silent = FALSE, replace_spent = FALSE)
var/num_loaded = 0
+
if(!can_load(user))
return
- if(istype(attacking_obj, /obj/item/ammo_box))
+
+ if(istype(attacking_obj, /obj/item/ammo_box/magazine/ammo_stack))
var/obj/item/ammo_box/attacking_box = attacking_obj
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box)))
+ if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box, timed_action_flags = IGNORE_USER_LOC_CHANGE)))
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
@@ -114,15 +136,14 @@
var/obj/item/ammo_casing/casing_to_insert = attacking_obj
if(give_round(casing_to_insert, replace_spent))
user.transferItemToLoc(casing_to_insert, src, TRUE)
- if(!silent)
- playsound(casing_to_insert, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
num_loaded++
+ casing_to_insert.update_appearance()
update_ammo_count()
-
if(num_loaded)
if(!silent)
- to_chat(user, "You load [num_loaded] cartridge\s into \the [src]!")
+ to_chat(user, span_notice("You load [num_loaded] cartridge\s into \the [src]!"))
+ playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
return num_loaded
/obj/item/ammo_box/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
@@ -145,6 +166,7 @@
if(num_loaded)
to_chat(user, "You load [num_loaded] cartridge\s into \the [to_load]!")
return
+
/obj/item/ammo_box/attack_self(mob/user)
var/obj/item/ammo_casing/A = get_round()
if(!A)
@@ -155,7 +177,7 @@
if(!(user.is_holding(src) || H.l_store == src || H.r_store == src) || !user.put_in_hands(A)) //incase they're using TK
A.bounce_away(FALSE, NONE)
playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
- to_chat(user, "You remove a round from [src]!")
+ to_chat(user, span_notice("You remove a round from [src]!"))
update_ammo_count()
/// Updates the materials and appearance of this ammo box
@@ -218,6 +240,7 @@
var/list/L = stored_ammo.Copy()
if(drop_list)
stored_ammo.Cut()
+ update_ammo_count()
return L
///drops the entire contents of the magazine on the floor
@@ -226,6 +249,7 @@
for(var/obj/item/ammo in stored_ammo)
ammo.forceMove(turf_mag)
stored_ammo -= ammo
+ update_ammo_count()
/obj/item/ammo_box/magazine/handle_atom_del(atom/A)
stored_ammo -= A
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
deleted file mode 100644
index 5b78f1fc93a1..000000000000
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ /dev/null
@@ -1,565 +0,0 @@
-// .357 Speed Loaders (Syndicate Revolver)
-
-/obj/item/ammo_box/a357
- name = "speed loader (.357)"
- desc = "A 6-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor."
- icon_state = "speedloader_357-6"
- base_icon_state = "speedloader_357"
- ammo_type = /obj/item/ammo_casing/a357
- caliber = ".357"
- max_ammo = 6
- multiple_sprites = AMMO_BOX_PER_BULLET
- item_flags = NO_MAT_REDEMPTION
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a357/empty
- start_empty = TRUE
-
-/obj/item/ammo_box/a357/match
- name = "speed loader (.357 match)"
- desc = "A 6-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
- ammo_type = /obj/item/ammo_casing/a357/match
-
-/obj/item/ammo_box/a357/hp
- name = "speed loader (.357 hollow point)"
- desc = "A 6-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones."
- ammo_type = /obj/item/ammo_casing/a357/hp
-
-/obj/item/ammo_box/a357_box
- name = "ammo box (.357)"
- desc = "A box of standard .357 ammo."
- icon_state = "357box"
- ammo_type = /obj/item/ammo_casing/a357
- max_ammo = 50
-
-/obj/item/ammo_box/a357_box/match
- name = "ammo box (.357)"
- desc = "A box of match .357 ammo."
- icon_state = "357box-match"
- ammo_type = /obj/item/ammo_casing/a357/match
- max_ammo = 50
-
-/obj/item/ammo_box/a357_box/hp
- name = "ammo box (.357)"
- desc = "A box of hollow point .357 ammo."
- icon_state = "357box-hp"
- ammo_type = /obj/item/ammo_casing/a357/hp
- max_ammo = 50
-
-
-// .45-70 Ammo Holders (Hunting Revolver)
-
-/obj/item/ammo_box/a4570
- name = "ammo box (.45-70)"
- desc = "A box of top grade .45-70 ammo. These rounds do significant damage with average performance against armor."
- icon_state = "4570"
- ammo_type = /obj/item/ammo_casing/a4570
- max_ammo = 18
-
-/obj/item/ammo_box/a4570/match
- name = "ammo box (.45-70 match)"
- desc = "A 18-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
- icon_state = "4570-match"
- ammo_type = /obj/item/ammo_casing/a4570/match
-
-
-/obj/item/ammo_box/a4570/hp
- name = "ammo box (.45-70 hollow point)"
- desc = "A 18-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones."
- icon_state = "4570-hp"
- ammo_type = /obj/item/ammo_casing/a4570/hp
-
-/obj/item/ammo_box/a4570/explosive
- name = "ammo box (.45-70 explosive)"
- desc = "A 18-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs."
- icon_state = "4570-explosive"
- ammo_type = /obj/item/ammo_casing/a4570/explosive
-
-
-// .38 special Speed Loaders (Colt Detective Special)
-
-/obj/item/ammo_box/c38
- name = "speed loader (.38 special)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor."
- icon_state = "speedloader_38-6"
- base_icon_state = "speedloader_38"
- ammo_type = /obj/item/ammo_casing/c38
- caliber = ".38"
- max_ammo = 6
- multiple_sprites = AMMO_BOX_PER_BULLET
- custom_materials = list(/datum/material/iron = 15000)
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/c38/trac
- name = "speed loader (.38 TRAC)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit."
- ammo_type = /obj/item/ammo_casing/c38/trac
-
-/obj/item/ammo_box/c38/match
- name = "speed loader (.38 match)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
- ammo_type = /obj/item/ammo_casing/c38/match
-
-/obj/item/ammo_box/c38/match/bouncy
- name = "speed loader (.38 rubber)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with."
- ammo_type = /obj/item/ammo_casing/c38/match/bouncy
-
-/obj/item/ammo_box/c38/dumdum
- name = "speed loader (.38 dum-dum)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage."
- ammo_type = /obj/item/ammo_casing/c38/dumdum
-
-/obj/item/ammo_box/c38/hotshot
- name = "speed loader (.38 hearth)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hearthwine bullets contain an incendiary payload that set targets alight."
- ammo_type = /obj/item/ammo_casing/c38/hotshot
-
-/obj/item/ammo_box/c38/iceblox
- name = "speed loader (.38 chilled)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These icewine bullets contain a cryogenic payload that chills targets."
- ammo_type = /obj/item/ammo_casing/c38/iceblox
-
-/obj/item/ammo_box/c38/empty
- start_empty = TRUE
-
-// 8x58mm Stripper Clip (SSG-669C)
-
-/obj/item/ammo_box/a858
- name = "stripper clip (8x58mm)"
- desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration."
- icon_state = "enbloc_858"
- ammo_type = /obj/item/ammo_casing/caseless/a858
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- instant_load = TRUE
-
-/obj/item/ammo_box/a858/empty
- start_empty = TRUE
-
-// .308 Stripper Clip (Vickland)
-
-/obj/item/ammo_box/vickland_a308
- name = "stripper clip (.308)"
- desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration."
- icon_state = "stripper_308-5"
- base_icon_state = "stripper_308"
- ammo_type = /obj/item/ammo_casing/a308
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/vickland_a308/empty
- start_empty = TRUE
-
-// .300 Magnum Stripper Clip (Scout)
-
-/obj/item/ammo_box/a300
- name = "stripper clip (.300 Magnum)"
- desc = "A 5-round stripper clip for the Scout Rifle. These rounds do great damage with significant armor penetration."
- icon_state = "300m"
- ammo_type = /obj/item/ammo_casing/a300
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a300/empty
- start_empty = TRUE
-// 7.62 Stripper Clip (Polymer Survivor Rifle)
-
-/obj/item/ammo_box/a762_stripper
- name = "stripper clip (7.62)"
- desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration."
- icon_state = "stripper_308-5"
- base_icon_state = "stripper_308"
- ammo_type = /obj/item/ammo_casing/a762_40
- caliber = "7.62x40mm"
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a762_stripper/empty
- start_empty = TRUE
-// Ferromagnetic Pellet Speed Loader (Claris)
-
-/obj/item/ammo_box/amagpellet_claris
- name = "\improper Claris speed loader (ferromagnetic pellet)"
- desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration."
- icon_state = "claris-sl-1"
- base_icon_state = "claris-sl"
- ammo_type = /obj/item/ammo_casing/caseless/gauss
- max_ammo = 22
- multiple_sprites = AMMO_BOX_FULL_EMPTY
- item_flags = NO_MAT_REDEMPTION
- instant_load = TRUE
-
-// Ammo Boxes
-
-/obj/item/ammo_box/c38_box
- name = "ammo box (.38)"
- desc = "A box of standard .38 Special ammo."
- icon_state = "38box"
- ammo_type = /obj/item/ammo_casing/c38
- max_ammo = 50
-
-/obj/item/ammo_box/c38_box/surplus
- name = "ammo box (.38 surplus)"
- desc = "A box of low-quality .38 Special ammo."
- icon_state = "38box-surplus"
- ammo_type = /obj/item/ammo_casing/c38/surplus
-
-/obj/item/ammo_box/c38_box/hotshot
- name = "ammo box (.38 hearth)"
- desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire."
- icon_state = "38hotshot"
- ammo_type = /obj/item/ammo_casing/c38/hotshot
-
-/obj/item/ammo_box/c38_box/iceblox
- name = "ammo box (.38 chilled)"
- desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down."
- icon_state = "38iceblox"
- ammo_type = /obj/item/ammo_casing/c38/iceblox
-
-/obj/item/ammo_box/a12g
- name = "ammo box (12g buckshot)"
- desc = "A box of 12-gauge buckshot shells, devastating at close range."
- icon_state = "12gbox-buckshot"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- max_ammo = 25
-
-/obj/item/ammo_box/a12g/slug
- name = "ammo box (12g slug)"
- desc = "A box of 12-gauge slugs, for improved accuracy and penetration."
- icon_state = "12gbox-slug"
- ammo_type = /obj/item/ammo_casing/shotgun
-
-/obj/item/ammo_box/a12g/beanbag
- name = "ammo box (12g beanbag)"
- desc = "A box of 12-gauge beanbag shells, for incapacitating targets."
- icon_state = "12gbox-beanbag"
- ammo_type = /obj/item/ammo_casing/shotgun/beanbag
-
-/obj/item/ammo_box/a12g/rubbershot
- name = "ammo box (12g rubbershot)"
- desc = "A box of 12-gauge rubbershot shells, designed for riot control."
- icon_state = "12gbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
-
-/obj/item/ammo_box/a12g/blanks
- name = "ammo box (12g blanks)"
- desc = "A box of 12-gauge blank shells, designed for training."
- icon_state ="12gbox-slug"
- ammo_type = /obj/item/ammo_casing/shotgun/blank
-
-/obj/item/ammo_box/c9mm
- name = "ammo box (9mm)"
- desc = "A box of standard 9mm ammo."
- icon_state = "9mmbox"
- ammo_type = /obj/item/ammo_casing/c9mm
- max_ammo = 50
-
-/obj/item/ammo_box/c9mm/surplus
- name = "ammo box (9mm surplus)"
- desc = "A box of low-quality 9mm ammo."
- icon_state = "9mmbox-surplus"
- ammo_type = /obj/item/ammo_casing/c9mm/surplus
-
-/obj/item/ammo_box/c9mm/rubbershot
- name = "ammo box (9mm rubbershot)"
- desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "9mmbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/c9mm/rubber
-
-/obj/item/ammo_box/c9mm/ap
- name = "ammo box (9mm armor-piercing)"
- desc = "A box of 9mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "9mmbox-ap"
- ammo_type = /obj/item/ammo_casing/c9mm/ap
-
-/obj/item/ammo_box/c9mm/hp
- name = "ammo box (9mm hollow point)"
- desc = "A box of 9mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "9mmbox-hp"
- ammo_type = /obj/item/ammo_casing/c9mm/hp
-
-/obj/item/ammo_box/c9mm/fire
- name = "ammo box (9mm incendiary)"
- desc = "A box of 9mm incendiary ammo, designed to ignite targets at the cost of initial damage."
- icon_state = "9mmbox-incendiary"
- ammo_type = /obj/item/ammo_casing/c9mm/inc
-
-/obj/item/ammo_box/c10mm
- name = "ammo box (10mm)"
- desc = "A box of standard 10mm ammo."
- icon_state = "10mmbox"
- ammo_type = /obj/item/ammo_casing/c10mm
- max_ammo = 50
-
-/obj/item/ammo_box/c10mm/surplus
- name = "ammo box (10mm surplus)"
- desc = "A box of low-quality 10mm ammo."
- icon_state = "10mmbox-surplus"
- ammo_type = /obj/item/ammo_casing/c10mm/surplus
-
-/obj/item/ammo_box/c10mm/rubbershot
- name = "ammo box (10mm rubbershot)"
- desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "10mmbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/c10mm/rubber
-
-/obj/item/ammo_box/c10mm/ap
- name = "ammo box (10mm armor-piercing)"
- desc = "A box of 10mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "10mmbox-ap"
- ammo_type = /obj/item/ammo_casing/c10mm/ap
-
-/obj/item/ammo_box/c10mm/hp
- name = "ammo box (10mm hollow point)"
- desc = "A box of 10mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "10mmbox-hp"
- ammo_type = /obj/item/ammo_casing/c10mm/hp
-
-/obj/item/ammo_box/c10mm/fire
- name = "ammo box (10mm incendiary)"
- desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage."
- icon_state = "10mmbox-incendiary"
- ammo_type = /obj/item/ammo_casing/c10mm/inc
-
-/obj/item/ammo_box/c45
- name = "ammo box (.45)"
- desc = "A box of standard .45 ammo."
- icon_state = "45box"
- ammo_type = /obj/item/ammo_casing/c45
- max_ammo = 50
-
-/obj/item/ammo_box/c45/surplus
- name = "ammo box (.45 surplus)"
- desc = "A box of low-quality .45 ammo."
- icon_state = "45box-surplus"
- ammo_type = /obj/item/ammo_casing/c45/surplus
-
-/obj/item/ammo_box/c45/rubbershot
- name = "ammo box (.45 rubbershot)"
- desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "45box-rubbershot"
- ammo_type = /obj/item/ammo_casing/c45/rubber
-
-/obj/item/ammo_box/c45/ap
- name = "ammo box (.45 armor-piercing)"
- desc = "A box of .45 armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "45box-ap"
- ammo_type = /obj/item/ammo_casing/c45/ap
-
-/obj/item/ammo_box/c45/hp
- name = "ammo box (.45 hollow point)"
- desc = "A box of .45 hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "45box-hp"
- ammo_type = /obj/item/ammo_casing/c45/hp
-
-/obj/item/ammo_box/c45/fire
- name = "ammo box (.45 incendiary)"
- desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage."
- icon_state = "45box-incendiary"
- ammo_type = /obj/item/ammo_casing/c45/inc
-
-/obj/item/ammo_box/c556mmHITP
- name = "ammo box (5.56mm HITP caseless)"
- desc = "A box of 5.56mm HITP caseless ammo, a SolGov standard."
- icon_state = "556mmHITPbox"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm
- max_ammo = 50
-
-/obj/item/ammo_box/c556mmHITP/surplus
- name = "ammo box (5.56mm HITP caseless surplus)"
- desc = "A box of low-quality 5.56mm HITP caseless ammo."
- icon_state = "556mmHITPbox-surplus"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/surplus
-
-/obj/item/ammo_box/c556mmHITP/rubbershot
- name = "ammo box (5.56mm HITP caseless rubbershot)"
- desc = "A box of 5.56mm HITP caseless rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "556mmHITPbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/rubbershot
-
-/obj/item/ammo_box/c556mmHITP/ap
- name = "ammo box (5.56mm HITP caseless armor-piercing)"
- desc = "A box of 5.56mm HITP caseless armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "556mmHITPbox-ap"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/ap
-
-/obj/item/ammo_box/c556mmHITP/hp
- name = "ammo box (5.56mm HITP caseless hollow point)"
- desc = "A box of 5.56mm HITP caseless hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "556mmHITPbox-hp"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/hp
-
-/obj/item/ammo_box/a40mm
- name = "ammo box (40mm grenades)"
- icon_state = "40mm"
- ammo_type = /obj/item/ammo_casing/a40mm
- max_ammo = 4
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/a762_40
- name = "ammo box (7.62x40mm CLIP)"
- icon_state = "a762_40box_big"
- ammo_type = /obj/item/ammo_casing/a762_40
- max_ammo = 120
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/a762_40/inteq
- icon_state = "a762_40box_big_inteq"
-
-/obj/item/ammo_box/a556_42
- name = "ammo box (5.56x42mm CLIP)"
- icon_state = "a556_42box_big"
- ammo_type = /obj/item/ammo_casing/a556_42
- max_ammo = 120
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/a308
- name = "ammo box (.308)"
- icon_state = "a308box"
- ammo_type = /obj/item/ammo_casing/a308
- max_ammo = 30
-
-/obj/item/ammo_box/a308/hunterspride //just an alternative graphic for srm ships
- icon_state = "a308box-HP"
-
-/obj/item/ammo_box/foambox
- name = "ammo box (Foam Darts)"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foambox"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 40
- custom_materials = list(/datum/material/iron = 500)
-
-/obj/item/ammo_box/foambox/riot
- icon_state = "foambox_riot"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- custom_materials = list(/datum/material/iron = 50000)
-
-/obj/item/ammo_box/c22lr_box
- name = "ammo box (.22 LR)"
- desc = "A box of standard .22 LR ammo."
- icon_state = "22lrbox"
- ammo_type = /obj/item/ammo_casing/c22lr
- max_ammo = 75
-
-/obj/item/ammo_box/a44roum_speedloader
- name = "speed loader (.44)"
- desc = "Designed to quickly reload revolvers."
- icon_state = "speedloader_38-6"
- base_icon_state = "speedloader_38"
- ammo_type = /obj/item/ammo_casing/a44roum
- caliber = ".44 Roumain"
- max_ammo = 6
- multiple_sprites = AMMO_BOX_PER_BULLET
- custom_materials = list(/datum/material/iron = 15000)
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a44roum_speedloader/empty
- start_empty = TRUE
-
-/obj/item/ammo_box/c57x39mm_box
- name = "ammo box (5.7x39mm)"
- desc = "A box of standard 5.7x39mm ammo."
- icon_state = "57x39mmbox"
- ammo_type = /obj/item/ammo_casing/c57x39mm
- max_ammo = 50
-
-
-/obj/item/ammo_box/c46x30mm_box
- name = "ammo box (4.6x30mm)"
- desc = "A box of standard 4.6x30mm ammo."
- icon_state = "46x30mmbox"
- ammo_type = /obj/item/ammo_casing/c46x30mm
- max_ammo = 50
-
-/obj/item/ammo_box/c8x50mm_box
- name = "ammo box (8x50mm)"
- desc = "A box of standard 8x50mm ammo."
- icon_state = "8x50mmbox"
- ammo_type = /obj/item/ammo_casing/a8_50r
- max_ammo = 25
-
-/obj/item/ammo_box/ferropelletbox
- name = "ammo box (ferromagnetic pellets)"
- desc = "A box of ferromagnetic pellets."
- icon_state = "ferropelletsbox"
- ammo_type = /obj/item/ammo_casing/caseless/gauss
- max_ammo = 50
-
-/obj/item/ammo_box/ferroslugbox
- name = "ammo box (ferromagnetic slugs)"
- desc = "A box of standard ferromagnetic slugs."
- icon_state = "ferroslugsbox"
- ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
- max_ammo = 20
-
-/obj/item/ammo_box/ferrolancebox
- name = "ammo box (ferromagnetic lances)"
- desc = "A box of standard ferromagnetic lances."
- icon_state = "ferrolancesbox"
- ammo_type = /obj/item/ammo_casing/caseless/gauss/lance
- max_ammo = 50
-
-/obj/item/ammo_box/c8x50mmhp_box
- name = "ammo box (8x50mm)"
- desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration."
- icon_state = "8x50mmbox-hp"
- ammo_type = /obj/item/ammo_casing/a8_50rhp
- max_ammo = 20
-
-/obj/item/ammo_box/a300_box
- name = "ammo box (.300 Magnum)"
- desc = "A box of standard .300 Magnum ammo."
- icon_state = "300box"
- ammo_type = /obj/item/ammo_casing/a300
- max_ammo = 20
-
-/obj/item/ammo_box/a65clip_box
- name = "ammo box (6.5x57mm CLIP)"
- desc = "A box of standard 6.5x57mm CLIP ammo."
- icon_state = "65box"
- ammo_type = /obj/item/ammo_casing/a65clip
- max_ammo = 20
-
-/obj/item/ammo_box/a65clip_box/syndicate
- icon_state = "65box_sa"
-
-/obj/item/ammo_box/a44roum
- name = "ammo box (.44 roumain)"
- desc = "A box of standard .44 roumain ammo."
- icon_state = "a44roum"
- ammo_type = /obj/item/ammo_casing/a44roum
- max_ammo = 50
-
-/obj/item/ammo_box/a44roum/rubber
- name = "ammo box (.44 roumain rubber)"
- desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "a44roum-rubber"
- ammo_type = /obj/item/ammo_casing/a44roum/rubber
- max_ammo = 50
-
-/obj/item/ammo_box/a44roum/hp
- name = "ammo box (.44 roumain hollow point)"
- desc = "A box of .44 roumain hollow point ammo, designed to cause massive damage at the cost of armor penetration."
- icon_state = "a44roum-hp"
- ammo_type = /obj/item/ammo_casing/a44roum/hp
- max_ammo = 50
-
-/obj/item/ammo_box/c299
- name = "ammo box (.299 Eoehoma caseless)"
- desc = "A box of .299 Eoehoma caseless, for use with the E-40 hybrid assault rifle."
- icon_state = "299box"
- ammo_type = /obj/item/ammo_casing/caseless/c299
- max_ammo = 120
- w_class = WEIGHT_CLASS_NORMAL // This is a lot of ammo
diff --git a/code/modules/projectiles/boxes_magazines/ammo_loaders.dm b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm
new file mode 100644
index 000000000000..70d9480493c6
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm
@@ -0,0 +1,176 @@
+// .357 Speed Loaders
+
+/obj/item/ammo_box/a357
+ name = "speed loader (.357)"
+ desc = "A 6-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor."
+ icon_state = "speedloader_357-6"
+ base_icon_state = "speedloader_357"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = ".357"
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ item_flags = NO_MAT_REDEMPTION
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a357/empty
+ start_empty = TRUE
+
+/obj/item/ammo_box/a357/match
+ name = "speed loader (.357 match)"
+ desc = "A 6-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ ammo_type = /obj/item/ammo_casing/a357/match
+
+/obj/item/ammo_box/a357/hp
+ name = "speed loader (.357 hollow point)"
+ desc = "A 6-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones."
+ ammo_type = /obj/item/ammo_casing/a357/hp
+
+// .38 special Speed Loaders
+
+/obj/item/ammo_box/c38
+ name = "speed loader (.38 special)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor."
+ icon_state = "speedloader_38-6"
+ base_icon_state = "speedloader_38"
+ ammo_type = /obj/item/ammo_casing/c38
+ caliber = ".38"
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ custom_materials = list(/datum/material/iron = 15000)
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/c38/trac
+ name = "speed loader (.38 TRAC)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit."
+ ammo_type = /obj/item/ammo_casing/c38/trac
+
+/obj/item/ammo_box/c38/match
+ name = "speed loader (.38 match)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ ammo_type = /obj/item/ammo_casing/c38/match
+
+/obj/item/ammo_box/c38/match/bouncy
+ name = "speed loader (.38 rubber)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with."
+ ammo_type = /obj/item/ammo_casing/c38/match/bouncy
+
+/obj/item/ammo_box/c38/dumdum
+ name = "speed loader (.38 dum-dum)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage."
+ ammo_type = /obj/item/ammo_casing/c38/dumdum
+
+/obj/item/ammo_box/c38/hotshot
+ name = "speed loader (.38 hot shot)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hot shot bullets contain an incendiary payload that set targets alight."
+ ammo_type = /obj/item/ammo_casing/c38/hotshot
+
+/obj/item/ammo_box/c38/iceblox
+ name = "speed loader (.38 iceblox)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These iceblox bullets contain a cryogenic payload that chills targets."
+ ammo_type = /obj/item/ammo_casing/c38/iceblox
+
+/obj/item/ammo_box/c38/empty
+ start_empty = TRUE
+
+// 8x58mm Stripper Clip
+
+/obj/item/ammo_box/a858
+ name = "stripper clip (8x58mm)"
+ desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration."
+ icon_state = "enbloc_858"
+ ammo_type = /obj/item/ammo_casing/caseless/a858
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ instant_load = TRUE
+
+/obj/item/ammo_box/a858/empty
+ start_empty = TRUE
+
+// .308 Stripper Clip
+
+/obj/item/ammo_box/vickland_a308
+ name = "stripper clip (.308)"
+ desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration."
+ icon_state = "stripper_308-5"
+ base_icon_state = "stripper_308"
+ ammo_type = /obj/item/ammo_casing/a308
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/vickland_a308/empty
+ start_empty = TRUE
+
+// .300 Magnum Stripper Clip
+
+/obj/item/ammo_box/a300
+ name = "stripper clip (.300 Magnum)"
+ desc = "A 5-round stripper clip for the Scout Rifle. These rounds do great damage with significant armor penetration."
+ icon_state = "300m"
+ ammo_type = /obj/item/ammo_casing/a300
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a300/empty
+ start_empty = TRUE
+
+// .300 Blackout Stripper Clip
+
+/obj/item/ammo_box/a762_stripper
+ name = "stripper clip (7.62)"
+ desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration."
+ icon_state = "stripper_308-5"
+ base_icon_state = "stripper_308"
+ ammo_type = /obj/item/ammo_casing/a762_40
+ caliber = "7.62x40mm"
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a762_stripper/empty
+ start_empty = TRUE
+
+// Ferromagnetic Pellet Speed Loader
+
+/obj/item/ammo_box/amagpellet_claris
+ name = "\improper Claris speed loader (ferromagnetic pellet)"
+ desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration."
+ icon_state = "claris-sl-1"
+ base_icon_state = "claris-sl"
+ ammo_type = /obj/item/ammo_casing/caseless/gauss
+ max_ammo = 22
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
+ item_flags = NO_MAT_REDEMPTION
+ instant_load = TRUE
+
+/obj/item/ammo_box/a40mm
+ name = "ammo box (40mm grenades)"
+ icon_state = "40mm"
+ ammo_type = /obj/item/ammo_casing/a40mm
+ max_ammo = 4
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_NORMAL
+
+// .44 Roumain speedloader
+
+/obj/item/ammo_box/a44roum_speedloader
+ name = "speed loader (.44)"
+ desc = "Designed to quickly reload revolvers."
+ icon_state = "speedloader_38-6"
+ base_icon_state = "speedloader_38"
+ ammo_type = /obj/item/ammo_casing/a44roum
+ caliber = ".44 Roumain"
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ custom_materials = list(/datum/material/iron = 15000)
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a44roum_speedloader/empty
+ start_empty = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm
new file mode 100644
index 000000000000..f1e84780cb1e
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm
@@ -0,0 +1,82 @@
+/**
+ * The ammo stack object itself, making this a magazine was the easiest way to handle it
+ * Practically every casing type needs an associated ammo stack type, because that was the easiest
+ * way for me to handle it.
+ */
+/obj/item/ammo_box/magazine/ammo_stack
+ name = "ammo stack"
+ desc = "A pile of live rounds."
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
+ icon_state = "pistol-brass"
+ base_icon_state = "pistol-brass"
+ item_flags = NO_PIXEL_RANDOM_DROP
+ multiple_sprites = AMMO_BOX_ONE_SPRITE
+ multiload = FALSE
+ start_empty = TRUE
+ max_ammo = 12
+
+/obj/item/ammo_box/magazine/ammo_stack/update_icon(updates)
+ icon = initial(icon)
+ cut_overlays()
+ return ..()
+
+/obj/item/ammo_box/magazine/ammo_stack/update_icon_state()
+ . = ..()
+ cut_overlays()
+ icon_state = ""
+ for(var/casing in stored_ammo)
+ var/image/bullet = image(initial(icon), src, "[base_icon_state]")
+ bullet.pixel_x = rand(-8, 8)
+ bullet.pixel_y = rand(-8, 8)
+ bullet.transform = bullet.transform.Turn(round(45 * rand(0, 32) / 2)) //this is the equation Eris uses on their bullet stacks
+ add_overlay(bullet)
+ return UPDATE_ICON_STATE | UPDATE_OVERLAYS
+
+/obj/item/ammo_box/magazine/ammo_stack/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ var/loc_before_del = loc
+ while(LAZYLEN(stored_ammo))
+ var/obj/item/ammo = get_round(FALSE)
+ ammo.forceMove(loc_before_del)
+ ammo.throw_at(loc_before_del)
+ update_ammo_count()
+
+/obj/item/ammo_box/magazine/ammo_stack/update_ammo_count()
+ . = ..()
+ check_for_del()
+
+/obj/item/ammo_box/magazine/ammo_stack/proc/check_for_del()
+ . = FALSE
+ if((ammo_count() <= 0) && !QDELETED(src))
+ qdel(src)
+ return
+
+/obj/item/ammo_box/magazine/ammo_stack/attackby(obj/item/handful, mob/user, params, silent = FALSE, replace_spent = 0)
+ var/num_loaded = 0
+ if(!can_load(user))
+ return
+
+ if(istype(handful, /obj/item/ammo_box))
+ var/obj/item/ammo_box/ammo_box = handful
+ for(var/obj/item/ammo_casing/casing in ammo_box.stored_ammo)
+ var/did_load = give_round(casing, replace_spent)
+ if(did_load)
+ ammo_box.stored_ammo -= casing
+ num_loaded++
+ if(!did_load || !multiload)
+ break
+ if(num_loaded)
+ ammo_box.update_ammo_count()
+
+ if(istype(handful, /obj/item/ammo_casing))
+ var/obj/item/ammo_casing/casing = handful
+ if(give_round(casing, replace_spent))
+ user.transferItemToLoc(casing, src, TRUE)
+ num_loaded++
+ casing.update_appearance()
+
+ if(num_loaded)
+ if(!silent)
+ to_chat(user, span_notice("You load [num_loaded] shell\s into \the [src]!"))
+ playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
+ update_ammo_count()
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm
new file mode 100644
index 000000000000..8a28920efe6a
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm
@@ -0,0 +1,21 @@
+/obj/item/ammo_box/magazine/ammo_stack/prefilled
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/Initialize(mapload)
+ make_stack()
+ update_appearance()
+ . = ..()
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/proc/make_stack()
+ var/obj/item/ammo_casing/to_copy = ammo_type
+ src.top_off()
+ caliber = to_copy.caliber
+ base_icon_state = "[initial(to_copy.icon_state)][to_copy.bullet_skin ? "-[to_copy.bullet_skin]" : ""]"
+ name = "handful of [to_copy.name]s"
+
+/obj/item/storage/box/ammo //base type, don't use this!
+ name = "box of default ammo"
+ desc = "A box of ammunition. Not for consumption."
+ icon = 'icons/obj/ammunition/ammo_boxes.dmi'
+ icon_state = "9mmbox"
+ illustration = null
+ foldable = null
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
new file mode 100644
index 000000000000..ac82cf6bcebd
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
@@ -0,0 +1,41 @@
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet
+ ammo_type = /obj/item/ammo_casing/caseless/gauss
+
+/obj/item/storage/box/ammo/ferropellet
+ name = "box of ferromagnetic pellets"
+ desc = "A box of ferromagnetic pellets for gauss firearms."
+ icon_state = "ferropelletsbox"
+
+/obj/item/storage/box/ammo/ferropellet/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
+
+/obj/item/storage/box/ammo/ferroslug
+ name = "box of ferromagnetic slugs"
+ desc = "A box of standard ferromagnetic slugs for gauss firearms."
+ icon_state = "ferroslugsbox"
+
+/obj/item/storage/box/ammo/ferroslug/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/lance
+
+/obj/item/storage/box/ammo/ferrolance
+ name = "box of ferromagnetic lances"
+ desc = "A box of standard ferromagnetic lances for gauss firearms."
+ icon_state = "ferrolancesbox"
+
+/obj/item/storage/box/ammo/ferrolance/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm
new file mode 100644
index 000000000000..b98da1f81000
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm
@@ -0,0 +1,15 @@
+// 7.12x82mm (L6 SAW)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82
+ ammo_type = /obj/item/ammo_casing/mm712x82
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/ap
+ ammo_type = /obj/item/ammo_casing/mm712x82/ap
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/hp
+ ammo_type = /obj/item/ammo_casing/mm712x82/hp
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/incendiary
+ ammo_type = /obj/item/ammo_casing/mm712x82/inc
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/match
+ ammo_type = /obj/item/ammo_casing/mm712x82/match
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm
new file mode 100644
index 000000000000..a24599138238
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm
@@ -0,0 +1,26 @@
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+
+/obj/item/storage/box/ammo/foam_darts
+ name = "box of foam darts"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foambox"
+
+/obj/item/storage/box/ammo/foam_darts/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/storage/box/ammo/foam_darts/riot
+ name = "box of foam darts"
+ icon_state = "foambox_riot"
+
+/obj/item/storage/box/ammo/foam_darts/riot/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts/riot = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm
new file mode 100644
index 000000000000..68ea1a7faeb5
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm
@@ -0,0 +1,499 @@
+// 10mm (Stechkin)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm
+ ammo_type = /obj/item/ammo_casing/c10mm
+
+/obj/item/storage/box/ammo/c10mm
+ name = "box of 10mm ammo"
+ desc = "A box of standard 10mm ammo."
+ icon_state = "10mmbox"
+
+/obj/item/storage/box/ammo/c10mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/surplus
+ ammo_type = /obj/item/ammo_casing/c10mm/surplus
+
+/obj/item/storage/box/ammo/c10mm_surplus
+ name = "box of surplus 10mm ammo"
+ desc = "A box of low-quality 10mm ammo."
+ icon_state = "10mmbox-surplus"
+
+/obj/item/storage/box/ammo/c10mm_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/ap
+ ammo_type = /obj/item/ammo_casing/c10mm/ap
+
+/obj/item/storage/box/ammo/c10mm_ap
+ name = "box of AP 10mm ammo"
+ desc = "A box of 10mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "10mmbox-ap"
+
+/obj/item/storage/box/ammo/c10mm_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/hp
+ ammo_type = /obj/item/ammo_casing/c10mm/hp
+
+/obj/item/storage/box/ammo/c10mm_hp
+ name = "box of HP 10mm ammo"
+ desc = "A box of 10mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "10mmbox-hp"
+
+/obj/item/storage/box/ammo/c10mm_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/incendiary
+ ammo_type = /obj/item/ammo_casing/c10mm/inc
+
+/obj/item/storage/box/ammo/c10mm_incendiary
+ name = "box of incendiary 10mm ammo"
+ desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage."
+ icon_state = "10mmbox-incendiary"
+
+/obj/item/storage/box/ammo/c10mm_incendiary/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/incendiary = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/rubber
+ ammo_type = /obj/item/ammo_casing/c10mm/rubber
+
+/obj/item/storage/box/ammo/c10mm_rubber
+ name = "box of rubber 10mm ammo"
+ desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "10mmbox-rubbershot"
+
+/obj/item/storage/box/ammo/c10mm_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+// 9MM (Commander + SABR)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm
+ ammo_type = /obj/item/ammo_casing/c9mm
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/c9mm
+ name = "box of 9mm ammo"
+ desc = "A box of standard 9mm ammo."
+ icon_state = "9mmbox"
+
+/obj/item/storage/box/ammo/c9mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/surplus
+ ammo_type = /obj/item/ammo_casing/c9mm/surplus
+
+/obj/item/storage/box/ammo/c9mm_surplus
+ name = "box of surplus 9mm ammo"
+ desc = "A box of low-quality 9mm ammo."
+ icon_state = "9mmbox-surplus"
+
+/obj/item/storage/box/ammo/c9mm_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/surplus = 48)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm_ap
+ ammo_type = /obj/item/ammo_casing/c9mm/ap
+
+/obj/item/storage/box/ammo/c9mm/ap
+ name = "box of AP 9mm ammo"
+ desc = "A box of 9mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "9mmbox-ap"
+
+/obj/item/storage/box/ammo/c9mm_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm_ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/hp
+ ammo_type = /obj/item/ammo_casing/c9mm/hp
+
+/obj/item/storage/box/ammo/c9mm_hp
+ name = "box of HP 9mm ammo"
+ desc = "A box of 9mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "9mmbox-hp"
+
+/obj/item/storage/box/ammo/c9mm_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/incendiary
+ ammo_type = /obj/item/ammo_casing/c9mm/inc
+
+/obj/item/storage/box/ammo/c9mm_incendiary
+ name = "box of incendiary 9mm ammo"
+ desc = "A box of 9mm incendiary ammo, designed to ignite targets at the cost of initial damage."
+ icon_state = "9mmbox-incendiary"
+
+/obj/item/storage/box/ammo/c9mm_incendiary/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/incendiary = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/rubber
+ ammo_type = /obj/item/ammo_casing/c9mm/rubber
+
+/obj/item/storage/box/ammo/c9mm_rubber
+ name = "box of rubber 9mm ammo"
+ desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "9mmbox-rubbershot"
+
+/obj/item/storage/box/ammo/c9mm_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+// .45 (Candor + C20R)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45
+ ammo_type = /obj/item/ammo_casing/c45
+
+/obj/item/storage/box/ammo/c45
+ name = "box of .45 ammo"
+ desc = "A box of standard .45 ammo."
+ icon_state = "45box"
+
+/obj/item/storage/box/ammo/c45/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/surplus
+ ammo_type = /obj/item/ammo_casing/c45/surplus
+
+/obj/item/storage/box/ammo/c45_surplus
+ name = "box of surplus .45 ammo"
+ desc = "A box of low-quality .45 ammo."
+ icon_state = "45box-surplus"
+
+/obj/item/storage/box/ammo/c45_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/surplus = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/ap
+ ammo_type = /obj/item/ammo_casing/c45/ap
+
+/obj/item/storage/box/ammo/c45_ap
+ name = "box of AP .45 ammo"
+ desc = "A box of .45 armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "45box-ap"
+
+/obj/item/storage/box/ammo/c45_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/hp
+ ammo_type = /obj/item/ammo_casing/c45/hp
+
+/obj/item/storage/box/ammo/c45_hp
+ name = "box of HP .45 ammo"
+ desc = "A box of .45 hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "45box-hp"
+
+/obj/item/storage/box/ammo/c45_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/incendiary
+ ammo_type = /obj/item/ammo_casing/c45/inc
+
+/obj/item/storage/box/ammo/c45_incendiary
+ name = "box of incendiary .45 ammo"
+ desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage."
+ icon_state = "45box-incendiary"
+
+/obj/item/storage/box/ammo/c45_incendiary/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/incendiary = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/rubber
+ ammo_type = /obj/item/ammo_casing/c45/rubber
+
+/obj/item/storage/box/ammo/c45_rubber
+ name = "box of incendiary .45 ammo"
+ desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "45box-rubbershot"
+
+/obj/item/storage/box/ammo/c45_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+// .50 AE (Desert Eagle)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a50AE
+ ammo_type = /obj/item/ammo_casing/a50AE
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a50AE/hp
+ ammo_type = /obj/item/ammo_casing/a50AE/hp
+
+// .22 LR (Himehabu, Pounder)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c22lr
+ ammo_type = /obj/item/ammo_casing/c22lr
+
+/obj/item/storage/box/ammo/c22lr
+ name = "box of .22 LR ammo"
+ desc = "A box of standard .22 LR ammo."
+ icon_state = "22lrbox"
+
+/obj/item/storage/box/ammo/c22lr/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c22lr = 4)
+ generate_items_inside(items_inside,src)
+
+// .357
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357
+ ammo_type = /obj/item/ammo_casing/a357
+
+/obj/item/storage/box/ammo/a357
+ name = "box of .357 ammo"
+ desc = "A box of standard .357 ammo."
+ icon_state = "357box"
+
+/obj/item/storage/box/ammo/a357/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/match
+ ammo_type = /obj/item/ammo_casing/a357/match
+
+/obj/item/storage/box/ammo/a357_match
+ name = "box of match .357 ammo"
+ desc = "A box of match .357 ammo."
+ icon_state = "357box-match"
+
+/obj/item/storage/box/ammo/a357_match/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/match = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/hp
+ ammo_type = /obj/item/ammo_casing/a357/hp
+
+/obj/item/storage/box/ammo/a357_hp
+ name = "box of HP .357 ammo"
+ desc = "A box of hollow point .357 ammo."
+ icon_state = "357box-hp"
+
+/obj/item/storage/box/ammo/a357_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/hp = 4)
+ generate_items_inside(items_inside,src)
+
+// .45-70 (Hunting Revolver, Beacon)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570
+ ammo_type = /obj/item/ammo_casing/a4570
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/a4570
+ name = "box of .45-70 ammo"
+ desc = "A box of top grade .45-70 ammo. These rounds do significant damage with average performance against armor."
+ icon_state = "4570"
+
+/obj/item/storage/box/ammo/a4570/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/match
+ ammo_type = /obj/item/ammo_casing/a4570/match
+
+/obj/item/storage/box/ammo/a4570_match
+ name = "box of HP match .45-70 ammo"
+ desc = "A 12-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ icon_state = "4570-match"
+
+/obj/item/storage/box/ammo/a4570_match/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/match = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/hp
+ ammo_type = /obj/item/ammo_casing/a4570/hp
+
+/obj/item/storage/box/ammo/a4570_hp
+ name = "box of HP .45-70 ammo"
+ desc = "A 12-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones."
+ icon_state = "4570-hp"
+
+/obj/item/storage/box/ammo/a4570_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/explosive
+ ammo_type = /obj/item/ammo_casing/a4570/explosive
+
+/obj/item/storage/box/ammo/a4570_explosive
+ name = "box of explosive .45-70 ammo"
+ desc = "A 12-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs."
+ icon_state = "4570-explosive"
+
+/obj/item/storage/box/ammo/a4570_explosive/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/explosive = 4)
+ generate_items_inside(items_inside,src)
+
+// .38 Special
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38
+ ammo_type = /obj/item/ammo_casing/c38
+
+/obj/item/storage/box/ammo/c38
+ name = "box of .38 ammo"
+ desc = "A box of standard .38 Special ammo."
+ icon_state = "38box"
+
+/obj/item/storage/box/ammo/c38/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/surplus
+ ammo_type = /obj/item/ammo_casing/c38/surplus
+
+/obj/item/storage/box/ammo/c38_surplus
+ name = "box of surplus .38 ammo"
+ desc = "A box of low-quality .38 Special ammo."
+ icon_state = "38box-surplus"
+
+/obj/item/storage/box/ammo/c38_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/surplus = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/trac
+ ammo_type = /obj/item/ammo_casing/c38/trac
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/match
+ ammo_type = /obj/item/ammo_casing/c38/match
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/bouncy
+ ammo_type = /obj/item/ammo_casing/c38/match/bouncy
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/dumdum
+ ammo_type = /obj/item/ammo_casing/c38/dumdum
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/hotshot
+ ammo_type = /obj/item/ammo_casing/c38/hotshot
+
+/obj/item/storage/box/ammo/c38_hotshot
+ name = "box of .38 hearth ammo"
+ desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire."
+ icon_state = "38hotshot"
+
+/obj/item/storage/box/ammo/c38_hotshot/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/hotshot = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/iceblox
+ ammo_type = /obj/item/ammo_casing/c38/iceblox
+
+/obj/item/storage/box/ammo/c38_iceblox
+ name = "box of .38 chilled ammo"
+ desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down."
+ icon_state = "38iceblox"
+
+/obj/item/storage/box/ammo/c38_iceblox/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/iceblox = 4)
+ generate_items_inside(items_inside,src)
+
+// 44 Roumain
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum
+ ammo_type = /obj/item/ammo_casing/a44roum
+
+/obj/item/storage/box/ammo/a44roum
+ name = "box of .44 roumain ammo"
+ desc = "A box of standard .44 roumain ammo."
+ icon_state = "a44roum"
+
+/obj/item/storage/box/ammo/a44roum/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/rubber
+ ammo_type = /obj/item/ammo_casing/a44roum/rubber
+
+/obj/item/storage/box/ammo/a44roum_rubber
+ name = "box of rubber .44 roumain ammo"
+ desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "a44roum-rubber"
+
+/obj/item/storage/box/ammo/a44roum_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/hp
+ ammo_type = /obj/item/ammo_casing/a44roum/hp
+
+/obj/item/storage/box/ammo/a44roum_hp
+ name = "box of HP .44 roumain ammo"
+ desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "a44roum-rubber"
+
+/obj/item/storage/box/ammo/a44roum_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/hp = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm
new file mode 100644
index 000000000000..d22f62ec2165
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm
@@ -0,0 +1,152 @@
+// 8x50mmR (Illestren Hunting Rifle)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r
+ ammo_type = /obj/item/ammo_casing/a8_50r
+ max_ammo = 10
+
+/obj/item/storage/box/ammo/a8_50r
+ name = "box of 8x50mm ammo"
+ desc = "A box of standard 8x50mm ammo."
+ icon_state = "8x50mmbox"
+
+/obj/item/storage/box/ammo/a8_50r/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r/hp
+ ammo_type = /obj/item/ammo_casing/a8_50rhp
+
+/obj/item/storage/box/ammo/a8_50r_hp
+ name = "box of HP 8x50mm ammo"
+ desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration."
+ icon_state = "8x50mmbox-hp"
+
+/obj/item/storage/box/ammo/a8_50r_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r/hp = 4)
+ generate_items_inside(items_inside,src)
+
+// 8x58mm Caseless (SSG-669C)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a858
+ ammo_type = /obj/item/ammo_casing/caseless/a858
+
+// .300 Magnum (Smile Rifle)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a300
+ ammo_type = /obj/item/ammo_casing/a300
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/a300
+ name = "box of .300 magnum ammo"
+ desc = "A box of standard .300 Magnum ammo."
+ icon_state = "300box"
+
+/obj/item/storage/box/ammo/a300/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a300 = 4)
+ generate_items_inside(items_inside,src)
+
+// 5.56x42mm CLIP (CM82, Hydra variants)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a556_42
+ ammo_type = /obj/item/ammo_casing/a556_42
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/a556_42
+ name = "box of 5.56x42mm CLIP ammo"
+ desc = "A box of standard 5.56x42mm CLIP ammo."
+ icon_state = "a556_42box_big"
+
+/obj/item/storage/box/ammo/a556_42/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a556_42 = 4)
+ generate_items_inside(items_inside,src)
+
+// 5.45x39mm (SKM-24v)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a545_39
+ ammo_type = /obj/item/ammo_casing/a545_39
+ max_ammo = 10
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a545_39/recycled
+ ammo_type = /obj/item/ammo_casing/a545_39/recycled
+
+// 7.62x40mm CLIP (SKM Rifles)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a762_40
+ ammo_type = /obj/item/ammo_casing/a762_40
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/a762_40
+ name = "box of 7.62x40mm CLIP ammo"
+ desc = "A box of standard 7.62x40mm CLIP ammo."
+ icon_state = "a762_40box_big"
+
+/obj/item/storage/box/ammo/a762_40/inteq
+ icon_state = "a762_40box_big_inteq"
+
+/obj/item/storage/box/ammo/a762_40/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a762_40 = 4)
+ generate_items_inside(items_inside,src)
+
+//.308 (M514 EBR & CM-GAL-S)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a308
+ ammo_type = /obj/item/ammo_casing/a308
+ max_ammo = 10
+
+/obj/item/storage/box/ammo/a308
+ name = "box of .308 ammo"
+ desc = "A box of standard .308 ammo."
+ icon_state = "a308box"
+
+/obj/item/storage/box/ammo/a308/hunterspride
+ icon_state = "a308box-HP"
+
+/obj/item/storage/box/ammo/a308/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a308 = 4)
+ generate_items_inside(items_inside,src)
+
+//.299 Eoehoma Caseless (E-40)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c299
+ ammo_type = /obj/item/ammo_casing/caseless/c299
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/c299
+ name = "box of .299 Eoehoma caseless ammo"
+ desc = "A box of .299 Eoehoma caseless, for use with the E-40 hybrid assault rifle."
+ icon_state = "299box"
+
+/obj/item/storage/box/ammo/c299/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c299 = 4)
+ generate_items_inside(items_inside,src)
+
+//6.5x57mm CLIP
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a65clip
+ ammo_type = /obj/item/ammo_casing/a65clip
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/a65clip
+ name = "box of 6.5x57mm CLIP ammo"
+ desc = "A box of standard 6.5x57mm CLIP ammo."
+ icon_state = "65box"
+
+/obj/item/storage/box/ammo/a65clip/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a65clip = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm
new file mode 100644
index 000000000000..f67800330724
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm
@@ -0,0 +1,79 @@
+// Shotshells
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun
+ max_ammo = 8 //make sure these values are consistent across the board with stack_size variable on respective ammo_casing
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/buckshot
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/storage/box/ammo/a12g_buckshot
+ name = "box of 12ga buckshot"
+ desc = "A box of 12-gauge buckshot shells, devastating at close range."
+ icon_state = "12gbox-buckshot"
+
+/obj/item/storage/box/ammo/a12g_buckshot/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/buckshot = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/slug
+ ammo_type = /obj/item/ammo_casing/shotgun
+
+/obj/item/storage/box/ammo/a12g_slug
+ name = "box of 12ga slugs"
+ desc = "A box of 12-gauge slugs, for improved accuracy and penetration."
+ icon_state = "12gbox-slug"
+
+/obj/item/storage/box/ammo/a12g_slug/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/slug = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/beanbag
+ ammo_type = /obj/item/ammo_casing/shotgun/beanbag
+
+/obj/item/storage/box/ammo/a12g_beanbag
+ name = "box of 12ga beanbags"
+ desc = "A box of 12-gauge beanbag shells, for incapacitating targets."
+ icon_state = "12gbox-beanbag"
+
+/obj/item/storage/box/ammo/a12g_beanbag/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/beanbag = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/rubber
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+
+/obj/item/storage/box/ammo/a12g_rubbershot
+ name = "box of 12ga beanbags"
+ desc = "A box of 12-gauge rubbershot shells, designed for riot control."
+ icon_state = "12gbox-rubbershot"
+
+/obj/item/storage/box/ammo/a12g_beanbag/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/blank
+ ammo_type = /obj/item/ammo_casing/shotgun/blank
+
+/obj/item/storage/box/ammo/a12g_blank
+ name = "box of 12ga blanks"
+ desc = "A box of 12-gauge blank shells, designed for training."
+ icon_state = "12gbox-slug" //needs icon
+
+/obj/item/storage/box/ammo/a12g_blank/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/blank = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/incendiary
+ ammo_type = /obj/item/ammo_casing/shotgun/incendiary
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/improvised
+ ammo_type = /obj/item/ammo_casing/shotgun/improvised
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm
new file mode 100644
index 000000000000..d550f5e461ba
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm
@@ -0,0 +1,113 @@
+// 4.6x30mm (WT-550 Automatic Rifle & SKM-24v)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm
+ ammo_type = /obj/item/ammo_casing/c46x30mm
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/c46x30mm
+ name = "box of 4.6x30mm ammo"
+ desc = "A box of standard 4.6x30mm ammo."
+ icon_state = "46x30mmbox"
+
+/obj/item/storage/box/ammo/c46x30mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm/ap
+ ammo_type = /obj/item/ammo_casing/c46x30mm/ap
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm/incendiary
+ ammo_type = /obj/item/ammo_casing/c46x30mm/inc
+
+// 4.73x33mm caseless (Solar)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c47x33mm
+ ammo_type = /obj/item/ammo_casing/caseless/c47x33mm
+
+// 5.56mm HITP caseless (Pistole C)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/c556mm
+ name = "box of 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless ammo, a SolGov standard."
+ icon_state = "556mmHITPbox"
+
+/obj/item/storage/box/ammo/c556mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/surplus
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/surplus
+
+/obj/item/storage/box/ammo/c556mm_surplus
+ name = "box of surplus 5.56mm HITP caseless ammo"
+ desc = "A box of low-quality 5.56mm HITP caseless ammo."
+ icon_state = "556mmHITPbox-surplus"
+
+/obj/item/storage/box/ammo/c556mm_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/surplus = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/ap
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/ap
+
+/obj/item/storage/box/ammo/c556mm_ap
+ name = "box of AP 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "556mmHITPbox-ap"
+
+/obj/item/storage/box/ammo/c556mm_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/hp
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/hp
+
+/obj/item/storage/box/ammo/c556mm_hp
+ name = "box of HP 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "556mmHITPbox-hp"
+
+/obj/item/storage/box/ammo/c556mm_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/rubbershot
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/rubbershot
+
+/obj/item/storage/box/ammo/c556mm_rubber
+ name = "box of rubber 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "556mmHITPbox-rubbershot"
+
+/obj/item/storage/box/ammo/c556mm_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/rubbershot = 4)
+ generate_items_inside(items_inside,src)
+
+// 5.7x39mm (Asp and Sidewinder)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c57x39
+ ammo_type = /obj/item/ammo_casing/c57x39mm
+
+/obj/item/storage/box/ammo/c57x39
+ name = "box of 5.7x39mm ammo"
+ desc = "A box of standard 5.7x39mm ammo."
+ icon_state = "57x39mmbox"
+
+/obj/item/storage/box/ammo/c57x39/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c57x39 = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm
new file mode 100644
index 000000000000..8ee54bcd9099
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm
@@ -0,0 +1,9 @@
+// .50 BMG (Sniper)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50
+ ammo_type = /obj/item/ammo_casing/p50
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50/soporific
+ ammo_type = /obj/item/ammo_casing/p50/soporific
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50/penetrator
+ ammo_type = /obj/item/ammo_casing/p50/penetrator
diff --git a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm b/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm
deleted file mode 100644
index 2c88824623e2..000000000000
--- a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm
+++ /dev/null
@@ -1,53 +0,0 @@
-/obj/item/ammo_box/generic
- name = "generic ammo box"
- desc = "A generic, unbranded box of ammo. It doesn't have great capacity, but it can hold a variety of different calibers."
- max_ammo = 20
- start_empty = TRUE
- icon_state = "generic-ammo"
- /// Does the box currently have an ammo type set?
- var/ammo_set = FALSE
- /// Name of the currently set ammo type
- var/ammo_name
-
-/obj/item/ammo_box/generic/update_ammo_count()
- . = ..()
- if(LAZYLEN(stored_ammo) == 0)
- ammo_set = FALSE
- ammo_type = /obj/item/ammo_casing
-
-/obj/item/ammo_box/generic/proc/update_max_ammo(obj/item/ammo_casing/ammo)
- if(ammo.bullet_per_box)
- max_ammo = round(ammo.bullet_per_box)
- else
- max_ammo = 10
-
- return
-
-/obj/item/ammo_box/generic/attackby(obj/item/attacking_obj, mob/user, params, silent, replace_spent)
- . = ..()
-
- if(!ammo_set && istype(attacking_obj, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/ammo_load = attacking_obj.type
- ammo_type = ammo_load
- ammo_set = TRUE
- ammo_name = attacking_obj.name
- update_max_ammo(attacking_obj)
- to_chat(user, span_notice("You set the box to hold [attacking_obj]!"))
-
- if(istype(attacking_obj, /obj/item/pen))
- if(!user.is_literate())
- to_chat(user, span_notice("You scribble illegibly on the cover of [src]!"))
- return
- var/inputvalue = stripped_input(user, "What would you like to label the box?", "Box Labelling", "", MAX_NAME_LEN)
-
- if(!inputvalue)
- return
-
- if(user.canUseTopic(src, BE_CLOSE))
- name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]"
-
-/obj/item/ammo_box/generic/examine(mob/user)
- . = ..()
- . += span_notice("[ammo_set ? "It's set to hold [ammo_name]\s. The box can hold up to [max_ammo] rounds." : "It doesn't have an ammo type set. Use a bullet on the box to set it."]")
- . += span_notice("You can use a pen on it to rename the box.")
-
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index f64586871ccf..877079684ed2 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -203,12 +203,14 @@
/obj/item/gun/ballistic/attackby(obj/item/A, mob/user, params)
. = ..()
- if (.)
+
+ if(.)
return
+
if(sealed_magazine)
to_chat(user, span_warning("The magazine on [src] is sealed and cannot be reloaded!"))
return
- if (!internal_magazine && istype(A, /obj/item/ammo_box/magazine))
+ if(!internal_magazine && istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if (!magazine)
insert_magazine(user, AM)
@@ -218,7 +220,8 @@
else
to_chat(user, "There's already a [magazine_wording] in \the [src].")
return
- if (istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box))
+
+ if(istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box/magazine/ammo_stack))
if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine)
if (chambered && !chambered.BB)
chambered.on_eject(shooter = user)
@@ -235,6 +238,7 @@
if (can_be_sawn_off)
if (try_sawoff(user, A))
return
+
return FALSE
///Prefire empty checks for the bolt drop
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index e81b57d43f37..4fcc4cf56b14 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -39,6 +39,7 @@
load_empty_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
eject_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
+ show_magazine_on_sprite = TRUE
EMPTY_GUN_HELPER(automatic/pistol/candor)
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 5bded61f2cc6..479e35794e60 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -596,9 +596,10 @@ EMPTY_GUN_HELPER(revolver/detective)
mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
icon_state = "ashhand"
- item_state = "hp_generic"
+ item_state = "ashhand"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev4570
fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
+ rack_sound = 'sound/weapons/gun/revolver/viper_prime.ogg'
manufacturer = MANUFACTURER_HUNTERSPRIDE
gate_loaded = TRUE
fire_delay = 0.6 SECONDS
@@ -643,20 +644,22 @@ EMPTY_GUN_HELPER(revolver/detective)
righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
mob_overlay_icon = 'icons/obj/guns/manufacturer/hunterspride/onmob.dmi'
icon_state = "shadow"
- item_state = "hp_generic"
+ item_state = "shadow"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev44
manufacturer = MANUFACTURER_HUNTERSPRIDE
obj_flags = UNIQUE_RENAME
gate_loaded = TRUE
- unique_reskin = list("Shadow" = "shadow",
- "Army" = "shadow_army",
+ unique_reskin = list(\
+ "Shadow" = "shadow",
+ "Cattleman" = "shadow_cattleman",
"General" = "shadow_general",
- "Frontier Scout" = "shadow_frontier",
- "Nanotrasen Special" = "shadow_nanotrasen",
+ "Sheriff" = "shadow_sheriff",
+ "Cobra" = "shadow_cobra",
"Hired Gun" = "shadow_hiredgun",
"Buntline" = "shadow_buntline",
- "Cavalry Special" = "shadow_cavalry"
+ "Cavalry" = "shadow_cavalry",
+ "Lanchester Special" = "shadow_lanchester"
)
recoil = 0 //weaker than normal revolver, no recoil
@@ -668,3 +671,8 @@ EMPTY_GUN_HELPER(revolver/detective)
/obj/item/gun/ballistic/revolver/shadow/no_mag
spawnwithmagazine = FALSE
+
+/obj/item/gun/ballistic/revolver/shadow/reskin_obj(mob/M)
+ . = ..()
+ if(current_skin)
+ item_state = unique_reskin[current_skin]
diff --git a/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm b/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm
index 18239e94dd7e..c6755bc808fb 100644
--- a/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm
+++ b/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm
@@ -531,6 +531,8 @@ EMPTY_GUN_HELPER(automatic/smg/sidewinder)
fire_delay = 1 SECONDS
+ slot_flags = ITEM_SLOT_BACK
+
show_magazine_on_sprite = TRUE
unique_mag_sprites_for_variants = TRUE
show_ammo_capacity_on_magazine_sprite = TRUE
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
index 1d5d48c9b826..7955c2b41557 100644
--- a/code/modules/projectiles/projectile/bullets/rifle.dm
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -100,3 +100,8 @@
light_system = MOVABLE_LIGHT
light_color = COLOR_SOFT_RED
light_range = 2
+
+/obj/projectile/bullet/a65clip/rubber //"rubber"
+ name = "6.5x57mm CLIP rubber bullet"
+ damage = 10
+ stamina = 40
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
index 9b11c74e4c1d..5e838b61161c 100644
--- a/code/modules/projectiles/projectile/bullets/smg.dm
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -4,6 +4,11 @@
name = "5.7x39mm bullet"
damage = 20
+/obj/projectile/bullet/c57x39mm/rubber
+ name = "5.7x39mm rubber bullet"
+ damage = 5
+ stamina = 20
+
// 4.6x30mm (WT-550 Automatic Rifle & NT-SVG)
/obj/projectile/bullet/c46x30mm
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 0b679dfcc4bf..5ac2370dc694 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -761,7 +761,7 @@
id = "foam_dart"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 500)
- build_path = /obj/item/ammo_box/foambox
+ build_path = /obj/item/storage/box/ammo/foam_darts
category = list("initial", "Misc")
/datum/design/handcuffs
@@ -785,7 +785,7 @@
id = "c38_surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c38_box/surplus
+ build_path = /obj/item/storage/box/ammo/c38_surplus
category = list("initial", "Security", "Ammo")
/datum/design/beanbag_slug
@@ -817,7 +817,7 @@
id = "riot_darts"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 50000) //Comes with 40 darts
- build_path = /obj/item/ammo_box/foambox/riot
+ build_path = /obj/item/storage/box/ammo/foam_darts/riot
category = list("initial", "Security")
/datum/design/c10mm_surplus
@@ -825,7 +825,7 @@
id = "c10mm-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c10mm/surplus
+ build_path = /obj/item/storage/box/ammo/c10mm_surplus
category = list("initial", "Security", "Ammo")
/datum/design/c45_surplus
@@ -833,7 +833,7 @@
id = "c45-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c45/surplus
+ build_path = /obj/item/storage/box/ammo/c45_surplus
category = list("initial", "Security", "Ammo")
/datum/design/c9mm_surplus
@@ -841,7 +841,7 @@
id = "c9mm-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm/surplus
+ build_path = /obj/item/storage/box/ammo/c9mm_surplus
category = list("initial", "Security", "Ammo")
/datum/design/c556mmHITP_surplus
@@ -849,15 +849,7 @@
id = "c556mmHITP-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c556mmHITP/surplus
- category = list("initial", "Security", "Ammo")
-
-/datum/design/generic_ammo_box
- name = "Generic Ammo Box"
- id = "ammo-generic"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(/datum/material/iron = 1500)
- build_path = /obj/item/ammo_box/generic
+ build_path = /obj/item/storage/box/ammo/c556mm_surplus
category = list("initial", "Security", "Ammo")
/datum/design/ammo_can
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 1c3edc8b7c32..a07f9d96dd80 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -288,8 +288,6 @@
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-//Shiptest edit - standard ammunition
-
/datum/design/buckshot_shell
name = "Buckshot Shell"
id = "buckshot_shell"
@@ -304,7 +302,7 @@
id = "c38"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c38_box
+ build_path = /obj/item/storage/box/ammo/c38
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -313,7 +311,7 @@
id = "c9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm
+ build_path = /obj/item/storage/box/ammo/c9mm
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -322,7 +320,7 @@
id = "c10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c10mm
+ build_path = /obj/item/storage/box/ammo/c10mm
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -331,7 +329,7 @@
id = "c45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c45
+ build_path = /obj/item/storage/box/ammo/c45
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -340,19 +338,17 @@
id = "c556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c556mmHITP
+ build_path = /obj/item/storage/box/ammo/c556mm
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-// WS edit - not so free rubbershot
-
/datum/design/rubbershot9mm
name = "Rubbershot 9mm ammo box"
desc = "A box full of less-than-lethal 9mm ammunition."
id = "rubbershot9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm/rubbershot
+ build_path = /obj/item/storage/box/ammo/c9mm_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -362,7 +358,7 @@
id = "rubbershot10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c10mm/rubbershot
+ build_path = /obj/item/storage/box/ammo/c10mm_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -372,7 +368,7 @@
id = "rubbershot45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c45/rubbershot
+ build_path = /obj/item/storage/box/ammo/c45_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -382,7 +378,7 @@
id = "rubbershot556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 18000)
- build_path = /obj/item/ammo_box/c556mmHITP/rubbershot
+ build_path = /obj/item/storage/box/ammo/c556mm_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -392,7 +388,7 @@
id = "ap9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c9mm/ap
+ build_path = /obj/item/storage/box/ammo/c9mm/ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -402,7 +398,7 @@
id = "ap10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c10mm/ap
+ build_path = /obj/item/storage/box/ammo/c10mm_ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -412,7 +408,7 @@
id = "ap45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c45/ap
+ build_path = /obj/item/storage/box/ammo/c45_ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -422,7 +418,7 @@
id = "ap556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 18000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c556mmHITP/ap
+ build_path = /obj/item/storage/box/ammo/c556mm_ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -432,7 +428,7 @@
id = "hp9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c9mm/hp
+ build_path = /obj/item/storage/box/ammo/c9mm_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -442,7 +438,7 @@
id = "hp10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c10mm/hp
+ build_path = /obj/item/storage/box/ammo/c10mm_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -452,7 +448,7 @@
id = "hp45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c45/hp
+ build_path = /obj/item/storage/box/ammo/c45_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -462,7 +458,7 @@
id = "hp556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 18000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c556mmHITP/hp
+ build_path = /obj/item/storage/box/ammo/c556mm_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -472,7 +468,7 @@
id = "inc9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000)
- build_path = /obj/item/ammo_box/c9mm/fire
+ build_path = /obj/item/storage/box/ammo/c9mm_incendiary
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -482,7 +478,7 @@
id = "inc10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000)
- build_path = /obj/item/ammo_box/c10mm/fire
+ build_path = /obj/item/storage/box/ammo/c10mm_incendiary
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -492,7 +488,7 @@
id = "inc45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000)
- build_path = /obj/item/ammo_box/c45/fire
+ build_path = /obj/item/storage/box/ammo/c45_incendiary
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -737,5 +733,5 @@
id = "c9mmautolathe"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm
+ build_path = /obj/item/storage/box/ammo/c9mm
category = list("Imported")
diff --git a/code/modules/research/xenobiology/crossbreeding/mutative.dm b/code/modules/research/xenobiology/crossbreeding/mutative.dm
index 6b58a7aa0c93..043e124641ab 100644
--- a/code/modules/research/xenobiology/crossbreeding/mutative.dm
+++ b/code/modules/research/xenobiology/crossbreeding/mutative.dm
@@ -25,8 +25,3 @@
/obj/item/slimecross/mutative/rainbow
colour = "rainbow"
effect_desc = "Hardens into a shard of slimy crystal. Prick yourself with it to bring forth a Slime Guardian."
-
-/obj/item/slimecross/mutative/rainbow/do_effect(mob/user)
- user.visible_message("[src] collapses in a chromatic flash, transforming into jagged crystal!")
- new /obj/item/guardiancreator/slime(get_turf(user))
- ..()
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 5bf2107a998b..e41da1eccfa5 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -10,7 +10,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/obj/machinery/quantumpad,
/obj/effect/mob_spawn,
/obj/effect/hierophant,
- /obj/structure/receiving_pad,
/obj/item/warp_cube,
/obj/machinery/rnd/production, //print tracking beacons, send shuttle
/obj/machinery/autolathe, //same
diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm
index 5b069756864d..04a91f09b5e4 100644
--- a/code/modules/spells/spell_types/pointed/mind_transfer.dm
+++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm
@@ -34,10 +34,6 @@
if(!silent)
to_chat(user, "[victim.p_their(TRUE)] mind is resisting your spell!")
return FALSE
- if(istype(victim, /mob/living/simple_animal/hostile/guardian))
- var/mob/living/simple_animal/hostile/guardian/stand = victim
- if(stand.summoner)
- victim = stand.summoner
//MIND TRANSFER BEGIN
var/mob/dead/observer/ghost = victim.ghostize()
@@ -84,11 +80,4 @@
if(!silent)
to_chat(user, "[t_He] appear[victim.p_s()] to be catatonic! Not even magic can affect [victim.p_their()] vacant mind.")
return FALSE
- if(istype(victim, /mob/living/simple_animal/hostile/guardian))
- var/mob/living/simple_animal/hostile/guardian/stand = victim
- if(stand.summoner)
- if(stand.summoner == user)
- if(!silent)
- to_chat(user, "Swapping minds with your own guardian would just put you back into your own head!")
- return FALSE
return TRUE
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 0923ba1cc70e..4bfe534940f1 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -445,16 +445,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/clothing/gloves/rapid
cost = 8
-/datum/uplink_item/dangerous/guardian
- name = "Holoparasites"
- desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
- organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
- item = /obj/item/storage/box/syndie_kit/guardian
- cost = 18
- surplus = 0
- exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
- restricted = TRUE
-
/datum/uplink_item/dangerous/machinegun
name = "L6 Squad Automatic Weapon"
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \
@@ -869,7 +859,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/ammo/toydarts
name = "Box of Riot Darts"
desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!"
- item = /obj/item/ammo_box/foambox/riot
+ item = /obj/item/storage/box/ammo/foam_darts/riot
cost = 2
surplus = 0
illegal_tech = FALSE
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 06069e4db764..931611da1df9 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -10,14 +10,14 @@
/obj/item/gun/ballistic/automatic/toy/pistol = 10,
/obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
- /obj/item/ammo_box/foambox = 20,
+ /obj/item/storage/box/ammo/foam_darts = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/balloon/syndicate = 10,
/obj/item/clothing/suit/syndicatefake = 5,
/obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant
contraband = list(
/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting!
- /obj/item/ammo_box/foambox/riot = 20,
+ /obj/item/storage/box/ammo/foam_darts/riot = 20,
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index 37a51b27bb89..007b66c193c1 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -12,8 +12,6 @@
/obj/item/assembly/flash/handheld = 5,
/obj/item/storage/box/evidence = 6,
/obj/item/flashlight/seclite = 4,
- /obj/item/ammo_box/c9mm/rubbershot = 3,
- /obj/item/ammo_box/c9mm = 1,
/obj/item/stock_parts/cell/gun = 3,
/obj/item/clothing/glasses/sunglasses = 2)
premium = list(
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index 08af917aa86a..898844a31c09 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -12,7 +12,7 @@
/obj/item/gun/ballistic/automatic/toy/pistol = 10,
/obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
- /obj/item/ammo_box/foambox = 20,
+ /obj/item/storage/box/ammo/foam_darts = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/balloon/syndicate = 10,
/obj/item/clothing/suit/syndicatefake = 5,
diff --git a/html/changelogs/AutoChangeLog-pr-3369.yml b/html/changelogs/AutoChangeLog-pr-3369.yml
deleted file mode 100644
index 31d41e4b0b05..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3369.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Bjarl
-changes:
- - {rscadd: Reports of people inflicted with congenital analgesia travelling to the
- Frontier have reached this newscaster.}
- - {rscadd: Painkillers may circumvent pain in some cases now.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3441.yml b/html/changelogs/AutoChangeLog-pr-3441.yml
new file mode 100644
index 000000000000..0299fb36df34
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3441.yml
@@ -0,0 +1,4 @@
+author: zimon9
+changes:
+ - {balance: rebalanced the probability of a grenade going off in one's hands}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3478.yml b/html/changelogs/AutoChangeLog-pr-3478.yml
new file mode 100644
index 000000000000..b909ce469d5f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3478.yml
@@ -0,0 +1,4 @@
+author: Bjarl
+changes:
+ - {rscdel: Holoparasites}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3491.yml b/html/changelogs/AutoChangeLog-pr-3491.yml
new file mode 100644
index 000000000000..6004c4799e6f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3491.yml
@@ -0,0 +1,5 @@
+author: Bjarl
+changes:
+ - {rscadd: Holofans now have a small window before shutting down if they are deactivated
+ by lack of power}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3508.yml b/html/changelogs/AutoChangeLog-pr-3508.yml
new file mode 100644
index 000000000000..84fc1ea2deca
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3508.yml
@@ -0,0 +1,4 @@
+author: Apogee-dev
+changes:
+ - {balance: Valor and Vaquero have combat hardsuits for their enforcers now}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3514.yml b/html/changelogs/AutoChangeLog-pr-3514.yml
deleted file mode 100644
index 6872d6f58b6d..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3514.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Bjarl
-changes:
- - {code_imp: abandoned airlocks now have more effects}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3516.yml b/html/changelogs/AutoChangeLog-pr-3516.yml
deleted file mode 100644
index c359affb8390..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3516.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FalloutFalcon
-changes:
- - {rscadd: Readdes world icons for a few knives. Expect more soon!}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3523.yml b/html/changelogs/AutoChangeLog-pr-3523.yml
new file mode 100644
index 000000000000..15efc1037556
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3523.yml
@@ -0,0 +1,4 @@
+author: Bjarl
+changes:
+ - {rscadd: The Frontiersmen have duct taped some turrets of their own together}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3532.yml b/html/changelogs/AutoChangeLog-pr-3532.yml
new file mode 100644
index 000000000000..bf3de808dd72
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3532.yml
@@ -0,0 +1,4 @@
+author: Bjarl
+changes:
+ - {balance: Syndicate smokes are now laced with stimulants instead of omnizine.}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3541.yml b/html/changelogs/AutoChangeLog-pr-3541.yml
new file mode 100644
index 000000000000..4bc25ce2336d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3541.yml
@@ -0,0 +1,4 @@
+author: Sadhorizon
+changes:
+ - {bugfix: Pubby ruin can no longer randomly have acid in airlocks.}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3548.yml b/html/changelogs/AutoChangeLog-pr-3548.yml
new file mode 100644
index 000000000000..ba0e3f8a1706
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3548.yml
@@ -0,0 +1,4 @@
+author: zimon9
+changes:
+ - {balance: increased amount of plasma in plasma internals cargo crate}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3555.yml b/html/changelogs/AutoChangeLog-pr-3555.yml
new file mode 100644
index 000000000000..7fe288c72bed
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3555.yml
@@ -0,0 +1,4 @@
+author: Bjarl
+changes:
+ - {rscadd: NGR turrets}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3556.yml b/html/changelogs/AutoChangeLog-pr-3556.yml
new file mode 100644
index 000000000000..80ef9859ead2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3556.yml
@@ -0,0 +1,7 @@
+author: Sadhorizon
+changes:
+ - {tweak: Syndicate soap is now in-line with NT soap.}
+ - {rscdel: Syndicate tools are no longer faster. They are just reskinned normal
+ tools now.}
+ - {rscdel: Syndicate toolbox lost it's damage buff.}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3557.yml b/html/changelogs/AutoChangeLog-pr-3557.yml
new file mode 100644
index 000000000000..63c3a04a151c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3557.yml
@@ -0,0 +1,4 @@
+author: firebudgy
+changes:
+ - {rscadd: Active smoking pipe sprites for Vox.}
+delete-after: true
diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml
index 984cb17c6086..c8e9f015aef7 100644
--- a/html/changelogs/archive/2024-10.yml
+++ b/html/changelogs/archive/2024-10.yml
@@ -131,3 +131,47 @@
zimon9:
- rscadd: Adds bowmans to Artificer and Enforcer loadouts, and regular headsets
to Recruit loadouts
+2024-10-11:
+ Bjarl:
+ - rscadd: Reports of people inflicted with congenital analgesia travelling to the
+ Frontier have reached this newscaster.
+ - rscadd: Painkillers may circumvent pain in some cases now.
+ - rscadd: Please remember to ensure your soul is filled with spite before kicking
+ a rack.
+ - code_imp: abandoned airlocks now have more effects
+ FalloutFalcon:
+ - rscadd: Readdes world icons for a few knives. Expect more soon!
+2024-10-13:
+ FalloutFalcon:
+ - rscadd: update path txt for ammo boxes, thgvr will be FIRED for forgeting this.
+ Imaginos16, rye-rice:
+ - rscadd: A few hairstyles have been resprited!
+ - rscdel: the Braided and Braid line of hairs.
+ thgvr:
+ - rscadd: Added bullet stacks, they allow you to stack ammo of the same type into
+ a group.
+ - balance: Changed old ammo boxes into storage items containing stacks of bullets
+ zimon9:
+ - bugfix: fixed halved throw range
+2024-10-14:
+ Spooky, PositiveEntropy:
+ - imageadd: Smartfridges and Booze-O-Mats have been resprited!
+2024-10-15:
+ Erika Fox:
+ - rscadd: Transfusion anomaly; yum! Blood!
+ - rscadd: Anomaly cores now have an effect when detonated out of the anomaly
+ - rscadd: new anomaly description fluff
+ Gristlebee:
+ - bugfix: Abandoned Miskilamo Shipbreaking Yard ruin has the correct revolver subtype.
+ - bugfix: Shipping dock ruin correctly has a rattlesnake instead of a ringneck case
+ Sadhorizon:
+ - rscadd: Added stamps for New Gorlex Republic.
+ - rscadd: Added secret documents for New Gorlex Republic.
+ - rscadd: Added a honorable corpsman stamp and tweaked honorable arti one.
+ - rscadd: Inteq ships now use inteq stamps.
+ - code_imp: Repathed IRMG and CLIP stamps.
+ firebudgy:
+ - bugfix: War Correspondent helmet has a proper sprite for Vox.
+ rye-rice:
+ - rscadd: Various sprite improvemnts
+ - bugfix: Boomslang no longer fits on the belt
diff --git a/icons/effects/anomalies.dmi b/icons/effects/anomalies.dmi
index e1671b816ec5..c716fc799097 100644
Binary files a/icons/effects/anomalies.dmi and b/icons/effects/anomalies.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 27c45db50649..0c0efee7cbb7 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/species/vox/onmob_mask_vox.dmi b/icons/mob/species/vox/onmob_mask_vox.dmi
index 7aa3dfb2e046..cbc8eed5c4ac 100644
Binary files a/icons/mob/species/vox/onmob_mask_vox.dmi and b/icons/mob/species/vox/onmob_mask_vox.dmi differ
diff --git a/icons/obj/ammo_bullets.dmi b/icons/obj/ammo_bullets.dmi
deleted file mode 100644
index 087cdd4c771e..000000000000
Binary files a/icons/obj/ammo_bullets.dmi and /dev/null differ
diff --git a/icons/obj/ammo_shotshells.dmi b/icons/obj/ammo_shotshells.dmi
deleted file mode 100644
index 55b00cdd0b21..000000000000
Binary files a/icons/obj/ammo_shotshells.dmi and /dev/null differ
diff --git a/icons/obj/ammunition/ammo.dmi b/icons/obj/ammunition/ammo.dmi
new file mode 100644
index 000000000000..85e8e368fac8
Binary files /dev/null and b/icons/obj/ammunition/ammo.dmi differ
diff --git a/icons/obj/ammunition/ammo_boxes.dmi b/icons/obj/ammunition/ammo_boxes.dmi
new file mode 100644
index 000000000000..ac963d46212b
Binary files /dev/null and b/icons/obj/ammunition/ammo_boxes.dmi differ
diff --git a/icons/obj/ammunition/ammo_bullets.dmi b/icons/obj/ammunition/ammo_bullets.dmi
new file mode 100644
index 000000000000..25ea909762aa
Binary files /dev/null and b/icons/obj/ammunition/ammo_bullets.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 68fef79c160b..ab9af894d43e 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi
index 70bbef00e1af..6c3851f0ca7f 100644
Binary files a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi and b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi b/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi
index 6471cef8b5eb..febc543be1b5 100644
Binary files a/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi and b/icons/obj/guns/manufacturer/hunterspride/lefthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/onmob.dmi b/icons/obj/guns/manufacturer/hunterspride/onmob.dmi
index 361899e3c523..539b811aacd6 100644
Binary files a/icons/obj/guns/manufacturer/hunterspride/onmob.dmi and b/icons/obj/guns/manufacturer/hunterspride/onmob.dmi differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/righthand.dmi b/icons/obj/guns/manufacturer/hunterspride/righthand.dmi
index fbf4f7cf3fbf..ec9a8a53ba7f 100644
Binary files a/icons/obj/guns/manufacturer/hunterspride/righthand.dmi and b/icons/obj/guns/manufacturer/hunterspride/righthand.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 6905749d1e52..a2a6e29e2c46 100644
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/stamp_icons/large_stamp-artificer.png b/icons/stamp_icons/large_stamp-artificer.png
deleted file mode 100644
index 058a4407428c..000000000000
Binary files a/icons/stamp_icons/large_stamp-artificer.png and /dev/null differ
diff --git a/icons/stamp_icons/large_stamp-inteq_artificer.png b/icons/stamp_icons/large_stamp-inteq_artificer.png
new file mode 100644
index 000000000000..fc75d381200e
Binary files /dev/null and b/icons/stamp_icons/large_stamp-inteq_artificer.png differ
diff --git a/icons/stamp_icons/large_stamp-inteq_corpsman.png b/icons/stamp_icons/large_stamp-inteq_corpsman.png
new file mode 100644
index 000000000000..22b4f97c7e4c
Binary files /dev/null and b/icons/stamp_icons/large_stamp-inteq_corpsman.png differ
diff --git a/icons/stamp_icons/large_stamp-maa.png b/icons/stamp_icons/large_stamp-inteq_maa.png
similarity index 100%
rename from icons/stamp_icons/large_stamp-maa.png
rename to icons/stamp_icons/large_stamp-inteq_maa.png
diff --git a/icons/stamp_icons/large_stamp-vanguard.png b/icons/stamp_icons/large_stamp-inteq_vanguard.png
similarity index 100%
rename from icons/stamp_icons/large_stamp-vanguard.png
rename to icons/stamp_icons/large_stamp-inteq_vanguard.png
diff --git a/icons/stamp_icons/large_stamp-ngr.png b/icons/stamp_icons/large_stamp-ngr.png
new file mode 100644
index 000000000000..dfc75056911e
Binary files /dev/null and b/icons/stamp_icons/large_stamp-ngr.png differ
diff --git a/icons/stamp_icons/large_stamp-ngr_captain.png b/icons/stamp_icons/large_stamp-ngr_captain.png
new file mode 100644
index 000000000000..46ca33b76853
Binary files /dev/null and b/icons/stamp_icons/large_stamp-ngr_captain.png differ
diff --git a/icons/stamp_icons/large_stamp-ngr_ensign.png b/icons/stamp_icons/large_stamp-ngr_ensign.png
new file mode 100644
index 000000000000..9e7bc9056789
Binary files /dev/null and b/icons/stamp_icons/large_stamp-ngr_ensign.png differ
diff --git a/icons/stamp_icons/large_stamp-ngr_foreman.png b/icons/stamp_icons/large_stamp-ngr_foreman.png
new file mode 100644
index 000000000000..09b34ab632e1
Binary files /dev/null and b/icons/stamp_icons/large_stamp-ngr_foreman.png differ
diff --git a/icons/stamp_icons/large_stamp-ngr_lieutenant.png b/icons/stamp_icons/large_stamp-ngr_lieutenant.png
new file mode 100644
index 000000000000..f96be7a5ee56
Binary files /dev/null and b/icons/stamp_icons/large_stamp-ngr_lieutenant.png differ
diff --git a/shiptest.dme b/shiptest.dme
index 7515bfcece79..86b9c524989a 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -286,7 +286,6 @@
#include "code\_onclick\hud\fullscreen.dm"
#include "code\_onclick\hud\generic_dextrous.dm"
#include "code\_onclick\hud\ghost.dm"
-#include "code\_onclick\hud\guardian.dm"
#include "code\_onclick\hud\holograms.dm"
#include "code\_onclick\hud\hud.dm"
#include "code\_onclick\hud\human.dm"
@@ -1093,6 +1092,7 @@
#include "code\game\objects\effects\anomalies\anomalies_pyroclastic.dm"
#include "code\game\objects\effects\anomalies\anomalies_sparkler.dm"
#include "code\game\objects\effects\anomalies\anomalies_static.dm"
+#include "code\game\objects\effects\anomalies\anomalies_transfusion.dm"
#include "code\game\objects\effects\anomalies\anomalies_veins.dm"
#include "code\game\objects\effects\anomalies\anomalies_vortex.dm"
#include "code\game\objects\effects\decals\cleanable.dm"
@@ -1345,6 +1345,7 @@
#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\stacks\tiles\tiles_suns.dm"
+#include "code\game\objects\items\storage\ammo_can.dm"
#include "code\game\objects\items\storage\backpack.dm"
#include "code\game\objects\items\storage\bags.dm"
#include "code\game\objects\items\storage\belt.dm"
@@ -1739,6 +1740,7 @@
#include "code\modules\antagonists\wizard\equipment\artefact.dm"
#include "code\modules\antagonists\wizard\equipment\spellbook.dm"
#include "code\modules\antagonists\xeno\xeno.dm"
+#include "code\modules\assembly\anomalies.dm"
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
#include "code\modules\assembly\doorcontrol.dm"
@@ -2678,19 +2680,6 @@
#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
-#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\gravitokinetic.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\slime.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\support.dm"
#include "code\modules\mob\living\simple_animal\hostile\abandoned_minebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
@@ -2992,7 +2981,7 @@
#include "code\modules\power\tesla\generator.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\projectile.dm"
-#include "code\modules\projectiles\ammunition\_ammunition.dm"
+#include "code\modules\projectiles\ammunition\_ammo_casing.dm"
#include "code\modules\projectiles\ammunition\_firing.dm"
#include "code\modules\projectiles\ammunition\ballistic\lmg.dm"
#include "code\modules\projectiles\ammunition\ballistic\pistol.dm"
@@ -3019,8 +3008,17 @@
#include "code\modules\projectiles\ammunition\special\magic.dm"
#include "code\modules\projectiles\ammunition\special\syringe.dm"
#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
-#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
-#include "code\modules\projectiles\boxes_magazines\generic_ammo_box.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_loaders.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\_ammo_stack.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\_premade_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_gauss_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_lmg_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_misc_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_pistol_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_rifle_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_shotshell_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_smg_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_sniper_stacks.dm"
#include "code\modules\projectiles\boxes_magazines\external\gauss.dm"
#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
diff --git a/tools/UpdatePaths/Scripts/3456_ammoboxes.txt b/tools/UpdatePaths/Scripts/3456_ammoboxes.txt
new file mode 100644
index 000000000000..986c3f55894a
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/3456_ammoboxes.txt
@@ -0,0 +1,69 @@
+/obj/item/ammo_box/c10mm : /obj/item/storage/box/ammo/c10mm {@OLD}
+/obj/item/ammo_box/c10mm/surplus : /obj/item/storage/box/ammo/c10mm_surplus {@OLD}
+/obj/item/ammo_box/c10mm/ap : /obj/item/storage/box/ammo/c10mm_ap {@OLD}
+/obj/item/ammo_box/c10mm/hp : /obj/item/storage/box/ammo/c10mm_hp {@OLD}
+/obj/item/ammo_box/c10mm/fire: /obj/item/storage/box/ammo/c10mm_incendiary {@OLD}
+/obj/item/ammo_box/c10mm/rubbershot : /obj/item/storage/box/ammo/c10mm_rubber {@OLD}
+
+/obj/item/ammo_box/c9mm : /obj/item/storage/box/ammo/c9mm {@OLD}
+/obj/item/ammo_box/c9mm/surplus : /obj/item/storage/box/ammo/c9mm_surplus {@OLD}
+/obj/item/ammo_box/c9mm/ap : /obj/item/storage/box/ammo/c9mm/ap {@OLD}
+/obj/item/ammo_box/c9mm/hp : /obj/item/storage/box/ammo/c9mm_hp {@OLD}
+/obj/item/ammo_box/c9mm/fire : /obj/item/storage/box/ammo/c9mm_incendiary {@OLD}
+/obj/item/ammo_box/c9mm/rubbershot : /obj/item/storage/box/ammo/c9mm_rubber {@OLD}
+
+/obj/item/ammo_box/c45 : /obj/item/storage/box/ammo/c45 {@OLD}
+/obj/item/ammo_box/c45/surplus : /obj/item/storage/box/ammo/c45_surplus {@OLD}
+/obj/item/ammo_box/c45/ap : /obj/item/storage/box/ammo/c45_ap {@OLD}
+/obj/item/ammo_box/c45/hp : /obj/item/storage/box/ammo/c45_hp {@OLD}
+/obj/item/ammo_box/c45/fire : /obj/item/storage/box/ammo/c45_incendiary {@OLD}
+/obj/item/ammo_box/c45/rubbershot : /obj/item/storage/box/ammo/c45_rubber {@OLD}
+
+/obj/item/ammo_box/c22lr_box : /obj/item/storage/box/ammo/c22lr {@OLD}
+
+/obj/item/ammo_box/a357_box : /obj/item/storage/box/ammo/a357 {@OLD}
+/obj/item/ammo_box/a357_box/match : /obj/item/storage/box/ammo/a357_match {@OLD}
+/obj/item/ammo_box/a357_box/hp : /obj/item/storage/box/ammo/a357_hp {@OLD}
+
+/obj/item/ammo_box/a4570 : /obj/item/storage/box/ammo/a4570 {@OLD}
+/obj/item/ammo_box/a4570/match : /obj/item/storage/box/ammo/a4570_match {@OLD}
+/obj/item/ammo_box/a4570/hp : /obj/item/storage/box/ammo/a4570_hp {@OLD}
+/obj/item/ammo_box/a4570/explosive : /obj/item/storage/box/ammo/a4570_explosive {@OLD}
+
+/obj/item/ammo_box/c38_box : /obj/item/storage/box/ammo/c38 {@OLD}
+/obj/item/ammo_box/c38_box/surplus : /obj/item/storage/box/ammo/c38_surplus {@OLD}
+
+/obj/item/ammo_box/a44roum : /obj/item/storage/box/ammo/a44roum {@OLD}
+/obj/item/ammo_box/a44roum/hp : /obj/item/storage/box/ammo/a44roum_hp {@OLD}
+/obj/item/ammo_box/a44roum/rubber : /obj/item/storage/box/ammo/a44roum_rubber {@OLD}
+
+/obj/item/ammo_box/a12g : /obj/item/storage/box/ammo/a12g_buckshot {@OLD}
+/obj/item/ammo_box/a12g/slug : /obj/item/storage/box/ammo/a12g_slug {@OLD}
+/obj/item/ammo_box/a12g/beanbag : /obj/item/storage/box/ammo/a12g_beanbag {@OLD}
+/obj/item/ammo_box/a12g/rubbershot : /obj/item/storage/box/ammo/a12g_rubbershot {@OLD}
+
+/obj/item/ammo_box/c46x30mm_box : /obj/item/storage/box/ammo/c46x30mm {@OLD}
+
+/obj/item/ammo_box/c556mmHITP : /obj/item/storage/box/ammo/c556mm {@OLD}
+/obj/item/ammo_box/c556mmHITP/surplus : /obj/item/storage/box/ammo/c556mm_surplus {@OLD}
+/obj/item/ammo_box/c556mmHITP/ap : /obj/item/storage/box/ammo/c556mm_ap {@OLD}
+/obj/item/ammo_box/c556mmHITP/hp : /obj/item/storage/box/ammo/c556mm_hp {@OLD}
+/obj/item/ammo_box/c556mmHITP/rubbershot : /obj/item/storage/box/ammo/c556mm_rubber {@OLD}
+
+/obj/item/ammo_box/c8x50mm_box : /obj/item/storage/box/ammo/a8_50r {@OLD}
+/obj/item/ammo_box/c8x50mmhp_box : /obj/item/storage/box/ammo/a8_50r_hp {@OLD}
+
+/obj/item/ammo_box/a300_box : /obj/item/storage/box/ammo/a300 {@OLD}
+
+/obj/item/ammo_box/a762_40 : /obj/item/storage/box/ammo/a762_40 {@OLD}
+/obj/item/ammo_box/a762_40/inteq : /obj/item/storage/box/ammo/a762_40/inteq {@OLD}
+
+/obj/item/ammo_box/a308 : /obj/item/storage/box/ammo/a308 {@OLD}
+/obj/item/ammo_box/a308/hunterspride : /obj/item/storage/box/ammo/a308/hunterspride {@OLD}
+
+/obj/item/ammo_box/ferropelletbox : /obj/item/storage/box/ammo/ferropellet {@OLD}
+/obj/item/ammo_box/ferroslugbox : /obj/item/storage/box/ammo/ferroslug {@OLD}
+/obj/item/ammo_box/ferrolancebox : /obj/item/storage/box/ammo/ferrolance {@OLD}
+
+/obj/item/ammo_box/foambox : /obj/item/storage/box/ammo/foam_darts {@OLD}
+/obj/item/ammo_box/foambox/riot : /obj/item/storage/box/ammo/foam_darts/riot {@OLD}
diff --git a/tools/tgs_scripts/InstallDeps.sh b/tools/tgs_scripts/InstallDeps.sh
index ce3a02a05147..c1009ce02367 100755
--- a/tools/tgs_scripts/InstallDeps.sh
+++ b/tools/tgs_scripts/InstallDeps.sh
@@ -7,7 +7,6 @@ has_cargo="$(command -v ~/.cargo/bin/cargo)"
has_sudo="$(command -v sudo)"
has_curl="$(command -v curl)"
has_grep="$(command -v grep)"
-has_youtubedl="$(command -v youtube-dl)"
has_pip3="$(command -v pip3)"
set -e
set -x
@@ -33,19 +32,14 @@ if ! [ -x "$has_cargo" ]; then
. ~/.profile
fi
-# install or update youtube-dl when not present, or if it is present with pip3,
-# which we assume was used to install it
-if ! [ -x "$has_youtubedl" ]; then
- echo "Installing youtube-dl with pip3..."
- if ! [ -x "$has_sudo" ]; then
- apt-get update
- apt-get install -y python3 python3-pip
- else
- sudo apt-get update
- sudo apt-get install -y python3 python3-pip
- fi
- pip3 install youtube-dl --break-system-packages
-elif [ -x "$has_pip3" ]; then
- echo "Ensuring youtube-dl is up-to-date with pip3..."
- pip3 install youtube-dl -U --break-system-packages
+# install or update yt-dlp when not present
+echo "Installing/updating yt-dlp..."
+if ! [ -x "$has_sudo" ]; then
+ apt-get update
+ apt-get install -y yt-dlp
+else
+ sudo apt-get update
+ sudo apt-get install -y yt-dlp
fi
+
+