diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
index 00ad094d46ee..5dfad30231db 100644
--- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
+++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
@@ -383,7 +383,7 @@
"gt" = (
/obj/effect/turf_decal/bot_white,
/obj/structure/closet/crate/secure/weapon,
-/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted,
+/obj/item/gun/ballistic/revolver/grenadelauncher,
/turf/open/floor/iron/dark/airless,
/area/shuttle/caravan/freighter3)
"gv" = (
diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
deleted file mode 100644
index 5679fcba3cfd..000000000000
--- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm
+++ /dev/null
@@ -1,2942 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aa" = (
-/turf/template_noop,
-/area/template_noop)
-"ab" = (
-/obj/structure/fluff/paper/corner,
-/turf/template_noop,
-/area/template_noop)
-"ac" = (
-/obj/structure/fluff/paper,
-/turf/template_noop,
-/area/template_noop)
-"ad" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/template_noop,
-/area/template_noop)
-"ae" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/turf/template_noop,
-/area/template_noop)
-"af" = (
-/turf/closed/indestructible/paper,
-/area/ruin/powered)
-"ag" = (
-/obj/structure/fluff/paper{
- dir = 10
- },
-/turf/template_noop,
-/area/template_noop)
-"ah" = (
-/obj/structure/fluff/paper/corner,
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/template_noop,
-/area/template_noop)
-"ai" = (
-/obj/structure/fluff/paper{
- dir = 6
- },
-/turf/template_noop,
-/area/template_noop)
-"aj" = (
-/obj/machinery/door/airlock/freezer{
- name = "airlock";
- opacity = 0
- },
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ak" = (
-/obj/structure/fluff/paper{
- dir = 9
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"al" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"am" = (
-/obj/structure/fluff/paper{
- dir = 5
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"an" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ao" = (
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ap" = (
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aq" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ar" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"as" = (
-/obj/item/paper/crumpled/ruins/originalcontent,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"at" = (
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"au" = (
-/obj/structure/fluff/paper/stack{
- dir = 4
- },
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"av" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aw" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/turf/template_noop,
-/area/template_noop)
-"ax" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ay" = (
-/obj/structure/fluff/paper{
- dir = 10
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"az" = (
-/obj/structure/fluff/paper,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aA" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aB" = (
-/obj/structure/fluff/paper/stack,
-/obj/structure/fluff/paper/stack{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aC" = (
-/obj/structure/fluff/paper{
- dir = 5
- },
-/obj/structure/fluff/paper{
- dir = 9
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aD" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper/corner,
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aE" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aF" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/barricade/wooden,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aG" = (
-/obj/structure/fluff/paper{
- dir = 10
- },
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/obj/structure/barricade/wooden,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aH" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 5
- },
-/obj/structure/barricade/wooden,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aI" = (
-/obj/structure/fluff/paper/stack{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aJ" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/obj/structure/fluff/paper/corner,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aK" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aL" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aM" = (
-/obj/structure/fluff/paper/stack{
- dir = 10
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aN" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aO" = (
-/obj/structure/fluff/paper,
-/mob/living/basic/stickman/dog,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aP" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aQ" = (
-/obj/structure/fluff/paper{
- dir = 10
- },
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aR" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aS" = (
-/obj/structure/fluff/paper/corner,
-/mob/living/basic/stickman/dog,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aT" = (
-/obj/structure/fluff/paper{
- dir = 6
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aU" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/obj/structure/fluff/paper,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aV" = (
-/obj/structure/fluff/paper{
- dir = 6
- },
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aW" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper/stack,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aX" = (
-/obj/structure/fluff/paper/stack,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aY" = (
-/obj/structure/fluff/paper/corner,
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"aZ" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ba" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/mob/living/basic/stickman/dog,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bb" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bc" = (
-/obj/structure/fluff/paper{
- dir = 9
- },
-/turf/template_noop,
-/area/template_noop)
-"bd" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/turf/template_noop,
-/area/template_noop)
-"be" = (
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/template_noop,
-/area/template_noop)
-"bf" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper/stack{
- dir = 9
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bg" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/item/toy/crayon/yellow,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bh" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/item/toy/crayon/red,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bi" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper/corner,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bj" = (
-/obj/structure/fluff/paper,
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bk" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bl" = (
-/obj/structure/fluff/paper/stack{
- dir = 9
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bm" = (
-/obj/structure/fluff/paper,
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bn" = (
-/obj/structure/fluff/paper{
- dir = 9
- },
-/obj/structure/fluff/paper{
- dir = 10
- },
-/turf/template_noop,
-/area/template_noop)
-"bo" = (
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/template_noop,
-/area/template_noop)
-"bp" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/item/toy/crayon/rainbow,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bq" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper/stack{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"br" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper/stack{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bs" = (
-/obj/item/toy/crayon/spraycan,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bt" = (
-/obj/item/storage/crayons,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bu" = (
-/mob/living/basic/stickman/ranged,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bv" = (
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper/stack{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bw" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/template_noop,
-/area/template_noop)
-"bx" = (
-/obj/structure/fluff/paper{
- dir = 5
- },
-/turf/template_noop,
-/area/template_noop)
-"by" = (
-/obj/structure/fluff/paper/corner,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bz" = (
-/obj/structure/fluff/paper/stack{
- dir = 9
- },
-/obj/structure/fluff/paper,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bA" = (
-/obj/item/toner,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bB" = (
-/obj/structure/easel,
-/obj/item/paper/pamphlet/ruin/originalcontent/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bC" = (
-/obj/item/toy/crayon/yellow,
-/obj/structure/fluff/paper{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bD" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bE" = (
-/mob/living/basic/stickman/dog,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bF" = (
-/obj/structure/fluff/paper/stack{
- dir = 1
- },
-/obj/structure/fluff/paper/stack,
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bG" = (
-/obj/item/toy/crayon/blue,
-/mob/living/basic/stickman/ranged,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bH" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/item/toy/crayon/yellow,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bI" = (
-/obj/structure/fluff/paper{
- dir = 9
- },
-/obj/structure/closet/crate/bin,
-/obj/item/paper/crumpled/ruins/originalcontent,
-/obj/item/paper/crumpled/ruins/originalcontent,
-/obj/item/paper/crumpled/ruins/originalcontent,
-/obj/item/gps/spaceruin,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bJ" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/easel,
-/obj/item/paper/pamphlet/ruin/originalcontent/treeside,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bK" = (
-/obj/structure/fluff/paper{
- dir = 5
- },
-/obj/structure/table/wood,
-/obj/item/storage/crayons,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bL" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper/stack{
- dir = 6
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bM" = (
-/obj/item/toy/crayon/purple,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bN" = (
-/obj/structure/fluff/paper/corner,
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bO" = (
-/obj/machinery/door/airlock/freezer{
- name = "airlock";
- opacity = 0
- },
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bP" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper/corner{
- dir = 8
- },
-/obj/structure/fluff/paper/stack{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bQ" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/obj/structure/fluff/paper/stack,
-/obj/structure/fluff/paper/stack{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bR" = (
-/obj/structure/fluff/paper/stack{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bS" = (
-/obj/structure/fluff/paper/stack{
- dir = 1
- },
-/obj/structure/fluff/paper/stack,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bT" = (
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/obj/structure/fluff/paper/stack{
- dir = 6
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bU" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bV" = (
-/obj/item/toy/crayon/yellow,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bW" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/easel,
-/obj/item/paper/pamphlet/ruin/originalcontent/pennywise,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bX" = (
-/obj/item/toy/crayon/blue,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bY" = (
-/obj/item/toy/crayon/red,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"bZ" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/bed,
-/obj/item/bedsheet/rainbow,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ca" = (
-/obj/structure/fluff/paper{
- dir = 10
- },
-/obj/structure/table/wood,
-/obj/item/storage/crayons,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cb" = (
-/obj/structure/fluff/paper/stack{
- dir = 9
- },
-/obj/item/toy/crayon/purple,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cc" = (
-/mob/living/simple_animal/hostile/boss/paper_wizard,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cd" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/table/wood,
-/obj/item/toy/crayon/rainbow,
-/obj/item/toy/crayon/spraycan,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ce" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/fluff/paper/corner{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cf" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper/stack,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cg" = (
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/structure/table/wood,
-/obj/item/paper_bin,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ch" = (
-/obj/structure/fluff/paper,
-/obj/item/paper/crumpled/ruins/originalcontent,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ci" = (
-/obj/structure/fluff/paper,
-/obj/structure/fluff/paper/corner{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cj" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/mob/living/basic/stickman,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ck" = (
-/obj/structure/fluff/paper{
- dir = 6
- },
-/obj/structure/fluff/paper{
- dir = 5
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cl" = (
-/obj/structure/fluff/paper/corner,
-/obj/structure/fluff/paper/stack{
- dir = 4
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cm" = (
-/obj/structure/fluff/paper,
-/obj/structure/table/wood,
-/obj/item/storage/crayons,
-/obj/item/storage/crayons,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cn" = (
-/obj/structure/fluff/paper{
- dir = 6
- },
-/obj/structure/table/wood,
-/obj/item/canvas/twentythree_twentythree,
-/obj/item/canvas,
-/obj/item/canvas/nineteen_nineteen,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"co" = (
-/obj/structure/fluff/paper,
-/obj/structure/fluff/paper/stack{
- dir = 9
- },
-/obj/item/toy/crayon/blue,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cp" = (
-/obj/structure/fluff/paper{
- dir = 10
- },
-/obj/machinery/photocopier,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cq" = (
-/obj/structure/fluff/paper,
-/obj/structure/table/wood,
-/obj/item/storage/crayons,
-/obj/item/pen/fourcolor,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cr" = (
-/obj/structure/fluff/paper,
-/obj/structure/easel,
-/obj/item/paper/pamphlet/ruin/originalcontent/yelling,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cs" = (
-/obj/structure/fluff/paper,
-/obj/structure/fluff/paper{
- dir = 1
- },
-/mob/living/basic/stickman/dog,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"ct" = (
-/obj/structure/fluff/paper,
-/obj/structure/fluff/paper{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cu" = (
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper/stack{
- dir = 6
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cv" = (
-/obj/structure/fluff/paper,
-/obj/structure/fluff/paper/stack{
- dir = 6
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"cw" = (
-/obj/structure/fluff/paper{
- dir = 1
- },
-/mob/living/basic/stickman/ranged,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"wr" = (
-/obj/machinery/door/airlock/freezer{
- name = "airlock";
- opacity = 0
- },
-/obj/structure/fluff/paper{
- dir = 8
- },
-/obj/structure/fluff/paper{
- dir = 4
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-"Ns" = (
-/obj/item/paper/secretrecipe,
-/turf/open/indestructible/paper,
-/area/ruin/powered)
-
-(1,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-bw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(2,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(3,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ai
-af
-af
-bx
-bw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(4,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(5,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-ai
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(6,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(7,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ai
-af
-af
-af
-af
-af
-af
-af
-bx
-ae
-ae
-bw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(8,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ae
-ae
-ae
-ai
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bx
-ae
-ae
-ae
-ae
-ae
-bw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(9,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bx
-ae
-bw
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(10,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ae
-ai
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bx
-ae
-ae
-ae
-ae
-bw
-aa
-aa
-aa
-"}
-(11,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-ak
-ar
-ar
-ay
-af
-ak
-ar
-ar
-ar
-ar
-ar
-ar
-ar
-ar
-ar
-ay
-af
-af
-af
-af
-af
-af
-af
-bx
-ae
-ae
-bw
-"}
-(12,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ab
-ai
-af
-af
-af
-af
-af
-af
-ak
-aY
-aq
-aq
-bk
-bp
-aY
-aq
-aq
-aq
-aq
-bL
-aq
-bU
-ax
-ap
-ch
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bd
-"}
-(13,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-am
-bq
-aT
-af
-af
-af
-af
-af
-af
-af
-am
-aq
-ci
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bd
-"}
-(14,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-aW
-az
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-aR
-ay
-af
-af
-af
-af
-af
-af
-bc
-aw
-aw
-be
-"}
-(15,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-ab
-ae
-ai
-af
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-af
-af
-ak
-ar
-ar
-ar
-ay
-af
-af
-af
-af
-af
-cj
-co
-af
-af
-af
-bc
-aw
-aw
-be
-aa
-aa
-aa
-"}
-(16,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-af
-af
-am
-aZ
-ay
-af
-af
-af
-al
-ap
-ap
-ap
-aA
-ar
-ay
-af
-af
-af
-al
-az
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(17,1,1) = {"
-aa
-aa
-aa
-ab
-ae
-ai
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-ak
-ao
-ap
-ap
-ap
-ap
-ap
-az
-af
-af
-af
-am
-aZ
-ay
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(18,1,1) = {"
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-ak
-ay
-af
-af
-af
-af
-ba
-aA
-bg
-ar
-ao
-bl
-ap
-bu
-ap
-ap
-aM
-az
-af
-af
-af
-af
-al
-az
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(19,1,1) = {"
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-af
-af
-am
-aq
-ax
-ap
-ap
-ap
-ap
-ap
-bA
-bE
-ap
-aA
-ar
-ay
-af
-af
-al
-az
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(20,1,1) = {"
-aa
-aa
-ab
-ai
-af
-af
-af
-af
-af
-af
-al
-aA
-ay
-af
-af
-af
-af
-af
-al
-bl
-ap
-bt
-ap
-ap
-ap
-ap
-ap
-ap
-ap
-az
-af
-af
-am
-aZ
-ay
-af
-bx
-ae
-bw
-aa
-aa
-aa
-aa
-"}
-(21,1,1) = {"
-aa
-aa
-ac
-af
-af
-af
-af
-af
-aC
-aE
-ao
-aI
-az
-af
-af
-af
-af
-af
-am
-ax
-ap
-ap
-ap
-ap
-bB
-ap
-ap
-ap
-bu
-az
-af
-af
-af
-al
-az
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(22,1,1) = {"
-ab
-ae
-ai
-af
-af
-af
-af
-af
-af
-am
-aq
-aJ
-aN
-aP
-aE
-ar
-ay
-af
-af
-am
-ax
-bu
-by
-aq
-aq
-bF
-ap
-ap
-bt
-az
-af
-af
-af
-al
-az
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(23,1,1) = {"
-ac
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-aK
-af
-af
-al
-aX
-az
-af
-af
-af
-am
-ax
-az
-af
-af
-al
-as
-bR
-ap
-az
-af
-af
-af
-al
-cv
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(24,1,1) = {"
-ac
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-aL
-ay
-af
-am
-aq
-bb
-ar
-ay
-af
-af
-al
-bz
-af
-af
-al
-bM
-ap
-ap
-aA
-ay
-af
-af
-bi
-aT
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(25,1,1) = {"
-ac
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-af
-al
-ap
-az
-af
-af
-al
-aA
-ar
-bC
-ao
-ap
-ap
-bV
-ap
-az
-af
-af
-cs
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(26,1,1) = {"
-ac
-af
-af
-af
-ak
-ar
-ar
-ay
-af
-af
-af
-al
-aO
-af
-af
-af
-am
-bf
-aZ
-ay
-af
-al
-ap
-ap
-ap
-bG
-ap
-bM
-ap
-ap
-az
-af
-af
-ct
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(27,1,1) = {"
-ac
-af
-af
-af
-al
-ap
-ap
-az
-af
-af
-af
-am
-aN
-aQ
-af
-af
-af
-af
-bh
-az
-af
-al
-ap
-aI
-by
-bH
-bN
-aq
-aq
-ax
-az
-af
-af
-ct
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(28,1,1) = {"
-ac
-af
-af
-af
-al
-as
-ap
-az
-af
-af
-af
-af
-af
-aR
-ay
-af
-af
-af
-al
-bm
-af
-al
-ap
-ap
-az
-af
-bO
-af
-af
-am
-aN
-aQ
-af
-aR
-ay
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(29,1,1) = {"
-ac
-af
-af
-af
-al
-ap
-ap
-aA
-ay
-af
-af
-af
-af
-am
-aU
-af
-af
-af
-bi
-aT
-af
-al
-aX
-ap
-az
-af
-bP
-ay
-af
-af
-af
-ck
-af
-am
-ci
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(30,1,1) = {"
-ac
-af
-af
-ak
-ao
-ap
-ap
-aB
-aD
-aF
-aG
-af
-af
-af
-aK
-af
-af
-ak
-bj
-af
-af
-al
-ap
-ap
-az
-af
-al
-Ns
-bW
-ca
-af
-af
-af
-af
-aR
-ay
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(31,1,1) = {"
-ac
-af
-af
-al
-ap
-ap
-ap
-ap
-az
-af
-aH
-an
-an
-an
-aV
-af
-af
-al
-az
-af
-af
-am
-aq
-aq
-aT
-af
-bQ
-ap
-ap
-aA
-cf
-ar
-cp
-af
-al
-az
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(32,1,1) = {"
-ad
-ag
-af
-al
-ap
-at
-ap
-ap
-az
-af
-af
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-af
-af
-af
-af
-af
-al
-bS
-bX
-ap
-bR
-ap
-cq
-af
-am
-aZ
-ay
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(33,1,1) = {"
-aa
-ac
-af
-al
-ap
-ap
-ap
-ap
-aA
-ay
-af
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-af
-af
-af
-af
-bI
-ao
-bM
-bt
-cb
-ap
-ap
-cr
-af
-af
-al
-az
-af
-bx
-bw
-aa
-aa
-aa
-"}
-(34,1,1) = {"
-aa
-ac
-af
-al
-ap
-ap
-ap
-ap
-ap
-aA
-ar
-ay
-af
-af
-af
-af
-af
-am
-bb
-ay
-af
-af
-af
-af
-af
-bJ
-bA
-ap
-bY
-cc
-ap
-cl
-aT
-af
-af
-al
-az
-af
-af
-bd
-aa
-aa
-aa
-"}
-(35,1,1) = {"
-aa
-ac
-af
-am
-aq
-au
-ap
-ap
-ap
-ap
-ap
-az
-af
-af
-af
-af
-af
-af
-al
-az
-af
-af
-af
-af
-af
-bK
-aq
-bT
-ap
-ap
-ap
-cm
-af
-af
-ak
-ao
-az
-af
-af
-bd
-aa
-aa
-aa
-"}
-(36,1,1) = {"
-aa
-ac
-af
-af
-af
-al
-ap
-ap
-at
-as
-ap
-aA
-ay
-af
-af
-af
-af
-af
-am
-bb
-br
-ay
-af
-af
-af
-af
-af
-am
-bZ
-cd
-cg
-cn
-af
-af
-al
-ap
-az
-af
-af
-bd
-aa
-aa
-aa
-"}
-(37,1,1) = {"
-aa
-ah
-aj
-an
-wr
-av
-ap
-ap
-ap
-ap
-ap
-ap
-aA
-ar
-ay
-af
-af
-af
-af
-al
-bs
-az
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-cw
-ap
-az
-af
-af
-bd
-aa
-aa
-aa
-"}
-(38,1,1) = {"
-aa
-ac
-af
-af
-af
-am
-ax
-ap
-ap
-ap
-ap
-aM
-ap
-ap
-az
-af
-af
-af
-af
-am
-aq
-bv
-aE
-ar
-ay
-af
-af
-af
-af
-af
-af
-af
-ak
-cu
-aY
-aq
-aT
-af
-af
-bd
-aa
-aa
-aa
-"}
-(39,1,1) = {"
-aa
-ad
-ag
-af
-af
-af
-am
-aq
-aq
-ax
-ap
-ap
-ap
-aS
-aT
-af
-af
-af
-af
-af
-af
-af
-al
-bu
-az
-af
-af
-af
-af
-ak
-ar
-ar
-aY
-aq
-aT
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-"}
-(40,1,1) = {"
-aa
-aa
-ad
-ag
-af
-af
-af
-af
-af
-am
-aq
-aq
-ax
-az
-af
-af
-af
-af
-af
-af
-af
-af
-am
-aq
-bD
-an
-an
-an
-an
-ce
-bq
-aq
-aT
-af
-af
-af
-af
-af
-bc
-be
-aa
-aa
-aa
-"}
-(41,1,1) = {"
-aa
-aa
-aa
-ad
-ag
-af
-af
-af
-af
-af
-af
-af
-am
-aT
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(42,1,1) = {"
-aa
-aa
-aa
-aa
-ad
-aw
-ag
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bn
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-"}
-(43,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ac
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bc
-aw
-aw
-bo
-aw
-aw
-aw
-ag
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-bc
-aw
-aw
-be
-aa
-aa
-aa
-aa
-"}
-(44,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-ad
-aw
-aw
-ag
-af
-af
-af
-af
-af
-af
-bd
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aw
-aw
-aw
-aw
-aw
-aw
-aw
-aw
-aw
-aw
-aw
-be
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
-(45,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ad
-aw
-aw
-aw
-aw
-aw
-aw
-be
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-"}
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 9a7835d5e823..e2dcecd9bf4e 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -968,7 +968,7 @@
/turf/open/floor/iron/dark,
/area/centcom/central_command_areas/briefing)
"cL" = (
-/obj/item/gun/energy/pulse/carbine/loyalpin,
+/obj/item/gun/energy/pulse/carbine,
/obj/item/flashlight/seclite,
/obj/structure/table/reinforced,
/obj/machinery/airalarm/directional/south,
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index d5fc0a7ac0ec..933c40561483 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -170,22 +170,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define TRIGGER_GUARD_NONE 0
#define TRIGGER_GUARD_NORMAL 1
-//Gun bolt types
-///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
-/// Example: c20, shotguns, m90
-#define BOLT_TYPE_STANDARD 1
-///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
-/// Example: Some SMGs, the L6
-#define BOLT_TYPE_OPEN 2
-///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
-/// Example: Break action shotguns, revolvers
-#define BOLT_TYPE_NO_BOLT 3
-///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
-/// Example: Pistols with a slide lock, some SMGs
-#define BOLT_TYPE_LOCKING 4
-///This is effectively BOLT_TYPE_STANDARD and NO_BOLT in one.
-#define BOLT_TYPE_NO_BOLT_PLUS 5
-
//Sawn off nerfs
///accuracy penalty of sawn off guns
#define SAWN_OFF_ACC_PENALTY 25
diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm
index e7012590bae8..f4a862373bf6 100644
--- a/code/__DEFINES/projectiles.dm
+++ b/code/__DEFINES/projectiles.dm
@@ -15,17 +15,19 @@
/// The caliber used by the [security auto-rifle][/obj/item/gun/ballistic/automatic/wt550].
#define CALIBER_46X30MM "4.6x30mm"
/// The caliber used by the Nanotrasen Saber SMG, PP-95 SMG and Type U3 Uzi. Also used as the default caliber for pistols but only the stechkin APS machine pistol doesn't override it.
-#define CALIBER_9MM "9mm"
+#define CALIBER_9MM "9x19mm Parabellum"
/// The caliber used as the default for ballistic guns. Only not overridden for the [surplus rifle][/obj/item/gun/ballistic/automatic/surplus].
-#define CALIBER_10MM "10mm"
+#define CALIBER_10MM "10mm Auto"
/// The caliber used by most revolver variants.
-#define CALIBER_357 ".357"
+#define CALIBER_357 ".357 Smith & Wesson"
/// The caliber used by the detective's revolver.
-#define CALIBER_38 ".38"
+#define CALIBER_38 ".38 Special"
/// The caliber used by the C-20r SMG, the tommygun, and the M1911 pistol.
-#define CALIBER_45 ".45"
-/// The caliber used by sniper rifles and the desert eagle.
-#define CALIBER_50 ".50"
+#define CALIBER_45 ".45 ACP"
+/// The caliber used by the desert eagle.
+#define CALIBER_50_PISTOL ".50 Action Express"
+/// The caliber used by sniper rifles
+#define CALIBER_50_RIFLE ".50 BMG"
/// The caliber used by the gyrojet pistol.
#define CALIBER_75 ".75"
/// The caliber used by [one revolver variant][/obj/item/gun/ballistic/revolver/nagant].
@@ -35,7 +37,7 @@
/// The caliber used by bolt action rifles.
#define CALIBER_A762 "a762"
/// The caliber used by shotguns.
-#define CALIBER_SHOTGUN "shotgun"
+#define CALIBER_12GAUGE "12-gauge"
/// The caliber used by grenade launchers.
#define CALIBER_40MM "40mm"
/// The caliber used by rocket launchers.
diff --git a/code/datums/memory/memory.dm b/code/datums/memory/memory.dm
index 70f73c3bbe4e..cb81d8a46e18 100644
--- a/code/datums/memory/memory.dm
+++ b/code/datums/memory/memory.dm
@@ -60,8 +60,6 @@
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher,
/mob/living/simple_animal/hostile/headcrab,
/mob/living/simple_animal/hostile/morph,
- /mob/living/basic/stickman,
- /mob/living/basic/stickman/dog,
/mob/living/simple_animal/hostile/gorilla,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/pet/dog/corgi,
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index ee6724d659cc..92b8ff3190e3 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -144,13 +144,6 @@
description = "A caravan route used by passing cargo freights has been ambushed by a salvage team manned by the syndicate. \
The caravan managed to send off a distress message before being surrounded, their video feed cutting off as the sound of gunfire and a parrot was heard."
-/datum/map_template/ruin/space/originalcontent
- id = "paperwizard"
- suffix = "originalcontent.dmm"
- name = "A Giant Ball of Paper in Space"
- description = "Sightings of a giant wad of paper hurling through the depths of space have been recently reported by multiple outposts near this sector. \
- A giant wad of paper, really? Damn prank callers."
-
/datum/map_template/ruin/space/mech_transport
id = "mech-transport"
suffix = "mechtransport.dmm"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 907883825ce8..e795f93f1a06 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -705,7 +705,8 @@
var/list/materials_list = list()
for(var/datum/material/current_material as anything in custom_materials)
materials_list += "[current_material.name]"
- . += "It is made out of [english_list(materials_list)]."
+ . += "It is made out of [english_list(materials_list)]."
+
if(reagents)
. += "
" //PARIAH EDIT ADDITION
if(reagents.flags & TRANSPARENT)
diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm
index af040dabeded..39717e474120 100644
--- a/code/game/objects/items/fireaxe.dm
+++ b/code/game/objects/items/fireaxe.dm
@@ -9,7 +9,7 @@
name = "fire axe"
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
- force = 5
+ force = 10
force_wielded = 25
throwforce = 15
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 510df4d4a316..febfc44f9cc3 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -10,7 +10,7 @@
light_power = 1
light_on = FALSE
stealthy_audio = TRUE
- w_class = WEIGHT_CLASS_SMALL
+ w_class = WEIGHT_CLASS_NORMAL
/// The color of this energy based sword, for use in editing the icon_state.
var/sword_color_icon
@@ -29,12 +29,20 @@
/// The heat given off when active.
var/active_heat = 3500
+ var/datum/effect_system/spark_spread/spark_system
+ COOLDOWN_DECLARE(spark_cd)
+
/obj/item/melee/energy/Initialize(mapload)
. = ..()
make_transformable()
AddComponent(/datum/component/butchering, _speed = 5 SECONDS, _butcher_sound = active_hitsound)
+ spark_system = new /datum/effect_system/spark_spread()
+ spark_system.set_up(3, 0, src)
+ spark_system.attach(src)
+
/obj/item/melee/energy/Destroy()
+ QDEL_NULL(spark_system)
STOP_PROCESSING(SSobj, src)
return ..()
@@ -66,6 +74,10 @@
if(heat)
open_flame()
+ if(COOLDOWN_FINISHED(src, spark_cd))
+ spark_system.start()
+ COOLDOWN_START(src, spark_cd, rand(2 SECONDS, 4 SECONDS))
+
/obj/item/melee/energy/ignition_effect(atom/atom, mob/user)
if(!heat && !blade_active)
return ""
@@ -100,13 +112,14 @@
updateEmbedding()
heat = active_heat
START_PROCESSING(SSobj, src)
+ spark_system.start()
+ COOLDOWN_START(src, spark_cd, rand(2 SECONDS, 4 SECONDS))
else
if(embedding)
disableEmbedding()
heat = initial(heat)
STOP_PROCESSING(SSobj, src)
- balloon_alert(user, "[name] [active ? "enabled":"disabled"]")
playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE)
set_light_on(active)
return COMPONENT_NO_DEFAULT_MESSAGE
@@ -157,9 +170,11 @@
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
hitsound = SFX_SWING_HIT
force = 3
+
throwforce = 5
throw_speed = 3
throw_range = 5
+
armor_penetration = 35
block_chance = 50
embedding = list("embed_chance" = 75, "impact_pain_mult" = 10)
@@ -285,20 +300,6 @@
heat = 3500
w_class = WEIGHT_CLASS_BULKY
blade_active = TRUE
- /// Our linked spark system that emits from our sword.
- var/datum/effect_system/spark_spread/spark_system
-
-//Most of the other special functions are handled in their own files. aka special snowflake code so kewl
-/obj/item/melee/energy/blade/Initialize(mapload)
- . = ..()
- spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
- START_PROCESSING(SSobj, src)
-
-/obj/item/melee/energy/blade/Destroy()
- QDEL_NULL(spark_system)
- return ..()
/obj/item/melee/energy/blade/make_transformable()
return FALSE
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 2aec1217b869..fbb42687a3e7 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -633,30 +633,26 @@
new /obj/item/clothing/glasses/thermal/syndi(src)
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
- desc = "A large duffel bag containing a medical equipment, a Donksoft LMG, a big jumbo box of riot darts, and a knock-off pair of magboots."
+ desc = "A large duffel bag containing a medical equipment, and a knock-off pair of magboots."
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
new /obj/item/clothing/shoes/magboots/syndie(src)
new /obj/item/storage/medkit/tactical(src)
- new /obj/item/gun/ballistic/automatic/l6_saw/toy(src)
- new /obj/item/ammo_box/foambox/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."
+ desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, and a box of syringes."
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents()
new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src)
new /obj/item/storage/box/syndie_kit/chemical(src)
new /obj/item/gun/syringe/syndicate(src)
- new /obj/item/gun/ballistic/automatic/c20r/toy(src)
new /obj/item/storage/box/syringes(src)
- new /obj/item/ammo_box/foambox/riot(src)
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
if(prob(5))
new /obj/item/food/pizza/pineapple(src)
/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents()
- for(var/i in 1 to 10)
+ for(var/i in 1 to 4)
new /obj/item/grenade/c4(src)
/obj/item/storage/backpack/duffelbag/syndie/x4/PopulateContents()
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index c95895605e39..e1341900c94d 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -145,7 +145,7 @@
if(KIT_NUKEOPS_METAGAME)
new /obj/item/mod/control/pre_equipped/nuclear(src) // 8 tc
- new /obj/item/gun/ballistic/shotgun/bulldog/unrestricted(src) // 8 tc
+ new /obj/item/gun/ballistic/shotgun/bulldog(src) // 8 tc
new /obj/item/implanter/explosive(src) // 2 tc
new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
@@ -300,13 +300,6 @@
for(var/i in 1 to 7)
new /obj/item/reagent_containers/syringe/bioterror(src)
-/obj/item/storage/box/syndie_kit/clownpins
- name = "ultra hilarious firing pin box"
-
-/obj/item/storage/box/syndie_kit/clownpins/PopulateContents()
- for(var/i in 1 to 7)
- new /obj/item/firing_pin/clown/ultra(src)
-
/obj/item/storage/box/syndie_kit/imp_storage
name = "storage implant box"
diff --git a/code/modules/antagonists/clown_ops/outfits.dm b/code/modules/antagonists/clown_ops/outfits.dm
index 8536ffd056e0..15cd7407066c 100644
--- a/code/modules/antagonists/clown_ops/outfits.dm
+++ b/code/modules/antagonists/clown_ops/outfits.dm
@@ -12,7 +12,6 @@
backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
/obj/item/knife/combat/survival,
/obj/item/dnainjector/clumsymut, //in case you want to be clumsy for the memes
- /obj/item/storage/box/syndie_kit/clownpins, //for any guns that you get your grubby little clown op mitts on
/obj/item/reagent_containers/spray/waterflower/lube,
/obj/item/mod/skin_applier/honkerative,
)
diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm
index 82babe31609d..0263cf3f8a53 100644
--- a/code/modules/antagonists/gang/outfits.dm
+++ b/code/modules/antagonists/gang/outfits.dm
@@ -66,7 +66,7 @@
name = "Families: Space FBI Officer"
suit = /obj/item/clothing/suit/armor/laserproof
head = /obj/item/clothing/head/helmet/riot
- belt = /obj/item/gun/ballistic/automatic/proto/unrestricted
+ belt = /obj/item/gun/ballistic/automatic/proto
gloves = /obj/item/clothing/gloves/combat
backpack_contents = list(/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/teargas = 1,
diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm
index 131f289b66fb..805a97431090 100644
--- a/code/modules/antagonists/heretic/items/hunter_rifle.dm
+++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm
@@ -20,7 +20,6 @@
ammo_type = /obj/item/ammo_casing/a762/lionhunter
caliber = CALIBER_A762
max_ammo = 3
- multiload = TRUE
/obj/item/ammo_casing/a762/lionhunter
projectile_type = /obj/projectile/bullet/a762/lionhunter
diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm
index f3786b84d1fa..ff1af641ad73 100644
--- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm
@@ -80,14 +80,14 @@
CALIBER_38,
CALIBER_45,
CALIBER_46X30MM,
- CALIBER_50,
+ CALIBER_50_RIFLE,
CALIBER_712X82MM,
CALIBER_75,
CALIBER_9MM,
CALIBER_A556,
CALIBER_A762,
CALIBER_N762,
- CALIBER_SHOTGUN,
+ CALIBER_12GAUGE,
)
/datum/heretic_knowledge/rifle_ammo/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm
index 96adc26047f0..bb0794168114 100644
--- a/code/modules/capture_the_flag/ctf_equipment.dm
+++ b/code/modules/capture_the_flag/ctf_equipment.dm
@@ -75,7 +75,6 @@
fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg'
semi_auto = TRUE
internal_magazine = FALSE
- tac_reloads = TRUE
/obj/item/gun/ballistic/shotgun/ctf/Initialize(mapload)
. = ..()
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 1eac38364909..0b69806b92a6 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -2384,16 +2384,6 @@
/obj/item/ammo_box/magazine/toy/pistol)
crate_name = "foam force crate"
-/datum/supply_pack/costumes_toys/riot_foam
- name = "Riot Foam Darts Crate"
- desc = "Lock and load your foam force arsenal to floor your opponents with 120 of our new and improved high density foam darts! Remember, it's Donk or Die!"
- contraband = TRUE
- cost = CARGO_CRATE_VALUE * 4
- contains = list(/obj/item/ammo_box/foambox/riot,
- /obj/item/ammo_box/foambox/riot,
- /obj/item/ammo_box/foambox/riot)
- crate_name = "riot foam darts crate"
-
/datum/supply_pack/costumes_toys/formalwear
name = "Formalwear Crate"
desc = "You're gonna like the way you look, I guaranteed it. Contains an asston of fancy clothing."
@@ -2427,15 +2417,6 @@
crate_name = "formalwear crate"
crate_type = /obj/structure/closet/crate/wooden
-/datum/supply_pack/costumes_toys/clownpin
- name = "Hilarious Firing Pin Crate"
- desc = "I uh... I'm not really sure what this does. Wanna buy it?"
- cost = CARGO_CRATE_VALUE * 10
- contraband = TRUE
- contains = list(/obj/item/firing_pin/clown)
- crate_name = "toy crate" // It's /technically/ a toy. For the clown, at least.
- crate_type = /obj/structure/closet/crate/wooden
-
/datum/supply_pack/costumes_toys/lasertag
name = "Laser Tag Crate"
desc = "Foam Force is for boys. Laser Tag is for men. Contains three sets of red suits, blue suits, matching helmets, and matching laser tag guns."
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 827a43c9aa85..d12ee9733d4b 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -57,12 +57,12 @@
name = "ERT Commander - High Alert"
backpack_contents = list(
- /obj/item/gun/energy/pulse/pistol/loyalpin = 1,
+ /obj/item/gun/energy/pulse/pistol = 1,
/obj/item/melee/baton/security/loaded = 1,
/obj/item/storage/box/survival/engineer = 1,
+ /obj/item/melee/energy/sword/saber = 1,
)
glasses = /obj/item/clothing/glasses/thermal/eyepatch
- l_pocket = /obj/item/melee/energy/sword/saber
/datum/outfit/centcom/ert/security
name = "ERT Security"
@@ -93,7 +93,7 @@
/datum/outfit/centcom/ert/security/alert
name = "ERT Security - High Alert"
- l_hand = /obj/item/gun/energy/pulse/carbine/loyalpin
+ l_hand = /obj/item/gun/energy/pulse/carbine
backpack_contents = list(
/obj/item/melee/baton/security/loaded = 1,
/obj/item/storage/belt/security/full = 1,
@@ -133,7 +133,7 @@
name = "ERT Medic - High Alert"
backpack_contents = list(
- /obj/item/gun/energy/pulse/pistol/loyalpin = 1,
+ /obj/item/gun/energy/pulse/pistol = 1,
/obj/item/gun/medbeam = 1,
/obj/item/melee/baton/security/loaded = 1,
/obj/item/reagent_containers/hypospray/combat/nanites = 1,
@@ -174,7 +174,7 @@
backpack_contents = list(
/obj/item/construction/rcd/combat = 1,
- /obj/item/gun/energy/pulse/pistol/loyalpin = 1,
+ /obj/item/gun/energy/pulse/pistol = 1,
/obj/item/melee/baton/security/loaded = 1,
/obj/item/pipe_dispenser = 1,
/obj/item/storage/box/survival/engineer = 1,
@@ -510,6 +510,7 @@
/obj/item/storage/box/flashbangs = 1,
/obj/item/storage/box/survival/engineer = 1,
/obj/item/storage/medkit/regular = 1,
+ /obj/item/melee/energy/sword/saber = 1,
)
belt = /obj/item/gun/ballistic/revolver/mateba
ears = /obj/item/radio/headset/headset_cent/alt
@@ -517,9 +518,8 @@
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
mask = /obj/item/clothing/mask/gas/sechailer/swat
shoes = /obj/item/clothing/shoes/combat/swat
- l_pocket = /obj/item/melee/energy/sword/saber
r_pocket = /obj/item/shield/energy
- l_hand = /obj/item/gun/energy/pulse/loyalpin
+ l_hand = /obj/item/gun/energy/pulse
skillchips = list(
/obj/item/skillchip/disk_verifier,
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 4aa38d0f8ac1..7b2c0e65a7f5 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -236,7 +236,7 @@
gloves = /obj/item/clothing/gloves/color/black
glasses = /obj/item/clothing/glasses/sunglasses
shoes = /obj/item/clothing/shoes/sneakers/black
- l_pocket = /obj/item/melee/energy/sword/saber
+ r_hand = /obj/item/melee/energy/sword/saber
l_hand = /obj/item/storage/secure/briefcase
/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 23c20812b382..49413170dd23 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -148,37 +148,6 @@
armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)
resistance_flags = FLAMMABLE
-/obj/item/clothing/suit/wizrobe/paper
- name = "papier-mache robe" // no non-latin characters!
- desc = "A robe held together by various bits of clear-tape and paste."
- icon_state = "wizard-paper"
- inhand_icon_state = "wizard-paper"
- var/robe_charge = TRUE
- actions_types = list(/datum/action/item_action/stickmen)
-
-
-/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action)
- stickmen()
-
-
-/obj/item/clothing/suit/wizrobe/paper/verb/stickmen()
- set category = "Object"
- set name = "Summon Stick Minions"
- if(!isliving(usr))
- return
- if(!robe_charge)
- to_chat(usr, span_warning("The robe's internal magic supply is still recharging!"))
- return
-
- usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning")
- playsound(loc, 'sound/magic/summon_magic.ogg', 50, TRUE, TRUE)
- var/mob/living/M = new /mob/living/basic/stickman(get_turf(usr))
- M.faction += list("[REF(usr)]")
- robe_charge = FALSE
- sleep(30)
- robe_charge = TRUE
- to_chat(usr, span_notice("The robe hums, its internal magic supply restored."))
-
// The actual code for this is handled in the shielded component, see [/datum/component/shielded/proc/check_recharge_rune]
/obj/item/wizard_armour_charge
name = "battlemage shield charges"
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm b/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm
deleted file mode 100644
index e89cf44f56c1..000000000000
--- a/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/////////// originalcontent items
-
-/obj/item/paper/crumpled/ruins/originalcontent
- desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings."
-
-/obj/item/paper/pamphlet/ruin/originalcontent
- icon = 'icons/obj/fluff.dmi'
-
-/obj/item/paper/pamphlet/ruin/originalcontent/stickman
- name = "Painting - 'BANG'"
- info = "This picture depicts a crudely-drawn stickman firing a crudely-drawn gun."
- icon_state = "painting4"
-
-/obj/item/paper/pamphlet/ruin/originalcontent/treeside
- name = "Painting - 'Treeside'"
- info = "This picture depicts a sunny day on a lush hillside, set under a shaded tree."
- icon_state = "painting1"
-
-/obj/item/paper/pamphlet/ruin/originalcontent/pennywise
- name = "Painting - 'Pennywise'"
- info = "This picture depicts a smiling clown. Something doesn't feel right about this.."
- icon_state = "painting3"
-
-/obj/item/paper/pamphlet/ruin/originalcontent/yelling
- name = "Painting - 'Hands-On-Face'"
- info = "This picture depicts a man yelling on a bridge for no apparent reason."
- icon_state = "painting2"
-
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 0855931f2dd1..428f7fbafb31 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -230,8 +230,8 @@
new /obj/item/clothing/mask/balaclava(src)
new /obj/item/gun/ballistic/shotgun/toy(src)
new /obj/item/gun/ballistic/automatic/pistol/toy(src)
- new /obj/item/gun/ballistic/automatic/toy/unrestricted(src)
- new /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted(src)
+ new /obj/item/gun/ballistic/automatic/toy(src)
+ new /obj/item/gun/ballistic/automatic/l6_saw/toy(src)
new /obj/item/ammo_box/foambox(src)
if(98)
for(var/i in 1 to 3)
diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm
deleted file mode 100644
index ead99a971c64..000000000000
--- a/code/modules/mob/living/basic/ruin_defender/stickman.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-/mob/living/basic/stickman
- name = "Angry Stick Man"
- desc = "A being from a realm with only 2 dimensions. At least it's trying to stay faced towards you."
- icon_state = "stickman"
- icon_living = "stickman"
- icon_dead = "stickman_dead"
- mob_biotypes = MOB_HUMANOID
- gender = MALE
- health = 100
- maxHealth = 100
- speed = 0.5
- attack_verb_continuous = "punches"
- attack_verb_simple = "punch"
- melee_damage_lower = 10
- melee_damage_upper = 10
- attack_sound = SFX_PUNCH
- combat_mode = TRUE
- faction = list("stickman")
-
- ai_controller = /datum/ai_controller/basic_controller/stickman
-
-/mob/living/basic/stickman/Initialize(mapload)
- . = ..()
- new /obj/effect/temp_visual/paper_scatter(get_turf(src))
- AddElement(/datum/element/basic_body_temp_sensitive, cold_damage = 7.5, heat_damage = 7.5)
- AddElement(/datum/element/atmos_requirements, list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0), 7.5)
-
-/datum/ai_controller/basic_controller/stickman
- blackboard = list(
- BB_TARGETTING_DATUM = new /datum/targetting_datum/basic()
- )
-
- ai_movement = /datum/ai_movement/basic_avoidance
- idle_behavior = /datum/idle_behavior/idle_random_walk
- planning_subtrees = list(
- /datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/basic_melee_attack_subtree/stickman
- )
-
-/datum/ai_planning_subtree/basic_melee_attack_subtree/stickman
- melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/stickman
-
-/datum/ai_behavior/basic_melee_attack/stickman
- action_cooldown = 1.5 SECONDS
-
-/mob/living/basic/stickman/dog
- name = "Angry Stick Dog"
- desc = "Stickman's best friend, if he could see him at least."
- icon_state = "stickdog"
- icon_living = "stickdog"
- icon_dead = "stickdog_dead"
- attack_verb_continuous = "bites"
- attack_verb_simple = "bite"
- attack_vis_effect = ATTACK_EFFECT_BITE
- sharpness = SHARP_POINTY
- mob_biotypes = MOB_BEAST
- attack_sound = 'sound/weapons/bite.ogg'
-
-/mob/living/basic/stickman/ranged
- name = "Angry Stick Gunman"
- desc = "How do 2 dimensional guns even work??"
- icon_state = "stickmanranged"
- icon_living = "stickmanranged"
- attack_verb_continuous = "whacks"
- attack_verb_simple = "whack"
- melee_damage_lower = 5
- melee_damage_upper = 5
- attack_sound = 'sound/weapons/genhit1.ogg'
-
- ai_controller = /datum/ai_controller/basic_controller/stickman/ranged
-
-/mob/living/basic/stickman/ranged/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/death_drops, list(/obj/item/gun/ballistic/automatic/pistol/stickman))
- AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/c9mm, 'sound/misc/bang.ogg')
-
-/datum/ai_controller/basic_controller/stickman/ranged
- planning_subtrees = list(
- /datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/basic_ranged_attack_subtree/stickman
- )
-
-/datum/ai_planning_subtree/basic_ranged_attack_subtree/stickman
- ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/stickman
-
-/datum/ai_behavior/basic_ranged_attack/stickman
- action_cooldown = 5 SECONDS
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 1cf870fcb57b..d54f3fe8a329 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1210,7 +1210,6 @@
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher,
/mob/living/simple_animal/hostile/headcrab,
/mob/living/simple_animal/hostile/morph,
- /mob/living/basic/stickman,
/mob/living/simple_animal/hostile/gorilla,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/pet/dog/corgi,
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
deleted file mode 100644
index 5e3a7a9a6835..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm
+++ /dev/null
@@ -1,207 +0,0 @@
-//Paper Wizard Boss
-/mob/living/simple_animal/hostile/boss/paper_wizard
- name = "Mjor the Creative"
- desc = "A wizard with a taste for the arts."
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- boss_abilities = list(/datum/action/boss/wizard_summon_minions, /datum/action/boss/wizard_mimic)
- faction = list("hostile","stickman")
- del_on_death = TRUE
- icon = 'icons/mob/simple_human.dmi'
- icon_state = "paperwizard"
- ranged = 1
- environment_smash = ENVIRONMENT_SMASH_NONE
- minimum_distance = 3
- retreat_distance = 3
- obj_damage = 0
- melee_damage_lower = 10
- melee_damage_upper = 20
- health = 1000
- maxHealth = 1000
- loot = list(/obj/effect/temp_visual/paperwiz_dying)
- projectiletype = /obj/projectile/temp
- projectilesound = 'sound/weapons/emitter.ogg'
- attack_sound = 'sound/hallucinations/growl1.ogg'
- var/list/copies = list()
-
- footstep_type = FOOTSTEP_MOB_SHOE
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/Destroy()
- QDEL_LIST(copies)
- return ..()
-
-//Summon Ability
-//Lets the wizard summon his art to fight for him
-/datum/action/boss/wizard_summon_minions
- name = "Summon Minions"
- button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "art_summon"
- usage_probability = 40
- boss_cost = 30
- boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
- needs_target = FALSE
- say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!"
- ///How many minions we summoned
- var/summoned_minions = 0
- ///How many minions we can have at once
- var/max_minions = 6
- ///How many minions we should spawn
- var/minions_to_summon = 3
-
-/datum/action/boss/wizard_summon_minions/IsAvailable(feedback = FALSE)
- . = ..()
- if(!.)
- return FALSE
- if(summoned_minions >= max_minions)
- return FALSE
- return TRUE
-
-/datum/action/boss/wizard_summon_minions/Trigger(trigger_flags)
- . = ..()
- if(!.)
- return
- var/list/minions = list(
- /mob/living/basic/stickman,
- /mob/living/basic/stickman/ranged,
- /mob/living/basic/stickman/dog)
- var/list/directions = GLOB.cardinals.Copy()
- var/summon_amount = min(minions_to_summon, max_minions - summoned_minions)
- for(var/i in 1 to summon_amount)
- var/atom/chosen_minion = pick_n_take(minions)
- chosen_minion = new chosen_minion(get_step(boss, pick_n_take(directions)))
- RegisterSignal(chosen_minion, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(lost_minion))
- summoned_minions++
-
-/// Called when a minion is qdeleted or dies, removes it from our minion list
-/datum/action/boss/wizard_summon_minions/proc/lost_minion(mob/source)
- SIGNAL_HANDLER
-
- UnregisterSignal(source, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH))
- summoned_minions--
-
-//Mimic Ability
-//Summons mimics of himself with magical papercraft
-//Hitting a decoy hurts nearby people excluding the wizard himself
-//Hitting the wizard himself destroys all decoys
-/datum/action/boss/wizard_mimic
- name = "Craft Mimicry"
- button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- button_icon_state = "mimic_summon"
- usage_probability = 30
- boss_cost = 40
- boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
- say_when_triggered = ""
-
-/datum/action/boss/wizard_mimic/Trigger(trigger_flags)
- if(..())
- var/mob/living/target
- if(!boss.client) //AI's target
- target = boss.target
- else //random mob
- var/list/threats = boss.PossibleThreats()
- if(threats.len)
- target = pick(threats)
- if(target)
- var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss
- var/directions = GLOB.cardinals.Copy()
- for(var/i in 1 to 3)
- var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions)))
- wiz.copies += C
- C.original = wiz
- C.say("My craft defines me, you could even say it IS me!")
- wiz.say("My craft defines me, you could even say it IS me!")
- wiz.forceMove(get_step(target,pick_n_take(directions)))
- wiz.minimum_distance = 1 //so he doesn't run away and ruin everything
- wiz.retreat_distance = 0
- else
- boss.atb.refund(boss_cost)
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy
- desc = "'Tis a ruse!"
- health = 1
- maxHealth = 1
- alpha = 200
- boss_abilities = list()
- melee_damage_lower = 1
- melee_damage_upper = 5
- minimum_distance = 0
- retreat_distance = 0
- ranged = 0
- loot = list()
- var/mob/living/simple_animal/hostile/boss/paper_wizard/original
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/Destroy()
- if(original)
- original.copies -= src
- original = null
- return ..()
-
-//Hit a fake? eat pain!
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(amount > 0) //damage
- if(original)
- original.minimum_distance = 3
- original.retreat_distance = 3
- for(var/c in original.copies)
- qdel(c)
- for(var/mob/living/L in range(5,src))
- if(L == original || istype(L, type))
- continue
- L.adjustBruteLoss(50)
- qdel(src)
- else
- . = ..()
-
-//Hit the real guy? copies go bai-bai
-/mob/living/simple_animal/hostile/boss/paper_wizard/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0)//damage
- minimum_distance = 3
- retreat_distance = 3
- for(var/copy in copies)
- qdel(copy)
-
-/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user)
- . = ..()
- if(isobserver(user))
- . += span_notice("It's an illusion - what is it hiding?")
- else
- qdel(src) //I see through your ruse!
-
-//fancy effects
-/obj/effect/temp_visual/paper_scatter
- name = "scattering paper"
- desc = "Pieces of paper scattering to the wind."
- layer = ABOVE_OPEN_TURF_LAYER
- plane = GAME_PLANE
- icon = 'icons/effects/effects.dmi'
- icon_state = "paper_scatter"
- anchored = TRUE
- duration = 5
- randomdir = FALSE
-
-/obj/effect/temp_visual/paperwiz_dying
- name = "craft portal"
- desc = "A wormhole sucking the wizard into the void. Neat."
- layer = ABOVE_OPEN_TURF_LAYER
- plane = GAME_PLANE
- icon = 'icons/effects/effects.dmi'
- icon_state = "paperwiz_poof"
- anchored = TRUE
- duration = 18
- randomdir = FALSE
-
-/obj/effect/temp_visual/paperwiz_dying/Initialize(mapload)
- . = ..()
- visible_message(span_boldannounce("The wizard cries out in pain as a gate appears behind him, sucking him in!"))
- playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, TRUE, TRUE)
- playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, TRUE, TRUE)
-
-/obj/effect/temp_visual/paperwiz_dying/Destroy()
- for(var/mob/M in range(7,src))
- shake_camera(M, 7, 1)
- var/turf/T = get_turf(src)
- playsound(T,'sound/magic/summon_magic.ogg', 50, TRUE, TRUE)
- new /obj/effect/temp_visual/paper_scatter(T)
- new /obj/item/clothing/suit/wizrobe/paper(T)
- new /obj/item/clothing/head/collectable/paper(T)
- return ..()
diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm
index 392286c2eaec..890fb0b8f9f9 100644
--- a/code/modules/mob_spawn/ghost_roles/space_roles.dm
+++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm
@@ -232,7 +232,6 @@
/datum/outfit/syndicate_empty/battlecruiser/assault/captain
name = "Syndicate Battlecruiser Captain"
- l_pocket = /obj/item/melee/energy/sword/saber/red
r_pocket = /obj/item/melee/baton/telescopic
suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
suit_store = /obj/item/gun/ballistic/revolver/mateba
@@ -243,3 +242,7 @@
glasses = /obj/item/clothing/glasses/thermal/eyepatch
id = /obj/item/card/id/advanced/black/syndicate_command/captain_id
id_trim = /datum/id_trim/battlecruiser/captain
+
+ backpack_contents = list(
+ /obj/item/melee/energy/sword/saber/red,
+ )
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index f508a7fb4a64..151ae0e34f52 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -48,7 +48,7 @@
// .50AE (Desert Eagle)
/obj/item/ammo_casing/a50ae
- name = ".50AE bullet casing"
- desc = "A .50AE bullet casing."
- caliber = CALIBER_50
+ name = ".50 AE bullet casing"
+ desc = "A .50 AE bullet casing."
+ caliber = CALIBER_50_PISTOL
projectile_type = /obj/projectile/bullet/a50ae
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index 8784bdeece3c..426a815293bf 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -1,4 +1,4 @@
-// .357 (Syndie Revolver)
+// .357 (Revolver)
/obj/item/ammo_casing/a357
name = ".357 bullet casing"
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 99cde7b51d2f..e971b78725b5 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -5,7 +5,7 @@
desc = "A 12 gauge lead slug."
icon_state = "blshell"
worn_icon_state = "shell"
- caliber = CALIBER_SHOTGUN
+ caliber = CALIBER_12GAUGE
custom_materials = list(/datum/material/iron=4000)
projectile_type = /obj/projectile/bullet/shotgun_slug
diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm
index 3749520a522d..e1514419f32f 100644
--- a/code/modules/projectiles/ammunition/ballistic/sniper.dm
+++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm
@@ -1,25 +1,25 @@
// .50 (Sniper)
/obj/item/ammo_casing/p50
- name = ".50 bullet casing"
- desc = "A .50 bullet casing."
- caliber = CALIBER_50
+ name = ".50 BMG bullet casing"
+ desc = "A .50 BMG bullet casing."
+ caliber = CALIBER_50_RIFLE
projectile_type = /obj/projectile/bullet/p50
icon_state = ".50"
/obj/item/ammo_casing/p50/soporific
- name = ".50 soporific bullet casing"
- desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
+ name = ".50 BMG soporific bullet casing"
+ desc = "A .50 BMG bullet casing, specialised in sending the target to sleep, instead of hell."
projectile_type = /obj/projectile/bullet/p50/soporific
icon_state = "sleeper"
harmful = FALSE
/obj/item/ammo_casing/p50/penetrator
- name = ".50 penetrator round bullet casing"
- desc = "A .50 caliber penetrator round casing."
+ name = ".50 BMG penetrator round bullet casing"
+ desc = "A .50 BMG caliber penetrator round casing."
projectile_type = /obj/projectile/bullet/p50/penetrator
/obj/item/ammo_casing/p50/marksman
- name = ".50 marksman round bullet casing"
- desc = "A .50 caliber marksman round casing."
+ name = ".50 BMG marksman round bullet casing"
+ desc = "A .50 BMG caliber marksman round casing."
projectile_type = /obj/projectile/bullet/p50/marksman
diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
index 32e19e49c9a4..f0300071c425 100644
--- a/code/modules/projectiles/ammunition/caseless/foam.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -56,11 +56,3 @@
user.put_in_hands(FD.pen)
to_chat(user, span_notice("You remove [FD.pen] from [src]."))
FD.pen = null
-
-/obj/item/ammo_casing/caseless/foam_dart/riot
- name = "riot foam dart"
- desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
- projectile_type = /obj/projectile/bullet/reusable/foam_dart/riot
- icon_state = "foamdart_riot"
- base_icon_state = "foamdart_riot"
- custom_materials = list(/datum/material/iron = 1125)
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 61d5c371923e..077d9ebd8aa5 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -15,22 +15,27 @@
throw_speed = 3
throw_range = 7
override_notes = TRUE
+
+ ///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines
+ var/caliber
+
///list containing the actual ammo within the magazine
var/list/stored_ammo = list()
///type that the magazine will be searching for, rejects if not a subtype of
var/ammo_type = /obj/item/ammo_casing
///maximum amount of ammo in the magazine
var/max_ammo = 7
+
///Controls how sprites are updated for the ammo box; see defines in combat.dm: AMMO_BOX_ONE_SPRITE; AMMO_BOX_PER_BULLET; AMMO_BOX_FULL_EMPTY
var/multiple_sprites = AMMO_BOX_ONE_SPRITE
///For sprite updating, do we use initial(icon_state) or base_icon_state?
var/multiple_sprite_use_base = FALSE
- ///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
+
+ ///Delay for loading bullets in.
+ var/load_delay = 0.5 SECONDS
///Whether the magazine should start with nothing in it
var/start_empty = FALSE
+
///cost of all the bullets in the magazine/box
var/list/bullet_cost
///cost of the materials in the magazine/box itself
@@ -41,6 +46,7 @@
if(!bullet_cost)
base_cost = SSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.1)
bullet_cost = SSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.9 / max_ammo)
+
if(!start_empty)
top_off(starting=TRUE)
@@ -102,35 +108,8 @@
/obj/item/ammo_box/proc/can_load(mob/user)
return TRUE
-/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
- var/num_loaded = 0
- if(!can_load(user))
- return
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- var/did_load = give_round(AC, replace_spent)
- if(did_load)
- AM.stored_ammo -= AC
- num_loaded++
- if(!did_load || !multiload)
- break
- if(num_loaded)
- AM.update_ammo_count()
- if(isammocasing(A))
- var/obj/item/ammo_casing/AC = A
- if(give_round(AC, replace_spent))
- user.transferItemToLoc(AC, src, TRUE)
- num_loaded++
- AC.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()
-
- return num_loaded
+/obj/item/ammo_box/attackby(obj/item/A, mob/user, params)
+ return attempt_load_round(A, user)
/obj/item/ammo_box/attack_self(mob/user)
var/obj/item/ammo_casing/A = get_round()
@@ -144,15 +123,52 @@
to_chat(user, span_notice("You remove a round from [src]!"))
update_ammo_count()
+/// Attempts to load a given item into this ammo box
+/obj/item/ammo_box/proc/attempt_load_round(obj/item/I, mob/user, silent = FALSE, replace_spent = FALSE)
+ var/num_loaded = 0
+ if(!can_load(user))
+ return FALSE
+
+ if(istype(I, /obj/item/ammo_box))
+ var/obj/item/ammo_box/AM = I
+ for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
+ if(user && load_delay && !do_after(user, src, load_delay, IGNORE_USER_LOC_CHANGE, FALSE, interaction_key = "load_round"))
+ break
+
+ var/did_load = give_round(AC, replace_spent)
+ if(!did_load)
+ break
+
+ AM.stored_ammo -= AC
+ num_loaded++
+ if(!silent)
+ user?.visible_message(
+ span_notice("[user] loads a round into [src]."),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ )
+ playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
+ update_ammo_count()
+ AM.update_ammo_count()
+
+ if(isammocasing(I))
+ var/obj/item/ammo_casing/AC = I
+ if(give_round(AC, replace_spent))
+ user.transferItemToLoc(AC, src, TRUE)
+ num_loaded++
+ if(!silent)
+ playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
+ update_ammo_count()
+
+ return num_loaded
+
/// Updates the materials and appearance of this ammo box
/obj/item/ammo_box/proc/update_ammo_count()
update_custom_materials()
update_appearance()
-/obj/item/ammo_box/update_desc(updates)
+/obj/item/ammo_box/examine(mob/user)
. = ..()
- var/shells_left = LAZYLEN(stored_ammo)
- desc = "[initial(desc)] There [(shells_left == 1) ? "is" : "are"] [shells_left] shell\s left!"
+ . += span_notice(get_ammo_desc())
/obj/item/ammo_box/update_icon_state()
var/shells_left = LAZYLEN(stored_ammo)
@@ -170,8 +186,33 @@
temp_materials[material] = (bullet_cost[material] * stored_ammo.len) + base_cost[material]
set_custom_materials(temp_materials)
+/// Returns a string that describes the amount of ammo in the magazine.
+/obj/item/ammo_box/proc/get_ammo_desc(exact)
+ if(exact)
+ return "There are [ammo_count(TRUE)] rounds in [src]."
+
+ var/ammo_count = ammo_count(TRUE)
+ if(ammo_count == 1)
+ return "There is one round left."
+
+ var/ammo_percent = ceil(((ammo_count / max_ammo) * 100))
+
+ switch(ammo_percent)
+ if(0)
+ return "It is empty."
+ if(1 to 20)
+ return "It rattles when you shake it."
+ if(21 to 40)
+ return "It is running low on rounds."
+ if(41 to 69)
+ return "It is about half full."
+ if(70 to 99)
+ return "It is mostly full."
+ if(100)
+ return "It is fully loaded."
+
///Count of number of bullets in the magazine
-/obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE)
+/obj/item/ammo_box/proc/ammo_count(countempties = TRUE)
var/boolets = 0
for(var/obj/item/ammo_casing/bullet in stored_ammo)
if(bullet && (bullet.loaded_projectile || countempties))
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 8ffa5b51a7a6..6b28f2407bb9 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -97,8 +97,3 @@
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)
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index 91d76ab1d74f..6b5540d4f81a 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -1,5 +1,5 @@
/obj/item/ammo_box/magazine/m10mm
- name = "pistol magazine (10mm)"
+ name = "8-round pistol magazine (10mm Auto)"
desc = "A gun magazine."
icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c10mm
@@ -8,7 +8,7 @@
multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/m45
- name = "handgun magazine (.45)"
+ name = "8-round pistol magazine (.45 ACP)"
icon_state = "45-8"
base_icon_state = "45"
ammo_type = /obj/item/ammo_casing/c45
@@ -20,7 +20,7 @@
icon_state = "[base_icon_state]-[min(ammo_count(), 8)]"
/obj/item/ammo_box/magazine/m9mm
- name = "pistol magazine (9mm)"
+ name = "8-round pistol magazine (9x19mm)"
icon_state = "9x19p-8"
base_icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c9mm
@@ -32,25 +32,25 @@
icon_state = "[base_icon_state]-[ammo_count() ? "8" : "0"]"
/obj/item/ammo_box/magazine/m9mm/fire
- name = "pistol magazine (9mm incendiary)"
+ name = "8-round pistol magazine (9x19mm incendiary)"
icon_state = "9x19pI"
desc = "A gun magazine. Loaded with rounds which ignite the target."
ammo_type = /obj/item/ammo_casing/c9mm/fire
/obj/item/ammo_box/magazine/m9mm/hp
- name = "pistol magazine (9mm HP)"
+ name = "8-round pistol magazine (9x19mm HP)"
icon_state = "9x19pH"
desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing."
ammo_type = /obj/item/ammo_casing/c9mm/hp
/obj/item/ammo_box/magazine/m9mm/ap
- name = "pistol magazine (9mm AP)"
+ name = "8-round pistol magazine (9x19mm AP)"
icon_state = "9x19pA"
desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets."
ammo_type = /obj/item/ammo_casing/c9mm/ap
/obj/item/ammo_box/magazine/m9mm_aps
- name = "stechkin pistol magazine (9mm)"
+ name = "15-round pistol magazine (9x19mm)"
icon_state = "9mmaps-15"
base_icon_state = "9mmaps"
ammo_type = /obj/item/ammo_casing/c9mm
@@ -62,24 +62,24 @@
icon_state = "[base_icon_state]-[round(ammo_count(), 5)]"
/obj/item/ammo_box/magazine/m9mm_aps/fire
- name = "stechkin pistol magazine (9mm incendiary)"
+ name = "15-round pistol magazine (9x19mm incendiary)"
ammo_type = /obj/item/ammo_casing/c9mm/fire
max_ammo = 15
/obj/item/ammo_box/magazine/m9mm_aps/hp
- name = "stechkin pistol magazine (9mm HP)"
+ name = "15-round pistol magazine (9x19mm HP)"
ammo_type = /obj/item/ammo_casing/c9mm/hp
max_ammo = 15
/obj/item/ammo_box/magazine/m9mm_aps/ap
- name = "stechkin pistol magazine (9mm AP)"
+ name = "15-round pistol magazine (9x19mm AP)"
ammo_type = /obj/item/ammo_casing/c9mm/ap
max_ammo = 15
/obj/item/ammo_box/magazine/m50
- name = "handgun magazine (.50ae)"
+ name = "7-round pistol magazine (.50 AE)"
icon_state = "50ae"
ammo_type = /obj/item/ammo_casing/a50ae
- caliber = CALIBER_50
+ caliber = CALIBER_50_PISTOL
max_ammo = 7
multiple_sprites = AMMO_BOX_PER_BULLET
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
index 14c1d1550bd5..a4c033cc1a4e 100644
--- a/code/modules/projectiles/boxes_magazines/external/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -1,5 +1,5 @@
/obj/item/ammo_box/magazine/m10mm/rifle
- name = "rifle magazine (10mm)"
+ name = "10-round magazine (10mm Auto)"
desc = "A well-worn magazine fitted for the surplus rifle."
icon_state = "75-8"
base_icon_state = "75"
@@ -11,7 +11,7 @@
icon_state = "[base_icon_state]-[ammo_count() ? "8" : "0"]"
/obj/item/ammo_box/magazine/m556
- name = "toploader magazine (5.56mm)"
+ name = "30-round magazine (5.56x45mm)"
icon_state = "5.56m"
ammo_type = /obj/item/ammo_casing/a556
caliber = CALIBER_A556
@@ -19,5 +19,5 @@
multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/m556/phasic
- name = "toploader magazine (5.56mm Phasic)"
+ name = "30-round magazine (5.56x45mm phasic)"
ammo_type = /obj/item/ammo_casing/a556/phasic
diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
index f9b7a4fe83a8..100db7d2742f 100644
--- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
@@ -4,7 +4,7 @@
icon_state = "m12gb"
base_icon_state = "m12gb"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- caliber = CALIBER_SHOTGUN
+ caliber = CALIBER_12GAUGE
max_ammo = 8
/obj/item/ammo_box/magazine/m12g/update_icon_state()
@@ -12,26 +12,26 @@
icon_state = "[base_icon_state]-[CEILING(ammo_count(FALSE)/8, 1)*8]"
/obj/item/ammo_box/magazine/m12g/stun
- name = "shotgun magazine (12g taser slugs)"
+ name = "8-round shotgun magazine (12g taser slugs)"
icon_state = "m12gs"
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
/obj/item/ammo_box/magazine/m12g/slug
- name = "shotgun magazine (12g slugs)"
+ name = "8-round shotgun magazine (12g slugs)"
icon_state = "m12gb" //this may need an unique sprite
ammo_type = /obj/item/ammo_casing/shotgun
/obj/item/ammo_box/magazine/m12g/dragon
- name = "shotgun magazine (12g dragon's breath)"
+ name = "8-round shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath
/obj/item/ammo_box/magazine/m12g/bioterror
- name = "shotgun magazine (12g bioterror)"
+ name = "8-round shotgun magazine (12g bioterror)"
icon_state = "m12gt"
ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
/obj/item/ammo_box/magazine/m12g/meteor
- name = "shotgun magazine (12g meteor slugs)"
+ name = "8-round shotgun magazine (12g meteor slugs)"
icon_state = "m12gbc"
ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
index f45494f7c90d..17f1473e1f68 100644
--- a/code/modules/projectiles/boxes_magazines/external/smg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -1,5 +1,5 @@
/obj/item/ammo_box/magazine/wt550m9
- name = "wt550 magazine (4.6x30mm)"
+ name = "20-round magazine (4.6x30mm)"
icon_state = "46x30mmt-20"
base_icon_state = "46x30mmt"
ammo_type = /obj/item/ammo_casing/c46x30mm
@@ -11,7 +11,7 @@
icon_state = "[base_icon_state]-[round(ammo_count(), 4)]"
/obj/item/ammo_box/magazine/wt550m9/wtap
- name = "wt550 magazine (Armour Piercing 4.6x30mm)"
+ name = "20-round magazine (4.6x30mm armor piercing)"
icon_state = "46x30mmtA-20"
base_icon_state = "46x30mmtA"
ammo_type = /obj/item/ammo_casing/c46x30mm/ap
@@ -21,7 +21,7 @@
icon_state = "[base_icon_state]-[round(ammo_count(), 4)]"
/obj/item/ammo_box/magazine/wt550m9/wtic
- name = "wt550 magazine (Incendiary 4.6x30mm)"
+ name = "20-round magazine (4.6x30mm incendiary)"
icon_state = "46x30mmtI-20"
base_icon_state = "46x30mmtI"
ammo_type = /obj/item/ammo_casing/c46x30mm/inc
@@ -31,7 +31,7 @@
icon_state = "[base_icon_state]-[round(ammo_count(), 4)]"
/obj/item/ammo_box/magazine/plastikov9mm
- name = "PP-95 magazine (9mm)"
+ name = "50-round magazine (9x19mm)"
icon_state = "9x19-50"
base_icon_state = "9x19"
ammo_type = /obj/item/ammo_casing/c9mm
@@ -43,7 +43,7 @@
icon_state = "[base_icon_state]-[ammo_count() ? 50 : 0]"
/obj/item/ammo_box/magazine/uzim9mm
- name = "uzi magazine (9mm)"
+ name = "32-round magazine (9x19mm)"
icon_state = "uzi9mm-32"
base_icon_state = "uzi9mm"
ammo_type = /obj/item/ammo_casing/c9mm
@@ -55,7 +55,7 @@
icon_state = "[base_icon_state]-[round(ammo_count(), 4)]"
/obj/item/ammo_box/magazine/smgm9mm
- name = "SMG magazine (9mm)"
+ name = "21-round magazine (9x19mm)"
icon_state = "smg9mm-42"
base_icon_state = "smg9mm"
ammo_type = /obj/item/ammo_casing/c9mm
@@ -67,15 +67,15 @@
icon_state = "[base_icon_state]-[ammo_count() ? 42 : 0]"
/obj/item/ammo_box/magazine/smgm9mm/ap
- name = "SMG magazine (Armour Piercing 9mm)"
+ name = "21-round magazine (9x19mm armor piercing)"
ammo_type = /obj/item/ammo_casing/c9mm/ap
/obj/item/ammo_box/magazine/smgm9mm/fire
- name = "SMG Magazine (Incendiary 9mm)"
+ name = "21-round magazine (9x19mm incendiary)"
ammo_type = /obj/item/ammo_casing/c9mm/fire
/obj/item/ammo_box/magazine/smgm45
- name = "SMG magazine (.45)"
+ name = "24-round magazine (.45 ACP)"
icon_state = "c20r45-24"
base_icon_state = "c20r45"
ammo_type = /obj/item/ammo_casing/c45
@@ -87,15 +87,15 @@
icon_state = "[base_icon_state]-[round(ammo_count(), 2)]"
/obj/item/ammo_box/magazine/smgm45/ap
- name = "SMG magazine (Armour Piercing .45)"
+ name = "24-round magazine (.45 ACP armor piercing)"
ammo_type = /obj/item/ammo_casing/c45/ap
/obj/item/ammo_box/magazine/smgm45/incen
- name = "SMG magazine (Incendiary .45)"
+ name = "24-round magazine (.45 ACP incendiary)"
ammo_type = /obj/item/ammo_casing/c45/inc
/obj/item/ammo_box/magazine/tommygunm45
- name = "drum magazine (.45)"
+ name = "50-round drum magazine (.45 ACP)"
icon_state = "drum45"
ammo_type = /obj/item/ammo_casing/c45
caliber = CALIBER_45
diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm
index 0cf429c1e00d..ea5d49fb40ce 100644
--- a/code/modules/projectiles/boxes_magazines/external/sniper.dm
+++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm
@@ -1,31 +1,31 @@
/obj/item/ammo_box/magazine/sniper_rounds
- name = "sniper rounds (.50)"
+ name = "6-round magazine (.50 BMG)"
icon_state = ".50mag"
base_icon_state = ".50mag"
ammo_type = /obj/item/ammo_casing/p50
max_ammo = 6
- caliber = CALIBER_50
+ caliber = CALIBER_50_RIFLE
/obj/item/ammo_box/magazine/sniper_rounds/update_icon_state()
. = ..()
icon_state = "[base_icon_state][ammo_count() ? "-ammo" : ""]"
/obj/item/ammo_box/magazine/sniper_rounds/soporific
- name = "sniper rounds (Zzzzz)"
+ name = "3-round magazine (.50 Zzzzz)"
desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
icon_state = "soporific"
ammo_type = /obj/item/ammo_casing/p50/soporific
max_ammo = 3
- caliber = CALIBER_50
+ caliber = CALIBER_50_RIFLE
/obj/item/ammo_box/magazine/sniper_rounds/penetrator
- name = "sniper rounds (penetrator)"
+ name = "5-round magazine (.50 BMG penetrator)"
desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
ammo_type = /obj/item/ammo_casing/p50/penetrator
max_ammo = 5
/obj/item/ammo_box/magazine/sniper_rounds/marksman
- name = "sniper rounds (marksman)"
+ name = "5-round magazine (.50 BMG high velocity)"
desc = "An extremely fast sniper round able to pretty much instantly shoot through something."
ammo_type = /obj/item/ammo_casing/p50/marksman
max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
index f972461de8a5..378e5760a95d 100644
--- a/code/modules/projectiles/boxes_magazines/external/toy.dm
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -14,18 +14,12 @@
. = ..()
icon_state = "[base_icon_state]-[ammo_count() ? 42 : 0]"
-/obj/item/ammo_box/magazine/toy/smg/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
/obj/item/ammo_box/magazine/toy/pistol
name = "foam force pistol magazine"
icon_state = "9x19p"
max_ammo = 8
multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/toy/pistol/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
/obj/item/ammo_box/magazine/toy/smgm45
name = "donksoft SMG magazine"
icon_state = "c20r45-toy"
@@ -38,10 +32,6 @@
. = ..()
icon_state = "[base_icon_state]-[round(ammo_count(), 2)]"
-/obj/item/ammo_box/magazine/toy/smgm45/riot
- icon_state = "c20r45-riot"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
/obj/item/ammo_box/magazine/toy/m762
name = "donksoft box magazine"
icon_state = "a762-toy"
@@ -52,7 +42,3 @@
/obj/item/ammo_box/magazine/toy/m762/update_icon_state()
. = ..()
icon_state = "[base_icon_state]-[round(ammo_count(), 10)]"
-
-/obj/item/ammo_box/magazine/toy/m762/riot
- icon_state = "a762-riot"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
diff --git a/code/modules/projectiles/boxes_magazines/external/tranqgun.dm b/code/modules/projectiles/boxes_magazines/external/tranqgun.dm
index 21a33398c4a5..c856112411b0 100644
--- a/code/modules/projectiles/boxes_magazines/external/tranqgun.dm
+++ b/code/modules/projectiles/boxes_magazines/external/tranqgun.dm
@@ -1,5 +1,5 @@
/obj/item/ammo_box/magazine/tranq_rifle
- name = ".308 tranquilizer magazine"
+ name = "5-round magazine (.308 tranquilizer)"
desc = "A magazine of tranquilizer darts."
icon_state = ".50mag"
base_icon_state = ".50mag"
@@ -9,7 +9,7 @@
/obj/item/ammo_box/magazine/tranq_rifle/ryetalyn
- name = ".308 ryetalyn magazine"
+ name = "5-round magazine (.308 ryetalyn)"
desc = "A magazine of tranquilizer darts filled with ryetalyn."
ammo_type = /obj/item/ammo_casing/caseless/safari_dart/ryetalyn
max_ammo = 5
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index 7d881a11c4dc..9d431d1dfa23 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -15,7 +15,6 @@
ammo_type = /obj/item/ammo_casing/a357
caliber = CALIBER_357
max_ammo = 6
- multiload = FALSE
/obj/item/ammo_box/magazine/internal/rus357/Initialize(mapload)
stored_ammo += new ammo_type(src)
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
index 03e7621577d3..0fa21d1beadc 100644
--- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -4,11 +4,10 @@
ammo_type = /obj/item/ammo_casing/a762
caliber = CALIBER_A762
max_ammo = 5
- multiload = TRUE
/obj/item/ammo_box/magazine/internal/boltaction/pipegun
name = "pipegun internal magazine"
- caliber = CALIBER_SHOTGUN
+ caliber = CALIBER_12GAUGE
ammo_type = /obj/item/ammo_casing/shotgun/improvised
max_ammo = 1
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
index 25823693f381..d1acbbc52e72 100644
--- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -1,9 +1,8 @@
/obj/item/ammo_box/magazine/internal/shot
name = "shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
- caliber = CALIBER_SHOTGUN
+ caliber = CALIBER_12GAUGE
max_ammo = 4
- multiload = FALSE
/obj/item/ammo_box/magazine/internal/shot/tube
name = "dual feed shotgun internal tube"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index fb24323334a1..a26dd0e480ed 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -47,7 +47,7 @@
/* Suppression */
/// whether or not a message is displayed when fired
- var/suppressed = null
+ var/obj/item/suppressed = null
var/can_suppress = FALSE
var/can_unsuppress = TRUE
@@ -111,12 +111,12 @@
/obj/item/gun/Initialize(mapload)
. = ..()
if(pin)
- pin = new pin(src)
+ pin = new pin(src, src)
add_seclight_point()
/obj/item/gun/Destroy()
- if(isobj(pin)) //Can still be the initial path, then we skip
+ if(!ispath(pin)) //Can still be the initial path, then we skip
QDEL_NULL(pin)
QDEL_NULL(bayonet)
@@ -153,6 +153,7 @@
suppressed = null
update_appearance()
+ verbs -= /obj/item/gun/proc/user_remove_suppressor
/obj/item/gun/examine(mob/user)
. = ..()
@@ -440,9 +441,25 @@
if(!fired && chambered?.loaded_projectile)
chambered.loaded_projectile.damage /= 5
-/obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins
+/obj/item/gun/proc/unlock()
if(pin)
qdel(pin)
- pin = new /obj/item/firing_pin
+ pin = new /obj/item/firing_pin(src, src)
+
+/obj/item/gun/proc/user_remove_suppressor()
+ set name = "Remove Suppressor"
+ set category = "Object"
+ set src in oview(1)
+
+ if(!isliving(usr))
+ return
+
+ if(!usr.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_NEED_HANDS))
+ return
+
+ to_chat(usr, span_notice("You unscrew [suppressed] from [src]."))
+ if(!usr.put_in_hands(suppressed))
+ suppressed.forceMove(drop_location())
+ clear_suppressor()
#undef FIRING_PIN_REMOVAL_DELAY
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index a87c8db39333..a9e20d1c1bd8 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -15,19 +15,19 @@
///volume of loading sound
var/load_sound_volume = 40
///whether loading sound should vary
- var/load_sound_vary = TRUE
+ var/load_sound_vary = FALSE
///sound of racking
var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg'
///volume of racking
var/rack_sound_volume = 60
///whether racking sound should vary
- var/rack_sound_vary = TRUE
+ var/rack_sound_vary = FALSE
///sound of when the bolt is locked back manually
var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg'
///volume of lock back
var/lock_back_sound_volume = 60
///whether lock back varies
- var/lock_back_sound_vary = TRUE
+ var/lock_back_sound_vary = FALSE
///Sound of ejecting a magazine
var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg'
///sound of ejecting an empty magazine
@@ -35,7 +35,7 @@
///volume of ejecting a magazine
var/eject_sound_volume = 40
///whether eject sound should vary
- var/eject_sound_vary = TRUE
+ var/eject_sound_vary = FALSE
///sound of dropping the bolt or releasing a slide
var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg'
///volume of bolt drop/slide release
@@ -45,7 +45,7 @@
///empty alarm volume sound
var/empty_alarm_volume = 70
///whether empty alarm sound varies
- var/empty_alarm_vary = TRUE
+ var/empty_alarm_vary = FALSE
///Whether the gun will spawn loaded with a magazine
var/spawnwithmagazine = TRUE
@@ -61,17 +61,17 @@
var/empty_alarm = FALSE
///Whether the gun supports multiple special mag types
var/special_mags = FALSE
+
+
/**
* The bolt type controls how the gun functions, and what iconstates you'll need to represent those functions.
- * BOLT_TYPE_STANDARD - The Slide doesn't lock back. Clicking on it will only cycle the bolt. Only 1 sprite.
- * BOLT_TYPE_OPEN - Same as standard, but it fires directly from the magazine - No need to rack. Doesn't hold the bullet when you drop the mag.
- * BOLT_TYPE_LOCKING - This is most handguns and bolt action rifles. The bolt will lock back when it's empty. You need yourgun_bolt and yourgun_bolt_locked icon states.
- * BOLT_TYPE_NO_BOLT - This is shotguns and revolvers. clicking will dump out all the bullets in the gun, spent or not.
- * see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT
+ * /datum/gun_bolt - The Slide doesn't lock back. Clicking on it will only cycle the bolt. Only 1 sprite.
+ * /datum/gun_bolt/open - Same as standard, but it fires directly from the magazine - No need to rack. Doesn't hold the bullet when you drop the mag.
+ * /datum/gun_bolt/locking - This is most handguns and bolt action rifles. The bolt will lock back when it's empty. You need yourgun_bolt and yourgun_bolt_locked icon states.
+ * /datum/gun_bolt/no_bolt - This is shotguns and revolvers. clicking will dump out all the bullets in the gun, spent or not.
**/
- var/bolt_type = BOLT_TYPE_STANDARD
- ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both.
- var/bolt_locked = FALSE
+ var/datum/gun_bolt/bolt = /datum/gun_bolt
+
var/show_bolt_icon = TRUE ///Hides the bolt icon.
///Whether the gun has to be racked each shot or not.
var/semi_auto = TRUE
@@ -79,7 +79,7 @@
var/obj/item/ammo_box/magazine/magazine
///whether the gun ejects the chambered casing
var/casing_ejector = TRUE
- ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT.
+ ///Whether the gun has an internal magazine or a detatchable one. Overridden by /datum/gun_bolt/no_bolt.
var/internal_magazine = FALSE
///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc.
var/bolt_wording = "bolt"
@@ -87,12 +87,13 @@
var/magazine_wording = "magazine"
///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc.
var/cartridge_wording = "bullet"
+ /// If TRUE, will show the caliber name on examine. Set to false for things with fake calibers like bows and the tentacle "gun".
+ var/show_caliber_on_examine = TRUE
+
///length between individual racks
var/rack_delay = 5
///time of the most recent rack, used for cooldown purposes
var/recent_rack = 0
- ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
- var/tac_reloads = TRUE //Snowflake mechanic no more.
///Whether the gun can be sawn off by sawing tools
var/can_be_sawn_off = FALSE
var/flip_cooldown = 0
@@ -129,42 +130,45 @@
/obj/item/gun/ballistic/Initialize(mapload)
. = ..()
+
+ bolt = new bolt(src)
+
if (!spawnwithmagazine)
- bolt_locked = TRUE
+ bolt.is_locked = TRUE
update_appearance()
return
+
if (!magazine)
magazine = new mag_type(src)
- if(bolt_type == BOLT_TYPE_STANDARD || internal_magazine) //Internal magazines shouldn't get magazine + 1.
+
+ initial_caliber = magazine.caliber
+
+ if((bolt.type == /datum/gun_bolt) || internal_magazine) //Internal magazines shouldn't get magazine + 1.
chamber_round()
else
chamber_round(replace_new_round = TRUE)
+
update_appearance()
RegisterSignal(src, COMSIG_ITEM_RECHARGED, PROC_REF(instant_reload))
/obj/item/gun/ballistic/Destroy()
QDEL_NULL(magazine)
+ QDEL_NULL(bolt)
return ..()
/obj/item/gun/ballistic/vv_edit_var(vname, vval)
. = ..()
- if(vname in list(NAMEOF(src, suppressor_x_offset), NAMEOF(src, suppressor_y_offset), NAMEOF(src, internal_magazine), NAMEOF(src, magazine), NAMEOF(src, chambered), NAMEOF(src, empty_indicator), NAMEOF(src, sawn_off), NAMEOF(src, bolt_locked), NAMEOF(src, bolt_type)))
+ if(vname in list(NAMEOF(src, suppressor_x_offset), NAMEOF(src, suppressor_y_offset), NAMEOF(src, internal_magazine), NAMEOF(src, magazine), NAMEOF(src, chambered), NAMEOF(src, empty_indicator), NAMEOF(src, sawn_off), NAMEOF(src, bolt)))
update_appearance()
/obj/item/gun/ballistic/update_icon_state()
- if(current_skin)
- icon_state = "[unique_reskin[current_skin]][sawn_off ? "_sawn" : ""]"
- else
- icon_state = "[base_icon_state || initial(icon_state)][sawn_off ? "_sawn" : ""]"
+ icon_state = "[base_icon_state || initial(icon_state)][sawn_off ? "_sawn" : ""]"
return ..()
/obj/item/gun/ballistic/update_overlays()
. = ..()
if(show_bolt_icon)
- if (bolt_type == BOLT_TYPE_LOCKING)
- . += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]"
- if (bolt_type == BOLT_TYPE_OPEN && bolt_locked)
- . += "[icon_state]_bolt"
+ . += bolt?.get_overlays() //update_overlays() can get called during Destroy()
if(suppressed)
var/mutable_appearance/MA = mutable_appearance(icon, "[icon_state]_suppressor")
@@ -236,36 +240,28 @@
/obj/item/gun/ballistic/proc/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round)
if (chambered || !magazine)
return
- if (magazine.ammo_count())
- chambered = magazine.get_round(keep_bullet || bolt_type == BOLT_TYPE_NO_BOLT)
- if (bolt_type != BOLT_TYPE_OPEN)
- chambered.forceMove(src)
- if(replace_new_round)
- magazine.give_round(new chambered.type)
-///updates a bunch of racking related stuff and also handles the sound effects and the like
-/obj/item/gun/ballistic/proc/rack(mob/user = null)
- if (bolt_type == BOLT_TYPE_NO_BOLT) //If there's no bolt, nothing to rack
+ if (!magazine.ammo_count())
return
- if (bolt_type == BOLT_TYPE_OPEN)
- if(!bolt_locked) //If it's an open bolt, racking again would do nothing
- if (user)
- to_chat(user, span_notice("[src]'s [bolt_wording] is already cocked!"))
- return
+ chambered = magazine.get_round(keep_bullet || istype(bolt, /datum/gun_bolt/no_bolt))
- bolt_locked = FALSE
+ if (!istype(bolt, /datum/gun_bolt/open))
+ chambered.forceMove(src)
+ if(replace_new_round)
+ magazine.give_round(new chambered.type)
+
+///updates a bunch of racking related stuff and also handles the sound effects and the like
+/obj/item/gun/ballistic/proc/rack(mob/user = null)
+ if(bolt.pre_rack(user))
+ return
if (user)
to_chat(user, span_notice("You rack the [bolt_wording] of [src]."))
update_chamber(!chambered, FALSE)
- if (bolt_type == BOLT_TYPE_LOCKING && !chambered)
- bolt_locked = TRUE
- playsound(src, lock_back_sound, lock_back_sound_volume, lock_back_sound_vary)
- else
- playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
+ bolt.post_rack()
update_appearance()
@@ -274,8 +270,9 @@
playsound(src, bolt_drop_sound, bolt_drop_sound_volume, FALSE)
if (user)
to_chat(user, span_notice("You drop the [bolt_wording] of [src]."))
+
chamber_round()
- bolt_locked = FALSE
+ bolt.is_locked = FALSE
update_appearance()
///Handles all the logic needed for magazine insertion
@@ -283,43 +280,65 @@
if(!istype(AM, mag_type))
to_chat(user, span_warning("[AM] doesn't seem to fit into [src]..."))
return FALSE
+
if(user.transferItemToLoc(AM, src))
magazine = AM
if (display_message)
- to_chat(user, span_notice("You load a new [magazine_wording] into [src]."))
- playsound(src, load_empty_sound, load_sound_volume, load_sound_vary)
- if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked)
- chamber_round(TRUE)
+ to_chat(user, span_notice("You load [AM] into [src]."))
+
+ if (magazine.ammo_count())
+ playsound(src, load_sound, load_sound_volume, load_sound_vary)
+ else
+ playsound(src, load_empty_sound, load_sound_volume, load_sound_vary)
+
+ bolt.magazine_inserted()
update_appearance()
return TRUE
+
else
to_chat(user, span_warning("You cannot seem to get [src] out of your hands!"))
return FALSE
///Handles all the logic of magazine ejection, if tac_load is set that magazine will be tacloaded in the place of the old eject
-/obj/item/gun/ballistic/proc/eject_magazine(mob/user, display_message = TRUE, obj/item/ammo_box/magazine/tac_load = null)
- if(bolt_type == BOLT_TYPE_OPEN)
- chambered = null
+/obj/item/gun/ballistic/proc/eject_magazine(mob/user, display_message = TRUE)
+ if(internal_magazine || !magazine)
+ return FALSE // fuck off
+
+ bolt.magazine_ejected()
+
if (magazine.ammo_count())
- playsound(src, load_sound, load_sound_volume, load_sound_vary)
- else
- playsound(src, load_empty_sound, load_sound_volume, load_sound_vary)
- magazine.forceMove(drop_location())
- var/obj/item/ammo_box/magazine/old_mag = magazine
- if (tac_load)
- if (insert_magazine(user, tac_load, FALSE))
- to_chat(user, span_notice("You perform a tactical reload on [src]."))
- else
- to_chat(user, span_warning("You dropped the old [magazine_wording], but the new one doesn't fit. How embarassing."))
- magazine = null
+ playsound(src, eject_sound, eject_sound_volume, eject_sound_vary)
else
- magazine = null
- user.put_in_hands(old_mag)
+ playsound(src, eject_empty_sound, eject_sound_volume, eject_sound_vary)
+
+ var/obj/item/ammo_box/old_mag = magazine
+ magazine = null
+
+ if(!user.put_in_hands(old_mag))
+ old_mag.forceMove(drop_location())
old_mag.update_appearance()
+
if (display_message)
- to_chat(user, span_notice("You pull the [magazine_wording] out of [src]."))
+ to_chat(user, span_notice("You pull [old_mag] out of [src]."))
update_appearance()
+ return TRUE
+
+/// Removes the magazine from the weapon, or ejects all of it's ammo, based on the bolt type.
+/obj/item/gun/ballistic/proc/unload(mob/user)
+ if(bolt.unload(user))
+ return
+
+ if(internal_magazine)
+ return
+
+ if(!magazine)
+ to_chat(user, span_warning("There is no magazine in [src]."))
+ return
+
+ unwield(user)
+ eject_magazine(user, TRUE)
+
/obj/item/gun/ballistic/can_fire()
return chambered?.loaded_projectile
@@ -327,45 +346,51 @@
. = ..()
if (.)
return
+
if (!internal_magazine && istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if (!magazine)
insert_magazine(user, AM)
else
- if (tac_reloads)
- eject_magazine(user, FALSE, AM)
- else
- to_chat(user, span_notice("There's already a [magazine_wording] in [src]."))
+ to_chat(user, span_warning("There is already a [magazine_wording] in [src]."))
return
+
if (isammocasing(A) || istype(A, /obj/item/ammo_box))
- if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine)
+ if (istype(bolt, /datum/gun_bolt/no_bolt) || internal_magazine)
if (chambered && !chambered.loaded_projectile)
chambered.forceMove(drop_location())
chambered = null
- var/num_loaded = magazine?.attackby(A, user, params, TRUE)
+
+ var/num_loaded = magazine?.attempt_load_round(A, user, params, TRUE)
if (num_loaded)
to_chat(user, span_notice("You load [num_loaded] [cartridge_wording]\s into [src]."))
playsound(src, load_sound, load_sound_volume, load_sound_vary)
- if (chambered == null && bolt_type == BOLT_TYPE_NO_BOLT)
- chamber_round()
+
+ bolt.loaded_ammo()
+
A.update_appearance()
update_appearance()
return
+
if(istype(A, /obj/item/suppressor))
var/obj/item/suppressor/S = A
if(!can_suppress)
to_chat(user, span_warning("You can't seem to figure out how to fit [S] on [src]!"))
return
+
if(!user.is_holding(src))
to_chat(user, span_warning("You need be holding [src] to fit [S] to it!"))
return
+
if(suppressed)
to_chat(user, span_warning("[src] already has a suppressor!"))
return
+
if(user.transferItemToLoc(A, src))
to_chat(user, span_notice("You attach [S] to [src]."))
install_suppressor(A)
return
+
if (can_be_sawn_off)
if (sawoff(user, A))
return
@@ -392,6 +417,7 @@
suppressed = S
w_class += S.w_class //so pistols do not fit in pockets when suppressed
update_appearance()
+ verbs += /obj/item/gun/proc/user_remove_suppressor
/obj/item/gun/ballistic/clear_suppressor()
if(!can_unsuppress)
@@ -401,26 +427,9 @@
w_class -= I.w_class
return ..()
-/obj/item/gun/ballistic/AltClick(mob/user)
- if (unique_reskin && !current_skin && user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY))
- reskin_obj(user)
- return
- if(loc == user)
- if(suppressed && can_unsuppress)
- var/obj/item/suppressor/S = suppressed
- if(!user.is_holding(src))
- return ..()
- to_chat(user, span_notice("You unscrew [S] from [src]."))
- user.put_in_hands(S)
- clear_suppressor()
-
/obj/item/gun/ballistic/before_firing(atom/target, mob/user)
. = ..()
- if (!chambered && !get_ammo())
- if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked)
- bolt_locked = TRUE
- playsound(src, bolt_drop_sound, bolt_drop_sound_volume)
- update_appearance()
+ bolt.before_firing()
/obj/item/gun/ballistic/after_firing(mob/living/user, pointblank, atom/pbtarget, message)
. = ..()
@@ -440,16 +449,22 @@
playsound(src, empty_alarm_sound, empty_alarm_volume, empty_alarm_vary)
update_appearance()
- if (bolt_type == BOLT_TYPE_LOCKING)
- bolt_locked = TRUE
- update_appearance()
+ bolt.after_chambering()
-//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/gun/ballistic/attack_hand(mob/user, list/modifiers)
- if(!internal_magazine && loc == user && user.is_holding(src) && magazine)
- eject_magazine(user)
+/obj/item/gun/ballistic/attack_hand_secondary(mob/user, list/modifiers)
+ . = ..()
+ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return
- return ..()
+
+ if(modifiers?[RIGHT_CLICK] && !internal_magazine && magazine && user.is_holding(src))
+ unload(user)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/item/gun/ballistic/AltClick(mob/user)
+ if(!isliving(user) || !user.canUseTopic(src, USE_CLOSE|USE_NEED_HANDS|USE_DEXTERITY))
+ return
+
+ unload(user)
/obj/item/gun/ballistic/attack_self(mob/living/user)
if(HAS_TRAIT(user, TRAIT_GUNFLIP))
@@ -466,60 +481,47 @@
playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
return
- // You only need 1 hand to eject the magazine
- if(!internal_magazine && magazine)
- if(!magazine.ammo_count())
- eject_magazine(user)
- return
-
// They need two hands on the gun, or a free hand in general.
if(!wielded && !user.get_empty_held_index())
to_chat(user, span_warning("You need a free hand to do that!"))
return
- if(bolt_type == BOLT_TYPE_NO_BOLT)
- chambered = null
- var/num_unloaded = 0
-
- for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE))
- CB.forceMove(drop_location())
- CB.bounce_away(FALSE, NONE)
- num_unloaded++
- var/turf/T = get_turf(drop_location())
- if(T && is_station_level(T.z))
- SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name)
-
- if (num_unloaded)
- to_chat(user, span_notice("You unload [num_unloaded] [cartridge_wording]\s from [src]."))
- playsound(user, eject_sound, eject_sound_volume, eject_sound_vary)
- update_appearance()
- else
- to_chat(user, span_warning("[src] is empty!"))
- return
-
- if(bolt_type == BOLT_TYPE_LOCKING && bolt_locked)
- drop_bolt(user)
+ if(bolt.attack_self(user))
return
- if (recent_rack > world.time)
+ if(!COOLDOWN_FINISHED(src, recent_rack))
return
- recent_rack = world.time + rack_delay
+ COOLDOWN_START(src, recent_rack, rack_delay)
rack(user)
return
+/obj/item/gun/ballistic/attack_self_secondary(mob/user, modifiers)
+ . = ..()
+ if(.)
+ return
+
+ unload(user)
+ return TRUE
/obj/item/gun/ballistic/examine(mob/user)
. = ..()
- var/count_chambered = !(bolt_type == BOLT_TYPE_NO_BOLT || bolt_type == BOLT_TYPE_OPEN)
- . += "It has [get_ammo(count_chambered)] round\s remaining."
- if (!chambered && !hidden_chambered)
- . += "It does not seem to have a round chambered."
- if (bolt_locked)
- . += "The [bolt_wording] is locked back and needs to be released before firing or de-fouling."
+ if(show_caliber_on_examine)
+ . += "It is chambered in [initial_caliber]."
+
+ if(chambered && !hidden_chambered)
+ . += "It has a round in the chamber."
+
+ if (bolt.is_locked)
+ . += "The [bolt_wording] is locked."
+
if (suppressed)
. += "It has a suppressor attached that can be removed with alt+click."
+
+ if(magazine && internal_magazine)
+ . += span_notice(magazine.get_ammo_desc())
+
if(can_misfire)
. += span_danger("You get the feeling this might explode if you fire it....")
if(misfire_probability > 0)
@@ -643,12 +645,12 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
if(!can_modify_ammo)
return
- if(bolt_type == BOLT_TYPE_STANDARD)
+ if(bolt.type == /datum/gun_bolt)
if(get_ammo())
to_chat(user, span_notice("You can't get at the internals while the gun has a bullet in it!"))
return
- else if(!bolt_locked)
+ else if(!bolt.is_locked)
to_chat(user, span_notice("You can't get at the internals while the bolt is down!"))
return
@@ -661,18 +663,19 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
user.visible_message(span_danger("[src] goes off!"), span_danger("[src] goes off in your face!"))
return
- if(magazine.caliber == initial_caliber)
- magazine.caliber = alternative_caliber
- if(alternative_ammo_misfires)
- can_misfire = TRUE
- fire_sound = alternative_fire_sound
- to_chat(user, span_notice("You modify [src]. Now it will fire [alternative_caliber] rounds."))
- else
- magazine.caliber = initial_caliber
- if(alternative_ammo_misfires)
- can_misfire = FALSE
- fire_sound = initial_fire_sound
- to_chat(user, span_notice("You reset [src]. Now it will fire [initial_caliber] rounds."))
+ if(alternative_caliber)
+ if(magazine.caliber == initial_caliber)
+ magazine.caliber = alternative_caliber
+ if(alternative_ammo_misfires)
+ can_misfire = TRUE
+ fire_sound = alternative_fire_sound
+ to_chat(user, span_notice("You modify [src]. Now it will fire [alternative_caliber] rounds."))
+ else
+ magazine.caliber = initial_caliber
+ if(alternative_ammo_misfires)
+ can_misfire = FALSE
+ fire_sound = initial_fire_sound
+ to_chat(user, span_notice("You reset [src]. Now it will fire [initial_caliber] rounds."))
///used for sawing guns, causes the gun to fire without the input of the user
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index a32a5828903f..60de956508df 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -54,16 +54,13 @@
mag_display = TRUE
empty_indicator = TRUE
mag_type = /obj/item/ammo_box/magazine/smgm9mm
- pin = null
- bolt_type = BOLT_TYPE_LOCKING
+ bolt = /datum/gun_bolt/locking
show_bolt_icon = FALSE
/obj/item/gun/ballistic/automatic/proto/Initialize(mapload)
. = ..()
AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
-/obj/item/gun/ballistic/automatic/proto/unrestricted
- pin = /obj/item/firing_pin
/obj/item/gun/ballistic/automatic/c20r
name = "\improper C-20r SMG"
@@ -74,7 +71,6 @@
mag_type = /obj/item/ammo_box/magazine/smgm45
fire_delay = 2
burst_size = 3
- pin = /obj/item/firing_pin/implant/pindicate
can_bayonet = TRUE
knife_x_offset = 26
knife_y_offset = 12
@@ -87,9 +83,6 @@
if(!chambered && empty_indicator) //this is duplicated due to a layering issue with the select fire icon.
. += "[icon_state]_empty"
-/obj/item/gun/ballistic/automatic/c20r/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/automatic/c20r/Initialize(mapload)
. = ..()
update_appearance()
@@ -139,7 +132,7 @@
icon_state = "miniuzi"
mag_type = /obj/item/ammo_box/magazine/uzim9mm
burst_size = 2
- bolt_type = BOLT_TYPE_OPEN
+ bolt = /datum/gun_bolt/open
show_bolt_icon = FALSE
mag_display = TRUE
rack_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
@@ -155,10 +148,13 @@
mag_type = /obj/item/ammo_box/magazine/m556
can_suppress = FALSE
var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel
+
burst_size = 3
fire_delay = 2
+
spread = 5
- pin = /obj/item/firing_pin/implant/pindicate
+ unwielded_spread_bonus = 15
+
mag_display = TRUE
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg'
@@ -172,14 +168,6 @@
QDEL_NULL(underbarrel)
return ..()
-/obj/item/gun/ballistic/automatic/m90/unrestricted
- pin = /obj/item/firing_pin
-
-/obj/item/gun/ballistic/automatic/m90/unrestricted/Initialize(mapload)
- . = ..()
- underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src)
- update_appearance()
-
/obj/item/gun/ballistic/automatic/m90/afterattack_secondary(atom/target, mob/living/user, flag, params)
underbarrel.afterattack(target, user, flag, params)
return SECONDARY_ATTACK_CONTINUE_CHAIN
@@ -213,7 +201,7 @@
burst_size = 1
actions_types = list()
fire_delay = 1
- bolt_type = BOLT_TYPE_OPEN
+ bolt = /datum/gun_bolt/open
empty_indicator = TRUE
show_bolt_icon = FALSE
@@ -249,24 +237,18 @@
unwielded_spread_bonus = 20
burst_size = 1
- pin = /obj/item/firing_pin/implant/pindicate
- bolt_type = BOLT_TYPE_OPEN
+ bolt = /datum/gun_bolt/open
can_suppress = FALSE
show_bolt_icon = FALSE
mag_display = TRUE
mag_display_ammo = TRUE
- tac_reloads = FALSE
-
fire_sound = 'sound/weapons/gun/l6/shot.ogg'
rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg'
suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/cover_open = FALSE
-/obj/item/gun/ballistic/automatic/l6_saw/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/automatic/l6_saw/Initialize(mapload)
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
@@ -368,7 +350,6 @@
desc = "An illegally modified .50 cal sniper rifle with suppression compatibility. Quickscoping still doesn't work."
can_suppress = TRUE
can_unsuppress = TRUE
- pin = /obj/item/firing_pin/implant/pindicate
// Old Semi-Auto Rifle //
diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm
index 2956aabfd2df..26f7ceb2a8dd 100644
--- a/code/modules/projectiles/guns/ballistic/bow.dm
+++ b/code/modules/projectiles/guns/ballistic/bow.dm
@@ -14,8 +14,9 @@
w_class = WEIGHT_CLASS_BULKY
internal_magazine = TRUE
cartridge_wording = "arrow"
- bolt_type = BOLT_TYPE_NO_BOLT
+ bolt = /datum/gun_bolt/no_bolt
recoil = 0 // Bows don't have recoil.
+ show_caliber_on_examine = FALSE
var/drawn = FALSE
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 536d39b377f0..bbf835c4d422 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -1,7 +1,7 @@
//KEEP IN MIND: These are different from gun/grenadelauncher. These are designed to shoot premade rocket and grenade projectiles, not flashbangs or chemistry casings etc.
//Put handheld rocket launchers here if someone ever decides to make something so hilarious ~Paprika
-/obj/item/gun/ballistic/revolver/grenadelauncher//this is only used for underbarrel grenade launchers at the moment, but admins can still spawn it if they feel like being assholes
+/obj/item/gun/ballistic/revolver/grenadelauncher //this is only used for underbarrel grenade launchers at the moment, but admins can still spawn it if they feel like being assholes
desc = "A break-operated grenade launcher."
name = "grenade launcher"
icon_state = "dshotgun_sawn"
@@ -9,11 +9,7 @@
mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher
fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg'
w_class = WEIGHT_CLASS_NORMAL
- pin = /obj/item/firing_pin/implant/pindicate
- bolt_type = BOLT_TYPE_NO_BOLT
-
-/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted
- pin = /obj/item/firing_pin
+ bolt = /datum/gun_bolt/no_bolt
/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params)
..()
@@ -52,15 +48,13 @@
fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg'
w_class = WEIGHT_CLASS_BULKY
can_suppress = FALSE
- pin = /obj/item/firing_pin/implant/pindicate
burst_size = 1
fire_delay = 0
casing_ejector = FALSE
- bolt_type = BOLT_TYPE_NO_BOLT
+ bolt = /datum/gun_bolt/no_bolt
internal_magazine = TRUE
cartridge_wording = "rocket"
empty_indicator = TRUE
- tac_reloads = FALSE
/// Do we shit flames behind us when we fire?
var/backblast = TRUE
@@ -70,9 +64,6 @@
if(backblast)
AddElement(/datum/element/backblast)
-/obj/item/gun/ballistic/rocketlauncher/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/rocketlauncher/nobackblast
name = "flameless PML-11"
desc = "A reusable rocket propelled grenade launcher. This one has been fitted with a special coolant loop to avoid embarassing teamkill 'accidents' from backblast."
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 8a1943de3c9b..612f23f5660c 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -8,7 +8,7 @@
burst_size = 1
fire_delay = 0
actions_types = list()
- bolt_type = BOLT_TYPE_LOCKING
+ bolt = /datum/gun_bolt/locking
fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg'
suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg'
@@ -37,7 +37,7 @@
/obj/item/gun/ballistic/automatic/pistol/m1911
name = "\improper M1911"
- desc = "A classic .45 handgun with a small magazine capacity."
+ desc = "A classic .45 ACP handgun with an 8-round magazine capacity."
icon_state = "m1911"
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/m45
@@ -56,6 +56,7 @@
icon_state = "deagle"
force = 14
mag_type = /obj/item/ammo_box/magazine/m50
+ w_class = WEIGHT_CLASS_NORMAL
can_suppress = FALSE
mag_display = TRUE
fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
@@ -74,8 +75,8 @@
inhand_icon_state = "deagleg"
/obj/item/gun/ballistic/automatic/pistol/aps
- name = "\improper Stechkin APS machine pistol"
- desc = "An old Soviet machine pistol. It fires quickly, but kicks like a mule. Uses 9mm ammo. Has a threaded barrel for suppressors."
+ name = "\improper Stechkin pistol"
+ desc = "A fast-firing a handgun chambered in 9x19mm Parabellum. Utilizes 15 round magazines and kicks like a mule. Has a threaded barrel for suppressors."
icon_state = "aps"
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/m9mm_aps
@@ -85,21 +86,3 @@
spread = 10
actions_types = list(/datum/action/item_action/toggle_firemode)
suppressor_x_offset = 6
-
-/obj/item/gun/ballistic/automatic/pistol/stickman
- name = "flat gun"
- desc = "A 2 dimensional gun.. what?"
- icon_state = "flatgun"
- mag_display = FALSE
- show_bolt_icon = FALSE
-
-/obj/item/gun/ballistic/automatic/pistol/stickman/equipped(mob/user, slot)
- ..()
- to_chat(user, span_notice("As you try to manipulate [src], it slips out of your possession.."))
- if(prob(50))
- to_chat(user, span_notice("..and vanishes from your vision! Where the hell did it go?"))
- qdel(src)
- user.update_icons()
- else
- to_chat(user, span_notice("..and falls into view. Whew, that was a close one."))
- user.dropItemToGround(src)
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 407bee8f3bc1..b78270525c9f 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -10,8 +10,7 @@
dry_fire_sound = 'sound/weapons/gun/revolver/dry_fire.ogg'
casing_ejector = FALSE
internal_magazine = TRUE
- bolt_type = BOLT_TYPE_NO_BOLT
- tac_reloads = FALSE
+ bolt = /datum/gun_bolt/no_bolt
var/spin_delay = 10
var/recent_spin = 0
var/last_fire = 0
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index df7d0a93ffd7..c6c7223f4010 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -7,7 +7,7 @@
worn_icon_state = "moistnugget"
mag_type = /obj/item/ammo_box/magazine/internal/boltaction
bolt_wording = "bolt"
- bolt_type = BOLT_TYPE_LOCKING
+ bolt = /datum/gun_bolt/locking
semi_auto = FALSE
internal_magazine = TRUE
fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
@@ -15,36 +15,36 @@
rack_sound = 'sound/weapons/gun/rifle/bolt_out.ogg'
bolt_drop_sound = 'sound/weapons/gun/rifle/bolt_in.ogg'
- tac_reloads = FALSE
-
accuracy_falloff = 2 //Rifles are extremely accurate
unwielded_spread_bonus = 50
/obj/item/gun/ballistic/rifle/rack(mob/user = null)
- if (bolt_locked == FALSE)
+ if (bolt.is_locked == FALSE) // The bolt is closed
to_chat(user, span_notice("You open the bolt of \the [src]."))
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
+
update_chamber(FALSE, FALSE, FALSE)
- bolt_locked = TRUE
+
+ bolt.is_locked = TRUE
update_appearance()
return
drop_bolt(user)
/obj/item/gun/ballistic/rifle/can_fire()
- if (bolt_locked)
+ if(bolt.is_locked)
return FALSE
return ..()
/obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params)
- if (!bolt_locked && !istype(A, /obj/item/stack/sheet/cloth))
+ if (!bolt.is_locked && !istype(A, /obj/item/stack/sheet/cloth))
to_chat(user, span_notice("The bolt is closed!"))
return
return ..()
/obj/item/gun/ballistic/rifle/examine(mob/user)
. = ..()
- . += "The bolt is [bolt_locked ? "open" : "closed"]."
+ . += "The bolt is [bolt.is_locked ? "open" : "closed"]."
///////////////////////
// BOLT ACTION RIFLE //
@@ -102,13 +102,14 @@
/obj/item/gun/ballistic/rifle/boltaction/attackby(obj/item/item, mob/user, params)
. = ..()
- if(can_jam)
- if(bolt_locked)
- if(istype(item, /obj/item/gun_maintenance_supplies))
- if(do_after(user, 10 SECONDS, target = src))
- user.visible_message(span_notice("[user] finishes maintenance of [src]."))
- jamming_chance = 10
- qdel(item)
+ if(!can_jam || !bolt.is_locked)
+ return
+
+ if(istype(item, /obj/item/gun_maintenance_supplies))
+ if(do_after(user, 10 SECONDS, target = src))
+ user.visible_message(span_notice("[user] finishes maintenance of [src]."))
+ jamming_chance = 10
+ qdel(item)
/obj/item/gun/ballistic/rifle/boltaction/blow_up(mob/user)
. = FALSE
@@ -160,7 +161,7 @@
inhand_y_dimension = 64
fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun
- initial_caliber = CALIBER_SHOTGUN
+ initial_caliber = CALIBER_12GAUGE
alternative_caliber = CALIBER_A762
initial_fire_sound = 'sound/weapons/gun/sniper/shot.ogg'
alternative_fire_sound = 'sound/weapons/gun/shotgun/shot.ogg'
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 8688e9467876..1fd0b17c5ad2 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -22,7 +22,6 @@
casing_ejector = FALSE
bolt_wording = "pump"
cartridge_wording = "shell"
- tac_reloads = FALSE
pb_knockback = 2
unwielded_spread_bonus = 40
@@ -136,8 +135,6 @@
can_suppress = FALSE
burst_size = 1
fire_delay = 0
-
- pin = /obj/item/firing_pin/implant/pindicate
fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg'
actions_types = list()
mag_display = TRUE
@@ -147,7 +144,6 @@
mag_display_ammo = TRUE
semi_auto = TRUE
internal_magazine = FALSE
- tac_reloads = TRUE
///the type of secondary magazine for the bulldog
var/secondary_magazine_type
///the secondary magazine
@@ -238,8 +234,6 @@
playsound(src, load_empty_sound, load_sound_volume, load_sound_vary)
update_appearance()
-/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
- pin = /obj/item/firing_pin
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
/////////////////////////////
@@ -258,23 +252,11 @@
sawn_desc = "Omar's coming!"
obj_flags = UNIQUE_RENAME
rack_sound_volume = 0
- unique_reskin = list("Default" = "dshotgun",
- "Dark Red Finish" = "dshotgun_d",
- "Ash" = "dshotgun_f",
- "Faded Grey" = "dshotgun_g",
- "Maple" = "dshotgun_l",
- "Rosewood" = "dshotgun_p"
- )
semi_auto = TRUE
- bolt_type = BOLT_TYPE_NO_BOLT
+ bolt = /datum/gun_bolt/no_bolt
can_be_sawn_off = TRUE
pb_knockback = 3 // it's a super shotgun!
-/obj/item/gun/ballistic/shotgun/doublebarrel/AltClick(mob/user)
- . = ..()
- if(unique_reskin && !current_skin && user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY))
- reskin_obj(user)
-
/obj/item/gun/ballistic/shotgun/doublebarrel/slugs
name = "hunting shotgun"
desc = "A hunting shotgun used by the wealthy to hunt \"game\"."
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 3cadf09efc6d..e88a79d5256f 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -15,9 +15,6 @@
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
casing_ejector = FALSE
-/obj/item/gun/ballistic/automatic/toy/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/automatic/pistol/toy
name = "foam force pistol"
desc = "A small, easily concealable toy handgun. Ages 8 and up."
@@ -25,13 +22,6 @@
fire_sound = 'sound/items/syringeproj.ogg'
gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN
-/obj/item/gun/ballistic/automatic/pistol/toy/riot
- mag_type = /obj/item/ammo_box/magazine/toy/pistol/riot
-
-/obj/item/gun/ballistic/automatic/pistol/riot/Initialize(mapload)
- magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
- return ..()
-
/obj/item/gun/ballistic/shotgun/toy
name = "foam force shotgun"
desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
@@ -51,9 +41,6 @@
if(chambered && !chambered.loaded_projectile)
qdel(chambered)
-/obj/item/gun/ballistic/shotgun/toy/unrestricted
- pin = /obj/item/firing_pin
-
/obj/item/gun/ballistic/shotgun/toy/crossbow
name = "foam force crossbow"
desc = "A weapon favored by many overactive children. Ages 8 and up."
@@ -77,32 +64,18 @@
desc = "A bullpup three-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
can_suppress = TRUE
item_flags = NONE
- mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
+ mag_type = /obj/item/ammo_box/magazine/toy/smgm45
casing_ejector = FALSE
clumsy_check = FALSE
gun_flags = TOY_FIREARM_OVERLAY|NOT_A_REAL_GUN
-/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted //Use this for actual toys
- pin = /obj/item/firing_pin
- mag_type = /obj/item/ammo_box/magazine/toy/smgm45
-
-/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot
- mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot
-
/obj/item/gun/ballistic/automatic/l6_saw/toy //This is the syndicate variant with syndicate firing pin and riot darts.
name = "donksoft LMG"
desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
fire_sound = 'sound/items/syringeproj.ogg'
can_suppress = FALSE
item_flags = NONE
- mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
+ mag_type = /obj/item/ammo_box/magazine/toy/m762
casing_ejector = FALSE
clumsy_check = FALSE
gun_flags = TOY_FIREARM_OVERLAY|NOT_A_REAL_GUN
-
-/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted //Use this for actual toys
- pin = /obj/item/firing_pin
- mag_type = /obj/item/ammo_box/magazine/toy/m762
-
-/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot
- mag_type = /obj/item/ammo_box/magazine/toy/m762/riot
diff --git a/code/modules/projectiles/guns/bolt_types/_gun_bolt.dm b/code/modules/projectiles/guns/bolt_types/_gun_bolt.dm
new file mode 100644
index 000000000000..eb0bf40524f7
--- /dev/null
+++ b/code/modules/projectiles/guns/bolt_types/_gun_bolt.dm
@@ -0,0 +1,52 @@
+///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted.
+/// Example: c20, shotguns, m90
+/datum/gun_bolt
+ var/obj/item/gun/ballistic/parent
+ var/is_locked = FALSE
+
+/datum/gun_bolt/New(obj/item/gun/parent)
+ src.parent = parent
+
+/datum/gun_bolt/Destroy(force, ...)
+ parent = null
+ return ..()
+
+/// Returns overlays for a gun's update_overlays()
+/datum/gun_bolt/proc/get_overlays()
+ return
+
+/// Called during attack_self(). Return TRUE to cancel the rest of the proc.
+/datum/gun_bolt/proc/attack_self(mob/living/user)
+ return
+
+/// Called at the start of rack(), return TRUE to cancel the rest of the proc.
+/datum/gun_bolt/proc/pre_rack(mob/user)
+ return
+
+/// Called after rack(), before update_appearance()
+/datum/gun_bolt/proc/post_rack(mob/user)
+ playsound(parent, parent.rack_sound, parent.rack_sound_volume, parent.rack_sound_vary)
+
+/// Called when ammo was successfully loaded into the weapon.
+/datum/gun_bolt/proc/loaded_ammo()
+ return
+
+/// Called after a magazine is successfully inserted into the firearm.
+/datum/gun_bolt/proc/magazine_inserted()
+ return
+
+/// Called when a magazine is about to be ejected.
+/datum/gun_bolt/proc/magazine_ejected()
+ return
+
+/// Called at the start of unload(), return TRUE to cancel the rest of the proc.
+/datum/gun_bolt/proc/unload(mob/user)
+ return
+
+/// Called during before_firing()
+/datum/gun_bolt/proc/before_firing()
+ return
+
+/// Called at the foot of after_chambering()
+/datum/gun_bolt/proc/after_chambering()
+ return
diff --git a/code/modules/projectiles/guns/bolt_types/locking_bolt.dm b/code/modules/projectiles/guns/bolt_types/locking_bolt.dm
new file mode 100644
index 000000000000..318ca769eaed
--- /dev/null
+++ b/code/modules/projectiles/guns/bolt_types/locking_bolt.dm
@@ -0,0 +1,23 @@
+///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
+/// Example: Pistols with a slide lock, some SMGs
+/datum/gun_bolt/locking
+
+/datum/gun_bolt/locking/get_overlays()
+ return "[parent.icon_state]_bolt[is_locked ? "_locked" : ""]"
+
+/datum/gun_bolt/locking/post_rack(mob/user)
+ if (parent.chambered)
+ return ..()
+
+ is_locked = TRUE
+ playsound(parent, parent.lock_back_sound, parent.lock_back_sound_volume, parent.lock_back_sound_vary)
+
+/datum/gun_bolt/locking/after_chambering()
+ if (!parent.chambered && !parent.get_ammo())
+ is_locked = TRUE
+ parent.update_appearance()
+
+/datum/gun_bolt/locking/attack_self(mob/living/user)
+ if(is_locked)
+ parent.drop_bolt(user)
+ return TRUE
diff --git a/code/modules/projectiles/guns/bolt_types/no_bolt.dm b/code/modules/projectiles/guns/bolt_types/no_bolt.dm
new file mode 100644
index 000000000000..02d1c3ed9b30
--- /dev/null
+++ b/code/modules/projectiles/guns/bolt_types/no_bolt.dm
@@ -0,0 +1,35 @@
+
+///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine.
+/// Example: Break action shotguns, revolvers
+/datum/gun_bolt/no_bolt
+
+/datum/gun_bolt/no_bolt/pre_rack(mob/user)
+ return TRUE // There's nothing to rack, it's boltless.
+
+/datum/gun_bolt/no_bolt/loaded_ammo()
+ if (isnull(parent.chambered))
+ parent.chamber_round()
+
+/datum/gun_bolt/no_bolt/unload(mob/user)
+ . = TRUE // No matter what happens we're cancelling the call
+ if(!parent.wielded && !user.get_empty_held_index())
+ to_chat(user, span_warning("You need a free hand to do that!"))
+ return
+
+ parent.chambered = null
+ var/num_unloaded = 0
+
+ for(var/obj/item/ammo_casing/CB in parent.get_ammo_list(FALSE, TRUE))
+ CB.forceMove(parent.drop_location())
+ CB.bounce_away(FALSE, NONE)
+ num_unloaded++
+ var/turf/T = get_turf(parent.drop_location())
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name)
+
+ if (num_unloaded)
+ to_chat(user, span_notice("You unload [num_unloaded] [parent.cartridge_wording]\s from [src]."))
+ playsound(parent, parent.eject_sound, parent.eject_sound_volume, parent.eject_sound_vary)
+ parent.update_appearance()
+ else
+ to_chat(user, span_warning("[parent] is empty!"))
diff --git a/code/modules/projectiles/guns/bolt_types/open_bolt.dm b/code/modules/projectiles/guns/bolt_types/open_bolt.dm
new file mode 100644
index 000000000000..02f017b7efc8
--- /dev/null
+++ b/code/modules/projectiles/guns/bolt_types/open_bolt.dm
@@ -0,0 +1,28 @@
+///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed.
+/// Example: Some SMGs, the L6
+/datum/gun_bolt/open
+
+/datum/gun_bolt/open/get_overlays()
+ if(is_locked)
+ return "[parent.icon_state]_bolt"
+
+/datum/gun_bolt/open/pre_rack(mob/user)
+ if(!is_locked) //If it's an open bolt, racking again would do nothing
+ if (user)
+ to_chat(user, span_notice("[parent]'s [parent.bolt_wording] is already cocked!"))
+ return
+
+ is_locked = FALSE
+
+/datum/gun_bolt/open/magazine_inserted()
+ if(!is_locked)
+ parent.chamber_round(TRUE)
+
+/datum/gun_bolt/open/magazine_ejected()
+ parent.chambered = null
+
+/datum/gun_bolt/open/before_firing()
+ if (!parent.chambered && !parent.get_ammo() && !is_locked)
+ is_locked = TRUE
+ playsound(parent, parent.bolt_drop_sound, parent.bolt_drop_sound_volume)
+ parent.update_appearance()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 9471053b2be0..a3658d1eaa48 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -78,7 +78,6 @@
inhand_icon_state = "shotgun"
desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots."
shaded_charge = 0
- pin = /obj/item/firing_pin/implant/mindshield
ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/disabler, /obj/item/ammo_casing/energy/electrode)
automatic_charge_overlays = FALSE
@@ -95,7 +94,6 @@
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator)
- pin = null
ammo_x_offset = 3
/obj/item/ammo_casing/energy/laser/accelerator
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index eda8a9306479..8f1e3fe1e8a6 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -28,9 +28,6 @@
notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize")
-/obj/item/gun/energy/pulse/loyalpin
- pin = /obj/item/firing_pin/implant/mindshield
-
/obj/item/gun/energy/pulse/carbine
name = "pulse carbine"
desc = "A compact variant of the pulse rifle with less firepower but easier storage."
@@ -51,9 +48,6 @@
/obj/item/gun/energy/pulse/carbine/lethal
ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode)
-/obj/item/gun/energy/pulse/carbine/loyalpin
- pin = /obj/item/firing_pin/implant/mindshield
-
/obj/item/gun/energy/pulse/destroyer
name = "pulse destroyer"
desc = "A heavy-duty energy rifle built for pure destruction."
@@ -74,9 +68,6 @@
inhand_icon_state = "gun"
cell_type = /obj/item/stock_parts/cell/pulse/pistol
-/obj/item/gun/energy/pulse/pistol/loyalpin
- pin = /obj/item/firing_pin/implant/mindshield
-
/obj/item/gun/energy/pulse/pistol/m1911
name = "\improper M1911-P"
desc = "A compact pulse core in a classic handgun frame for Mars officers. It's not the size of the gun, it's the size of the hole it puts through people."
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 489a620d1c88..4e733f255d78 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -328,7 +328,6 @@
w_class = WEIGHT_CLASS_NORMAL
ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
cell_type = /obj/item/stock_parts/cell/high
- pin = null
/obj/item/gun/energy/temperature/security
name = "security temperature gun"
diff --git a/code/modules/projectiles/guns/special/tranq_rifle.dm b/code/modules/projectiles/guns/special/tranq_rifle.dm
index abdf0b1118dd..d0a79a900eaf 100644
--- a/code/modules/projectiles/guns/special/tranq_rifle.dm
+++ b/code/modules/projectiles/guns/special/tranq_rifle.dm
@@ -32,16 +32,18 @@
return list()
/obj/item/gun/ballistic/rifle/tranqrifle/rack(mob/user)
- if(!bolt_locked)
+ if(!bolt.is_locked)
if(!magazine && chambered)
to_chat(user, span_warning("The bolt won't budge!"))
return
+
if(magazine && chambered && !magazine.give_round(chambered))
to_chat(user, span_warning("The bolt won't budge!"))
return
+
to_chat(user, span_notice("You open the bolt of \the [src]."))
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
chambered = null
- bolt_locked = TRUE
+ bolt.is_locked = TRUE
return
drop_bolt(user)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index c3c58d6d247c..6911a09024ff 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -9,16 +9,24 @@
w_class = WEIGHT_CLASS_TINY
attack_verb_continuous = list("pokes")
attack_verb_simple = list("poke")
+
var/fail_message = "invalid user!"
var/selfdestruct = FALSE // Explode when user check is failed.
var/force_replace = FALSE // Can forcefully replace other pins.
var/pin_removeable = FALSE // Can be replaced by any pin.
+
+ /// The gun we're apart of.
var/obj/item/gun/gun
-/obj/item/firing_pin/New(newloc)
- ..()
- if(isgun(newloc))
- gun = newloc
+/obj/item/firing_pin/Initialize(mapload, obj/item/gun/owner)
+ . = ..()
+ if(isgun(owner))
+ gun = owner
+
+/obj/item/firing_pin/Destroy()
+ if(gun)
+ gun.pin = null
+ return ..()
/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
@@ -80,98 +88,6 @@
name = "magic crystal shard"
desc = "A small enchanted shard which allows magical weapons to fire."
-
-// Test pin, works only near firing range.
-/obj/item/firing_pin/test_range
- name = "test-range firing pin"
- desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
- fail_message = "test range check failed!"
- pin_removeable = TRUE
-
-/obj/item/firing_pin/test_range/pin_auth(mob/living/user)
- if(!istype(user))
- return FALSE
- if (istype(get_area(user), /area/station/security/range))
- return TRUE
- return FALSE
-
-
-// Implant pin, checks for implant
-/obj/item/firing_pin/implant
- name = "implant-keyed firing pin"
- desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
- fail_message = "implant check failed!"
- var/obj/item/implant/req_implant = null
-
-/obj/item/firing_pin/implant/pin_auth(mob/living/user)
- if(user)
- for(var/obj/item/implant/I in user.implants)
- if(req_implant && I.type == req_implant)
- return TRUE
- return FALSE
-
-/obj/item/firing_pin/implant/mindshield
- name = "mindshield firing pin"
- desc = "This Security firing pin authorizes the weapon for only mindshield-implanted users."
- icon_state = "firing_pin_loyalty"
- req_implant = /obj/item/implant/mindshield
-
-/obj/item/firing_pin/implant/pindicate
- name = "syndicate firing pin"
- icon_state = "firing_pin_pindi"
- req_implant = /obj/item/implant/weapons_auth
-
-
-
-// Honk pin, clown's joke item.
-// Can replace other pins. Replace a pin in cap's laser for extra fun!
-/obj/item/firing_pin/clown
- name = "hilarious firing pin"
- desc = "Advanced clowntech that can convert any firearm into a far more useful object."
- color = "#FFFF00"
- fail_message = "honk!"
- force_replace = TRUE
-
-/obj/item/firing_pin/clown/pin_auth(mob/living/user)
- playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE)
- return FALSE
-
-// Ultra-honk pin, clown's deadly joke item.
-// A gun with ultra-honk pin is useful for clown and useless for everyone else.
-/obj/item/firing_pin/clown/ultra
- name = "ultra hilarious firing pin"
-
-/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user)
- playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE)
- if(QDELETED(user)) //how the hell...?
- stack_trace("/obj/item/firing_pin/clown/ultra/pin_auth called with a [isnull(user) ? "null" : "invalid"] user.")
- return TRUE
- if(HAS_TRAIT(user, TRAIT_CLUMSY)) //clumsy
- return TRUE
- if(user.mind)
- if(is_clown_job(user.mind.assigned_role)) //traitor clowns can use this, even though they're technically not clumsy
- return TRUE
- if(user.mind.has_antag_datum(/datum/antagonist/nukeop/clownop)) //clown ops aren't clumsy by default and technically don't have an assigned role of "Clown", but come on, they're basically clowns
- return TRUE
- if(user.mind.has_antag_datum(/datum/antagonist/nukeop/leader/clownop)) //Wanna hear a funny joke?
- return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum.
- return FALSE
-
-/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G)
- ..()
- G.clumsy_check = FALSE
-
-/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user)
- gun.clumsy_check = initial(gun.clumsy_check)
- ..()
-
-// Now two times deadlier!
-/obj/item/firing_pin/clown/ultra/selfdestruct
- name = "super ultra hilarious firing pin"
- desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it."
- selfdestruct = TRUE
-
-
// DNA-keyed pin.
// When you want to keep your toys for yourself.
/obj/item/firing_pin/dna
@@ -203,10 +119,6 @@
else
..()
-/obj/item/firing_pin/dna/dredd
- desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it."
- selfdestruct = TRUE
-
// Paywall pin, brought to you by ARMA 3 DLC.
// Checks if the user has a valid bank account on an ID and if so attempts to extract a one-time payment to authorize use of the gun. Otherwise fails to shoot.
/obj/item/firing_pin/paywall
@@ -322,20 +234,6 @@
active_prompt_user = null
return FALSE //we return false here so you don't click initially to fire, get the prompt, accept the prompt, and THEN the gun
-// Explorer Firing Pin- Prevents use on station Z-Level, so it's justifiable to give Explorers guns that don't suck.
-/obj/item/firing_pin/explorer
- name = "outback firing pin"
- desc = "A firing pin used by the austrailian defense force, retrofit to prevent weapon discharge on the station."
- icon_state = "firing_pin_explorer"
- fail_message = "cannot fire while on station, mate!"
-
-// This checks that the user isn't on the station Z-level.
-/obj/item/firing_pin/explorer/pin_auth(mob/living/user)
- var/turf/station_check = get_turf(user)
- if(!station_check || is_station_level(station_check.z))
- return FALSE
- return TRUE
-
// Laser tag pins
/obj/item/firing_pin/tag
name = "laser tag firing pin"
@@ -363,8 +261,3 @@
icon_state = "firing_pin_blue"
suit_requirement = /obj/item/clothing/suit/bluetag
tagcolor = "blue"
-
-/obj/item/firing_pin/Destroy()
- if(gun)
- gun.pin = null
- return ..()
diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm
index 96fe8afe2d9e..a8e7b68f7d37 100644
--- a/code/modules/projectiles/projectile/bullets/pistol.dm
+++ b/code/modules/projectiles/projectile/bullets/pistol.dm
@@ -7,7 +7,7 @@
/obj/projectile/bullet/c9mm/ap
name = "9mm armor-piercing bullet"
- damage = 27
+ damage = 30
armor_penetration = 40
embedding = null
shrapnel_type = null
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index a4033e768989..4f74ea58d690 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -7,7 +7,7 @@
// .50AE (Desert Eagle)
/obj/projectile/bullet/a50ae
- name = ".50AE bullet"
+ name = ".50 AE bullet"
damage = 60
// .38 (Detective's Gun)
@@ -97,7 +97,7 @@
var/mob/living/M = target
M.adjust_bodytemperature(((100-blocked)/100)*(temperature - M.bodytemperature))
-// .357 (Syndie Revolver)
+// .357 (Revolver)
/obj/projectile/bullet/a357
name = ".357 bullet"
diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm
index c953b4d8a2ab..6a1faa6db649 100644
--- a/code/modules/projectiles/projectile/bullets/sniper.dm
+++ b/code/modules/projectiles/projectile/bullets/sniper.dm
@@ -1,7 +1,7 @@
// .50 (Sniper)
/obj/projectile/bullet/p50
- name =".50 bullet"
+ name =".50 BMG bullet"
speed = 0.4
range = 400 // Enough to travel from one corner of the Z to the opposite corner and then some.
damage = 70
@@ -17,7 +17,7 @@
return ..()
/obj/projectile/bullet/p50/soporific
- name =".50 soporific bullet"
+ name =".50 BMG soporific bullet"
armor_penetration = 0
damage = 0
dismemberment = 0
@@ -31,7 +31,7 @@
return ..()
/obj/projectile/bullet/p50/penetrator
- name = "penetrator round"
+ name = ".50 BMG penetrator bullet"
icon_state = "gauss"
damage = 60
range = 50
@@ -49,7 +49,7 @@
range = 16
/obj/projectile/bullet/p50/marksman
- name = ".50 marksman round"
+ name = ".50 BMG marksman bullet"
damage = 50
paralyze = 0
tracer_type = /obj/effect/projectile/tracer/sniper
diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm
index 55b832a9f2d2..053f66ed074a 100644
--- a/code/modules/projectiles/projectile/reusable/foam_dart.dm
+++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm
@@ -35,11 +35,3 @@
/obj/projectile/bullet/reusable/foam_dart/Destroy()
pen = null
return ..()
-
-/obj/projectile/bullet/reusable/foam_dart/riot
- name = "riot foam dart"
- icon_state = "foamdart_riot_proj"
- base_icon_state = "foamdart_riot_proj"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- nodamage = FALSE
- stamina = 25
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 1f796569f752..8110a5e4adac 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -16,26 +16,6 @@
category = list(DCAT_AMMO)
mapload_design_flags = DESIGN_FAB_SECURITY
-/datum/design/pin_testing
- name = "Test-Range Firing Pin"
- desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
- id = "pin_testing"
- build_type = FABRICATOR
- materials = list(/datum/material/iron = 500, /datum/material/glass = 300)
- build_path = /obj/item/firing_pin/test_range
- category = list("Firing Pins")
- mapload_design_flags = DESIGN_FAB_SECURITY
-
-/datum/design/pin_mindshield
- name = "Mindshield Firing Pin"
- desc = "This is a security firing pin which only authorizes users who are mindshield-implanted."
- id = "pin_loyalty"
- build_type = FABRICATOR
- materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200)
- build_path = /obj/item/firing_pin/implant/mindshield
- category = list("Firing Pins")
- mapload_design_flags = DESIGN_FAB_SECURITY
-
/datum/design/stunrevolver
name = "Tesla Cannon Part Kit"
desc = "The kit for a high-tech cannon that fires internal, reusable bolt cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm
index ab8a537553dc..bfcdc544b3fa 100644
--- a/code/modules/uplink/uplink_items/ammunition.dm
+++ b/code/modules/uplink/uplink_items/ammunition.dm
@@ -8,62 +8,51 @@
category = /datum/uplink_category/ammo
surplus = 40
-// No progression cost
-
-/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
- cost = 2
- surplus = 0
- illegal_tech = FALSE
-
// Low progression cost
/datum/uplink_item/ammo/pistol
- name = "9mm Handgun Magazine"
- desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol."
+ name = "8-round 9x19mm Magazine"
+ desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms."
progression_minimum = 10 MINUTES
item = /obj/item/ammo_box/magazine/m9mm
- cost = 1
+ cost = 2
purchasable_from = ~UPLINK_CLOWN_OPS
illegal_tech = FALSE
// Medium progression cost
/datum/uplink_item/ammo/pistolap
- name = "9mm Armour Piercing Magazine"
- desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol. \
- These rounds are less effective at injuring the target but penetrate protective gear."
+ name = "8-round 9x19mm Armour Piercing Magazine"
+ desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms. \
+ These bullets are highly effective against armor."
progression_minimum = 30 MINUTES
item = /obj/item/ammo_box/magazine/m9mm/ap
- cost = 2
+ cost = 4
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/ammo/pistolhp
- name = "9mm Hollow Point Magazine"
- desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol. \
- These rounds are more damaging but ineffective against armour."
+ name = "8-round 9x19mm Hollow-Point Magazine"
+ desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms. \
+ These bullets will tear through flesh, but lack penetration."
progression_minimum = 30 MINUTES
item = /obj/item/ammo_box/magazine/m9mm/hp
- cost = 3
+ cost = 4
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/ammo/pistolfire
- name = "9mm Incendiary Magazine"
- desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol. \
- Loaded with incendiary rounds which inflict little damage, but ignite the target."
+ name = "8-round 9x19mm Incendiary Magazine"
+ desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms. \
+ These bullets have low stopping power, but will ignite flesh upon impact."
progression_minimum = 30 MINUTES
item = /obj/item/ammo_box/magazine/m9mm/fire
- cost = 2
+ cost = 6
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/ammo/revolver
- name = ".357 Speed Loader"
- desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \
- For when you really need a lot of things dead."
+ name = ".357 S&W Speed Loader"
+ desc = "A speed loader that contains seven .357 S&W Magnum rounds. Sometimes, you just need a little more gun."
progression_minimum = 30 MINUTES
item = /obj/item/ammo_box/a357
- cost = 4
+ cost = 6
purchasable_from = ~UPLINK_CLOWN_OPS
illegal_tech = FALSE
diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm
index 92a25263d3c3..44fbbdd6ca75 100644
--- a/code/modules/uplink/uplink_items/dangerous.dm
+++ b/code/modules/uplink/uplink_items/dangerous.dm
@@ -8,25 +8,14 @@
/datum/uplink_item/dangerous
category = /datum/uplink_category/dangerous
-// No progression cost
-
-/datum/uplink_item/dangerous/foampistol
- name = "Toy Pistol with Riot Darts"
- desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade \
- darts effective at incapacitating a target."
- item = /obj/item/gun/ballistic/automatic/pistol/toy/riot
- cost = 2
- surplus = 10
-
// Low progression cost
/datum/uplink_item/dangerous/pistol
- name = "Makarov Pistol"
- desc = "A small, easily concealable handgun that uses 9mm auto rounds in 8-round magazines and is compatible \
- with suppressors."
+ name = "9x19mm Pistol"
+ desc = "A servicable handgun chambered in 9x19mm Parabellum."
progression_minimum = 10 MINUTES
item = /obj/item/gun/ballistic/automatic/pistol
- cost = 7
+ cost = 10
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/dangerous/throwingweapons
@@ -40,11 +29,10 @@
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
- desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \
- pocketed when inactive. Activating it produces a loud, distinctive noise."
+ desc = "The energy sword is an edged weapon with a blade of pure energy. Activating it produces a loud, distinctive noise."
progression_minimum = 20 MINUTES
item = /obj/item/melee/energy/sword/saber
- cost = 8
+ cost = 12
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/dangerous/powerfist
@@ -66,36 +54,11 @@
// Medium progression cost
-
-/datum/uplink_item/dangerous/doublesword
- name = "Double-Bladed Energy Sword"
- desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
- all energy projectiles, but requires two hands to wield."
- progression_minimum = 30 MINUTES
- item = /obj/item/dualsaber
-
- cost = 16
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/dangerous/doublesword/get_discount()
- return pick(4;0.8,2;0.65,1;0.5)
-
-/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."
- progression_minimum = 30 MINUTES
- item = /obj/item/storage/box/syndie_kit/guardian
- cost = 18
- surplus = 0
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- restricted = TRUE
-
/datum/uplink_item/dangerous/revolver
- name = "Syndicate Revolver"
- desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
+ name = ".357 Magnum Revolver"
+ desc = "A modern classic, 7-chamber revolver chambered in .357 S&W."
item = /obj/item/gun/ballistic/revolver
progression_minimum = 30 MINUTES
- cost = 13
+ cost = 14
surplus = 50
purchasable_from = ~UPLINK_CLOWN_OPS
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index 6eed450dce08..b673df4dca18 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -24,14 +24,14 @@
minimum setting of 10 seconds."
progression_minimum = 10 MINUTES
item = /obj/item/grenade/c4
- cost = 1
+ cost = 4
/datum/uplink_item/explosives/c4bag
name = "Bag of C-4 explosives"
- desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives."
+ desc = "Because sometimes quantity is quality. Contains 4 C-4 plastic explosives."
item = /obj/item/storage/backpack/duffelbag/syndie/c4
progression_minimum = 20 MINUTES
- cost = 8 //20% discount!
+ cost = 14 // 22% discount
cant_discount = TRUE
/datum/uplink_item/explosives/x4bag
@@ -41,7 +41,7 @@
For when you want a controlled explosion that leaves a wider, deeper, hole."
progression_minimum = 30 MINUTES
item = /obj/item/storage/backpack/duffelbag/syndie/x4
- cost = 4
+ cost = 14
cant_discount = TRUE
/datum/uplink_item/explosives/detomatix
@@ -51,7 +51,7 @@
The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer."
progression_minimum = 30 MINUTES
item = /obj/item/computer_hardware/hard_drive/role/virus/deto
- cost = 6
+ cost = 10
restricted = TRUE
/datum/uplink_item/explosives/emp
@@ -100,4 +100,4 @@
The bomb core can be pried out and manually detonated with other explosives."
progression_minimum = 40 MINUTES
item = /obj/item/sbeacondrop/bomb
- cost = 11
+ cost = 16
diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm
index 1ab89bbd883d..e4df377d6514 100644
--- a/code/modules/uplink/uplink_items/job.dm
+++ b/code/modules/uplink/uplink_items/job.dm
@@ -53,24 +53,6 @@
// Low progression cost
-/datum/uplink_item/role_restricted/clownpin
- name = "Ultra Hilarious Firing Pin"
- desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
- progression_minimum = 5 MINUTES
- cost = 4
- item = /obj/item/firing_pin/clown/ultra
- restricted_roles = list(JOB_CLOWN)
- illegal_tech = FALSE
-
-/datum/uplink_item/role_restricted/clownsuperpin
- name = "Super Ultra Hilarious Firing Pin"
- desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
- progression_minimum = 5 MINUTES
- cost = 7
- item = /obj/item/firing_pin/clown/ultra/selfdestruct
- restricted_roles = list(JOB_CLOWN)
- illegal_tech = FALSE
-
/datum/uplink_item/role_restricted/syndimmi
name = "Syndicate Brand MMI"
desc = "An MMI modified to give cyborgs laws to serve the Syndicate without having their interface damaged by Cryptographic Sequencers, this will not unlock their hidden modules."
diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm
index c6934a95eeb9..f5e5955a20d3 100644
--- a/code/modules/uplink/uplink_items/nukeops.dm
+++ b/code/modules/uplink/uplink_items/nukeops.dm
@@ -3,7 +3,7 @@
desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \
box of syringes, Donksoft assault rifle, and some riot darts. Remember: Seal suit and equip internals before use."
item = /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
- cost = 30 // normally 42
+ cost = 20
purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
/datum/uplink_item/bundles_tc/bulldog
@@ -33,7 +33,7 @@
desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \
a Donksoft LMG, a box of riot darts and a pair of magboots to rescue your friends in no-gravity environments."
item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
- cost = 15 // normally 20
+ cost = 10 // normally 20
purchasable_from = UPLINK_NUKE_OPS
/datum/uplink_item/bundles_tc/sniper
@@ -90,22 +90,6 @@
surplus = 0
purchasable_from = UPLINK_CLOWN_OPS
-/datum/uplink_item/dangerous/clownoppin
- name = "Ultra Hilarious Firing Pin"
- desc = "A firing pin that, when inserted into a gun, makes that gun only useable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it."
- cost = 1 //much cheaper for clown ops than for clowns
- item = /obj/item/firing_pin/clown/ultra
- purchasable_from = UPLINK_CLOWN_OPS
- illegal_tech = FALSE
-
-/datum/uplink_item/dangerous/clownopsuperpin
- name = "Super Ultra Hilarious Firing Pin"
- desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it."
- cost = 4 //much cheaper for clown ops than for clowns
- item = /obj/item/firing_pin/clown/ultra/selfdestruct
- purchasable_from = UPLINK_CLOWN_OPS
- illegal_tech = FALSE
-
/datum/uplink_item/dangerous/bioterror
name = "Biohazardous Chemical Sprayer"
desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
index 07760883d862..e5cfb0e97112 100644
--- a/code/modules/vending/liberation.dm
+++ b/code/modules/vending/liberation.dm
@@ -14,7 +14,7 @@
/obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2,
/obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2,
/obj/item/gun/ballistic/automatic/pistol/m1911 = 2,
- /obj/item/gun/ballistic/automatic/proto/unrestricted = 2,
+ /obj/item/gun/ballistic/automatic/proto = 2,
/obj/item/gun/ballistic/shotgun/automatic/combat = 2,
/obj/item/gun/ballistic/automatic/gyropistol = 1,
/obj/item/gun/ballistic/shotgun = 2,
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 28d085c1fbbe..471f8f89d172 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -8,9 +8,9 @@
vend_reply = "Come back for more!"
circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor
products = list(
- /obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/automatic/toy = 10,
/obj/item/gun/ballistic/automatic/pistol/toy = 10,
- /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
@@ -20,9 +20,8 @@
)
contraband = list(
/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting!
- /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot = 10,
- /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot = 10,
- /obj/item/ammo_box/foambox/riot = 20,
+ /obj/item/gun/ballistic/automatic/c20r/toy = 10,
+ /obj/item/gun/ballistic/automatic/l6_saw/toy = 10,
/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/toys.dm b/code/modules/vending/toys.dm
index 587d948500cc..661e928e2376 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -9,9 +9,9 @@
light_mask = "donksoft-light-mask"
circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor
products = list(
- /obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/automatic/toy = 10,
/obj/item/gun/ballistic/automatic/pistol/toy = 10,
- /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
@@ -21,8 +21,6 @@
)
contraband = list(
/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,
- /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10,
- /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5
)
diff --git a/daedalus.dme b/daedalus.dme
index 6ddbf116282a..c05aaffb5531 100644
--- a/daedalus.dme
+++ b/daedalus.dme
@@ -3239,7 +3239,6 @@
#include "code\modules\mapfluff\ruins\spaceruin_code\DJstation.dm"
#include "code\modules\mapfluff\ruins\spaceruin_code\hilbertshotel.dm"
#include "code\modules\mapfluff\ruins\spaceruin_code\oldstation.dm"
-#include "code\modules\mapfluff\ruins\spaceruin_code\originalcontent.dm"
#include "code\modules\mapfluff\ruins\spaceruin_code\spacehotel.dm"
#include "code\modules\mapfluff\ruins\spaceruin_code\TheDerelict.dm"
#include "code\modules\mapfluff\ruins\spaceruin_code\whiteshipruin_box.dm"
@@ -3393,7 +3392,6 @@
#include "code\modules\mob\living\basic\basic_defense.dm"
#include "code\modules\mob\living\basic\health_adjustment.dm"
#include "code\modules\mob\living\basic\farm_animals\cows.dm"
-#include "code\modules\mob\living\basic\ruin_defender\stickman.dm"
#include "code\modules\mob\living\basic\vermin\cockroach.dm"
#include "code\modules\mob\living\brain\brain.dm"
#include "code\modules\mob\living\brain\brain_item.dm"
@@ -3644,7 +3642,6 @@
#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm"
@@ -3958,6 +3955,10 @@
#include "code\modules\projectiles\guns\ballistic\rifle.dm"
#include "code\modules\projectiles\guns\ballistic\shotgun.dm"
#include "code\modules\projectiles\guns\ballistic\toy.dm"
+#include "code\modules\projectiles\guns\bolt_types\_gun_bolt.dm"
+#include "code\modules\projectiles\guns\bolt_types\locking_bolt.dm"
+#include "code\modules\projectiles\guns\bolt_types\no_bolt.dm"
+#include "code\modules\projectiles\guns\bolt_types\open_bolt.dm"
#include "code\modules\projectiles\guns\energy\beam_rifle.dm"
#include "code\modules\projectiles\guns\energy\dueling.dm"
#include "code\modules\projectiles\guns\energy\energy_gun.dm"
diff --git a/tools/UpdatePaths/firing_pin_removal.txt b/tools/UpdatePaths/firing_pin_removal.txt
new file mode 100644
index 000000000000..20d1a4c082a9
--- /dev/null
+++ b/tools/UpdatePaths/firing_pin_removal.txt
@@ -0,0 +1,21 @@
+/obj/item/storage/box/syndie_kit/clownpins : @DELETE
+/obj/item/gun/ballistic/automatic/c20r/unrestricted : /obj/item/gun/ballistic/automatic/c20r
+/obj/item/gun/ballistic/automatic/proto/unrestricted : /obj/item/gun/ballistic/automatic/proto
+/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted : /obj/item/gun/ballistic/revolver/grenadelauncher
+/obj/item/gun/ballistic/rocketlauncher/unrestricted : /obj/item/gun/ballistic/rocketlauncher
+/obj/item/gun/ballistic/shotgun/bulldog/unrestricted : /obj/item/gun/ballistic/shotgun/bulldog
+/obj/item/gun/energy/pulse/loyalpin : /obj/item/gun/energy/pulse
+/obj/item/gun/energy/pulse/carbine/loyalpin : /obj/item/gun/energy/pulse/carbine
+/obj/item/gun/energy/pulse/pistol/loyalpin : /obj/item/gun/energy/pulse/pistol
+/obj/item/gun/ballistic/automatic/m90/unrestricted : /obj/item/gun/ballistic/automatic/m90
+/obj/item/gun/ballistic/automatic/l6_saw/unrestricted : /obj/item/gun/ballistic/automatic/l6_saw
+/obj/item/gun/ballistic/automatic/toy/unrestricted : /obj/item/gun/ballistic/automatic/toy
+/obj/item/gun/ballistic/shotgun/toy/unrestricted : /obj/item/gun/ballistic/shotgun/toy
+/obj/item/ammo_box/magazine/toy/pistol/riot : @DELETE
+/obj/item/ammo_box/magazine/toy/smg/riot : @DELETE
+/obj/item/ammo_box/magazine/toy/m762/riot : @DELETE
+/obj/item/ammo_box/foambox/riot : @DELETE
+/obj/item/ammo_box/magazine/toy/smgm45/riot : @DELETE
+/obj/item/gun/ballistic/automatic/pistol/toy/riot : /obj/item/gun/ballistic/automatic/pistol/toy
+/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted : /obj/item/gun/ballistic/automatic/c20r/toy
+/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot : /obj/item/gun/ballistic/automatic/c20r/toy