[MIRROR] deathmatch (#26556)

* deathmatch (#81444)

## About The Pull Request

![image](https://github.com/tgstation/tgstation/assets/70376633/44f1d1af-2cd6-4e69-a13e-6d2a663d668d)

adds a deathmatch minigame, a port and slightly redone version of the
aetherstation deathmatch (by TheChosenEvilOne)
the goal is to kill everyone else with loadouts

## Why It's Good For The Game

CTF sucks and this is probably better to filter out the bloodthirsty
terry players anyway

## Changelog
🆑
add: deathmatch minigame
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>

* deathmatch

---------

Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
This commit is contained in:
SkyratBot
2024-02-19 01:29:27 +01:00
committed by GitHub
parent d67dcf48ec
commit 67e6d25e8d
33 changed files with 22927 additions and 3 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+567
View File
@@ -0,0 +1,567 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"e" = (
/obj/structure/barricade/security/ctf,
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
"l" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
"n" = (
/turf/open/floor/pod/light,
/area/deathmatch)
"o" = (
/obj/machinery/recharger,
/turf/open/floor/pod/light,
/area/deathmatch)
"t" = (
/obj/structure/barricade/security/ctf,
/turf/open/floor/pod/light,
/area/deathmatch)
"u" = (
/turf/open/floor/pod,
/area/deathmatch)
"G" = (
/obj/structure/barricade/security/ctf,
/turf/open/floor/pod/dark,
/area/deathmatch)
"H" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/pod,
/area/deathmatch)
"I" = (
/turf/closed/indestructible/reinforced,
/area/deathmatch)
"M" = (
/obj/machinery/light,
/turf/open/floor/pod,
/area/deathmatch)
"N" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/pod,
/area/deathmatch)
"O" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
"R" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/pod,
/area/deathmatch)
"S" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
"T" = (
/obj/machinery/light,
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
"W" = (
/turf/open/floor/pod/dark,
/area/deathmatch)
"X" = (
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
"Y" = (
/obj/effect/landmark/deathmatch_player_spawn,
/turf/open/floor/mineral/plastitanium/red,
/area/deathmatch)
(1,1,1) = {"
a
a
a
a
a
a
a
I
I
I
I
I
I
I
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
a
I
I
I
X
X
O
X
X
I
I
I
a
a
a
a
a
"}
(3,1,1) = {"
a
a
a
a
I
I
X
X
X
X
Y
X
X
X
X
I
I
a
a
a
a
"}
(4,1,1) = {"
a
a
a
I
I
X
X
X
X
n
o
n
X
X
X
X
I
I
a
a
a
"}
(5,1,1) = {"
a
a
I
I
e
X
X
n
n
t
t
t
n
n
X
X
e
I
I
a
a
"}
(6,1,1) = {"
a
I
I
X
X
e
n
n
t
n
W
n
t
n
n
e
X
X
I
I
a
"}
(7,1,1) = {"
a
I
X
X
X
n
o
n
W
W
W
W
W
n
o
n
X
X
X
I
a
"}
(8,1,1) = {"
I
I
X
X
n
n
n
W
W
G
G
G
W
W
n
n
n
X
X
I
I
"}
(9,1,1) = {"
I
X
X
X
n
t
W
W
W
u
u
u
W
W
W
t
n
X
X
X
I
"}
(10,1,1) = {"
I
X
X
n
t
n
W
G
u
u
N
u
u
G
W
n
t
n
X
X
I
"}
(11,1,1) = {"
I
l
Y
o
t
W
W
G
u
M
I
R
u
G
W
W
t
o
Y
T
I
"}
(12,1,1) = {"
I
X
X
n
t
n
W
G
u
u
H
u
u
G
W
n
t
n
X
X
I
"}
(13,1,1) = {"
I
X
X
X
n
t
W
W
W
u
u
u
W
W
W
t
n
X
X
X
I
"}
(14,1,1) = {"
I
I
X
X
n
n
n
W
W
G
G
G
W
W
n
n
n
X
X
I
I
"}
(15,1,1) = {"
a
I
X
X
X
n
o
n
W
W
W
W
W
n
o
n
X
X
X
I
a
"}
(16,1,1) = {"
a
I
I
X
X
e
n
n
t
n
W
n
t
n
n
e
X
X
I
I
a
"}
(17,1,1) = {"
a
a
I
I
e
X
X
n
n
t
t
t
n
n
X
X
e
I
I
a
a
"}
(18,1,1) = {"
a
a
a
I
I
X
X
X
X
n
o
n
X
X
X
X
I
I
a
a
a
"}
(19,1,1) = {"
a
a
a
a
I
I
X
X
X
X
Y
X
X
X
X
I
I
a
a
a
a
"}
(20,1,1) = {"
a
a
a
a
a
I
I
I
X
X
S
X
X
I
I
I
a
a
a
a
a
"}
(21,1,1) = {"
a
a
a
a
a
a
a
I
I
I
I
I
I
I
a
a
a
a
a
a
a
"}
+802
View File
@@ -0,0 +1,802 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/reinforced,
/area/deathmatch)
"b" = (
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"c" = (
/turf/open/floor/fake_snow,
/area/deathmatch)
"e" = (
/obj/structure/statue/snow/snowman,
/obj/item/toy/balloon/syndicate{
pixel_y = 11;
pixel_x = 5
},
/turf/open/floor/fake_snow,
/area/deathmatch)
"f" = (
/obj/structure/table/reinforced/plastitaniumglass,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"g" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/carpet/neon,
/area/deathmatch)
"i" = (
/obj/structure/table/reinforced/plastitaniumglass,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"k" = (
/obj/structure/rack,
/obj/item/ammo_box/magazine/sniper_rounds/penetrator,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"n" = (
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"o" = (
/obj/item/stack/medical/suture,
/turf/open/floor/fake_snow,
/area/deathmatch)
"p" = (
/obj/structure/barricade/wooden,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"q" = (
/obj/item/crowbar,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"r" = (
/obj/machinery/light{
dir = 8
},
/obj/structure/barricade/wooden,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"t" = (
/obj/structure/barricade/wooden,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"u" = (
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"v" = (
/obj/structure/rack,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"x" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"y" = (
/obj/effect/decal/cleanable/blood/old,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"z" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/carpet/neon,
/area/deathmatch)
"A" = (
/obj/machinery/light{
dir = 1
},
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"B" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/fakeice/slippery,
/area/deathmatch)
"C" = (
/obj/machinery/light{
dir = 4
},
/turf/open/chasm,
/area/deathmatch)
"D" = (
/turf/open/floor/fakeice/slippery,
/area/deathmatch)
"F" = (
/obj/structure/closet/crate/secure/science,
/obj/item/toy/plush/lizard_plushie/green,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"H" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"J" = (
/obj/effect/decal/cleanable/blood/old,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"K" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/fake_snow,
/area/deathmatch)
"L" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/fakeice/slippery,
/area/deathmatch)
"M" = (
/obj/machinery/door/airlock/freezer,
/obj/structure/barricade/wooden/crude,
/turf/open/floor/iron/freezer,
/area/deathmatch)
"N" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"O" = (
/obj/machinery/door/airlock/freezer,
/turf/open/floor/iron/freezer,
/area/deathmatch)
"P" = (
/obj/structure/table/reinforced/plastitaniumglass,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"Q" = (
/obj/structure/rack,
/obj/item/reagent_containers/hypospray/medipen/stimulants,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"R" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"U" = (
/obj/structure/barricade/wooden,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"V" = (
/obj/structure/rack,
/obj/item/ammo_box/magazine/sniper_rounds/penetrator,
/turf/open/floor/carpet/neon,
/area/deathmatch)
"W" = (
/obj/structure/toilet{
dir = 8
},
/obj/machinery/light{
dir = 4
},
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/freezer,
/area/deathmatch)
"Y" = (
/turf/open/floor/carpet/neon,
/area/deathmatch)
"Z" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/turf/open/floor/carpet/neon,
/area/deathmatch)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
F
r
Y
p
Y
Y
Y
z
H
Y
Y
p
Y
H
Y
z
Y
Y
i
Y
H
Y
Y
Y
Y
z
Y
Y
Y
a
"}
(3,1,1) = {"
a
p
H
Y
i
Y
H
Y
i
Y
Y
Y
p
Y
Y
Y
i
Y
Y
p
Y
Y
i
Y
Y
H
Y
Y
J
n
a
"}
(4,1,1) = {"
a
Y
Y
H
p
Y
Y
Y
i
Y
Y
Y
i
Y
H
Y
i
H
Y
p
Y
Y
i
H
Y
Y
i
Y
P
P
a
"}
(5,1,1) = {"
a
i
i
Y
a
Y
H
Y
p
Y
H
Y
i
Y
Y
Y
p
Y
Y
a
Y
Y
a
n
J
n
p
n
Y
H
a
"}
(6,1,1) = {"
a
Y
Y
Y
a
n
R
J
a
n
n
n
N
n
n
n
p
b
b
y
b
x
a
b
b
x
p
Y
H
Y
a
"}
(7,1,1) = {"
a
a
p
i
a
P
P
U
a
a
P
P
p
p
P
P
a
a
P
P
P
U
a
f
f
t
a
a
p
a
a
"}
(8,1,1) = {"
a
n
J
n
U
c
c
c
c
e
c
c
c
c
c
c
L
D
D
c
c
c
c
c
D
D
P
J
Y
H
a
"}
(9,1,1) = {"
a
A
n
n
P
c
c
D
D
c
o
D
D
D
c
D
D
D
D
D
D
c
D
D
D
D
P
n
Y
v
a
"}
(10,1,1) = {"
a
k
n
n
P
D
D
D
D
D
D
D
D
D
D
D
D
c
D
D
D
D
D
D
D
c
a
A
H
V
a
"}
(11,1,1) = {"
a
Q
n
J
U
D
D
c
K
D
D
c
c
D
D
c
c
c
c
c
D
D
B
c
c
c
p
Y
Y
Y
a
"}
(12,1,1) = {"
a
p
p
a
U
U
P
P
a
U
P
P
p
P
P
P
a
U
P
P
P
P
a
p
i
i
a
a
p
a
a
"}
(13,1,1) = {"
a
Y
Y
Y
n
n
R
n
p
n
n
n
R
n
n
n
p
x
n
n
n
n
a
Z
u
u
p
Y
Y
H
a
"}
(14,1,1) = {"
a
Y
Y
H
Y
Y
Y
Y
a
Y
Y
Y
Y
Y
Y
H
a
Y
Y
H
Y
Y
i
Y
Y
H
p
p
i
Y
a
"}
(15,1,1) = {"
a
q
Y
Y
a
Y
Y
Y
i
Y
Y
H
a
Y
Y
Y
Y
Y
Y
Y
Y
Y
p
Y
Y
Y
i
Y
H
Y
a
"}
(16,1,1) = {"
a
M
a
O
a
Y
Y
H
i
Y
Y
Y
i
Y
Y
Y
g
Y
Y
i
Y
Y
H
Y
Y
Y
g
Y
i
i
a
"}
(17,1,1) = {"
a
C
a
W
p
Y
Y
Y
g
Y
Y
Y
i
Y
H
Y
a
Y
Y
i
Y
Y
Y
Y
H
Y
a
Y
Y
Y
a
"}
(18,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+808
View File
@@ -0,0 +1,808 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/wall/mineral/titanium,
/area/deathmatch/fullbright)
"c" = (
/turf/open/floor/light/colour_cycle/dancefloor_b,
/area/deathmatch/fullbright)
"e" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/circuit/green,
/area/deathmatch/fullbright)
"q" = (
/obj/machinery/door/airlock/titanium/glass,
/turf/open/floor/mineral/abductor,
/area/deathmatch/fullbright)
"u" = (
/turf/template_noop,
/area/template_noop)
"v" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/circuit/green,
/area/deathmatch/fullbright)
"y" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/circuit/green,
/area/deathmatch/fullbright)
"A" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/vault/alien,
/area/deathmatch/fullbright)
"B" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/vault/alien,
/area/deathmatch/fullbright)
"C" = (
/turf/open/floor/circuit/green,
/area/deathmatch/fullbright)
"D" = (
/turf/closed/indestructible/alien,
/area/deathmatch/fullbright)
"E" = (
/obj/machinery/light{
dir = 1
},
/turf/open/floor/vault/alien,
/area/deathmatch/fullbright)
"F" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/machinery/light/floor,
/turf/open/floor/vault/alien,
/area/deathmatch/fullbright)
"H" = (
/turf/open/floor/vault/alien,
/area/deathmatch/fullbright)
"I" = (
/obj/machinery/light,
/turf/open/floor/vault/alien,
/area/deathmatch/fullbright)
"L" = (
/obj/machinery/light,
/turf/open/floor/circuit/green,
/area/deathmatch/fullbright)
"N" = (
/obj/machinery/door/airlock/titanium/glass,
/turf/open/floor/plating/abductor2,
/area/deathmatch/fullbright)
"Y" = (
/turf/open/floor/light/colour_cycle/dancefloor_a,
/area/deathmatch/fullbright)
(1,1,1) = {"
u
u
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
u
u
"}
(2,1,1) = {"
u
D
D
H
H
H
H
H
H
H
N
Y
Y
Y
Y
N
H
H
H
H
H
H
H
D
D
u
"}
(3,1,1) = {"
D
D
H
H
H
H
H
H
H
H
N
Y
Y
Y
Y
N
H
H
H
H
H
H
H
H
D
D
"}
(4,1,1) = {"
D
H
H
F
H
a
a
H
H
I
a
Y
Y
Y
Y
a
E
H
H
a
a
H
F
H
H
D
"}
(5,1,1) = {"
D
H
H
H
H
H
B
H
H
H
H
a
Y
Y
a
H
H
H
H
B
H
H
H
H
H
D
"}
(6,1,1) = {"
D
H
H
a
H
H
H
H
H
H
H
H
a
a
H
H
H
H
H
H
H
H
a
H
H
D
"}
(7,1,1) = {"
D
H
H
a
E
H
H
H
a
H
H
H
H
H
H
H
H
a
H
H
H
I
a
H
H
D
"}
(8,1,1) = {"
D
H
H
H
H
H
H
a
E
H
H
v
C
C
v
H
H
I
a
H
H
H
H
H
H
D
"}
(9,1,1) = {"
D
H
H
H
H
H
a
B
F
C
C
a
q
q
a
C
H
F
B
a
H
H
H
H
H
D
"}
(10,1,1) = {"
D
H
H
A
H
H
H
H
H
C
a
c
c
c
c
a
C
C
H
H
H
H
A
H
H
D
"}
(11,1,1) = {"
D
N
N
a
H
H
H
H
C
a
c
c
c
c
c
c
a
C
H
H
H
H
a
N
N
D
"}
(12,1,1) = {"
D
Y
Y
Y
a
H
H
L
a
c
c
c
c
c
c
c
c
a
y
H
H
a
Y
Y
Y
D
"}
(13,1,1) = {"
D
Y
Y
Y
Y
a
H
C
q
c
c
c
c
c
c
c
c
q
C
H
a
Y
Y
Y
Y
D
"}
(14,1,1) = {"
D
Y
Y
Y
Y
a
H
C
q
c
c
c
c
c
c
c
c
q
C
H
a
Y
Y
Y
Y
D
"}
(15,1,1) = {"
D
Y
Y
Y
a
H
H
L
a
c
c
c
c
c
c
c
c
a
y
H
H
a
Y
Y
Y
D
"}
(16,1,1) = {"
D
N
N
a
H
H
H
H
C
a
c
c
c
c
c
c
a
C
H
H
H
H
a
N
N
D
"}
(17,1,1) = {"
D
H
H
B
H
H
H
H
H
C
a
c
c
c
c
a
C
H
H
H
H
H
B
H
H
D
"}
(18,1,1) = {"
D
H
H
H
H
H
a
A
F
C
C
a
q
q
a
C
C
F
A
a
H
H
H
H
H
D
"}
(19,1,1) = {"
D
H
H
H
H
H
H
a
E
H
H
e
C
C
e
H
H
I
a
H
H
H
H
H
H
D
"}
(20,1,1) = {"
D
H
H
a
E
H
H
H
a
H
H
H
H
H
H
H
H
a
H
H
H
I
a
H
H
D
"}
(21,1,1) = {"
D
H
H
a
H
H
H
H
H
H
H
H
a
a
H
H
H
H
H
H
H
H
a
H
H
D
"}
(22,1,1) = {"
D
H
H
H
H
H
A
H
H
H
H
a
Y
Y
a
H
H
H
H
A
H
H
H
H
H
D
"}
(23,1,1) = {"
D
H
H
F
H
a
a
H
H
I
a
Y
Y
Y
Y
a
E
H
H
a
a
H
F
H
H
D
"}
(24,1,1) = {"
D
D
H
H
H
H
H
H
H
H
N
Y
Y
Y
Y
N
H
H
H
H
H
H
H
H
D
D
"}
(25,1,1) = {"
u
D
D
H
H
H
H
H
H
H
N
Y
Y
Y
Y
N
H
H
H
H
H
H
H
D
D
u
"}
(26,1,1) = {"
u
u
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
u
u
"}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+575
View File
@@ -0,0 +1,575 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/item/melee/baseball_bat,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"b" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"c" = (
/obj/item/cardboard_cutout/adaptive{
starting_cutout = "Private Security Officer"
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/cardboard_cutout/adaptive{
starting_cutout = "Private Security Officer"
},
/turf/open/indestructible/plating,
/area/deathmatch)
"d" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/indestructible/plating,
/area/deathmatch)
"f" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"g" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/west,
/turf/open/indestructible/plating,
/area/deathmatch)
"i" = (
/obj/effect/spawner/random/trash/mess,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"k" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"l" = (
/obj/effect/decal/cleanable/blood,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"m" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/cardboard_cutout/adaptive{
starting_cutout = "Private Security Officer"
},
/turf/open/indestructible/plating,
/area/deathmatch)
"o" = (
/turf/closed/indestructible/grille,
/area/deathmatch)
"p" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/power/rtg/debug{
power_gen = 50000;
name = "dumb idiot shocker powerer";
desc = "Dont touch the grilles idiot"
},
/obj/structure/cable,
/turf/open/indestructible/plating,
/area/deathmatch)
"q" = (
/turf/closed/indestructible/fakedoor/engineering,
/area/deathmatch)
"t" = (
/obj/effect/spawner/random/trash/graffiti,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"u" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable,
/turf/open/indestructible/plating,
/area/deathmatch)
"w" = (
/obj/effect/decal/cleanable/blood/gibs/limb,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"x" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/effect/spawner/structure/electrified_grille,
/turf/open/indestructible/plating,
/area/deathmatch)
"z" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/north,
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/indestructible/plating,
/area/deathmatch)
"A" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/west,
/turf/open/indestructible/plating,
/area/deathmatch)
"B" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/cardboard_cutout/adaptive{
starting_cutout = "Private Security Officer"
},
/obj/structure/cable,
/turf/open/indestructible/plating,
/area/deathmatch)
"C" = (
/obj/effect/decal/cleanable/blood/tracks,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"D" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/clothing/mask/gas,
/turf/open/indestructible/plating,
/area/deathmatch)
"G" = (
/turf/closed/indestructible/reinforced,
/area/deathmatch)
"H" = (
/turf/closed/indestructible/fakedoor/maintenance,
/area/deathmatch)
"I" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/spear,
/turf/open/indestructible/plating,
/area/deathmatch)
"K" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/south,
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/indestructible/plating,
/area/deathmatch)
"L" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/west,
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/indestructible/plating,
/area/deathmatch)
"M" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/flashlight/flare{
start_on = 1;
icon_state = "flare-on"
},
/turf/open/indestructible/plating,
/area/deathmatch)
"N" = (
/obj/effect/decal/cleanable/blood/gibs/down,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"P" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/indestructible/plating,
/area/deathmatch)
"Q" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 10
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"R" = (
/obj/effect/spawner/structure/electrified_grille,
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/indestructible/plating,
/area/deathmatch)
"S" = (
/obj/effect/decal/cleanable/blood/gibs/torso,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"U" = (
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/indestructible/plating,
/area/deathmatch)
"V" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/cardboard_cutout/adaptive{
starting_cutout = "Private Security Officer"
},
/turf/open/indestructible/plating,
/area/deathmatch)
"X" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/storage/toolbox/mechanical/old,
/turf/open/indestructible/plating,
/area/deathmatch)
"Z" = (
/turf/cordon,
/area/deathmatch)
(1,1,1) = {"
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
"}
(2,1,1) = {"
Z
G
G
H
G
o
G
H
G
H
G
o
G
H
G
G
Z
"}
(3,1,1) = {"
Z
G
p
u
U
U
U
D
U
U
U
I
U
U
f
G
Z
"}
(4,1,1) = {"
Z
G
U
B
V
V
V
V
V
V
V
c
V
V
X
G
Z
"}
(5,1,1) = {"
Z
G
U
L
A
A
A
A
A
A
A
A
A
g
U
G
Z
"}
(6,1,1) = {"
Z
G
U
d
U
U
U
l
C
Q
t
U
U
x
U
G
Z
"}
(7,1,1) = {"
Z
G
X
d
U
M
U
U
b
k
U
U
U
x
U
q
Z
"}
(8,1,1) = {"
Z
G
U
d
U
U
t
U
U
k
U
M
U
R
U
G
Z
"}
(9,1,1) = {"
Z
G
U
d
U
U
U
i
a
U
N
U
U
R
U
o
Z
"}
(10,1,1) = {"
Z
G
D
d
U
b
U
a
U
a
U
b
t
R
D
o
Z
"}
(11,1,1) = {"
Z
G
U
d
t
U
S
U
a
U
U
U
U
R
U
o
Z
"}
(12,1,1) = {"
Z
G
I
d
U
U
U
M
U
U
U
U
U
R
U
G
Z
"}
(13,1,1) = {"
Z
G
U
d
U
U
U
U
b
t
U
U
i
R
I
q
Z
"}
(14,1,1) = {"
Z
G
U
d
U
U
w
U
U
U
U
U
M
R
U
G
Z
"}
(15,1,1) = {"
Z
G
U
z
P
P
P
P
P
P
P
P
P
K
U
G
Z
"}
(16,1,1) = {"
Z
G
U
m
m
m
m
m
m
m
m
m
m
m
U
G
Z
"}
(17,1,1) = {"
Z
G
f
U
U
X
U
U
U
U
I
U
U
U
f
G
Z
"}
(18,1,1) = {"
Z
G
G
H
G
o
G
H
G
H
G
o
G
H
G
G
Z
"}
(19,1,1) = {"
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
"}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,750 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/obj/machinery/light/directional/east,
/turf/open/floor/wood,
/area/deathmatch)
"b" = (
/obj/structure/chair/office{
dir = 4
},
/obj/effect/landmark/deathmatch_player_spawn,
/turf/open/floor/wood/large,
/area/deathmatch)
"c" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/effect/spawner/structure/window,
/turf/open/floor/wood/large,
/area/deathmatch)
"d" = (
/obj/item/ammo_box/magazine/m9mm/ap,
/turf/open/floor/wood,
/area/deathmatch)
"e" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/wood,
/area/deathmatch)
"f" = (
/obj/machinery/light/directional/west,
/obj/structure/barricade/sandbags,
/turf/open/floor/wood,
/area/deathmatch)
"g" = (
/turf/closed/indestructible/iron,
/area/deathmatch)
"h" = (
/obj/structure/barricade/wooden,
/obj/effect/turf_decal/siding/wood{
dir = 4
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"i" = (
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/wood,
/area/deathmatch)
"j" = (
/obj/effect/decal/cleanable/blood/old,
/obj/effect/turf_decal/siding/wood{
dir = 4
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"k" = (
/obj/structure/table/reinforced,
/obj/item/ammo_box/magazine/m9mm/fire,
/turf/open/floor/wood/large,
/area/deathmatch)
"l" = (
/obj/structure/table/reinforced,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/turf/open/floor/wood/large,
/area/deathmatch)
"m" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"n" = (
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/wood,
/area/deathmatch)
"o" = (
/obj/item/ammo_box/magazine/m9mm/ap,
/obj/structure/closet/crate/secure/weapon{
locked = 0
},
/obj/effect/turf_decal/siding/wood/corner{
dir = 4
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"p" = (
/obj/effect/turf_decal/siding/wood/corner{
dir = 1
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"q" = (
/obj/effect/turf_decal/siding/wood{
dir = 4
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"r" = (
/obj/item/flashlight/flare,
/turf/open/floor/wood,
/area/deathmatch)
"s" = (
/obj/machinery/light/directional/south,
/turf/open/floor/wood,
/area/deathmatch)
"t" = (
/obj/effect/decal/cleanable/blood/old,
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"u" = (
/obj/structure/barricade/sandbags,
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/wood,
/area/deathmatch)
"v" = (
/obj/item/reagent_containers/hypospray/medipen,
/turf/open/floor/wood,
/area/deathmatch)
"x" = (
/obj/item/ammo_box/magazine/m9mm/fire,
/turf/open/floor/wood,
/area/deathmatch)
"y" = (
/obj/item/ammo_box/magazine/m9mm/fire,
/obj/structure/closet/crate/secure/weapon{
locked = 0
},
/obj/effect/turf_decal/siding/wood/corner{
dir = 8
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"z" = (
/turf/open/floor/wood,
/area/deathmatch)
"A" = (
/obj/effect/landmark/deathmatch_player_spawn,
/obj/effect/turf_decal/siding/wood{
dir = 8
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"B" = (
/obj/machinery/light/directional/west,
/turf/open/floor/wood,
/area/deathmatch)
"C" = (
/obj/structure/table/reinforced,
/obj/item/flashlight/lamp,
/turf/open/floor/wood/large,
/area/deathmatch)
"D" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"E" = (
/obj/effect/turf_decal/siding/wood/corner,
/turf/open/floor/wood/tile,
/area/deathmatch)
"F" = (
/obj/structure/barricade/wooden,
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/tile,
/area/deathmatch)
"I" = (
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/tile,
/area/deathmatch)
"K" = (
/turf/closed/wall,
/area/deathmatch)
"M" = (
/obj/structure/barricade/sandbags,
/turf/open/floor/wood,
/area/deathmatch)
"O" = (
/obj/structure/barricade/wooden,
/turf/open/floor/wood,
/area/deathmatch)
"Q" = (
/obj/item/ammo_box/magazine/m9mm/hp,
/obj/structure/closet/crate/secure/weapon{
locked = 0
},
/obj/effect/turf_decal/siding/wood{
dir = 4
},
/turf/open/floor/wood/tile,
/area/deathmatch)
"T" = (
/obj/effect/landmark/deathmatch_player_spawn,
/turf/open/floor/wood,
/area/deathmatch)
"U" = (
/turf/open/floor/wood/large,
/area/deathmatch)
"W" = (
/obj/machinery/light/directional/north,
/turf/open/floor/wood,
/area/deathmatch)
"X" = (
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/large,
/area/deathmatch)
"Y" = (
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/wood,
/area/deathmatch)
(1,1,1) = {"
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
"}
(2,1,1) = {"
g
E
j
q
q
h
q
q
q
q
q
q
Q
q
q
q
j
q
q
q
o
g
"}
(3,1,1) = {"
g
I
z
z
T
K
z
z
M
z
z
z
z
z
z
i
z
z
z
z
m
g
"}
(4,1,1) = {"
g
I
z
z
z
K
M
M
M
z
z
z
z
z
O
K
z
z
K
O
m
g
"}
(5,1,1) = {"
g
I
z
a
z
K
z
z
z
z
z
z
e
z
O
z
z
z
z
K
m
g
"}
(6,1,1) = {"
g
F
O
K
z
n
z
z
z
a
z
e
z
z
K
W
e
z
z
z
t
g
"}
(7,1,1) = {"
g
I
z
f
e
z
r
K
K
K
O
O
K
z
K
z
z
T
z
z
m
g
"}
(8,1,1) = {"
g
I
z
M
M
M
z
c
U
U
U
U
X
z
O
z
z
z
z
K
m
g
"}
(9,1,1) = {"
g
I
e
z
v
z
z
K
U
l
b
U
X
z
O
K
K
K
K
O
m
g
"}
(10,1,1) = {"
g
I
z
z
z
z
z
K
U
C
k
U
K
z
z
z
z
M
z
z
m
g
"}
(11,1,1) = {"
g
I
z
z
z
z
z
c
U
U
U
U
O
e
v
z
z
M
x
z
m
g
"}
(12,1,1) = {"
g
I
z
M
M
z
z
K
O
O
K
K
K
z
z
z
z
M
M
z
t
g
"}
(13,1,1) = {"
g
I
z
e
M
z
z
B
z
z
z
u
d
z
z
r
z
z
z
z
m
g
"}
(14,1,1) = {"
g
I
z
z
M
z
z
z
z
M
z
M
z
z
s
K
K
O
O
K
m
g
"}
(15,1,1) = {"
g
I
K
O
O
K
O
z
z
M
z
z
z
z
z
K
T
z
z
K
m
g
"}
(16,1,1) = {"
g
I
z
z
z
z
O
z
K
K
z
K
O
z
z
O
z
z
s
K
m
g
"}
(17,1,1) = {"
g
I
e
z
T
s
K
z
K
z
z
z
O
z
z
O
e
z
z
K
m
g
"}
(18,1,1) = {"
g
I
z
z
z
z
K
Y
K
W
z
z
O
z
z
K
z
z
z
z
m
g
"}
(19,1,1) = {"
g
I
z
z
z
z
K
e
K
z
e
z
K
z
z
K
K
K
K
K
m
g
"}
(20,1,1) = {"
g
I
z
K
K
z
K
z
K
K
z
z
K
e
z
z
z
z
z
z
m
g
"}
(21,1,1) = {"
g
y
D
D
D
D
D
D
D
A
D
D
D
D
D
D
D
D
D
D
p
g
"}
(22,1,1) = {"
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
g
"}
File diff suppressed because it is too large Load Diff
+1
View File
@@ -61,6 +61,7 @@
#define COLOR_VERY_SOFT_YELLOW "#FAE48E"
#define COLOR_GOLD "#FFD700"
#define COLOR_ETHIOPIA_YELLOW "#FCDD09"
#define COLOR_LIGHT_YELLOW "#FFFEE0"
#define COLOR_OLIVE "#808000"
#define COLOR_ASSISTANT_OLIVE "#828163"
+2
View File
@@ -7,3 +7,5 @@ GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report
/// We want reality_smash_tracker to exist only once and be accessible from anywhere.
GLOBAL_DATUM_INIT(reality_smash_track, /datum/reality_smash_tracker, new)
GLOBAL_DATUM(deathmatch_game, /datum/deathmatch_controller) // Deathmatch Minigame controller
+31
View File
@@ -323,6 +323,37 @@
return ..()
return FALSE
/obj/item/clothing/gloves/the_sleeping_carp
name = "carp gloves"
desc = "This gloves are capable of making people use The Sleeping Carp."
icon_state = "black"
greyscale_colors = "#000000"
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
var/datum/martial_art/the_sleeping_carp/style
/obj/item/clothing/gloves/the_sleeping_carp/Initialize(mapload)
. = ..()
style = new()
style.allow_temp_override = FALSE
/obj/item/clothing/gloves/the_sleeping_carp/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/clothing/gloves/the_sleeping_carp/equipped(mob/user, slot)
. = ..()
if(slot & ITEM_SLOT_GLOVES)
style.teach(user, TRUE)
/obj/item/clothing/gloves/the_sleeping_carp/dropped(mob/user)
. = ..()
if(!isnull(style))
style.fully_remove(user)
#undef STRONG_PUNCH_COMBO
#undef LAUNCH_KICK_COMBO
#undef DROP_KICK_COMBO
+9
View File
@@ -37,6 +37,10 @@
ui.close()
basketball()
return TRUE
if("deathmatch")
ui.close()
deathmatch()
return TRUE
/datum/minigames_menu/proc/mafia()
var/datum/mafia_controller/game = GLOB.mafia_game //this needs to change if you want multiple mafia games up at once.
@@ -55,3 +59,8 @@
if(!game)
game = create_basketball_game()
game.ui_interact(usr)
/datum/minigames_menu/proc/deathmatch()
if(isnull(GLOB.deathmatch_game))
GLOB.deathmatch_game = new
GLOB.deathmatch_game.ui_interact(usr)
+31
View File
@@ -115,12 +115,28 @@
/turf/open/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE)
return
/turf/open/indestructible/large
icon_state = "floor_large"
/turf/open/indestructible/white
icon_state = "white"
/turf/open/indestructible/white/smooth_large
icon_state = "white_large"
/turf/open/indestructible/white/textured
icon_state = "textured_white"
/turf/open/indestructible/dark
icon_state = "darkfull"
/turf/open/indestructible/dark/textured
icon_state = "textured_dark"
/turf/open/indestructible/dark/smooth_large
icon_state = "dark_large"
/turf/open/indestructible/light
icon_state = "light_on-1"
@@ -232,6 +248,9 @@
/turf/open/indestructible/meat/airless
initial_gas_mix = AIRLESS_ATMOS
/turf/open/indestructible/vault
icon_state = "rockvault"
/turf/open/indestructible/plating
name = "plating"
icon_state = "plating"
@@ -243,6 +262,18 @@
/turf/open/indestructible/plating/airless
initial_gas_mix = AIRLESS_ATMOS
/turf/open/indestructible/kitchen
icon_state = /turf/open/floor/iron/kitchen::icon_state
/turf/open/indestructible/rockyground
icon_state = /turf/open/misc/ashplanet/rocky::icon_state
icon = /turf/open/misc/ashplanet/rocky::icon
name = /turf/open/misc/ashplanet/rocky::name
/turf/open/indestructible/stone
icon_state = /turf/open/floor/stone::icon_state
name = /turf/open/floor/stone::name
/turf/open/Initalize_Atmos(time)
excited = FALSE
update_visuals()
@@ -0,0 +1,135 @@
/datum/deathmatch_controller
/// Assoc list of all lobbies (ckey = lobby)
var/list/datum/deathmatch_lobby/lobbies = list()
/// All deathmatch map templates
var/list/datum/lazy_template/deathmatch/maps = list()
/// All loadouts
var/list/datum/outfit/loadouts
/// All currently present spawnpoints, to be processed by a loading map
var/list/spawnpoint_processing = list()
/datum/deathmatch_controller/New()
. = ..()
if (GLOB.deathmatch_game)
qdel(src)
CRASH("A deathmatch controller already exists.")
GLOB.deathmatch_game = src
for (var/datum/lazy_template/deathmatch/template as anything in subtypesof(/datum/lazy_template/deathmatch))
var/map_name = initial(template.name)
maps[map_name] = new template
loadouts = subtypesof(/datum/outfit/deathmatch_loadout)
/datum/deathmatch_controller/proc/create_new_lobby(mob/host)
lobbies[host.ckey] = new /datum/deathmatch_lobby(host)
deadchat_broadcast(" has opened a new deathmatch lobby. <a href=?src=[REF(lobbies[host.ckey])];join=1>(Join)</a>", "<B>[host]</B>")
/datum/deathmatch_controller/proc/remove_lobby(ckey)
var/lobby = lobbies[ckey]
lobbies[ckey] = null
lobbies.Remove(ckey)
qdel(lobby)
/datum/deathmatch_controller/proc/passoff_lobby(host, new_host)
lobbies[new_host] = lobbies[host]
lobbies[host] = null
lobbies.Remove(host)
/datum/deathmatch_controller/proc/load_lazyarena(map_key)
if(!isnull(map_key) && !isnull(maps[map_key]))
var/datum/lazy_template/deathmatch/temp = maps[map_key]
return temp.lazy_load() //returns rezervation
return FALSE
/datum/deathmatch_controller/ui_state(mob/user)
return GLOB.observer_state
/datum/deathmatch_controller/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, null)
if(!ui)
ui = new(user, src, "DeathmatchPanel")
ui.open()
/datum/deathmatch_controller/ui_data(mob/user)
. = ..()
.["lobbies"] = list()
.["hosting"] = FALSE
.["admin"] = check_rights_for(user.client, R_ADMIN)
for (var/ckey in lobbies)
var/datum/deathmatch_lobby/lobby = lobbies[ckey]
if (user.ckey == ckey)
.["hosting"] = TRUE
if (user.ckey in lobby.observers+lobby.players)
.["playing"] = ckey
.["lobbies"] += list(list(
name = ckey,
players = lobby.players.len,
max_players = initial(lobby.map.max_players),
map = initial(lobby.map.name),
playing = lobby.playing
))
/datum/deathmatch_controller/proc/find_lobby_by_user(ckey)
for(var/lobbykey in lobbies)
var/datum/deathmatch_lobby/lobby = lobbies[lobbykey]
if(ckey in lobby.players+lobby.observers)
return lobby
/datum/deathmatch_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(. || !isobserver(usr))
return
switch (action)
if ("host")
if (lobbies[usr.ckey])
return
if(!SSticker.HasRoundStarted())
tgui_alert(usr, "The round hasn't started yet!")
return
ui.close()
create_new_lobby(usr)
if ("join")
if (!lobbies[params["id"]])
return
var/datum/deathmatch_lobby/playing_lobby = find_lobby_by_user(usr.ckey)
var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]]
if (!isnull(playing_lobby) && playing_lobby != chosen_lobby)
playing_lobby.leave(usr.ckey)
if(isnull(playing_lobby))
log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as a player.")
chosen_lobby.join(usr)
chosen_lobby.ui_interact(usr)
if ("spectate")
var/datum/deathmatch_lobby/playing_lobby = find_lobby_by_user(usr.ckey)
if (!lobbies[params["id"]])
return
var/datum/deathmatch_lobby/chosen_lobby = lobbies[params["id"]]
// if the player is in this lobby
if(!isnull(playing_lobby) && playing_lobby != chosen_lobby)
playing_lobby.leave(usr.ckey)
else if(playing_lobby == chosen_lobby)
chosen_lobby.ui_interact(usr)
return
// they werent in the lobby, lets add them
if (!chosen_lobby.playing)
chosen_lobby.add_observer(usr)
chosen_lobby.ui_interact(usr)
else
chosen_lobby.spectate(usr)
log_game("[usr.ckey] joined deathmatch lobby [params["id"]] as an observer.")
if ("admin")
if (!check_rights(R_ADMIN))
message_admins("[usr.key] has attempted to use admin functions in the deathmatch panel!")
log_admin("[key_name(usr)] tried to use the deathmatch panel admin functions without authorization.")
return
var/lobby = params["id"]
switch (params["func"])
if ("Close")
remove_lobby(lobby)
log_admin("[key_name(usr)] removed deathmatch lobby [lobby].")
if ("View")
lobbies[lobby].ui_interact(usr)
@@ -0,0 +1,377 @@
/datum/outfit/deathmatch_loadout //remember that fun > balance
name = ""
shoes = /obj/item/clothing/shoes/sneakers/black // im not doing this on all of them
/// Name shown in the UI
var/display_name = ""
/// Description shown in the UI
var/desc = ":KILL:"
/// If defined, using this outfit sets the targets species to it
var/datum/species/species_override
/// This outfit will grant these spells if applied
var/list/granted_spells = list()
/datum/outfit/deathmatch_loadout/pre_equip(mob/living/carbon/human/user, visualsOnly = FALSE)
. = ..()
if(isdummy(user))
return
if(!isnull(species_override))
user.set_species(species_override)
for(var/datum/action/act as anything in granted_spells)
var/datum/action/new_ability = new act(user)
new_ability.Grant(user)
/datum/outfit/deathmatch_loadout/naked
name = "Deathmatch: Naked"
display_name = "Unarmed, Butt-naked"
desc = "Naked man craves for bloodshed."
shoes = null
/datum/outfit/deathmatch_loadout/assistant
name = "Deathmatch: Assistant loadout"
display_name = "Assistant"
desc = "A simple assistant loadout: greyshirt and a toolbox"
l_hand = /obj/item/storage/toolbox/mechanical
uniform = /obj/item/clothing/under/color/grey
back = /obj/item/storage/backpack
box = /obj/item/storage/box/survival
belt = /obj/item/flashlight
/datum/outfit/deathmatch_loadout/assistant/weaponless
name = "Deathmatch: Assistant loadout (Weaponless)"
display_name = "Assistant (Unarmed)"
desc = "What is an assistant without a toolbox? nothing"
l_hand = null
/datum/outfit/deathmatch_loadout/operative
name = "Deathmatch: Operative"
display_name = "Operative"
desc = "A syndicate operative."
uniform = /obj/item/clothing/under/syndicate
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
back = /obj/item/storage/backpack
id = /obj/item/card/id/advanced/chameleon
/datum/outfit/deathmatch_loadout/operative/ranged
name = "Deathmatch: Ranged Operative"
display_name = "Ranged Operative"
desc = "A syndicate operative with a gun and a knife."
l_hand = /obj/item/gun/ballistic/automatic/pistol
l_pocket = /obj/item/knife/combat
backpack_contents = list(/obj/item/ammo_box/magazine/m9mm = 5)
/datum/outfit/deathmatch_loadout/operative/melee
name = "Deathmatch: Melee Operative"
display_name = "Melee Operative"
desc = "A syndicate operative with multiple knives."
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
suit = /obj/item/clothing/suit/armor/vest
head = /obj/item/clothing/head/helmet
backpack_contents = list(/obj/item/knife/combat = 6)
l_hand = /obj/item/knife/combat
l_pocket = /obj/item/knife/combat
/datum/outfit/deathmatch_loadout/securing_sec
name = "Deathmatch: Security Officer"
display_name = "Security Officer"
desc = "A security officer."
uniform = /datum/outfit/job/security::uniform
suit = /datum/outfit/job/security::suit
suit_store = /datum/outfit/job/security::suit_store
belt = /datum/outfit/job/security::belt
ears = /datum/outfit/job/security::ears //cant communicate with station i think?
gloves = /datum/outfit/job/security::gloves
head = /datum/outfit/job/security::head
shoes = /datum/outfit/job/security::shoes
l_pocket = /obj/item/flashlight/seclite
l_hand = /obj/item/gun/energy/disabler
r_pocket = /obj/item/knife/combat/survival
back = /datum/outfit/job/security::backpack
box = /datum/outfit/job/security::box
implants = list(/obj/item/implant/mindshield)
/datum/outfit/deathmatch_loadout/assistant/instagib
name = "DM: Instagib"
display_name = "Instagib"
desc = "Assistant with an instakill rifle."
l_hand = /obj/item/gun/energy/laser/instakill
/datum/outfit/deathmatch_loadout/operative/sniper
name = "Deathmatch: Sniper"
display_name = "Sniper"
desc = "You know what do you need to do"
backpack_contents = list(
/obj/item/ammo_box/magazine/sniper_rounds = 3,
)
glasses = /obj/item/clothing/glasses/thermal
uniform = /obj/item/clothing/under/syndicate/sniper
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
l_pocket = /obj/item/knife/combat
l_hand = /obj/item/gun/ballistic/rifle/sniper_rifle
/datum/outfit/deathmatch_loadout/chef
name = "Deathmatch: Chef"
display_name = "Chef"
desc = "He love pizza."
uniform = /obj/item/clothing/under/costume/buttondown/slacks/service
suit = /obj/item/clothing/suit/toggle/chef
head = /obj/item/clothing/head/utility/chefhat
mask = /obj/item/clothing/mask/fakemoustache/italian
gloves = /obj/item/clothing/gloves/the_sleeping_carp
back = /obj/item/storage/backpack
backpack_contents = list(
/obj/item/sharpener,
)
/datum/outfit/deathmatch_loadout/samurai
name = "Deathmatch: Samurai"
display_name = "Samurai"
desc = "Bare-footed man craves to bloodshed."
l_hand = /obj/item/katana
uniform = /obj/item/clothing/under/costume/gi
/// battlers
/datum/outfit/deathmatch_loadout/battler
name = "Deathmatch: Battler Base"
display_name = "Battler"
desc = "What is a battler whith out weapone?."
shoes = /obj/item/clothing/shoes/combat
uniform = /obj/item/clothing/under/syndicate
gloves = /obj/item/clothing/gloves/combat
back = /obj/item/storage/backpack
id = /obj/item/card/id/advanced/chameleon
/datum/outfit/deathmatch_loadout/battler/soldier
name = "Deathmatch: Soldier"
display_name = "Soldier"
desc = "Ready for combat."
l_hand = /obj/item/gun/ballistic/rifle/boltaction
l_pocket = /obj/item/knife/combat
uniform = /obj/item/clothing/under/syndicate/rus_army
suit = /obj/item/clothing/suit/armor/vest
head = /obj/item/clothing/head/helmet/rus_helmet
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
backpack_contents = list(
/obj/item/grenade/smokebomb = 2,
/obj/item/ammo_box/strilka310 = 2,
)
/datum/outfit/deathmatch_loadout/battler/druid
name = "Deathmatch: Druid"
display_name = "Druid"
desc = "How can plants help you?"
species_override = /datum/species/pod
l_hand = /obj/item/gun/ballistic/bow
r_hand = /obj/item/ammo_casing/arrow
l_pocket = /obj/item/knife/shiv/carrot
r_pocket = /obj/item/flashlight/lantern
head = /obj/item/food/grown/ambrosia/gaia
uniform = /obj/item/clothing/under/shorts/green
mask = /obj/item/clothing/mask/gas/tiki_mask
glasses = /obj/item/clothing/glasses/thermal
gloves = /obj/item/clothing/gloves/botanic_leather
belt = /obj/item/gun/syringe/blowgun
back = /obj/item/storage/backpack/saddlepack
shoes = /obj/item/clothing/shoes/sandal
backpack_contents = list(
/obj/item/reagent_containers/syringe/crude/mushroom = 1,
/obj/item/reagent_containers/syringe/crude/blastoff = 1,
/obj/item/ammo_casing/arrow = 2,
/obj/item/food/grown/nettle/death = 2,
/obj/item/food/grown/banana = 2,
/obj/item/food/grown/cherry_bomb = 2,
/obj/item/food/grown/mushroom/walkingmushroom = 2,
/obj/item/seeds/kudzu = 1,
)
/datum/outfit/deathmatch_loadout/battler/northstar
name = "Deathmatch: North Star"
display_name = "North Star"
desc = "flip flip flip"
uniform = /obj/item/clothing/under/suit/carpskin
head = /obj/item/clothing/head/fedora/carpskin
gloves = /obj/item/clothing/gloves/rapid
backpack_contents = list(
/obj/item/throwing_star = 6,
/obj/item/restraints/legcuffs/bola/tactical = 2,
)
/datum/outfit/deathmatch_loadout/battler/janitor
name = "Deathmatch: Janitor"
display_name = "Janitor"
desc = "Regular work"
uniform = /obj/item/clothing/under/rank/civilian/janitor
suit = /obj/item/clothing/suit/caution
head = /obj/item/reagent_containers/cup/bucket
shoes = /obj/item/clothing/shoes/chameleon/noslip
l_hand = /obj/item/pushbroom
l_pocket = /obj/item/reagent_containers/spray/waterflower/lube
backpack_contents = list(
/obj/item/grenade/chem_grenade/cleaner = 2,
/obj/item/restraints/legcuffs/beartrap = 3,
/obj/item/soap,
)
/datum/outfit/deathmatch_loadout/battler/surgeon
name = "Deathmatch: Surgeon"
display_name = "Surgeon"
desc = "Treatment has come"
uniform = /obj/item/clothing/under/rank/medical/scrubs/blue
suit = /obj/item/clothing/suit/apron/surgical
head = /obj/item/clothing/head/utility/surgerycap
mask = /obj/item/clothing/mask/surgical
glasses = /obj/item/clothing/glasses/hud/health/night
l_pocket = /obj/item/reagent_containers/hypospray/combat
r_pocket = /obj/item/reagent_containers/hypospray/medipen/penthrite
l_hand = /obj/item/chainsaw
backpack_contents = list(
/obj/item/storage/medkit/tactical,
/obj/item/reagent_containers/hypospray/medipen/stimulants,
)
/datum/outfit/deathmatch_loadout/battler/raider
name = "Deathmatch: Raider"
display_name = "Raider"
desc = "Not from Shadow Legends"
l_hand = /obj/item/nullrod/claymore/chainsaw_sword
r_pocket = /obj/item/switchblade
uniform = /obj/item/clothing/under/costume/jabroni
back = /obj/item/spear
belt = /obj/item/gun/magic/hook
head = /obj/item/clothing/head/utility/welding
/datum/outfit/deathmatch_loadout/battler/clown
name = "DM: Clown"
display_name = "Clown (Man Of Honk)"
desc = "Who called this honking clown"
uniform = /datum/outfit/job/clown::uniform
belt = /datum/outfit/job/clown::belt
shoes = /datum/outfit/job/clown::shoes
mask = /datum/outfit/job/clown::mask
l_pocket = /datum/outfit/job/clown::l_pocket
back = /datum/outfit/job/clown::backpack
box = /datum/outfit/job/clown::box
implants = list(/obj/item/implant/sad_trombone)
l_pocket = /obj/item/melee/energy/sword/bananium
r_pocket = /obj/item/shield/energy/bananium
gloves = /obj/item/clothing/gloves/tackler/rocket
backpack_contents = list(
/obj/item/reagent_containers/spray/waterflower = 1,
/obj/item/instrument/bikehorn = 1,
/obj/item/bikehorn/airhorn = 1,
/obj/item/food/grown/banana = 3,
/obj/item/food/pie/cream = 2,
)
/datum/outfit/deathmatch_loadout/battler/tgcoder //tg doesnt stand for tgstation dont ask
name = "Deathmatch: Coder"
display_name = "Coder"
desc = "What"
l_hand = /obj/item/toy/katana
uniform = /obj/item/clothing/under/costume/schoolgirl
suit = /obj/item/clothing/suit/costume/joker
shoes = /obj/item/clothing/shoes/clown_shoes/meown_shoes
head = /obj/item/clothing/head/costume/kitty
backpack_contents = list(
/obj/item/reagent_containers/cup/soda_cans/pwr_game = 10,
)
/datum/outfit/deathmatch_loadout/battler/enginer
name = "Deathmatch: Engineer"
display_name = "Engineer"
desc = "Meet the engineer"
l_hand = /obj/item/storage/toolbox/emergency/turret
uniform = /obj/item/clothing/under/rank/engineering/engineer
shoes = /obj/item/clothing/shoes/magboots
head = /obj/item/clothing/head/utility/hardhat
back = /obj/item/fireaxe
gloves = /obj/item/clothing/gloves/color/yellow
/datum/outfit/deathmatch_loadout/battler/scientist
name = "Deathmatch: Scientist"
display_name = "Scientist"
desc = "What a nerd"
uniform = /obj/item/clothing/under/rank/rnd/scientist
suit = /obj/item/clothing/suit/armor/reactive/stealth
mask = /obj/item/clothing/mask/gas
l_hand = /obj/item/reagent_containers/syringe/plasma
l_pocket = /obj/item/slimecross/stabilized/sepia
r_pocket = /obj/item/slimecross/stabilized/purple
backpack_contents = list(
/obj/item/reagent_containers/cup/bottle/plasma,
/obj/item/slimecross/burning/grey,
/obj/item/slimecross/burning/adamantine,
/obj/item/slimecross/burning/gold,
/obj/item/slimecross/burning/blue,
/obj/item/slimecross/burning/sepia,
/obj/item/slimecross/chilling/green,
/obj/item/slimecross/chilling/grey,
/obj/item/slimecross/industrial/oil,
/obj/item/slimecross/charged/silver,
/obj/item/slimecross/charged/black,
/obj/item/slimecross/burning/rainbow,
/obj/item/slimecross/chilling/adamantine,
)
/datum/outfit/deathmatch_loadout/battler/bloodminer
name = "Deathmatch: Blood Miner"
display_name = "Blood Miner"
desc = "Rip and tear!!!"
l_hand = /obj/item/melee/cleaving_saw
r_hand = /obj/item/gun/energy/recharge/kinetic_accelerator
uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland
suit = /obj/item/clothing/suit/hooded/explorer
shoes = /obj/item/clothing/shoes/workboots/mining
mask = /obj/item/clothing/mask/gas/explorer
granted_spells = list(
/datum/action/cooldown/mob_cooldown/dash,
)
/datum/outfit/deathmatch_loadout/battler/ripper
name = "Deathmatch: Ripper"
display_name = "Ripper"
desc = "Die die die!!!"
l_hand = /obj/item/gun/ballistic/shotgun/hook
r_hand = /obj/item/gun/ballistic/shotgun/hook
uniform = /obj/item/clothing/under/costume/skeleton
suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch
mask = /obj/item/clothing/mask/gas/cyborg
shoes = /obj/item/clothing/shoes/sandal
belt = /obj/item/melee/cleric_mace
/datum/outfit/deathmatch_loadout/battler/cowboy
name = "Deathmatch: Cowboy"
display_name = "Cowboy"
desc = "Yeehaw partner"
r_hand = /obj/item/clothing/mask/cigarette/cigar
l_hand = /obj/item/melee/curator_whip
l_pocket = /obj/item/lighter
accessory = /obj/item/clothing/accessory/vest_sheriff
uniform = /obj/item/clothing/under/rank/security/detective
shoes = /obj/item/clothing/shoes/cowboy
belt = /obj/item/storage/belt/holster/detective/full
head = /obj/item/clothing/head/cowboy/brown
+433
View File
@@ -0,0 +1,433 @@
/datum/deathmatch_lobby
/// Ckey of the host
var/host
/// Assoc list of ckey to list()
var/list/players = list()
/// Assoc list of ckey to list()
var/list/observers = list()
/// The current chosen map
var/datum/lazy_template/deathmatch/map
/// Our turf reservation AKA where the arena is
var/datum/turf_reservation/location
/// Whether players hear deadchat and people through walls
var/global_chat = FALSE
/// Whether the lobby is currently playing
var/playing = FALSE
/// Number of total ready players
var/ready_count
/// List of loadouts, either gotten from the deathmatch controller or the map
var/list/loadouts
/datum/deathmatch_lobby/New(mob/player)
. = ..()
if (!player)
stack_trace("Attempted to create a deathmatch lobby without a host.")
return qdel(src)
host = player.ckey
map = GLOB.deathmatch_game.maps[pick(GLOB.deathmatch_game.maps)]
log_game("[host] created a deathmatch lobby.")
if (map.allowed_loadouts)
loadouts = map.allowed_loadouts
else
loadouts = GLOB.deathmatch_game.loadouts
add_player(player, loadouts[1], TRUE)
ui_interact(player)
/datum/deathmatch_lobby/Destroy(force, ...)
. = ..()
for (var/key in players+observers)
var/datum/tgui/ui = SStgui.get_open_ui(get_mob_by_ckey(key), src)
if (ui) ui.close()
remove_ckey_from_play(key)
if(playing && !isnull(location))
clear_reservation()
players = null
observers = null
map = null
location = null
loadouts = null
/datum/deathmatch_lobby/proc/start_game()
if (playing)
return
playing = TRUE
location = map.lazy_load()
if (!location)
to_chat(get_mob_by_ckey(host), span_warning("Couldn't reserve/load a map location (all locations used?), try again later, or contact a coder."))
playing = FALSE
return FALSE
if (!length(GLOB.deathmatch_game.spawnpoint_processing))
clear_reservation()
playing = FALSE
return FALSE
var/list/spawns = GLOB.deathmatch_game.spawnpoint_processing.Copy()
GLOB.deathmatch_game.spawnpoint_processing.Cut()
if (!length(spawns) || length(spawns) < length(players))
stack_trace("Failed to get spawns when loading deathmatch map [map.name] for lobby [host].")
clear_reservation()
playing = FALSE
return FALSE
for (var/key in players)
var/mob/dead/observer/observer = players[key]["mob"]
if (isnull(observer) || !observer.client)
log_game("Removed player [key] from deathmatch lobby [host], as they couldn't be found.")
remove_ckey_from_play(key)
continue
// pick spawn and remove it.
var/picked_spawn = pick_n_take(spawns)
spawn_observer_as_player(key, get_turf(picked_spawn))
qdel(picked_spawn)
// Remove rest of spawns.
for (var/unused_spawn in spawns)
qdel(unused_spawn)
for (var/observer_key in observers)
var/mob/observer = observers[observer_key]["mob"]
observer.forceMove(pick(location.reserved_turfs))
addtimer(CALLBACK(src, PROC_REF(game_took_too_long)), initial(map.automatic_gameend_time))
log_game("Deathmatch game [host] started.")
announce(span_reallybig("GO!"))
return TRUE
/datum/deathmatch_lobby/proc/spawn_observer_as_player(ckey, loc)
var/mob/dead/observer/observer = players[ckey]["mob"]
if (isnull(observer) || !observer.client)
remove_ckey_from_play(ckey)
return
// equip player
var/datum/outfit/deathmatch_loadout/loadout = players[ckey]["loadout"]
if (!(loadout in loadouts))
loadout = loadouts[1]
observer.forceMove(loc)
var/datum/mind/observer_mind = observer.mind
var/mob/living/observer_current = observer.mind?.current
var/mob/living/carbon/human/new_player = observer.change_mob_type(/mob/living/carbon/human, delete_old_mob = TRUE)
if(!isnull(observer_mind) && observer_current)
new_player.AddComponent( \
/datum/component/temporary_body, \
old_mind = observer_mind, \
old_body = observer_current, \
)
new_player.equipOutfit(loadout) // Loadout
players[ckey]["mob"] = new_player
// register death handling.
RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING), PROC_REF(player_died))
if (global_chat)
ADD_TRAIT(new_player, TRAIT_SIXTHSENSE, INNATE_TRAIT)
ADD_TRAIT(new_player, TRAIT_XRAY_HEARING, INNATE_TRAIT)
/datum/deathmatch_lobby/proc/game_took_too_long()
if (!location || QDELING(src))
return
announce(span_reallybig("The players have took too long! Game ending!"))
end_game()
/datum/deathmatch_lobby/proc/end_game()
if (!location)
CRASH("Reservation of deathmatch game [host] deleted during game.")
var/mob/winner
if(players.len)
var/list/winner_info = players[pick(players)]
if(!isnull(winner_info["mob"]))
winner = winner_info["mob"] //only one should remain anyway but incase of a draw
announce(span_reallybig("THE GAME HAS ENDED.<BR>THE WINNER IS: [winner ? winner.real_name : "no one"]."))
for(var/ckey in players)
var/mob/loser = players[ckey]["mob"]
UnregisterSignal(loser, list(COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING))
players[ckey]["mob"] = null
loser.ghostize()
qdel(loser)
clear_reservation()
GLOB.deathmatch_game.remove_lobby(host)
log_game("Deathmatch game [host] ended.")
/datum/deathmatch_lobby/proc/player_died(mob/living/player, gibbed)
SIGNAL_HANDLER
if(isnull(player) || QDELING(src))
return
var/ckey = player.ckey
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]
if(player_info["mob"] && player_info["mob"] == player)
ckey = potential_ckey
break
if(!islist(players[ckey])) // if we STILL didnt find a good ckey
return
players -= ckey
var/mob/dead/observer/ghost = !player.client ? player.get_ghost() : player.ghostize() //this doesnt work on those who used the ghost verb
if(!isnull(ghost))
add_observer(ghost, (host == ckey))
announce(span_reallybig("[player.real_name] HAS DIED.<br>[players.len] REMAIN."))
if(!gibbed && !QDELING(player)) // for some reason dusting or deleting in chasm storage messes up tgui bad
player.dust(TRUE, TRUE, TRUE)
if (players.len <= 1)
end_game()
/datum/deathmatch_lobby/proc/add_observer(mob/mob, host = FALSE)
if (players[mob.ckey])
CRASH("Tried to add [mob.ckey] as an observer while being a player.")
observers[mob.ckey] = list("mob" = mob, "host" = host)
/datum/deathmatch_lobby/proc/add_player(mob/mob, loadout, host = FALSE)
if (observers[mob.ckey])
CRASH("Tried to add [mob.ckey] as a player while being an observer.")
players[mob.ckey] = list("mob" = mob, "host" = host, "ready" = FALSE, "loadout" = loadout)
/datum/deathmatch_lobby/proc/remove_ckey_from_play(ckey)
var/is_likely_player = (ckey in players)
var/list/main_list = is_likely_player ? players : observers
var/list/info = main_list[ckey]
if(is_likely_player && islist(info))
ready_count -= info["ready"]
main_list -= ckey
/datum/deathmatch_lobby/proc/announce(message)
for (var/key in players+observers)
var/mob/player = get_mob_by_ckey(key)
if (!player.client)
remove_ckey_from_play(key)
continue
to_chat(player.client, message)
/datum/deathmatch_lobby/proc/leave(ckey)
if (host == ckey)
var/total_count = players.len + observers.len
if (total_count <= 1) // <= just in case.
GLOB.deathmatch_game.remove_lobby(host)
return
else
if (players[ckey] && players.len <= 1)
for (var/key in observers)
if (host == key)
continue
host = key
observers[key]["host"] = TRUE
break
else
for (var/key in players)
if (host == key)
continue
host = key
players[key]["host"] = TRUE
break
GLOB.deathmatch_game.passoff_lobby(ckey, host)
remove_ckey_from_play(ckey)
/datum/deathmatch_lobby/proc/join(mob/player)
if (playing || !player)
return
if(!(player.ckey in players+observers))
if (players.len >= map.max_players)
add_observer(player)
else
add_player(player, loadouts[1])
ui_interact(player)
/datum/deathmatch_lobby/proc/spectate(mob/player)
if (!playing || !location || !player)
return
if (!observers[player.ckey])
add_observer(player)
player.forceMove(pick(location.reserved_turfs))
/datum/deathmatch_lobby/proc/change_map(new_map)
if (!new_map || !GLOB.deathmatch_game.maps[new_map])
return
map = GLOB.deathmatch_game.maps[new_map]
var/max_players = map.max_players
for (var/possible_unlucky_loser in players)
max_players--
if (max_players <= 0)
var/loser_mob = players[possible_unlucky_loser]["mob"]
remove_ckey_from_play(possible_unlucky_loser)
add_observer(loser_mob)
loadouts = map.allowed_loadouts ? map.allowed_loadouts : GLOB.deathmatch_game.loadouts
for (var/player_key in players)
if (players[player_key]["loadout"] in loadouts)
continue
players[player_key]["loadout"] = loadouts[1]
/datum/deathmatch_lobby/proc/clear_reservation()
if(isnull(location) || isnull(map))
return
for(var/turf/victimized_turf as anything in location.reserved_turfs) //remove this once clearing turf reservations is actually reliable
victimized_turf.empty()
map.reservations -= location
qdel(location)
/datum/deathmatch_lobby/Topic(href, href_list) //This handles the chat Join button href, supposedly
var/mob/dead/observer/ghost = usr
if (!istype(ghost))
return
if(href_list["join"])
join(ghost)
/datum/deathmatch_lobby/ui_state(mob/user)
return GLOB.observer_state
/datum/deathmatch_lobby/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, null)
if(!ui)
ui = new(user, src, "DeathmatchLobby")
ui.open()
/datum/deathmatch_lobby/ui_static_data(mob/user)
. = list()
.["maps"] = list()
for (var/map_key in GLOB.deathmatch_game.maps)
.["maps"] += map_key
/datum/deathmatch_lobby/ui_data(mob/user)
. = list()
.["self"] = user.ckey
.["host"] = (user.ckey == host)
.["admin"] = check_rights_for(user.client, R_ADMIN)
.["global_chat"] = global_chat
.["loadouts"] = list()
for (var/datum/outfit/deathmatch_loadout/loadout as anything in loadouts)
.["loadouts"] += initial(loadout.display_name)
.["map"] = list()
.["map"]["name"] = map.name
.["map"]["desc"] = map.desc
.["map"]["time"] = map.automatic_gameend_time
.["map"]["min_players"] = map.min_players
.["map"]["max_players"] = map.max_players
if(!isnull(players[user.ckey]) && !isnull(players[user.ckey]["loadout"]))
var/datum/outfit/deathmatch_loadout/loadout = players[user.ckey]["loadout"]
.["loadoutdesc"] = initial(loadout.desc)
else
.["loadoutdesc"] = "You are an observer! As an observer, you can hear lobby announcements."
.["players"] = list()
for (var/player_key in players)
var/list/player_info = players[player_key]
var/mob/player_mob = player_info["mob"]
if (isnull(player_mob) || !player_mob.client)
leave(player_key)
continue
.["players"][player_key] = player_info.Copy()
var/datum/outfit/deathmatch_loadout/dm_loadout = player_info["loadout"]
.["players"][player_key]["loadout"] = initial(dm_loadout.display_name)
.["observers"] = list()
for (var/observer_key in observers)
var/mob/observer = observers[observer_key]["mob"]
if (isnull(observer) || !observer.client)
leave(observer_key)
continue
.["observers"][observer_key] = observers[observer_key]
/datum/deathmatch_lobby/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(. || !isobserver(usr))
return
switch(action)
if ("start_game")
if (usr.ckey != host)
return FALSE
if (map.min_players > players.len)
to_chat(usr, span_warning("Not enough players to start yet."))
return FALSE
start_game()
return TRUE
if ("leave_game")
if (playing)
return FALSE
leave(usr.ckey)
ui.close()
GLOB.deathmatch_game.ui_interact(usr)
return TRUE
if ("change_loadout")
if (playing)
return FALSE
if (params["player"] != usr.ckey && host != usr.ckey)
return FALSE
for (var/datum/outfit/deathmatch_loadout/possible_loadout as anything in loadouts)
if (params["loadout"] != initial(possible_loadout.display_name))
continue
players[params["player"]]["loadout"] = possible_loadout
break
return TRUE
if ("observe")
if (playing)
return FALSE
if (players[usr.ckey])
remove_ckey_from_play(usr.ckey)
add_observer(usr, host == usr.ckey)
return TRUE
else if (observers[usr.ckey] && players.len < map.max_players)
remove_ckey_from_play(usr.ckey)
add_player(usr, loadouts[1], host == usr.ckey)
return TRUE
if ("ready")
players[usr.ckey]["ready"] ^= 1 // Toggle.
ready_count += (players[usr.ckey]["ready"] * 2) - 1 // scared?
if (ready_count >= players.len && players.len >= map.min_players)
start_game()
return TRUE
if ("host") // Host functions
if (playing || (usr.ckey != host && !check_rights(R_ADMIN)))
return FALSE
var/uckey = params["id"]
switch (params["func"])
if ("Kick")
leave(uckey)
var/umob = get_mob_by_ckey(uckey)
var/datum/tgui/uui = SStgui.get_open_ui(umob, src)
uui?.close()
GLOB.deathmatch_game.ui_interact(umob)
return TRUE
if ("Transfer host")
if (host == uckey)
return FALSE
GLOB.deathmatch_game.passoff_lobby(host, uckey)
host = uckey
return TRUE
if ("Toggle observe")
var/umob = get_mob_by_ckey(uckey)
if (players[uckey])
remove_ckey_from_play(uckey)
add_observer(umob, host == uckey)
else if (observers[uckey] && players.len < map.max_players)
remove_ckey_from_play(uckey)
add_player(umob, loadouts[1], host == uckey)
return TRUE
if ("change_map")
if (!(params["map"] in GLOB.deathmatch_game.maps))
return FALSE
change_map(params["map"])
return TRUE
if ("global_chat")
global_chat = !global_chat
return TRUE
if ("admin") // Admin functions
if (!check_rights(R_ADMIN))
message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!")
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_game()
@@ -0,0 +1,24 @@
/area/deathmatch
name = "Deathmatch Arena"
requires_power = FALSE
has_gravity = STANDARD_GRAVITY
area_flags = UNIQUE_AREA | UNIQUE_AREA
/area/deathmatch/fullbright
static_lighting = FALSE
base_lighting_alpha = 255
/obj/effect/landmark/deathmatch_player_spawn
name = "Deathmatch Player Spawner"
/obj/effect/landmark/deathmatch_player_spawn/Initialize(mapload)
. = ..()
if (isnull(GLOB.deathmatch_game))
return INITIALIZE_HINT_QDEL
GLOB.deathmatch_game.spawnpoint_processing += src
/obj/effect/landmark/deathmatch_player_spawn/Destroy()
. = ..()
if(isnull(GLOB.deathmatch_game))
return
GLOB.deathmatch_game.spawnpoint_processing -= src
+148
View File
@@ -0,0 +1,148 @@
/datum/lazy_template/deathmatch //deathmatch maps that have any possibility of the walls being destroyed should use indestructible walls, because baseturf moment
var/name
map_dir = "_maps/map_files/Deathmatch"
/// Map Description
var/desc = ""
var/min_players = 2
var/max_players = 2 // TODO: make this automatic.
/// The map will end in this time
var/automatic_gameend_time = 8 MINUTES
/// List of allowed loadouts for this map, otherwise defaults to all loadouts
var/list/allowed_loadouts = list()
/datum/lazy_template/deathmatch/ragecage
name = "Ragecage"
desc = "Fun for the whole family, the classic ragecage."
max_players = 4
automatic_gameend_time = 4 MINUTES // its a 10x10 cage what are you guys doing in there
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant)
map_name = "ragecage"
key = "ragecage"
/datum/lazy_template/deathmatch/maintenance
name = "Maint Mania"
desc = "Dark maintenance tunnels, floor pills, improvised weaponry and a bloody beatdown. Welcome to assistant utopia."
max_players = 8
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant)
map_name = "Maint_Mania"
key = "Maint_Mania"
/datum/lazy_template/deathmatch/osha_violator
name = "OSHA Violator"
desc = "What would Engineering be without an overly complicated engine, with conveyor belts, emitters and shield generators sprinkled about? That's right, not Engineering."
max_players = 10
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant)
map_name = "OSHA_Violator"
key = "OSHA_Violator"
/datum/lazy_template/deathmatch/the_brig
name = "The Brig"
desc = "A recreation of MetaStation Brig."
max_players = 12
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant)
map_name = "The_Brig"
key = "The_Brig"
/datum/lazy_template/deathmatch/shooting_range
name = "Shooting Range"
desc = "A simple room with a bunch of wooden barricades."
max_players = 6
allowed_loadouts = list(
/datum/outfit/deathmatch_loadout/operative/ranged,
/datum/outfit/deathmatch_loadout/operative/melee,
)
map_name = "shooting_range"
key = "shooting_range"
/datum/lazy_template/deathmatch/securing
name = "SecuRing"
desc = "Presenting the Security Ring, ever wanted to shoot people with disablers? Well now you can."
max_players = 4
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/securing_sec)
map_name = "SecuRing"
key = "SecuRing"
/datum/lazy_template/deathmatch/instagib
name = "Instagib"
desc = "EVERYONE GETS AN INSTAKILL RIFLE!"
max_players = 8
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/assistant/instagib)
map_name = "instagib"
key = "instagib"
/datum/lazy_template/deathmatch/mech_madness
name = "Mech Madness"
desc = "Do you hate mechs? Yeah? Dont care! Go fight eachother!"
max_players = 4
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative)
map_name = "mech_madness"
key = "mech_madness"
/datum/lazy_template/deathmatch/sniperelite
name = "Sniper Elite"
desc = "Sound of gunfire and screaming people make my day"
max_players = 8
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/operative/sniper)
map_name = "Sniper_elite"
key = "Sniper_elite"
/datum/lazy_template/deathmatch/meatower
name = "Meat Tower"
desc = "There can only be one chef in this kitchen"
max_players = 8
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/chef)
map_name = "meatower"
key = "meatower"
/datum/lazy_template/deathmatch/sunrise
name = "Sunrise"
desc = "DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED DEHUMANIZE YOURSELF AND FACE TO BLOODSHED"
max_players = 8
allowed_loadouts = list(/datum/outfit/deathmatch_loadout/samurai)
map_name = "chinatown"
key = "chinatown"
/datum/lazy_template/deathmatch/starwars
name = "Arena Station"
desc = "Choose your battler!"
max_players = 10
allowed_loadouts = list(
/datum/outfit/deathmatch_loadout/battler/bloodminer,
/datum/outfit/deathmatch_loadout/battler/clown,
/datum/outfit/deathmatch_loadout/battler/cowboy,
/datum/outfit/deathmatch_loadout/battler/druid,
/datum/outfit/deathmatch_loadout/battler/enginer,
/datum/outfit/deathmatch_loadout/battler/janitor,
/datum/outfit/deathmatch_loadout/battler/northstar,
/datum/outfit/deathmatch_loadout/battler/raider,
/datum/outfit/deathmatch_loadout/battler/ripper,
/datum/outfit/deathmatch_loadout/battler/scientist,
/datum/outfit/deathmatch_loadout/battler/soldier,
/datum/outfit/deathmatch_loadout/battler/surgeon,
/datum/outfit/deathmatch_loadout/battler/tgcoder,
/datum/outfit/deathmatch_loadout/naked,
)
map_name = "starwars"
key = "starwars"
/datum/lazy_template/deathmatch/arenaplatform
name = "Underground Thunderdome"
desc = "An illegal underground thunderdome, for larger amounts of murder."
max_players = 15
allowed_loadouts = list(
/datum/outfit/deathmatch_loadout/operative,
/datum/outfit/deathmatch_loadout/naked,
)
map_name = "arena"
key = "arena"
/datum/lazy_template/deathmatch/raidthebase
name = "Backalley"
desc = "You are not built for these streets."
max_players = 8
allowed_loadouts = list(
/datum/outfit/deathmatch_loadout/assistant,
/datum/outfit/deathmatch_loadout/naked,
)
map_name = "raidthebase"
key = "raidthebase"
+4
View File
@@ -26,6 +26,10 @@
set_cap = 1
set_luminosity = 1.6
/obj/effect/light_emitter/fake_outdoors
light_color = COLOR_LIGHT_YELLOW
set_cap = 1
/**********************Miner Lockers**************************/
/obj/structure/closet/wardrobe/miner
@@ -413,6 +413,14 @@ no power level overlay is currently in the overlays list.
if(fields.len)
..()
/obj/machinery/field/generator/starts_on
anchored = TRUE
state = FG_WELDED
/obj/machinery/field/generator/starts_on/Initialize(mapload)
. = ..()
turn_on()
#undef FG_UNSECURED
#undef FG_SECURED
#undef FG_WELDED
@@ -352,3 +352,11 @@
volume = 15
amount_per_transfer_from_this = 15
list_reagents = list(/datum/reagent/medicine/mutadone = 15)
/obj/item/reagent_containers/hypospray/medipen/penthrite
name = "penthrite autoinjector"
desc = "Experimental heart medication."
icon_state = "atropen"
inhand_icon_state = "atropen"
base_icon_state = "atropen"
list_reagents = list(/datum/reagent/medicine/c2/penthrite = 10)
@@ -267,6 +267,12 @@
list_reagents = list((toxin_to_get) = 5)
return ..()
/obj/item/reagent_containers/syringe/crude/mushroom
list_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 5)
/obj/item/reagent_containers/syringe/crude/blastoff
list_reagents = list(/datum/reagent/drug/blastoff = 5)
/obj/item/reagent_containers/syringe/spider_extract
name = "spider extract syringe"
desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world."
+4
View File
@@ -92,6 +92,10 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
if(.)
set_operating(TRUE)
/obj/machinery/conveyor/auto/inverted
icon_state = "conveyor_map_inverted"
flipped = TRUE
// create a conveyor
/obj/machinery/conveyor/Initialize(mapload, new_dir, new_id)
..()
+5
View File
@@ -3900,6 +3900,11 @@
#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm"
#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm"
#include "code\modules\clothing\under\jobs\Plasmaman\security.dm"
#include "code\modules\deathmatch\deathmatch_controller.dm"
#include "code\modules\deathmatch\deathmatch_loadouts.dm"
#include "code\modules\deathmatch\deathmatch_lobby.dm"
#include "code\modules\deathmatch\deathmatch_mapping.dm"
#include "code\modules\deathmatch\deathmatch_maps.dm"
#include "code\modules\detectivework\evidence.dm"
#include "code\modules\detectivework\scanner.dm"
#include "code\modules\discord\accountlink.dm"
@@ -0,0 +1,203 @@
import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import {
Box,
Button,
Divider,
Dropdown,
Flex,
Icon,
Section,
Table,
} from '../components';
import { ButtonCheckbox } from '../components/Button';
import { Window } from '../layouts';
type PlayerLike = {
[key: string]: {
host: number;
ready: BooleanLike;
};
};
type Data = {
self: string;
host: BooleanLike;
admin: BooleanLike;
global_chat: BooleanLike;
loadouts: string[];
maps: string[];
map: {
name: string;
desc: string;
time: number;
min_players: number;
max_players: number;
};
loadoutdesc: string;
players: PlayerLike[];
observers: PlayerLike[];
};
export const DeathmatchLobby = (props) => {
const { act, data } = useBackend<Data>();
return (
<Window title="Deathmatch Lobby" width={560} height={400}>
<Window.Content>
<Flex height="94%">
<Flex.Item width="350px">
<Section height="99%">
<Table>
<Table.Row>
<Table.Cell collapsing />
<Table.Cell>Name</Table.Cell>
<Table.Cell grow>Loadout</Table.Cell>
<Table.Cell collapsing>Ready</Table.Cell>
</Table.Row>
{Object.keys(data.players).map((player) => (
<Table.Row className="candystripe" key={player}>
<Table.Cell collapsing>
{!!data.players[player].host && <Icon name="star" />}
</Table.Cell>
<Table.Cell>
{(!(
(data.host && !data.players[player].host) ||
data.admin
) && <b>{player}</b>) || (
<Dropdown
displayText={player}
options={['Kick', 'Transfer host', 'Toggle observe']}
onSelected={(value) =>
act('host', {
id: player,
func: value,
})
}
/>
)}
</Table.Cell>
<Table.Cell grow>
<Dropdown
displayText={data.players[player].loadout}
disabled={!(data.host || player === data.self)}
options={data.loadouts}
onSelected={(value) =>
act('change_loadout', {
player: player,
loadout: value,
})
}
/>
</Table.Cell>
<Table.Cell collapsing>
<ButtonCheckbox
disabled={player !== data.self}
checked={data.players[player].ready}
onClick={() => act('ready')}
/>
</Table.Cell>
</Table.Row>
))}
{Object.keys(data.observers).map((observer) => (
<Table.Row key={observer}>
<Table.Cell collapsing>
{(!!data.observers[observer].host && (
<Icon name="star" />
)) || <Icon name="eye" />}
</Table.Cell>
<Table.Cell>
{(!(
(data.host && !data.observers[observer].host) ||
data.admin
) && <b>{observer}</b>) || (
<Dropdown
displayText={observer}
options={['Kick', 'Transfer host', 'Toggle observe']}
onSelected={(value) =>
act('host', {
id: observer,
func: value,
})
}
/>
)}
</Table.Cell>
<Table.Cell grow>Observing</Table.Cell>
</Table.Row>
))}
</Table>
</Section>
</Flex.Item>
<Flex.Item width="210px">
<Section>
<Box textAlign="center">
{(!!data.host && (
<Dropdown
displayText={data.map.name}
options={data.maps}
onSelected={(value) =>
act('host', {
func: 'change_map',
map: value,
})
}
/>
)) || <b>{data.map.name}</b>}
</Box>
<Divider />
{data.map.desc}
<Box textAlign="center">
Maximum Play Time: <b>{`${data.map.time / 600}min`}</b>
<br />
Min players: <b>{data.map.min_players}</b>
<br />
Max players: <b>{data.map.max_players}</b>
<br />
Current players: <b>{Object.keys(data.players).length}</b>
</Box>
<Button.Checkbox
checked={data.global_chat}
disabled={!(data.host || data.admin)}
content="Heightened Hearing"
tooltip="Players can hear ghosts and hear through walls."
onClick={() =>
act('host', {
func: 'global_chat',
})
}
/>
<Divider />
<Box textAlign="center">Loadout Description</Box>
<Divider />
<Box textAlign="center">{data.loadoutdesc}</Box>
</Section>
</Flex.Item>
</Flex>
<Button
color="good"
content="Start Game"
onClick={() => act('start_game')}
/>
<Button
color="bad"
content="Leave Game"
onClick={() => act('leave_game')}
/>
<Button
color="caution"
content={data.observers[data.self] ? 'Join' : 'Observe'}
onClick={() => act('observe')}
/>
{!!data.admin && (
<Button
icon="exclamation"
color="caution"
content="Force Start"
onClick={() => act('admin', { func: 'Force start' })}
/>
)}
</Window.Content>
</Window>
);
};
@@ -0,0 +1,95 @@
import { useBackend } from '../backend';
import {
Button,
Dropdown,
Flex,
NoticeBox,
Section,
Stack,
Table,
} from '../components';
import { Window } from '../layouts';
export const DeathmatchPanel = (props, context) => {
const { act, data } = useBackend(context);
const playing = data.playing || '';
return (
<Window title="Deathmatch Lobbies" width={360} height={400}>
<Window.Content>
<NoticeBox danger>
If you play, you can still possibly be returned to your body (No
Guarantees)!
</NoticeBox>
<Section height="80%">
<Table>
<Table.Row>
<Table.Cell bold>Host</Table.Cell>
<Table.Cell bold>Map</Table.Cell>
<Table.Cell bold>Players</Table.Cell>
</Table.Row>
{data.lobbies.map((lobby) => (
<Table.Row key={lobby.name}>
<Table.Cell>
{(!data.admin && lobby.name) || (
<Dropdown
width="100%"
nochevron
displayText={lobby.name}
options={['Close', 'View']}
onSelected={(value) =>
act('admin', {
id: lobby.name,
func: value,
})
}
/>
)}
</Table.Cell>
<Table.Cell>{lobby.map}</Table.Cell>
<Table.Cell>
{lobby.players}/{lobby.max_players}
</Table.Cell>
<Table.Cell>
{(!lobby.playing && (
<>
<Button
disabled={
(data.hosting || playing) && playing !== lobby.name
}
color="good"
content={playing === lobby.name ? 'View' : 'Join'}
onClick={() => act('join', { id: lobby.name })}
/>
<Button
color="caution"
icon="eye"
onClick={() => act('spectate', { id: lobby.name })}
/>
</>
)) || (
<Button
disabled={
(data.hosting || playing) && playing !== lobby.name
}
color="good"
content="Spectate"
onClick={() => act('spectate', { id: lobby.name })}
/>
)}
</Table.Cell>
</Table.Row>
))}
</Table>
</Section>
<Button
disabled={data.hosting}
fluid
textAlign="center"
color="good"
content="Create Lobby"
onClick={() => act('host')}
/>
</Window.Content>
</Window>
);
};
@@ -1,14 +1,14 @@
import { useBackend } from '../backend';
import { Button, Section, Stack } from '../components';
import { Button, Divider, Section, Stack } from '../components';
import { Window } from '../layouts';
export const MinigamesMenu = (props) => {
const { act } = useBackend();
return (
<Window title="Minigames Menu" width={700} height={200}>
<Window title="Minigames Menu" width={530} height={320}>
<Window.Content>
<Section title="Select Minigame" textAlign="center">
<Section title="Select Minigame" textAlign="center" fill>
<Stack>
<Stack.Item grow>
<Button
@@ -30,6 +30,9 @@ export const MinigamesMenu = (props) => {
onClick={() => act('mafia')}
/>
</Stack.Item>
</Stack>
<Divider />
<Stack>
<Stack.Item grow>
<Button
content="Basketball"
@@ -40,6 +43,16 @@ export const MinigamesMenu = (props) => {
onClick={() => act('basketball')}
/>
</Stack.Item>
<Stack.Item grow>
<Button
content="Deathmatch"
fluid
fontSize={3}
textAlign="center"
lineHeight="3"
onClick={() => act('deathmatch')}
/>
</Stack.Item>
</Stack>
</Section>
</Window.Content>