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:

+ + +

21 September 2023

+

BlueHNT updated:

+ +

DeltaFire15 updated:

+ +

Ikalpo updated:

+ +

bruhlookatthisdood updated:

+ +

someone543 updated:

+ +

01 September 2023

Bokkiewokkie updated:

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