diff --git a/_maps/virtual_domains/ancientmilsim_nova.dmm b/_maps/virtual_domains/ancientmilsim_nova.dmm
index b262430eddfd..eaaa5b13d10f 100644
--- a/_maps/virtual_domains/ancientmilsim_nova.dmm
+++ b/_maps/virtual_domains/ancientmilsim_nova.dmm
@@ -102,6 +102,10 @@
/obj/effect/landmark/bitrunning/curiosity_spawn,
/turf/open/floor/grass/fairy,
/area/virtual_domain/protected_space/ancient_milsim)
+"ds" = (
+/obj/item/stack/sheet/mineral/sandbags/fifty,
+/turf/open/misc/grass/planet/ancient_milsim,
+/area/virtual_domain/ancient_milsim/loot_camp)
"dB" = (
/obj/effect/landmark/bitrunning/curiosity_spawn,
/turf/open/misc/dirt/planet,
@@ -494,6 +498,9 @@
/obj/item/ammo_box/magazine/c35sol_pistol/stendo,
/obj/item/ammo_box/magazine/c35sol_pistol/stendo,
/obj/item/ammo_box/magazine/lanca,
+/obj/item/minespawner/ancient_milsim,
+/obj/item/minespawner/ancient_milsim,
+/obj/item/minespawner/ancient_milsim,
/turf/open/floor/iron/dark,
/area/virtual_domain/ancient_milsim/loot_camp)
"ob" = (
@@ -510,6 +517,7 @@
/turf/open/floor/plating,
/area/virtual_domain/ancient_milsim/maintenance)
"ol" = (
+/obj/item/automatic_turret_folded,
/turf/open/floor/iron/dark,
/area/virtual_domain/ancient_milsim/carrier)
"or" = (
@@ -1078,6 +1086,10 @@
/obj/item/storage/medkit/frontier/stocked,
/turf/open/floor/iron/white,
/area/virtual_domain/ancient_milsim/medbay)
+"Cj" = (
+/obj/item/storage/barricade,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/ancient_milsim/loot_camp)
"Cr" = (
/obj/structure/chair/office/light{
dir = 4
@@ -1531,6 +1543,7 @@
/area/virtual_domain/ancient_milsim/carrier)
"My" = (
/obj/structure/table,
+/obj/item/storage/barricade,
/turf/open/floor/iron/dark,
/area/virtual_domain/ancient_milsim/loot_camp)
"Mz" = (
@@ -1743,6 +1756,9 @@
/obj/item/ammo_box/magazine/c35sol_pistol/stendo,
/obj/item/ammo_box/magazine/c35sol_pistol/stendo,
/obj/item/stock_parts/matter_bin/super,
+/obj/item/minespawner/ancient_milsim,
+/obj/item/minespawner/ancient_milsim,
+/obj/item/minespawner/ancient_milsim,
/turf/open/floor/iron/dark,
/area/virtual_domain/ancient_milsim/loot_camp)
"RC" = (
@@ -4183,7 +4199,7 @@ Uz
"}
(38,1,1) = {"
Uz
-Vl
+ds
Vl
Vl
TG
@@ -4360,7 +4376,7 @@ Uz
TQ
bB
bB
-ki
+Cj
vQ
ki
Ww
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
index 3c7012106b18..115685459c28 100644
--- a/code/modules/hydroponics/grown/cannabis.dm
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -72,7 +72,7 @@
product = /obj/item/food/grown/cannabis/ultimate
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/green, /datum/plant_gene/trait/modified_volume/omega_weed)
mutatelist = null
- reagents_add = list(/datum/reagent/drug/thc = 0.3, //NOVA EDIT CHANGE - MORE NARCOTICS - ORIGINAL: reagents_add = list(/datum/reagent/drug/cannabis = 0.3,
+ reagents_add = list(/datum/reagent/drug/thc = 0.3, // NOVA EDIT CHANGE - MORE NARCOTICS - ORIGINAL: reagents_add = list(/datum/reagent/drug/cannabis = 0.3,
/datum/reagent/toxin/mindbreaker = 0.3,
/datum/reagent/mercury = 0.15,
/datum/reagent/lithium = 0.15,
diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml
index 1f3384edc369..94b36e749be3 100644
--- a/html/changelogs/archive/2024-12.yml
+++ b/html/changelogs/archive/2024-12.yml
@@ -932,3 +932,19 @@
in a consumer grade battery recharger, these atmos blocking, aesthetically pleasing,
and now superconductivity insulators can be made by the average crewmember if
they follow the easy to follow 32 steps!
+2024-12-30:
+ Stalkeros:
+ - rscadd: Three new Ancient MilSim DLC loadouts have been added. Go try them all!
+ - qol: Ancient MilSim DLC loadouts now show the general rundown of their abilities
+ in the crate name, consequently the spawner beacon too.
+ - balance: In general, it should be easier for bitrunners to defend themselves in
+ Ancient MilSim, thanks to numerous scattered barricades and landmines.
+ - balance: In general, it should also be easier for SNPCs to defend themselves in
+ Ancient MilSim, too, thanks to the fully automatic mounted machine gun.
+ - balance: Similarly vague item/spell reshuffle has been done for bitrunning disks
+ and abilities.
+ - bugfix: Scream For Me can now actually be used.
+ - qol: If you are to select a random name as a Syndicate Assault ghost role, -Cybersun
+ Counter-Bitrunner-, you'll get a random bitrunning alias instead of your own.
+ - balance: Cybersun Counter-Bitrunners can become immune to spells, on demand.
+ - code_imp: General code cleanup of several Ancient MilSim-related things.
diff --git a/html/changelogs/archive/2025-01.yml b/html/changelogs/archive/2025-01.yml
new file mode 100644
index 000000000000..736db98481ff
--- /dev/null
+++ b/html/changelogs/archive/2025-01.yml
@@ -0,0 +1,14 @@
+2025-01-01:
+ vinylspiders:
+ - bugfix: hash can now be created again by grinding dried cannabis leaves in a grinder
+ or with a mortar and pestle
+2025-01-02:
+ CoiledLamb, JohnFulpWillard, Ebin-Halcyon, axietheaxolotl, sergeirocks100:
+ - image: The coroner's scrubs and jumpsuit now have digitigrade sprites.
+ RatFromTheJungle:
+ - qol: made previously required experiments into discounts for a majority of the
+ tech-web, pretty much everything but alien tech, surgeries (to keep the coroners
+ job safe,) fishing, and illegal tech.
+2025-01-04:
+ somenetwork:
+ - rscadd: Donation reward for bonkaitheroris
diff --git a/modular_nova/master_files/icons/donator/mob/inhands/donator_left.dmi b/modular_nova/master_files/icons/donator/mob/inhands/donator_left.dmi
index 5304cf9deea5..be7c2eecfb91 100644
Binary files a/modular_nova/master_files/icons/donator/mob/inhands/donator_left.dmi and b/modular_nova/master_files/icons/donator/mob/inhands/donator_left.dmi differ
diff --git a/modular_nova/master_files/icons/donator/mob/inhands/donator_right.dmi b/modular_nova/master_files/icons/donator/mob/inhands/donator_right.dmi
index c201c4a918f7..856b84a9a98a 100644
Binary files a/modular_nova/master_files/icons/donator/mob/inhands/donator_right.dmi and b/modular_nova/master_files/icons/donator/mob/inhands/donator_right.dmi differ
diff --git a/modular_nova/master_files/icons/mob/clothing/under/medical.dmi b/modular_nova/master_files/icons/mob/clothing/under/medical.dmi
index 16070f2d27b4..fb616b9e40d7 100644
Binary files a/modular_nova/master_files/icons/mob/clothing/under/medical.dmi and b/modular_nova/master_files/icons/mob/clothing/under/medical.dmi differ
diff --git a/modular_nova/master_files/icons/mob/clothing/under/medical_digi.dmi b/modular_nova/master_files/icons/mob/clothing/under/medical_digi.dmi
index 0b27b7e0d053..cc7c8ed11a6c 100644
Binary files a/modular_nova/master_files/icons/mob/clothing/under/medical_digi.dmi and b/modular_nova/master_files/icons/mob/clothing/under/medical_digi.dmi differ
diff --git a/modular_nova/master_files/icons/obj/plushes.dmi b/modular_nova/master_files/icons/obj/plushes.dmi
index 7ef967b47d8b..877e44ac6019 100644
Binary files a/modular_nova/master_files/icons/obj/plushes.dmi and b/modular_nova/master_files/icons/obj/plushes.dmi differ
diff --git a/modular_nova/modules/bitrunning/code/anchor.dm b/modular_nova/modules/bitrunning/code/anchor.dm
new file mode 100644
index 000000000000..26be4338f49b
--- /dev/null
+++ b/modular_nova/modules/bitrunning/code/anchor.dm
@@ -0,0 +1,34 @@
+/obj/item/domain_anchor
+ name = "domain connection anchor"
+ desc = "A disposable tablet with a set of programs and utilities meant to stabilize the local square meter of domain infospace for new connections to be hopefully-safe.
\
+ In layman's terms, this creates additional bitrunning spawn points."
+ icon = 'modular_nova/modules/bitrunning/icons/remote.dmi'
+ icon_state = "delivery_running"
+
+/obj/item/domain_anchor/examine(mob/user)
+ . = ..()
+ . += span_notice("Use in-hand to create a new spawn point.")
+
+/obj/item/domain_anchor/attack_self(mob/user, modifiers)
+ for(var/obj/machinery/quantum_server/server in SSmachines.get_machines_by_type(/obj/machinery/quantum_server))
+ server.exit_turfs += get_turf(src)
+ server.retries_spent -= 1
+ server.threat += 1
+ server.radio.talk_into(src, "Potential secure datastream detected. Locking on the new spawn point.", RADIO_CHANNEL_SUPPLY)
+ new /obj/effect/landmark/bitrunning/domain_anchor(drop_location())
+ user.balloon_alert(user, "connection stabilized!")
+ qdel(src)
+
+/obj/effect/landmark/bitrunning/domain_anchor
+ name = "anchored secure connection"
+ desc = "Highly stable connection protocol, and consequentially a trojan, used by bitrunners during attacks on high-value targets when numbers are key and \
+ just three attempts aren't enough.
\
+ In several seconds it will merge itself with the code, becoming nigh-invisible to any means of detection."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "curse"
+ invisibility = INVISIBILITY_NONE
+
+/obj/effect/landmark/bitrunning/domain_anchor/Initialize(mapload)
+ . = ..()
+ animate(src, alpha = 0, 10 SECONDS)
+ QDEL_IN(src, 10 SECONDS)
diff --git a/modular_nova/modules/bitrunning/code/disks.dm b/modular_nova/modules/bitrunning/code/disks.dm
index 5af4720efdab..8a3cbf9aeb47 100644
--- a/modular_nova/modules/bitrunning/code/disks.dm
+++ b/modular_nova/modules/bitrunning/code/disks.dm
@@ -7,6 +7,7 @@
/datum/action/cooldown/spell/shapeshift/minor_illusion,
/datum/action/cooldown/spell/conjure_item/fire,
/datum/action/cooldown/spell/conjure_item/water,
+ /datum/action/cooldown/spell/conjure/cheese,
)
/obj/item/bitrunning_disk/item/tier0
@@ -70,7 +71,7 @@
/datum/orderable_item/bitrunning_tech/ability_tier0
cost_per_order = 350
purchase_path = /obj/item/bitrunning_disk/ability/tier0
- desc = "This disk contains a program that lets you cast Minor Illusion, Conjure Presents!, Produce Flame, or Produce Water."
+ desc = "This disk contains a program that lets you cast Minor Illusion, Summon Cheese, Produce Flame, or Produce Water."
/datum/orderable_item/bitrunning_tech/item_tier0
cost_per_order = 350
@@ -81,6 +82,7 @@
. = ..()
selectable_items += list(
/obj/item/storage/belt/military,
+ /obj/item/book_of_babel,
)
/obj/item/bitrunning_disk/item/tier2/Initialize(mapload)
@@ -90,30 +92,41 @@
)
selectable_items += list(
/obj/item/storage/toolbox/guncase/clandestine,
- /obj/item/autosurgeon/syndicate/hackerman,
+ /obj/item/autosurgeon/syndicate/hackerman/bitrunning,
/obj/item/clothing/head/helmet,
/obj/item/melee/energy/sword/saber/blue,
+ /obj/item/shield/energy,
/obj/item/storage/medkit/expeditionary/surplus,
)
+/obj/item/autosurgeon/syndicate/hackerman/bitrunning
+ name = "hacking arm implanter"
+
/obj/item/bitrunning_disk/item/tier3/Initialize(mapload)
. = ..()
selectable_items -= list(
/obj/item/gun/energy/e_gun/nuclear,
)
selectable_items += list(
- /obj/item/autosurgeon/syndicate/nodrop,
+ /obj/item/domain_anchor,
+ /obj/item/autosurgeon/syndicate/nodrop/bitrunning,
/obj/item/gun/energy/modular_laser_rifle,
/obj/item/storage/belt/holster/energy/nanite,
/obj/item/minigunpack,
)
+/obj/item/autosurgeon/syndicate/nodrop/bitrunning
+ name = "anti-drop implanter"
+
/obj/item/bitrunning_disk/ability/tier1/Initialize(mapload)
. = ..()
selectable_actions += list(
/datum/action/cooldown/spell/touch/lay_on_hands,
/datum/action/cooldown/spell/conjure/flare,
)
+ selectable_actions -= list(
+ /datum/action/cooldown/spell/conjure/cheese,
+ )
/obj/item/bitrunning_disk/ability/tier2/Initialize(mapload)
. = ..()
@@ -121,9 +134,13 @@
/datum/action/cooldown/adrenaline,
/datum/action/cooldown/spell/charge,
/datum/action/cooldown/mob_cooldown/dash,
- /datum/action/cooldown/spell/touch/scream_for_me,
+ /datum/action/cooldown/spell/touch/scream_for_me/bitrunning,
)
+/datum/action/cooldown/spell/touch/scream_for_me/bitrunning
+ name = "Unshackled Scream For Me"
+ spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC
+
/obj/item/bitrunning_disk/ability/tier3/Initialize(mapload)
. = ..()
selectable_actions += list(
@@ -148,13 +165,13 @@
desc = "This disk contains a program that lets you equip a luxury medipen, a pistol case, an armour vest, a helmet, an energy sword, an expeditionary medkit, or a hacker implant."
/datum/orderable_item/bitrunning_tech/item_tier3
- desc = "This disk contains a program that lets you equip a Hyeseong laser rifle, a laser minigun pack, a nanite pistol holster, a dual bladed energy sword, a minibomb, or an anti-drop implanter."
+ desc = "This disk contains a program that lets you equip a domain connection anchor, Hyeseong laser rifle, a laser minigun pack, a nanite pistol holster, a dual bladed energy sword, a minibomb, or an anti-drop implanter."
/datum/orderable_item/bitrunning_tech/ability_tier1
- desc = "This disk contains a program that lets you cast Summon Cheese, Summon Light Source, Lesser Heal, or Mending Touch."
+ desc = "This disk contains a program that lets you cast Summon Light Source, Lesser Heal, or Mending Touch."
/datum/orderable_item/bitrunning_tech/ability_tier2
- desc = "This disk contains a program that lets you cast Fireball, Lightning Bolt, Scream For Me, Forcewall, Adrenaline Rush, Dash, or Charge Item."
+ desc = "This disk contains a program that lets you cast Fireball, Lightning Bolt, Unshackled Scream For Me, Forcewall, Adrenaline Rush, Dash, or Charge Item."
/datum/orderable_item/bitrunning_tech/ability_tier3
desc = "This disk contains a program that lets you shapeshift into a lesser ashdrake, a polar bear, a holy juggernaut, or a holy wraith; or cast Death Loop."
diff --git a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/choice_beacon.dm b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/choice_beacon.dm
index ab9b051b4e51..a318137dc25c 100644
--- a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/choice_beacon.dm
+++ b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/choice_beacon.dm
@@ -1,6 +1,8 @@
/obj/item/choice_beacon/ancient_milsim
name = "early access equipment beacon"
desc = "Summon a gear closet for your contributions in the early access testing. Synchronises with the current game version to give you the most up-to-date class equipment."
+ icon = 'modular_nova/modules/bitrunning/icons/remote.dmi'
+ icon_state = "delivery_dlc"
company_source = "'Time Of Valor 2' development team"
company_message = span_bold("Thanks, and have fun!")
@@ -12,41 +14,65 @@
gear_options[initial(crate.name)] = crate
return gear_options
+/obj/structure/closet/crate/secure/weapon/milsim
+ desc = "(ToV 2 Playtester Reward) UNIF Counter-Insurgency Detachment bundle: featuring equipment provided to field operators in medium-intensity firefights.
\
+ 'VCIM (Void Combat Identification Measures) camo' Skin (Alt 1/Strobeless, Opaque Glass)."
+
+/obj/structure/closet/crate/secure/weapon/milsim/PopulateContents()
+ . = ..()
+ new /obj/item/knife/combat(src)
+ new /obj/item/gun/energy/modular_laser_rifle/carbine(src)
+ new /obj/item/radio/headset/headset_faction(src)
+
/obj/structure/closet/crate/secure/weapon/milsim/after_open()
qdel(src)
/obj/structure/closet/crate/secure/weapon/milsim/mechanic
- name = "mechanic loadout crate"
+ name = "mechanic (abductor toolbelt/cable coil dispenser/medHUD)"
/obj/structure/closet/crate/secure/weapon/milsim/mechanic/PopulateContents()
. = ..()
- new /obj/item/knife/combat(src)
- new /obj/item/gun/energy/modular_laser_rifle/carbine(src)
- new /obj/item/mod/control/pre_equipped/responsory/milsim_mechanic(src)
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/mechanic(src)
/obj/structure/closet/crate/secure/weapon/milsim/marksman
- name = "marksman loadout crate"
+ name = "marksman (barricade box/throwing knife dispenser/NVG-sonar)"
/obj/structure/closet/crate/secure/weapon/milsim/marksman/PopulateContents()
. = ..()
- new /obj/item/knife/combat(src)
- new /obj/item/gun/energy/modular_laser_rifle/carbine(src)
- new /obj/item/mod/control/pre_equipped/responsory/milsim_marksman(src)
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/marksman(src)
/obj/structure/closet/crate/secure/weapon/milsim/medic
- name = "medic loadout crate"
+ name = "medic (combat hypospray/combat hypovials dispenser/medHUD)"
/obj/structure/closet/crate/secure/weapon/milsim/medic/PopulateContents()
. = ..()
- new /obj/item/knife/combat(src)
- new /obj/item/gun/energy/modular_laser_rifle/carbine(src)
- new /obj/item/mod/control/pre_equipped/responsory/milsim_medic(src)
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/medic(src)
/obj/structure/closet/crate/secure/weapon/milsim/trapper
- name = "trapper loadout crate"
+ name = "trapper (chameleon projector/stealth landmine dispenser/thermals)"
/obj/structure/closet/crate/secure/weapon/milsim/trapper/PopulateContents()
. = ..()
- new /obj/item/knife/combat(src)
- new /obj/item/gun/energy/modular_laser_rifle/carbine(src)
- new /obj/item/mod/control/pre_equipped/responsory/milsim_trapper(src)
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/trapper(src)
+
+/obj/structure/closet/crate/secure/weapon/milsim/saboteur
+ name = "saboteur (Binyat implanter/EMP grenade dispenser/material scanner-mesons)"
+
+/obj/structure/closet/crate/secure/weapon/milsim/saboteur/PopulateContents()
+ . = ..()
+ new /obj/item/clothing/glasses/material(src)
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/saboteur(src)
+
+/obj/structure/closet/crate/secure/weapon/milsim/sentinel
+ name = "sentinel (heavy machinegun/burger dispenser/NVG-sonar)"
+
+/obj/structure/closet/crate/secure/weapon/milsim/sentinel/PopulateContents()
+ . = ..()
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/sentinel(src)
+
+/obj/structure/closet/crate/secure/weapon/milsim/trooper
+ name = "trooper (Sol rifle/Sol rifle magazine dispenser/NVG-sonar)"
+
+/obj/structure/closet/crate/secure/weapon/milsim/trooper/PopulateContents()
+ . = ..()
+ new /obj/item/mod/control/pre_equipped/responsory/milsim/trooper(src)
diff --git a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mod.dm b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mod.dm
index 8cda78124450..2cbace5a1536 100644
--- a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mod.dm
+++ b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mod.dm
@@ -1,30 +1,28 @@
/datum/mod_theme/responsory/ancient_milsim
armor_type = /datum/armor/armor_sf_hardened
-/obj/item/mod/control/pre_equipped/responsory/milsim_mechanic
+/obj/item/mod/control/pre_equipped/responsory/milsim
theme = /datum/mod_theme/responsory/ancient_milsim
applied_cell = /obj/item/stock_parts/power_store/cell/super
starting_frequency = MODLINK_FREQ_NANOTRASEN
req_access = null
+
+/obj/item/mod/control/pre_equipped/responsory/milsim/mechanic
applied_modules = list(
/obj/item/mod/module/storage/large_capacity,
/obj/item/mod/module/magnetic_harness,
/obj/item/mod/module/status_readout/operational,
/obj/item/mod/module/jetpack,
- /obj/item/mod/module/visor/meson,
+ /obj/item/mod/module/visor/medhud,
)
default_pins = list(
/obj/item/mod/module/jetpack,
- /obj/item/mod/module/visor/meson,
+ /obj/item/mod/module/visor/medhud,
)
- insignia_type = /obj/item/mod/module/insignia/engineer
- additional_module = /obj/item/mod/module/dispenser/emp
+ insignia_type = /obj/item/mod/module/insignia/milsim_mechanic
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/mechanic
-/obj/item/mod/control/pre_equipped/responsory/milsim_trapper
- theme = /datum/mod_theme/responsory/ancient_milsim
- applied_cell = /obj/item/stock_parts/power_store/cell/super
- starting_frequency = MODLINK_FREQ_NANOTRASEN
- req_access = null
+/obj/item/mod/control/pre_equipped/responsory/milsim/trapper
applied_modules = list(
/obj/item/mod/module/storage/large_capacity,
/obj/item/mod/module/magnetic_harness,
@@ -36,14 +34,10 @@
/obj/item/mod/module/jetpack,
/obj/item/mod/module/visor/thermal,
)
- insignia_type = /obj/item/mod/module/insignia/commander
- additional_module = /obj/item/mod/module/dispenser/landmine
+ insignia_type = /obj/item/mod/module/insignia/milsim_trapper
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/trapper
-/obj/item/mod/control/pre_equipped/responsory/milsim_marksman
- theme = /datum/mod_theme/responsory/ancient_milsim
- applied_cell = /obj/item/stock_parts/power_store/cell/super
- starting_frequency = MODLINK_FREQ_NANOTRASEN
- req_access = null
+/obj/item/mod/control/pre_equipped/responsory/milsim/marksman
applied_modules = list(
/obj/item/mod/module/storage/large_capacity,
/obj/item/mod/module/magnetic_harness,
@@ -57,14 +51,10 @@
/obj/item/mod/module/active_sonar,
/obj/item/mod/module/visor/night,
)
- insignia_type = /obj/item/mod/module/insignia/security
- additional_module = /obj/item/mod/module/dispenser/throwing_knife
+ insignia_type = /obj/item/mod/module/insignia/milsim_marksman
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/marksman
-/obj/item/mod/control/pre_equipped/responsory/milsim_medic
- theme = /datum/mod_theme/responsory/ancient_milsim
- applied_cell = /obj/item/stock_parts/power_store/cell/super
- starting_frequency = MODLINK_FREQ_NANOTRASEN
- req_access = null
+/obj/item/mod/control/pre_equipped/responsory/milsim/medic
applied_modules = list(
/obj/item/mod/module/storage/large_capacity,
/obj/item/mod/module/magnetic_harness,
@@ -76,52 +66,104 @@
/obj/item/mod/module/jetpack,
/obj/item/mod/module/visor/medhud,
)
- insignia_type = /obj/item/mod/module/insignia/medic
- additional_module = /obj/item/mod/module/dispenser/hypospray
+ insignia_type = /obj/item/mod/module/insignia/milsim_medic
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/medic
-/obj/item/mod/module/dispenser/emp
- name = "MOD EMP grenade dispenser module"
- desc = "This module can create activated EMP grenades at the user's liking."
- removable = FALSE
- dispense_type = /obj/item/grenade/empgrenade
+/obj/item/mod/control/pre_equipped/responsory/milsim/saboteur
+ applied_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/status_readout/operational,
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/visor/meson,
+ )
+ default_pins = list(
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/visor/meson,
+ )
+ insignia_type = /obj/item/mod/module/insignia/milsim_saboteur
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/saboteur
-/obj/item/mod/module/dispenser/emp/on_use()
- . = ..()
- if(!.)
- return
- var/obj/item/grenade/empgrenade/grenade = .
- grenade.arm_grenade(mod.wearer)
-
-/obj/item/mod/module/dispenser/landmine
- name = "MOD landmine dispenser module"
- desc = "This module can create deactivated landmines at the user's liking."
- removable = FALSE
- cooldown_time = 10 SECONDS
- dispense_type = /obj/item/minespawner/ancient_milsim
+/obj/item/mod/control/pre_equipped/responsory/milsim/sentinel
+ applied_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/status_readout/operational,
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/active_sonar,
+ /obj/item/mod/module/visor/night,
+ )
+ default_pins = list(
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/active_sonar,
+ /obj/item/mod/module/visor/night,
+ )
+ insignia_type = /obj/item/mod/module/insignia/milsim_sentinel
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/sentinel
-/obj/item/mod/module/dispenser/throwing_knife
- name = "MOD throwing knife dispenser module"
- desc = "This module can create throwing knives at the user's liking."
- removable = FALSE
- cooldown_time = 5 SECONDS
- dispense_type = /obj/item/knife/combat/throwing
+/obj/item/mod/control/pre_equipped/responsory/milsim/trooper
+ applied_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/status_readout/operational,
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/active_sonar,
+ /obj/item/mod/module/visor/night,
+ )
+ default_pins = list(
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/active_sonar,
+ /obj/item/mod/module/visor/night,
+ )
+ insignia_type = /obj/item/mod/module/insignia/milsim_trooper
+ additional_module = /obj/item/mod/module/dispenser/ancient_milsim/trooper
-/obj/item/mod/module/dispenser/hypospray
- name = "MOD custom hypospray dispenser module"
- desc = "This module can create a single combat hypospray and additional cartridges at the user's liking."
+/obj/item/mod/module/dispenser/ancient_milsim
removable = FALSE
- cooldown_time = 5 SECONDS
- dispense_type = /obj/item/hypospray/mkii/deluxe/cmo/combat
var/first_use = TRUE
+ var/new_dispense_type = /obj/item/food/burger/tofu
+ var/new_cooldown_time = 2 SECONDS
-/obj/item/mod/module/dispenser/hypospray/on_use()
+/obj/item/mod/module/dispenser/ancient_milsim/on_use()
. = ..()
if(first_use)
first_use = FALSE
- cooldown_time = 15 SECONDS
- dispense_type = /obj/item/reagent_containers/cup/vial/large/ancient_milsim
+ cooldown_time = new_cooldown_time
+ dispense_type = new_dispense_type
+
+/obj/item/mod/module/dispenser/ancient_milsim/mechanic
+ name = "MOD alien tools-cable dispenser module"
+ desc = "This module can create set of advanced tools and additional cable coils at the user's liking."
+ dispense_type = /obj/item/storage/belt/military/abductor/full
+ cooldown_time = 5 SECONDS
+ new_dispense_type = /obj/item/stack/cable_coil
+ new_cooldown_time = 15 SECONDS
+
+/obj/item/mod/module/dispenser/ancient_milsim/trapper
+ name = "MOD chameleon projector-stealth landmines dispenser module"
+ desc = "This module can create a chameleon projector and additional stealth landmines at the user's liking."
+ dispense_type = /obj/item/chameleon
+ cooldown_time = 10 SECONDS
+ new_dispense_type = /obj/item/minespawner/ancient_milsim
+ new_cooldown_time = 10 SECONDS
-/obj/item/hypospray/mkii/deluxe/cmo/combat
+/obj/item/mod/module/dispenser/ancient_milsim/marksman
+ name = "MOD barricade box-throwing knives dispenser module"
+ desc = "This module can create a box of barricades and additional throwing knives at the user's liking."
+ dispense_type = /obj/item/storage/barricade
+ cooldown_time = 15 SECONDS
+ new_dispense_type = /obj/item/knife/combat/throwing
+ new_cooldown_time = 5 SECONDS
+
+/obj/item/mod/module/dispenser/ancient_milsim/medic
+ name = "MOD custom hypospray-hypospray vials dispenser module"
+ desc = "This module can create a single combat hypospray and additional cartridges at the user's liking."
+ dispense_type = /obj/item/hypospray/mkii/deluxe/cmo/combat/ancient_milsim
+ cooldown_time = 5 SECONDS
+ new_dispense_type = /obj/item/reagent_containers/cup/vial/large/ancient_milsim
+ new_cooldown_time = 15 SECONDS
+
+/obj/item/hypospray/mkii/deluxe/cmo/combat/ancient_milsim
start_vial = /obj/item/reagent_containers/cup/vial/large/ancient_milsim
/obj/item/reagent_containers/cup/vial/large/ancient_milsim
@@ -134,3 +176,50 @@
/datum/reagent/medicine/coagulant = 15,
/datum/reagent/medicine/c2/penthrite = 15,
)
+
+/obj/item/mod/module/dispenser/ancient_milsim/saboteur
+ name = "MOD Binyat implanter-EMP grenade dispenser module"
+ desc = "This module can create a single Binyat deck implanter and additional EMP grenades at the user's liking."
+ dispense_type = /obj/item/autosurgeon/syndicate/binyat
+ cooldown_time = 15 SECONDS
+ new_dispense_type = /obj/item/grenade/empgrenade
+ new_cooldown_time = 10 SECONDS
+
+/obj/item/autosurgeon/syndicate/binyat
+ starting_organ = /obj/item/organ/cyberimp/hackerman_deck
+
+/obj/item/mod/module/dispenser/ancient_milsim/sentinel
+ name = "MOD stationary machinegun-burger dispenser module"
+ desc = "This module can create a single disassembled heavy machinegun and additional burgers at the user's liking."
+ dispense_type = /obj/item/automatic_turret_folded
+ cooldown_time = 15 SECONDS
+ new_cooldown_time = 5 SECONDS
+
+/obj/item/mod/module/dispenser/ancient_milsim/trooper
+ name = "MOD Sol rifle-Sol rifle magazine dispenser module"
+ desc = "This module can create a single .40 Sol caliber assault rifle and additional magazines at the user's liking."
+ dispense_type = /obj/item/gun/ballistic/automatic/sol_rifle/evil
+ cooldown_time = 25 SECONDS
+ new_dispense_type = /obj/item/ammo_box/magazine/c40sol_rifle/standard
+ new_cooldown_time = 15 SECONDS
+
+/obj/item/mod/module/insignia/milsim_mechanic
+ color = "#ff7300"
+
+/obj/item/mod/module/insignia/milsim_trapper
+ color = "#372297"
+
+/obj/item/mod/module/insignia/milsim_marksman
+ color = "#a01d1d"
+
+/obj/item/mod/module/insignia/milsim_medic
+ color = "#2fdab4"
+
+/obj/item/mod/module/insignia/milsim_saboteur
+ color = "#1eff00"
+
+/obj/item/mod/module/insignia/milsim_sentinel
+ color = "#b536c0"
+
+/obj/item/mod/module/insignia/milsim_trooper
+ color = "#7e7e7e"
diff --git a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mounted_machine_gun.dm b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mounted_machine_gun.dm
new file mode 100644
index 000000000000..24dc1362ac20
--- /dev/null
+++ b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/mounted_machine_gun.dm
@@ -0,0 +1,40 @@
+/obj/item/automatic_turret_folded
+ name = "folded heavy machine gun"
+ desc = "A folded and unloaded heavy machine gun, ready to be deployed and used."
+ icon = 'modular_nova/modules/mounted_machine_gun/icons/turret_objects.dmi'
+ icon_state = "folded_hmg"
+ inhand_icon_state = "folded_hmg"
+ max_integrity = 250
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+
+/obj/item/automatic_turret_folded/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/deployable, 7 SECONDS, /obj/machinery/deployable_turret/hmg/ancient_milsim)
+
+/obj/machinery/deployable_turret/hmg/ancient_milsim
+ icon = 'modular_nova/modules/mounted_machine_gun/icons/turret.dmi'
+ icon_state = "mmg"
+ projectile_type = /obj/projectile/bullet/manned_turret/hmg/ancient_milsim
+ number_of_shots = 1
+ cooldown_duration = 1 SECONDS
+ rate_of_fire = 2
+ spawned_on_undeploy = /obj/item/automatic_turret_folded
+
+/obj/machinery/deployable_turret/hmg/ancient_milsim/checkfire(atom/targeted_atom, mob/user)
+ target = targeted_atom
+ if(target == user || target == get_turf(src))
+ return
+ target_turf = get_turf(target)
+ fire_helper(user)
+
+/obj/projectile/bullet/manned_turret/hmg/ancient_milsim
+ damage = 25
+ armour_penetration = 15
+ light_system = OVERLAY_LIGHT
+ light_range = 1
+ light_power = 1.4
+ light_color = COLOR_SOFT_RED
+ ricochets_max = 4
+ ricochet_chance = 30
+ dismemberment = 1
diff --git a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm
index 10f9920bcbe3..f2e16e64804f 100644
--- a/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm
+++ b/modular_nova/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm
@@ -5,7 +5,7 @@
cost = BITRUNNER_COST_HIGH
desc = "Recreate the events of the Border War's 'hot' part-long-gone as a Solarian strike team sweeping CIN compounds; sponsored by the SolFed recreation enthusiasts. \
Multiplayer playthrough and proper preparation highly recommended."
- completion_loot = list(/obj/item/stack/spacecash/c100 = 3) //Sponsored
+ completion_loot = list(/obj/item/stack/spacecash/c200 = 3) //Sponsored
difficulty = BITRUNNER_DIFFICULTY_HIGH
help_text = "The last part of this domain has a chance to be very PvP-centric. It's best if you don't come alone, and smuggle some ability and gear disks."
forced_outfit = /datum/outfit/solfed_bitrun
@@ -14,13 +14,6 @@
mob_modules = list(/datum/modular_mob_segment/cin_mobs)
reward_points = BITRUNNER_REWARD_HIGH
secondary_loot = list(
- /obj/item/gun/ballistic/automatic/pistol/toy = 2,
- /obj/item/clothing/under/sol_peacekeeper = 1,
- /obj/item/clothing/under/syndicate/rus_army/cin_surplus/random_color = 1,
- /obj/item/clothing/gloves/frontier_colonist = 2,
- /obj/item/clothing/shoes/jackboots/frontier_colonist = 2,
- /obj/item/storage/box/colonial_rations = 2,
- /obj/item/binoculars = 1,
- /obj/item/trench_tool = 1,
+ /obj/item/stack/spacecash/c100 = 12,
/obj/item/bitrunning_disk/item/ancient_milsim = 3,
)
diff --git a/modular_nova/modules/bitrunning/code/virtual_domains/syndicate_assault/ghost_spawner.dm b/modular_nova/modules/bitrunning/code/virtual_domains/syndicate_assault/ghost_spawner.dm
index 4caf1944fd66..5c47ef1342c4 100644
--- a/modular_nova/modules/bitrunning/code/virtual_domains/syndicate_assault/ghost_spawner.dm
+++ b/modular_nova/modules/bitrunning/code/virtual_domains/syndicate_assault/ghost_spawner.dm
@@ -10,14 +10,45 @@
important_text = "Stalling for long enough will also allow us to recoup the costs. Complete denial is still preferable."
random_appearance = FALSE
-/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie/proc/apply_syndiename(mob/living/carbon/human/spawned_human)
- var/bitrunning_alias = spawned_human.client?.prefs?.read_preference(/datum/preference/name/hacker_alias) || pick(GLOB.hacker_aliases)
- spawned_human.fully_replace_character_name(spawned_human.real_name, "[bitrunning_alias]")
+/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie/proc/apply_pref_alias(mob/living/carbon/human/spawned_human)
+ var/pref_alias = spawned_human.client?.prefs?.read_preference(/datum/preference/name/hacker_alias)
+ spawned_human.fully_replace_character_name(spawned_human.real_name, "[pref_alias]")
+
+/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie/proc/apply_random_alias(mob/living/carbon/human/spawned_human)
+ var/random_alias = pick(GLOB.hacker_aliases)
+ spawned_human.fully_replace_character_name(spawned_human.real_name, "[random_alias]")
/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie/special(mob/living/carbon/human/spawned_human)
. = ..()
- apply_syndiename(spawned_human)
+ var/datum/action/cooldown/spell/home_network/norton = new(spawned_human)
+ norton.Grant(spawned_human)
+ apply_random_alias(spawned_human)
/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie/post_transfer_prefs(mob/living/carbon/human/spawned_human)
. = ..()
- apply_syndiename(spawned_human)
+ apply_pref_alias(spawned_human)
+
+/datum/action/cooldown/spell/home_network
+ name = "Home Network"
+ desc = "Makes the caster immune to many forms of practical hacks, backing themselves to the home network."
+
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "bci_shield"
+ sound = 'sound/effects/magic/staff_animation.ogg'
+ cooldown_time = 10 SECONDS
+ spell_requirements = SPELL_REQUIRES_HUMAN
+
+ invocation = "NOR TON"
+ invocation_type = INVOCATION_SHOUT
+
+/datum/action/cooldown/spell/home_network/is_valid_target(atom/cast_on)
+ return isliving(cast_on)
+
+/datum/action/cooldown/spell/home_network/cast(mob/living/cast_on)
+ . = ..()
+ cast_on.visible_message(
+ span_warning("Numerous loading bars and nano-scale hexagonal energy shields briefly cover [cast_on]!"),
+ span_notice("You protect yourself from foreign intrusion!"),
+ )
+ ADD_TRAIT(cast_on, TRAIT_ANTIMAGIC, REF(src))
+ Remove(cast_on)
diff --git a/modular_nova/modules/bitrunning/icons/remote.dmi b/modular_nova/modules/bitrunning/icons/remote.dmi
new file mode 100644
index 000000000000..e8b5dc723bcc
Binary files /dev/null and b/modular_nova/modules/bitrunning/icons/remote.dmi differ
diff --git a/modular_nova/modules/morenarcotics/code/thc.dm b/modular_nova/modules/morenarcotics/code/thc.dm
index b08ce009f724..925ce3a02a55 100644
--- a/modular_nova/modules/morenarcotics/code/thc.dm
+++ b/modular_nova/modules/morenarcotics/code/thc.dm
@@ -1,8 +1,9 @@
/obj/item/food/grown/cannabis/on_grind()
- . = ..()
if(HAS_TRAIT(src, TRAIT_DRIED))
- grind_results = list(/datum/reagent/drug/thc/hash = 0.15*src.seed.potency)
- reagents.clear_reagents() //prevents anything else from coming out
+ if(!reagents)
+ return ..()
+ reagents.convert_reagent(/datum/reagent/drug/thc, /datum/reagent/drug/thc/hash, 1, include_source_subtypes = FALSE)
+ return ..()
/datum/chemical_reaction/hash
required_reagents = list(/datum/reagent/drug/thc/hash = 10)
diff --git a/modular_nova/modules/research/techweb/nodes/disabled-experiments.dm b/modular_nova/modules/research/techweb/nodes/disabled-experiments.dm
new file mode 100644
index 000000000000..062cf5bbbf22
--- /dev/null
+++ b/modular_nova/modules/research/techweb/nodes/disabled-experiments.dm
@@ -0,0 +1,29 @@
+/// changes required experiments to be discount instead
+/datum/techweb_node/proc/make_requirements_optional()
+ discount_experiments = required_experiments.Copy()
+ required_experiments = list()
+
+/datum/techweb_node/gas_compression/New()
+ make_requirements_optional()
+ return ..()
+
+/datum/techweb_node/selection/New()
+ make_requirements_optional()
+ return ..()
+
+/datum/techweb_node/parts_adv/New()
+ make_requirements_optional()
+ return ..()
+
+/datum/techweb_node/mech_combat/New()
+ make_requirements_optional()
+ return ..()
+
+/datum/techweb_node/medbay_equip_adv/New()
+ make_requirements_optional()
+ return ..()
+
+/datum/techweb_node/explosives/New()
+ make_requirements_optional()
+ return ..()
+
diff --git a/tgstation.dme b/tgstation.dme
index 7fa3ac451ab2..6eece2668bf1 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7230,6 +7230,7 @@
#include "modular_nova\modules\better_vox\code\vox_clothing.dm"
#include "modular_nova\modules\better_vox\code\vox_species.dm"
#include "modular_nova\modules\better_vox\code\vox_sprite_accessories.dm"
+#include "modular_nova\modules\bitrunning\code\anchor.dm"
#include "modular_nova\modules\bitrunning\code\disks.dm"
#include "modular_nova\modules\bitrunning\code\flair.dm"
#include "modular_nova\modules\bitrunning\code\loot.dm"
@@ -7248,6 +7249,7 @@
#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\mine.dm"
#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\mobs.dm"
#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\mod.dm"
+#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\mounted_machine_gun.dm"
#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\outfit.dm"
#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\turf.dm"
#include "modular_nova\modules\bitrunning\code\virtual_domains\ancient_milsim\turret.dm"
@@ -8453,6 +8455,7 @@
#include "modular_nova\modules\records_on_examine\code\record_variables.dm"
#include "modular_nova\modules\records_on_examine\code\records_procs.dm"
#include "modular_nova\modules\records_on_examine\code\view_exploitables.dm"
+#include "modular_nova\modules\research\techweb\nodes\disabled-experiments.dm"
#include "modular_nova\modules\resleeving\code\rsd_interface.dm"
#include "modular_nova\modules\resleeving\code\research\resleeving_research.dm"
#include "modular_nova\modules\robot_limb_detach\code\robot_limb_detach_quirk.dm"