diff --git a/_maps/map_files/Gladius/Gladius1.dmm b/_maps/map_files/Gladius/Gladius1.dmm
index 90069c29bfc..560ae1f443e 100644
--- a/_maps/map_files/Gladius/Gladius1.dmm
+++ b/_maps/map_files/Gladius/Gladius1.dmm
@@ -3700,6 +3700,10 @@
},
/turf/open/floor/monotile/dark,
/area/gateway)
+"bRw" = (
+/obj/machinery/lazylift_button,
+/turf/closed/wall/r_wall/ship,
+/area/shuttle/turbolift/tertiary)
"bRS" = (
/obj/effect/turf_decal/tile/ship/half/blue{
dir = 1
@@ -32226,10 +32230,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/closet/secure_closet/brig{
- id = "brig3";
- name = "Cell 3 Locker"
- },
+/obj/structure/closet/secure_closet/genpop,
/turf/open/floor/monotile/steel,
/area/security/brig)
"oZR" = (
@@ -72863,7 +72864,7 @@ wsg
eqI
gVj
gVj
-eqI
+bRw
eqI
pJj
pJj
diff --git a/_maps/map_files/Gladius/Gladius2.dmm b/_maps/map_files/Gladius/Gladius2.dmm
index f73194c193d..05dc2448477 100644
--- a/_maps/map_files/Gladius/Gladius2.dmm
+++ b/_maps/map_files/Gladius/Gladius2.dmm
@@ -10592,6 +10592,9 @@
/area/crew_quarters/bar)
"glm" = (
/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/monotile/dark,
/area/maintenance/nsv/deck2/starboard/aft)
"glx" = (
@@ -11740,6 +11743,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/visible/layer2,
/turf/open/floor/plasteel/grid/steel,
/area/engine/atmos)
+"gVh" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/shuttle/turbolift/tertiary)
"gVj" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
dir = 1
@@ -34384,6 +34394,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/turf/open/floor/monotile/dark,
/area/nsv/engine/corridor)
+"tAt" = (
+/obj/machinery/lazylift_button,
+/turf/closed/wall/ship,
+/area/shuttle/turbolift/tertiary)
"tAz" = (
/obj/machinery/light{
dir = 4
@@ -62674,7 +62688,7 @@ lEY
lEY
lEY
hnm
-cEl
+gVh
qjq
xmk
gnw
@@ -63448,7 +63462,7 @@ khJ
khJ
jBH
dnn
-khJ
+tAt
khJ
dJe
dJe
diff --git a/_maps/map_files/Hammerhead/Hammerhead.dmm b/_maps/map_files/Hammerhead/Hammerhead.dmm
index 770cbdcdb3b..a3dbae2f4e2 100644
--- a/_maps/map_files/Hammerhead/Hammerhead.dmm
+++ b/_maps/map_files/Hammerhead/Hammerhead.dmm
@@ -16758,6 +16758,8 @@
"bbI" = (
/obj/machinery/computer/lore_terminal,
/obj/structure/munitions_trolley,
+/obj/item/ammo_box/magazine/nsv/heavy_cannon,
+/obj/item/ammo_box/magazine/nsv/heavy_cannon,
/turf/open/floor/durasteel/eris_techfloor_alt,
/area/nsv/hanger)
"bbJ" = (
@@ -21870,8 +21872,8 @@
pixel_y = -8
},
/obj/structure/table/glass,
-/obj/item/storage/toolbox/mechanical,
/obj/item/radio/intercom/directional/north,
+/obj/item/storage/toolbox/mechanical,
/turf/open/floor/plasteel/white,
/area/science/lab)
"cGV" = (
@@ -27424,6 +27426,12 @@
"gqM" = (
/obj/machinery/computer/ship/viewscreen,
/obj/structure/munitions_trolley,
+/obj/item/ammo_box/magazine/nsv/light_cannon,
+/obj/item/ammo_box/magazine/nsv/light_cannon,
+/obj/item/ammo_box/magazine/nsv/light_cannon,
+/obj/item/ammo_box/magazine/nsv/light_cannon,
+/obj/item/ammo_box/magazine/nsv/light_cannon,
+/obj/item/ammo_box/magazine/nsv/light_cannon,
/turf/open/floor/durasteel/eris_techfloor_alt,
/area/nsv/hanger)
"gre" = (
@@ -30064,6 +30072,7 @@
/obj/item/clothing/head/welding{
pixel_x = 7
},
+/obj/item/stack/sheet/plasteel/twenty,
/turf/open/floor/durasteel/padded,
/area/science/robotics/lab)
"ibY" = (
@@ -35687,7 +35696,7 @@
"lLE" = (
/obj/effect/turf_decal/tile/purple,
/obj/structure/table,
-/obj/item/stack/sheet/plasteel/twenty,
+/obj/machinery/ecto_sniffer,
/turf/open/floor/durasteel/padded,
/area/science/robotics/lab)
"lMH" = (
diff --git a/_maps/map_files/Snake/snake_lower.dmm b/_maps/map_files/Snake/snake_lower.dmm
index 8f23ef89e58..b0dcc7ac19a 100644
--- a/_maps/map_files/Snake/snake_lower.dmm
+++ b/_maps/map_files/Snake/snake_lower.dmm
@@ -765,7 +765,7 @@
/turf/open/floor/plasteel,
/area/security/brig)
"cO" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos{
+/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{
dir = 8
},
/turf/open/floor/engine/air,
@@ -3151,7 +3151,7 @@
/turf/open/floor/engine,
/area/nsv/weapons/fore)
"ls" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output{
dir = 4
},
/turf/open/floor/engine/airless,
@@ -3797,9 +3797,9 @@
/turf/open/floor/plasteel/white,
/area/science/lab)
"nL" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{
+/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input{
dir = 8;
- name = "Fuel Mix Injector"
+ piping_layer = 4
},
/turf/open/floor/engine/airless,
/area/engine/atmos)
@@ -4718,6 +4718,12 @@
/obj/machinery/light_switch/north,
/turf/open/floor/engine,
/area/security/execution/transfer)
+"ru" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nucleium_output{
+ dir = 1
+ },
+/turf/open/floor/engine/vacuum,
+/area/engine/atmos)
"rv" = (
/obj/machinery/light_switch/north,
/turf/open/floor/plasteel/dark/side,
@@ -6293,6 +6299,9 @@
dir = 4
},
/obj/item/radio/intercom/directional/south,
+/obj/machinery/computer/atmos_control/tank/nucleium_tank{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"wV" = (
@@ -9238,6 +9247,12 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
+"GQ" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nucleium_input{
+ dir = 1
+ },
+/turf/open/floor/engine/vacuum,
+/area/engine/atmos)
"GS" = (
/obj/structure/kitchenspike,
/obj/machinery/camera/autoname,
@@ -13075,6 +13090,10 @@
/area/security/brig)
"TL" = (
/obj/machinery/light/small,
+/obj/machinery/air_sensor/atmos/nucleium_tank,
+/obj/machinery/portable_atmospherics/canister/nucleium{
+ filled = 0
+ },
/turf/open/floor/engine/vacuum,
/area/engine/atmos)
"TP" = (
@@ -40506,7 +40525,7 @@ NS
Ly
IV
hP
-Hg
+ru
Hg
ge
ge
@@ -41020,7 +41039,7 @@ iB
yL
xe
hP
-Hg
+GQ
Hg
ge
oe
diff --git a/_maps/map_files/Tycoon/Tycoon2.dmm b/_maps/map_files/Tycoon/Tycoon2.dmm
index 4d99ee10e2a..dcffdb84ab8 100644
--- a/_maps/map_files/Tycoon/Tycoon2.dmm
+++ b/_maps/map_files/Tycoon/Tycoon2.dmm
@@ -42294,6 +42294,13 @@
initial_gas_mix = "TEMP=2.7"
},
/area/engine/atmos)
+"fQR" = (
+/obj/structure/lattice/catwalk/over/ship,
+/obj/machinery/conquest_beacon/nanotrasen,
+/turf/open/floor/monotile/dark,
+/area/bridge{
+ name = "CIC"
+ })
"fSF" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
@@ -88543,7 +88550,7 @@ bBU
wMJ
nDn
bmE
-bmE
+fQR
bmE
xvg
bTi
diff --git a/code/__DEFINES/bans.dm b/code/__DEFINES/bans.dm
new file mode 100644
index 00000000000..2b958e2ba1a
--- /dev/null
+++ b/code/__DEFINES/bans.dm
@@ -0,0 +1 @@
+#define BAN_OOC "OOC"
diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm
index 475936d11cb..31c5cd1472c 100644
--- a/code/datums/martial/_martial.dm
+++ b/code/datums/martial/_martial.dm
@@ -9,6 +9,7 @@
var/reroute_deflection = FALSE //Delete the bullet, or actually deflect it in some direction?
var/block_chance = 0 //Chance to block melee attacks using items while on throw mode.
var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not
+ var/armlockstate = 0 //used in jujitsu grab after hand armlock move
var/help_verb
var/no_guns = FALSE
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index dbe623a03de..c800adb9edf 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -293,7 +293,7 @@
name = "\improper LBX AC 10 \"Scattershot\""
desc = "A weapon for combat exosuits. Shoots a spread of pellets."
icon_state = "mecha_scatter"
- equip_cooldown = 20
+ equip_cooldown = 15 //NSV13 - decreased cool down to 15 from 20
projectile = /obj/item/projectile/bullet/scattershot
projectiles = 40
projectile_energy_cost = 25
diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm
index 872414c25d4..77e30e7a819 100644
--- a/code/modules/client/verbs/looc.dm
+++ b/code/modules/client/verbs/looc.dm
@@ -3,128 +3,108 @@
//GLOBAL_VAR_INIT(looc_allowed, 1) //commenting this out might break something but w/e, replaced by one in global config by nsv13
/client/verb/looc(msg as text)
- set name = "LOOC"
- set desc = "Local OOC, seen only by those in view."
- set category = "OOC"
-
- if(GLOB.say_disabled) //This is here to try to identify lag problems
- to_chat(usr, " Speech is currently admin-disabled.")
- return
-
- if(!mob) return
- if(!mob.ckey) return
-
- msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
- var/raw_msg = msg
-
- if(!msg)
- return
-
- if(!(prefs.chat_toggles & CHAT_LOOC)) //nsv13 - toggles -> chat_toggles, CHAT_OOC -> CHAT_LOOC
- to_chat(src, "You have LOOC muted.")
- return
-
- if(is_banned_from(mob.ckey, "OOC"))
- to_chat(src, "You have been banned from OOC and LOOC.")
- return
-
- if(!holder)
- if(!GLOB.looc_allowed) //nsv13 - ooc_allowed -> looc_allowed
- to_chat(src, "LOOC is globally muted.")
- return
- if(!GLOB.dooc_allowed && (mob.stat == DEAD))
- to_chat(usr, "LOOC for dead mobs has been turned off.")
- return
- if(prefs.muted & MUTE_LOOC) //nsv13 - MUTE_OOC -> MUTE_LOOC
- to_chat(src, "You cannot use LOOC (muted).")
- return
- if(handle_spam_prevention(msg,MUTE_LOOC)) //nsv13 - MUTE_OOC -> MUTE_LOOC
- return
- if(findtext(msg, "byond://"))
- to_chat(src, "Advertising other servers is not allowed.")
- log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]")
- return
- if(mob.stat)
- to_chat(src, "You cannot salt in LOOC while unconscious or dead.")
- return
- if(istype(mob, /mob/dead))
- to_chat(src, "You cannot use LOOC while ghosting.")
- return
-
- if(OOC_FILTER_CHECK(raw_msg))
- to_chat(src, "That message contained a word prohibited in OOC chat! Consider reviewing the server rules.\n\"[raw_msg]\"")
- return
-
- msg = emoji_parse(msg)
-
- mob.log_talk(raw_msg, LOG_OOC, tag="LOOC")
-
- var/list/heard = hearers(7, get_top_level_mob(src.mob))
-
+ set name = "LOOC"
+ set desc = "Local OOC, seen only by those in view."
+ set category = "OOC"
+
+ if(GLOB.say_disabled) //This is here to try to identify lag problems
+ to_chat(usr, " Speech is currently admin-disabled.")
+ return
+
+ if(!mob?.ckey)
+ return
+
+ msg = trim(sanitize(msg), MAX_MESSAGE_LEN)
+ if(!length(msg))
+ return
+
+ var/raw_msg = msg
+
+ if(!(prefs.chat_toggles & CHAT_LOOC)) //nsv13 - toggles -> chat_toggles, CHAT_OOC -> CHAT_LOOC
+ to_chat(src, "You have LOOC muted.")
+ return
+
+ if(is_banned_from(mob.ckey, BAN_OOC))
+ to_chat(src, "You have been banned from OOC and LOOC.")
+ return
+
+ if(!holder)
+ if(!GLOB.looc_allowed) //nsv13 - ooc_allowed -> looc_allowed
+ to_chat(src, "LOOC is globally muted.")
+ return
+ if(!GLOB.dooc_allowed && (mob.stat == DEAD))
+ to_chat(usr, "LOOC for dead mobs has been turned off.")
+ return
+ if(prefs.muted & MUTE_LOOC) //nsv13 - MUTE_OOC -> MUTE_LOOC
+ to_chat(src, "You cannot use LOOC (muted).")
+ return
+ if(handle_spam_prevention(msg, MUTE_LOOC)) //nsv13 - MUTE_OOC -> MUTE_LOOC
+ return
+ if(findtext(msg, "byond://"))
+ to_chat(src, "Advertising other servers is not allowed.")
+ log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]")
+ return
+ if(mob.stat)
+ to_chat(src, "You cannot salt in LOOC while unconscious or dead.")
+ return
+ if(isdead(mob))
+ to_chat(src, "You cannot use LOOC while ghosting.")
+ return
+
+ if(OOC_FILTER_CHECK(raw_msg))
+ to_chat(src, "That message contained a word prohibited in OOC chat! Consider reviewing the server rules.\n\"[raw_msg]\"")
+ return
+
+ msg = emoji_parse(msg)
+
+ mob.log_talk(raw_msg, LOG_OOC, tag="LOOC")
+
+ // Search everything in the view for anything that might be a mob, or contain a mob.
+ var/list/client/targets = list()
+ var/list/turf/in_view = list()
//NSV13 - AI QoL - Start
//so the ai can post looc text
- if(istype(mob, /mob/living/silicon/ai))
- var/mob/living/silicon/ai/ai = mob
- heard = hearers(7, get_top_level_mob(ai.eyeobj))
- //so the ai can see looc text
- for(var/mob/living/silicon/ai/ai as anything in GLOB.ai_list)
- if(ai.client && !(ai in heard) && (ai.eyeobj in heard))
- heard += ai
+ if(istype(mob, /mob/living/silicon/ai))
+ var/mob/living/silicon/ai/ai = mob
+ for(var/turf/viewed_turf in view(get_turf(ai.eyeobj)))
+ in_view[viewed_turf] = TRUE
+ else
+ for(var/turf/viewed_turf in view(get_turf(mob)))
+ in_view[viewed_turf] = TRUE
//NSV13 - AI QoL - Stop
-
- for(var/mob/M as() in heard)
- if(!M.client)
- continue
- var/client/C = M.client
- if (C in GLOB.admins)
- continue //they are handled after that
-
- if (isobserver(M))
- continue //Also handled later.
-
- if(C.prefs.chat_toggles & CHAT_LOOC) //nsv13 - toggles -> chat_toggles, CHAT_OOC -> CHAT_LOOC
-// var/display_name = src.key
-// if(holder)
-// if(holder.fakekey)
-// if(C.holder)
-// display_name = "[holder.fakekey]/([src.key])"
-// else
-// display_name = holder.fakekey
- to_chat(C,"LOOC: [src.mob.name]: [msg]")
-
- for(var/client/C in GLOB.admins)
- if(C.prefs.chat_toggles & CHAT_LOOC) //nsv13 - toggles -> chat_toggles, CHAT_OOC -> CHAT_LOOC
- var/prefix = "(R)LOOC"
- if (C.mob in heard)
- prefix = "LOOC"
- to_chat(C,"[ADMIN_FLW(usr)][prefix]: [src.key]/[src.mob.name]: [msg]")
+ for(var/client/client in GLOB.clients)
+ if(!client.mob || !(client.prefs.chat_toggles & CHAT_LOOC) || (client in GLOB.admins)) //nsv13 - toggles -> chat_toggles, CHAT_OOC -> CHAT_LOOC
+ continue
+ //NSV13 - LOOC AI Stuff - Start
+ if(istype(client.mob, /mob/living/silicon/ai))
+ var/mob/living/silicon/ai/ai = client.mob
+ if(in_view[get_turf(ai.eyeobj)])
+ targets |= client
+ to_chat(client, "LOOC: [mob.name]: [msg]", avoid_highlighting = (client == src))
+ else if(in_view[get_turf(client.mob)]) //NSV13 - LOOC AI Stuff - Stop
+ targets |= client
+ to_chat(client, "LOOC: [mob.name]: [msg]", avoid_highlighting = (client == src))
+
+ for(var/client/client in GLOB.admins)
+ if(!(client.prefs.chat_toggles & CHAT_LOOC)) //nsv13 - toggles -> chat_toggles, CHAT_OOC -> CHAT_LOOC
+ continue
+ var/prefix = "[(client in targets) ? "" : "(R)"]LOOC"
+ to_chat(client, "[prefix]: [ADMIN_LOOKUPFLW(mob)]: [msg]", avoid_highlighting = (client == src))
/proc/toggle_looc(toggle = null) //nsv13 - adds a toggle for looc
- if(toggle != null) //if we're specifically en/disabling looc
- if(toggle != GLOB.looc_allowed)
- GLOB.looc_allowed = toggle
- else
- return
- else //otherwise just toggle it
- GLOB.looc_allowed = !GLOB.looc_allowed
+ if(toggle != null) //if we're specifically en/disabling looc
+ if(toggle != GLOB.looc_allowed)
+ GLOB.looc_allowed = toggle
+ else
+ return
+ else //otherwise just toggle it
+ GLOB.looc_allowed = !GLOB.looc_allowed
/proc/log_looc(text)
- if (CONFIG_GET(flag/log_ooc))
- WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LOOC: [text]")
+ if (CONFIG_GET(flag/log_ooc))
+ WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LOOC: [text]")
////////////////////FLAVOUR TEXT NSV13////////////////////
/mob
var/flavour_text = ""
//NSV13 - flavour text - Don't think this thing actually does anything - END
-
-/mob/proc/get_top_level_mob()
- if(istype(src.loc,/mob)&&src.loc!=src)
- var/mob/M=src.loc
- return M.get_top_level_mob()
- return src
-
-/proc/get_top_level_mob(var/mob/S)
- if(istype(S.loc,/mob)&&S.loc!=S)
- var/mob/M=S.loc
- return M.get_top_level_mob()
- return S
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index 955902e9e40..a956339c4a1 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -25,7 +25,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
if(prefs.muted & MUTE_OOC)
to_chat(src, "You cannot use OOC (muted).")
return
- if(is_banned_from(ckey, "OOC"))
+ if(is_banned_from(ckey, BAN_OOC))
to_chat(src, "You have been banned from OOC.")
return
if(QDELETED(src))
diff --git a/html/changelog.html b/html/changelog.html
index c3feb36b2f3..6a0558ec498 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,40 @@
-->
+
29 September 2023
+
Absolucy updated:
+
+ - LOOC is much less janky now. You can properly both hear LOOC as a ghost, and both hear and talk on LOOC while inside another object (including cases such as split personalities, recalled holoparasites, desynchronized mobs, jaunting mobs)!
+ - Fixed admins seeing LOOC message senders as themselves rather the actual sender
+
+
+
21 September 2023
+
BlueHNT updated:
+
+ - Added new Ju Jitsu move
+ - Tweaked Ju Jitsu
+
+
DeltaFire15 updated:
+
+ - Overmap objects with players should be a bit less likely to get stuck in nullspace.
+
+
Ikalpo updated:
+
+ - fixed VLS eating torps that get unloaded
+
+
bruhlookatthisdood updated:
+
+ - Fixes snake atmospherics having wrong injector and vent types in fuel mix chamber
+ - Fixes snake atmospherics having wrong vent type in air chamber
+ - Fixes snake atmospherics's nucleium chamber missing sensor, canister, vent, and injector
+
+
someone543 updated:
+
+ - FLARE added to Tycoon
+ - Added lift button to Gladius mining hanger
+ - fixed Gladius cell lockers not being genpop lockers
+
+
01 September 2023
Bokkiewokkie updated:
@@ -206,64 +240,6 @@ someone543 updated:
- fixed prisoner console not giving brief
-
- 28 July 2023
- BlueHNT updated:
-
- Bobbanz1, KasparoVy, Fikou, Seris02, GoldenAlpharex, Serijas for the Cyborg sprites, Reco201 updated:
-
- - Added a new cyborg module: Cargo Cyborgs! Paperwork experts and aces at delivery, they'll truly complement the Silicon gameplay by finally allowing you to scratch that forms-filling itch you had for so long!
- - Fixed cyborgs re-generating a bunch of icons every time they'd pick a model, with more optimizations to that to come.
- - Cargo Borgs now come equip with a export scanner.
- - Added a new cyborg upgrade to Engineering borgs which allows them to perform some munitions work!
- - refactored the borg icon stuff to allow for easier implementation of other skins for borg modules
- - Cargoborgs upgraded clamp can now carry two wrapped crates instead of one.
-
- Bokkiewokkie updated:
-
- - fixed holomaps breaking when deleted
-
- Nabski updated:
-
- - Renault has a dopey walk animation now, god bless.
-
- SerynEngi updated:
-
- - Increased bullet armor values of all standard armor and armored hardsuits.
- - Decreased laser armor values of all standard armor and armored hardsuits.
- - Added request consoles to various locations within Medical, Munitions, and Engineering on the Tycoon
- - Corrected atmos and power connection near the Stormdrive on the Tycoon
- - Corrected department budget draw for request consoles on the Tycoon
-
- covertcorvid updated:
-
- - Squad manager PDA program is once again restricted to heads
- - Add limit on number of VLS shots fired at once to AMS control console
- - Removed arrivals shuttles
- - Late joiners will now spawn near the cryostasis pods
-
-
- 21 July 2023
- BlueHNT updated:
-
- - Added wt550m9 rubber mag sprite
-
-
- 20 July 2023
- SerynEngi updated:
-
- - Added power connection to remaining Aetherwhisp FTL plyons
- - Connected nucleum Z-level adapter to FTL gas network on the Aetherwhisp
- - Connected the stormdrive output to the nucleum gas network on the Aetherwhisp
-
-
- 19 July 2023
- DeltaFire15 updated:
-
- - Showers can now also affect the last 18 contamination on targets.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 1416172bc36..3940d998a13 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1698,3 +1698,30 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
plutonium sludge.
someone543:
- tweak: Ecto Sniffer has a cooldown for radio messages, and can now send visible_messages
+2023-09-21:
+ BlueHNT:
+ - rscadd: Added new Ju Jitsu move
+ - tweak: Tweaked Ju Jitsu
+ DeltaFire15:
+ - bugfix: Overmap objects with players should be a bit less likely to get stuck
+ in nullspace.
+ Ikalpo:
+ - bugfix: fixed VLS eating torps that get unloaded
+ bruhlookatthisdood:
+ - bugfix: Fixes snake atmospherics having wrong injector and vent types in fuel
+ mix chamber
+ - bugfix: Fixes snake atmospherics having wrong vent type in air chamber
+ - bugfix: Fixes snake atmospherics's nucleium chamber missing sensor, canister,
+ vent, and injector
+ someone543:
+ - rscadd: FLARE added to Tycoon
+ - rscadd: Added lift button to Gladius mining hanger
+ - bugfix: fixed Gladius cell lockers not being genpop lockers
+2023-09-29:
+ Absolucy:
+ - bugfix: LOOC is much less janky now. You can properly both hear LOOC as a ghost,
+ and both hear and talk on LOOC while inside another object (including cases
+ such as split personalities, recalled holoparasites, desynchronized mobs, jaunting
+ mobs)!
+ - bugfix: Fixed admins seeing LOOC message senders as themselves rather the actual
+ sender
diff --git a/nsv13.dme b/nsv13.dme
index af6c1d39ea5..f4565a41f55 100644
--- a/nsv13.dme
+++ b/nsv13.dme
@@ -38,6 +38,7 @@
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\atom_hud.dm"
#include "code\__DEFINES\balloon_alert.dm"
+#include "code\__DEFINES\bans.dm"
#include "code\__DEFINES\bitfields.dm"
#include "code\__DEFINES\bodyparts.dm"
#include "code\__DEFINES\bot_defines.dm"
@@ -3660,6 +3661,7 @@
#include "interface\interface.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
+#include "nsv13\code\__DEFINES\atmospherics.dm"
#include "nsv13\code\__DEFINES\components.dm"
#include "nsv13\code\__DEFINES\fleets.dm"
#include "nsv13\code\__DEFINES\ftl.dm"
@@ -3788,6 +3790,7 @@
#include "nsv13\code\game\machinery\plasma_loader.dm"
#include "nsv13\code\game\machinery\refillable_chem_dispenser.dm"
#include "nsv13\code\game\machinery\computer\_ship.dm"
+#include "nsv13\code\game\machinery\computer\atmos_control.dm"
#include "nsv13\code\game\machinery\computer\boarding_pin.dm"
#include "nsv13\code\game\machinery\computer\helm.dm"
#include "nsv13\code\game\machinery\computer\munitions.dm"
@@ -3840,8 +3843,10 @@
#include "nsv13\code\modules\antagonists\boarders\boarders.dm"
#include "nsv13\code\modules\antagonists\boarders\pirate_boarders.dm"
#include "nsv13\code\modules\atmospherics\gasmixtures\reactions.dm"
+#include "nsv13\code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm"
#include "nsv13\code\modules\atmospherics\machinery\components\binary_devices\constrictor.dm"
#include "nsv13\code\modules\atmospherics\machinery\components\unary_devices\tank.dm"
+#include "nsv13\code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm"
#include "nsv13\code\modules\cargo\mission_rewards.dm"
#include "nsv13\code\modules\cargo\objective_cargo.dm"
#include "nsv13\code\modules\cargo\packs.dm"
diff --git a/nsv13/code/__DEFINES/atmospherics.dm b/nsv13/code/__DEFINES/atmospherics.dm
new file mode 100644
index 00000000000..5de0fedc9f0
--- /dev/null
+++ b/nsv13/code/__DEFINES/atmospherics.dm
@@ -0,0 +1,3 @@
+#define ATMOS_GAS_MONITOR_INPUT_NUCLEIUM "nucleium_in"
+#define ATMOS_GAS_MONITOR_OUTPUT_NUCLEIUM "nucleium_out"
+#define ATMOS_GAS_MONITOR_SENSOR_NUCLEIUM "nucleium_sensor"
diff --git a/nsv13/code/__DEFINES/overmap.dm b/nsv13/code/__DEFINES/overmap.dm
index ed4354121b9..beb76f66c13 100644
--- a/nsv13/code/__DEFINES/overmap.dm
+++ b/nsv13/code/__DEFINES/overmap.dm
@@ -102,6 +102,9 @@ GLOBAL_LIST_INIT(overmap_impact_sounds, list('nsv13/sound/effects/ship/freespace
#define INTERIOR_DELETING 3
#define INTERIOR_DELETED 4
+//Overmap flags
+#define OVERMAP_FLAG_ZLEVEL_CARRIER (1<<0) //! This overmap is meant to carry a z with it, prompting restoration in certain cases.
+
//Ship mass
#define MASS_TINY 1 //1 Player - Fighters
#define MASS_SMALL 2 //2-5 Players - FoB/Mining Ship
diff --git a/nsv13/code/game/machinery/computer/atmos_control.dm b/nsv13/code/game/machinery/computer/atmos_control.dm
new file mode 100644
index 00000000000..223ec4566f1
--- /dev/null
+++ b/nsv13/code/game/machinery/computer/atmos_control.dm
@@ -0,0 +1,11 @@
+/obj/machinery/computer/atmos_control/tank/nucleium_tank //NSV added nucleium tank console
+ name = "Nucleium Supply Monitor"
+ input_tag = ATMOS_GAS_MONITOR_INPUT_NUCLEIUM
+ output_tag = ATMOS_GAS_MONITOR_OUTPUT_NUCLEIUM
+ sensors = list(ATMOS_GAS_MONITOR_SENSOR_NUCLEIUM = "Nucleium Tank")
+ circuit = /obj/item/circuitboard/computer/atmos_control/tank/nucleium_tank
+
+/obj/machinery/air_sensor/atmos/nucleium_tank //nucleium stuff
+ name = "nucleium tank gas sensor"
+ id_tag = ATMOS_GAS_MONITOR_SENSOR_NUCLEIUM
+
diff --git a/nsv13/code/game/objects/items/nsv_circuitboards.dm b/nsv13/code/game/objects/items/nsv_circuitboards.dm
index 4465dee6c6d..d89894a974f 100644
--- a/nsv13/code/game/objects/items/nsv_circuitboards.dm
+++ b/nsv13/code/game/objects/items/nsv_circuitboards.dm
@@ -439,6 +439,12 @@
/obj/item/stack/sheet/glass = 1)
needs_anchored = FALSE
+//Atmospheric consoles
+/obj/item/circuitboard/computer/atmos_control/tank/nucleium_tank
+ name = "nucleium supply control (Computer Board)"
+ build_path = /obj/machinery/computer/atmos_control/tank/nucleium_tank
+
+//Bot navbeacon
/obj/item/circuitboard/machine/navbeacon
name = "Bot Navigational Beacon"
icon_state = "science"
diff --git a/nsv13/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/nsv13/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
new file mode 100644
index 00000000000..5a372955b8a
--- /dev/null
+++ b/nsv13/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -0,0 +1,3 @@
+/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nucleium_input
+ name = "nucleium tank input injector"
+ id = ATMOS_GAS_MONITOR_INPUT_NUCLEIUM
diff --git a/nsv13/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/nsv13/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
new file mode 100644
index 00000000000..2c9f578581e
--- /dev/null
+++ b/nsv13/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -0,0 +1,3 @@
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/nucleium_output
+ name = "nucleium tank output inlet"
+ id_tag = ATMOS_GAS_MONITOR_OUTPUT_NUCLEIUM
diff --git a/nsv13/code/modules/jobs/security/martial_art.dm b/nsv13/code/modules/jobs/security/martial_art.dm
index af918d05cd2..76f88c0170d 100644
--- a/nsv13/code/modules/jobs/security/martial_art.dm
+++ b/nsv13/code/modules/jobs/security/martial_art.dm
@@ -1,7 +1,7 @@
#define MARTIALART_JUJITSU "ju jitsu"
-
-#define TAKEDOWN_COMBO "DD"
-#define JUDO_THROW "DHHG"
+#define TAKEDOWN_COMBO "DG"
+#define JUDO_THROW "HHG"
+#define ARMLOCKING "DHGG"
/obj/item/book/granter/martial/jujitsu
martial = /datum/martial_art/jujitsu
@@ -37,8 +37,11 @@
set desc = "Remember your police academy martial arts training."
set category = "Jujitsu"
to_chat(usr, "Combos:")
- to_chat(usr, "Disarm, disarm will perform a takedown on the target, if they have been slowed / weakened first")
- to_chat(usr, "Disarm, harm, harm, grab will execute a judo throw on the target,landing you on top of them in a pinning position. Provided that you have a grab on them on the final step...")
+ to_chat(usr, "Disarm, Grab will perform a takedown on the target, if they have been slowed / weakened first")
+ to_chat(usr, "Harm, Harm, Grab will execute a judo throw on the target,landing you on top of them in a pinning position. Provided that you have a grab on them on the final step...")
+ to_chat(usr, "Disarm, Harm, Grab, Grab will execute an armlock on the target, throwing you both to the ground. You however have more maneuverability than the perp from this position.")
+
+ to_chat(usr, "In addition, you also have a small window of opportunity to forcefully grab the perp during armlock.")
/datum/martial_art/jujitsu/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(findtext(streak,TAKEDOWN_COMBO))
@@ -49,6 +52,10 @@
streak = ""
judo_throw(A,D)
return TRUE
+ if(findtext(streak,ARMLOCKING))
+ streak = ""
+ armlocking(A, D)
+ return TRUE
return FALSE
/datum/martial_art/jujitsu/proc/takedown(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -61,12 +68,15 @@
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("[A] trips [D] up and pins them to the ground!", "[A] is pinning you to the ground!")
playsound(get_turf(D), 'nsv13/sound/effects/judo_throw.ogg', 100, TRUE)
- D.Paralyze(7 SECONDS) //Equivalent to a clown PDA
+ D.Paralyze(2 SECONDS)
+ D.Knockdown(7 SECONDS)
A.shake_animation(10)
- D.shake_animation(10)
+ D.shake_animation(20)
+ D.adjustOxyLoss(10) // you smashed him into the ground
A.forceMove(get_turf(D))
- A.start_pulling(D, supress_message = FALSE)
- A.setGrabState(GRAB_AGGRESSIVE)
+ if(A.mobility_flags & MOBILITY_STAND) //Fixes permanent slowdown
+ A.start_pulling(D, supress_message = FALSE)
+ A.setGrabState(GRAB_AGGRESSIVE)
last_move = world.time
/datum/martial_art/jujitsu/proc/judo_throw(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -81,25 +91,78 @@
target = get_turf(A)
D.forceMove(target)
A.setDir(newdir)
- A.start_pulling(D, supress_message = FALSE)
- A.setGrabState(GRAB_AGGRESSIVE)
+ D.dropItemToGround(D.get_active_held_item()) // yeet
+ if(A.mobility_flags & MOBILITY_STAND) //Fixes permanent slowdown
+ A.start_pulling(D, supress_message = FALSE)
+ A.setGrabState(GRAB_AGGRESSIVE)
+ D.adjustOxyLoss(40) // YOU THREW HIM, THREW HIM!!
D.Paralyze(7 SECONDS) //Equivalent to a clown PDA
D.visible_message("[A] throws [D] over their shoulder and pins them down!", "[A] throws you over their shoulder and pins you to the ground!")
playsound(get_turf(D), 'nsv13/sound/effects/judo_throw.ogg', 100, TRUE)
last_move = world.time
+// Armlock state removal after 5s
+/datum/martial_art/jujitsu/proc/drop_armlocking()
+ armlockstate = FALSE
+
+// Armlock
+/datum/martial_art/jujitsu/proc/armlocking(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(!can_use(A))
+ return FALSE
+ if(world.time < last_move+cooldown)
+ to_chat(A, "You're too fatigued to perform this move right now...")
+ return FALSE
+ if(!D.stat)
+ D.visible_message("[A] locks [D] into a armlock position!", \
+ "[A] locks you into a armlock position!")
+ A.Knockdown(20) // knockdown officer with the perp
+ A.adjustStaminaLoss(15)
+ D.adjustStaminaLoss(30)
+ D.Paralyze(70)
+ D.shake_animation(50)
+ A.start_pulling(D, supress_message = FALSE)
+ armlockstate = TRUE
+ addtimer(CALLBACK(src, PROC_REF(drop_armlocking)), 50, TIMER_UNIQUE) // you get 3 seconds after standing up to grab the perp
+ A.do_attack_animation(D, ATTACK_EFFECT_DISARM)
+ playsound(get_turf(D), 'nsv13/sound/effects/judo_throw.ogg', 100, TRUE)
+ last_move = world.time
+ return TRUE
+
/datum/martial_art/jujitsu/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(A==D)
return FALSE //prevents grabbing yourself
- if(A.a_intent == INTENT_GRAB)
+ if(A.a_intent == INTENT_GRAB && A.mobility_flags & MOBILITY_STAND) //Fixes permanent slowdown and missfire
+ if(armlockstate == TRUE) // neck grabs if armlocked
+ A.setGrabState(GRAB_NECK)
+ D.visible_message("[A] grabs [D] from the armlock position by the neck!", \
+ "[A] grabs you from the armlock position by the neck!")
+ armlockstate = FALSE
add_to_streak("G",D)
if(check_streak(A,D)) //doing combos is prioritized over upgrading grabs
return TRUE
return FALSE
/datum/martial_art/jujitsu/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
+ var/def_check = D.getarmor(BODY_ZONE_CHEST, "melee")
+ var/bonus_damage = 0
+ if((armlockstate == TRUE)) // disable chosen arm temporarily when armlocked
+ if(A.zone_selected == BODY_ZONE_L_ARM)
+ D.apply_damage(100, STAMINA, BODY_ZONE_L_ARM, def_check)
+ D.visible_message("[A] has cracked [D]'s arm!", "[A] cracks your arm, causing a coursing pain!")
+ armlockstate = FALSE
+ if(A.zone_selected == BODY_ZONE_R_ARM)
+ D.apply_damage(100, STAMINA, BODY_ZONE_R_ARM, def_check)
+ D.visible_message("[A] has cracked [D]'s arm!", "[A] cracks your arm, causing a coursing pain!")
+ armlockstate = FALSE
+ return FALSE
+ if((A.grab_state >= GRAB_AGGRESSIVE))
+ bonus_damage += 5
+ D.apply_damage(rand(2,3) + bonus_damage, A.dna.species.attack_type, affecting, def_check) // bonus damage when grabbing at least aggressively if required to kill
+ if((D.mobility_flags & MOBILITY_STAND))
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) // makes punch be default if he's standing
if(!can_use(A))
return FALSE
add_to_streak("H",D)
@@ -108,6 +171,19 @@
return FALSE
/datum/martial_art/jujitsu/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/bonus_stam = 0
+ if((A.grab_state >= GRAB_AGGRESSIVE)) // If you shove during agressive grab it deals bonus stam
+ bonus_stam = 20
+ if(!(D.mobility_flags & MOBILITY_STAND)) // If you shove while perp is on ground and aggressive grabbing, it deals even more stam
+ bonus_stam += 10
+ D.adjustStaminaLoss(10 + bonus_stam) // deals minor stam damage with scaling dependant on grab and perp standing
+ A.do_attack_animation(D, ATTACK_EFFECT_DISARM)
+ if(A.pulling == D && A.grab_state >= GRAB_NECK) // LV3 hold minimum
+ D.visible_message("[A] puts [D] into a chokehold!", \
+ "[A] puts you into a chokehold!")
+ playsound(get_turf(D), 'nsv13/sound/weapons/chokehold.ogg', 50, 1, 1)
+ D.SetSleeping(200)
+ return FALSE
if(!can_use(A))
return FALSE
add_to_streak("D",D)
diff --git a/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/revision2/vls.dm b/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/revision2/vls.dm
index 8a6c19c5974..3cf4a5d9905 100644
--- a/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/revision2/vls.dm
+++ b/nsv13/code/modules/munitions/ship_weapons/ballistic_weapons/revision2/vls.dm
@@ -58,6 +58,8 @@
return FALSE
if(loading)
return FALSE
+ if(oldloc == src)// stops torps from getting sent back in instantly
+ return FALSE
if(state >= STATE_LOADED)
return FALSE
load(torp)
@@ -133,9 +135,7 @@
hatch.toggle(HT_CLOSED)
/obj/machinery/ship_weapon/vls/unload()
- loading = TRUE // This prevents torps from immediately falling back into the VLS tube
. = ..()
- loading = FALSE
if(!hatch)
return
hatch.toggle(HT_CLOSED)
diff --git a/nsv13/code/modules/overmap/FTL/ftl_jump.dm b/nsv13/code/modules/overmap/FTL/ftl_jump.dm
index e6b585cf61c..f63c95723a9 100644
--- a/nsv13/code/modules/overmap/FTL/ftl_jump.dm
+++ b/nsv13/code/modules/overmap/FTL/ftl_jump.dm
@@ -1,11 +1,17 @@
/datum/star_system/proc/add_ship(obj/structure/overmap/OM, turf/target_turf)
if(!system_contents.Find(OM))
system_contents += OM //Lets be safe while I cast some black magic.
+ var/did_restore_system = FALSE
if(!occupying_z && OM.z) //Does this system have a physical existence? if not, we'll set this now so that any inbound ships jump to the same Z-level that we're on.
if(!SSmapping.level_trait(OM.z, ZTRAIT_OVERMAP))
occupying_z = OM.get_reserved_z()
else
occupying_z = OM.z
+ did_restore_system = TRUE
+ else if(!occupying_z && ((OM.overmap_flags & OVERMAP_FLAG_ZLEVEL_CARRIER) || length(OM.mobs_in_ship))) //If someone is inside, or we always want it loaded, load it.
+ occupying_z = OM.get_reserved_z()
+ did_restore_system = TRUE
+ if(did_restore_system)
if(fleets.len)
for(var/datum/fleet/F in fleets)
if(!F.current_system)
diff --git a/nsv13/code/modules/overmap/ai-skynet.dm b/nsv13/code/modules/overmap/ai-skynet.dm
index bb1164370fa..eab22f31145 100644
--- a/nsv13/code/modules/overmap/ai-skynet.dm
+++ b/nsv13/code/modules/overmap/ai-skynet.dm
@@ -1610,6 +1610,8 @@ Seek a ship thich we'll station ourselves around
var/ai_can_launch_fighters = FALSE //AI variable. Allows your ai ships to spawn fighter craft
var/list/ai_fighter_type = list()
var/ai_flags = AI_FLAG_DESTROYER
+ ///Overmap bitflags
+ var/overmap_flags = NONE
var/list/holding_cargo = list() // list of objective datums. This station has cargo to deliver to the players as part of a courier objective
var/list/expecting_cargo = list() // list of objective datums. This station is expecting cargo delivered to them by the players as a part of a courier objective
diff --git a/nsv13/code/modules/overmap/overmap.dm b/nsv13/code/modules/overmap/overmap.dm
index 00f5b0650d7..9216e047d2a 100644
--- a/nsv13/code/modules/overmap/overmap.dm
+++ b/nsv13/code/modules/overmap/overmap.dm
@@ -232,6 +232,7 @@ Proc to spool up a new Z-level for a player ship and assign it a treadmill.
var/turf/exit = get_turf(locate(round(world.maxx * 0.5, 1), round(world.maxy * 0.5, 1), world.maxz)) //Plop them bang in the center of the system.
var/obj/structure/overmap/OM = new _path(exit) //Ship'll pick up the info it needs, so just domp eet at the exit turf.
OM.reserved_z = world.maxz
+ OM.overmap_flags |= OVERMAP_FLAG_ZLEVEL_CARRIER
OM.current_system = SSstar_system.find_system(OM)
if(OM.role == MAIN_OVERMAP) //If we're the main overmap, we'll cheat a lil' and apply our status to all of the Zs under "station"
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
diff --git a/nsv13/sound/weapons/chokehold.ogg b/nsv13/sound/weapons/chokehold.ogg
new file mode 100644
index 00000000000..43e0db0741f
Binary files /dev/null and b/nsv13/sound/weapons/chokehold.ogg differ