From 539bc1bf8dca6e8026b643a1e02201f6f43576a7 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Wed, 3 Jul 2024 22:48:43 +0200 Subject: [PATCH] some deathmatch fixes (#84472) ## About The Pull Request firstly and most importantly polymorphing works now fixes field gens in OSHA Violator map names are sorted alphabetically binary chat may not be used in deathmatch arenas Chef and Clown final destination loadout names were renamed to avoid confusion with loadouts of the same name ## Why It's Good For The Game fixes #82791 fixes #82802 a feature of a deathmatch map working is good loadout confusion = bad also i guess sorting the list looks cool ## Changelog :cl: fix: deathmatch OSHA Violator map has actually functioning field gens now fix: being polymorphed in deathmatch does not count you dead fix: deathmatch cyborgs may not talk in binary qol: deathmatch map names are sorted alphabetically spellcheck: deathmatch final destination clown and chef loadouts have been renamed to avoid confusion /:cl: --- _maps/deathmatch/OSHA_Violator.dmm | 43 ++++++++++++++----- code/__DEFINES/_flags.dm | 2 + .../modules/deathmatch/deathmatch_loadouts.dm | 4 +- code/modules/deathmatch/deathmatch_lobby.dm | 34 +++++++++++---- code/modules/deathmatch/deathmatch_mapping.dm | 4 +- .../mob/living/carbon/human/human_say.dm | 3 ++ .../modules/mob/living/silicon/silicon_say.dm | 3 ++ .../power/singularity/field_generator.dm | 25 ++++++++++- 8 files changed, 94 insertions(+), 24 deletions(-) diff --git a/_maps/deathmatch/OSHA_Violator.dmm b/_maps/deathmatch/OSHA_Violator.dmm index fd001387447..7d30951a4f0 100644 --- a/_maps/deathmatch/OSHA_Violator.dmm +++ b/_maps/deathmatch/OSHA_Violator.dmm @@ -20,11 +20,18 @@ /obj/structure/closet/secure_closet/engineering_welding, /turf/open/indestructible, /area/deathmatch) +"cl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) "cA" = ( /turf/open/indestructible, /area/deathmatch) "cR" = ( -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/effect/turf_decal/bot, /obj/structure/cable, /turf/open/indestructible, @@ -36,7 +43,7 @@ "dt" = ( /obj/machinery/light/no_nightlight/directional/north, /obj/effect/turf_decal/stripes/line, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -578,7 +585,7 @@ /area/deathmatch) "Bv" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -682,6 +689,13 @@ /obj/machinery/light/no_nightlight/directional/west, /turf/open/indestructible, /area/deathmatch) +"Gw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) "Gx" = ( /obj/machinery/conveyor/auto, /obj/structure/cable, @@ -846,7 +860,7 @@ /turf/open/indestructible, /area/deathmatch) "Pg" = ( -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator, /obj/machinery/light/no_nightlight/directional/north, /turf/open/indestructible, /area/deathmatch) @@ -977,7 +991,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -1039,8 +1053,11 @@ /turf/open/indestructible, /area/deathmatch) "YA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, /obj/structure/cable, -/turf/closed/indestructible/fakeglass, +/turf/open/indestructible, /area/deathmatch) "YJ" = ( /obj/structure/cable, @@ -1059,7 +1076,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -1070,6 +1087,12 @@ }, /turf/open/indestructible, /area/deathmatch) +"Zq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) "Zr" = ( /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle, /turf/open/space/basic, @@ -1336,7 +1359,7 @@ je (11,1,1) = {" je ai -YA +cl ai gN cA @@ -1911,7 +1934,7 @@ je (34,1,1) = {" je ai -bl +Zq ai ai Bf @@ -1929,7 +1952,7 @@ Bf Bf ai ai -bl +Gw ai je "} diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index a9b42840fdb..72d28ca6bca 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -132,6 +132,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define QUIET_LOGS (1<<15) /// This area does not allow virtual entities to enter. #define VIRTUAL_SAFE_AREA (1<<16) +/// This area does not allow the Binary channel +#define BINARY_JAMMING (1<<17) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index a24663b3ba4..911e5bf6e1b 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -673,7 +673,7 @@ /datum/outfit/deathmatch_loadout/battler/clown/upgraded name = "Deathmatch: Clown (Syndicate Gear)" - display_name = "Clown" + display_name = "Clown Commando" desc = "They were bound to show up sooner or later." shoes = /obj/item/clothing/shoes/clown_shoes/combat @@ -727,7 +727,7 @@ /datum/outfit/deathmatch_loadout/chef/upgraded name = "Deathmatch: Master Chef" - display_name = "Chef" + display_name = "Master Chef" desc = "Let him cook." belt = /obj/item/gun/magic/hook diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm index 028653a2f21..ffc41c88716 100644 --- a/code/modules/deathmatch/deathmatch_lobby.dm +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -21,6 +21,8 @@ var/list/modifiers = list() /// Is the modifiers modal menu open (for the host) var/mod_menu_open = FALSE + /// artificial time padding when we start loading to give lighting a breather (admin starts will set this to 0) + var/start_time = 8 SECONDS /datum/deathmatch_lobby/New(mob/player) . = ..() @@ -79,7 +81,7 @@ UnregisterSignal(source, COMSIG_LAZY_TEMPLATE_LOADED) map.template_in_use = FALSE - addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), 8 SECONDS) + addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), start_time) /datum/deathmatch_lobby/proc/start_game_after_delay() if (!length(player_spawns) || length(player_spawns) < length(players)) @@ -152,7 +154,14 @@ GLOB.deathmatch_game.modifiers[modifier].apply(new_player, src) // register death handling. - RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING), PROC_REF(player_died)) + register_player_signals(new_player) + +/datum/deathmatch_lobby/proc/register_player_signals(new_player) + RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING, COMSIG_MOB_GHOSTIZED), PROC_REF(player_died)) + RegisterSignal(new_player, COMSIG_LIVING_ON_WABBAJACKED, PROC_REF(player_wabbajacked)) + +/datum/deathmatch_lobby/proc/unregister_player_signals(new_player) + UnregisterSignal(new_player, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING, COMSIG_MOB_GHOSTIZED, COMSIG_LIVING_ON_WABBAJACKED)) /datum/deathmatch_lobby/proc/game_took_too_long() if (!location || QDELING(src)) @@ -173,9 +182,9 @@ for(var/ckey in players) var/mob/loser = players[ckey]["mob"] - UnregisterSignal(loser, list(COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING)) + unregister_player_signals(loser) players[ckey]["mob"] = null - loser.ghostize() + loser.ghostize(can_reenter_corpse = FALSE) qdel(loser) for(var/datum/deathmatch_modifier/modifier in modifiers) @@ -185,12 +194,18 @@ GLOB.deathmatch_game.remove_lobby(host) log_game("Deathmatch game [host] ended.") +/datum/deathmatch_lobby/proc/player_wabbajacked(mob/living/player, mob/living/new_mob) + SIGNAL_HANDLER + unregister_player_signals(player) + players[player.ckey]["mob"] = new_mob + register_player_signals(new_mob) + /datum/deathmatch_lobby/proc/player_died(mob/living/player, gibbed) SIGNAL_HANDLER - if(isnull(player) || QDELING(src)) + if(isnull(player) || QDELING(src) || HAS_TRAIT_FROM(player, TRAIT_NO_TRANSFORM, MAGIC_TRAIT)) //this trait check fixes polymorphing return - var/ckey = player.ckey + var/ckey = player.ckey ? player.ckey : player.mind?.key if(!islist(players[ckey])) // potentially the player info could hold a reference to this mob so we can figure the ckey out without worrying about ghosting and suicides n such for(var/potential_ckey in players) var/list/player_info = players[potential_ckey] @@ -209,8 +224,9 @@ announce(span_reallybig("[player.real_name] HAS DIED.
[players.len] REMAIN.")) - if(!gibbed && !QDELING(player)) + if(!gibbed && !QDELING(player) && !isdead(player)) if(!HAS_TRAIT(src, TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS)) + unregister_player_signals(player) player.dust(TRUE, TRUE, TRUE) if (players.len <= 1) end_game() @@ -338,6 +354,7 @@ .["maps"] = list() for (var/map_key in GLOB.deathmatch_game.maps) .["maps"] += map_key + .["maps"] = sort_list(.["maps"]) /datum/deathmatch_lobby/ui_data(mob/user) @@ -499,12 +516,13 @@ if ("admin") // Admin functions if (!check_rights(R_ADMIN)) - message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!") + message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby without being an admin!") log_admin("[key_name(usr)] tried to use the deathmatch lobby admin functions without authorization.") return switch (params["func"]) if ("Force start") log_admin("[key_name(usr)] force started deathmatch lobby [host].") + start_time = 0 start_game() return FALSE diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 320b87d2fd1..9f006e15242 100644 --- a/code/modules/deathmatch/deathmatch_mapping.dm +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -2,7 +2,7 @@ name = "Deathmatch Arena" requires_power = FALSE has_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | QUIET_LOGS + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | QUIET_LOGS | NO_DEATH_MESSAGE | BINARY_JAMMING /area/deathmatch/fullbright static_lighting = FALSE @@ -12,7 +12,7 @@ name = "Deathmatch Player Spawner" /area/deathmatch/teleport //Prevent access to cross-z teleportation in the map itself (no wands of safety/teleportation scrolls). Cordons should prevent same-z teleportations outside of the arena. - area_flags = UNIQUE_AREA | EVENT_PROTECTED | QUIET_LOGS + area_flags = /area/deathmatch::area_flags & ~NOTELEPORT // for the illusion of a moving train /turf/open/chasm/true/no_smooth/fake_motion_sand diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 8bf21e3c809..0ce34ffa272 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -70,6 +70,9 @@ var/obj/item/radio/headset/dongle = ears if(!istype(dongle)) return FALSE + var/area/our_area = get_area(src) + if(our_area.area_flags & BINARY_JAMMING) + return FALSE return dongle.translate_binary /mob/living/carbon/human/radio(message, list/message_mods = list(), list/spans, language) //Poly has a copy of this, lazy bastard diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index 1468b9c7365..9310211aa0e 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -70,6 +70,9 @@ ) /mob/living/silicon/binarycheck() + var/area/our_area = get_area(src) + if(our_area.area_flags & BINARY_JAMMING) + return FALSE return TRUE /mob/living/silicon/radio(message, list/message_mods = list(), list/spans, language) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index b46b29538c6..da3a4e12c56 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -51,6 +51,8 @@ no power level overlay is currently in the overlays list. var/list/obj/machinery/field/generator/connected_gens = list() ///Check for asynk cleanups for this and the connected gens var/clean_up = FALSE + /// we warm up and cool down instantly + var/instantenous = FALSE /datum/armor/field_generator melee = 25 @@ -207,8 +209,11 @@ no power level overlay is currently in the overlays list. can_atmos_pass = ATMOS_PASS_YES air_update_turf(TRUE, FALSE) INVOKE_ASYNC(src, PROC_REF(cleanup)) - addtimer(CALLBACK(src, PROC_REF(cool_down)), 5 SECONDS) RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_CONTAINMENT_FIELD))) + if(instantenous) + warming_up = 0 + return + addtimer(CALLBACK(src, PROC_REF(cool_down)), 5 SECONDS) /obj/machinery/field/generator/proc/cool_down() if(active || warming_up <= 0) @@ -219,9 +224,14 @@ no power level overlay is currently in the overlays list. addtimer(CALLBACK(src, PROC_REF(cool_down)), 5 SECONDS) /obj/machinery/field/generator/proc/turn_on() + AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_CONTAINMENT_FIELD))) + if(instantenous) + active = FG_ONLINE + warming_up = 3 + start_fields() + return active = FG_CHARGING addtimer(CALLBACK(src, PROC_REF(warm_up)), 5 SECONDS) - AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_CONTAINMENT_FIELD))) /obj/machinery/field/generator/proc/warm_up() if(!active) @@ -420,9 +430,20 @@ no power level overlay is currently in the overlays list. state = FG_WELDED /obj/machinery/field/generator/starts_on/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/field/generator/starts_on/post_machine_initialize() . = ..() turn_on() +/obj/machinery/field/generator/starts_on/magic + power_level = 6 //forces the highest level overlay + instantenous = TRUE + +/obj/machinery/field/generator/starts_on/magic/process() + return PROCESS_KILL // this is the only place calc_power is called, and doing it here avoids one unnecessary proc call + #undef FG_UNSECURED #undef FG_SECURED #undef FG_WELDED