TheSwain 2 months ago
parent
commit
e3b8fb7300
90 changed files with 11443 additions and 13701 deletions
  1. +0
    -824
      _maps/RandomRuins/LavaRuins/kinggoatboss.dmm
  2. +0
    -645
      _maps/RandomRuins/SpaceRuins/kinggoatarena.dmm
  3. +2
    -2
      _maps/RandomZLevels/wildwest.dmm
  4. +9160
    -11399
      _maps/map_files/BoxStation/BoxStation.dmm
  5. +3
    -3
      code/__DEFINES/achievements.dm
  6. +1
    -1
      code/__HELPERS/_logging.dm
  7. +2
    -0
      code/_globalvars/logging.dm
  8. +0
    -12
      code/_onclick/hud/parallax.dm
  9. +1
    -1
      code/controllers/subsystem/achievements.dm
  10. +12
    -11
      code/datums/achievements/boss_achievements.dm
  11. +3
    -2
      code/datums/elements/waddling.dm
  12. +1
    -1
      code/datums/materials/meat.dm
  13. +1
    -1
      code/datums/materials/pizza.dm
  14. +12
    -2
      code/datums/mutations/body.dm
  15. +0
    -9
      code/datums/ruins/lavaland.dm
  16. +0
    -8
      code/datums/ruins/space.dm
  17. +0
    -6
      code/game/area/areas/ruins/lavaland.dm
  18. +1
    -1
      code/game/machinery/computer/arcade.dm
  19. +65
    -20
      code/game/objects/effects/glowshroom.dm
  20. +1
    -0
      code/game/objects/items/devices/PDA/PDA.dm
  21. +2
    -0
      code/game/objects/items/devices/scanners.dm
  22. +2
    -0
      code/game/objects/items/melee/misc.dm
  23. +1
    -0
      code/game/objects/items/pinpointer.dm
  24. +1
    -111
      code/game/objects/items/plushes.dm
  25. +1
    -0
      code/game/objects/items/stunbaton.dm
  26. +1
    -0
      code/game/objects/items/tools/crowbar.dm
  27. +2
    -0
      code/game/objects/items/tools/screwdriver.dm
  28. +1
    -0
      code/game/objects/items/tools/weldingtool.dm
  29. +4
    -2
      code/game/objects/structures/mirror.dm
  30. +0
    -16
      code/game/turfs/open/_open.dm
  31. +4
    -2
      code/game/world.dm
  32. +1
    -0
      code/modules/admin/create_mob.dm
  33. +5
    -0
      code/modules/cargo/bounties/engineering.dm
  34. +0
    -5
      code/modules/cargo/bounties/mech.dm
  35. +5
    -3
      code/modules/cargo/packs.dm
  36. +14
    -0
      code/modules/client/client_defines.dm
  37. +16
    -3
      code/modules/client/preferences.dm
  38. +3
    -0
      code/modules/client/preferences_savefile.dm
  39. +1
    -1
      code/modules/client/preferences_toggles.dm
  40. +109
    -25
      code/modules/client/verbs/ooc.dm
  41. +1
    -1
      code/modules/clothing/clothing.dm
  42. +1
    -43
      code/modules/clothing/head/misc.dm
  43. +2
    -2
      code/modules/clothing/suits/utility.dm
  44. +1
    -1
      code/modules/hydroponics/hydroponics.dm
  45. +13
    -4
      code/modules/library/lib_items.dm
  46. +38
    -41
      code/modules/library/random_books.dm
  47. +0
    -29
      code/modules/mining/equipment/kinetic_crusher.dm
  48. +0
    -3
      code/modules/mining/shelters.dm
  49. +6
    -1
      code/modules/mob/dead/new_player/preferences_setup.dm
  50. +2
    -0
      code/modules/mob/living/carbon/human/human_defines.dm
  51. +2
    -4
      code/modules/mob/living/carbon/human/human_update_icons.dm
  52. +1
    -1
      code/modules/mob/living/carbon/human/species.dm
  53. +3
    -2
      code/modules/mob/living/simple_animal/friendly/farm_animals.dm
  54. +0
    -339
      code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm
  55. +0
    -49
      code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
  56. +4
    -1
      code/modules/mob/mob_say.dm
  57. +1
    -0
      code/modules/modular_computers/computers/item/tablet.dm
  58. +12
    -0
      code/modules/research/nanites/nanite_program_hub.dm
  59. +12
    -0
      code/modules/research/nanites/nanite_programmer.dm
  60. +0
    -52
      code/modules/ruins/lavalandruin_code/kinggoat.dm
  61. +0
    -4
      code/modules/ruins/spaceruin_code/hilbertshotel.dm
  62. +0
    -3
      code/modules/spells/spell_types/rod_form.dm
  63. +1
    -1
      code/modules/surgery/bodyparts/bodyparts.dm
  64. +6
    -1
      code/modules/surgery/surgery_step.dm
  65. +11
    -1
      code/modules/uplink/uplink_items.dm
  66. +1817
    -0
      html/changelog.html
  67. +57
    -0
      html/changelogs/.all_changelog.yml
  68. +5
    -0
      html/changelogs/AutoChangeLog-pr-51378.yml
  69. +4
    -0
      html/changelogs/AutoChangeLog-pr-51383.yml
  70. +5
    -0
      html/changelogs/AutoChangeLog-pr-51391.yml
  71. BIN
      icons/UI_Icons/Achievements/Boss/goatboss.png
  72. BIN
      icons/effects/parallax.dmi
  73. BIN
      icons/mob/animal.dmi
  74. BIN
      icons/mob/clothing/belt.dmi
  75. BIN
      icons/mob/clothing/head.dmi
  76. BIN
      icons/mob/clothing/neck.dmi
  77. BIN
      icons/mob/hud.dmi
  78. BIN
      icons/mob/king_of_goats.dmi
  79. BIN
      icons/mob/large-worn-icons/64x64/head.dmi
  80. BIN
      icons/obj/card.dmi
  81. BIN
      icons/obj/clothing/hats.dmi
  82. BIN
      icons/obj/computer.dmi
  83. BIN
      icons/obj/guns/energy.dmi
  84. BIN
      icons/obj/lavaland/artefacts.dmi
  85. BIN
      icons/obj/machines/research.dmi
  86. BIN
      icons/obj/plushes.dmi
  87. BIN
      sound/ambience/Visager-Battle.ogg
  88. BIN
      sound/ambience/Visager-Miniboss_Fight.ogg
  89. BIN
      sound/items/goatsound.ogg
  90. +0
    -2
      tgstation.dme

+ 0
- 824
_maps/RandomRuins/LavaRuins/kinggoatboss.dmm View File

@@ -1,824 +0,0 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"b" = (
/turf/closed/wall/mineral/silver,
/area/ruin/powered)
"c" = (
/turf/closed/wall/mineral/gold,
/area/ruin/powered)
"d" = (
/turf/closed/mineral/volcanic/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"e" = (
/turf/closed/wall/r_wall,
/area/ruin/powered)
"f" = (
/turf/open/floor/carpet,
/area/ruin/powered)
"g" = (
/turf/open/floor/mineral/diamond,
/area/ruin/powered)
"h" = (
/obj/effect/decal/cleanable/blood/old,
/mob/living/simple_animal/hostile/retaliate/goat/guard{
health = 0;
icon_state = "goat_guard_dead"
},
/turf/open/floor/mineral/diamond,
/area/ruin/powered)
"i" = (
/obj/structure/ladder/unbreakable{
desc = "This seems to be the ladder to the King of Goats lair. Looks to be a one way trip...";
id = "goatlayer";
name = "Ladder to the King of Goats Lair"
},
/turf/open/floor/mineral/diamond,
/area/ruin/powered)
"j" = (
/obj/item/paper/crumpled{
info = "Lest ye be prepared, abandon all hope ye who enter here.";
name = "Wise Man's Warning."
},
/turf/open/floor/mineral/gold,
/area/ruin/powered)
"k" = (
/obj/structure/mineral_door/transparent/diamond{
sheetAmount = 1
},
/turf/open/floor/mineral/gold,
/area/ruin/powered)
"l" = (
/turf/open/floor/carpet/cyan,
/area/ruin/powered)
"m" = (
/turf/open/floor/carpet/red,
/area/ruin/powered)
"n" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/carpet/red,
/area/ruin/powered)
"p" = (
/turf/template_noop,
/area/template_noop)
"q" = (
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"r" = (
/turf/open/floor/wood,
/area/ruin/powered)
"s" = (
/obj/structure/mineral_door/silver,
/turf/open/floor/carpet/red,
/area/ruin/powered)
"t" = (
/obj/structure/mineral_door/iron,
/turf/open/floor/carpet/red,
/area/ruin/powered)
"u" = (
/turf/closed/wall/r_wall/rust,
/area/ruin/powered)
"v" = (
/obj/effect/decal/cleanable/blood/old,
/mob/living/simple_animal/hostile/retaliate/goat/guard{
health = 0;
icon_state = "goat_guard_dead"
},
/turf/open/floor/carpet/cyan,
/area/ruin/powered)
"w" = (
/obj/effect/decal/cleanable/blood/old,
/mob/living/simple_animal/hostile/retaliate/goat/guard{
health = 0;
icon_state = "goat_guard_dead"
},
/turf/open/floor/carpet/red,
/area/ruin/powered)
"x" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/carpet/cyan,
/area/ruin/powered)
"y" = (
/obj/effect/decal/cleanable/blood/old,
/obj/item/spear,
/mob/living/simple_animal/hostile/retaliate/goat{
health = 0;
icon_state = "goat_dead"
},
/turf/open/floor/wood,
/area/ruin/powered)
"z" = (
/obj/structure/stone_tile/slab/cracked,
/mob/living/simple_animal/hostile/retaliate/goat{
health = 0;
icon_state = "goat_dead"
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"A" = (
/obj/structure/stone_tile{
dir = 4
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"B" = (
/obj/structure/stone_tile{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"C" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"D" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile/block{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"E" = (
/obj/structure/stone_tile/slab/burnt,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"F" = (
/obj/structure/stone_tile/surrounding_tile,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"G" = (
/obj/structure/stone_tile/block/burnt,
/obj/structure/stone_tile{
dir = 4
},
/obj/structure/stone_tile{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"H" = (
/turf/open/floor/mineral/gold,
/area/ruin/powered)
"I" = (
/obj/structure/stone_tile{
dir = 8
},
/obj/structure/stone_tile{
dir = 4
},
/obj/structure/stone_tile{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"J" = (
/obj/effect/decal/cleanable/blood/old,
/mob/living/simple_animal/hostile/retaliate/goat{
health = 0;
icon_state = "goat_dead"
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"K" = (
/obj/structure/stone_tile{
dir = 1
},
/obj/structure/stone_tile{
dir = 4
},
/obj/structure/stone_tile,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"L" = (
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"M" = (
/obj/structure/statue/sandstone/assistant,
/obj/structure/stone_tile/slab/burnt,
/obj/item/gun/magic/staff{
pixel_x = 10;
pixel_y = 3
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"N" = (
/obj/structure/bonfire/prelit,
/turf/open/floor/carpet/cyan,
/area/ruin/powered)
"O" = (
/obj/item/hatchet,
/turf/open/floor/carpet/red,
/area/ruin/powered)
"P" = (
/obj/effect/decal/cleanable/blood/old,
/mob/living/simple_animal/hostile/retaliate/goat{
health = 0;
icon_state = "goat_dead"
},
/turf/open/floor/carpet/red,
/area/ruin/powered)

(1,1,1) = {"
p
p
p
p
p
p
d
d
d
d
d
d
d
p
p
p
p
p
p
p
p
p
p
"}
(2,1,1) = {"
p
p
p
d
d
d
d
d
d
d
d
d
d
d
d
d
d
p
p
p
p
p
p
"}
(3,1,1) = {"
p
p
p
p
p
d
d
q
q
q
q
q
d
d
d
d
d
d
d
p
p
p
p
"}
(4,1,1) = {"
p
p
d
d
d
d
q
q
q
q
q
q
d
d
d
q
q
q
d
p
p
p
p
"}
(5,1,1) = {"
p
p
d
d
d
d
e
e
u
u
e
e
u
d
d
q
z
q
A
q
q
d
p
"}
(6,1,1) = {"
p
q
q
d
d
d
e
f
f
f
f
f
u
u
u
e
e
q
B
A
q
d
p
"}
(7,1,1) = {"
p
q
q
d
q
d
u
f
f
f
f
f
e
r
r
r
u
d
q
q
a
a
p
"}
(8,1,1) = {"
p
p
q
d
d
u
u
l
l
l
l
l
e
e
r
r
u
e
M
q
J
L
a
"}
(9,1,1) = {"
p
p
q
d
d
e
b
b
c
b
b
l
l
s
y
r
r
e
C
q
a
a
a
"}
(10,1,1) = {"
p
d
d
d
d
e
b
g
H
H
b
N
w
s
m
m
n
t
D
G
a
a
a
"}
(11,1,1) = {"
d
d
d
q
d
e
c
H
g
H
c
m
m
e
m
n
m
e
d
d
d
a
a
"}
(12,1,1) = {"
d
d
q
q
d
e
b
H
i
j
k
n
m
u
m
m
m
u
d
d
d
d
d
"}
(13,1,1) = {"
d
d
q
q
q
e
c
H
h
H
c
m
m
e
m
O
m
e
C
q
d
d
a
"}
(14,1,1) = {"
p
d
d
d
d
e
b
g
H
H
b
N
m
s
m
P
n
t
E
I
K
a
L
"}
(15,1,1) = {"
p
d
d
d
d
u
b
b
c
b
b
l
x
s
r
r
r
u
F
q
q
L
J
"}
(16,1,1) = {"
p
p
p
d
d
u
u
l
l
l
v
l
u
u
r
r
u
u
M
q
q
a
a
"}
(17,1,1) = {"
p
q
q
q
d
d
u
f
f
f
f
f
u
r
r
r
u
d
q
q
d
d
a
"}
(18,1,1) = {"
p
q
q
q
d
d
u
f
f
f
f
f
e
e
e
e
e
d
d
d
p
p
p
"}
(19,1,1) = {"
p
q
q
q
d
d
u
u
e
e
e
e
e
d
d
q
q
q
q
d
d
p
p
"}
(20,1,1) = {"
p
q
q
d
d
d
d
d
d
d
d
d
d
d
q
q
q
q
q
d
d
p
p
"}
(21,1,1) = {"
p
p
d
d
d
q
d
q
q
q
q
d
d
d
q
q
d
d
d
d
d
p
p
"}
(22,1,1) = {"
p
p
d
d
d
d
d
d
q
q
q
d
d
p
d
d
d
d
d
p
p
p
p
"}
(23,1,1) = {"
p
p
p
p
p
d
d
d
d
d
d
d
d
p
p
p
p
p
p
p
p
p
p
"}
(24,1,1) = {"
p
p
p
p
p
p
p
d
d
d
d
d
p
p
p
p
p
p
p
p
p
p
p
"}

+ 0
- 645
_maps/RandomRuins/SpaceRuins/kinggoatarena.dmm View File

@@ -1,645 +0,0 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/closed/indestructible/riveted,
/area/ruin/powered/kinggoat_arena)
"b" = (
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"c" = (
/obj/structure/chair/bronze,
/mob/living/simple_animal/hostile/megafauna/king,
/turf/open/indestructible{
icon_state = "gold"
},
/area/ruin/powered/kinggoat_arena)
"e" = (
/obj/effect/landmark/portal_exit{
id = "king goat arena"
},
/turf/open/indestructible{
icon_state = "gold"
},
/area/ruin/powered/kinggoat_arena)
"h" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"k" = (
/turf/open/lava,
/area/ruin/powered/kinggoat_arena)
"m" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
/turf/open/indestructible{
icon_state = "engine"
},
/area/ruin/powered/kinggoat_arena)
"n" = (
/obj/structure/fluff/big_chain,
/turf/open/indestructible{
icon_state = "engine"
},
/area/ruin/powered/kinggoat_arena)
"o" = (
/obj/effect/decal/cleanable/blood/old,
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/mob/living/simple_animal/hostile/retaliate/goat/guard{
health = 0;
icon_state = "goat_guard_dead"
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"p" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/indestructible{
icon_state = "engine"
},
/area/ruin/powered/kinggoat_arena)
"q" = (
/obj/effect/decal/cleanable/blood/old,
/obj/structure/lattice/lava,
/turf/open/lava,
/area/ruin/powered/kinggoat_arena)
"r" = (
/mob/living/simple_animal/hostile/retaliate/goat/harem,
/turf/open/indestructible{
icon_state = "silver"
},
/area/ruin/powered/kinggoat_arena)
"s" = (
/obj/effect/mob_spawn/human/miner{
assignedrole = "null";
desc = "Seems this miner tried to cheese the arena using bluespace crystals. Did not turn out well";
mob_gender = "female";
mob_name = "Lyna Lavas";
name = "Lyna Lavas"
},
/obj/effect/decal/cleanable/blood/old,
/obj/item/stack/ore/bluespace_crystal,
/obj/structure/lattice/lava,
/turf/open/lava,
/area/ruin/powered/kinggoat_arena)
"t" = (
/obj/structure/ladder/unbreakable{
desc = "This seems to be the ladder to the King of Goats' lair. Looks to be a one way trip...";
height = 1;
id = "goatlayer";
name = "Ladder to the King of Goats Lair"
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"u" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/indestructible{
icon_state = "engine"
},
/area/ruin/powered/kinggoat_arena)
"v" = (
/mob/living/simple_animal/hostile/retaliate/goat/guard/pope,
/turf/open/indestructible{
icon_state = "gold"
},
/area/ruin/powered/kinggoat_arena)
"z" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/turf/open/indestructible{
icon_state = "engine"
},
/area/ruin/powered/kinggoat_arena)
"A" = (
/turf/open/indestructible{
icon_state = "gold"
},
/area/ruin/powered/kinggoat_arena)
"B" = (
/turf/open/indestructible/hoteltile,
/area/space)
"C" = (
/obj/item/kinetic_crusher,
/obj/structure/lattice/lava,
/turf/open/lava,
/area/ruin/powered/kinggoat_arena)
"D" = (
/obj/structure/lattice/lava,
/turf/open/lava,
/area/ruin/powered/kinggoat_arena)
"F" = (
/obj/structure/dresser,
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"G" = (
/turf/open/indestructible/hoteltile,
/area/ruin/powered/kinggoat_arena)
"I" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"J" = (
/obj/effect/decal/cleanable/blood/old,
/obj/structure/lattice/lava,
/mob/living/simple_animal/hostile/retaliate/goat/guard{
health = 0;
icon_state = "goat_guard_dead"
},
/turf/open/lava,
/area/ruin/powered/kinggoat_arena)
"K" = (
/mob/living/simple_animal/hostile/retaliate/goose{
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0);
damage_coeff = list("brute" = 0, "fire" = 0, "toxin" = 0, "clone" = 0, "stamina" = 0, "oxygen" = 0);
desc = "If you are alive and reading this you should not be in this room and should prob tell an admin how you got here.";
name = "The Paradox Goose"
},
/turf/open/indestructible/hoteltile,
/area/ruin/powered/kinggoat_arena)
"L" = (
/turf/open/indestructible{
icon_state = "silver"
},
/area/ruin/powered/kinggoat_arena)
"M" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"O" = (
/turf/open/indestructible{
icon_state = "diamond"
},
/area/ruin/powered/kinggoat_arena)
"P" = (
/turf/open/indestructible{
icon_state = "engine"
},
/area/ruin/powered/kinggoat_arena)
"R" = (
/obj/structure/bed,
/obj/item/bedsheet/red,
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"T" = (
/obj/machinery/door/airlock/gold/glass{
desc = "Once you go in the portal past this door there is no going back...";
name = "POINT OF NO RETURN"
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"U" = (
/obj/structure/table/wood,
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"V" = (
/mob/living/simple_animal/hostile/retaliate/goat/harem,
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"X" = (
/obj/effect/portal/permanent/one_way{
id = "king goat arena";
name = "king goat arena portal";
teleport_channel = "free"
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)
"Y" = (
/obj/structure/bonfire/prelit,
/turf/open/indestructible{
icon_state = "diamond"
},
/area/ruin/powered/kinggoat_arena)
"Z" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/indestructible/carpet,
/area/ruin/powered/kinggoat_arena)

(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
"}
(2,1,1) = {"
a
b
b
b
b
b
b
b
b
b
a
G
G
G
G
a
k
k
k
k
k
k
k
k
k
k
k
k
k
a
"}
(3,1,1) = {"
a
b
b
b
b
b
b
b
b
b
a
G
G
G
G
a
k
n
k
k
k
n
k
k
k
n
k
k
k
a
"}
(4,1,1) = {"
a
V
b
b
b
b
b
b
b
b
a
G
G
G
G
a
k
P
k
k
k
P
k
k
k
P
k
k
k
a
"}
(5,1,1) = {"
a
L
r
L
Y
L
O
L
O
L
a
G
a
a
a
a
u
u
u
u
u
u
u
u
u
u
u
m
P
a
"}
(6,1,1) = {"
a
A
A
L
L
L
L
L
L
L
a
G
a
b
b
a
J
q
D
D
D
D
q
D
D
D
D
I
h
a
"}
(7,1,1) = {"
a
c
A
v
L
A
L
A
L
e
a
K
a
X
b
T
D
s
D
D
D
D
D
D
D
D
D
Z
t
a
"}
(8,1,1) = {"
a
A
A
L
L
L
L
L
L
L
a
G
a
b
b
a
J
C
q
D
D
D
D
D
D
D
q
o
M
a
"}
(9,1,1) = {"
a
L
r
L
Y
L
O
L
O
L
a
G
a
a
a
a
p
p
p
p
p
p
p
p
p
p
p
z
P
a
"}
(10,1,1) = {"
a
V
b
b
b
b
b
b
b
b
a
G
G
G
G
a
k
P
k
k
k
P
k
k
k
P
k
k
k
a
"}
(11,1,1) = {"
a
b
b
b
b
b
b
b
b
b
a
G
B
G
G
a
k
n
k
k
k
n
k
k
k
n
k
k
k
a
"}
(12,1,1) = {"
a
b
F
R
R
U
b
b
b
b
a
G
G
G
G
a
k
k
k
k
k
k
k
k
k
k
k
k
k
a
"}
(13,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
"}

+ 2
- 2
_maps/RandomZLevels/wildwest.dmm View File

@@ -538,7 +538,7 @@
/area/awaymission/wildwest/mines)
"cm" = (
/obj/structure/bookcase/random{
book_count = 5
books_to_load = 5
},
/turf/open/floor/wood,
/area/awaymission/wildwest/gov)
@@ -654,7 +654,7 @@
/area/awaymission/wildwest/gov)
"cI" = (
/obj/structure/bookcase/random{
book_count = 5
books_to_load = 5
},
/turf/open/floor/wood,
/area/awaymission/wildwest/mines)


+ 9160
- 11399
_maps/map_files/BoxStation/BoxStation.dmm
File diff suppressed because it is too large
View File


+ 3
- 3
code/__DEFINES/achievements.dm View File

@@ -42,8 +42,8 @@
#define BOSS_MEDAL_LEGION "Legion Killer"
#define BOSS_MEDAL_TENDRIL "Tendril Exterminator"
#define BOSS_MEDAL_SWARMERS "Swarmer Beacon Killer"
#define BOSS_MEDAL_KINGGOAT "King Goat Killer"
#define BOSS_MEDAL_WENDIGO "Wendigo Killer"
#define BOSS_MEDAL_KINGGOAT "King Goat Killer"

#define BOSS_MEDAL_MINER_CRUSHER "Blood-drunk Miner Crusher"
#define BOSS_MEDAL_FROSTMINER_CRUSHER "Demonic-frost Miner Crusher"
@@ -53,8 +53,8 @@
#define BOSS_MEDAL_HIEROPHANT_CRUSHER "Hierophant Crusher"
#define BOSS_MEDAL_LEGION_CRUSHER "Legion Crusher"
#define BOSS_MEDAL_SWARMERS_CRUSHER "Swarmer Beacon Crusher"
#define BOSS_MEDAL_KINGGOAT_CRUSHER "King Goat Crusher"
#define BOSS_MEDAL_WENDIGO_CRUSHER "Wendigo Crusher"
#define BOSS_MEDAL_KINGGOAT_CRUSHER "King Goat Crusher"

// Medal hub IDs for boss-kill scores
#define BOSS_SCORE "Bosses Killed"
@@ -66,8 +66,8 @@
#define HIEROPHANT_SCORE "Hierophants Killed"
#define LEGION_SCORE "Legion Killed"
#define SWARMER_BEACON_SCORE "Swarmer Beacs Killed"
#define KINGGOAT_SCORE "King Goat Killed"
#define WENDIGO_SCORE "Wendigos Killed"
#define KINGGOAT_SCORE "King Goat Killed"
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"

// DB IDs for hardcore random mode


+ 1
- 1
code/__HELPERS/_logging.dm View File

@@ -92,7 +92,7 @@

/proc/log_econ(text)
if (CONFIG_GET(flag/log_econ))
WRITE_LOG(GLOB.world_attack_log, "MONEY: [text]")
WRITE_LOG(GLOB.world_econ_log, "MONEY: [text]")

/proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE)
if (CONFIG_GET(flag/log_manifest))


+ 2
- 0
code/_globalvars/logging.dm View File

@@ -8,6 +8,8 @@ GLOBAL_VAR(world_qdel_log)
GLOBAL_PROTECT(world_qdel_log)
GLOBAL_VAR(world_attack_log)
GLOBAL_PROTECT(world_attack_log)
GLOBAL_VAR(world_econ_log)
GLOBAL_PROTECT(world_econ_log)
GLOBAL_VAR(world_href_log)
GLOBAL_PROTECT(world_href_log)
GLOBAL_VAR(round_id)


+ 0
- 12
code/_onclick/hud/parallax.dm View File

@@ -1,16 +1,4 @@

/client
var/list/parallax_layers
var/list/parallax_layers_cached
var/atom/movable/movingmob
var/turf/previous_turf
var/dont_animate_parallax //world.time of when we can state animate()ing parallax again
var/last_parallax_shift //world.time of last update
var/parallax_throttle = 0 //ds between updates
var/parallax_movedir = 0
var/parallax_layers_max = 4
var/parallax_animate_timer

/datum/hud/proc/create_parallax(mob/viewmob)
var/mob/screenmob = viewmob || mymob
var/client/C = screenmob.client


+ 1
- 1
code/controllers/subsystem/achievements.dm View File

@@ -13,7 +13,7 @@ SUBSYSTEM_DEF(achievements)

/datum/controller/subsystem/achievements/Initialize(timeofday)
if(!SSdbcore.Connect())
return
return ..()
achievements_enabled = TRUE

for(var/T in subtypesof(/datum/award/achievement))


+ 12
- 11
code/datums/achievements/boss_achievements.dm View File

@@ -61,12 +61,6 @@
database_id = BOSS_MEDAL_SWARMERS
icon = "swarmer"

/datum/award/achievement/boss/king_goat_kill
name = "King Goat Killer"
desc = "The king is dead, long live the king!"
database_id = BOSS_MEDAL_KINGGOAT
icon = "goatboss"

/datum/award/achievement/boss/wendigo_kill
name = "Wendigo Killer"
desc = "You've now ruined years of mythical storytelling."
@@ -117,13 +111,20 @@
desc = "GET THEM OFF OF ME!"
database_id = BOSS_MEDAL_SWARMERS_CRUSHER

/datum/award/achievement/boss/wendigo_crusher
name = "Wendigo Crusher"
desc = "You've now ruined years of mythical storytelling."
database_id = BOSS_MEDAL_WENDIGO_CRUSHER

//should be removed soon
/datum/award/achievement/boss/king_goat_kill
name = "King Goat Killer"
desc = "The king is dead, long live the king!"
database_id = BOSS_MEDAL_KINGGOAT
icon = "goatboss"

/datum/award/achievement/boss/king_goat_crusher
name = "King Goat Crusher"
desc = "The king is dead, long live the king!"
database_id = BOSS_MEDAL_KINGGOAT_CRUSHER
icon = "goatboss"

/datum/award/achievement/boss/wendigo_crusher
name = "Wendigo Crusher"
desc = "You've now ruined years of mythical storytelling."
database_id = BOSS_MEDAL_WENDIGO_CRUSHER

+ 3
- 2
code/datums/elements/waddling.dm View File

@@ -20,5 +20,6 @@

/datum/element/waddling/proc/Waddle(atom/movable/target)
animate(target, pixel_z = 4, time = 0)
animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2)
animate(pixel_z = 0, transform = matrix(), time = 0)
var/prev_trans = matrix(target.transform)
animate(pixel_z = 0, transform = turn(target.transform, pick(-12, 0, 12)), time=2)
animate(pixel_z = 0, transform = prev_trans, time = 0)

+ 1
- 1
code/datums/materials/meat.dm View File

@@ -3,7 +3,7 @@
name = "meat"
desc = "Meat"
color = rgb(214, 67, 67)
categories = list(MAT_CATEGORY_RIGID = TRUE)
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/meat
value_per_unit = 0.05
beauty_modifier = -0.3


+ 1
- 1
code/datums/materials/pizza.dm View File

@@ -2,7 +2,7 @@
name = "pizza"
desc = "~Jamme, jamme, n'coppa, jamme ja! Jamme, jamme, n'coppa jamme ja, funi-culi funi-cala funi-culi funi-cala!! Jamme jamme ja funiculi funicula!~"
color = "#FF9F23"
categories = list(MAT_CATEGORY_RIGID = TRUE)
categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
sheet_type = /obj/item/stack/sheet/pizza
value_per_unit = 0.05
beauty_modifier = 0.1


+ 12
- 2
code/datums/mutations/body.dm View File

@@ -192,6 +192,7 @@
var/obj/effect/dummy/luminescent_glow/glowth //shamelessly copied from luminescents
var/glow = 2.5
var/range = 2.5
var/glow_color
power_coeff = 1
conflicts = list(/datum/mutation/human/glow/anti)

@@ -199,6 +200,7 @@
. = ..()
if(.)
return
glow_color = glow_color()
glowth = new(owner)
modify()

@@ -206,7 +208,12 @@
if(!glowth)
return
var/power = GET_MUTATION_POWER(src)
glowth.set_light(range * power, glow * power, "#[dna.features["mcolor"]]")

glowth.set_light(range * power, glow, glow_color)

/// Returns the color for the glow effect
/datum/mutation/human/glow/proc/glow_color()
return pick(COLOR_RED, COLOR_BLUE, COLOR_YELLOW, COLOR_GREEN, COLOR_PURPLE, COLOR_ORANGE)

/datum/mutation/human/glow/on_losing(mob/living/carbon/human/owner)
. = ..()
@@ -218,10 +225,13 @@
name = "Anti-Glow"
desc = "Your skin seems to attract and absorb nearby light creating 'darkness' around you."
text_gain_indication = "<span class='notice'>Your light around you seems to disappear.</span>"
glow = -3.5 //Slightly stronger, since negating light tends to be harder than making it.
glow = -1.5
conflicts = list(/datum/mutation/human/glow)
locked = TRUE

/datum/mutation/human/glow/anti/glow_color()
return COLOR_WHITE

/datum/mutation/human/strong
name = "Strength"
desc = "The user's muscles slightly expand."


+ 0
- 9
code/datums/ruins/lavaland.dm View File

@@ -256,12 +256,3 @@
suffix = "lavaland_surface_elephant_graveyard.dmm"
allow_duplicates = FALSE
cost = 10

/datum/map_template/ruin/lavaland/king_goat_boss
name = "King Goat Boss Ruin"
id = "kinggoatboss"
description = "Abandon All Hope Ye Who Enter Here."
suffix = "kinggoatboss.dmm"
always_place = TRUE
allow_duplicates = FALSE
always_spawn_with = list(/datum/map_template/ruin/space/kinggoatarena = PLACE_ISOLATED)

+ 0
- 8
code/datums/ruins/space.dm View File

@@ -288,14 +288,6 @@
name = "Cleric's Den"
description = "Once part of a larger monastery, this holy order of long dead clerics practiced far less non-violence than they preached. Appears to have been untouched by looters, however. Odd."

/datum/map_template/ruin/space/kinggoatarena
id = "kinggoatarena"
suffix = "kinggoatarena.dmm"
name = "King Goat Arena"
description = "Well wish you luck."
allow_duplicates = FALSE
unpickable = TRUE

/datum/map_template/ruin/space/forgottenship
id = "forgottenship"
suffix = "forgottenship.dmm"


+ 0
- 6
code/game/area/areas/ruins/lavaland.dm View File

@@ -101,9 +101,3 @@
//ash walker nest
/area/ruin/unpowered/ash_walkers
icon_state = "red"

/area/ruin/powered/kinggoat_arena
name = "King Goat Arena"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
noteleport = TRUE
icon_state = "dk_yellow"

+ 1
- 1
code/game/machinery/computer/arcade.dm View File

@@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
/obj/item/card/emagfake = 1,
/obj/item/clothing/shoes/wheelys = 2,
/obj/item/clothing/shoes/kindleKicks = 2,
/obj/item/toy/plush/goatplushie/angry/realgoat = 2,
/obj/item/toy/plush/goatplushie = 2,
/obj/item/toy/plush/moth = 2,
/obj/item/storage/belt/military/snack = 2,
/obj/item/toy/brokenradio = 2,


+ 65
- 20
code/game/objects/effects/glowshroom.dm View File

@@ -9,12 +9,19 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "glowshroom" //replaced in New
layer = ABOVE_NORMAL_TURF_LAYER
max_integrity = 30
var/delay = 1200
/// Time interval between glowshroom "spreads"
var/delay_spread = 2 MINUTES
/// Time interval between glowshroom decay checks
var/delay_decay = 30 SECONDS
/// Boolean to indicate if the shroom is on the floor/wall
var/floor = 0
/// Mushroom generation number
var/generation = 1
var/spreadIntoAdjacentChance = 60
/// Chance to spread into adjacent tiles (0-100)
var/spreadIntoAdjacentChance = 75
/// Internal seed of the glowshroom, stats are stored here
var/obj/item/seeds/myseed = /obj/item/seeds/glowshroom
/// Turfs where the glowshroom cannot spread to
var/static/list/blacklisted_glowshroom_turfs = typecacheof(list(
/turf/open/lava,
/turf/open/floor/plating/beach/water))
@@ -43,21 +50,30 @@
QDEL_NULL(myseed)
return ..()

/obj/structure/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats)
..()
/**
* Creates a new glowshroom structure.
*
* Arguments:
* * newseed - Seed of the shroom
* * mutate_stats - If the plant needs to mutate their stats
* * spread - If the plant is a result of spreading, reduce its stats
*/

/obj/structure/glowshroom/Initialize(mapload, obj/item/seeds/newseed, mutate_stats, spread)
. = ..()
if(newseed)
myseed = newseed.Copy()
myseed.forceMove(src)
else
myseed = new myseed(src)
if(spread)
myseed.potency -= round(myseed.potency * 0.25) // Reduce potency of the little mushie if it's spreading
if(mutate_stats) //baby mushrooms have different stats :3
myseed.adjust_potency(rand(-3,6))
myseed.adjust_yield(rand(-1,2))
myseed.adjust_production(rand(-3,6))
myseed.adjust_endurance(rand(-3,6))
delay = delay - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
obj_integrity = myseed.endurance
max_integrity = myseed.endurance
myseed.adjust_potency(rand(-4,3))
myseed.adjust_yield(rand(-3,2))
myseed.adjust_production(rand(-3,3))
myseed.endurance = clamp(myseed.endurance + rand(-3,2), 0, 100) // adjust_endurance has a min value of 10, need to edit directly
delay_spread = delay_spread - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
if(ispath(G)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this
myseed.genes -= G
@@ -80,13 +96,20 @@
else //if on the floor, glowshroom on-floor sprite
icon_state = base_icon_state

addtimer(CALLBACK(src, .proc/Spread), delay)
addtimer(CALLBACK(src, .proc/Spread), delay_spread)
addtimer(CALLBACK(src, .proc/Decay), delay_decay, FALSE) // Start decaying the plant

/**
* Causes glowshroom spreading across the floor/walls.
*/

/obj/structure/glowshroom/proc/Spread()
var/turf/ownturf = get_turf(src)
var/shrooms_planted = 0
for(var/i in 1 to myseed.yield)
if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
var/chance_stats = ((myseed.potency + myseed.endurance * 2) * 0.2) // Chance of generating a new mushroom based on stats
var/chance_generation = (100 / (generation * generation)) // This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
if(prob(max(chance_stats, chance_generation))) // Whatever is the higher chance we use it
var/list/possibleLocs = list()
var/spreadsIntoAdjacent = FALSE

@@ -118,16 +141,15 @@
if(shroomCount >= placeCount)
continue

var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE)
Decay(TRUE, 2) // Decay before spawning new mushrooms to reduce their endurance
var/obj/structure/glowshroom/child = new type(newLoc, myseed, TRUE, TRUE)
child.generation = generation + 1
shrooms_planted++

CHECK_TICK
else
shrooms_planted++ //if we failed due to generation, don't try to plant one later
if(shrooms_planted < myseed.yield) //if we didn't get all possible shrooms planted, try again later
myseed.yield -= shrooms_planted
addtimer(CALLBACK(src, .proc/Spread), delay)
if(shrooms_planted <= myseed.yield) //if we didn't get all possible shrooms planted, try again later
myseed.adjust_yield(-shrooms_planted)
addtimer(CALLBACK(src, .proc/Spread), delay_spread)

/obj/structure/glowshroom/proc/CalcDir(turf/location = loc)
var/direction = 16
@@ -161,6 +183,24 @@
floor = 1
return 1

/**
* Causes the glowshroom to decay by decreasing its endurance.
*
* Arguments:
* * spread - Boolean to indicate if the decay is due to spreading or natural decay.
* * amount - Amount of endurance to be reduced due to spread decay.
*/
/obj/structure/glowshroom/proc/Decay(spread, amount)
if (spread) // Decay due to spread
myseed.endurance -= amount
else // Timed decay
myseed.endurance -= 1
if (myseed.endurance > 0)
addtimer(CALLBACK(src, .proc/Decay), delay_decay, FALSE) // Recall decay timer
return
if (myseed.endurance < 1) // Plant is gone
qdel(src)

/obj/structure/glowshroom/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
if(damage_type == BURN && damage_amount)
playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
@@ -175,3 +215,8 @@
var/obj/effect/decal/cleanable/molten_object/I = new (get_turf(src))
I.desc = "Looks like this was \an [src] some time ago."
qdel(src)

/obj/structure/glowshroom/attackby(obj/item/I, mob/living/user, params)
if (istype(I, /obj/item/plant_analyzer))
return myseed.attackby(I, user, params) // Hacky I guess
return ..() // Attack normally

+ 1
- 0
code/game/objects/items/devices/PDA/PDA.dm View File

@@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(PDAs)
icon = 'icons/obj/pda.dmi'
icon_state = "pda"
inhand_icon_state = "electronic"
worn_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
item_flags = NOBLUDGEON


+ 2
- 0
code/game/objects/items/devices/scanners.dm View File

@@ -27,6 +27,7 @@ GENE SCANNER
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
inhand_icon_state = "electronic"
worn_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
custom_materials = list(/datum/material/iron=150)
@@ -81,6 +82,7 @@ GENE SCANNER
icon = 'icons/obj/device.dmi'
icon_state = "health"
inhand_icon_state = "healthanalyzer"
worn_icon_state = "healthanalyzer"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
desc = "A hand-held body scanner capable of distinguishing vital signs of the subject."


+ 2
- 0
code/game/objects/items/melee/misc.dm View File

@@ -167,6 +167,7 @@
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "classic_baton"
inhand_icon_state = "classic_baton"
worn_icon_state = "classic_baton"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
slot_flags = ITEM_SLOT_BELT
@@ -325,6 +326,7 @@
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
inhand_icon_state = null
worn_icon_state = null
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_flags = NONE


+ 1
- 0
code/game/objects/items/pinpointer.dm View File

@@ -8,6 +8,7 @@
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
inhand_icon_state = "electronic"
worn_icon_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throw_speed = 3


+ 1
- 111
code/game/objects/items/plushes.dm View File

@@ -549,117 +549,7 @@
name = "strange goat plushie"
icon_state = "goat"
desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same. Goats never change."

/obj/item/toy/plush/goatplushie/angry
var/mob/living/carbon/target
throwforce = 6
var/cooldown = 0
var/cooldown_modifier = 20

/obj/item/toy/plush/goatplushie/angry/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)

/obj/item/toy/plush/goatplushie/angry/process()
if (prob(25) && !target)
var/list/targets_to_pick_from = list()
for(var/mob/living/carbon/C in view(7, src))
if(considered_alive(C.mind) && !faction_check(list("goat"), C.faction, FALSE))
targets_to_pick_from += C
if (!targets_to_pick_from.len)
return
target = pick(targets_to_pick_from)
visible_message("<span class='notice'>[src] stares at [target].</span>")
if (world.time > cooldown && target)
ram()

/obj/item/toy/plush/goatplushie/angry/proc/ram()
if(prob(90) && isturf(loc) && considered_alive(target.mind) && !faction_check(list("goat"), target.faction, FALSE))
throw_at(target, 10, 10)
visible_message("<span class='danger'>[src] rams [target]!</span>")
cooldown = world.time + cooldown_modifier
target = null
visible_message("<span class='notice'>[src] looks disinterested.</span>")

/obj/item/toy/plush/goatplushie/angry/Destroy()
STOP_PROCESSING(SSprocessing, src)
return ..()

/obj/item/toy/plush/goatplushie
squeak_override = list('sound/items/goatsound.ogg'=1)

/obj/item/toy/plush/goatplushie/angry/realgoat
name = "goat plushie"
icon_state = "realgoat"

/obj/item/toy/plush/realgoat
name = "goat plushie"
desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same... or at least it would if it wasn't a normal plushie."
icon_state = "realgoat"
squeak_override = list('sound/items/goatsound.ogg'=1)

/obj/item/toy/plush/goatplushie/angry/kinggoat
name = "King Goat Plushie"
desc = "A plushie depicting the king of all goats."
icon_state = "kinggoat"
throwforce = 25
force = 25
attack_verb = list("chomped")
gender = MALE

/obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat
name = "Ascended King Goat Plushie"
desc = "A plushie depicting the god of all goats."
icon_state = "ascendedkinggoat"
throwforce = 30
force = 30
divine = TRUE

/obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat/attackby(obj/item/I,mob/living/user,params)
if(I.get_sharpness())
user.visible_message("<span class='notice'>[user] attempts to destroy [src]!</span>", "<span class='suicide'>[I] bounces off [src]'s back before breaking into millions of pieces... [src] glares at [user]!</span>") // You fucked up now son
I.play_tool_sound(src)
qdel(I)
user.gib()

/obj/item/toy/plush/goatplushie/angry/kinggoat/attackby(obj/item/I,mob/living/user,params)
if(I.get_sharpness())
user.visible_message("<span class='notice'>[user] rips [src] to shreds!</span>", "<span class='notice'>[src]'s death has attracted the attention of the king goat plushie guards!</span>")
I.play_tool_sound(src)
qdel(src)
var/turf/location = get_turf(user)
new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
new/obj/item/toy/plush/goatplushie/angry/guar