diff --git a/modular_doppler/wargaming/code/game_kit.dm b/modular_doppler/wargaming/code/game_kit.dm
new file mode 100644
index 0000000000000..729ee80fe3985
--- /dev/null
+++ b/modular_doppler/wargaming/code/game_kit.dm
@@ -0,0 +1,29 @@
+/obj/item/storage/briefcase/secure/wargame_kit
+ name = "DIY Wargaming Kit"
+ desc = "Contains everything an aspiring naval officer (or just huge fucking nerd) would need for a proper modern naval wargame."
+ custom_premium_price = PAYCHECK_CREW * 2
+
+/obj/item/storage/briefcase/secure/wargame_kit/PopulateContents()
+ var/static/items_inside = list(
+ /obj/item/wargame_projector/ships = 1,
+ /obj/item/wargame_projector/ships/red = 1,
+ /obj/item/wargame_projector/terrain = 1,
+ /obj/item/storage/dice = 1,
+ /obj/item/book/manual/wargame_rules = 1,
+ /obj/item/book/manual/wargame_rules/examples = 1,
+ )
+ generate_items_inside(items_inside,src)
+
+/obj/item/book/manual/wargame_rules
+ name = "Wargame: Blue Lizard - Example Ruleset"
+ icon_state = "book"
+ starting_author = "John War - CEO of War"
+ starting_title = "Wargame: Blue Lizard - Example Ruleset"
+ starting_content = "Formatting is a fuck - 2564 kill em all - Just go to this link in your browser https://hackmd.io/@Paxilmaniac/H1ZVsTIYR"
+
+/obj/item/book/manual/wargame_rules/examples
+ name = "Wargame: Blue Lizard - Example Ships and Scenarios"
+ icon_state = "book1"
+ starting_author = "John War - CEO of War"
+ starting_title = "Wargame: Blue Lizard - Example Ships and Scenarios"
+ starting_content = "Formatting is a fuck - 2564 kill em all - Just go to this link in your browser https://hackmd.io/@Paxilmaniac/rJwy1C8KR"
diff --git a/modular_doppler/wargaming/code/holograms.dm b/modular_doppler/wargaming/code/holograms.dm
new file mode 100644
index 0000000000000..1d85021ef680c
--- /dev/null
+++ b/modular_doppler/wargaming/code/holograms.dm
@@ -0,0 +1,122 @@
+/obj/structure/wargame_hologram
+ name = "broken holographic wargame marker"
+ desc = "You have a feeling like this is supposed to be telling you something, but the hologram must have broken."
+ icon = 'modular_doppler/wargaming/icons/projectors_and_holograms.dmi'
+ icon_state = null
+ anchored = TRUE
+ density = FALSE
+ max_integrity = 1
+ obj_flags = UNIQUE_RENAME
+ /// What object created this projection? Can be null as a projector isn't required for this to exist
+ var/obj/item/wargame_projector/projector
+
+/obj/structure/wargame_hologram/Initialize(mapload, source_projector)
+ . = ..()
+ if(source_projector)
+ projector = source_projector
+ LAZYADD(projector.projections, src)
+
+/obj/structure/wargame_hologram/Destroy()
+ if(projector)
+ LAZYREMOVE(projector.projections, src)
+ projector = null
+ return ..()
+
+/obj/structure/wargame_hologram/update_overlays()
+ . = ..()
+ . += emissive_appearance(icon, icon_state, src)
+
+/// Projections for 'moving vessels' in order from smallest to largest representation
+
+/obj/structure/wargame_hologram/strike_craft
+ name = "strike craft marker"
+ desc = "A hologram of a single strike craft."
+ icon_state = "strikesingle"
+
+/obj/structure/wargame_hologram/strike_craft_util
+ name = "skiff marker"
+ desc = "A hologram of a single utility skiff."
+ icon_state = "strike_utility"
+
+/obj/structure/wargame_hologram/strike_craft/wing
+ name = "strike craft wing marker"
+ desc = "A hologram of a wing of strike craft."
+ icon_state = "strikewing"
+
+/obj/structure/wargame_hologram/ship_marker
+ name = "small vessel marker"
+ desc = "A hologram of a small frigate."
+ icon_state = "smallship"
+
+/obj/structure/wargame_hologram/ship_marker/medium
+ name = "medium vessel marker"
+ desc = "A hologram of a destroyer."
+ icon_state = "mediumship"
+
+/obj/structure/wargame_hologram/ship_marker/large
+ name = "large vessel marker"
+ desc = "A hologram of a large cruiser."
+ icon_state = "bigship"
+
+/obj/structure/wargame_hologram/ship_marker/large/alternate
+ name = "alternate large vessel marker"
+ desc = "A hologram of a massive ship."
+ icon_state = "bigship_alternate"
+
+/obj/structure/wargame_hologram/unidentified
+ name = "unidentified contact marker"
+ desc = "A hologram standing for an unidentified contact."
+ icon_state = "unidentified"
+
+/*
+Projections for misc stuff, like stations, scout probes, or incoming missiles
+*/
+
+/obj/structure/wargame_hologram/missile_warning
+ name = "in-flight missile marker"
+ desc = "A hologram of a missile currently in flight."
+ icon_state = "missile"
+
+/obj/structure/wargame_hologram/probe
+ name = "probe marker"
+ desc = "A hologram of a scout probe."
+ icon_state = "probe"
+
+/obj/structure/wargame_hologram/stationary_structure
+ name = "station marker"
+ desc = "A hologram of a space station."
+ icon_state = "station"
+
+/obj/structure/wargame_hologram/stationary_structure/platform
+ name = "platform marker"
+ desc = "A hologram of a small space platform."
+ icon_state = "platform"
+
+/*
+Projections for space 'terrain' like asteroids and dust clouds
+*/
+
+/obj/structure/wargame_hologram/dust
+ name = "dust field marker"
+ desc = "A hologram of a field of stellar dust of some sort."
+ icon_state = "dustcloud"
+
+/obj/structure/wargame_hologram/asteroid
+ name = "small asteroid marker"
+ desc = "A hologram of a small asteroid."
+ icon_state = "asteroidsmall"
+
+/obj/structure/wargame_hologram/asteroid/large
+ name = "large asteroid marker"
+ desc = "A hologram of a large asteroid."
+ icon_state = "asteroidlarge"
+
+/obj/structure/wargame_hologram/asteroid/cluster
+ name = "asteroid cluster marker"
+ desc = "A hologram of a cluster of asteroids."
+ icon_state = "asteroidcluster"
+
+/obj/structure/wargame_hologram/planet
+ name = "planetary body marker"
+ desc = "A hologram of a planet."
+ icon_state = "planet"
diff --git a/modular_doppler/wargaming/code/projectors.dm b/modular_doppler/wargaming/code/projectors.dm
new file mode 100644
index 0000000000000..3abfc01bbada9
--- /dev/null
+++ b/modular_doppler/wargaming/code/projectors.dm
@@ -0,0 +1,199 @@
+/obj/item/wargame_projector
+ name = "holographic projector"
+ desc = "A handy-dandy holographic projector developed by Nanotrasen Naval Command for playing wargames with, this one seems broken."
+ icon = 'modular_doppler/wargaming/icons/projectors_and_holograms.dmi'
+ icon_state = "projector"
+ base_icon_state = "projector"
+ inhand_icon_state = "electronic"
+ worn_icon_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
+ force = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+ item_flags = NOBLUDGEON
+ /// All of the signs this projector is maintaining
+ var/list/projections
+ /// The maximum number of projections this can support
+ var/max_signs = 1
+ /// The color to give holograms when created
+ var/holosign_color = COLOR_WHITE
+ /// The type of hologram to spawn on click
+ var/holosign_type = /obj/structure/wargame_hologram
+ /// A list containing all of the possible holosigns this can choose from
+ var/list/holosign_options = list(
+ /obj/structure/wargame_hologram,
+ )
+ /// Contains all of the colors that the holograms can be changed to spawn as
+ var/static/list/color_options = list(
+ "Red" = COLOR_RED_LIGHT,
+ "Orange" = COLOR_LIGHT_ORANGE,
+ "Yellow" = COLOR_VIVID_YELLOW,
+ "Green" = COLOR_VIBRANT_LIME,
+ "Blue" = COLOR_BLUE_LIGHT,
+ "Pink" = COLOR_FADED_PINK,
+ "White" = COLOR_WHITE,
+ "Gray" = COLOR_GRAY,
+ "Brown" = COLOR_BROWN,
+ "Ice" = COLOR_BLUE_GRAY,
+ )
+ /// Will hold the choices for radial menu use, populated on init
+ var/list/radial_choices = list()
+ /// A names to path list for the projections filled out by populate_radial_choice_lists() on init
+ var/list/projection_names_to_path = list()
+
+/obj/item/wargame_projector/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/openspace_item_click_handler)
+ update_appearance()
+ populate_radial_choice_lists()
+
+/obj/item/wargame_projector/handle_openspace_click(turf/target, mob/user, click_parameters)
+ ranged_interact_with_atom(target, user, params2list(click_parameters))
+
+/obj/item/wargame_projector/update_appearance()
+ . = ..()
+ cut_overlays()
+
+ var/image/color_select_overlay = image(icon = icon, icon_state = "[base_icon_state]_screen")
+ color_select_overlay.color = holosign_color
+ add_overlay(color_select_overlay)
+
+/obj/item/wargame_projector/examine(mob/user)
+ . = ..()
+ if(projections)
+ . += span_notice("It is currently maintaining [projections.len]/[max_signs] projections.")
+ . += span_notice("Use the projector in hand to change what type of hologram it creates.")
+ . += span_notice("Alt clicking the projector will let you change the color of the next hologram it makes.")
+ . += span_warning("Control clicking the projector will allow you to clear all active holograms.")
+
+/obj/item/wargame_projector/proc/populate_radial_choice_lists()
+ if(!length(radial_choices) || !length(projection_names_to_path))
+ for(var/obj/structure/wargame_hologram/hologram as anything in holosign_options)
+ projection_names_to_path[initial(hologram.name)] = hologram
+ radial_choices[initial(hologram.name)] = image(icon = initial(hologram.icon), icon_state = initial(hologram.icon_state))
+
+/// Changes the selected hologram to one of the options from the hologram list
+/obj/item/wargame_projector/proc/select_hologram(mob/user)
+ var/picked_choice = show_radial_menu(
+ user,
+ src,
+ radial_choices,
+ require_near = TRUE,
+ tooltips = TRUE,
+ )
+
+ if(isnull(picked_choice))
+ return
+
+ holosign_type = projection_names_to_path[picked_choice]
+
+/obj/item/wargame_projector/attack_self(mob/user)
+ select_hologram(user)
+
+/obj/item/wargame_projector/click_alt(mob/user)
+ var/selected_color = tgui_input_list(user, "Select a color", "Color Selection", color_options)
+ if(isnull(selected_color))
+ balloon_alert(user, "no color change")
+ return
+ var/color_to_set_to = color_options[selected_color]
+ holosign_color = color_to_set_to
+ balloon_alert(user, "color changed")
+ update_appearance()
+ return CLICK_ACTION_SUCCESS
+
+/obj/item/wargame_projector/item_ctrl_click(mob/user)
+ if(tgui_alert(usr,"Clear all currently active holograms?", "Hologram Removal", list("Yes", "No")) == "Yes")
+ for(var/hologram as anything in projections)
+ qdel(hologram)
+ return CLICK_ACTION_SUCCESS
+
+/// Can we place a hologram at the target location?
+/obj/item/wargame_projector/proc/check_can_place_hologram(atom/target, mob/user, team)
+ if(!check_allowed_items(target, not_inside = TRUE))
+ return FALSE
+ var/turf/target_turf = get_turf(target)
+ if(target_turf.is_blocked_turf(TRUE))
+ return FALSE
+ if(LAZYLEN(projections) >= max_signs)
+ balloon_alert(user, "max capacity!")
+ return FALSE
+ return TRUE
+
+/// Spawn a hologram with pixel offset based on where the user clicked
+/obj/item/wargame_projector/proc/create_hologram(atom/target, mob/user, list/modifiers)
+ var/obj/target_holosign = new holosign_type(get_turf(target), src)
+
+ var/click_x
+ var/click_y
+
+ if(LAZYACCESS(modifiers, ICON_X) && LAZYACCESS(modifiers, ICON_Y))
+ click_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2)
+ click_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2)
+
+ target_holosign.pixel_x = click_x
+ target_holosign.pixel_y = click_y
+
+ target_holosign.color = holosign_color
+
+ playsound(loc, 'sound/machines/click.ogg', 20, TRUE)
+
+/obj/item/wargame_projector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+ if(istype(interacting_with, /obj/structure/wargame_hologram))
+ qdel(interacting_with)
+ return ITEM_INTERACT_SUCCESS
+ if(!check_can_place_hologram(interacting_with, user, 1))
+ return NONE
+ create_hologram(interacting_with, user, modifiers)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/wargame_projector/Destroy()
+ QDEL_LAZYLIST(projections)
+ . = ..()
+
+/// Actual projector types, split between the 'categories' of things they can project
+
+/obj/item/wargame_projector/ships
+ name = "holographic unit projector"
+ desc = "A handy-dandy holographic projector developed by Nanotrasen Naval Command for playing wargames with, this one creates markers for 'units'."
+ max_signs = 30
+ holosign_color = COLOR_BLUE_LIGHT
+ holosign_type = /obj/structure/wargame_hologram/ship_marker
+ holosign_options = list(
+ /obj/structure/wargame_hologram/unidentified,
+ /obj/structure/wargame_hologram/missile_warning,
+ /obj/structure/wargame_hologram/strike_craft,
+ /obj/structure/wargame_hologram/strike_craft_util,
+ /obj/structure/wargame_hologram/strike_craft/wing,
+ /obj/structure/wargame_hologram/ship_marker,
+ /obj/structure/wargame_hologram/ship_marker/medium,
+ /obj/structure/wargame_hologram/ship_marker/large,
+ /obj/structure/wargame_hologram/ship_marker/large/alternate,
+ /obj/structure/wargame_hologram/probe,
+ /obj/structure/wargame_hologram/stationary_structure,
+ /obj/structure/wargame_hologram/stationary_structure/platform,
+ )
+
+/obj/item/wargame_projector/ships/red
+ holosign_color = COLOR_RED_LIGHT
+
+/obj/item/wargame_projector/terrain
+ name = "holographic terrain projector"
+ desc = "A handy-dandy holographic projector developed by Nanotrasen Naval Command for playing wargames with, this one creates markers for space 'terrain'."
+ max_signs = 30
+ holosign_color = COLOR_GRAY
+ holosign_type = /obj/structure/wargame_hologram/asteroid
+ // Some things, like stations, probes, and unidentified contacts, can be in the terrain one just because I can see situations where that's desired
+ holosign_options = list(
+ /obj/structure/wargame_hologram/unidentified,
+ /obj/structure/wargame_hologram/dust,
+ /obj/structure/wargame_hologram/asteroid,
+ /obj/structure/wargame_hologram/asteroid/large,
+ /obj/structure/wargame_hologram/asteroid/cluster,
+ /obj/structure/wargame_hologram/planet,
+ /obj/structure/wargame_hologram/probe,
+ /obj/structure/wargame_hologram/stationary_structure,
+ /obj/structure/wargame_hologram/stationary_structure/platform,
+ )
diff --git a/modular_doppler/wargaming/icons/projectors_and_holograms.dmi b/modular_doppler/wargaming/icons/projectors_and_holograms.dmi
new file mode 100644
index 0000000000000..569b6d7274c9b
Binary files /dev/null and b/modular_doppler/wargaming/icons/projectors_and_holograms.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index f24a71f819f7f..56c2b58309f10 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6360,4 +6360,7 @@
#include "modular_doppler\emotes\code\added_emotes\human_things.dm"
#include "modular_doppler\emotes\code\added_emotes\robot_sounds.dm"
#include "modular_doppler\face_mouse_preferences\code\face_mouse_pref.dm"
+#include "modular_doppler\wargaming\code\game_kit.dm"
+#include "modular_doppler\wargaming\code\holograms.dm"
+#include "modular_doppler\wargaming\code\projectors.dm"
// END_INCLUDE