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
🆑
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
/🆑
This commit is contained in:
jimmyl
2024-07-03 22:48:43 +02:00
committed by GitHub
parent 9068f0f832
commit 539bc1bf8d
8 changed files with 94 additions and 24 deletions
+33 -10
View File
@@ -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
"}
+2
View File
@@ -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
@@ -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
+26 -8
View File
@@ -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.<br>[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
@@ -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
@@ -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
@@ -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)
@@ -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