diff --git a/_maps/map_files/dun_world/dun_world.dmm b/_maps/map_files/dun_world/dun_world.dmm
index b4d72587..861f0339 100644
--- a/_maps/map_files/dun_world/dun_world.dmm
+++ b/_maps/map_files/dun_world/dun_world.dmm
@@ -742,7 +742,11 @@
"amy" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"amM" = (
/obj/structure/closet/crate/chest,
/obj/item/paper/scroll,
@@ -800,7 +804,11 @@
/area/rogue/indoors/town/tavern)
"aoe" = (
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aoq" = (
/obj/structure/mineral_door/wood/deadbolt,
/turf/open/floor/rogue/ruinedwood{
@@ -1209,10 +1217,18 @@
dir = 4
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"asY" = (
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ate" = (
/obj/effect/decal/cobbleedge{
dir = 1;
@@ -1845,7 +1861,11 @@
"aDh" = (
/obj/structure/stairs,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aDm" = (
/turf/open/floor/rogue/blocks/newstone/alt,
/area/rogue/indoors/town)
@@ -2011,7 +2031,11 @@
dir = 6
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aGw" = (
/obj/effect/decal/cleanable/blood{
icon_state = "floor5-old"
@@ -2230,7 +2254,11 @@
dir = 4
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aJJ" = (
/obj/structure/flora/roguegrass/herb/hypericum,
/turf/open/floor/rogue/grassyel,
@@ -2509,7 +2537,11 @@
"aNZ" = (
/obj/machinery/light/rogue/firebowl/stump,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aOc" = (
/obj/structure/fluff/railing/border{
dir = 1
@@ -2854,7 +2886,11 @@
dir = 9
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aUE" = (
/turf/closed/wall/mineral/rogue/stone,
/area/rogue/outdoors/bog)
@@ -3041,7 +3077,11 @@
"aXW" = (
/obj/structure/flora/roguetree/burnt,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"aXY" = (
/obj/structure/table/wood{
dir = 1;
@@ -3573,7 +3613,9 @@
/obj/structure/fluff/railing/border{
dir = 10
},
-/obj/structure/fluff/walldeco/steward,
+/obj/structure/fluff/walldeco/steward{
+ name = "Steward"
+ },
/turf/open/floor/rogue/herringbone,
/area/rogue/outdoors/town)
"bfO" = (
@@ -3808,7 +3850,11 @@
dir = 4
},
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bkg" = (
/obj/structure/fluff/railing/border,
/obj/structure/flora/roguegrass,
@@ -3902,7 +3948,11 @@
pixel_x = -32
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bmi" = (
/turf/open/water/river{
dir = 4;
@@ -3991,7 +4041,11 @@
"bnF" = (
/obj/structure/flora/roguegrass/herb/random,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bnJ" = (
/obj/structure/bars/passage{
density = 0;
@@ -4262,7 +4316,11 @@
"bsl" = (
/obj/structure/underworld/barrier,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bsm" = (
/turf/closed/wall/mineral/rogue/pipe,
/area/rogue/outdoors/mountains/decap/gunduzirak)
@@ -4310,7 +4368,11 @@
/area/rogue/outdoors/town/roofs)
"bsL" = (
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bsM" = (
/obj/machinery/light/rogue/wallfire/candle,
/turf/open/floor/rogue/wood/herringbone,
@@ -4518,7 +4580,11 @@
dir = 6
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bvB" = (
/obj/item/storage/roguebag,
/obj/item/storage/roguebag,
@@ -5602,7 +5668,11 @@
dir = 4
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bML" = (
/obj/structure/roguemachine/scomm/r,
/turf/open/floor/rogue/ruinedwood/spiral,
@@ -5614,7 +5684,11 @@
"bNc" = (
/obj/machinery/light/rogue/torchholder/l,
/turf/open/floor/rogue/woodturned,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bNd" = (
/obj/structure/closet/crate/drawer,
/obj/machinery/light/rogue/wallfire/candle,
@@ -5765,7 +5839,11 @@
"bQc" = (
/obj/structure/flora/roguegrass/bush,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"bQd" = (
/obj/structure/roguerock{
layer = 3.8;
@@ -7297,7 +7375,11 @@
dir = 4;
icon_state = "rockwd"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cry" = (
/obj/structure/bed/rogue/inn/double,
/obj/item/bedsheet/rogue/fabric_double,
@@ -7922,7 +8004,11 @@
/mob/living/simple_animal/hostile/retaliate/rogue/wolf,
/obj/effect/decal/cleanable/blood,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cCb" = (
/obj/structure/fluff/walldeco/church/line,
/obj/structure/fluff/walldeco/church/line{
@@ -8148,7 +8234,11 @@
/area/rogue/outdoors/mountains/decap/gunduzirak)
"cFz" = (
/turf/open/water/swamp,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cFE" = (
/obj/effect/decal/cleanable/blood/gibs/core,
/turf/open/floor/rogue/hexstone,
@@ -8321,7 +8411,11 @@
"cJa" = (
/obj/effect/spawner/roguemap/stump,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cJi" = (
/obj/structure/roguemachine/vendor{
keycontrol = "crafterguild"
@@ -8385,7 +8479,8 @@
/area/rogue/under/underdark)
"cKL" = (
/obj/structure/fluff/walldeco/bsmith{
- dir = 1
+ dir = 1;
+ name = "Crafter's Guild"
},
/turf/open/floor/rogue/cobble,
/area/rogue/outdoors/town)
@@ -8506,7 +8601,11 @@
order = 6
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cLX" = (
/obj/structure/mirror{
pixel_y = 28
@@ -8718,7 +8817,11 @@
"cOC" = (
/obj/structure/flora/roguetree/pine,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cOD" = (
/obj/item/grown/log/tree/stick,
/obj/effect/decal/cobbleedge{
@@ -8870,7 +8973,11 @@
fueluse = 1.8e+06
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cQQ" = (
/obj/structure/bars/pipe{
pixel_x = -11
@@ -8927,7 +9034,11 @@
"cRx" = (
/obj/structure/fluff/railing/border,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"cRH" = (
/obj/effect/decal/wood/herringbone{
dir = 4
@@ -9442,7 +9553,11 @@
/turf/open/floor/rogue/ruinedwood{
icon_state = "horzw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"daK" = (
/mob/living/carbon/human/species/elf/dark/drowraider,
/turf/open/floor/rogue/herringbone,
@@ -10004,7 +10119,9 @@
/turf/closed/wall/mineral/rogue/stone/moss,
/area/rogue/indoors)
"dma" = (
-/obj/structure/fluff/walldeco/bsmith,
+/obj/structure/fluff/walldeco/bsmith{
+ name = "Crafter's Guild"
+ },
/turf/open/floor/rogue/cobblerock,
/area/rogue/outdoors/town)
"dme" = (
@@ -10774,7 +10891,11 @@
/turf/open/water/river{
icon_state = "rockwd"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dzw" = (
/obj/structure/chair/wood/rogue{
dir = 1
@@ -10848,7 +10969,11 @@
"dAx" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dAz" = (
/obj/structure/boatbell/fluff,
/turf/closed/wall/mineral/rogue/wooddark,
@@ -11467,7 +11592,11 @@
pixel_y = -6
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dME" = (
/obj/structure/chair/bench/church,
/turf/open/floor/rogue/churchmarble,
@@ -11589,7 +11718,11 @@
order = 2
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dOY" = (
/obj/item/millstone{
pixel_y = 7
@@ -11824,6 +11957,9 @@
/obj/machinery/light/rogue/wallfire/candle{
pixel_y = -32
},
+/obj/structure/fluff/railing/border{
+ dir = 10
+ },
/turf/open/floor/rogue/ruinedwood{
icon_state = "weird1"
},
@@ -11862,7 +11998,11 @@
dir = 8
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dTr" = (
/obj/machinery/light/rogue/wallfire{
pixel_y = 32
@@ -11935,7 +12075,11 @@
"dUh" = (
/obj/structure/flora/roguetree/stump/log,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dUs" = (
/obj/structure/spider/stickyweb,
/mob/living/simple_animal/hostile/retaliate/rogue/bigrat,
@@ -12147,11 +12291,19 @@
"dYi" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dYq" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"dYs" = (
/obj/effect/decal/cobbleedge{
dir = 9
@@ -12385,7 +12537,11 @@
/area/rogue/outdoors/mountains/decap/gunduzirak)
"ebU" = (
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ebV" = (
/obj/structure/flora/roguegrass,
/obj/effect/decal/cobbleedge{
@@ -12453,7 +12609,11 @@
dir = 1
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ecU" = (
/obj/structure/mineral_door/wood/window,
/turf/open/floor/rogue/ruinedwood/spiral,
@@ -12596,7 +12756,11 @@
pixel_x = -8
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"efT" = (
/obj/structure/bars/passage{
max_integrity = 15000;
@@ -13102,7 +13266,11 @@
"emv" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"emE" = (
/obj/structure/bars/pipe{
dir = 6
@@ -15269,7 +15437,11 @@
"eWZ" = (
/obj/effect/decal/cobbleedge,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"eXd" = (
/obj/effect/decal/cobbleedge{
dir = 10;
@@ -15279,7 +15451,11 @@
/area/rogue/outdoors/mountains/decap/gunduzirak)
"eXh" = (
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"eXk" = (
/obj/structure/fluff/railing/wood,
/obj/effect/decal/mossy,
@@ -15520,7 +15696,11 @@
"faM" = (
/obj/structure/flora/roguegrass/herb/random,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"faW" = (
/turf/closed/wall/mineral/rogue/decostone/cand,
/area/rogue/under/underdark)
@@ -15732,7 +15912,11 @@
pixel_y = 7
},
/turf/open/floor/rogue/hexstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fdi" = (
/obj/machinery/light/rogue/wallfire/candle/r,
/obj/structure/bookcase/random,
@@ -15754,7 +15938,11 @@
dir = 4
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fdG" = (
/obj/effect/decal/mossy{
dir = 4
@@ -16051,7 +16239,11 @@
order = 3
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fhH" = (
/turf/closed/wall/mineral/rogue/wooddark/horizontal,
/area/rogue/indoors/town/church/chapel)
@@ -16069,7 +16261,11 @@
/area/rogue/outdoors/town)
"fii" = (
/turf/closed/mineral/random/rogue/med,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fiq" = (
/obj/machinery/light/rogue/torchholder/r,
/turf/open/floor/rogue/wood,
@@ -16276,7 +16472,11 @@
dir = 1;
icon_state = "vertw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fls" = (
/turf/closed/wall/mineral/rogue/wooddark/end{
dir = 8
@@ -16506,6 +16706,10 @@
},
/turf/open/floor/rogue/tile/harem2,
/area/rogue/indoors/town/bath)
+"foZ" = (
+/obj/structure/flora/roguetree/stump/log,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/mountains)
"fpd" = (
/obj/structure/fluff/railing/fence{
dir = 8
@@ -16643,7 +16847,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fqU" = (
/obj/structure/chair/stool/rogue,
/turf/open/floor/rogue/cobble,
@@ -16759,6 +16967,12 @@
},
/turf/open/floor/rogue/herringbone,
/area/rogue/outdoors/mountains/decap/gunduzirak)
+"fsG" = (
+/obj/structure/fluff/walldeco/church/line{
+ dir = 1
+ },
+/turf/open/floor/rogue/dirt/road,
+/area/rogue/under/town/basement/keep)
"fsV" = (
/obj/structure/plasticflaps,
/turf/open/floor/rogue/blocks/green,
@@ -16875,7 +17089,11 @@
dir = 1;
icon_state = "vertw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fvt" = (
/obj/structure/chair/wood/rogue/fancy,
/turf/open/floor/rogue/wood,
@@ -17157,7 +17375,11 @@
"fzO" = (
/obj/effect/spawner/roguemap/stump,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fzT" = (
/obj/effect/decal/cobbleedge{
dir = 10;
@@ -17352,7 +17574,11 @@
"fDf" = (
/obj/effect/decal/cobbleedge,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fDj" = (
/obj/structure/closet/crate/chest/gold{
locked = 1;
@@ -17754,7 +17980,11 @@
pixel_y = 1
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fKr" = (
/obj/structure/fluff/railing/border{
dir = 6
@@ -18412,7 +18642,11 @@
icon_state = "tablewood1"
},
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fVj" = (
/obj/structure/stairs,
/turf/open/floor/rogue/wood,
@@ -18425,7 +18659,11 @@
/area/rogue/indoors/town/physician)
"fVo" = (
/turf/open/water/cleanshallow,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fVv" = (
/obj/structure/glowshroom,
/turf/open/floor/rogue/blocks,
@@ -18505,7 +18743,11 @@
icon_state = "cobbleedge-w"
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"fWy" = (
/obj/structure/fluff/railing/border{
dir = 8
@@ -18926,7 +19168,11 @@
"gdz" = (
/obj/structure/flora/roguegrass/bush/wall/tall,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"gdG" = (
/obj/machinery/light/rogue/oven/east,
/turf/open/floor/rogue/ruinedwood{
@@ -19940,7 +20186,11 @@
pixel_x = 8
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"guQ" = (
/mob/living/simple_animal/pet/cat,
/turf/open/floor/rogue/wood/nosmooth,
@@ -20872,6 +21122,10 @@
/obj/structure/mineral_door/bars,
/turf/open/floor/rogue/cobble,
/area/rogue/indoors/town)
+"gIY" = (
+/obj/item/grown/log/tree/stick,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/bog)
"gJc" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/dirt,
@@ -21000,7 +21254,11 @@
/area/rogue/indoors/shelter/woods)
"gKT" = (
/turf/open/floor/rogue/wood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"gLj" = (
/obj/structure/roguemachine/scomm,
/turf/open/floor/rogue/cobble/mossy,
@@ -21374,7 +21632,11 @@
"gSH" = (
/obj/structure/flora/roguegrass/maneater,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"gSI" = (
/obj/structure/bed/rogue/inn/double{
dir = 1
@@ -22182,6 +22444,9 @@
/obj/machinery/light/rogue/wallfire/candle{
pixel_y = -32
},
+/obj/structure/fluff/railing/border{
+ dir = 6
+ },
/turf/open/floor/carpet/red,
/area/rogue/indoors/town)
"hep" = (
@@ -22283,7 +22548,11 @@
},
/obj/structure/fluff/railing/border,
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hfX" = (
/obj/structure/fluff/railing/fence{
dir = 4
@@ -22548,7 +22817,11 @@
"hjw" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hjx" = (
/obj/structure/roguewindow/openclose/reinforced{
dir = 1
@@ -22558,7 +22831,11 @@
"hjH" = (
/obj/machinery/light/rogue/firebowl/stump,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hjJ" = (
/obj/structure/fluff/railing/wood,
/turf/open/floor/rogue/dirt/road,
@@ -22766,7 +23043,11 @@
"hmZ" = (
/obj/structure/flora/roguegrass/bush,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hnf" = (
/obj/structure/closet/crate/drawer,
/turf/open/floor/carpet/royalblack,
@@ -22853,7 +23134,11 @@
"hpb" = (
/obj/structure/flora/roguegrass/bush/wall,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hpe" = (
/obj/structure/fluff/railing/border{
dir = 5;
@@ -22912,6 +23197,12 @@
},
/turf/open/floor/rogue/grassred,
/area/rogue/outdoors/rtfield/eora)
+"hqm" = (
+/obj/structure/roguemachine/withdraw{
+ pixel_y = -32
+ },
+/turf/open/floor/rogue/tile/bath,
+/area/rogue/under/town/basement/keep)
"hqn" = (
/obj/structure/fermentation_keg/crafted,
/turf/open/floor/rogue/ruinedwood{
@@ -23026,7 +23317,11 @@
"hrq" = (
/obj/structure/flora/roguetree/burnt,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hrB" = (
/turf/open/floor/rogue/wood/herringbone,
/area/rogue/indoors/town)
@@ -23139,7 +23434,11 @@
dir = 5
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hsY" = (
/obj/structure/bed/rogue/inn/double,
/obj/item/bedsheet/rogue/double_pelt,
@@ -23662,7 +23961,11 @@
dir = 1
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hzo" = (
/obj/structure/closet/crate/roguecloset/inn,
/obj/item/flashlight/flare/torch/lantern,
@@ -24422,7 +24725,11 @@
dir = 5
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"hMz" = (
/obj/structure/spider/stickyweb,
/obj/effect/spawner/lootdrop/roguetown/sewers,
@@ -25235,7 +25542,11 @@
/area/rogue/indoors/town/church/chapel)
"ibp" = (
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ibB" = (
/obj/structure/stairs{
dir = 8
@@ -25895,7 +26206,11 @@
"ikY" = (
/obj/structure/flora/roguegrass/bush,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ila" = (
/obj/structure/fluff/railing/border,
/turf/open/floor/rogue/wood,
@@ -26583,7 +26898,11 @@
"ivQ" = (
/obj/structure/closet/dirthole/closed/loot,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iwm" = (
/obj/structure/vine{
opacity = 1
@@ -27006,7 +27325,11 @@
"iCR" = (
/obj/structure/fluff/big_chain,
/turf/closed/wall/mineral/rogue/wooddark/vertical,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iCY" = (
/obj/structure/closet/crate/chest,
/obj/item/natural/bundle/cloth{
@@ -27152,7 +27475,11 @@
/area/rogue/indoors/town/manor)
"iFe" = (
/turf/open/floor/rogue/hexstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iFi" = (
/obj/structure/fluff/railing/border{
dir = 9
@@ -27445,7 +27772,11 @@
"iJY" = (
/obj/structure/chair/stool/rogue,
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iKc" = (
/obj/structure/stairs{
dir = 4
@@ -27612,13 +27943,21 @@
order = 5
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iMa" = (
/turf/open/floor/rogue/carpet,
/area/rogue/outdoors/mountains/decap/gunduzirak)
"iMd" = (
/turf/closed/mineral/random/rogue/high,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iMf" = (
/obj/item/chair/rogue{
dir = 8
@@ -27923,7 +28262,11 @@
dir = 8
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iQE" = (
/obj/structure/fluff/railing/border{
dir = 1
@@ -28362,7 +28705,11 @@
"iXt" = (
/obj/structure/closet/crate/chest/wicker,
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"iXI" = (
/obj/machinery/gear_painter,
/turf/open/floor/rogue/carpet,
@@ -29161,7 +29508,11 @@
},
/obj/machinery/light/rogue/torchholder/c,
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"jjC" = (
/obj/effect/landmark/start/wretchlate,
/turf/open/floor/rogue/naturalstone,
@@ -30659,7 +31010,11 @@
pixel_y = 0
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"jMh" = (
/obj/machinery/light/rogue/torchholder/l,
/turf/open/floor/rogue/blocks,
@@ -30691,7 +31046,11 @@
"jMU" = (
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"jMW" = (
/turf/closed/wall/mineral/rogue/decostone,
/area/rogue/indoors/shelter/woods)
@@ -30948,7 +31307,8 @@
/area/rogue/indoors)
"jRb" = (
/obj/structure/fluff/sellsign{
- name = "CONDEMNED BY THE HOLY SEE"
+ name = "CONDEMNED BY THE HOLY SEE";
+ desc = "CONDEMNED BY THE HOLY SEE"
},
/turf/open/floor/rogue/dirt/road,
/area/rogue/outdoors/mountains/decap)
@@ -30995,7 +31355,11 @@
dir = 1
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"jSd" = (
/obj/structure/rack/rogue,
/obj/item/rogueweapon/shovel,
@@ -31146,7 +31510,11 @@
dir = 8
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"jUD" = (
/obj/machinery/light/rogue/wallfire/candle/blue,
/obj/structure/flora/roguegrass,
@@ -32179,7 +32547,11 @@
"kkN" = (
/obj/structure/far_travel,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kkP" = (
/turf/closed/wall/mineral/rogue/stonebrick,
/area/rogue/under/cavewet/bogcaves/sunkencity)
@@ -32645,7 +33017,11 @@
pixel_x = -8
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kuo" = (
/obj/structure/spider/stickyweb{
icon_state = "stickyweb2"
@@ -32660,7 +33036,11 @@
},
/obj/machinery/light/rogue/chand,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kus" = (
/turf/open/floor/carpet/royalblack,
/area/rogue/indoors/town/magician)
@@ -32775,7 +33155,11 @@
/area/rogue/outdoors/mountains/decap/gunduzirak)
"kvV" = (
/turf/open/floor/rogue/woodturned,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kwd" = (
/obj/structure/fluff/walldeco/church/line,
/mob/living/simple_animal/hostile/rogue/skeleton/bow,
@@ -32889,7 +33273,11 @@
"kxD" = (
/obj/effect/decal/cleanable/blood,
/turf/closed/mineral/random/rogue/med,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kxJ" = (
/obj/effect/decal/wood/herringbone2{
dir = 1
@@ -32976,7 +33364,11 @@
"kzg" = (
/obj/structure/underworld/barrier,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kzh" = (
/obj/structure/bars,
/turf/open/water/ocean,
@@ -33860,7 +34252,11 @@
dir = 8
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kMO" = (
/obj/effect/decal/cleanable/blood/tracks{
dir = 4
@@ -34248,7 +34644,11 @@
"kTT" = (
/obj/structure/flora/roguegrass/herb/random,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"kUb" = (
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/rogue/hexstone,
@@ -34830,7 +35230,11 @@
"ldD" = (
/obj/structure/fluff/railing/border,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ldE" = (
/obj/structure/chair/bench{
dir = 1
@@ -35153,7 +35557,11 @@
"liK" = (
/obj/structure/flora/roguetree/pine,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"liV" = (
/turf/closed/wall/mineral/rogue/roofwall/outercorner{
dir = 8
@@ -36006,6 +36414,12 @@
/obj/item/natural/dirtclod,
/turf/open/floor/rogue/naturalstone,
/area/rogue/under/cavewet/bogcaves)
+"luF" = (
+/obj/structure/fluff/signage{
+ name = "AZURE PEAK - NORTH"
+ },
+/turf/open/floor/rogue/dirt/road,
+/area/rogue/outdoors/woods)
"luY" = (
/obj/structure/roguewindow/harem2{
density = 0
@@ -36253,6 +36667,12 @@
icon_state = "weird1"
},
/area/rogue/indoors/cave)
+"lzm" = (
+/obj/structure/fluff/signage{
+ name = "AZURE PEAK - NORTH EAST"
+ },
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/indoors/shelter/woods)
"lzp" = (
/obj/structure/chair/wood/rogue{
dir = 4
@@ -37044,7 +37464,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"lLV" = (
/obj/structure/table/wood{
icon_state = "map3"
@@ -37393,7 +37817,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/flora/ausbushes/brflowers,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"lRG" = (
/obj/structure/fluff/railing/border{
dir = 4
@@ -38751,7 +39179,11 @@
"moR" = (
/obj/structure/chair/stool/rogue,
/turf/open/floor/rogue/woodturned,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"mpo" = (
/obj/structure/table/wood{
dir = 1;
@@ -39007,7 +39439,11 @@
/obj/structure/flora/roguegrass/herb/random,
/obj/structure/roguemachine/noticeboard,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"mtE" = (
/obj/structure/fluff/clock,
/obj/effect/decal/cleanable/dirt/dust,
@@ -39190,6 +39626,11 @@
/obj/structure/stairs,
/turf/open/floor/rogue/dirt/road,
/area/rogue/indoors/cave)
+"mwP" = (
+/obj/structure/fluff/alch,
+/obj/effect/decal/cleanable/dirt/cobweb,
+/turf/open/floor/rogue/tile/bath,
+/area/rogue/under/town/basement/keep)
"mwQ" = (
/obj/structure/bed/rogue/inn/wooldouble,
/obj/item/bedsheet/rogue/fabric_double,
@@ -39719,7 +40160,11 @@
dir = 8
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"mGt" = (
/obj/effect/decal/cobbleedge{
dir = 10;
@@ -39730,7 +40175,11 @@
"mGv" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"mGw" = (
/obj/structure/fermentation_keg/random/beer,
/turf/open/floor/rogue/ruinedwood{
@@ -40389,6 +40838,14 @@
},
/turf/open/floor/rogue/dirt/road,
/area/rogue/outdoors/town)
+"mRn" = (
+/obj/structure/roguerock,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"mRo" = (
/obj/machinery/light/rogue/firebowl,
/turf/open/floor/rogue/wood,
@@ -40832,6 +41289,12 @@
icon_state = "weird1"
},
/area/rogue/indoors/town/manor)
+"mYE" = (
+/obj/machinery/light/rogue/wallfire/candle/blue,
+/obj/item/reagent_containers/glass/bucket,
+/obj/structure/roguemachine/scomm/r,
+/turf/open/floor/rogue/tile/bath,
+/area/rogue/under/town/basement/keep)
"mYK" = (
/obj/structure/fermentation_keg/random/water,
/turf/open/floor/rogue/cobble,
@@ -40865,7 +41328,11 @@
dir = 1
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"mZe" = (
/obj/machinery/light/rogue/wallfire/candle/off/l,
/obj/structure/bed/rogue/inn,
@@ -41540,7 +42007,11 @@
dir = 8
},
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nkf" = (
/obj/structure/bookcase,
/obj/item/book/rogue/blackmountain,
@@ -41671,7 +42142,11 @@
pixel_y = 9
},
/turf/open/floor/rogue/woodturned,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nmh" = (
/obj/structure/mineral_door/bars,
/turf/open/floor/rogue/blocks/green,
@@ -41825,7 +42300,11 @@
dir = 1
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nnP" = (
/obj/structure/fluff/walldeco/rpainting/forest{
pixel_y = 32
@@ -42010,7 +42489,11 @@
"nqp" = (
/obj/structure/fluff/walldeco/customflag,
/turf/closed/wall/mineral/rogue/wooddark,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nqq" = (
/obj/structure/fluff/railing/border{
dir = 4
@@ -42190,7 +42673,11 @@
"ntX" = (
/obj/machinery/light/rogue/firebowl/stump,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ntY" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grass,
@@ -42610,7 +43097,11 @@
/area/rogue/under/cavewet/bogcaves/sunkencity)
"nBX" = (
/turf/closed/mineral/rogue/bedrock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nCc" = (
/turf/closed/wall/mineral/rogue/pipe{
dir = 8;
@@ -42677,7 +43168,11 @@
dir = 6
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nDn" = (
/obj/structure/mineral_door/wood{
locked = 1;
@@ -42853,7 +43348,11 @@
"nFq" = (
/obj/machinery/light/rogue/lanternpost,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nFt" = (
/obj/item/natural/stone{
pixel_x = 8;
@@ -42947,7 +43446,11 @@
"nHc" = (
/obj/structure/telescope,
/turf/open/floor/rogue/woodturned,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nHj" = (
/turf/closed/wall/mineral/rogue/stonebrick,
/area/rogue/indoors/shelter)
@@ -43430,7 +43933,11 @@
dir = 9
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"nOq" = (
/obj/structure/fluff/railing/border{
dir = 4
@@ -44229,7 +44736,11 @@
pixel_y = -6
},
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oay" = (
/obj/structure/fluff/walldeco/rpainting/forest{
pixel_y = 32
@@ -44447,7 +44958,11 @@
dir = 10
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oen" = (
/obj/structure/table/wood{
icon_state = "longtable"
@@ -44476,7 +44991,11 @@
order = 1
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oeF" = (
/obj/structure/stairs/fancy/c{
dir = 1
@@ -44530,7 +45049,11 @@
"ofG" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/grasscold,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ofJ" = (
/obj/structure/fluff/walldeco/chains,
/turf/open/floor/rogue/concrete,
@@ -44744,7 +45267,11 @@
},
/obj/item/rogueweapon/huntingknife/stoneknife,
/turf/open/floor/rogue/hexstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oiX" = (
/obj/structure/bed/rogue/inn,
/obj/item/bedsheet/rogue/pelt,
@@ -44763,7 +45290,11 @@
"ojA" = (
/obj/structure/flora/roguegrass/bush/wall/tall,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ojI" = (
/obj/structure/table/wood{
dir = 8;
@@ -44859,7 +45390,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"olz" = (
/obj/structure/pillory{
lockid = list("church")
@@ -44894,7 +45429,11 @@
"omD" = (
/obj/structure/flora/roguetree/burnt,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"omX" = (
/turf/closed/wall/mineral/rogue/roofwall/innercorner{
dir = 1
@@ -44940,7 +45479,11 @@
"ool" = (
/obj/structure/underworld/barrier,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oou" = (
/obj/machinery/light/rogue/hearth,
/obj/item/reagent_containers/glass/bucket/pot{
@@ -45281,7 +45824,11 @@
dir = 1
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ovf" = (
/obj/structure/fluff/railing/border{
dir = 10
@@ -45331,6 +45878,9 @@
dir = 4
},
/area/rogue/indoors/town)
+"owC" = (
+/turf/open/floor/rogue/greenstone,
+/area/rogue/outdoors/mountains)
"owJ" = (
/obj/machinery/light/rogue/torchholder/c,
/obj/structure/table/wood{
@@ -45572,7 +46122,11 @@
dir = 4
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oAq" = (
/obj/structure/roguewindow/openclose/reinforced{
dir = 8
@@ -46725,7 +47279,11 @@
order = 7
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"oUv" = (
/turf/closed/wall/mineral/rogue/decostone,
/area/rogue/indoors/cave)
@@ -47517,7 +48075,11 @@
dir = 6
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pgv" = (
/obj/effect/decal/mossy{
dir = 8
@@ -47639,6 +48201,10 @@
/obj/structure/fluff/psycross,
/turf/open/floor/rogue/dirt/road,
/area/rogue/outdoors/town)
+"phZ" = (
+/obj/effect/decal/remains/human,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/mountains)
"pia" = (
/obj/structure/fluff/railing/border{
dir = 9
@@ -47767,7 +48333,11 @@
"pjV" = (
/mob/living/simple_animal/hostile/retaliate/rogue/mudcrab,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pkc" = (
/obj/structure/glowshroom,
/turf/open/floor/rogue/dirt/road,
@@ -48458,7 +49028,11 @@
/area/rogue/indoors/town)
"pxF" = (
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pxV" = (
/obj/structure/glowshroom{
icon_state = "glowshroom3"
@@ -48712,7 +49286,11 @@
dir = 8
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pBg" = (
/obj/structure/fluff/littlebanners/bluewhite{
pixel_y = -6
@@ -48798,7 +49376,11 @@
dir = 5
},
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pCb" = (
/obj/structure/fluff/railing/border,
/obj/structure/roguemachine/scomm/l,
@@ -49251,7 +49833,11 @@
icon_state = "tablewood1"
},
/turf/open/floor/rogue/woodturned,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pJo" = (
/obj/structure/fermentation_keg/water,
/obj/machinery/light/rogue/wallfire/candle/l,
@@ -49357,7 +49943,11 @@
},
/obj/machinery/light/rogue/torchholder/c,
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pKP" = (
/obj/effect/spawner/lootdrop/roguetown/dungeon/armor,
/turf/open/floor/rogue/naturalstone,
@@ -49582,7 +50172,11 @@
/turf/open/floor/rogue/ruinedwood{
icon_state = "horzw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pOL" = (
/obj/structure/stairs,
/obj/structure/fluff/railing/border{
@@ -49811,7 +50405,11 @@
/area/rogue/under/cave/dungeon1/gethsmane/inner)
"pSg" = (
/turf/closed/mineral/random/rogue,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pSm" = (
/mob/living/simple_animal/hostile/retaliate/rogue/mudcrab,
/turf/open/floor/rogue/dirt/road,
@@ -49909,7 +50507,11 @@
/obj/structure/flora/ausbushes/ppflowers,
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pTX" = (
/obj/effect/landmark/quest_spawner/medium,
/turf/open/floor/rogue/naturalstone,
@@ -49986,6 +50588,10 @@
/obj/structure/roguemachine/scomm/r,
/turf/open/floor/rogue/ruinedwood/herringbone,
/area/rogue/indoors/town/magician)
+"pVz" = (
+/obj/structure/chair/stool/rogue,
+/turf/open/floor/rogue/tile/bath,
+/area/rogue/under/town/basement/keep)
"pVA" = (
/obj/machinery/light/rogue/wallfire/candle/blue/r,
/turf/open/water/bath,
@@ -50140,7 +50746,11 @@
dir = 4
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"pXL" = (
/obj/structure/chair/wood/rogue/chair3{
dir = 4
@@ -50813,7 +51423,11 @@
dir = 1;
icon_state = "vertw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"qjb" = (
/obj/effect/decal/cobbleedge{
dir = 10;
@@ -51389,7 +52003,11 @@
"qrY" = (
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"qsl" = (
/obj/structure/bookcase/random/archive,
/obj/effect/decal/wood/herringbone2{
@@ -51581,7 +52199,11 @@
"quW" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"qvc" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 4
@@ -51794,7 +52416,11 @@
dir = 1;
icon_state = "vertw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"qxL" = (
/obj/machinery/light/rogue/torchholder/r,
/turf/open/floor/rogue/hexstone,
@@ -52467,7 +53093,8 @@
/obj/structure/fluff/walldeco/bsmith{
dir = 1;
pixel_x = 7;
- pixel_y = 0
+ pixel_y = 0;
+ name = "Crafter's Guild"
},
/turf/open/floor/rogue/cobblerock,
/area/rogue/outdoors/town)
@@ -52616,7 +53243,11 @@
/area/rogue/outdoors/town/roofs/keep)
"qJA" = (
/turf/open/floor/rogue/grasscold,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"qJB" = (
/obj/structure/rack/rogue/shelf/biggest,
/obj/item/reagent_containers/glass/bottle/rogue,
@@ -53308,6 +53939,16 @@
},
/turf/open/floor/rogue/grassred,
/area/rogue/outdoors/town)
+"qWg" = (
+/obj/structure/bars{
+ color = "#755f48";
+ name = "rusted bars"
+ },
+/turf/open/water/river{
+ dir = 4;
+ icon_state = "rockwd"
+ },
+/area/rogue/outdoors/mountains)
"qWm" = (
/obj/structure/closet/crate/drawer,
/turf/open/floor/carpet/stellar,
@@ -54093,7 +54734,11 @@
"rjw" = (
/obj/structure/telescope,
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"rjF" = (
/obj/structure/closet/crate/roguecloset,
/obj/item/clothing/suit/roguetown/shirt/tunic,
@@ -54605,7 +55250,11 @@
dir = 5
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"rsA" = (
/obj/structure/bars/pipe{
dir = 8
@@ -54870,7 +55519,11 @@
"rxe" = (
/obj/structure/fluff/railing/border,
/turf/open/transparent/openspace,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"rxg" = (
/obj/item/roguebin/water/gross,
/turf/open/floor/rogue/blocks,
@@ -55714,7 +56367,9 @@
/turf/open/floor/rogue/cobble,
/area/rogue/under/town/basement)
"rLe" = (
-/obj/structure/fluff/walldeco/sign/merchantsign,
+/obj/structure/fluff/walldeco/sign/merchantsign{
+ name = "MERCHANT"
+ },
/turf/open/floor/rogue/cobble,
/area/rogue/outdoors/town)
"rLh" = (
@@ -56623,7 +57278,11 @@
/area/rogue/indoors/town)
"rZO" = (
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sae" = (
/obj/effect/landmark/quest_spawner/medium,
/turf/closed/mineral/rogue/bedrock,
@@ -56901,7 +57560,11 @@
"seL" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"seN" = (
/obj/structure/flora/ausbushes/lavendergrass,
/obj/structure/flora/roguegrass,
@@ -56943,7 +57606,11 @@
dir = 8
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sfP" = (
/obj/structure/roguewindow/stained/zizo,
/turf/closed/wall/mineral/rogue/stone,
@@ -56971,7 +57638,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/flora/ausbushes/ppflowers,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sgI" = (
/obj/structure/fluff/railing/wood{
dir = 4
@@ -57025,7 +57696,8 @@
/area/rogue/outdoors/town)
"shc" = (
/obj/structure/fluff/walldeco/steward{
- dir = 1
+ dir = 1;
+ name = "Steward"
},
/turf/open/floor/rogue/cobble,
/area/rogue/outdoors/town)
@@ -57329,7 +58001,11 @@
"sln" = (
/obj/effect/decal/remains/wolf,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"slp" = (
/obj/item/ash,
/obj/effect/decal/cleanable/dirt/dust,
@@ -58258,7 +58934,11 @@
},
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sxm" = (
/obj/structure/bars,
/turf/open/water/swamp,
@@ -58403,7 +59083,11 @@
"szF" = (
/obj/structure/chair/stool/rogue,
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"szH" = (
/obj/structure/chair/stool/rogue,
/turf/open/floor/rogue/ruinedwood/spiral,
@@ -59055,7 +59739,11 @@
"sMJ" = (
/obj/machinery/gear_painter,
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sMN" = (
/turf/closed/wall/mineral/rogue/roofwall/middle,
/area/rogue/indoors/town)
@@ -59087,9 +59775,8 @@
/turf/open/floor/rogue/wood,
/area/rogue/indoors/shelter/woods)
"sNq" = (
-/obj/machinery/light/rogue/wallfire/candle/blue,
-/obj/item/reagent_containers/glass/bucket,
-/turf/open/floor/rogue/tile/bath,
+/obj/structure/fluff/walldeco/church/line,
+/turf/open/floor/rogue/dirt/road,
/area/rogue/under/town/basement/keep)
"sNy" = (
/obj/item/reagent_containers/food/snacks/crow,
@@ -59117,7 +59804,11 @@
/area/rogue/outdoors/beach/forest)
"sNZ" = (
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sOa" = (
/obj/item/book/rogue/law,
/obj/structure/table/wood{
@@ -59222,7 +59913,15 @@
/area/rogue/indoors/town/physician)
"sPF" = (
/turf/closed/wall/mineral/rogue/wooddark,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
+"sPI" = (
+/obj/structure/glowshroom,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/mountains)
"sPL" = (
/obj/structure/fluff/railing/border{
dir = 6
@@ -59471,7 +60170,11 @@
"sTy" = (
/obj/structure/flora/ausbushes/ppflowers,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"sTz" = (
/obj/machinery/light/rogue/forge,
/turf/open/floor/rogue/cobble,
@@ -59642,13 +60345,10 @@
/turf/open/floor/rogue/concrete,
/area/rogue/indoors/shelter)
"sWu" = (
-/obj/structure/chair/stool/rogue,
-/obj/structure/roguemachine/withdraw{
- pixel_x = -32;
- pixel_y = 0
- },
-/turf/open/floor/rogue/tile/bath,
-/area/rogue/under/town/basement/keep)
+/obj/machinery/light/rogue/hearth,
+/obj/item/cooking/pan,
+/turf/open/floor/rogue/cobble,
+/area/rogue/indoors/town)
"sWE" = (
/turf/closed/wall/mineral/rogue/decostone/long,
/area/rogue/under/cave/dukecourt)
@@ -60116,7 +60816,11 @@
dir = 8
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tdA" = (
/obj/structure/closet/crate/roguecloset/inn,
/obj/effect/spawner/lootdrop/roguetown/dungeon/clothing,
@@ -60651,7 +61355,11 @@
dir = 6
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tlZ" = (
/obj/machinery/light/rogue/torchholder/l,
/obj/effect/decal/cleanable/dirt/cobweb{
@@ -60871,7 +61579,11 @@
},
/obj/item/chair/stool/bar/rogue,
/turf/open/floor/rogue/wood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tpj" = (
/obj/machinery/light/rogue/firebowl/standing/blue,
/turf/open/floor/rogue/churchrough,
@@ -61008,7 +61720,11 @@
"trV" = (
/obj/structure/flora/ausbushes/ywflowers,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"trX" = (
/obj/structure/bars/pipe,
/turf/closed/mineral/rogue/bedrock,
@@ -61247,7 +61963,9 @@
/obj/structure/fluff/railing/border{
dir = 9
},
-/obj/structure/fluff/walldeco/steward,
+/obj/structure/fluff/walldeco/steward{
+ name = "Steward"
+ },
/turf/open/floor/rogue/herringbone,
/area/rogue/outdoors/town)
"tvL" = (
@@ -61427,7 +62145,11 @@
order = 4
},
/turf/open/floor/rogue/cobblerock,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tyd" = (
/obj/structure/bed/rogue/inn/hay,
/turf/open/floor/rogue/ruinedwood/turned,
@@ -62131,7 +62853,11 @@
"tKn" = (
/obj/machinery/light/rogue/firebowl/stump,
/turf/open/floor/rogue/hexstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tKo" = (
/obj/structure/flora/roguegrass/herb/random,
/turf/open/floor/rogue/dirt/road,
@@ -62147,7 +62873,11 @@
dir = 4
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tKP" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/grassred,
@@ -62283,7 +63013,11 @@
"tMO" = (
/obj/structure/flora/roguegrass/bush/wall,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tNa" = (
/obj/structure/flora/rogueshroom/happy/mushroom3,
/turf/open/floor/rogue/dirt,
@@ -63089,7 +63823,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/flora/ausbushes/ppflowers,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"tYQ" = (
/obj/machinery/light/rogue/torchholder/hotspring/standing,
/obj/structure/flora/roguegrass,
@@ -63185,7 +63923,11 @@
/area/rogue/outdoors/town)
"uaw" = (
/turf/closed/wall/mineral/rogue/decostone/mossy/cand,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"uaE" = (
/obj/structure/fluff/clock,
/turf/open/floor/rogue/ruinedwood/spiral,
@@ -63682,6 +64424,10 @@
/obj/machinery/light/rogue/firebowl/standing/blue,
/turf/open/floor/rogue/blocks,
/area/rogue/outdoors/mountains/decap/stepbelow)
+"uhT" = (
+/obj/item/grown/log/tree/stick,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/mountains)
"uhV" = (
/obj/structure/stairs{
dir = 8
@@ -64678,7 +65424,11 @@
/turf/open/floor/rogue/ruinedwood{
icon_state = "horzw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"uxk" = (
/obj/structure/closet/crate/chest/crate,
/obj/effect/spawner/lootdrop/roguetown/dungeon/armor,
@@ -66031,7 +66781,11 @@
dir = 5
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"uSi" = (
/obj/structure/fluff/railing/wood{
layer = 4.51
@@ -66095,7 +66849,11 @@
/turf/open/floor/rogue/ruinedwood{
icon_state = "horzw"
},
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"uSZ" = (
/obj/structure/table/wood{
dir = 1;
@@ -66396,7 +67154,11 @@
"uYe" = (
/obj/structure/flora/roguegrass/herb/random,
/turf/open/floor/rogue/grasscold,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"uYh" = (
/obj/structure/closet/crate/roguecloset/inn,
/obj/item/reagent_containers/glass/bucket,
@@ -66416,7 +67178,11 @@
dir = 8
},
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"uYz" = (
/obj/structure/chair/stool/rogue,
/turf/open/floor/carpet/red,
@@ -67115,7 +67881,11 @@
"vjN" = (
/obj/item/natural/rock,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"vjP" = (
/obj/structure/table/wood,
/obj/effect/spawner/lootdrop/potion_poisons,
@@ -67422,7 +68192,11 @@
dir = 4
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"voH" = (
/turf/open/floor/carpet/red,
/area/rogue/outdoors/mountains/decap)
@@ -67740,7 +68514,11 @@
/area/rogue/under/cave/dukecourt)
"vtR" = (
/turf/open/floor/rogue/tile,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"vtV" = (
/mob/living/carbon/human/species/dwarfskeleton/ambush,
/turf/open/floor/rogue/cobble,
@@ -68226,7 +69004,11 @@
"vBt" = (
/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"vBu" = (
/obj/structure/table/wood{
icon_state = "tablewood1"
@@ -68409,7 +69191,11 @@
"vET" = (
/obj/structure/flora/newtree,
/turf/open/floor/rogue/dirt,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"vFb" = (
/obj/structure/stairs{
dir = 8
@@ -69125,8 +69911,6 @@
/turf/open/floor/rogue/concrete,
/area/rogue/under/cave/goblinfort)
"vPq" = (
-/obj/effect/decal/cleanable/dirt/cobweb,
-/obj/structure/fluff/alch,
/obj/machinery/light/rogue/wallfire/candle/blue,
/turf/open/floor/rogue/tile/bath,
/area/rogue/under/town/basement/keep)
@@ -70594,7 +71378,11 @@
pixel_y = 32
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wmi" = (
/obj/effect/decal/cobbleedge{
dir = 10
@@ -70650,7 +71438,11 @@
dir = 1
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wnd" = (
/obj/structure/bookcase{
name = "suspicious bookcase"
@@ -71036,7 +71828,11 @@
/obj/structure/flora/ausbushes/brflowers,
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wup" = (
/obj/structure/stairs{
dir = 1
@@ -71221,7 +72017,11 @@
"wxn" = (
/obj/effect/decal/cleanable/blood,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wxq" = (
/obj/structure/rack/rogue,
/obj/item/clothing/suit/roguetown/armor/leather/cuirass,
@@ -71236,7 +72036,11 @@
"wxw" = (
/obj/machinery/light/rogue/firebowl/stump,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wxD" = (
/obj/effect/decal/cobbleedge{
icon_state = "cobbleedge-sread"
@@ -71663,7 +72467,11 @@
pixel_y = 0
},
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wEE" = (
/obj/item/grown/log/tree/stick,
/turf/open/floor/rogue/rooftop{
@@ -72287,7 +73095,11 @@
"wOl" = (
/obj/effect/spawner/roguemap/stump,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wOr" = (
/obj/item/natural/rock,
/turf/open/floor/rogue/dirt/road,
@@ -72378,7 +73190,11 @@
"wQg" = (
/obj/structure/flora/ausbushes/ppflowers,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wQn" = (
/obj/structure/mineral_door/bars{
lockid = "farm"
@@ -72563,7 +73379,11 @@
"wSV" = (
/obj/item/roguegem/random,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wTi" = (
/obj/machinery/light/rogue/wallfire/candle,
/obj/structure/closet/crate/roguecloset/dark,
@@ -72849,7 +73669,11 @@
/obj/structure/flora/roguegrass/maneater,
/obj/structure/flora/roguetree/pine,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"wYo" = (
/obj/structure/fluff/railing/fence{
dir = 1
@@ -73072,7 +73896,11 @@
"xbo" = (
/obj/structure/flora/roguegrass/herb/random,
/turf/open/floor/rogue/grassyel,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xbr" = (
/obj/structure/fluff/railing/wood{
dir = 4;
@@ -73430,6 +74258,13 @@
/obj/machinery/light/rogue/torchholder/r,
/turf/open/floor/rogue/naturalstone,
/area/rogue/outdoors/beach)
+"xgJ" = (
+/obj/structure/bars{
+ color = "#755f48";
+ name = "rusted bars"
+ },
+/turf/open/water/cleanshallow,
+/area/rogue/outdoors/mountains)
"xgP" = (
/obj/structure/fluff/railing/border{
dir = 5
@@ -73646,10 +74481,14 @@
/area/rogue/indoors/town/physician)
"xkL" = (
/obj/structure/fluff/signage{
- name = "AZURE PEAK - NORTH"
+ name = "AZURE PEAK - NORTH EAST"
},
/turf/open/floor/rogue/dirt/road,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xkS" = (
/obj/item/grown/log/tree/small,
/turf/open/floor/rogue/ruinedwood,
@@ -73713,7 +74552,11 @@
dir = 1
},
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xlK" = (
/obj/structure/flora/roguegrass,
/turf/open/floor/rogue/grassred,
@@ -74109,7 +74952,11 @@
"xrZ" = (
/mob/living/simple_animal/hostile/retaliate/rogue/wolf,
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xsb" = (
/obj/structure/bars/pipe{
pixel_y = 8
@@ -74901,7 +75748,11 @@
"xFw" = (
/obj/effect/spawner/roguemap/stump,
/turf/open/floor/rogue/grassred,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xFB" = (
/obj/structure/fluff/walldeco/church/line,
/turf/open/floor/rogue/churchrough,
@@ -75689,7 +76540,11 @@
dir = 4
},
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xSh" = (
/obj/structure/fluff/railing/border{
dir = 8
@@ -75736,7 +76591,11 @@
/obj/structure/flora/roguegrass,
/obj/structure/roguemachine/boardbarrier,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"xSz" = (
/obj/structure/fluff/walldeco/chains,
/turf/open/floor/rogue/blocks,
@@ -75813,6 +76672,10 @@
},
/turf/open/floor/rogue/grass,
/area/rogue/under/cavewet/bogcaves/sunkencity)
+"xTB" = (
+/obj/structure/roguerock,
+/turf/open/floor/rogue/naturalstone,
+/area/rogue/outdoors/mountains)
"xTX" = (
/obj/machinery/light/rogue/chand{
light_on = 0
@@ -76224,7 +77087,11 @@
pixel_y = -6
},
/turf/open/floor/rogue/ruinedwood,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ybD" = (
/mob/living/carbon/human/species/skeleton/no_equipment,
/turf/open/floor/rogue/cobble,
@@ -76355,7 +77222,11 @@
pixel_x = -8
},
/turf/open/floor/rogue/naturalstone,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"ycZ" = (
/obj/structure/chair/wood/rogue/chair3{
dir = 8
@@ -76761,7 +77632,11 @@
"yjq" = (
/obj/structure/flora/roguetree/burnt,
/turf/open/floor/rogue/grass,
-/area/rogue/outdoors/rtfield)
+/area/rogue/outdoors/rtfield{
+ ambush_mobs = null;
+ ambush_times = null;
+ ambush_types = null
+ })
"yju" = (
/obj/structure/roguemachine/mail{
mailtag = "Steward";
@@ -176531,11 +177406,11 @@ iad
dlK
opX
opX
-opX
jEk
mMx
fAL
opX
+opX
xSV
nnq
gUI
@@ -176983,12 +177858,12 @@ iad
ogs
ogs
ogs
-ogs
xAN
-mMx
+urZ
xAN
ogs
ogs
+ogs
nnq
bHV
bHV
@@ -177435,12 +178310,12 @@ iad
iad
ogs
ogs
-ogs
xAN
-ylh
+mMx
xAN
ogs
ogs
+ogs
nnq
alb
bHV
@@ -177887,10 +178762,10 @@ laF
vtx
ogs
ogs
+dlK
+ylh
+dlK
ogs
-xAN
-urZ
-xAN
ogs
ogs
nnq
@@ -178337,13 +179212,13 @@ wAx
eWv
mPH
vtx
-ogs
-ogs
-ogs
-xAN
-mMx
-xAN
-ogs
+nnq
+nnq
+nnq
+cWV
+nnq
+nnq
+nnq
nnq
nnq
tkl
@@ -178789,13 +179664,13 @@ iad
sfH
rPN
iad
-ogs
-ogs
-ogs
-dlK
-ylh
-dlK
-ogs
+nnq
+sNq
+mmB
+mmB
+mmB
+fsG
+nnq
nnq
jxg
bHV
@@ -179241,12 +180116,12 @@ iad
xdz
dJv
iad
-ogs
-nnq
-nnq
-nnq
-cWV
nnq
+sNq
+mmB
+mmB
+mmB
+fsG
nnq
nnq
jxg
@@ -179696,7 +180571,7 @@ iad
nnq
nnq
vPq
-sWu
+mmB
mmB
irJ
nnq
@@ -180146,8 +181021,8 @@ vtx
ogs
ogs
nnq
-vlq
-mmB
+mwP
+pVz
mmB
mmB
suN
@@ -180598,7 +181473,7 @@ iad
ogs
ogs
nnq
-qJB
+vlq
mmB
mmB
mmB
@@ -181050,7 +181925,7 @@ iad
ogs
ogs
nnq
-jhF
+qJB
mmB
mmB
mmB
@@ -181502,7 +182377,7 @@ ogs
ogs
ogs
nnq
-nLo
+jhF
mmB
mmB
mmB
@@ -181954,11 +182829,11 @@ ogs
ogs
ogs
nnq
-oIF
+nLo
mmB
-lks
-oth
-oth
+mmB
+mmB
+hqm
nnq
nnq
rBl
@@ -182406,11 +183281,11 @@ ogs
ogs
ogs
nnq
-nnq
-sNq
-tfm
-bZI
-fwW
+oIF
+mmB
+lks
+oth
+oth
nnq
ylO
kIs
@@ -182857,12 +183732,12 @@ ogs
ogs
ogs
ogs
-ogs
-nnq
nnq
nnq
-ngv
-nnq
+mYE
+tfm
+bZI
+fwW
nnq
qRl
kIs
@@ -183310,11 +184185,11 @@ ogs
ogs
ogs
ogs
-ogs
-ogs
-ogs
-ogs
-ogs
+nnq
+nnq
+nnq
+ngv
+nnq
nnq
nnq
nnq
@@ -253917,11 +254792,11 @@ pSg
pSg
bhJ
bhJ
-tlS
psV
psV
psV
psV
+tlS
psV
psV
psV
@@ -254373,7 +255248,7 @@ psV
psV
psV
psV
-psV
+lzm
psV
psV
psV
@@ -254394,7 +255269,7 @@ niV
niV
niV
niV
-niV
+luF
niV
uWS
uWS
@@ -256930,7 +257805,7 @@ fii
fii
fii
fii
-aoe
+mRn
aoe
pSg
pSg
@@ -257088,7 +257963,7 @@ psV
psV
psV
psV
-tlS
+psV
bhJ
bhJ
bhJ
@@ -262834,8 +263709,8 @@ snj
uBc
faB
sId
-xWk
-cDX
+ozA
+sWu
uBc
iJQ
qyR
@@ -263738,8 +264613,8 @@ hVW
uBc
jKv
wGB
-sYZ
-cDX
+iRg
+sWu
uBc
qyR
qyR
@@ -341081,7 +341956,7 @@ vQH
vQH
vhs
tYx
-mrW
+pct
tYx
qUs
tYx
@@ -343333,7 +344208,7 @@ qwK
qwK
qwK
mrW
-mrW
+pct
mrW
mrW
tYx
@@ -343793,7 +344668,7 @@ vhs
vQH
vQH
tYx
-mrW
+pct
mrW
qUs
mrW
@@ -344697,7 +345572,7 @@ hgc
vhs
ylq
mrW
-mrW
+bHE
mrW
sLh
sLh
@@ -345148,7 +346023,7 @@ czH
vhs
vhs
tYx
-mrW
+pct
mrW
mrW
sLh
@@ -345611,7 +346486,7 @@ czH
czH
mrW
mrW
-mrW
+pct
hVK
vhs
vQH
@@ -346975,7 +347850,7 @@ vQH
tYx
mrW
mrW
-sLh
+hsv
sLh
tYx
vQH
@@ -350561,7 +351436,7 @@ qwK
qwK
qwK
qwK
-mrW
+pct
tYx
tYx
tYx
@@ -351024,7 +351899,7 @@ tYx
tYx
mrW
mrW
-hsv
+sLh
sLh
mrW
vQH
@@ -351476,8 +352351,8 @@ czH
tYx
mrW
pZv
-bHE
-hsv
+mrW
+sLh
sLh
sLh
qUs
@@ -352854,7 +353729,7 @@ czH
czH
czH
czH
-wXJ
+gIY
wXJ
tYx
tYx
@@ -353299,7 +354174,7 @@ eGx
eGx
eGx
eGx
-fZN
+phZ
fZN
fZN
uxZ
@@ -353307,7 +354182,7 @@ gkI
uxZ
fZN
fZN
-fZN
+sBc
eGx
eGx
eGx
@@ -353752,8 +354627,8 @@ qwK
qwK
eGx
eGx
-fZN
-fZN
+sPI
+uhT
uxZ
gkI
uxZ
@@ -354204,12 +355079,12 @@ qwK
eGx
eGx
eGx
-fZN
+sBc
fZN
uxZ
gkI
uxZ
-fZN
+uhT
fZN
vvB
vvB
@@ -354243,7 +355118,7 @@ fZN
fZN
fZN
fZN
-fZN
+xTB
fZN
fZN
fZN
@@ -354657,11 +355532,11 @@ eGx
eGx
eGx
vvB
-fZN
+phZ
uxZ
gkI
uxZ
-fZN
+foZ
vvB
vvB
eGx
@@ -355108,13 +355983,13 @@ rZO
quW
eGx
eGx
-vvB
-fZN
-uxZ
-gkI
-uxZ
-fZN
-vvB
+fjj
+fjj
+xgJ
+qWg
+xgJ
+fjj
+fjj
vvB
eGx
eGx
@@ -360114,7 +360989,7 @@ qwK
qwK
qwK
fZN
-fZN
+xTB
fZN
qwK
qwK
@@ -470370,12 +471245,12 @@ aBB
bMk
vBH
pHH
-aBB
-aBB
-aBB
-aBB
-aBB
-vvB
+owC
+owC
+owC
+owC
+owC
+owC
vvB
vvB
vvB
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index 17f668fc..6c95cfd6 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -158,7 +158,7 @@
#define EYE_COLOR_LIST list("#865900", "#06b400", "#312f27", "#008e83", "#002d8e", "#c16c00")
#define MIN_PENIS_SIZE 1
-#define MAX_PENIS_SIZE 3
+#define MAX_PENIS_SIZE 5
#define DEFAULT_PENIS_SIZE 2
#define PENIS_TYPE_PLAIN 1
@@ -177,14 +177,15 @@
#define ERECT_STATE_NONE 0
#define ERECT_STATE_PARTIAL 1
-#define ERECT_STATE_HARD 2
+#define ERECT_STATE_STIFF 2
+#define ERECT_STATE_HARD 3
#define MIN_TESTICLES_SIZE 1
-#define MAX_TESTICLES_SIZE 3
+#define MAX_TESTICLES_SIZE 5
#define DEFAULT_TESTICLES_SIZE 2
#define MIN_BREASTS_SIZE 0
-#define MAX_BREASTS_SIZE 10
+#define MAX_BREASTS_SIZE 16
#define DEFAULT_BREASTS_SIZE 3
#define DEFAULT_BELLY_SIZE 0
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index d7ed5063..9057c561 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -77,7 +77,9 @@
//AND -1 MEANS "ABOVE", OK?, OK!?!
#define ABOVE_SHOES_LAYER (SHOES_LAYER-1)
-#define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1)
+#define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-3)
+#define BODY_FRONTER_LAYER (BODY_FRONT_LAYER-1) // Put it on top of the top, silly!
+#define BODY_FRONTEST_LAYER (BODY_FRONT_LAYER-2)
//Security levels
#define SEC_LEVEL_GREEN 0
diff --git a/code/__DEFINES/roguetown.dm b/code/__DEFINES/roguetown.dm
index 19d3055a..84bdfe96 100644
--- a/code/__DEFINES/roguetown.dm
+++ b/code/__DEFINES/roguetown.dm
@@ -142,6 +142,7 @@
//Antag / Special / Unique armor defines
#define ARMOR_VAMP list("blunt" = 100, "slash" = 100, "stab" = 90, "piercing" = 0, "fire" = 0, "acid" = 0)
#define ARMOR_WWOLF list("blunt" = 100, "slash" = 90, "stab" = 80, "piercing" = 70, "fire" = 40, "acid" = 0)
+#define ARMOR_NATURAL list("blunt" = 100, "slash" = 70, "stab" = 60, "piercing" = 40, "fire" = 0, "acid" = 0)
#define ARMOR_DRAGONSCALE list("blunt" = 100, "slash" = 100, "stab" = 100, "fire" = 50, "acid" = 0)
#define ARMOR_ASCENDANT list("blunt" = 50, "slash" = 100, "stab" = 80, "piercing" = 80, "fire" = 0, "acid" = 0)
#define ARMOR_SPELLSINGER list("blunt" = 70, "slash" = 70, "stab" = 50, "piercing" = 30, "fire" = 0, "acid" = 0)
@@ -213,6 +214,7 @@
/datum/species/akula,\
/datum/species/anthromorph,\
/datum/species/demihuman,\
+ /datum/species/harpy,\
#define RACES_SHUNNED \
@@ -255,6 +257,7 @@
/datum/species/kobold,\
/datum/species/goblinp,\
/datum/species/construct/metal,\
+ /datum/species/harpy,\
)
#define CLOTHED_RACES_TYPES list(\
@@ -279,6 +282,7 @@
/datum/species/kobold,\
/datum/species/goblinp,\
/datum/species/construct/metal,\
+ /datum/species/harpy,\
)
// Non-dwarf non-kobold non-goblin mostly
#define NON_DWARVEN_RACE_TYPES list(\
@@ -299,6 +303,7 @@
/datum/species/demihuman,\
/datum/species/halforc,\
/datum/species/construct/metal,\
+ /datum/species/harpy,\
)
// Non-elf non-dwarf non-kobold non-goblin mostly
#define HUMANLIKE_RACE_TYPES list(\
@@ -315,6 +320,7 @@
/datum/species/anthromorph,\
/datum/species/demihuman,\
/datum/species/construct/metal,\
+ /datum/species/harpy,\
)
#define ALL_CLERIC_PATRONS list(/datum/patron/divine/astrata, /datum/patron/divine/noc, /datum/patron/divine/dendor, /datum/patron/divine/necra, /datum/patron/divine/pestra, /datum/patron/divine/ravox, /datum/patron/divine/malum, /datum/patron/divine/eora) // Currently unused.
@@ -397,6 +403,7 @@ GLOBAL_LIST_EMPTY(round_join_times)
#define CTAG_PILGRIM "CAT_PILGRIM" // Pilgrim classes
#define CTAG_ADVENTURER "CAT_ADVENTURER" // Adventurer classes
#define CTAG_TOWNER "CAT_TOWNER" // Villager class - Villagers can use it
+#define CTAG_SHOPHAND "CAT_SHOPHAND" // Shophand classes
#define CTAG_ANTAG "CAT_ANTAG" // Antag class - results in an antag
#define CTAG_BANDIT "CAT_BANDIT" // Bandit class - Tied to the bandit antag really
#define CTAG_CHALLENGE "CAT_CHALLENGE" // Challenge class - Meant to be free for everyone
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 42889136..61085018 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -64,6 +64,8 @@
#define TRAIT_INFINITE_ENERGY "Boundless Energy" //infinite fatigue (blue bar) but not infinite stamina
#define TRAIT_PERMAMUTE "Permanent Mute"
#define TRAIT_HERESIARCH "Forbidden Knowledge" //allows entry to ascendant church
+#define TRAIT_FERAL "Feral Natured" //likes being in the woods, hates being in the city
+#define TRAIT_NECRAS_ABATEMENT "Necra's Abatement" //keeps deadites from doing much of anything in town
//Hearthstone port (Tracking)
@@ -164,6 +166,7 @@
#define TRAIT_NECRAS_VOW "Necra's Vow"
// ARMOR / CLOTHING GIVEN TRAITS (GIVEN BY WEARING CLOTHES/ARMOR PIECES)
#define TRAIT_MONK_ROBE "Holy Vestatures"
+#define TRAIT_NATURAL_ARMOR "Natural Armor"
GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_LEPROSY = span_necrosis("I'm a disgusting leper..."),
@@ -296,6 +299,9 @@ GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_PERMAMUTE = span_notice("I am a mute. I cannot speak."),
TRAIT_STRENGTH_UNCAPPED = span_warning("MY STRENGTH IS UNBOUND!"),
TRAIT_MONK_ROBE = span_notice("I feel closer to the gods in my meager robes.. I feel vigorous, empowered by their light!"),
+ TRAIT_NATURAL_ARMOR = span_notice("My hide is thick and resilient. It will regenerate so long as I keep it fed..."),
+ TRAIT_FERAL = span_info("The wilds is where I am meant to be. Civilized realms are no place for the likes of me."),
+ TRAIT_NECRAS_ABATEMENT = span_info("The Undermaiden's gaze lingers upon me, and intensifies as I draw closer to hallowed ground."),
TRAIT_EORAN_CALM = span_notice("Eora has touched me, granting me some calm. She protects me from the peaks of my stress."),
TRAIT_EORAN_SERENE = span_greentext("Eora has blessed me with all-encompassing serenity. I feel no more stress."),
TRAIT_NECRAS_VOW = span_warning("I've pledged myself to Necra. If I fall, I am Hers."),
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 2c2ed618..bfc21fa7 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -63,6 +63,10 @@
var/datum/virtue/virtue = new path()
GLOB.virtues[path] = virtue
+ for (var/path in subtypesof(/datum/sizecat))
+ var/datum/sizecat/sc = new path()
+ GLOB.sizecats[path] = sc
+
// Loadout items
for (var/path in subtypesof(/datum/loadout_item))
var/datum/loadout_item/loadout_item = new path()
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index fd138b39..05fd8593 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -132,7 +132,7 @@
log_game("The round has ended.")
to_chat(world, "
So ends this tale on Azure Peak.")
- get_end_reason()
+ //get_end_reason()
var/list/key_list = list()
for(var/client/C in GLOB.clients)
@@ -214,7 +214,7 @@
ready_for_reboot = TRUE
standard_reboot()
-/datum/controller/subsystem/ticker/proc/get_end_reason()
+/*/datum/controller/subsystem/ticker/proc/get_end_reason()
var/end_reason
if(!check_for_lord())
@@ -238,7 +238,7 @@
if(end_reason)
to_chat(world, span_bigbold("[end_reason]."))
else
- to_chat(world, span_bigbold("The town has managed to survive another week."))
+ to_chat(world, span_bigbold("The town has managed to survive another week."))*/
/datum/controller/subsystem/ticker/proc/gamemode_report()
var/list/all_teams = list()
diff --git a/code/_globalvars/customization/organ_customization.dm b/code/_globalvars/customization/organ_customization.dm
index e1150183..733e50b5 100644
--- a/code/_globalvars/customization/organ_customization.dm
+++ b/code/_globalvars/customization/organ_customization.dm
@@ -27,6 +27,12 @@ GLOBAL_LIST_INIT(named_breast_sizes, list(
"gargantuan" = 8,
"colossal" = 9,
"ungodly big" = 10,
+ "gigantic" = 11,
+ "titanic" = 12,
+ "obscenely large" = 13,
+ "over-endowed" = 14,
+ "unholy" = 15,
+ "baothan-sized" = 16,
))
GLOBAL_LIST_INIT(named_belly_sizes, list(
@@ -70,12 +76,13 @@ GLOBAL_LIST_INIT(customizers, build_customizers())
.[type] = new type()
return .
-/proc/color_pick_sanitized(mob/user, description, title, default_value, min_tag = 0.07, max_tag = 0.80)
+/proc/color_pick_sanitized(mob/user, description, title, default_value)
var/color = input(user, description, title, default_value) as color|null
- var/good = TRUE
+ //var/good = TRUE
if(!color)
return
color = sanitize_hexcolor(color)
+ /*
var/list/hsl = rgb2hsl(hex2num(copytext(color,1,3)),hex2num(copytext(color,3,5)),hex2num(copytext(color,5,7)))
if(hsl[3] < min_tag)
to_chat(user, span_warning("The picked color is too dark! Raising Luminosity to minimum 20%."))
@@ -87,6 +94,7 @@ GLOBAL_LIST_INIT(customizers, build_customizers())
good = FALSE
if(!good)
var/list/rgb = hsl2rgb(arglist(hsl))
- color = sanitize_hexcolor("[num2hex(rgb[1])][num2hex(rgb[2])][num2hex(rgb[3])]")
+ color = sanitize_hexcolor("[num2hex(rgb[1])][num2hex(rgb[2])][num2hex(rgb[3])]")
+ */
return color
diff --git a/code/_globalvars/special_traits.dm b/code/_globalvars/special_traits.dm
index 1acfe8f4..31f41721 100644
--- a/code/_globalvars/special_traits.dm
+++ b/code/_globalvars/special_traits.dm
@@ -37,12 +37,17 @@ GLOBAL_LIST_INIT(special_traits, build_special_traits())
apply_charflaw_equipment(character, player)
apply_prefs_special(character, player)
apply_prefs_virtue(character, player)
+ apply_prefs_sizecat(character,player)
if(player.prefs.loadout)
character.mind.special_items[player.prefs.loadout::name] += player.prefs.loadout.path
if(player.prefs.loadout2)
character.mind.special_items[player.prefs.loadout2::name] += player.prefs.loadout2.path
if(player.prefs.loadout3)
character.mind.special_items[player.prefs.loadout3::name] += player.prefs.loadout3.path
+ if(player.prefs.loadout4)
+ character.mind.special_items[player.prefs.loadout4::name] += player.prefs.loadout4.path
+ if(player.prefs.loadout5)
+ character.mind.special_items[player.prefs.loadout5::name] += player.prefs.loadout5.path
/proc/apply_prefs_virtue(mob/living/carbon/human/character, client/player)
if (!player)
@@ -62,6 +67,7 @@ GLOBAL_LIST_INIT(special_traits, build_special_traits())
var/datum/virtue/virtue_type = player.prefs.virtue
var/datum/virtue/virtuetwo_type = player.prefs.virtuetwo
+ var/datum/virtue/extravirtue_type = player.prefs.extravirtue
if(virtue_type)
if(virtue_check(virtue_type, heretic))
apply_virtue(character, virtue_type)
@@ -72,6 +78,12 @@ GLOBAL_LIST_INIT(special_traits, build_special_traits())
apply_virtue(character, virtuetwo_type)
else
to_chat(character, "Incorrect Second Virtue parameters! (Heretic virtue on a non-heretic) It will not be applied.")
+ if(extravirtue_type)
+ if(virtue_check(extravirtue_type, heretic))
+ apply_virtue(character, extravirtue_type)
+ else
+ to_chat(character, "Incorrect Second Virtue parameters! (Heretic virtue on a non-heretic) It will not be applied.")
+
/proc/virtue_check(var/datum/virtue/V, heretic = FALSE)
if(V)
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 30ffd680..09ca9cc6 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -127,6 +127,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
TRAIT_BLACKLEG,
TRAIT_PERMAMUTE,
TRAIT_MONK_ROBE,
+ TRAIT_NATURAL_ARMOR,
+ TRAIT_FERAL,
+ TRAIT_NECRAS_ABATEMENT,
),
/obj/item/bodypart = list(
"TRAIT_PARALYSIS" = TRAIT_PARALYSIS
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index cd5177cd..29470326 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -136,7 +136,10 @@
if(H.craftingthing)
last_craft = world.time
var/datum/component/personal_crafting/C = H.craftingthing
- C.roguecraft(location, control, params, H)
+ if(H.client.legacycraft)
+ C.roguecraft(location, control, params, H)
+ else
+ C.ui_interact(H)
else
testing("what")
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 9bac0428..9726254c 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -141,7 +141,7 @@ SUBSYSTEM_DEF(job)
if(length(job.allowed_patrons) && !(player.client.prefs.selected_patron.type in job.allowed_patrons))
JobDebug("FOC incompatible with patron, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions)))
+ if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions) || (player.client.prefs.extravirtue?.type in job.virtue_restrictions)))
JobDebug("FOC incompatible with virtues, Player: [player], Job: [job.title], Virtue 1: [player.client.prefs.virtue.name]")
continue
if(length(job.vice_restrictions) && (player.client.prefs.charflaw.type in job.vice_restrictions))
@@ -221,7 +221,7 @@ SUBSYSTEM_DEF(job)
JobDebug("GRJ incompatible with patron, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions)))
+ if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions) || (player.client.prefs.extravirtue?.type in job.virtue_restrictions)))
JobDebug("GRJ incompatible with virtues, Player: [player], Job: [job.title], Virtue 1: [player.client.prefs.virtue.name]")
continue
@@ -463,7 +463,7 @@ SUBSYSTEM_DEF(job)
JobDebug("DO incompatible with patron, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions)))
+ if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions) || (player.client.prefs.extravirtue?.type in job.virtue_restrictions)))
JobDebug("DO incompatible with virtues, Player: [player], Job: [job.title], Virtue 1: [player.client.prefs.virtue.name]")
continue
@@ -564,7 +564,7 @@ SUBSYSTEM_DEF(job)
if(length(job.allowed_patrons) && !(player.client.prefs.selected_patron.type in job.allowed_patrons))
continue
- if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions)))
+ if(length(job.virtue_restrictions) && ((player.client.prefs.virtue.type in job.virtue_restrictions) || (player.client.prefs.virtuetwo?.type in job.virtue_restrictions) || (player.client.prefs.extravirtue?.type in job.virtue_restrictions)))
continue
if(length(job.vice_restrictions) && (player.client.prefs.charflaw.type in job.vice_restrictions))
diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm
index 877f4669..5b72e884 100644
--- a/code/datums/components/caltrop.dm
+++ b/code/datums/components/caltrop.dm
@@ -24,7 +24,8 @@
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
- if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE))
+ var/is_taur = !!H.get_taur_tail()
+ if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE) || is_taur)
return
if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK)
diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm
index 0ce5bcee..a4dac439 100644
--- a/code/datums/components/crafting/crafting.dm
+++ b/code/datums/components/crafting/crafting.dm
@@ -26,6 +26,7 @@
var/datum/action/innate/crafting/button
var/display_craftable_only = TRUE
var/display_compact = TRUE
+ var/showonlycraftable = TRUE
@@ -443,7 +444,7 @@
if(user == parent)
ui_interact(user)
-/datum/component/personal_crafting/ui_interact(mob/user, datum/tgui/ui)
+/*/datum/component/personal_crafting/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
cur_category = categories[1]
@@ -454,15 +455,11 @@
cur_subcategory = CAT_NONE
ui = new(user, src, "PersonalCrafting", "Crafting Menu", 700, 800)
ui.set_state(GLOB.not_incapacitated_turf_state)
- ui.open()
+ ui.open()*/
/datum/component/personal_crafting/ui_data(mob/user)
var/list/data = list()
data["busy"] = busy
- data["category"] = cur_category
- data["subcategory"] = cur_subcategory
- data["display_craftable_only"] = display_craftable_only
- data["display_compact"] = display_compact
var/list/surroundings = get_surroundings(user)
var/list/craftability = list()
@@ -472,12 +469,10 @@
if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
continue
- if((R.category != cur_category) || (R.subcategory != cur_subcategory))
- continue
-
- craftability["[REF(R)]"] = check_contents(R, surroundings)
+ craftability[R.name] = check_contents(R, surroundings)
data["craftability"] = craftability
+ data["showonlycraftable"] = showonlycraftable
return data
/datum/component/personal_crafting/ui_static_data(mob/user)
@@ -492,24 +487,37 @@
if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
continue
-
- if(isnull(crafting_recipes[R.category]))
- crafting_recipes[R.category] = list()
-
- if(R.subcategory == CAT_NONE)
- crafting_recipes[R.category] += list(build_recipe_data(R))
+ var/category
+ if(R.skillcraft)
+ var/datum/skill/S = new R.skillcraft()
+ category = S.name
else
- if(isnull(crafting_recipes[R.category][R.subcategory]))
- crafting_recipes[R.category][R.subcategory] = list()
- crafting_recipes[R.category]["has_subcats"] = TRUE
- crafting_recipes[R.category][R.subcategory] += list(build_recipe_data(R))
+ category = "Other"
+ if(isnull(crafting_recipes[category]))
+ crafting_recipes[category] = list()
+ crafting_recipes[category] += list(build_recipe_data(R))
data["crafting_recipes"] = crafting_recipes
return data
+/datum/component/personal_crafting/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "MiaCraft", "Crafting Menu", 700, 800)
+ ui.set_state(GLOB.not_incapacitated_turf_state)
+ ui.open()
/datum/component/personal_crafting/ui_act(action, params)
- if(..())
+ . = ..()
+ switch(action)
+ if("craft")
+ var/path = text2path(params["item"])
+ var/recipe = new path
+ construct_item(usr, recipe)
+ usr.mind.lastrecipe = recipe
+ if("checkboxonlycraftable")
+ showonlycraftable = params["state"]
+ /*if(..())
return
switch(action)
if("make")
@@ -536,12 +544,14 @@
cur_subcategory = ""
else
cur_subcategory = params["subcategory"]
- . = TRUE
+ . = TRUE*/
/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
var/list/data = list()
data["name"] = R.name
data["ref"] = "[REF(R)]"
+ data["path"] = R.type
+ data["sellprice"] = R.sellprice
var/req_text = ""
var/tool_text = ""
var/catalyst_text = ""
@@ -569,6 +579,9 @@
tool_text = replacetext(tool_text,",","",-1)
data["tool_text"] = tool_text
+ data["craftingdifficulty"] = R.craftdiff
+
+
return data
//Mind helpers
@@ -586,6 +599,7 @@
// new crafting button interaction
/datum/component/personal_crafting/proc/roguecraft(location, control, params, mob/user)
+
if(user.doing)
return
var/area/A = get_area(user)
@@ -635,3 +649,13 @@
if(r)
construct_item(user, r)
user.mind.lastrecipe = r
+
+
+/client/verb/toggle_legacycraft()
+ set name = "Toggle legacy craft"
+ set category = "Options"
+ set desc = "Toggles between legacy and miacraft"
+ usr.client.legacycraft = !legacycraft
+
+/client
+ var/legacycraft = FALSE
\ No newline at end of file
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 343fc5a9..284e3ba3 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -125,7 +125,7 @@
if(prob(20))
if(carbon_owner)
carbon_owner.handle_dreams()
- if(prob(10) && owner.health > owner.crit_threshold)
+ if(prob(10) && owner.health > owner.crit_threshold && !istype(owner.loc, /obj/belly))
owner.emote("snore")
/atom/movable/screen/alert/status_effect/asleep
diff --git a/code/datums/status_effects/rogue/roguebuff.dm b/code/datums/status_effects/rogue/roguebuff.dm
index fa7da7bb..e4f05e97 100644
--- a/code/datums/status_effects/rogue/roguebuff.dm
+++ b/code/datums/status_effects/rogue/roguebuff.dm
@@ -370,6 +370,16 @@
desc = "This is my sanctuary. I can overpower any opposition that dares breach it."
icon_state = "buff"
+/atom/movable/screen/alert/status_effect/buff/feraldebuff
+ name = "Feral Natured"
+ desc = "These civilized realms are not meant for me. I can feel the walls closing in."
+ icon_state = "debuff"
+
+/atom/movable/screen/alert/status_effect/buff/deaditepacified
+ name = "Necra's Abatement"
+ desc = "Necra's gaze weighs down upon me within these hallowed grounds. I am pacified."
+ icon_state = "debuff"
+
/datum/status_effect/buff/wardenbuff
id = "wardenbuff"
alert_type = /atom/movable/screen/alert/status_effect/buff/wardenbuff
@@ -392,6 +402,29 @@
alert_type = /atom/movable/screen/alert/status_effect/buff/guardbuffone
effectedstats = list("constitution" = 1,"endurance" = 1, "speed" = 1, "perception" = 2)
+/datum/status_effect/buff/feraldebuff
+ id = "feraldebuff"
+ alert_type = /atom/movable/screen/alert/status_effect/buff/feraldebuff
+ effectedstats = list("perception" = -5, "speed" = -2, "strength" = -4, "endurance" = -4, "constitution" = -3)
+
+/datum/status_effect/buff/feraldebuff/process()
+
+ .=..()
+ var/area/rogue/our_area = get_area(owner)
+ if(!(our_area.town_area))
+ owner.remove_status_effect(/datum/status_effect/buff/feraldebuff)
+
+/datum/status_effect/buff/deadite_pacified
+ id = "deaditepacified"
+ alert_type = /atom/movable/screen/alert/status_effect/buff/deaditepacified
+
+/datum/status_effect/buff/deadite_pacified/process()
+
+ .=..()
+ var/area/rogue/our_area = get_area(owner)
+ if(!(our_area.town_area))
+ owner.remove_status_effect(/datum/status_effect/buff/deadite_pacified)
+
/datum/status_effect/buff/dungeoneerbuff
id = "dungeoneerbuff"
alert_type = /atom/movable/screen/alert/status_effect/buff/dungeoneerbuff
@@ -419,6 +452,14 @@
. = ..()
REMOVE_TRAIT(owner, TRAIT_LONGSTRIDER, TRAIT_GENERIC)
+/datum/status_effect/buff/deadite_pacified/on_apply()
+ . = ..()
+ ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_GENERIC)
+
+/datum/status_effect/buff/deadite_pacified/on_remove()
+ . = ..()
+ REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_GENERIC)
+
/datum/status_effect/buff/dungeoneerbuff/process()
.=..()
diff --git a/code/game/area/roguetownareas.dm b/code/game/area/roguetownareas.dm
index 118557a7..84f92ac4 100644
--- a/code/game/area/roguetownareas.dm
+++ b/code/game/area/roguetownareas.dm
@@ -28,6 +28,12 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town
if((src.town_area == TRUE) && HAS_TRAIT(guy, TRAIT_GUARDSMAN) && !guy.has_status_effect(/datum/status_effect/buff/guardbuffone)) //man at arms
guy.apply_status_effect(/datum/status_effect/buff/guardbuffone)
+/area/rogue/Entered(mob/living/carbon/human/guy)
+
+ . = ..()
+ if((src.town_area == TRUE) && HAS_TRAIT(guy, TRAIT_FERAL) && !guy.has_status_effect(/datum/status_effect/buff/feraldebuff)) //feral creatures don't do well in town
+ guy.apply_status_effect(/datum/status_effect/buff/feraldebuff)
+
/area/rogue/Entered(mob/living/carbon/human/guy)
. = ..()
@@ -46,6 +52,12 @@ GLOBAL_LIST_INIT(roguetown_areas_typecache, typecacheof(/area/rogue/indoors/town
if((src.cell_area == TRUE) && HAS_TRAIT(guy, TRAIT_DUNGEONMASTER) && !guy.has_status_effect(/datum/status_effect/buff/dungeoneerbuff)) // Dungeoneer
guy.apply_status_effect(/datum/status_effect/buff/dungeoneerbuff)
+/area/rogue/Entered(mob/living/carbon/human/guy)
+
+ . = ..()
+ if((src.town_area == TRUE) && HAS_TRAIT(guy, TRAIT_NECRAS_ABATEMENT) && !guy.has_status_effect(/datum/status_effect/buff/deadite_pacified)) //zombie pacification
+ guy.apply_status_effect(/datum/status_effect/buff/deadite_pacified)
+
/area/rogue/indoors
name = "indoors rt"
icon_state = "indoors"
diff --git a/code/game/objects/items/rogueitems/gems.dm b/code/game/objects/items/rogueitems/gems.dm
index e41ea1e7..2014f099 100644
--- a/code/game/objects/items/rogueitems/gems.dm
+++ b/code/game/objects/items/rogueitems/gems.dm
@@ -207,3 +207,40 @@
/datum/crafting_recipe/roguetown/survival/bpearlcross,
/datum/crafting_recipe/roguetown/survival/abyssoramulet
)
+
+
+/obj/item/reformation_gem
+ name = "gem of reformation"
+ icon = 'icons/roguetown/items/gems.dmi'
+ icon_state = "reform_gem"
+ desc = "A sickly green gem that pulses with strange powers native to this region of the world."
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ slot_flags = ITEM_SLOT_MOUTH
+ dropshrink = 0.4
+ drop_sound = 'sound/items/gem.ogg'
+ sellprice = 1 //you get NOTHING
+ var/reform_outline = "reform_outline"
+
+/obj/item/reformation_gem/Initialize()
+ . = ..()
+ src.add_filter(reform_outline, 2, list("type" = "outline", "color" = "#ff0080", "alpha" = 100, "size" = 1.5))
+
+/obj/item/reformation_gem/attack_self(mob/living/user)
+ ..()
+ var/confirm = alert(user,"Are you sure you wish to use your gem of reformation here?","Confirmation","Yes","Cancel")
+ if(confirm == "Yes")
+ var/turf/target_turf = get_step(user, user.dir)
+ if(target_turf.is_blocked_turf(TRUE))
+ to_chat(user, span_warning("The targeted location is blocked, I cannot create a reformation gate here."))
+ return FALSE
+ if(isopenturf(target_turf))
+ create_portal(user, target_turf)
+ return TRUE
+ return NONE
+
+/obj/item/reformation_gem/proc/create_portal(mob/user, atom/location)
+ to_chat(user, "You create a reformation portal!")
+ new /obj/structure/respawn_portal(location)
+ qdel(src)
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 0a863d95..f9e6124f 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -32,9 +32,9 @@
if(soundping)
ping_sound(source)
- var/list/muffled_listeners = list() //this is very rudimentary list of muffled listeners above and below to mimic sound muffling (this is done through modifying the playsounds for them)
+ //var/list/muffled_listeners = list() //this is very rudimentary list of muffled listeners above and below to mimic sound muffling (this is done through modifying the playsounds for them) <-- no it ain't you forgot to use this var
if(!ignore_walls) //these sounds don't carry through walls or vertically
- listeners = listeners & hearers(maxdistance,turf_source)
+ listeners = listeners & get_hearers_in_view(maxdistance,turf_source)
else
if(above_turf)
listeners += SSmobs.clients_by_zlevel[above_turf.z]
@@ -48,20 +48,20 @@
. = list()
for(var/mob/M as anything in listeners)
- if(get_dist(M, turf_source) <= maxdistance)
+ if(get_dist(get_turf(M), turf_source) <= maxdistance)
if(animal_pref)
if(M.client?.prefs?.mute_animal_emotes)
continue
if(M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, repeat))
. += M
-
- for(var/mob/M as anything in muffled_listeners)
+ //This slop never runs because muffled listeners will always be empty and instead muffling runs on playsound_local
+ /*for(var/mob/M as anything in muffled_listeners)
if(get_dist(M, turf_source) <= maxdistance)
if(animal_pref)
if(M.client?.prefs?.mute_animal_emotes)
continue
if(M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, repeat, muffled = TRUE))
- . += M
+ . += M*/
/proc/ping_sound(atom/A)
@@ -117,7 +117,7 @@
S.volume = vol2use
- var/area/A = get_area(src)
+ var/area/A = get_area(get_turf(src))
if(A)
if(A.soundenv != -1)
S.environment = A.soundenv
@@ -132,7 +132,6 @@
//sound volume falloff with distance
var/distance = get_dist(T, turf_source)
-
S.volume -= (distance * (0.10 * S.volume)) //10% each step
/*
if(pressure_affected)
@@ -157,19 +156,19 @@
if(S.volume <= 0)
return FALSE //No sound
-
- var/dx = turf_source.x - x
+ var/atom/our_turf = get_turf(src)
+ var/dx = turf_source.x - our_turf.x
if(dx <= 1 && dx >= -1)
S.x = 0
else
S.x = dx
- var/dz = turf_source.y - y
+ var/dz = turf_source.y - our_turf.y
if(dz <= 1 && dz >= -1)
S.z = 0
else
S.z = dz
- var/dy = turf_source.z - z
+ var/dy = turf_source.z - our_turf.z
S.y = dy
S.falloff = (falloff ? falloff : FALLOFF_SOUNDS)
diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm
index e68c21ef..b20b838a 100644
--- a/code/game/turfs/open/water.dm
+++ b/code/game/turfs/open/water.dm
@@ -154,6 +154,9 @@
qdel(F)
if(isliving(AM) && !AM.throwing)
var/mob/living/L = AM
+ if (istype(src,/turf/open/water/bloody))
+ L.add_mob_blood(L)
+
if(!(L.mobility_flags & MOBILITY_STAND) || water_level == 3)
L.SoakMob(FULL_BODY)
else
@@ -206,22 +209,43 @@
return
var/list/wash = list('sound/foley/waterwash (1).ogg','sound/foley/waterwash (2).ogg')
playsound(user, pick_n_take(wash), 100, FALSE)
- var/item2wash = user.get_active_held_item()
+ var/obj/item2wash = user.get_active_held_item()
if(!item2wash)
user.visible_message(span_info("[user] starts to wash in [src]."))
if(do_after(L, 3 SECONDS, target = src))
if(wash_in)
wash_atom(user, CLEAN_STRONG)
+ user.remove_stress(/datum/stressevent/sewertouched)
playsound(user, pick(wash), 100, FALSE)
+ if(istype(src,/turf/open/water/sewer) || istype(src,/turf/open/water/swamp) || istype(src, /turf/open/water/sewer))
+ if (istype(src, /turf/open/water/sewer))
+ user.add_stress(/datum/stressevent/sewertouched)
+ if (!HAS_TRAIT(L,TRAIT_LEECHIMMUNE)) // cleaning yourself in nasty water is a wonderful way to get leeches.
+ if (prob(20)) // 1 in 5 chance of getting leeched if you wash up in gross water.
+ var/list/zones = list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_NECK, BODY_ZONE_HEAD)
+ var/zone = pick(zones)
+ var/obj/item/bodypart/BP = L.get_bodypart(zone)
+ if (BP && !(BP.skeletonized))
+ var/obj/item/natural/worms/leech/I = new(L)
+ BP.add_embedded_object(I, silent = TRUE)
/* if(water_reagent == /datum/reagent/water) //become shittified, checks so bath water can be naturally gross but not discolored
water_reagent = /datum/reagent/water/gross
water_color = "#a4955b"
update_icon()*/
+ if (istype(src,/turf/open/water/bloody))
+ L.add_mob_blood(L) //Yes its their own DNA
+
else
user.visible_message(span_info("[user] starts to wash [item2wash] in [src]."))
if(do_after(L, 30, target = src))
if(wash_in)
wash_atom(item2wash, CLEAN_STRONG)
+ L.update_inv_hands()
+ if(istype(src,/turf/open/water/bloody))
+ item2wash.add_blood_DNA(list("Blood" = random_blood_type()))
+ if(iscarbon(L))
+ var/mob/living/carbon/C = user
+ C.update_inv_hands()
playsound(user, pick(wash), 100, FALSE)
return
..()
@@ -244,8 +268,11 @@
playsound(user, pick('sound/foley/waterwash (1).ogg','sound/foley/waterwash (2).ogg'), 100, FALSE)
if(L.stat != CONSCIOUS)
return
+
if(do_after(L, 25, target = src))
- var/list/waterl = list(/datum/reagent/water = 5)
+ if (istype(src,/turf/open/water/sewer))
+ to_chat(user, span_userdanger("Have I gone mad!? Why am I drinking sewage!?"))
+ var/list/waterl = list(src.water_reagent = 5)
var/datum/reagents/reagents = new()
reagents.add_reagent_list(waterl)
reagents.trans_to(L, reagents.total_volume, transfered_by = user, method = INGEST)
@@ -299,9 +326,9 @@
icon_state = "pavingW"
water_level = 1
water_color = "#705a43"
- slowdown = 1
+ slowdown = 3
wash_in = FALSE
- water_reagent = /datum/reagent/water/gross
+ water_reagent = /datum/reagent/water/gross/sewage
/turf/open/water/sewer/Initialize()
icon_state = "paving"
@@ -325,10 +352,10 @@
icon = 'icons/turf/roguefloor.dmi'
icon_state = "dirtW2"
water_level = 2
- water_color = "#880808"
+ water_color = "#941010"
slowdown = 3
- wash_in = TRUE
- water_reagent = /datum/reagent/blood
+ wash_in = FALSE
+ water_reagent = /datum/reagent/blood/shitty
/turf/open/water/swamp/Initialize()
icon_state = "dirt"
@@ -342,6 +369,10 @@
water_color = pick("#880808")
. = ..()
+
+
+
+
/turf/open/water/swamp/Entered(atom/movable/AM, atom/oldLoc)
. = ..()
if(HAS_TRAIT(AM, TRAIT_LEECHIMMUNE))
diff --git a/code/modules/antagonists/roguetown/villain/zombie/zombie.dm b/code/modules/antagonists/roguetown/villain/zombie/zombie.dm
index 83ed33d0..4cded011 100644
--- a/code/modules/antagonists/roguetown/villain/zombie/zombie.dm
+++ b/code/modules/antagonists/roguetown/villain/zombie/zombie.dm
@@ -53,6 +53,7 @@
TRAIT_BLOODLOSS_IMMUNE,
TRAIT_ZOMBIE_SPEECH,
TRAIT_ZOMBIE_IMMUNE,
+ TRAIT_NECRAS_ABATEMENT,
TRAIT_ROTMAN,
TRAIT_NORUN
)
@@ -184,6 +185,7 @@
zombie.remove_client_colour(/datum/client_colour/monochrome)
if(has_turned && become_rotman)
+ zombie.remove_status_effect(/datum/status_effect/buff/deadite_pacified)
zombie.STACON = max(zombie.STACON - 2, 1) //ur rotting bro
zombie.STASPD = max(zombie.STASPD - 3, 1)
zombie.STAINT = max(zombie.STAINT - 3, 1)
@@ -191,6 +193,7 @@
ADD_TRAIT(zombie, trait, "[type]")
to_chat(zombie, span_green("I no longer crave for flesh... But I still feel ill."))
else
+ zombie.remove_status_effect(/datum/status_effect/buff/deadite_pacified)
if(!was_i_undead)
zombie.mob_biotypes &= ~MOB_UNDEAD
zombie.faction -= "undead"
@@ -272,7 +275,10 @@
//Add claws here if wanted.
zombie.update_body()
- to_chat(zombie, span_narsiesmall("Hungry... so hungry... I CRAVE FLESH!"))
+ var/area/rogue/our_area = get_area(zombie)
+ if((our_area.town_area))
+ zombie.apply_status_effect(/datum/status_effect/buff/deadite_pacified)
+ to_chat(zombie, span_narsiesmall("By the gods... what am I?!"))
zombie.cmode_music = 'sound/music/combat_weird.ogg'
@@ -329,6 +335,9 @@
if(zombie.stat >= DEAD)
//could not revive
qdel(src)
+ var/area/rogue/our_area = get_area(zombie)
+ if((our_area.town_area))
+ zombie.apply_status_effect(/datum/status_effect/buff/deadite_pacified)
/datum/antagonist/zombie/greet()
to_chat(owner.current, span_userdanger("Death is not the end..."))
diff --git a/code/modules/client/customizer/customizers/organ/ears.dm b/code/modules/client/customizer/customizers/organ/ears.dm
index 9ac674b7..ab3f1fa7 100644
--- a/code/modules/client/customizer/customizers/organ/ears.dm
+++ b/code/modules/client/customizer/customizers/organ/ears.dm
@@ -161,6 +161,7 @@
/datum/sprite_accessory/ears/big/acrador_short,
/datum/sprite_accessory/ears/big/sandfox_large,
/datum/sprite_accessory/ears/lynx,
+ /datum/sprite_accessory/ears/big/caustic/bunny_large,
)
/datum/customizer/organ/ears/anthro
@@ -225,6 +226,7 @@
/datum/sprite_accessory/ears/big/acrador_short,
/datum/sprite_accessory/ears/big/sandfox_large,
/datum/sprite_accessory/ears/lynx,
+ /datum/sprite_accessory/ears/big/caustic/bunny_large,
)
/datum/customizer/organ/ears/lizard
diff --git a/code/modules/client/customizer/customizers/organ/horns.dm b/code/modules/client/customizer/customizers/organ/horns.dm
index 29a064f7..5321cc4c 100644
--- a/code/modules/client/customizer/customizers/organ/horns.dm
+++ b/code/modules/client/customizer/customizers/organ/horns.dm
@@ -58,7 +58,12 @@
/datum/sprite_accessory/horns/sheephorns,
/datum/sprite_accessory/horns/doublehorns,
/datum/sprite_accessory/horns/tiefling,
- /datum/sprite_accessory/horns/tieflingalt
+ /datum/sprite_accessory/horns/tieflingalt,
+ /datum/sprite_accessory/horns/large/caustic/antlers,
+ /datum/sprite_accessory/horns/large/caustic/antlers/large,
+ /datum/sprite_accessory/horns/large/caustic/antlers/regal,
+ /datum/sprite_accessory/horns/large/caustic/antlers/monarch,
+ /datum/sprite_accessory/horns/large/caustic/antlers/short
)
/datum/customizer/organ/horns/demihuman
@@ -107,7 +112,12 @@
/datum/sprite_accessory/horns/sheephorns,
/datum/sprite_accessory/horns/doublehorns,
/datum/sprite_accessory/horns/tiefling,
- /datum/sprite_accessory/horns/tieflingalt
+ /datum/sprite_accessory/horns/tieflingalt,
+ /datum/sprite_accessory/horns/large/caustic/antlers,
+ /datum/sprite_accessory/horns/large/caustic/antlers/large,
+ /datum/sprite_accessory/horns/large/caustic/antlers/regal,
+ /datum/sprite_accessory/horns/large/caustic/antlers/monarch,
+ /datum/sprite_accessory/horns/large/caustic/antlers/short
)
/datum/customizer/organ/horns/anthro
@@ -156,7 +166,12 @@
/datum/sprite_accessory/horns/sheephorns,
/datum/sprite_accessory/horns/doublehorns,
/datum/sprite_accessory/horns/tiefling,
- /datum/sprite_accessory/horns/tieflingalt
+ /datum/sprite_accessory/horns/tieflingalt,
+ /datum/sprite_accessory/horns/large/caustic/antlers,
+ /datum/sprite_accessory/horns/large/caustic/antlers/large,
+ /datum/sprite_accessory/horns/large/caustic/antlers/regal,
+ /datum/sprite_accessory/horns/large/caustic/antlers/monarch,
+ /datum/sprite_accessory/horns/large/caustic/antlers/short
)
/datum/customizer/organ/horns/tusks
diff --git a/code/modules/client/customizer/customizers/organ/tail.dm b/code/modules/client/customizer/customizers/organ/tail.dm
index da99633d..b60930b1 100644
--- a/code/modules/client/customizer/customizers/organ/tail.dm
+++ b/code/modules/client/customizer/customizers/organ/tail.dm
@@ -124,6 +124,7 @@
/datum/sprite_accessory/tail/kangaroo,
/datum/sprite_accessory/tail/kitsune,
/datum/sprite_accessory/tail/lab,
+ /datum/sprite_accessory/tail/large_snake,
/datum/sprite_accessory/tail/murid,
/datum/sprite_accessory/tail/orca,
/datum/sprite_accessory/tail/otie,
@@ -151,6 +152,8 @@
/datum/sprite_accessory/tail/deer,
/datum/sprite_accessory/tail/raccoon,
/datum/sprite_accessory/tail/sabresune,
+ /datum/sprite_accessory/tail/tiefling,
+ /datum/sprite_accessory/tail/tiefling/heart,
/datum/sprite_accessory/tail/lizard/smooth,
/datum/sprite_accessory/tail/lizard/dtiger,
/datum/sprite_accessory/tail/lizard/ltiger,
@@ -191,6 +194,7 @@
/datum/sprite_accessory/tail/kangaroo,
/datum/sprite_accessory/tail/kitsune,
/datum/sprite_accessory/tail/lab,
+ /datum/sprite_accessory/tail/large_snake,
/datum/sprite_accessory/tail/murid,
/datum/sprite_accessory/tail/orca,
/datum/sprite_accessory/tail/otie,
diff --git a/code/modules/client/customizer/customizers/organ/tail_feature.dm b/code/modules/client/customizer/customizers/organ/tail_feature.dm
index 1a561502..c2b2673c 100644
--- a/code/modules/client/customizer/customizers/organ/tail_feature.dm
+++ b/code/modules/client/customizer/customizers/organ/tail_feature.dm
@@ -22,6 +22,7 @@
/datum/sprite_accessory/tail_feature/spines/long,
/datum/sprite_accessory/tail_feature/spines/longmeme,
/datum/sprite_accessory/tail_feature/spines/aquatic,
+ /datum/sprite_accessory/tail_feature/large_snake/underbelly,
/datum/sprite_accessory/tail_feature/taur/lamia,
/datum/sprite_accessory/tail_feature/taur/horse,
/datum/sprite_accessory/tail_feature/taur/lizard,
@@ -35,6 +36,8 @@
/datum/sprite_accessory/tail_feature/taur/altnaga,
/datum/sprite_accessory/tail_feature/taur/altnagatailmaw,
/datum/sprite_accessory/tail_feature/taur/fatnaga,
+ /datum/sprite_accessory/tail_feature/taur/caustic/bunny,
+ /datum/sprite_accessory/tail_feature/taur/caustic/deerbelly,
)
/datum/customizer/organ/tail_feature/vox_markings
@@ -66,6 +69,8 @@
/datum/sprite_accessory/tail_feature/taur/altnaga,
/datum/sprite_accessory/tail_feature/taur/altnagatailmaw,
/datum/sprite_accessory/tail_feature/taur/fatnaga,
+ /datum/sprite_accessory/tail_feature/taur/caustic/bunny,
+ /datum/sprite_accessory/tail_feature/taur/caustic/deerbelly,
)
/datum/customizer/organ/tail_feature/anthro
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f3a0686f..84aa86a2 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -71,6 +71,7 @@ GLOBAL_LIST_EMPTY(chosen_names)
var/datum/statpack/statpack = new /datum/statpack/wildcard/fated // LETHALSTONE EDIT: the statpack we're giving our char instead of racial bonuses
var/datum/virtue/virtue = new /datum/virtue/none // LETHALSTONE EDIT: the virtue we get for not picking a statpack
var/datum/virtue/virtuetwo = new /datum/virtue/none
+ var/datum/virtue/extravirtue = new /datum/virtue/none
var/age = AGE_ADULT //age of character
var/origin = "Default"
var/accessory = "Nothing"
@@ -172,6 +173,8 @@ GLOBAL_LIST_EMPTY(chosen_names)
var/datum/loadout_item/loadout
var/datum/loadout_item/loadout2
var/datum/loadout_item/loadout3
+ var/datum/loadout_item/loadout4
+ var/datum/loadout_item/loadout5
var/flavortext
var/flavortext_display
@@ -385,13 +388,15 @@ GLOBAL_LIST_EMPTY(chosen_names)
dat += "Virtue: [virtue]
"
if(statpack.name == "Virtuous")
dat += "Second Virtue: [virtuetwo]
"
+ dat += "Extra Virtue: [extravirtue]
"
dat += "Vice: [charflaw]
"
var/datum/faith/selected_faith = GLOB.faithlist[selected_patron?.associated_faith]
dat += "Faith: [selected_faith?.name || "FUCK!"]
"
dat += "Patron: [selected_patron?.name || "FUCK!"]
"
// dat += "Family: Unknown
" // Disabling until its working
dat += "Dominance: [domhand == 1 ? "Left-handed" : "Right-handed"]
"
-
+ dat += "Size Category: [sizecat]
"
+ dat += "Pickup able: [pickupable ? "Yes" : "No"]
"
/*
dat += "
Special Names:
"
var/old_group
@@ -470,6 +475,10 @@ GLOBAL_LIST_EMPTY(chosen_names)
dat += "
Loadout Item II: [loadout2 ? loadout2.name : "None"]"
dat += "
Loadout Item III: [loadout3 ? loadout3.name : "None"]"
+
+ dat += "
Loadout Item IV: [loadout4 ? loadout4.name : "None"]"
+
+ dat += "
Loadout Item V: [loadout5 ? loadout5.name : "None"]"
dat += ""
dat += ""
@@ -1854,6 +1863,48 @@ Slots: [job.spawn_positions] [job.round_contrib_points ? "RCP: +[job.round_contr
to_chat(user, "[loadout3.name]")
if(loadout3.desc)
to_chat(user, "[loadout3.desc]")
+ if("loadout_item4")
+ var/list/loadouts_available = list("None")
+ for (var/path as anything in GLOB.loadout_items)
+ var/datum/loadout_item/loadout4 = GLOB.loadout_items[path]
+ var/donoritem = loadout4.donoritem
+ if(donoritem && !loadout4.donator_ckey_check(user.ckey))
+ continue
+ if (!loadout4.name)
+ continue
+ loadouts_available[loadout4.name] = loadout4
+
+ var/loadout_input4 = input(user, "Choose your character's loadout item. RMB a tree, statue or clock to collect. I cannot stress this enough. YOU DON'T SPAWN WITH THESE. YOU HAVE TO MANUALLY PICK THEM UP!!", "LOADOUT THAT YOU GET FROM A TREE OR STATUE OR CLOCK") as null|anything in loadouts_available
+ if(loadout_input4)
+ if(loadout_input4 == "None")
+ loadout4 = null
+ to_chat(user, "Who needs stuff anyway?")
+ else
+ loadout4 = loadouts_available[loadout_input4]
+ to_chat(user, "[loadout4.name]")
+ if(loadout4.desc)
+ to_chat(user, "[loadout4.desc]")
+ if("loadout_item5")
+ var/list/loadouts_available = list("None")
+ for (var/path as anything in GLOB.loadout_items)
+ var/datum/loadout_item/loadout5 = GLOB.loadout_items[path]
+ var/donoritem = loadout5.donoritem
+ if(donoritem && !loadout5.donator_ckey_check(user.ckey))
+ continue
+ if (!loadout5.name)
+ continue
+ loadouts_available[loadout5.name] = loadout5
+
+ var/loadout_input5 = input(user, "Choose your character's loadout item. RMB a tree, statue or clock to collect. I cannot stress this enough. YOU DON'T SPAWN WITH THESE. YOU HAVE TO MANUALLY PICK THEM UP!!", "LOADOUT THAT YOU GET FROM A TREE OR STATUE OR CLOCK") as null|anything in loadouts_available
+ if(loadout_input5)
+ if(loadout_input5 == "None")
+ loadout5 = null
+ to_chat(user, "Who needs stuff anyway?")
+ else
+ loadout5 = loadouts_available[loadout_input5]
+ to_chat(user, "[loadout5.name]")
+ if(loadout5.desc)
+ to_chat(user, "[loadout5.desc]")
if("species")
var/list/crap = list()
for(var/A in GLOB.roundstart_races)
@@ -1880,7 +1931,7 @@ Slots: [job.spawn_positions] [job.round_contrib_points ? "RCP: +[job.round_contr
var/datum/virtue/V = GLOB.virtues[path]
if (!V.name)
continue
- if (V.name == virtue.name || V.name == virtuetwo.name)
+ if (V.name == virtue.name || V.name == virtuetwo.name || V.name == extravirtue.name)
continue
if (istype(V, /datum/virtue/heretic) && !istype(selected_patron, /datum/patron/inhumen))
continue
@@ -1900,7 +1951,7 @@ Slots: [job.spawn_positions] [job.round_contrib_points ? "RCP: +[job.round_contr
var/datum/virtue/V = GLOB.virtues[path]
if (!V.name)
continue
- if (V.name == virtue.name || V.name == virtuetwo.name)
+ if (V.name == virtue.name || V.name == virtuetwo.name || V.name == extravirtue.name)
continue
if (istype(V, /datum/virtue/heretic) && !istype(selected_patron, /datum/patron/inhumen))
continue
@@ -1916,7 +1967,24 @@ Slots: [job.spawn_positions] [job.round_contrib_points ? "RCP: +[job.round_contr
/* if (statpack.type != /datum/statpack/wildcard/virtuous)
statpack = new /datum/statpack/wildcard/virtuous
to_chat(user, span_purple("Your statpack has been set to virtuous (no stats) due to selecting a virtue.")) */
-
+ if("extravirtue")
+ var/list/virtue_choices = list()
+ for (var/path as anything in GLOB.virtues)
+ var/datum/virtue/V = GLOB.virtues[path]
+ if (!V.name)
+ continue
+ if (V.name == virtue.name || V.name == virtuetwo.name || V.name == extravirtue.name)
+ continue
+ if (istype(V, /datum/virtue/heretic) && !istype(selected_patron, /datum/patron/inhumen))
+ continue
+ if (istype(V, /datum/virtue/utility/noble) && (pref_species == /datum/species/construct/metal)) //Stops bypass of nobility for constructs.
+ continue
+ virtue_choices[V.name] = V
+ var/result = input(user, "Select a virtue", "Roguetown") as null|anything in virtue_choices
+ if (result)
+ var/datum/virtue/virtue_chosen = virtue_choices[result]
+ extravirtue = virtue_chosen
+ to_chat(user, process_virtue_text(virtue_chosen))
if("charflaw")
var/list/coom = GLOB.character_flaws.Copy()
var/result = input(user, "Select a flaw", "Roguetown") as null|anything in coom
@@ -1932,7 +2000,8 @@ Slots: [job.spawn_positions] [job.round_contrib_points ? "RCP: +[job.round_contr
if(new_body_size)
new_body_size = clamp(new_body_size * 0.01, BODY_SIZE_MIN, BODY_SIZE_MAX)
features["body_size"] = new_body_size
-
+ if("sizecat")
+ select_sizecat(user)
if("taur_color")
var/new_taur_color = color_pick_sanitized(user, "Choose your character's taur color:", "Character Preference", "#"+taur_color)
if(new_taur_color)
@@ -2293,6 +2362,9 @@ Slots: [job.spawn_positions] [job.round_contrib_points ? "RCP: +[job.round_contr
else
to_chat(user, span_warning("You are no longer a voice."))
+ if("pickupable")
+ pickupable = !pickupable
+
if("migrants")
migrant.show_ui()
return
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 7f3a1d53..9ac94d3d 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -371,8 +371,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/_load_virtue(S)
var/virtue_type
var/virtuetwo_type
+ var/extravirtue_type
S["virtue"] >> virtue_type
S["virtuetwo"] >> virtuetwo_type
+ S["extravirtue"] >> extravirtue_type
if (virtue_type)
virtue = new virtue_type()
else
@@ -382,6 +384,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
virtuetwo = new virtuetwo_type
else
virtuetwo = new /datum/virtue/none
+
+ if(extravirtue_type)
+ extravirtue = new extravirtue_type
+ else
+ extravirtue = new /datum/virtue/none
/datum/preferences/proc/_load_loadout(S)
var/loadout_type
@@ -401,6 +408,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if (loadout_type3)
loadout3 = new loadout_type3()
+/datum/preferences/proc/_load_loadout4(S)
+ var/loadout_type4
+ S["loadout4"] >> loadout_type4
+ if (loadout_type4)
+ loadout4 = new loadout_type4()
+
+/datum/preferences/proc/_load_loadout5(S)
+ var/loadout_type5
+ S["loadout5"] >> loadout_type5
+ if (loadout_type5)
+ loadout5 = new loadout_type5()
+
/datum/preferences/proc/_load_height(S)
var/preview_height
S["body_height"] >> preview_height
@@ -440,6 +459,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["highlight_color"] >> highlight_color
S["taur_type"] >> taur_type
S["taur_color"] >> taur_color
+ S["pickupable"] >> pickupable
/datum/preferences/proc/load_character(slot)
if(!path)
@@ -467,6 +487,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
_load_virtue(S)
_load_flaw(S)
+ //Caustic edit!
+ _load_sizecat(S)
// LETHALSTONE edit: jank-ass load our statpack choice
_load_statpack(S)
@@ -474,6 +496,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
_load_loadout(S)
_load_loadout2(S)
_load_loadout3(S)
+ _load_loadout4(S)
+ _load_loadout5(S)
if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
WRITE_FILE(S["features["mcolor"]"] , "#FFF")
@@ -658,7 +682,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["highlight_color"] , highlight_color)
WRITE_FILE(S["taur_type"] , taur_type)
WRITE_FILE(S["taur_color"] , taur_color)
-
+ WRITE_FILE(S["pickupable"] , pickupable)
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
@@ -701,6 +725,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["statpack"] , statpack.type)
WRITE_FILE(S["virtue"] , virtue.type)
WRITE_FILE(S["virtuetwo"], virtuetwo.type)
+ WRITE_FILE(S["extravirtue"], extravirtue.type)
WRITE_FILE(S["body_size"] , features["body_size"])
if(loadout)
WRITE_FILE(S["loadout"] , loadout.type)
@@ -714,9 +739,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["loadout3"] , loadout3.type)
else
WRITE_FILE(S["loadout3"] , null)
+ if(loadout4)
+ WRITE_FILE(S["loadout4"] , loadout4.type)
+ else
+ WRITE_FILE(S["loadout4"] , null)
+ if(loadout5)
+ WRITE_FILE(S["loadout5"] , loadout5.type)
+ else
+ WRITE_FILE(S["loadout5"] , null)
+ //Caustic edits
save_vore_prefs(S)
-
+ save_sizecat(S)
+ //Caustic edits end
return TRUE
diff --git a/code/modules/clothing/rogueclothes/armor/chainmail.dm b/code/modules/clothing/rogueclothes/armor/chainmail.dm
index 9161b12f..61398fbc 100644
--- a/code/modules/clothing/rogueclothes/armor/chainmail.dm
+++ b/code/modules/clothing/rogueclothes/armor/chainmail.dm
@@ -86,9 +86,10 @@
/obj/item/clothing/suit/roguetown/armor/chainmail/bikini
name = "chainmail corslet" // corslet, from the old French 'cors' or bodice, with the diminutive 'let', used to describe lightweight military armor since 1500. Chosen here to replace 'bikini', an extreme anachronism.
desc = "For the daring, affording maille's protection with light weight."
+ mob_overlay_icon = 'modular_causticcove/icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "chainkini"
item_state = "chainkini"
- allowed_sex = list(FEMALE)
+ allowed_sex = list(FEMALE, MALE)
allowed_race = CLOTHED_RACES_TYPES
body_parts_covered = CHEST|GROIN
armor_class = ARMOR_CLASS_LIGHT //placed in the medium category to keep it with its parent obj
diff --git a/code/modules/clothing/rogueclothes/armor/gambeson.dm b/code/modules/clothing/rogueclothes/armor/gambeson.dm
index d015a519..99705c1f 100644
--- a/code/modules/clothing/rogueclothes/armor/gambeson.dm
+++ b/code/modules/clothing/rogueclothes/armor/gambeson.dm
@@ -190,6 +190,9 @@
pic.color = get_detail_color()
add_overlay(pic)
+/obj/item/clothing/suit/roguetown/armor/gambeson/heavy/grenzelhoft/loadout
+ armor = ARMOR_CLOTHING
+
/obj/item/clothing/suit/roguetown/armor/gambeson/heavy/raneshen
name = "padded desert coat"
desc = "A slim-fitting sherwani, a Ranesheni-styled coat meant to endure in the desert's climate. This one is heavily padded, meant for a warrior to wear."
diff --git a/code/modules/clothing/rogueclothes/armor/leather.dm b/code/modules/clothing/rogueclothes/armor/leather.dm
index 580c8043..bfa2a721 100644
--- a/code/modules/clothing/rogueclothes/armor/leather.dm
+++ b/code/modules/clothing/rogueclothes/armor/leather.dm
@@ -146,6 +146,7 @@
name = "leather corslet"
desc = "Flexible cowhide armor. Lightweight, better than nothing. Trimmed to protect the heart and hips."
body_parts_covered = CHEST|GROIN
+ mob_overlay_icon = 'modular_causticcove/icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "leatherkini"
item_state = "leatherkini"
allowed_sex = list(FEMALE, MALE)
@@ -155,18 +156,20 @@
name = "studded leather corslet"
desc = "Studded leather is the most durable of all hides and leathers and about as light. Trimmed to protect the heart and hips."
body_parts_covered = CHEST|GROIN
+ mob_overlay_icon = 'modular_causticcove/icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "studleatherkini"
item_state = "studleatherkini"
- allowed_sex = list(FEMALE)
+ allowed_sex = list(FEMALE, MALE)
allowed_race = CLOTHED_RACES_TYPES
/obj/item/clothing/suit/roguetown/armor/leather/hide/bikini
name = "hide corslet"
desc = "A light armor of wildbeast hide. Far more durable than leather. Trimmed to protect the heart and hips."
body_parts_covered = CHEST|GROIN
+ mob_overlay_icon = 'modular_causticcove/icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "hidearmorkini"
item_state = "hidearmorkini"
- allowed_sex = list(FEMALE)
+ allowed_sex = list(FEMALE, MALE)
allowed_race = CLOTHED_RACES_TYPES
/obj/item/clothing/suit/roguetown/armor/leather/vest
diff --git a/code/modules/clothing/rogueclothes/armor/plate.dm b/code/modules/clothing/rogueclothes/armor/plate.dm
index 78725309..6304e306 100644
--- a/code/modules/clothing/rogueclothes/armor/plate.dm
+++ b/code/modules/clothing/rogueclothes/armor/plate.dm
@@ -188,8 +188,9 @@
/obj/item/clothing/suit/roguetown/armor/plate/full/bikini
name = "full-plate corset"
desc = "Breastplate, pauldrons, couters, cuisses... did you forget something?"
+ mob_overlay_icon = 'modular_causticcove/icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "platekini"
- allowed_sex = list(FEMALE)
+ allowed_sex = list(FEMALE, MALE)
body_parts_covered = CHEST|GROIN|LEGS|ARMS
equip_delay_self = 8 SECONDS
unequip_delay_self = 8 SECONDS
@@ -288,11 +289,12 @@
name = "half-plate corslet"
desc = "A high breastplate and hip armor allowing flexibility and great protection, save for the stomach."
body_parts_covered = CHEST|GROIN
+ mob_overlay_icon = 'modular_causticcove/icons/roguetown/clothing/onmob/armor.dmi'
icon_state = "halfplatekini"
item_state = "halfplatekini"
armor = ARMOR_CUIRASS // Identical to steel cuirass, but covering the groin instead of the vitals.
max_integrity = ARMOR_INT_CHEST_MEDIUM_STEEL // Identical to steel cuirasss. Same steel price.
- allowed_sex = list(FEMALE)
+ allowed_sex = list(FEMALE, MALE)
armor_class = ARMOR_CLASS_MEDIUM
smelt_bar_num = 2
diff --git a/code/modules/clothing/rogueclothes/gloves/angle.dm b/code/modules/clothing/rogueclothes/gloves/angle.dm
index a3e23c60..70552e20 100644
--- a/code/modules/clothing/rogueclothes/gloves/angle.dm
+++ b/code/modules/clothing/rogueclothes/gloves/angle.dm
@@ -22,6 +22,9 @@
item_state = "grenzelgloves"
sleeved = 'icons/roguetown/clothing/onmob/helpers/stonekeep_merc.dmi'
+/obj/item/clothing/gloves/roguetown/angle/grenzelgloves/loadout
+ armor = ARMOR_GLOVES_LEATHER //Legit normal leather
+
/obj/item/clothing/gloves/roguetown/angle/grenzelgloves/blacksmith
name = "forge gauntlets"
diff --git a/code/modules/clothing/rogueclothes/headwear/helmet/light_helmet.dm b/code/modules/clothing/rogueclothes/headwear/helmet/light_helmet.dm
index b8233cc1..a4c10684 100644
--- a/code/modules/clothing/rogueclothes/headwear/helmet/light_helmet.dm
+++ b/code/modules/clothing/rogueclothes/headwear/helmet/light_helmet.dm
@@ -133,6 +133,9 @@
pic2.color = get_altdetail_color()
add_overlay(pic2)
+/obj/item/clothing/head/roguetown/grenzelhofthat/loadout
+ desc = "Whether it's monsters or fair maidens, a true Grenzelhoftian slays both."
+ armor = ARMOR_HEAD_CLOTHING
//................ Briar Thorns ............... // - Dendor Briar
/obj/item/clothing/head/roguetown/padded/briarthorns
name = "briar thorns"
@@ -156,3 +159,7 @@
sewrepair = TRUE
flags_inv = HIDEEARS
body_parts_covered = HEAD|HAIR|EARS|NOSE|EYES
+
+/obj/item/clothing/head/roguetown/mentorhat/loadout
+ armor = ARMOR_HEAD_CLOTHING
+ desc = "A bamboo hat."
diff --git a/code/modules/clothing/rogueclothes/pants/heavy_leather.dm b/code/modules/clothing/rogueclothes/pants/heavy_leather.dm
index edb43f52..10d73f7f 100644
--- a/code/modules/clothing/rogueclothes/pants/heavy_leather.dm
+++ b/code/modules/clothing/rogueclothes/pants/heavy_leather.dm
@@ -84,6 +84,9 @@
pic.color = get_detail_color()
add_overlay(pic)
+/obj/item/clothing/under/roguetown/heavy_leather_pants/grenzelpants/loadout
+ armor = ARMOR_PANTS_LEATHER
+
/obj/item/clothing/under/roguetown/heavy_leather_pants/eastpants1
name = "cut-throat's pants"
desc = "Foreign pants, with leather insewns."
diff --git a/code/modules/farming/bin.dm b/code/modules/farming/bin.dm
index 3903691c..edbe8c2e 100644
--- a/code/modules/farming/bin.dm
+++ b/code/modules/farming/bin.dm
@@ -100,7 +100,7 @@
if(!reagents || !reagents.maximum_volume)
return
if(isliving(user))
- var/mob/living/L = user
+ var/mob/living/carbon/L = user
if(L.stat != CONSCIOUS)
return
var/removereg = /datum/reagent/water
@@ -118,11 +118,15 @@
if(do_after(L, 30, target = src))
wash_atom(user, CLEAN_STRONG)
playsound(user, pick(wash), 100, FALSE)
+ user.remove_stress(/datum/stressevent/sewertouched)
else
user.visible_message(span_info("[user] starts to wash [item2wash] in [src]."))
if(do_after(L, 30, target = src))
wash_atom(item2wash, CLEAN_STRONG)
playsound(user, pick(wash), 100, FALSE)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.update_inv_hands()
var/datum/reagent/water_to_dirty = reagents.has_reagent(/datum/reagent/water, 5)
if(water_to_dirty)
var/amount_to_dirty = water_to_dirty.volume
diff --git a/code/modules/farming/tools.dm b/code/modules/farming/tools.dm
index 2a6b4fa9..c79f7e26 100644
--- a/code/modules/farming/tools.dm
+++ b/code/modules/farming/tools.dm
@@ -140,7 +140,7 @@
icon_state = "stonehoe"
//dropshrink = 0.8
smeltresult = null
- anvilrepair = null
+ anvilrepair = /datum/skill/craft/blacksmithing
max_integrity = 100
hoe_damage = 25
work_time = 15 SECONDS
diff --git a/code/modules/jobs/job_types/roguetown/Inquisition/orthodoxist.dm b/code/modules/jobs/job_types/roguetown/Inquisition/orthodoxist.dm
index b2138572..2b967357 100644
--- a/code/modules/jobs/job_types/roguetown/Inquisition/orthodoxist.dm
+++ b/code/modules/jobs/job_types/roguetown/Inquisition/orthodoxist.dm
@@ -12,7 +12,7 @@
outfit = null
outfit_female = null
display_order = JDO_ORTHODOXIST
- min_pq = 5 // We need you to be atleast kinda competent to do this. This is a soft antaggy sorta role. Also needs to know wtf a PSYDON is
+ min_pq = null //5 // We need you to be atleast kinda competent to do this. This is a soft antaggy sorta role. Also needs to know wtf a PSYDON is
max_pq = null
round_contrib_points = 2
advclass_cat_rolls = list(CTAG_INQUISITION = 20)
diff --git a/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm b/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm
index 913e708b..fe8c31e7 100644
--- a/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm
+++ b/code/modules/jobs/job_types/roguetown/Inquisition/puritan.dm
@@ -17,7 +17,7 @@
display_order = JDO_PURITAN
advclass_cat_rolls = list(CTAG_PURITAN = 20)
give_bank_account = 30
- min_pq = 10
+ min_pq = null //10
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/bandit.dm b/code/modules/jobs/job_types/roguetown/adventurer/bandit.dm
index ce7ace92..11dcaca5 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/bandit.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/bandit.dm
@@ -16,7 +16,7 @@
display_order = JDO_BANDIT
announce_latejoin = FALSE
- min_pq = 3
+ min_pq = null //3
max_pq = null
round_contrib_points = 5
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/lurker.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/lurker.dm
new file mode 100644
index 00000000..2d6d0b5e
--- /dev/null
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/lurker.dm
@@ -0,0 +1,157 @@
+/datum/advclass/lurker
+ name = "Feral Soul"
+ tutorial = "Those who walk a path that many fear to tread, embracing their innermost instincts."
+ allowed_sexes = list(MALE, FEMALE)
+ allowed_races = RACES_NO_CONSTRUCT //artificial constructs do not have the spark of the wild
+ outfit = /datum/outfit/job/roguetown/adventurer/lurker
+ traits_applied = list(TRAIT_OUTLANDER)
+ category_tags = list(CTAG_ADVENTURER, CTAG_COURTAGENT)
+ classes = list("Wild Lurker" = "You are a mortal who embraces the aspects of nature. A creature one step removed from being little more than a feral beast. Whatever lyfe you lived before is now but a faded memory.")
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor
+ slot_flags = null
+ name = "natural armor"
+ desc = ""
+ icon_state = null
+ body_parts_covered = FULL_BODY
+ body_parts_inherent = FULL_BODY
+ armor = ARMOR_NATURAL
+ prevent_crits = list(BCLASS_CUT, BCLASS_CHOP, BCLASS_STAB, BCLASS_BLUNT, BCLASS_TWIST)
+ blocksound = SOFTHIT
+ blade_dulling = DULLING_BASHCHOP
+ sewrepair = FALSE
+ max_integrity = 600
+ item_flags = DROPDEL
+ var/next_regen
+ var/mob/living/carbon/human/skin_haver
+
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor/Initialize(mapload)
+ . = ..()
+ skin_haver = loc
+ trait_add(skin_haver)
+ START_PROCESSING(SSobj, src)
+ return
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor/Destroy()
+ trait_remove(skin_haver)
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor/process()
+ if(next_regen > world.time)
+ return
+ regenerate(skin_haver)
+ next_regen = world.time + 30 SECONDS
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor/proc/trait_add(mob/living/user)
+ skin_haver = user
+ ADD_TRAIT(skin_haver, TRAIT_NATURAL_ARMOR, TRAIT_GENERIC)
+ return
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor/proc/trait_remove(mob/living/user)
+ skin_haver = user
+ REMOVE_TRAIT(skin_haver, TRAIT_NATURAL_ARMOR, TRAIT_GENERIC)
+ return
+
+/obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor/proc/regenerate(mob/living/user)
+ //mob wearing the natural armor
+ skin_haver = user
+
+ //making sure that the thing wearing the armor is human
+ if(!istype(skin_haver))
+ return
+
+ //no need to regenerate if armor is already full
+ if(obj_integrity >= max_integrity)
+ return
+
+ //we can't regenerate if we have no nutrition to do it with
+ if(skin_haver.nutrition <=0)
+ return
+
+ //we can only regenerate 100 points of integrity at a time
+ var/regen_amt = min(100, max_integrity - obj_integrity)
+ obj_integrity += regen_amt
+
+ //Every 1 point of integrity is 2 points of hunger
+ skin_haver.adjust_nutrition(-regen_amt * 2)
+
+ //some user feed back for regeneration
+ if(obj_integrity < max_integrity)
+ to_chat(skin_haver, span_smallgreen("You feel your natural protection knitting itself back together..."))
+ return
+ //letting the owner know it's fully restored
+ else
+ to_chat(skin_haver, span_green("You feel your natural protection has fully healed!"))
+ return
+
+/datum/outfit/job/roguetown/adventurer/lurker/pre_equip(mob/living/carbon/human/H)
+ ..()
+ H.adjust_blindness(-3)
+ var/classes = list("Wild Lurker")
+ var/classchoice = input("Choose your archetypes", "Available archetypes") as anything in classes
+
+ switch(classchoice)
+
+ if("Wild Lurker")
+ to_chat(H, span_warning("You have embraced your feral instincts. You tread through brush and thicket unimpeded, and hunt as the beasts of Dendor do. Civilization is your anathema, and is to be avoided. For what purpose is the safety of a tavern when you thrive in this wild realm?"))
+ head = /obj/item/clothing/head/roguetown/helmet/leather/volfhelm
+ shoes = /obj/item/clothing/shoes/roguetown/boots/furlinedanklets
+ wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
+ belt = /obj/item/storage/belt/rogue/leather/rope
+ beltl = /obj/item/rogueweapon/huntingknife/stoneknife
+ //cloak = /obj/item/clothing/cloak/raincloak/furcloak
+ //backl = /obj/item/storage/backpack/rogue/satchel
+ //backpack_contents = list(
+ // /obj/item/rogueweapon/huntingknife/stoneknife = 1,
+ // /obj/item/rogueweapon/scabbard/sheath = 1
+ // )
+ H.cmode_music = 'sound/music/combat_gronn.ogg'
+ H.adjust_skillrank(/datum/skill/misc/athletics, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/knives, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/wrestling, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/unarmed, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/swimming, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/climbing, 6, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/sneaking, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/tanning, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/labor/butchering, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/tracking, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/crafting, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/labor/farming, 2, TRUE)
+ ADD_TRAIT(H, TRAIT_OUTDOORSMAN, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_STRONGBITE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_CRITICAL_RESISTANCE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_WILD_EATER, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_SEEDKNOW, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_CIVILIZEDBARBARIAN, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_AZURENATIVE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_WOODWALKER, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_FERAL, TRAIT_GENERIC)
+ H.change_stat("strength", 4)
+ H.change_stat("perception", 3)
+ H.change_stat("constitution", 3)
+ H.change_stat("speed", 2)
+ H.change_stat("endurance", 4)
+ H.change_stat("intelligence", -3)
+ H.skin_armor = new /obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor(H)
+ var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
+ var/color_one
+ var/color_two
+ var/heterochromia
+ if(eyes)
+ color_one = eyes.eye_color
+ color_two = eyes.second_color
+ heterochromia = eyes.heterochromia
+ eyes.Remove(H,1)
+ QDEL_NULL(eyes)
+ eyes = new /obj/item/organ/eyes/night_vision/feral
+ if(color_one)
+ eyes.eye_color = color_one
+ if(color_two)
+ eyes.second_color = color_two
+ if(heterochromia)
+ eyes.heterochromia = heterochromia
+ eyes.Insert(H)
\ No newline at end of file
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm
index 50d99505..b4b2deeb 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/mage.dm
@@ -8,12 +8,13 @@
traits_applied = list(TRAIT_OUTLANDER)
classes = list("Sorcerer" = "You are a learned mage and a scholar, having spent your life studying the arcane and its ways.",
"Spellblade" = "You are skilled in both the arcyne art and swordsmanship. But you are not a master of either nor could you channel your magick in armor.",
- "Spellsinger" = "You belong to a school of bards renowned for their study of both the arcane and the arts.")
+ "Spellsinger" = "You belong to a school of bards renowned for their study of both the arcane and the arts.",
+ "Spellthief" = "You are a back-alley thief who fell from their magical tutelage, or has stolen Noc's gift to further their own larceny.")
/datum/outfit/job/roguetown/adventurer/mage/pre_equip(mob/living/carbon/human/H)
..()
H.adjust_blindness(-3)
- var/classes = list("Sorcerer", ,"Spellblade", "Spellsinger")
+ var/classes = list("Sorcerer", ,"Spellblade", "Spellsinger", "Spellthief")
var/classchoice = input("Choose your archetypes", "Available archetypes") as anything in classes
switch(classchoice)
@@ -184,3 +185,58 @@
backr = /obj/item/rogue/instrument/viola
if("Vocal Talisman")
backr = /obj/item/rogue/instrument/vocals
+ if("Spellthief")
+ to_chat(H, span_warning("You are a rogue, either by choice or hardship. Your study of the arcyne knowledge, stolen or not, now aids in your roguish endeavors."))
+ armor = /obj/item/clothing/suit/roguetown/armor/leather
+ backl = /obj/item/storage/backpack/rogue/backpack
+ backr = /obj/item/gun/ballistic/revolver/grenadelauncher/bow
+ shoes = /obj/item/clothing/shoes/roguetown/boots
+ neck = /obj/item/storage/belt/rogue/pouch/coins/poor
+ wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
+ belt = /obj/item/storage/belt/rogue/leather
+ beltl = /obj/item/quiver/Warrows
+ beltr = /obj/item/rogueweapon/mace/cudgel
+ gloves = /obj/item/clothing/gloves/roguetown/fingerless
+ pants = /obj/item/clothing/under/roguetown/trou/leather
+ shirt = /obj/item/clothing/suit/roguetown/armor/gambeson
+ cloak = /obj/item/clothing/cloak/raincloak/mortus
+ backpack_contents = list(
+ /obj/item/flashlight/flare/torch = 1,
+ /obj/item/rogueweapon/huntingknife/idagger/steel = 1,
+ /obj/item/lockpickring/mundane = 1,
+ /obj/item/recipe_book/survival = 1,
+ /obj/item/rogueweapon/scabbard/sheath = 1
+ )
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/invisibility)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/lesserknock)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/fetch)
+ H.adjust_skillrank(/datum/skill/misc/tracking, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/knives, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/bows, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/maces, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/swimming, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/wrestling, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/unarmed, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/climbing, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/sneaking, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/lockpicking, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/traps, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/reading, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/magic/arcane, 2, TRUE)
+ H.change_stat("strength", -1)
+ H.change_stat("intelligence", 2)
+ H.change_stat("perception", 1)
+ H.change_stat("endurance", 1)
+ H.change_stat("speed", 2)
+ H.cmode_music = 'sound/music/combat_rogue.ogg'
+ switch(H.patron?.type)
+ if(/datum/patron/inhumen/zizo)
+ H.cmode_music = 'sound/music/combat_cult.ogg'
+ H.grant_language(/datum/language/thievescant)
+ H?.mind.adjust_spellpoints(12)
+ ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_ARCYNE_T2, TRAIT_GENERIC)
\ No newline at end of file
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/special/courtagent.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/special/courtagent.dm
index 829cb45a..aeb85580 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/special/courtagent.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/special/courtagent.dm
@@ -6,7 +6,7 @@
spawn_positions = 2
round_contrib_points = 2
tutorial = "Whether acquired by merit, shrewd negotiation or fulfilled bounties, you have found yourself under the underhanded employ of the Hand. Fulfill desires and whims of the court that they would rather not be publicly known. Your position is anything but secure, and any mistake can leave you disowned and charged like the petty criminal are. Garrison and Court members know who you are."
- min_pq = 5
+ min_pq = null //5
job_reopens_slots_on_death = FALSE
always_show_on_latechoices = FALSE
show_in_credits = TRUE
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/wretch.dm b/code/modules/jobs/job_types/roguetown/adventurer/wretch.dm
index 3dbb8f3c..08e5a237 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/wretch.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/wretch.dm
@@ -12,7 +12,7 @@
outfit_female = null
display_order = JDO_WRETCH
show_in_credits = FALSE
- min_pq = 20
+ min_pq = null //20
max_pq = null
obsfuscated_job = TRUE
diff --git a/code/modules/jobs/job_types/roguetown/church/druid.dm b/code/modules/jobs/job_types/roguetown/church/druid.dm
index e72e4138..48b80425 100644
--- a/code/modules/jobs/job_types/roguetown/church/druid.dm
+++ b/code/modules/jobs/job_types/roguetown/church/druid.dm
@@ -15,7 +15,7 @@
display_order = JDO_DRUID
give_bank_account = TRUE
- min_pq = 0
+ min_pq = null
max_pq = null
round_contrib_points = 2
cmode_music = 'sound/music/combat_druid.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/church/martyr.dm b/code/modules/jobs/job_types/roguetown/church/martyr.dm
index 13ddfae1..e6599cc3 100644
--- a/code/modules/jobs/job_types/roguetown/church/martyr.dm
+++ b/code/modules/jobs/job_types/roguetown/church/martyr.dm
@@ -427,7 +427,7 @@
allowed_races = RACES_NO_CONSTRUCT
allowed_patrons = ALL_DIVINE_PATRONS
outfit = /datum/outfit/job/roguetown/martyr
- min_pq = 10 //Cus it's a Martyr of the Ten. Get it.
+ min_pq = null //10 Cus it's a Martyr of the Ten. Get it.
max_pq = null
round_contrib_points = 4
total_positions = 1
diff --git a/code/modules/jobs/job_types/roguetown/church/monk.dm b/code/modules/jobs/job_types/roguetown/church/monk.dm
index 1d028840..7e8fba5d 100644
--- a/code/modules/jobs/job_types/roguetown/church/monk.dm
+++ b/code/modules/jobs/job_types/roguetown/church/monk.dm
@@ -14,7 +14,7 @@
display_order = JDO_MONK
give_bank_account = TRUE
- min_pq = 1 //A step above Churchling, should funnel new players to the churchling role to learn miracles at a more sedate pace
+ min_pq = null //1 A step above Churchling, should funnel new players to the churchling role to learn miracles at a more sedate pace
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/church/priest.dm b/code/modules/jobs/job_types/roguetown/church/priest.dm
index 119ba35a..ce8fafbc 100644
--- a/code/modules/jobs/job_types/roguetown/church/priest.dm
+++ b/code/modules/jobs/job_types/roguetown/church/priest.dm
@@ -18,7 +18,7 @@
display_order = JDO_PRIEST
give_bank_account = 115
- min_pq = 5 // You should know the basics of things if you're going to lead the town's entire religious sector
+ min_pq = null //5 You should know the basics of things if you're going to lead the town's entire religious sector
max_pq = null
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/church/templar.dm b/code/modules/jobs/job_types/roguetown/church/templar.dm
index b89a1b3a..9a8b2099 100644
--- a/code/modules/jobs/job_types/roguetown/church/templar.dm
+++ b/code/modules/jobs/job_types/roguetown/church/templar.dm
@@ -9,7 +9,7 @@
allowed_races = RACES_ALL_KINDS
allowed_patrons = ALL_DIVINE_PATRONS
outfit = /datum/outfit/job/roguetown/templar
- min_pq = 3 //Deus vult, but only according to the proper escalation rules
+ min_pq = null //3 Deus vult, but only according to the proper escalation rules
max_pq = null
round_contrib_points = 2
total_positions = 4
diff --git a/code/modules/jobs/job_types/roguetown/courtier/butler.dm b/code/modules/jobs/job_types/roguetown/courtier/butler.dm
index 1f69f04a..e10b98b6 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/butler.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/butler.dm
@@ -13,7 +13,7 @@
advclass_cat_rolls = list(CTAG_SENESCHAL = 20)
display_order = JDO_BUTLER
give_bank_account = 30
- min_pq = 3
+ min_pq = null //3
max_pq = null
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/courtier/councillor.dm b/code/modules/jobs/job_types/roguetown/courtier/councillor.dm
index 6e0bfbaf..6f3f46e8 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/councillor.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/councillor.dm
@@ -15,7 +15,7 @@
give_bank_account = 40
noble_income = 20
- min_pq = 1 //Probably a bad idea to have a complete newbie advising the monarch
+ min_pq = null //1 Probably a bad idea to have a complete newbie advising the monarch
max_pq = null
round_contrib_points = 2
cmode_music = 'sound/music/combat_noble.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/courtier/jester.dm b/code/modules/jobs/job_types/roguetown/courtier/jester.dm
index efa37db4..a85479f5 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/jester.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/jester.dm
@@ -17,7 +17,7 @@
outfit = /datum/outfit/job/roguetown/jester
display_order = JDO_JESTER
give_bank_account = TRUE
- min_pq = -4 //silly jesters are funny so low PQ requirement
+ min_pq = null //-4 silly jesters are funny so low PQ requirement
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/courtier/magician.dm b/code/modules/jobs/job_types/roguetown/courtier/magician.dm
index da0c5e3c..9bb9506c 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/magician.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/magician.dm
@@ -17,7 +17,7 @@
outfit = /datum/outfit/job/roguetown/magician
whitelist_req = TRUE
give_bank_account = 47
- min_pq = 4 //High potential for abuse, lovepotion/killersice/greater fireball is not for the faint of heart
+ min_pq = null //4 High potential for abuse, lovepotion/killersice/greater fireball is not for the faint of heart
max_pq = null
round_contrib_points = 2
cmode_music = 'sound/music/combat_bandit_mage.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/courtier/physician.dm b/code/modules/jobs/job_types/roguetown/courtier/physician.dm
index 0a12f4b2..fe3780c1 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/physician.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/physician.dm
@@ -18,7 +18,7 @@
whitelist_req = TRUE
give_bank_account = 30
- min_pq = 3 //Please don't kill the duke by operating on strong intent. Play apothecary until you're deserving of the great white beak of doom
+ min_pq = null //3 Please don't kill the duke by operating on strong intent. Play apothecary until you're deserving of the great white beak of doom
max_pq = null
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
index 94fb281c..2c0ea620 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/bogguard.dm
@@ -20,7 +20,7 @@
advclass_cat_rolls = list(CTAG_WARDEN = 20)
give_bank_account = 16
- min_pq = 0
+ min_pq = null //0
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/garrison/dungeoneer.dm b/code/modules/jobs/job_types/roguetown/garrison/dungeoneer.dm
index fbd380e7..86191cbb 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/dungeoneer.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/dungeoneer.dm
@@ -18,7 +18,7 @@
announce_latejoin = FALSE
outfit = /datum/outfit/job/roguetown/dungeoneer
give_bank_account = 25
- min_pq = 0
+ min_pq = null //0
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm b/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm
index f7b0b057..4a8b0e0c 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/manorguard.dm
@@ -19,7 +19,7 @@
advclass_cat_rolls = list(CTAG_MENATARMS = 20)
give_bank_account = 22
- min_pq = 3
+ min_pq = null //3
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/garrison/sergeant.dm b/code/modules/jobs/job_types/roguetown/garrison/sergeant.dm
index ea22be49..260da96b 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/sergeant.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/sergeant.dm
@@ -19,7 +19,7 @@
advclass_cat_rolls = list(CTAG_SERGEANT = 20)
give_bank_account = 50
- min_pq = 6
+ min_pq = null //6
max_pq = null
cmode_music = 'sound/music/combat_ManAtArms.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/garrison/townguard.dm b/code/modules/jobs/job_types/roguetown/garrison/townguard.dm
index d1b730e2..0eb08cad 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/townguard.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/townguard.dm
@@ -17,7 +17,7 @@
advclass_cat_rolls = list(CTAG_WATCH = 20)
give_bank_account = 16
- min_pq = 1 //Introductory guard role, but still requires knowledge of escalation.
+ min_pq = null //1 //Introductory guard role, but still requires knowledge of escalation.
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm
index f3be018c..44615cca 100644
--- a/code/modules/jobs/job_types/roguetown/garrison/veteran.dm
+++ b/code/modules/jobs/job_types/roguetown/garrison/veteran.dm
@@ -14,7 +14,7 @@
display_order = JDO_VET
whitelist_req = TRUE
give_bank_account = 35
- min_pq = 5 //Should...probably actually be a veteran of at least a few weeks before trying to teach others
+ min_pq = null //5 //Should...probably actually be a veteran of at least a few weeks before trying to teach others
max_pq = null
round_contrib_points = 2
@@ -97,6 +97,7 @@
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
H.cmode_music = 'sound/music/combat_duelist.ogg'
/datum/advclass/veteran/footman
@@ -161,7 +162,7 @@
H.verbs |= /mob/proc/haltyell
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
-
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
/datum/advclass/veteran/calvaryman
name = "Tarnished Knight"
tutorial = "You were once a member of a knightly calvary regiment, a prestigious title. You were ontop of the world, the townspeople rejoiced when you rode through their streets. Now, all you can hear is the screams of your brothers-in-arms as they fell. You specialize in mounted warfare."
@@ -224,7 +225,7 @@
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC) // retired knight!
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
-
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
H.adjust_blindness(-3)
var/weapons = list("Sword + Recurve Bow","Axe + Crossbow","Spear + Shield")
var/weapon_choice = input("Choose your weapon.", "TAKE UP ARMS") as anything in weapons
@@ -303,6 +304,7 @@
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
H.cmode_music = 'sound/music/combat_grenzelhoft.ogg'
H.adjust_blindness(-3)
@@ -385,6 +387,7 @@
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC) // You should really be parrying anyways, you have legendary/master skills....
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_WOODSMAN, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
H.cmode_music = 'sound/music/combat_rogue.ogg'
/datum/advclass/veteran/spy
@@ -457,3 +460,4 @@
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_CICERONE, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/goblin/chieftain.dm b/code/modules/jobs/job_types/roguetown/goblin/chieftain.dm
index 35d1dbbe..66f9bf82 100644
--- a/code/modules/jobs/job_types/roguetown/goblin/chieftain.dm
+++ b/code/modules/jobs/job_types/roguetown/goblin/chieftain.dm
@@ -14,7 +14,7 @@
outfit = /datum/outfit/job/roguetown/goblinking
display_order = JDO_GOBLINKING
- min_pq = 2
+ min_pq = null //2
max_pq = null
/datum/outfit/job/roguetown/goblinking/pre_equip(mob/living/carbon/human/H)
diff --git a/code/modules/jobs/job_types/roguetown/goblin/tribalguard.dm b/code/modules/jobs/job_types/roguetown/goblin/tribalguard.dm
index 29507e17..d80376a6 100644
--- a/code/modules/jobs/job_types/roguetown/goblin/tribalguard.dm
+++ b/code/modules/jobs/job_types/roguetown/goblin/tribalguard.dm
@@ -11,7 +11,7 @@
tutorial = "Goblin Guards rensposible for their kingdom and his majesty King."
display_order = JDO_GOBLINGUARD
outfit = /datum/outfit/job/roguetown/goblinguard
- min_pq = 1
+ min_pq = null //1
max_pq = null
/datum/outfit/job/roguetown/goblinguard/pre_equip(mob/living/carbon/human/H)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm
index 621aa534..39befb83 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm
@@ -6,6 +6,8 @@
allowed_races = list(
/datum/species/human/halfelf,
/datum/species/elf/wood,
+ /datum/species/anthromorph,
+ /datum/species/demihuman,
)
outfit = /datum/outfit/job/roguetown/mercenary/blackoak
category_tags = list(CTAG_MERCENARY)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm
index bbb54fba..fca43690 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm
@@ -4,7 +4,7 @@
allowed_sexes = list(MALE, FEMALE)
allowed_races = RACES_ALL_KINDS
outfit = /datum/outfit/job/roguetown/mercenary/forlorn
- min_pq = 2
+ min_pq = null //2
cmode_music = 'sound/music/combat_blackstar.ogg'
traits_applied = list(TRAIT_OUTLANDER)
category_tags = list(CTAG_MERCENARY)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm b/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm
index fc64f921..772d25e8 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm
@@ -10,7 +10,7 @@
tutorial = "Blood stains your hands and the coins you hold. You are a sell-sword, a mercenary, a contractor of war. Where you come from, what you are, who you serve.. none of it matters. What matters is that the mammon flows to your pocket."
display_order = JDO_MERCENARY
selection_color = JCOLOR_MERCENARY
- min_pq = 2 //Will be handled by classes if PQ limiting is needed. --But Until then, learn escalation, mercs.
+ min_pq = null //2 //Will be handled by classes if PQ limiting is needed. --But Until then, learn escalation, mercs.
max_pq = null
round_contrib_points = 1
outfit = null //Handled by classes
diff --git a/code/modules/jobs/job_types/roguetown/nobility/bailiff.dm b/code/modules/jobs/job_types/roguetown/nobility/bailiff.dm
index b8a5d34e..7faa1fe4 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/bailiff.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/bailiff.dm
@@ -18,7 +18,7 @@
give_bank_account = 40
noble_income = 20
- min_pq = 8
+ min_pq = null //8
max_pq = null
round_contrib_points = 3
cmode_music = 'sound/music/combat_guard.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/nobility/captain.dm b/code/modules/jobs/job_types/roguetown/nobility/captain.dm
index 66ec82d1..09f6d535 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/captain.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/captain.dm
@@ -20,7 +20,7 @@
give_bank_account = 26
noble_income = 16
- min_pq = 9
+ min_pq = null //9
max_pq = null
round_contrib_points = 3
cmode_music = 'sound/music/combat_knight.ogg'
@@ -116,6 +116,7 @@
ADD_TRAIT(H, TRAIT_NOBLE, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_GUARDSMAN, TRAIT_GENERIC) //The knightly-est knight to ever knight in the realm.
H.verbs |= list(
/mob/living/carbon/human/proc/request_outlaw,
@@ -227,6 +228,7 @@
ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_GUARDSMAN, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_GOODTRAINER, TRAIT_GENERIC)
H.verbs |= list(/mob/living/carbon/human/proc/request_outlaw, /mob/proc/haltyell, /mob/living/carbon/human/mind/proc/setorders)
H.adjust_blindness(-3)
var/weapons = list(
diff --git a/code/modules/jobs/job_types/roguetown/nobility/consort.dm b/code/modules/jobs/job_types/roguetown/nobility/consort.dm
index e4d28511..d98c66c4 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/consort.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/consort.dm
@@ -17,7 +17,7 @@
display_order = JDO_LADY
give_bank_account = 50
noble_income = 22
- min_pq = 5
+ min_pq = null //5
max_pq = null
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/nobility/hand.dm b/code/modules/jobs/job_types/roguetown/nobility/hand.dm
index 0078d98a..e7000187 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/hand.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/hand.dm
@@ -15,7 +15,7 @@
whitelist_req = TRUE
give_bank_account = 44
noble_income = 22
- min_pq = 9 //The second most powerful person in the realm...
+ min_pq = null //9 //The second most powerful person in the realm...
max_pq = null
round_contrib_points = 3
cmode_music = 'sound/music/combat_noble.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/nobility/knight.dm b/code/modules/jobs/job_types/roguetown/nobility/knight.dm
index a54ef779..bd5f2f93 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/knight.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/knight.dm
@@ -17,7 +17,7 @@
give_bank_account = 22
noble_income = 10
- min_pq = 8
+ min_pq = null //8
max_pq = null
round_contrib_points = 2
diff --git a/code/modules/jobs/job_types/roguetown/nobility/lord.dm b/code/modules/jobs/job_types/roguetown/nobility/lord.dm
index ef88c069..4d2fab5d 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/lord.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/lord.dm
@@ -27,7 +27,7 @@ GLOBAL_LIST_EMPTY(lord_titles)
display_order = JDO_LORD
tutorial = "Elevated upon your throne through a web of intrigue and political upheaval, you are the absolute authority of these lands and at the center of every plot within it. Every man, woman and child is envious of your position and would replace you in less than a heartbeat: Show them the error of their ways."
whitelist_req = FALSE
- min_pq = 10
+ min_pq = null //10
max_pq = null
round_contrib_points = 4
give_bank_account = 1000
diff --git a/code/modules/jobs/job_types/roguetown/nobility/steward.dm b/code/modules/jobs/job_types/roguetown/nobility/steward.dm
index 2839b62f..fd3a6605 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/steward.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/steward.dm
@@ -9,11 +9,11 @@
allowed_races = RACES_NO_CONSTRUCT
allowed_sexes = list(MALE, FEMALE)
display_order = JDO_STEWARD
- tutorial = "Coin, Coin, Coin! Oh beautiful coin: You're addicted to it, and you hold the position as the Grand Duke's personal treasurer of both coin and information. You know the power silver and gold has on a man's mortal soul, and you know just what lengths they'll go to in order to get even more. Keep your festering economy alive- for it is the only thing you can weigh any trust into anymore."
+ tutorial = "Coin, Coin, Coin! Oh beautiful coin: You're addicted to it, and you hold the position as the Grand Duke's personal treasurer of both coin and information. You know the power silver and gold has on a man's mortal soul, and you know just what lengths they'll go to in order to get even more. Keep your festering economy alive - for it is the only thing you can weigh any trust into anymore."
outfit = /datum/outfit/job/roguetown/steward
give_bank_account = 22
noble_income = 16
- min_pq = 3 //Please don't give the vault keys to somebody that's going to lock themselves in on accident
+ min_pq = null //3 //Please don't give the vault keys to somebody that's going to lock themselves in on accident
max_pq = null
round_contrib_points = 3
cmode_music = 'sound/music/combat_noble.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/nobility/suitor.dm b/code/modules/jobs/job_types/roguetown/nobility/suitor.dm
index 7296c159..11f07250 100644
--- a/code/modules/jobs/job_types/roguetown/nobility/suitor.dm
+++ b/code/modules/jobs/job_types/roguetown/nobility/suitor.dm
@@ -16,7 +16,7 @@
display_order = JDO_SUITOR
give_bank_account = 40
noble_income = 20
- min_pq = 3
+ min_pq = null //3
max_pq = null
round_contrib_points = 3
cmode_music = 'sound/music/combat_noble.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/archivist.dm b/code/modules/jobs/job_types/roguetown/yeomen/archivist.dm
index 45c8bb0d..75687b50 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/archivist.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/archivist.dm
@@ -13,7 +13,7 @@
outfit = /datum/outfit/job/roguetown/archivist
display_order = JDO_ARCHIVIST
give_bank_account = 15
- min_pq = 1 // Please do not read smut while brewing bottle bombs. It upsets the maids when they have to scrape archivists off the ceiling.
+ min_pq = null //1 // Please do not read smut while brewing bottle bombs. It upsets the maids when they have to scrape archivists off the ceiling.
max_pq = null
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/guildmaster.dm b/code/modules/jobs/job_types/roguetown/yeomen/guildmaster.dm
index fa421e6a..4b20f732 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/guildmaster.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/guildmaster.dm
@@ -10,20 +10,21 @@
allowed_races = RACES_ALL_KINDS
- tutorial = "You are the leader of the Azure Peak Guild of Crafts. You represents the interests of all of the craftsmen underneath you - including the Tailor\
+ tutorial = "You are the leader of the Azure Peak Guild of Crafts. You represents the interests of all of the craftsmen underneath you - including the Tailor, \
the Blacksmiths, the Artificers and the Architects. Other townspeople may look to you for guidance, but they are not under your control. You are an experienced smith and artificer, and can do their work easily. Protect the craftsmen's interests."
outfit = /datum/outfit/job/roguetown/guildmaster
selection_color = JCOLOR_YEOMAN
display_order = JDO_GUILDMASTER
give_bank_account = 25
- min_pq = 5 // Higher PQ requirement as it is a leadership role. Not for total newbie.
+ min_pq = null //5 // Higher PQ requirement as it is a leadership role. Not for total newbie.
max_pq = null
round_contrib_points = 3
/datum/outfit/job/roguetown/guildmaster/pre_equip(mob/living/carbon/human/H)
ADD_TRAIT(H, TRAIT_SEEPRICES, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_TRAINED_SMITH, TRAIT_GENERIC)
+ ADD_TRAIT(H, TRAIT_ARCYNE_T1, TRAIT_GENERIC)
head = /obj/item/clothing/head/roguetown/chaperon/noble/guildmaster
gloves = /obj/item/clothing/gloves/roguetown/angle/grenzelgloves/blacksmith
if(H.mind)
@@ -32,6 +33,7 @@
H.verbs += /mob/living/carbon/human/proc/guild_announcement
H.adjust_skillrank(/datum/skill/combat/axes, 3, TRUE)
H.adjust_skillrank(/datum/skill/combat/maces, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/crossbows, 3, TRUE)
H.adjust_skillrank(/datum/skill/combat/unarmed, 3, TRUE)
H.adjust_skillrank(/datum/skill/combat/wrestling, 3, TRUE)
H.adjust_skillrank(/datum/skill/labor/lumberjacking, 3, TRUE)
@@ -42,6 +44,7 @@
H.adjust_skillrank(/datum/skill/craft/blacksmithing, 5, TRUE)
H.adjust_skillrank(/datum/skill/craft/armorsmithing, 5, TRUE)
H.adjust_skillrank(/datum/skill/craft/weaponsmithing, 5, TRUE)
+ H.adjust_skillrank(/datum/skill/magic/arcane, 2, TRUE)
H.adjust_skillrank(/datum/skill/craft/smelting, 4, TRUE)
H.adjust_skillrank(/datum/skill/craft/engineering, 3, TRUE) // 2 Engineering, let them make more artificers stuffs
H.adjust_skillrank(/datum/skill/misc/sewing, 2, TRUE) // Worse than the real tailor, so can't steal their job right away
@@ -54,6 +57,7 @@
H.adjust_skillrank(/datum/skill/craft/blacksmithing, 1, TRUE)
H.adjust_skillrank(/datum/skill/craft/armorsmithing, 1, TRUE)
H.adjust_skillrank(/datum/skill/craft/weaponsmithing, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/engineering, 1, TRUE)
H.adjust_skillrank(/datum/skill/craft/smelting, 1, TRUE)
H.adjust_skillrank(/datum/skill/misc/sewing, 1, TRUE) // Worse than the real tailor, so can't steal their job right away
H.adjust_skillrank(/datum/skill/craft/tanning, 1, TRUE)
@@ -66,15 +70,27 @@
/obj/item/rogueweapon/hammer/iron = 1,
/obj/item/rogueweapon/tongs = 1,
/obj/item/recipe_book/blacksmithing = 1,
+ /obj/item/recipe_book/engineering = 1,
+ /obj/item/recipe_book/ceramics = 1,
+ /obj/item/recipe_book/builder = 1,
+ /obj/item/recipe_book/survival = 1,
+ /obj/item/recipe_book/magic = 1,
+ /obj/item/chalk = 1,
)
belt = /obj/item/storage/belt/rogue/leather
beltl = /obj/item/storage/belt/rogue/pouch/coins/rich
beltr = /obj/item/storage/keyring/guildmaster
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/enchant_weapon)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/conjure_weapon)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/conjure_armor)
+
H.change_stat("strength", 2)
H.change_stat("intelligence", 1)
H.change_stat("endurance", 2)
H.change_stat("constitution", 2)
+ H.change_stat("perception", 2)
GLOBAL_VAR_INIT(last_guildmaster_announcement, -50000) // Inits variable for later
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/guildsman.dm b/code/modules/jobs/job_types/roguetown/yeomen/guildsman.dm
index 28aa7c3f..c95e95cc 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/guildsman.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/guildsman.dm
@@ -108,6 +108,7 @@
..()
H.adjust_skillrank(/datum/skill/combat/axes, 2, TRUE)
H.adjust_skillrank(/datum/skill/combat/maces, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
H.adjust_skillrank(/datum/skill/combat/wrestling, 2, TRUE)
H.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
H.adjust_skillrank(/datum/skill/craft/crafting, 4, TRUE)
@@ -150,12 +151,14 @@
if(H.mind)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/enchant_weapon)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/conjure_weapon)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/self/conjure_armor)
ADD_TRAIT(H, TRAIT_ARCYNE_T1, TRAIT_GENERIC)
H.change_stat("strength", 1)
H.change_stat("intelligence", 3)
H.change_stat("endurance", 2)
H.change_stat("constitution", 1)
- H.change_stat("perception", 1)
+ H.change_stat("perception", 2)
/datum/advclass/guildsman/architect
name = "Architect"
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm b/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm
index b8ad8fdd..8ca1a874 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm
@@ -14,7 +14,7 @@
outfit = /datum/outfit/job/roguetown/merchant
give_bank_account = 22
noble_income = 100 // Guild Support - The sole Money Role outside of the keep, should help them keep pace a bit + pick up if they get completely knocked out of coin.
- min_pq = 1 //"Yeah...my guy says the best I can do is one PQ, final offer"
+ min_pq = null //1 //"Yeah...my guy says the best I can do is one PQ, final offer"
max_pq = null
required = TRUE
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/nightmaster.dm b/code/modules/jobs/job_types/roguetown/yeomen/nightmaster.dm
index 8091feb5..839ec80b 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/nightmaster.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/nightmaster.dm
@@ -12,7 +12,7 @@
outfit = /datum/outfit/job/roguetown/niteman
display_order = JDO_NITEMASTER
give_bank_account = 20
- min_pq = 1
+ min_pq = null //1
max_pq = null
bypass_lastclass = TRUE
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/villagechief.dm b/code/modules/jobs/job_types/roguetown/yeomen/villagechief.dm
index 8126227f..8ad06f31 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/villagechief.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/villagechief.dm
@@ -13,7 +13,7 @@
whitelist_req = TRUE
outfit = /datum/outfit/job/roguetown/elder
display_order = JDO_CHIEF
- min_pq = 2 //mentor role, not a high PQ requirement but not zero
+ min_pq = null //2 //mentor role, not a high PQ requirement but not zero
max_pq = null
give_bank_account = 16
round_contrib_points = 3
diff --git a/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm b/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm
index 7cace2a2..5aaa6d20 100644
--- a/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm
+++ b/code/modules/jobs/job_types/roguetown/youngfolk/prince.dm
@@ -17,7 +17,7 @@
display_order = JDO_PRINCE
give_bank_account = 30
noble_income = 20
- min_pq = 1
+ min_pq = null //1
max_pq = null
round_contrib_points = 3
cmode_music = 'sound/music/combat_noble.ogg'
diff --git a/code/modules/jobs/job_types/roguetown/youngfolk/shophand.dm b/code/modules/jobs/job_types/roguetown/youngfolk/shophand.dm
index 3b2d3908..20798a6a 100644
--- a/code/modules/jobs/job_types/roguetown/youngfolk/shophand.dm
+++ b/code/modules/jobs/job_types/roguetown/youngfolk/shophand.dm
@@ -9,35 +9,215 @@
allowed_races = RACES_ALL_KINDS
allowed_sexes = list(MALE, FEMALE)
allowed_ages = list(AGE_ADULT)
-
- tutorial = "You work the largest store in the Peaks by grace of the Merchant who has shackled you to this drudgery. The work of stocking shelves and taking inventory for your employer is mind-numbing and repetitive--but at least you have a roof over your head and comfortable surroundings. With time, perhaps you will one day be more than a glorified servant."
-
- outfit = /datum/outfit/job/roguetown/shophand
+ advclass_cat_rolls = list(CTAG_SHOPHAND = 20)
+ tutorial = "You work the largest store in the Peaks by the grace of the Merchant who has shackled you in service to the Merchant's Guild. You do as you are told and in return are rewarded with meager pay and a roof above your head. With time, perhaps you will one day be more than a glorified servant."
+//"You work the largest store in the Peaks by grace of the Merchant who has shackled you to this drudgery. The work of stocking shelves and taking inventory for your employer is mind-numbing and repetitive--but at least you have a roof over your head and comfortable surroundings. With time, perhaps you will one day be more than a glorified servant."
+ //outfit = /datum/outfit/job/roguetown/shophand
display_order = JDO_SHOPHAND
give_bank_account = TRUE
min_pq = -10
max_pq = null
round_contrib_points = 2
-/datum/outfit/job/roguetown/shophand/pre_equip(mob/living/carbon/human/H)
+/datum/job/roguetown/shophand/after_spawn(mob/living/L, mob/M, latejoin = TRUE)
+ ..()
+ if(L)
+ var/mob/living/carbon/human/H = L
+ H.advsetup = 1
+ H.invisibility = INVISIBILITY_MAXIMUM
+ H.become_blind("advsetup")
+
+/datum/advclass/guildthug
+ name = "Guild Thug"
+ tutorial = "You've been hired by the Merchant's Guild to be their brawn. Valued for your strength and little else, you assist the Merchant in hauling heavy goods, or strong arming potential thiefs."
+ allowed_sexes = list(MALE, FEMALE)
+ allowed_races = RACES_ALL_KINDS
+ outfit = /datum/outfit/job/roguetown/adventurer/guildthug
+ category_tags = list(CTAG_SHOPHAND)
+
+/datum/outfit/job/roguetown/adventurer/guildthug/pre_equip(mob/living/carbon/human/H)
+ ..()
+ H.adjust_skillrank(/datum/skill/combat/wrestling, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/unarmed, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/axes, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/maces, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/cooking, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/athletics, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/swimming, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/climbing, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/labor/mining, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/labor/lumberjacking, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/labor/fishing, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/sneaking, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/stealing, 1, TRUE)
+ var/weapons = list("Knuckles","Cudgel")
+ var/weapon_choice = input("Choose your weapon.", "TAKE UP ARMS") as anything in weapons
+ H.set_blindness(0)
+ switch(weapon_choice)
+ if("Knuckles")
+ beltr = /obj/item/rogueweapon/knuckles/bronzeknuckles
+ if("Cudgel")
+ beltl = /obj/item/rogueweapon/mace/cudgel
+ head = /obj/item/clothing/head/roguetown/roguehood/shalal/heavyhood
+ belt = /obj/item/storage/belt/rogue/leather
+ shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/light
+ pants = /obj/item/clothing/under/roguetown/trou/leather
+ shoes = /obj/item/clothing/shoes/roguetown/boots
+ backl = /obj/item/storage/backpack/rogue/satchel
+ wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
+ gloves = /obj/item/clothing/gloves/roguetown/fingerless
+ neck = /obj/item/storage/belt/rogue/pouch/coins/poor
+ armor = /obj/item/clothing/suit/roguetown/armor/leather/heavy/coat
+ backpack_contents = list(
+ /obj/item/flashlight/flare/torch = 1,
+ /obj/item/rogueweapon/huntingknife = 1,
+ /obj/item/rogueweapon/scabbard/sheath = 1,
+ /obj/item/storage/keyring/merchant = 1,
+ )
+ H.change_stat("strength", 2)
+ H.change_stat("endurance", 1)
+ H.change_stat("constitution", 3)
+ H.change_stat("intelligence", -1)
+ H.grant_language(/datum/language/thievescant)
+ ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, "[type]")
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/appraise/secular)
+
+/datum/advclass/guildinformant
+ name = "Guild Informant"
+ tutorial = "You started as a basic street urchin sneaking and stealing as you needed. On one fateful day you chose to steal from the Merchant's Guild, and now find yourself indebted to their service. Now, you serve as their eyes and ears on the streets of the city."
+ allowed_sexes = list(MALE, FEMALE)
+ allowed_races = RACES_ALL_KINDS
+ outfit = /datum/outfit/job/roguetown/adventurer/guildinformant
+ category_tags = list(CTAG_SHOPHAND)
+
+/datum/outfit/job/roguetown/adventurer/guildinformant/pre_equip(mob/living/carbon/human/H)
+ ..()
+ H.adjust_skillrank(/datum/skill/combat/wrestling, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/combat/maces, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/cooking, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/athletics, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/climbing, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/sneaking, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/lockpicking, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
+ belt = /obj/item/storage/belt/rogue/leather
+ beltl = /obj/item/rogueweapon/mace/cudgel
+ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
+ pants = /obj/item/clothing/under/roguetown/trou/leather
+ shoes = /obj/item/clothing/shoes/roguetown/boots
+ backl = /obj/item/storage/backpack/rogue/satchel
+ wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
+ gloves = /obj/item/clothing/gloves/roguetown/fingerless_leather
+ neck = /obj/item/storage/belt/rogue/pouch/coins/poor
+ armor = /obj/item/clothing/suit/roguetown/armor/leather
+ cloak = /obj/item/clothing/cloak/raincloak/mortus
+ backpack_contents = list(
+ /obj/item/flashlight/flare/torch = 1,
+ /obj/item/rogueweapon/huntingknife/idagger/steel = 1,
+ /obj/item/rogueweapon/scabbard/sheath = 1,
+ /obj/item/storage/keyring/merchant = 1,
+ )
+ H.change_stat("speed", 3)
+ H.change_stat("endurance", 1)
+ H.change_stat("constitution", 1)
+ H.change_stat("intelligence", 1)
+ H.grant_language(/datum/language/thievescant)
+ ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, "[type]")
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/appraise/secular)
+
+/datum/advclass/hiredservant
+ name = "Hired Servant"
+ tutorial = "You are an expert courtier, though find yourself in the service to an aristocrat rather than nobility. Your ability to cater to your Merchant's needs are unparalleled."
+ allowed_sexes = list(MALE, FEMALE)
+ allowed_races = RACES_ALL_KINDS
+ outfit = /datum/outfit/job/roguetown/adventurer/hiredservant
+ category_tags = list(CTAG_SHOPHAND)
+
+/datum/outfit/job/roguetown/adventurer/hiredservant/pre_equip(mob/living/carbon/human/H)
..()
+ backr = /obj/item/storage/backpack/rogue/satchel
+ backpack_contents = list(
+ /obj/item/kitchen/rollingpin = 1,
+ /obj/item/flint = 1,
+ /obj/item/cooking/pan = 1,
+ /obj/item/reagent_containers/peppermill = 1,
+ )
+ belt = /obj/item/storage/belt/rogue/leather
+ beltr = /obj/item/storage/keyring/merchant
+ beltl = /obj/item/storage/belt/rogue/pouch/coins/poor
+ r_hand = /obj/item/reagent_containers/glass/bucket/pot
+ var/loadouts = list("Maid","Butler")
+ var/loadout_choice = input("Choose your attire.") as anything in loadouts
+ H.set_blindness(0)
+ switch(loadout_choice)
+ if("Maid")
+ head = /obj/item/clothing/head/roguetown/armingcap
+ armor = /obj/item/clothing/suit/roguetown/shirt/dress/gen/black
+ shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
+ pants = /obj/item/clothing/under/roguetown/tights/stockings/black
+ cloak = /obj/item/clothing/cloak/apron/waist
+ if("Butler")
+ pants = /obj/item/clothing/under/roguetown/tights/black
+ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
+ shoes = /obj/item/clothing/shoes/roguetown/shortboots
+ armor = /obj/item/clothing/suit/roguetown/armor/leather/vest/black
+ H.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/cooking, 4, TRUE)
+ H.adjust_skillrank(/datum/skill/craft/crafting, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/sewing, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/lockpicking, 1, TRUE)
+ H.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
+ H.adjust_skillrank(/datum/skill/labor/farming, 3, TRUE)
+ H.change_stat("speed", 1)
+ H.change_stat("intelligence", 1)
+ H.change_stat("perception", 2)
+ ADD_TRAIT(H, TRAIT_CICERONE, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, "[type]")
- if(should_wear_femme_clothes(H))
- pants = /obj/item/clothing/under/roguetown/tights
- armor = /obj/item/clothing/suit/roguetown/shirt/dress/gen/blue
- shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
- belt = /obj/item/storage/belt/rogue/leather
- beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
- beltl = /obj/item/storage/keyring/merchant
- backr = /obj/item/storage/backpack/rogue/satchel
- else if(should_wear_masc_clothes(H))
- pants = /obj/item/clothing/under/roguetown/tights
- shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
- shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
- belt = /obj/item/storage/belt/rogue/leather
- beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
- beltl = /obj/item/storage/keyring/merchant
- backr = /obj/item/storage/backpack/rogue/satchel
+ if(H.mind)
+ H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/appraise/secular)
+
+//The original version of the shophand
+/datum/advclass/shoplackey
+ name = "Shop Lackey"
+ tutorial = "You were once a beggar on the street struggling to find your next meal. The Merchant's Guild offered you a roof in exchange for your labor. Now you find yourself as little more than an indentured servant to the Merchant and their whims."
+ allowed_sexes = list(MALE, FEMALE)
+ allowed_races = RACES_ALL_KINDS
+ outfit = /datum/outfit/job/roguetown/adventurer/shoplackey
+ category_tags = list(CTAG_SHOPHAND)
+
+/datum/outfit/job/roguetown/adventurer/shoplackey/pre_equip(mob/living/carbon/human/H)
+ ..()
+ var/loadouts = list("Shirt","Dress")
+ var/loadout_choice = input("Choose your attire.") as anything in loadouts
+ H.set_blindness(0)
+ switch(loadout_choice)
+ if("Dress")
+ pants = /obj/item/clothing/under/roguetown/tights
+ armor = /obj/item/clothing/suit/roguetown/shirt/dress/gen/blue
+ shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
+ belt = /obj/item/storage/belt/rogue/leather
+ beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
+ beltl = /obj/item/storage/keyring/merchant
+ backr = /obj/item/storage/backpack/rogue/satchel
+ if("Shirt")
+ pants = /obj/item/clothing/under/roguetown/tights
+ shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
+ shoes = /obj/item/clothing/shoes/roguetown/simpleshoes
+ belt = /obj/item/storage/belt/rogue/leather
+ beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
+ beltl = /obj/item/storage/keyring/merchant
+ backr = /obj/item/storage/backpack/rogue/satchel
//worse skills than a normal peasant, generally, with random bad combat skill
H.adjust_skillrank(/datum/skill/misc/stealing, 4, TRUE)
H.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
@@ -52,6 +232,7 @@
H.change_stat("speed", 1)
H.change_stat("intelligence", 1)
H.change_stat("fortune", 1)
+ ADD_TRAIT(H, TRAIT_SEEPRICES_SHITTY, "[type]")
if(H.mind)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/appraise/secular)
if(prob(33))
@@ -61,4 +242,4 @@
else //the legendary shopARM
H.adjust_skillrank(/datum/skill/combat/swords, 1, TRUE)
H.adjust_skillrank(/datum/skill/combat/maces, 1, TRUE)
- H.change_stat("strength", 1)
+ H.change_stat("strength", 1)
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 31abaa80..64830170 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(roleplay_readme, world.file2list("strings/rt/rp_prompt.txt"))
else
return JOB_UNAVAILABLE_SLOTFULL
if(length(job.vice_restrictions) || length(job.virtue_restrictions))
- if((client.prefs.virtue?.type in job.virtue_restrictions) || (client.prefs.virtuetwo?.type in job.virtue_restrictions) || (client.prefs.charflaw?.type in job.vice_restrictions))
+ if((client.prefs.virtue?.type in job.virtue_restrictions) || (client.prefs.virtuetwo?.type in job.virtue_restrictions) || (client.prefs.extravirtue?.type in job.virtue_restrictions) || (client.prefs.charflaw?.type in job.vice_restrictions))
return JOB_UNAVAILABLE_VIRTUESVICE
// if(job.title == "Adventurer" && latejoin)
// for(var/datum/job/J in SSjob.occupations)
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm b/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm
index 5ce0d6a7..6ed0dd74 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/_sprite_accessory.dm
@@ -179,6 +179,10 @@
return "ADJ"
if(BODY_FRONT_LAYER)
return "FRONT"
+ if(BODY_FRONTER_LAYER)
+ return "FRONT"
+ if(BODY_FRONTEST_LAYER)
+ return "FRONT"
if(BODY_FRONT_FRONT_LAYER)
return "FFRONT"
if(BODY_UNDER_LAYER)
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/genitals.dm b/code/modules/mob/dead/new_player/sprite_accessory/genitals.dm
index c55a1493..55e464bd 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/genitals.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/genitals.dm
@@ -9,7 +9,7 @@
/datum/sprite_accessory/penis/get_icon_state(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
var/obj/item/organ/penis/pp = organ
- if(pp.sheath_type != SHEATH_TYPE_NONE && pp.erect_state != ERECT_STATE_HARD)
+ if(pp.sheath_type != SHEATH_TYPE_NONE && pp.erect_state < 1) //Do they have a sheath type and is the state bigger than 1?
switch(pp.sheath_type)
if(SHEATH_TYPE_NORMAL)
if(pp.erect_state == ERECT_STATE_NONE)
@@ -21,10 +21,21 @@
return "slit_1"
else
return "slit_2"
+
if(pp.erect_state == ERECT_STATE_HARD)
- return "[icon_state]_[min(3,pp.penis_size+1)]"
+ return "[icon_state]_[max(1, min(5, pp.penis_size))]_1"
+ if(pp.erect_state == ERECT_STATE_STIFF)
+ return "[icon_state]_[max(1, min(5, pp.penis_size))]_0"
+ if(pp.erect_state == ERECT_STATE_PARTIAL) // Not revealed if they have a sheath, see above.
+ return "[icon_state]_[max(1, min(5, pp.penis_size-1))]_0"
+
+ //Normal penis check for those without a sheath, just hang flaccid with -1 size.
+ else if(pp.sheath_type == SHEATH_TYPE_NONE && pp.erect_state == ERECT_STATE_NONE)
+ return "[icon_state]_[max(1, min(5, pp.penis_size-1))]_0"
+
+ //Penis should no longer be aroused, and is hidden, transitions with sheath states as well.
else
- return "[icon_state]_[pp.penis_size]"
+ return "blank"
/datum/sprite_accessory/penis/is_visible(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
if(owner.underwear)
@@ -113,7 +124,7 @@
/datum/sprite_accessory/breasts
icon = 'icons/mob/sprite_accessory/genitals/breasts.dmi'
color_key_name = "Breasts"
- relevant_layers = list(BODY_ADJ_LAYER)
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONTEST_LAYER)
/datum/sprite_accessory/breasts/get_icon_state(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
var/obj/item/organ/breasts/badonkers = organ
@@ -188,14 +199,13 @@
/datum/sprite_accessory/belly
icon = 'icons/mob/sprite_accessory/genitals/belly.dmi'
color_key_name = "Belly"
- relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
/datum/sprite_accessory/belly/get_icon_state(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
var/obj/item/organ/belly/belleh = organ
return "belly_[icon_state]_[belleh.belly_size]"
/datum/sprite_accessory/belly/adjust_appearance_list(list/appearance_list, obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
- generic_gender_feature_adjust(appearance_list, organ, bodypart, owner, OFFSET_SHIRT, OFFSET_SHIRT_F)
+ generic_gender_feature_adjust(appearance_list, organ, bodypart, owner, OFFSET_BELT, OFFSET_BELT_F)
/datum/sprite_accessory/belly/is_visible(obj/item/organ/organ, obj/item/bodypart/bodypart, mob/living/carbon/owner)
return is_human_part_visible(owner, HIDEBOOB|HIDEJUMPSUIT)
@@ -204,6 +214,7 @@
icon_state = "pair"
name = "Belly"
color_key_defaults = list(KEY_CHEST_COLOR)
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONTER_LAYER)
/datum/sprite_accessory/butt
icon = 'icons/mob/sprite_accessory/genitals/butt.dmi'
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/tail_features.dm b/code/modules/mob/dead/new_player/sprite_accessory/tail_features.dm
index ec7c70d8..9813cf30 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/tail_features.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/tail_features.dm
@@ -52,6 +52,14 @@
name = "Aquatic"
icon_state = "aqua"
+/datum/sprite_accessory/tail_feature/large_snake
+ icon = 'icons/mob/sprite_accessory/tail_features/large_snake_markings.dmi'
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+
+/datum/sprite_accessory/tail_feature/large_snake/underbelly
+ name = "Large Snake Underbelly"
+ icon_state = "large_snake_under"
+
/datum/sprite_accessory/tail_feature/vox_marking
abstract_type = /datum/sprite_accessory/tail_feature/vox_marking
icon = 'icons/mob/sprite_accessory/tail_features/vox_markings.dmi'
@@ -104,7 +112,7 @@
icon_state = "drake_markings"
/datum/sprite_accessory/tail_feature/taur/otie
- name = "Virgo Shit Dog Markings"
+ name = "Large Hound Markings"
icon = 'icons/mob/sprite_accessory/tail_features/otie_markings.dmi'
icon_state = "otie_markings"
diff --git a/code/modules/mob/dead/new_player/sprite_accessory/tails.dm b/code/modules/mob/dead/new_player/sprite_accessory/tails.dm
index a164d866..339d72d0 100644
--- a/code/modules/mob/dead/new_player/sprite_accessory/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessory/tails.dm
@@ -154,6 +154,10 @@
icon_state = "lab"
can_wag = TRUE
+/datum/sprite_accessory/tail/large_snake
+ name = "Large Snake"
+ icon_state = "large_snake"
+
/datum/sprite_accessory/tail/murid
name = "Murid"
icon_state = "murid"
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index f38902db..e70a1090 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -419,7 +419,7 @@
/obj/item/proc/equip_to_best_slot(mob/M)
if(src != M.get_active_held_item())
- to_chat(M, span_warning("I are not holding anything to equip!"))
+ to_chat(M, span_warning("I am not holding anything to equip!"))
return FALSE
if(M.equip_to_appropriate_slot(src))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 4ff3fa65..95af1242 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -994,7 +994,8 @@
src.apply_status_effect(/datum/status_effect/buff/undermaidenbargainheal)
return
if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH))
- INVOKE_ASYNC(src, PROC_REF(emote), "deathgurgle")
+ if (!istype(loc, /obj/belly))
+ INVOKE_ASYNC(src, PROC_REF(emote), "deathgurgle")
death()
cure_blind(UNCONSCIOUS_BLIND)
return
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2833cd89..66fa0aaf 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -713,7 +713,14 @@
if(ismob(user.pulling))
user.vore_attack(user, target, src) // User, Pulled, Predator target (which can be user, pulling, or src)
return TRUE
- //If they dragged themselves and we're currently aggressively grabbing them try to piggyback (not on cmode)
+ //Pick them up. Pick. Them. Up.
+ if(ishuman(target) && ishuman(user))
+ var/mob/living/carbon/human/userhuman = user
+ var/mob/living/carbon/human/targethuman = target
+ if(targethuman.small_enough(userhuman) && user.grab_state)
+ if(targethuman.attempt_scoop(userhuman))
+ return TRUE
+ //If they dragged themselves and we're currently aggressively grabbing them try to piggyback (not on cmode)
if(user == target && can_piggyback(target))
if(HAS_TRAIT(src, TRAIT_MICRO))
to_chat(target, span_warning("[src] is too small!"))
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index a71fb33c..1dd10933 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -22,21 +22,32 @@
def_zone = CBP.body_zone
var/protection = 0
var/obj/item/clothing/used
+ if(def_zone == BODY_ZONE_TAUR)
+ def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/list/body_parts = list(skin_armor, head, wear_mask, wear_wrists, gloves, wear_neck, cloak, wear_armor, wear_shirt, shoes, wear_pants, backr, backl, belt, s_store, glasses, ears, wear_ring) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
- for(var/bp in body_parts)
- if(!bp)
- continue
- if(bp && istype(bp , /obj/item/clothing))
- var/obj/item/clothing/C = bp
- if(zone2covered(def_zone, C.body_parts_covered_dynamic))
- if(C.max_integrity)
- if(C.obj_integrity <= 0)
- continue
- var/val = C.armor.getRating(d_type)
- if(val > 0)
- if(val > protection)
- protection = val
- used = C
+ if(skin_armor)
+ var/obj/item/clothing/C = skin_armor
+ if(C.obj_integrity > 0)
+ var/val = C.armor.getRating(d_type)
+ if(val > 0)
+ if(val > protection)
+ protection = val
+ used = C
+ else
+ for(var/bp in body_parts)
+ if(!bp)
+ continue
+ if(bp && istype(bp , /obj/item/clothing))
+ var/obj/item/clothing/C = bp
+ if(zone2covered(def_zone, C.body_parts_covered_dynamic))
+ if(C.max_integrity)
+ if(C.obj_integrity <= 0)
+ continue
+ var/val = C.armor.getRating(d_type)
+ if(val > 0)
+ if(val > protection)
+ protection = val
+ used = C
if(used)
if(!blade_dulling)
blade_dulling = BCLASS_BLUNT
diff --git a/code/modules/mob/living/carbon/human/npc/_npc.dm b/code/modules/mob/living/carbon/human/npc/_npc.dm
index 6912a05d..af5e4cb3 100644
--- a/code/modules/mob/living/carbon/human/npc/_npc.dm
+++ b/code/modules/mob/living/carbon/human/npc/_npc.dm
@@ -75,6 +75,8 @@
ignore_grab ||= TRUE
if(on_fire || buckled || restrained(ignore_grab = ignore_grab))
return TRUE
+ if(istype(loc,/obj/item/micro))
+ return TRUE
return FALSE
/mob/living/carbon/human/proc/process_ai()
diff --git a/code/modules/mob/living/carbon/human/npc/drow.dm b/code/modules/mob/living/carbon/human/npc/drow.dm
index d1d0243a..d0eb13d4 100644
--- a/code/modules/mob/living/carbon/human/npc/drow.dm
+++ b/code/modules/mob/living/carbon/human/npc/drow.dm
@@ -91,6 +91,7 @@ GLOBAL_LIST_INIT(drowraider_aggro, world.file2list("strings/rt/drowaggrolines.tx
real_name = pick(world.file2list("strings/rt/names/elf/elfdm.txt"))
update_hair()
update_body()
+ head.sellprice = 40 // Drow are dangerous! They're also dangerous to get to and, depending on location, like to run into acid vats. This accounts for that.
/mob/living/carbon/human/species/elf/dark/drowraider/npc_idle()
if(m_intent == MOVE_INTENT_SNEAK)
diff --git a/code/modules/mob/living/carbon/human/npc/skeleton.dm b/code/modules/mob/living/carbon/human/npc/skeleton.dm
index a93f1385..a9e6246e 100644
--- a/code/modules/mob/living/carbon/human/npc/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/npc/skeleton.dm
@@ -83,6 +83,8 @@
var/datum/outfit/OU = new skel_outfit
if(OU)
equipOutfit(OU)
+ var/obj/item/bodypart/head = get_bodypart(BODY_ZONE_HEAD)
+ head.sellprice = 20 //there's a LOT of these guys. May later change head prices depending on skeletype. Dread knights > nakeds.
/datum/outfit/job/roguetown/npc/skeleton/pre_equip(mob/living/carbon/human/H)
..()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 45a21788..1d850eee 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1015,8 +1015,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.add_stress(/datum/stressevent/starving)
H.remove_stress_list(list(/datum/stressevent/stuffed,/datum/stressevent/peckish,/datum/stressevent/hungry))
H.apply_status_effect(/datum/status_effect/debuff/hungryt3)
- if(prob(3))
- playsound(get_turf(H), pick('sound/vo/hungry1.ogg','sound/vo/hungry2.ogg','sound/vo/hungry3.ogg'), 100, TRUE, -1)
+ if(!istype(H.loc, /obj/belly))
+ if(prob(3))
+ playsound(get_turf(H), pick('sound/vo/hungry1.ogg','sound/vo/hungry2.ogg','sound/vo/hungry3.ogg'), 100, TRUE, -1)
switch(H.hydration)
// if(HYDRATION_LEVEL_WATERLOGGED to INFINITY)
diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm
index 7273a652..5d88d7bb 100644
--- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorph.dm
@@ -43,6 +43,7 @@
/obj/item/bodypart/taur/altnaga,
/obj/item/bodypart/taur/altnagatailmaw,
/obj/item/bodypart/taur/fatnaga,
+ /obj/item/bodypart/taur/caustic/bunny,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
diff --git a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm
index 9ec566f7..8822aa36 100644
--- a/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furry/anthromorphsmall.dm
@@ -34,7 +34,7 @@
OFFSET_SHIRT = list(0,0), OFFSET_ARMOR = list(0,0), OFFSET_HANDS = list(0,-3), OFFSET_UNDIES = list(0,-4), \
OFFSET_ID_F = list(0,-5), OFFSET_GLOVES_F = list(0,-4), OFFSET_WRISTS_F = list(0,-4), OFFSET_HANDS_F = list(0,-4), \
OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-5), OFFSET_HEAD_F = list(0,-5), \
- OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-4), OFFSET_BACK_F = list(0,-5), \
+ OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-4), OFFSET_BUTT = list(0,-4), OFFSET_BACK_F = list(0,-5), \
OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_PANTS_F = list(0,0), \
OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-4), \
)
diff --git a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm
index ed831960..2e779b05 100644
--- a/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furry/demihuman.dm
@@ -33,6 +33,7 @@
/obj/item/bodypart/taur/altnaga,
/obj/item/bodypart/taur/altnagatailmaw,
/obj/item/bodypart/taur/fatnaga,
+ /obj/item/bodypart/taur/caustic/bunny,
)
default_features = MANDATORY_FEATURE_LIST
use_skintones = TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm
index c4c3eb86..8dd03b77 100644
--- a/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furry/kobold.dm
@@ -20,14 +20,14 @@
custom_clothes = TRUE
clothes_id = "dwarf"
offset_features = list(
- OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,-3), OFFSET_WRISTS = list(0,-3),\
+ OFFSET_ID = list(0,-4), OFFSET_GLOVES = list(0,-3), OFFSET_WRISTS = list(0,-3),\
OFFSET_CLOAK = list(0,0), OFFSET_FACEMASK = list(0,-4), OFFSET_HEAD = list(0,-4), \
OFFSET_FACE = list(0,-4), OFFSET_BELT = list(0,-4), OFFSET_BACK = list(0,-3), \
OFFSET_NECK = list(0,-4), OFFSET_MOUTH = list(0,-4), OFFSET_PANTS = list(0,0), \
OFFSET_SHIRT = list(0,0), OFFSET_ARMOR = list(0,0), OFFSET_HANDS = list(0,-3), \
- OFFSET_ID_F = list(0,-4), OFFSET_GLOVES_F = list(0,-4), OFFSET_WRISTS_F = list(0,-4), OFFSET_HANDS_F = list(0,-4), \
+ OFFSET_ID_F = list(0,-5), OFFSET_GLOVES_F = list(0,-4), OFFSET_WRISTS_F = list(0,-4), OFFSET_HANDS_F = list(0,-4), \
OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-5), OFFSET_HEAD_F = list(0,-5), \
- OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-4), OFFSET_BACK_F = list(0,-4), \
+ OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-4), OFFSET_BUTT = list(0,-4), OFFSET_BACK_F = list(0,-4), \
OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_PANTS_F = list(0,0), \
OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \
)
diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/construct/constructm.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/construct/constructm.dm
index ade2f7ab..025642b8 100644
--- a/code/modules/mob/living/carbon/human/species_types/roguetown/construct/constructm.dm
+++ b/code/modules/mob/living/carbon/human/species_types/roguetown/construct/constructm.dm
@@ -55,20 +55,54 @@
customizers = list(
/datum/customizer/organ/eyes/humanoid,
/datum/customizer/bodypart_feature/crest,
+ /datum/customizer/bodypart_feature/hair/head/humanoid,
+ /datum/customizer/bodypart_feature/hair/facial/humanoid,
/datum/customizer/bodypart_feature/accessory,
/datum/customizer/bodypart_feature/face_detail,
/datum/customizer/bodypart_feature/underwear,
+ /datum/customizer/organ/testicles/anthro,
/datum/customizer/organ/penis/anthro,
/datum/customizer/organ/breasts/human,
/datum/customizer/organ/vagina/human_anthro,
+ /datum/customizer/organ/belly/human,
+ /datum/customizer/organ/butt/human,
)
body_marking_sets = list(
/datum/body_marking_set/none,
+ /datum/body_marking_set/belly,
+ /datum/body_marking_set/bellysocks,
+ /datum/body_marking_set/tiger,
+ /datum/body_marking_set/tiger_dark,
)
body_markings = list(
+ /datum/body_marking/flushed_cheeks,
/datum/body_marking/eyeliner,
+ /datum/body_marking/plain,
+ /datum/body_marking/tiger,
+ /datum/body_marking/tiger/dark,
+ /datum/body_marking/sock,
+ /datum/body_marking/socklonger,
+ /datum/body_marking/tips,
+ /datum/body_marking/bellyscale,
+ /datum/body_marking/bellyscaleslim,
+ /datum/body_marking/bellyscalesmooth,
+ /datum/body_marking/bellyscaleslimsmooth,
+ /datum/body_marking/buttscale,
+ /datum/body_marking/belly,
+ /datum/body_marking/bellyslim,
+ /datum/body_marking/butt,
+ /datum/body_marking/tie,
+ /datum/body_marking/tiesmall,
+ /datum/body_marking/backspots,
+ /datum/body_marking/front,
+ /datum/body_marking/drake_eyes,
/datum/body_marking/tonage,
+ /datum/body_marking/spotted,
/datum/body_marking/nose,
+ /datum/body_marking/harlequin,
+ /datum/body_marking/harlequinreversed,
+ /datum/body_marking/bangs,
+ /datum/body_marking/bun,
)
/datum/species/construct/metal/check_roundstart_eligible()
diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm
index f524a8ee..90625047 100644
--- a/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm
+++ b/code/modules/mob/living/carbon/human/species_types/roguetown/dwarf/dwarfm.dm
@@ -48,7 +48,7 @@
OFFSET_SHIRT = list(0,0), OFFSET_ARMOR = list(0,0), OFFSET_HANDS = list(0,-3), \
OFFSET_ID_F = list(0,-4), OFFSET_GLOVES_F = list(0,-4), OFFSET_WRISTS_F = list(0,-4), OFFSET_HANDS_F = list(0,-4), \
OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-5), OFFSET_HEAD_F = list(0,-5), \
- OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-5), OFFSET_BACK_F = list(0,-5), \
+ OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-5), OFFSET_BUTT = list(0,-4), OFFSET_BACK_F = list(0,-5), \
OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_PANTS_F = list(0,0), \
OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES = list(0,-4), OFFSET_UNDIES_F = list(0,-4), \
)
diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm
index 03ed3d34..1ae016a4 100644
--- a/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm
+++ b/code/modules/mob/living/carbon/human/species_types/roguetown/goblin/goblinp.dm
@@ -9,7 +9,7 @@
mindless, enthralled waves of the creatures to attack civilization from lunar portals. It leaves the typical goblinoid to cloister in their hidden away tribes, stealing \
from the scraps out of fear of reprisal while shooing away outsiders. The cities of Man typically shun them, but it's not unheard of to see one pushing their luck in a \
town square or out on a well-traveled road, as even the most backwater peasant can tell the difference between a sapient one and portal-spawn. Usually.
\
- (+1 Speed)"
+ (+1 Speed)"
species_traits = list(EYECOLOR,LIPS,STUBBLE)
possible_ages = ALL_AGES_LIST
use_skintones = TRUE
@@ -46,7 +46,7 @@
OFFSET_SHIRT = list(0,0), OFFSET_ARMOR = list(0,0), OFFSET_HANDS = list(0,-3), OFFSET_UNDIES = list(0,-4), \
OFFSET_ID_F = list(0,-5), OFFSET_GLOVES_F = list(0,-4), OFFSET_WRISTS_F = list(0,-4), OFFSET_HANDS_F = list(0,-4), \
OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-5), OFFSET_HEAD_F = list(0,-5), \
- OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-4), OFFSET_BACK_F = list(0,-5), \
+ OFFSET_FACE_F = list(0,-5), OFFSET_BELT_F = list(0,-4), OFFSET_BUTT = list(0,-4), OFFSET_BACK_F = list(0,-5), \
OFFSET_NECK_F = list(0,-5), OFFSET_MOUTH_F = list(0,-5), OFFSET_PANTS_F = list(0,0), \
OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-4), \
)
diff --git a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm
index 83a79520..35db2562 100644
--- a/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm
+++ b/code/modules/mob/living/carbon/human/species_types/roguetown/other/tiefling.dm
@@ -70,7 +70,7 @@
/datum/customizer/bodypart_feature/face_detail,
/datum/customizer/bodypart_feature/underwear,
/datum/customizer/organ/horns/anthro,
- /datum/customizer/organ/tail/tiefling,
+ /datum/customizer/organ/tail/demihuman,
/datum/customizer/organ/testicles/anthro,
/datum/customizer/organ/penis/anthro,
/datum/customizer/organ/breasts/human,
diff --git a/code/modules/mob/living/carbon/stress.dm b/code/modules/mob/living/carbon/stress.dm
index eb7536c0..3574ae31 100644
--- a/code/modules/mob/living/carbon/stress.dm
+++ b/code/modules/mob/living/carbon/stress.dm
@@ -1,4 +1,4 @@
-GLOBAL_LIST_INIT(stress_messages, world.file2list("strings/rt/stress_messages.txt"))
+//GLOBAL_LIST_INIT(stress_messages, world.file2list("strings/rt/stress_messages.txt"))
/mob/proc/add_stress(event_type)
return
@@ -124,13 +124,13 @@ GLOBAL_LIST_INIT(stress_messages, world.file2list("strings/rt/stress_messages.tx
play_mental_break_indicator()
apply_status_effect(/datum/status_effect/mood/vbad)
- if(new_stress >=13)
+ /*if(new_stress >=13)
if(!HAS_TRAIT(src, TRAIT_EORAN_CALM) && !HAS_TRAIT(src, TRAIT_EORAN_SERENE))
random_stress_message()
if(new_stress >= 20)
if(!HAS_TRAIT(src, TRAIT_EORAN_CALM) && !HAS_TRAIT(src, TRAIT_EORAN_SERENE))
- roll_streak_freakout()
+ roll_streak_freakout()*/
oldstress = new_stress
update_stress_visual(new_stress)
@@ -176,7 +176,7 @@ GLOBAL_LIST_INIT(stress_messages, world.file2list("strings/rt/stress_messages.tx
update_client_colour()
-/mob/living/carbon/proc/roll_streak_freakout()
+/*/mob/living/carbon/proc/roll_streak_freakout()
if(stat != CONSCIOUS)
return
if(mob_timers["next_stress_freakout"])
@@ -186,7 +186,7 @@ GLOBAL_LIST_INIT(stress_messages, world.file2list("strings/rt/stress_messages.tx
return
// Randomized cooldown
mob_timers["next_stress_freakout"] = world.time + rand(60 SECONDS, 120 SECONDS)
- stress_freakout()
+ stress_freakout()*/
/mob/living/carbon/proc/stress_freakout()
to_chat(src, span_boldred("I PANIC!!!"))
@@ -215,13 +215,13 @@ GLOBAL_LIST_INIT(stress_messages, world.file2list("strings/rt/stress_messages.tx
animate(whole_screen, transform = newmatrix, time = 1, easing = QUAD_EASING)
animate(transform = -newmatrix, time = 30, easing = QUAD_EASING)
-/mob/living/carbon/proc/random_stress_message()
+/*/mob/living/carbon/proc/random_stress_message()
if(mob_timers["next_stress_message"])
if(world.time < mob_timers["next_stress_message"])
return
mob_timers["next_stress_message"] = world.time + rand(80 SECONDS, 160 SECONDS) //not as important as freakout
var/stress_message_picked = pick(GLOB.stress_messages)
- to_chat(client, span_danger("[stress_message_picked]"))
+ to_chat(client, span_danger("[stress_message_picked]"))*/
/mob/living/carbon/get_stress_amount()
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 8537c1af..d863f61f 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -160,16 +160,17 @@
// AZURE EDIT BEGIN: necra acolyte/priest deathsight trait
// this was a player that just died, so do the honors
if (client)
- if (!gibbed)
- var/locale = prepare_deathsight_message()
- for (var/mob/living/player in GLOB.player_list)
- if (player.stat == DEAD || isbrain(player))
- continue
- if (HAS_TRAIT(player, TRAIT_DEATHSIGHT))
- if (HAS_TRAIT(player, TRAIT_CABAL))
- to_chat(player, span_warning("I feel the faint passage of disjointed life essence as it flees [locale]."))
- else
- to_chat(player, span_warning("Veiled whispers herald the Undermaiden's gaze in my mind's eye as it turn towards [locale] for but a brief, singular moment."))
+ if (!istype(src.loc, /obj/belly))
+ if (!gibbed)
+ var/locale = prepare_deathsight_message()
+ for (var/mob/living/player in GLOB.player_list)
+ if (player.stat == DEAD || isbrain(player))
+ continue
+ if (HAS_TRAIT(player, TRAIT_DEATHSIGHT))
+ if (HAS_TRAIT(player, TRAIT_CABAL))
+ to_chat(player, span_warning("I feel the faint passage of disjointed life essence as it flees [locale]."))
+ else
+ to_chat(player, span_warning("Veiled whispers herald the Undermaiden's gaze in my mind's eye as it turn towards [locale] for but a brief, singular moment."))
// AZURE EDIT END
return TRUE
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f004c5c4..638eca45 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -247,6 +247,13 @@
return TRUE
return TRUE
+ if(ishuman(M) && ishuman(src))
+ var/mob/living/carbon/human/srchuman = src
+ if(srchuman.handle_micro_bump_helping(M))
+ forceMove(M.loc)
+ now_pushing = FALSE
+ return TRUE
+
//okay, so we didn't switch. but should we push?
//not if he's not CANPUSH of course
if(!(M.status_flags & CANPUSH))
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 7d02383f..ad1c7d65 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -460,7 +460,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if((!Zs_too && !isobserver(AM)) || message_mode == MODE_WHISPER)
if(movable_turf.z != self_z)
continue
- if(Zs_too && AM.z != src.z && !Zs_all)
+ if(Zs_too && listener_turf.z != self_turf.z && !Zs_all)
if(!Zs_yell && !HAS_TRAIT(AM, TRAIT_KEENEARS))
if(listener_turf.z < speaker_turf.z && listener_has_ceiling) //Listener is below the speaker and has a ceiling above them
continue
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 97c2184a..b04ad277 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -731,25 +731,30 @@
if(CL.armor_class == ARMOR_CLASS_HEAVY)
if(!HAS_TRAIT(src, TRAIT_HEAVYARMOR))
return FALSE
+
if(CL.armor_class == ARMOR_CLASS_MEDIUM)
if(!HAS_TRAIT(src, TRAIT_HEAVYARMOR))
if(!HAS_TRAIT(src, TRAIT_MEDIUMARMOR))
return FALSE
+
if(istype(src.wear_shirt, /obj/item/clothing))
var/obj/item/clothing/CL = src.wear_shirt
if(CL.armor_class == ARMOR_CLASS_HEAVY)
if(!HAS_TRAIT(src, TRAIT_HEAVYARMOR))
return FALSE
+
if(CL.armor_class == ARMOR_CLASS_MEDIUM)
if(!HAS_TRAIT(src, TRAIT_HEAVYARMOR))
if(!HAS_TRAIT(src, TRAIT_MEDIUMARMOR))
return FALSE
+
if(istype(src.wear_pants, /obj/item/clothing))
var/obj/item/clothing/CL = src.wear_pants
if(CL.armor_class == ARMOR_CLASS_HEAVY)
if(!HAS_TRAIT(src, TRAIT_HEAVYARMOR))
return FALSE
- if(CL.armor_class == ARMOR_CLASS_MEDIUM)
+
+ if(CL.armor_class == ARMOR_CLASS_MEDIUM) //please use basic spacing
if(!HAS_TRAIT(src, TRAIT_HEAVYARMOR))
if(!HAS_TRAIT(src, TRAIT_MEDIUMARMOR))
return FALSE
diff --git a/code/modules/mob/vision_cone.dm b/code/modules/mob/vision_cone.dm
index 5c8e18cc..ec6b5a31 100644
--- a/code/modules/mob/vision_cone.dm
+++ b/code/modules/mob/vision_cone.dm
@@ -104,6 +104,8 @@
I.pixel_y = 0
client.images += I
client.hidden_images += I
+ if(currentlystandardized)
+ refresh_standardized_sprite()
I.appearance_flags = RESET_TRANSFORM|KEEP_TOGETHER|PIXEL_SCALE
if(buckled)
var/image/IB = image(buckled, buckled)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 1d208bc1..e0134dce 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -9,16 +9,30 @@
glass_name = "glass of tomato juice"
glass_desc = ""
shot_glass_icon_state = "shotglassred"
+/datum/reagent/blood/shitty
+ name = "Dirty blood"
+ color = "#941010" // rgb: 148, 16, 16
+ taste_description = "rancid iron"
+ taste_mult = 1.5
+ glass_name = "glass of dirty tomato juice"
/datum/reagent/blood/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
if(iscarbon(L))
var/mob/living/carbon/C = L
if(C.get_blood_id() == /datum/reagent/blood && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
- if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type)))
+ if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type)) || !HAS_TRAIT(C,TRAIT_NASTY_EATER))
C.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5)
else
C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM)
-
+//Dirty blood shouldn't go in your veins!
+/datum/reagent/blood/shitty/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ if(C.get_blood_id() == /datum/reagent/blood && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
+ if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type)) || !(HAS_TRAIT(C, TRAIT_NASTY_EATER) && HAS_TRAIT(C, TRAIT_WILD_EATER)))
+ C.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.8)
+ else
+ C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM)
/datum/reagent/blood/on_merge(list/mix_data)
if(data && mix_data)
@@ -38,16 +52,29 @@
if(data["blood_DNA"])
B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+/datum/reagent/blood/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
+ if(method == INGEST) // Make sure you DRANK the blood before giving damage
+ ..()
+
/datum/reagent/blood/on_mob_life(mob/living/carbon/H)//I hate you
..()
if(HAS_TRAIT(H, TRAIT_NASTY_EATER))
return
H.add_nausea(12) //Over 8 units will cause puking
+/datum/reagent/blood/shitty/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
+ if (method == INGEST)
+ ..()
+/datum/reagent/blood/shitty/on_mob_life(mob/living/carbon/H)
+ ..()
+ if(HAS_TRAIT(H, TRAIT_NASTY_EATER) && HAS_TRAIT(H, TRAIT_WILD_EATER))
+ return
+ H.add_nausea(18) //Do not drink dirty blood!
+
/datum/reagent/blood/green
color = "#05af01"
-/datum/reagent/liquidgibs
+/datum/reagent/liquidgibs // Editor's note: what the fuck
name = "Liquid gibs"
color = "#CC4633"
description = "You don't even want to think about what's in here."
@@ -88,6 +115,8 @@
taste_description = "something vile"
color = "#98934bc6"
harmful = TRUE
+/datum/reagent/water/gross/sewage
+ taste_description = "repulsive sulfur and decaying shit"
/datum/reagent/water/gross/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
if(method == INGEST) // Make sure you DRANK the toxic water before giving damage
@@ -99,7 +128,14 @@
return
M.adjustToxLoss(1)
M.add_nausea(12) //Over 8 units will cause puking
-
+/datum/reagent/water/gross/sewage/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
+ if (method == INGEST)
+ ..()
+/datum/reagent/water/gross/sewage/on_mob_life(mob/living/carbon/M)
+ ..()
+ //I am not putting in a NASTY_EATER check for this. He's the god of bloodshed, not the god of coprophagia.
+ M.adjustToxLoss(4) //Horrible day for poop drinkers
+ M.add_nausea(20)
/datum/chemical_reaction/grosswaterboil //boiling water purifies it
name = "gross water purification"
id = /datum/reagent/water
@@ -122,10 +158,12 @@
/datum/reagent/water/salty/on_mob_life(mob/living/carbon/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!HAS_TRAIT(H, TRAIT_NOHUNGER)&&!HAS_TRAIT(H, TRAIT_SEA_DRINKER))
- H.adjust_hydration(-6) //saltwater dehydrates more than it hydrates
+ if(!(HAS_TRAIT(H, TRAIT_NOHUNGER) || HAS_TRAIT(H, TRAIT_SEA_DRINKER))) // Small edit for readability. De Morgans Law my beloved
+ H.adjust_hydration(-hydration) //saltwater dehydrates more than it hydrates
+ M.adjustToxLoss(0.25) // Slightly toxic
+ M.add_nausea(2)
else if(HAS_TRAIT(H, TRAIT_SEA_DRINKER))
- H.adjust_hydration(hydration) //saltwater dehydrates more than it hydrates
+ H.adjust_hydration(hydration)
..()
/datum/chemical_reaction/saltwaterify
diff --git a/code/modules/roguetown/roguecrafting/items.dm b/code/modules/roguetown/roguecrafting/items.dm
index 8e921339..226d8463 100644
--- a/code/modules/roguetown/roguecrafting/items.dm
+++ b/code/modules/roguetown/roguecrafting/items.dm
@@ -439,6 +439,16 @@
)
craftdiff = 1
+/datum/crafting_recipe/roguetown/survival/reform_gem
+ name = "gem of reformation"
+ result = /obj/item/reformation_gem
+ reqs = list(
+ /obj/item/roguegem = 1,
+ /datum/reagent/medicine/healthpot = 15,
+ )
+ craftdiff = 2
+ subtype_reqs = TRUE
+
// Unfortunately there's no good category for it, yet.
// I don't want ration paper to be too expensive, making wrapped food underused
// So instead, ration paper is a very cheap recipe with parchment and tallow (instead of full fat) that makes 2 wrapper
diff --git a/code/modules/roguetown/roguecrafting/structure.dm b/code/modules/roguetown/roguecrafting/structure.dm
index 86632753..a4fceb4f 100644
--- a/code/modules/roguetown/roguecrafting/structure.dm
+++ b/code/modules/roguetown/roguecrafting/structure.dm
@@ -861,11 +861,12 @@
verbage = "weaves"
craftdiff = 0
-/datum/crafting_recipe/roguetown/structure/respawn_portal
+// Not required with the new gem but will leave it here.
+/*/datum/crafting_recipe/roguetown/structure/respawn_portal
name = "reformation gate"
result = /obj/structure/respawn_portal
reqs = list(/obj/item/roguegem/blue = 1)
verbage_simple = "build"
verbage = "builds"
craftsound = null
- craftdiff = 2
+ craftdiff = 2*/
diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm
index 6d4e2c3f..92c8664e 100644
--- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm
+++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm
@@ -394,7 +394,7 @@
req_bar = /obj/item/ingot/copper
created_item = /obj/item/cooking/platter/copper
craftdiff = 1
- createditem_num = 1
+ createditem_num = 2
/datum/anvil_recipe/tools/platter/tin
name = "2x Platters (Tin)"
diff --git a/code/modules/roguetown/roguemachine/merchant/goldface.dm b/code/modules/roguetown/roguemachine/merchant/goldface.dm
index 64063113..aa46f99d 100644
--- a/code/modules/roguetown/roguemachine/merchant/goldface.dm
+++ b/code/modules/roguetown/roguemachine/merchant/goldface.dm
@@ -144,7 +144,7 @@
var/shoplength = PA.contains.len
var/l
for(l=1,l<=shoplength,l++)
- var/pathi = pick(PA.contains)
+ var/pathi = PA.contains[l]
new pathi(get_turf(M))
if(href_list["change"])
if(budget > 0)
diff --git a/code/modules/spells/roguetown/acolyte/eora.dm b/code/modules/spells/roguetown/acolyte/eora.dm
index 3e898d98..65a582d6 100644
--- a/code/modules/spells/roguetown/acolyte/eora.dm
+++ b/code/modules/spells/roguetown/acolyte/eora.dm
@@ -41,7 +41,7 @@
range = 7
overlay_state = "love"
sound = list('sound/magic/magnet.ogg')
- req_items = list(/obj/item/clothing/neck/roguetown/psicross/eora)
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
releasedrain = 40
chargetime = 60
warnie = "spellwarning"
@@ -81,7 +81,7 @@
warnie = "sydwarning"
movement_interrupt = FALSE
chargedloop = null
- req_items = list(/obj/item/clothing/neck/roguetown/psicross/eora)
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
sound = 'sound/magic/whiteflame.ogg'
associated_skill = /datum/skill/magic/holy
antimagic_allowed = TRUE
@@ -342,7 +342,7 @@
invocation = "Eora, nourish this offering!"
desc = "Bless a food item. Items that take longer to eat heal slower. Skilled clergy can bless food more often. Finer food heals more."
sound = 'sound/magic/magnet.ogg'
- req_items = list(/obj/item/clothing/neck/roguetown/psicross/eora)
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
devotion_cost = 25
recharge_time = 90 SECONDS
overlay_state = "bread"
@@ -378,7 +378,7 @@
invocation = "Eora, provide sanctuary for your beauty!"
desc = "Grow a cool tree."
sound = 'sound/magic/magnet.ogg'
- req_items = list(/obj/item/clothing/neck/roguetown/psicross/eora)
+ req_items = list(/obj/item/clothing/neck/roguetown/psicross)
devotion_cost = 500
recharge_time = 5 SECONDS
chargetime = 1 SECONDS
diff --git a/code/modules/surgery/bodyparts/taur.dm b/code/modules/surgery/bodyparts/taur.dm
index 2eb85ab3..f6334114 100644
--- a/code/modules/surgery/bodyparts/taur.dm
+++ b/code/modules/surgery/bodyparts/taur.dm
@@ -156,7 +156,7 @@ GLOBAL_LIST_INIT(taur_types, subtypesof(/obj/item/bodypart/taur))
has_taur_color = TRUE
/obj/item/bodypart/taur/otie
- name = "Virgo shit dog"
+ name = "Large Hound"
offset_x = -16
taur_icon_state = "otie_s"
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index df7fa908..07497675 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -151,6 +151,10 @@
name = "undead eyes"
desc = ""
+/obj/item/organ/eyes/night_vision/feral
+ name = "feral eyes"
+ desc = ""
+
/obj/item/organ/eyes/construct
name = "construct eyes"
desc = "Some beast's eyes, preserved through artifice and with magical rock embedded in their back. Seems to fit a construct's head."
diff --git a/code/modules/surgery/organs/feature_organs/genitals.dm b/code/modules/surgery/organs/feature_organs/genitals.dm
index f5f5f77c..400eba9b 100644
--- a/code/modules/surgery/organs/feature_organs/genitals.dm
+++ b/code/modules/surgery/organs/feature_organs/genitals.dm
@@ -25,6 +25,8 @@
else if(human.sexcon.arousal > 20)
new_state = ERECT_STATE_HARD
else if(human.sexcon.arousal > 10)
+ new_state = ERECT_STATE_STIFF
+ else if(human.sexcon.arousal > 0 && human.sexcon.arousal <= 10) //Shows the sheathe sprites below this threshold.
new_state = ERECT_STATE_PARTIAL
else
new_state = ERECT_STATE_NONE
@@ -81,7 +83,7 @@
penis_type = PENIS_TYPE_TENTACLE
sheath_type = SHEATH_TYPE_NONE
-
+
/obj/item/organ/vagina
name = "vagina"
icon_state = "vagina"
diff --git a/code/world.dm b/code/world.dm
index 2eb7043b..52f67073 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -16,7 +16,7 @@
area = /area/rogue
view = "15x15"
hub = "Exadv1.spacestation13"
- name = "AZURE PEAK"
+ name = "CAUSTIC COVE"
fps = 20
#ifdef FIND_REF_NO_CHECK_TICK
loop_checks = FALSE
diff --git a/icons/default_title.dmi b/icons/default_title.dmi
index 43d63bef..575f0a24 100644
Binary files a/icons/default_title.dmi and b/icons/default_title.dmi differ
diff --git a/icons/mob/sprite_accessory/genitals/breasts.dmi b/icons/mob/sprite_accessory/genitals/breasts.dmi
index 4d126160..3adba876 100644
Binary files a/icons/mob/sprite_accessory/genitals/breasts.dmi and b/icons/mob/sprite_accessory/genitals/breasts.dmi differ
diff --git a/icons/mob/sprite_accessory/genitals/gonads.dmi b/icons/mob/sprite_accessory/genitals/gonads.dmi
index 2bf6be11..0f52a173 100644
Binary files a/icons/mob/sprite_accessory/genitals/gonads.dmi and b/icons/mob/sprite_accessory/genitals/gonads.dmi differ
diff --git a/icons/mob/sprite_accessory/genitals/pintle.dmi b/icons/mob/sprite_accessory/genitals/pintle.dmi
index dcbe9e63..7bab2c94 100644
Binary files a/icons/mob/sprite_accessory/genitals/pintle.dmi and b/icons/mob/sprite_accessory/genitals/pintle.dmi differ
diff --git a/icons/mob/sprite_accessory/tail_features/large_snake_markings.dmi b/icons/mob/sprite_accessory/tail_features/large_snake_markings.dmi
new file mode 100644
index 00000000..bb187e4a
Binary files /dev/null and b/icons/mob/sprite_accessory/tail_features/large_snake_markings.dmi differ
diff --git a/icons/mob/sprite_accessory/tails/tails.dmi b/icons/mob/sprite_accessory/tails/tails.dmi
index 675e065e..dcdbce35 100644
Binary files a/icons/mob/sprite_accessory/tails/tails.dmi and b/icons/mob/sprite_accessory/tails/tails.dmi differ
diff --git a/icons/roguetown/items/gems.dmi b/icons/roguetown/items/gems.dmi
index 7d98ec15..443e13aa 100644
Binary files a/icons/roguetown/items/gems.dmi and b/icons/roguetown/items/gems.dmi differ
diff --git a/icons/ss13_32.png b/icons/ss13_32.png
index bfac65ba..60c74175 100644
Binary files a/icons/ss13_32.png and b/icons/ss13_32.png differ
diff --git a/icons/tg_32.png b/icons/tg_32.png
index bfac65ba..60c74175 100644
Binary files a/icons/tg_32.png and b/icons/tg_32.png differ
diff --git a/modular_azurepeak/code/datums/loadout.dm b/modular_azurepeak/code/datums/loadout.dm
index 1949fc08..eca9c6ce 100644
--- a/modular_azurepeak/code/datums/loadout.dm
+++ b/modular_azurepeak/code/datums/loadout.dm
@@ -100,6 +100,14 @@ GLOBAL_LIST_EMPTY(loadout_items)
name = "Nun Veil"
path = /obj/item/clothing/head/roguetown/nun
+/datum/loadout_item/bamboohat
+ name = "Worn Bamboo Hat"
+ path = /obj/item/clothing/head/roguetown/mentorhat/loadout
+
+/datum/loadout_item/grenzelhat
+ name = "Grenzelhoft Hat"
+ path = /obj/item/clothing/head/roguetown/grenzelhofthat/loadout
+
//CLOAKS
/datum/loadout_item/tabard
name = "Tabard"
@@ -302,6 +310,11 @@ GLOBAL_LIST_EMPTY(loadout_items)
/datum/loadout_item/eastshirt2
name = "White Foreign Shirt"
path = /obj/item/clothing/suit/roguetown/shirt/undershirt/eastshirt2
+
+/datum/loadout_item/grenzelshirt
+ name = "Grenzelhoft Shirt"
+ path = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/grenzelhoft/loadout
+
//PANTS
/datum/loadout_item/tights
name = "Cloth Tights"
@@ -327,6 +340,15 @@ GLOBAL_LIST_EMPTY(loadout_items)
name = "Skirt"
path = /obj/item/clothing/under/roguetown/skirt
+/datum/loadout_item/grenzelpants
+ name = "Grenzelhoft Pants"
+ path = /obj/item/clothing/under/roguetown/heavy_leather_pants/grenzelpants/loadout
+
+/datum/loadout_item/easterntrou
+ name = "Black Foreign Pants"
+ path = /obj/item/clothing/under/roguetown/trou/leather/eastern
+
+
//ACCESSORIES
/datum/loadout_item/stockings
name = "Stockings"
@@ -356,6 +378,14 @@ GLOBAL_LIST_EMPTY(loadout_items)
name = "Fingerless Gloves"
path = /obj/item/clothing/gloves/roguetown/fingerless
+/datum/loadout_item/grenzelgloves
+ name = "Grenzelhoft Gloves"
+ path = /obj/item/clothing/gloves/roguetown/angle/grenzelgloves/loadout
+
+/datum/loadout_item/easterngloves
+ name = "Eastern Gloves"
+ path = /obj/item/clothing/gloves/roguetown/eastgloves1
+
/datum/loadout_item/exoticsilkbelt
name = "Exotic Silk Belt"
path = /obj/item/storage/belt/rogue/leather/exoticsilkbelt
diff --git a/modular_azurepeak/virtues/combat.dm b/modular_azurepeak/virtues/combat.dm
index fbbcb8ee..1571276d 100644
--- a/modular_azurepeak/virtues/combat.dm
+++ b/modular_azurepeak/virtues/combat.dm
@@ -2,16 +2,18 @@
/datum/virtue/combat/magical_potential
name = "Arcyne Potential"
desc = "I am talented in the Arcyne arts, expanding my capacity for magic. I have become more intelligent from its studies. Other effects depends on what training I chose to focus on at a later age."
- custom_text = "Classes that has a combat trait (Medium / Heavy Armor Training, Dodge Expert or Critical Resistance) get only prestidigitation. Everyone else get +3 spellpoints and T1 Arcyne Potential if they don't have any Arcyne."
+ custom_text = "Gives +3 spellpoints, and T1 Arcyne Potential if you don't have any Arcyne."
added_skills = list(list(/datum/skill/magic/arcane, 1, 6))
/datum/virtue/combat/magical_potential/apply_to_human(mob/living/carbon/human/recipient)
if (!recipient.get_skill_level(/datum/skill/magic/arcane)) // we can do this because apply_to is always called first
if (!recipient.mind?.has_spell(/obj/effect/proc_holder/spell/targeted/touch/prestidigitation))
recipient.mind?.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
- if (!HAS_TRAIT(recipient, TRAIT_MEDIUMARMOR) && !HAS_TRAIT(recipient, TRAIT_HEAVYARMOR) && !HAS_TRAIT(recipient, TRAIT_DODGEEXPERT) && !HAS_TRAIT(recipient, TRAIT_CRITICAL_RESISTANCE))
- ADD_TRAIT(recipient, TRAIT_ARCYNE_T1, TRAIT_GENERIC)
- recipient.mind?.adjust_spellpoints(3)
+ //if (!HAS_TRAIT(recipient, TRAIT_MEDIUMARMOR) && !HAS_TRAIT(recipient, TRAIT_HEAVYARMOR) && !HAS_TRAIT(recipient, TRAIT_DODGEEXPERT) && !HAS_TRAIT(recipient, TRAIT_CRITICAL_RESISTANCE))
+ // ADD_TRAIT(recipient, TRAIT_ARCYNE_T1, TRAIT_GENERIC)
+ // recipient.mind?.adjust_spellpoints(3)
+ ADD_TRAIT(recipient, TRAIT_ARCYNE_T1, TRAIT_GENERIC)
+ recipient.mind?.adjust_spellpoints(3)
else
recipient.mind?.adjust_spellpoints(3) // 3 extra spellpoints since you don't get any spell point from the skill anymore
diff --git a/modular_azurepeak/virtues/size.dm b/modular_azurepeak/virtues/size.dm
index c2b33845..c4019e4b 100644
--- a/modular_azurepeak/virtues/size.dm
+++ b/modular_azurepeak/virtues/size.dm
@@ -1,4 +1,6 @@
-/datum/virtue/size/giant
+//Caustic edit, we have our own size categories for this instead of virtues
+
+/*/datum/virtue/size/giant
name = "Giant"
desc = "I've always been larger, stronger and hardier than the average person. I tend to lumber around a lot, and my immense size can break down frail, wooden doors."
added_traits = list(TRAIT_BIGGUY)
@@ -41,3 +43,4 @@
recipient.pass_flags = PASSTABLE | PASSMOB
recipient.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
recipient.adjust_skillrank(/datum/skill/misc/stealing, 2, TRUE)
+*/
diff --git a/modular_causticcove/code/modules/harpies/_harpy_defines.dm b/modular_causticcove/code/modules/harpies/_harpy_defines.dm
new file mode 100644
index 00000000..9d106b2c
--- /dev/null
+++ b/modular_causticcove/code/modules/harpies/_harpy_defines.dm
@@ -0,0 +1,2 @@
+#define SPEC_ID_HARPY "harpy"
+#define isopenspace(A) (istype(A, /turf/open/transparent/openspace))
diff --git a/modular_causticcove/code/modules/harpies/abberant_eater.dm b/modular_causticcove/code/modules/harpies/abberant_eater.dm
new file mode 100644
index 00000000..77956f64
--- /dev/null
+++ b/modular_causticcove/code/modules/harpies/abberant_eater.dm
@@ -0,0 +1,40 @@
+/datum/component/abberant_eater
+ var/list/extra_foods = list()
+ var/excluding_subtypes = FALSE
+
+/datum/component/abberant_eater/Initialize(list/food_list, exclude_subtypes = FALSE)
+ if(!length(food_list))
+ return COMPONENT_INCOMPATIBLE
+
+ excluding_subtypes = exclude_subtypes
+ extra_foods = excluding_subtypes ? typecacheof(food_list, only_root_path = TRUE) : food_list
+
+ RegisterSignal(parent, COMSIG_MOB_ITEM_ATTACK, PROC_REF(try_eat))
+
+/datum/component/abberant_eater/proc/try_eat(mob/living/user, mob/living/M, obj/item/source)
+ if(user.cmode)
+ return FALSE
+ if(user != M)
+ return FALSE
+
+ var/can_we_eat = excluding_subtypes ? is_type_in_typecache(source, extra_foods) : is_type_in_list(source, extra_foods)
+ if(!can_we_eat)
+ return FALSE
+
+ var/eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp")
+ M.nutrition += 10
+
+ switch(M.nutrition)
+ if(NUTRITION_LEVEL_FAT to INFINITY)
+ user.visible_message("[user] forces [M.p_them()]self to eat \the [source].", "I force myself to eat \the [source].")
+ if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_FAT)
+ user.visible_message("[user] [eatverb]s \the [source].", "I [eatverb] \the [source].")
+ if(0 to NUTRITION_LEVEL_STARVING)
+ user.visible_message("[user] hungrily [eatverb]s \the [source], gobbling it down!", "I hungrily [eatverb] \the [source], gobbling it down!")
+ M.changeNext_move(CLICK_CD_MELEE * 0.5)
+
+ playsound(M.loc,'sound/misc/eat.ogg', rand(30,60), TRUE)
+ SEND_SIGNAL(source, COMSIG_FOOD_EATEN, M, user)
+ //source.On_Consume(user)
+ qdel(source)
+ return TRUE
diff --git a/modular_causticcove/code/modules/harpies/harpy_compat.dm b/modular_causticcove/code/modules/harpies/harpy_compat.dm
new file mode 100644
index 00000000..9c8713ec
--- /dev/null
+++ b/modular_causticcove/code/modules/harpies/harpy_compat.dm
@@ -0,0 +1 @@
+//This file includes all the slop I can think of and manage to change without interfering with azure peak code
diff --git a/modular_causticcove/code/modules/harpies/harpy_organs.dm b/modular_causticcove/code/modules/harpies/harpy_organs.dm
new file mode 100644
index 00000000..5d301d1f
--- /dev/null
+++ b/modular_causticcove/code/modules/harpies/harpy_organs.dm
@@ -0,0 +1,48 @@
+/obj/item/organ/vocal_cords/harpy
+ name = "harpy's song"
+ icon_state = "harpysong" //Pulsating heart energy thing.
+ desc = "The blessed essence of harpysong. How did you get this... you monster!"
+ actions_types = list(/datum/action/item_action/organ_action/use/harpy_sing)
+
+/obj/item/organ/vocal_cords/harpy/Initialize()
+ . = ..()
+
+/obj/item/organ/vocal_cords/harpy/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
+ . = ..()
+ M.adjust_skillrank(/datum/skill/misc/music, 1, TRUE)
+
+/obj/item/organ/vocal_cords/harpy/Remove(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
+ . = ..()
+ M.adjust_skillrank(/datum/skill/misc/music, -1, TRUE)
+
+/datum/action/item_action/organ_action/use/harpy_sing
+ name = "Harpy's song"
+ desc = "Project your voice through song."
+ button_icon = 'icons/obj/surgery.dmi'
+ button_icon_state = "harpysong"
+
+
+
+/datum/customizer/organ/wings/harpy
+ customizer_choices = list(/datum/customizer_choice/organ/wings/harpy)
+ allows_disabling = FALSE
+
+/datum/customizer_choice/organ/wings/harpy
+ name = "Wings"
+ organ_type = /obj/item/organ/wings/flight/harpy
+ sprite_accessories = list(
+ /datum/sprite_accessory/wings/large/harpyswept,
+ )
+
+/datum/customizer/organ/tail/harpy
+ customizer_choices = list(/datum/customizer_choice/organ/tail/harpy)
+ allows_disabling = TRUE
+
+/datum/customizer_choice/organ/tail/harpy
+ name = "Harpy Plumage"
+ organ_type = /obj/item/organ/tail
+ generic_random_pick = TRUE
+ allows_accessory_color_customization = TRUE
+ sprite_accessories = list(
+ /datum/sprite_accessory/tail/hawk,
+ )
diff --git a/modular_causticcove/code/modules/harpies/harpy_species.dm b/modular_causticcove/code/modules/harpies/harpy_species.dm
new file mode 100644
index 00000000..5b327fe7
--- /dev/null
+++ b/modular_causticcove/code/modules/harpies/harpy_species.dm
@@ -0,0 +1,152 @@
+/mob/living/carbon/human/species/harpy
+ race = /datum/species/harpy
+
+/datum/species/harpy
+ name = "Harpy"
+ id = SPEC_ID_HARPY
+ desc = "Harpies, or less ceremoniously known as 'magpies,' resemble the despised hollow-kin in appearance at first glance. \
+ One would rightfully assume they are similar in nature- with accuracy even, much to the harpies' chagrin. \
+ Harpies have been uplifted and reconnected to divinity by Eora, having developed culture of music and song which caught the attention of such a goddess. \
+ Their songs and voices may be their own, or proud mimicking other voices they've heard with unnatural accuracy. \
+ \
+ Whilst harpies may fly, their freedom is weighed by corruption of fleshcrafting to this day. Complete open-air freedom is still foreign to them. \
+ Harpies tend to live and gather in colonies at the tops of great sequoia forests and in nearby cliffs. Due to their laden flight, they must employ use of updrafts and proximity to large objects or structures to bolster their limited range and air-dancing performances. \
+ Their serene songs and blissful music can be heard echoing far below, guiding travelers and thieves both to respite... or treasure. For as lifted into grace as they might be, these 'magpies' earn such a nickname from instinctual Matthiosan greed and love for anything that shines. \
+ Yet if one can work past that distrust and compensate them well, harpies make for unparalleled couriers. \
+ \
+ Harpies and Feculents often find themselves in conflict, mirroring the quarrels of their patrons, whether of conscious faith or not."
+
+ skin_tone_wording = "Heritage"
+ default_color = "FFFFFF"
+
+ species_traits = list(EYECOLOR, HAIR, FACEHAIR, LIPS, STUBBLE, OLDGREY)
+
+ use_skintones = TRUE
+ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | SLIME_EXTRACT
+
+ limbs_icon_m = 'modular_causticcove/icons/roguetown/harpies/m/harpy.dmi'
+ limbs_icon_f = 'modular_causticcove/icons/roguetown/harpies/f/harpy.dmi'
+
+ soundpack_m = /datum/voicepack/male
+ soundpack_f = /datum/voicepack/female
+
+ offset_features = list(
+ OFFSET_ID = list(0,1), OFFSET_GLOVES = list(0,1), OFFSET_WRISTS = list(0,1),\
+ OFFSET_CLOAK = list(0,1), OFFSET_FACEMASK = list(0,1), OFFSET_HEAD = list(0,1), \
+ OFFSET_FACE = list(0,1), OFFSET_BELT = list(0,1), OFFSET_BACK = list(0,1), \
+ OFFSET_NECK = list(0,1), OFFSET_MOUTH = list(0,1), OFFSET_PANTS = list(0,1), \
+ OFFSET_SHIRT = list(0,1), OFFSET_ARMOR = list(0,1), OFFSET_HANDS = list(0,1), OFFSET_UNDIES = list(0,1), \
+ OFFSET_ID_F = list(0,-1), OFFSET_GLOVES_F = list(0,0), OFFSET_WRISTS_F = list(0,0), OFFSET_HANDS_F = list(0,0), \
+ OFFSET_CLOAK_F = list(0,0), OFFSET_FACEMASK_F = list(0,-1), OFFSET_HEAD_F = list(0,-1), \
+ OFFSET_FACE_F = list(0,-1), OFFSET_BELT_F = list(0,0), OFFSET_BACK_F = list(0,-1), \
+ OFFSET_NECK_F = list(0,-1), OFFSET_MOUTH_F = list(0,-1), OFFSET_PANTS_F = list(0,0), \
+ OFFSET_SHIRT_F = list(0,0), OFFSET_ARMOR_F = list(0,0), OFFSET_UNDIES_F = list(0,-1), \
+ )
+
+ race_bonus = list(STAT_STRENGTH = -4, STAT_PERCEPTION = 2, STAT_INTELLIGENCE = 1, STAT_CONSTITUTION = -4, STAT_ENDURANCE = 0, STAT_SPEED = 3, STAT_FORTUNE = 0)
+
+ enflamed_icon = "widefire"
+
+ organs = list(
+ ORGAN_SLOT_BRAIN = /obj/item/organ/brain,
+ ORGAN_SLOT_HEART = /obj/item/organ/heart,
+ ORGAN_SLOT_LUNGS = /obj/item/organ/lungs,
+ ORGAN_SLOT_EYES = /obj/item/organ/eyes,
+ ORGAN_SLOT_EARS = /obj/item/organ/ears,
+ ORGAN_SLOT_TONGUE = /obj/item/organ/tongue,
+ ORGAN_SLOT_LIVER = /obj/item/organ/liver,
+ ORGAN_SLOT_STOMACH = /obj/item/organ/stomach,
+ ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix,
+ ORGAN_SLOT_VOICE = /obj/item/organ/vocal_cords/harpy,
+ ORGAN_SLOT_TAIL = /obj/item/organ/tail,
+ )
+
+ bodypart_features = list(
+ /datum/bodypart_feature/hair/head,
+ /datum/bodypart_feature/hair/facial,
+ )
+
+ customizers = list(
+ /datum/customizer/organ/eyes/humanoid,
+ /datum/customizer/bodypart_feature/hair/head/humanoid,
+ /datum/customizer/bodypart_feature/hair/facial/humanoid,
+ /datum/customizer/bodypart_feature/accessory,
+ /datum/customizer/bodypart_feature/face_detail,
+ /datum/customizer/bodypart_feature/underwear,
+ /datum/customizer/organ/tail/harpy,
+ /datum/customizer/organ/wings/harpy,
+ /datum/customizer/organ/testicles/anthro,
+ /datum/customizer/organ/penis/anthro,
+ /datum/customizer/organ/belly/animal,
+ /datum/customizer/organ/butt/human,
+ /datum/customizer/organ/breasts/animal,
+ /datum/customizer/organ/vagina/anthro,
+ )
+
+ descriptor_choices = list(
+ /datum/descriptor_choice/height,
+ /datum/descriptor_choice/body,
+ /datum/descriptor_choice/stature,
+ /datum/descriptor_choice/face,
+ /datum/descriptor_choice/face_exp,
+ /datum/descriptor_choice/skin,
+ /datum/descriptor_choice/voice,
+ /datum/descriptor_choice/prominent_one_wild,
+ /datum/descriptor_choice/prominent_two_wild,
+ /datum/descriptor_choice/prominent_three_wild,
+ /datum/descriptor_choice/prominent_four_wild,
+ )
+
+/datum/species/harpy/get_hairc_list()
+ return sortList(list(
+ "black - raven" = "1a1d21",
+ "black - magpie" = "1d1b2b",
+
+ "brown - hawk" = "201616",
+ "brown - falcon" = "2b201b",
+
+ "red - sparrow" = "2d1300",
+ "red - robin" = "612929",
+ "red - cardinal" = "822b2b",
+
+ "grey - osprey" = "7c828a",
+
+ "white - swan" = "d3d9e3",
+ "white - egret" = "dee9ed",
+ "white - owl" = "f4f4f4",
+
+ "yellow - parakeet" = "d5ba7b",
+ "yellow - goldfinch" = "c69b71",
+
+ "pink - cockatoo" = "ead6e2",
+
+ "blue - jay" = "a1b4d4"
+ ))
+
+/datum/species/harpy/check_roundstart_eligible()
+ return TRUE
+
+/datum/species/harpy/qualifies_for_rank(rank, list/features)
+ return TRUE
+
+/datum/species/harpy/on_species_gain(mob/living/carbon/foreign, datum/species/old_species)
+ ..()
+ foreign.AddComponent(/datum/component/abberant_eater, list(/obj/item/natural/worms) + typesof(/obj/item/seeds), TRUE)
+ foreign.grant_language(/datum/language/common)
+
+/datum/species/harpy/get_skin_list()
+ return list(
+ "Grenzelhoft" = SKIN_COLOR_GRENZELHOFT,
+ "Hammerhold" = SKIN_COLOR_HAMMERHOLD,
+ "Avar" = SKIN_COLOR_AVAR,
+ "Rockhill" = SKIN_COLOR_ROCKHILL,
+ "Otava" = SKIN_COLOR_OTAVA,
+ "Etrusca" = SKIN_COLOR_ETRUSCA,
+ "Gronn" = SKIN_COLOR_GRONN,
+ "North Raneshen (Chorodiaki)" = SKIN_COLOR_GIZA,
+ "West Raneshen (Vrdaqnan)" = SKIN_COLOR_SHALVISTINE,
+ "East Raneshen (Nshkormh)" = SKIN_COLOR_LALVESTINE,
+ "Naledi" = SKIN_COLOR_NALEDI,
+ "Naledi South" = SKIN_COLOR_NALEDI_LIGHT,
+ "Kazengun" = SKIN_COLOR_KAZENGUN,
+ )
diff --git a/modular_causticcove/code/modules/harpies/wings.dm b/modular_causticcove/code/modules/harpies/wings.dm
new file mode 100644
index 00000000..28c1489a
--- /dev/null
+++ b/modular_causticcove/code/modules/harpies/wings.dm
@@ -0,0 +1,258 @@
+/obj/item/organ/wings/flight
+ /// Flight datum
+ var/datum/action/item_action/organ_action/use/flight/fly
+ /// What species ids get flight from these wings
+
+
+/obj/item/organ/wings/flight/Destroy()
+ QDEL_NULL(fly)
+ return ..()
+
+/obj/item/organ/wings/flight/Insert(mob/living/carbon/M, special, drop_if_replaced)
+ . = ..()
+ if(length(flight_for_species) && !(M.dna?.species.id in flight_for_species))
+ return
+ if(QDELETED(fly))
+ fly = new(src)
+ fly.Grant(M)
+
+/obj/item/organ/wings/flight/Remove(mob/living/carbon/M, special, drop_if_replaced)
+ . = ..()
+ if(QDELETED(fly))
+ return
+ fly.Remove(M)
+
+/obj/item/organ/wings/flight/harpy
+ name = "harpy wings"
+ accessory_type = /datum/sprite_accessory/wings/large/harpyswept
+ flight_for_species = list(SPEC_ID_HARPY)
+
+/obj/effect/flyer_shadow
+ name = "humanoid shadow"
+ desc = "A shadow cast from something flying above."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shadow"
+ anchored = TRUE
+ layer = BELOW_MOB_LAYER
+ alpha = 180
+ var/datum/weakref/flying_ref
+
+/obj/effect/flyer_shadow/Initialize(mapload, flying_mob)
+ . = ..()
+ if(flying_mob)
+ flying_ref = WEAKREF(flying_mob)
+ transform = matrix() * 0.75 // Make the shadow slightly smaller
+ //add_filter("shadow_blur", 1, gauss_blur_filter(1))
+
+/obj/effect/flyer_shadow/Destroy()
+ flying_ref = null
+ return ..()
+
+/obj/effect/flyer_shadow/attackby(obj/item/I, mob/user, params)
+ var/mob/living/flying_mob = flying_ref.resolve()
+ if(QDELETED(flying_mob))
+ return
+
+ if(flying_mob.z == user.z || !I.is_pointy_weapon(user))
+ return
+
+ user.visible_message(
+ span_warning("[user] prepares to thrust [I] upward at [flying_mob]!"),
+ span_warning("You prepare to thrust [I] upward at [flying_mob]!")
+ )
+
+ if(do_after(user, 3 SECONDS, src))
+ I = user.get_active_held_item()
+ if(!I?.is_pointy_weapon(user) || !flying_mob)
+ return
+
+ var/attack_damage = I.force
+
+ user.visible_message(
+ span_warning("[user] thrusts [I] upward, striking [flying_mob]!"),
+ span_warning("You thrust [I] upward, striking [flying_mob]!")
+ )
+
+ flying_mob.apply_damage(attack_damage, BRUTE)
+
+ return TRUE
+
+/obj/item/proc/is_pointy_weapon(mob/user)
+ return (user?.used_intent?.reach >= 2) && (sharpness == IS_SHARP || w_class >= WEIGHT_CLASS_NORMAL)
+
+/datum/action/item_action/organ_action/use/flight
+ name = "Toggle Flying"
+ desc = "Take to the skies or return to the ground."
+ button_icon_state = "flight"
+ var/active_background_icon_state = "spell1"
+
+ var/flying = FALSE
+ var/obj/effect/flyer_shadow/shadow
+
+/datum/action/item_action/organ_action/use/flight/Destroy()
+ if(shadow)
+ QDEL_NULL(shadow)
+ return ..()
+
+/datum/action/item_action/organ_action/use/flight/Trigger()
+ /*if(trigger_flags & TRIGGER_SECONDARY_ACTION)
+ to_chat(owner, "I am currently [flying ? "" : "not"] flying.")
+ return*/
+ if(!flying)
+ if(!can_fly())
+ return
+ if(do_after(owner, 5 SECONDS, owner))
+ start_flying()
+ return
+ if(do_after(owner, 5 SECONDS, owner))
+ stop_flying()
+
+/datum/action/item_action/organ_action/use/flight/proc/can_fly()
+ if(!isliving(owner))
+ return FALSE
+ var/mob/living/flier = owner
+ /*if(flier.get_encumbrance() > 0.7)
+ to_chat(owner, span_warning("I am too heavy!"))
+ return FALSE*/
+ if(!isturf(flier.loc))
+ to_chat(flier, span_warning("I need space to fly!"))
+ return FALSE
+ if(!CHECK_MULTIPLE_BITFIELDS(flier.mobility_flags, MOBILITY_STAND))
+ to_chat(flier, span_warning("I can't spread my wings!"))
+ return FALSE
+ if(IS_DEAD_OR_INCAP(flier))
+ return FALSE
+
+ return TRUE
+
+/*/datum/action/item_action/organ_action/use/flight/apply_button_background(atom/movable/screen/movable/action_button/current_button)
+ if(active_background_icon_state)
+ background_icon_state = is_action_active(current_button) ? active_background_icon_state : initial(src.background_icon_state)
+ return ..()*/
+
+/*/datum/action/item_action/organ_action/use/flight/is_action_active(atom/movable/screen/movable/action_button/current_button)
+ return flying*/
+
+// Start flying normally
+/datum/action/item_action/organ_action/use/flight/proc/start_flying()
+ var/turf/turf = get_turf(owner)
+ if(owner.can_zTravel(direction = UP))
+ if(isopenspace(GET_TURF_ABOVE(turf)))
+ turf = GET_TURF_ABOVE(turf)
+ owner.movement_type |= FLYING
+ flying = TRUE
+ to_chat(owner, span_notice("I start flying."))
+ init_signals()
+ if(turf != get_turf(owner))
+ var/matrix/original = owner.transform
+ var/prev_alpha = owner.alpha
+ var/prev_pixel_z = owner.pixel_z
+ animate(owner, pixel_z = 156, alpha = 0, time = 1.5 SECONDS, easing = EASE_IN, flags = ANIMATION_PARALLEL|ANIMATION_RELATIVE)
+ animate(owner, transform = matrix() * 6, time = 1 SECONDS, easing = EASE_IN, flags = ANIMATION_PARALLEL)
+ animate(transform = original, time = 0.5 SECONDS, EASE_OUT)
+ owner.pixel_z = prev_pixel_z
+ owner.alpha = prev_alpha
+ owner.forceMove(turf)
+ //build_all_button_icons(update_flags = UPDATE_BUTTON_BACKGROUND)
+
+/datum/action/item_action/organ_action/use/flight/proc/init_signals()
+ RegisterSignal(owner, COMSIG_MOB_APPLY_DAMGE, PROC_REF(check_damage))
+ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_movement))
+ RegisterSignal(owner, COMSIG_LIVING_SET_RESTING, PROC_REF(fall))
+ RegisterSignal(owner, COMSIG_LIVING_STATUS_STUN, PROC_REF(fall))
+ RegisterSignal(owner, COMSIG_LIVING_STATUS_PARALYZE, PROC_REF(fall))
+ RegisterSignal(owner, COMSIG_LIVING_STATUS_IMMOBILIZE, PROC_REF(fall))
+ RegisterSignal(owner, COMSIG_LIVING_STATUS_UNCONSCIOUS, PROC_REF(fall))
+ RegisterSignal(owner, COMSIG_LIVING_STATUS_SLEEP, PROC_REF(fall))
+
+// Stop flying normally
+/datum/action/item_action/organ_action/use/flight/proc/stop_flying()
+ var/turf/turf = get_turf(owner)
+ if(isopenspace(turf))
+ if(owner.can_zTravel(direction = DOWN))
+ turf = GET_TURF_BELOW(turf)
+ to_chat(owner, span_notice("I stop flying."))
+ if(turf != get_turf(owner))
+ var/matrix/original = owner.transform
+ var/prev_alpha = owner.alpha
+ var/prev_pixel_z = owner.pixel_z
+ owner.alpha = 0
+ owner.pixel_z = 156
+ owner.transform = matrix() * 8
+ owner.forceMove(turf)
+ animate(owner, pixel_z = prev_pixel_z, alpha = prev_alpha, time = 1.2 SECONDS, easing = EASE_IN, flags = ANIMATION_PARALLEL)
+ animate(owner, transform = original, time = 1.2 SECONDS, easing = EASE_IN, flags = ANIMATION_PARALLEL)
+
+ remove_signals()
+ //build_all_button_icons(update_flags = UPDATE_BUTTON_BACKGROUND)
+
+/datum/action/item_action/organ_action/use/flight/proc/remove_signals()
+ owner.movement_type &= ~FLYING
+ flying = FALSE
+
+ UnregisterSignal(owner, list(
+ COMSIG_MOB_APPLY_DAMGE,
+ COMSIG_MOVABLE_MOVED,
+ COMSIG_LIVING_SET_RESTING,
+ COMSIG_LIVING_STATUS_STUN,
+ COMSIG_LIVING_STATUS_PARALYZE,
+ COMSIG_LIVING_STATUS_IMMOBILIZE,
+ COMSIG_LIVING_STATUS_UNCONSCIOUS,
+ COMSIG_LIVING_STATUS_SLEEP
+ ))
+
+ // The fact we have to do this is awful
+ var/turf/open = get_turf(owner)
+ if(isopenspace(open))
+ open.zFall(owner)
+
+ if(shadow)
+ QDEL_NULL(shadow)
+
+// Fall out the sky like a brick, no animation
+/datum/action/item_action/organ_action/use/flight/proc/fall(datum/source)
+ SIGNAL_HANDLER
+
+ remove_signals()
+ //build_all_button_icons(update_flags = UPDATE_BUTTON_BACKGROUND)
+
+/datum/action/item_action/organ_action/use/flight/proc/check_damage(datum/source, damage, damagetype, def_zone)
+ SIGNAL_HANDLER
+
+ if(damagetype != BRUTE || damagetype != BURN)
+ return
+
+ if(prob(damage / 4))
+ to_chat(owner, span_warning("The damage knocks you out of the air!"))
+ fall()
+ if(isliving(owner))
+ var/mob/living/flier = owner
+ flier.Knockdown(2 SECONDS)
+
+/datum/action/item_action/organ_action/use/flight/proc/check_movement(datum/source)
+ SIGNAL_HANDLER
+
+ if(owner.movement_type & FLYING)
+ if(!can_fly())
+ stop_flying(owner)
+ return
+
+ if(!owner.stamina_add(-3))
+ to_chat(owner, span_warning("You're too exhausted to keep flying!"))
+ stop_flying(owner)
+ return
+
+ if(shadow)
+ if(!istransparentturf(get_turf(owner)))
+ shadow.alpha= 0
+ else
+ shadow.alpha = 255
+
+ var/turf/below_turf = GET_TURF_BELOW(get_turf(owner))
+ if(below_turf)
+ shadow.forceMove(below_turf)
+ else
+ var/turf/below_turf = GET_TURF_BELOW(get_turf(owner))
+ if(below_turf && istransparentturf(get_turf(owner)))
+ shadow = new /obj/effect/flyer_shadow(below_turf, owner)
+
diff --git a/modular_causticcove/code/modules/micromacrointeractions/helperfunctions.dm b/modular_causticcove/code/modules/micromacrointeractions/helperfunctions.dm
new file mode 100644
index 00000000..a45c1330
--- /dev/null
+++ b/modular_causticcove/code/modules/micromacrointeractions/helperfunctions.dm
@@ -0,0 +1,27 @@
+/mob/living/carbon/human/proc/can_be_picked_up(mob/living/carbon/human/other)
+ //TODO consentual before sensual
+ if(client)
+ if(!client.prefs.pickupable)
+ return FALSE
+ return TRUE
+
+/mob/living/carbon/human/proc/get_size()
+ if(HAS_TRAIT(src, TRAIT_MICRO))
+ return 1
+ //TODO: Someone is going to put a size between micro and normal, that one will go here with the num 2
+ if(HAS_TRAIT(src, TRAIT_MACRO) || HAS_TRAIT(src, TRAIT_BIGGUY))
+ var/beeg = 0
+ if(HAS_TRAIT(src, TRAIT_MACRO))
+ beeg = 5
+ if(HAS_TRAIT(src,TRAIT_BIGGUY))
+ beeg += 4
+ return beeg
+ else
+ return 3
+
+
+/mob/living/carbon/human/proc/small_enough(mob/living/carbon/human/other)
+ var/othersize = other.get_size()
+ if(get_size() + 2 <= othersize)
+ return TRUE
+ return FALSE
diff --git a/modular_causticcove/code/modules/micromacrointeractions/microholder.dm b/modular_causticcove/code/modules/micromacrointeractions/microholder.dm
new file mode 100644
index 00000000..a9604f79
--- /dev/null
+++ b/modular_causticcove/code/modules/micromacrointeractions/microholder.dm
@@ -0,0 +1,107 @@
+/obj/item/micro
+ name = "micro"
+ desc = "A person? A toy? A snack? All three! They fit into your hand, how convinient!"
+ var/mob/living/held_mob
+ var/matrix/original_transform
+ var/original_vis_flags = NONE
+
+/obj/item/micro/Initialize(mapload, mob/held)
+ . = ..()
+ held.forceMove(src)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/micro/examine(mob/user)
+ . = list()
+ for(var/mob/living/M in contents)
+ . += M.examine(user)
+
+/obj/item/micro/dropped(mob/user, silent)
+ if (held_mob?.loc != src || isturf(loc))
+ var/held = held_mob
+ dump_mob()
+ held_mob = held
+ . = ..()
+
+/obj/item/micro/proc/dump_mob()
+ if(!held_mob)
+ return
+ if (held_mob.loc == src || isnull(held_mob.loc))
+ held_mob.set_resting(FALSE,FALSE)
+ held_mob.transform = original_transform
+ held_mob.update_transform()
+ held_mob.forceMove(get_turf(src))
+ held_mob = null
+ process()
+
+/obj/item/micro/process()
+ if(held_mob?.loc != src || isturf(loc))
+ qdel(src)
+
+/obj/item/micro/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ if(held_mob)
+ dump_mob()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.dropItemToGround(src, get_turf(src))
+ return ..()
+
+/obj/item/micro/container_resist(mob/living/held)
+ if(ismob(loc))
+ var/mob/M = loc
+ var/wrestling_diff = 0
+ var/resist_chance = 55
+ var/combat_modifier = 0.45 // -30 and -25 from being in combat mode diff and aggro grab, apply those immidietly
+ if(held_mob.mind)
+ wrestling_diff += (held_mob.get_skill_level(/datum/skill/combat/wrestling)) //NPCs don't use this
+ if(M.mind)
+ wrestling_diff -= (M.get_skill_level(/datum/skill/combat/wrestling))
+ resist_chance += max((wrestling_diff * 10), -20)
+ resist_chance *= combat_modifier
+ resist_chance = clamp(resist_chance, 5, 95)
+ if(!prob(resist_chance))
+ to_chat(M, span_warning("[held] uselessly wiggles against my grip!"))
+ to_chat(held, span_warning("You struggle against [M]'s grip!"))
+ else
+ M.dropItemToGround(src)
+ to_chat(M, span_warning("\The [held] wriggles out of your grip!"))
+ to_chat(held, span_warning("You wiggle out of [M]'s grip!"))
+ else if(isitem(loc))
+ to_chat(held, span_warning("You struggle free of [loc]."))
+ forceMove(get_turf(src))
+
+ process()
+
+/obj/item/micro/Entered(mob/held, atom/OldLoc)
+ . = ..()
+ if(ismob(held))
+ held_mob = held
+ original_vis_flags = held.vis_flags
+ held.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_LAYER|VIS_INHERIT_PLANE
+ vis_contents += held
+ name = held.name
+ original_transform = held.transform
+ held.transform = null
+ held.transform *= 0.7
+
+/obj/item/micro/Exited(mob/held, atom/newLoc)
+ if(held == held_mob)
+ held_mob.set_resting(FALSE,FALSE)
+ held_mob.transform = original_transform
+ held_mob.update_transform()
+ held_mob = null
+
+/obj/item/micro/MouseDrop(mob/living/M)
+ ..()
+ if(isliving(usr))
+ var/mob/living/livingusr = usr
+ if(!Adjacent(usr))
+ return
+ if(M.voremode)
+ if(Adjacent(M))
+ livingusr.vore_attack(livingusr, held_mob, M)
+ else
+ to_chat(livingusr,span_notice(M + " is too far!"))
+ else
+ for(var/mob/living/carbon/human/O in contents)
+ O.show_inv(livingusr)
diff --git a/modular_causticcove/code/modules/micromacrointeractions/prefs.dm b/modular_causticcove/code/modules/micromacrointeractions/prefs.dm
new file mode 100644
index 00000000..90cea226
--- /dev/null
+++ b/modular_causticcove/code/modules/micromacrointeractions/prefs.dm
@@ -0,0 +1,2 @@
+/datum/preferences
+ var/pickupable = TRUE
diff --git a/modular_causticcove/code/modules/micromacrointeractions/sametile.dm b/modular_causticcove/code/modules/micromacrointeractions/sametile.dm
new file mode 100644
index 00000000..c787db98
--- /dev/null
+++ b/modular_causticcove/code/modules/micromacrointeractions/sametile.dm
@@ -0,0 +1,19 @@
+/mob/living/carbon/human/proc/handle_micro_bump_helping(mob/living/carbon/human/tmob)
+ //Riding and being moved to us or something similar
+ if(tmob in buckled_mobs)
+ return TRUE
+ if(!ishuman(src)|| !ishuman(tmob))
+ return FALSE
+ if(HAS_TRAIT(src, TRAIT_MICRO) && HAS_TRAIT(tmob, TRAIT_MICRO)) // So a grand total of 1 and a half pixels won't bodyblock eachother on 2x2 meters
+ return TRUE
+
+ if(small_enough(tmob))
+ to_chat(src, "You move below [tmob]")
+ to_chat(tmob, "[src] moves between below you.")
+ return TRUE
+ else if(tmob.small_enough(src))
+ to_chat(src, "You carefully move over [tmob].")
+ to_chat(tmob, "[src] moves over you carefully!.")
+ return TRUE
+ else
+ return FALSE
diff --git a/modular_causticcove/code/modules/micromacrointeractions/scoop.dm b/modular_causticcove/code/modules/micromacrointeractions/scoop.dm
new file mode 100644
index 00000000..763f99fe
--- /dev/null
+++ b/modular_causticcove/code/modules/micromacrointeractions/scoop.dm
@@ -0,0 +1,12 @@
+/mob/living/carbon/human/proc/attempt_scoop(mob/living/carbon/human/grabby)
+ if(!small_enough(grabby))
+ return FALSE
+ if(!can_be_picked_up(grabby))
+ return FALSE
+ set_resting(FALSE,FALSE)
+ var/obj/item/micro/friend = new /obj/item/micro(get_turf(grabby), src)
+ grabby.put_in_hands(friend)
+ to_chat(grabby, span_notice("You scoop up \the [src]!"))
+ to_chat(src, span_notice("\The [grabby] scoops you up!"))
+ return friend
+
diff --git a/modular_causticcove/code/modules/mob/dead/new_player/sprite_accessory/ears.dm b/modular_causticcove/code/modules/mob/dead/new_player/sprite_accessory/ears.dm
new file mode 100644
index 00000000..cf3aaa96
--- /dev/null
+++ b/modular_causticcove/code/modules/mob/dead/new_player/sprite_accessory/ears.dm
@@ -0,0 +1,10 @@
+/datum/sprite_accessory/ears/big/caustic
+ icon = 'modular_causticcove/icons/mob/sprite_accessory/ears/ears_big.dmi'
+
+
+/datum/sprite_accessory/ears/big/caustic/bunny_large
+ name = "Bunny Ears (Large and Long)"
+ icon_state = "bunny_large"
+ color_keys = 3
+ color_key_names = list("Ears", "Inner", "Tips")
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER, BODY_ADJ_LAYER)
diff --git a/modular_causticcove/code/modules/mob/dead/new_player/sprite_accessory/horns.dm b/modular_causticcove/code/modules/mob/dead/new_player/sprite_accessory/horns.dm
new file mode 100644
index 00000000..3a7692a6
--- /dev/null
+++ b/modular_causticcove/code/modules/mob/dead/new_player/sprite_accessory/horns.dm
@@ -0,0 +1,25 @@
+/datum/sprite_accessory/horns/large/caustic
+ abstract_type = /datum/sprite_accessory/horns/large
+ icon = 'modular_causticcove/icons/mob/sprite_accessory/horns/horns_large.dmi'
+
+/datum/sprite_accessory/horns/large/caustic/antlers
+ name = "Aged Antlers"
+ icon_state = "antlers_more"
+ relevant_layers = list(BODY_ADJ_LAYER, BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+
+/datum/sprite_accessory/horns/large/caustic/antlers/large
+ name = "Large Antlers"
+ icon_state = "antlers_large"
+
+/datum/sprite_accessory/horns/large/caustic/antlers/regal
+ name = "Regal Antlers"
+ icon_state = "antlers_regal"
+
+/datum/sprite_accessory/horns/large/caustic/antlers/monarch
+ name = "Monarch Antlers"
+ icon_state = "antlers_monarch"
+
+/datum/sprite_accessory/horns/large/caustic/antlers/short
+ name = "Short Antlers"
+ icon_state = "antlers_short"
+
diff --git a/modular_causticcove/code/modules/nat_armor/nat_armor.dm b/modular_causticcove/code/modules/nat_armor/nat_armor.dm
new file mode 100644
index 00000000..021bbfc3
--- /dev/null
+++ b/modular_causticcove/code/modules/nat_armor/nat_armor.dm
@@ -0,0 +1,8 @@
+/datum/virtue/combat/natarmor
+ name = "Natural Armor"
+ desc = "My hide is thick and resilient. It will regenerate so long as I keep it fed..."
+ added_traits = list()
+ custom_text = "My hide is thick and resilient. It will regenerate so long as I keep it fed..."
+
+/datum/virtue/combat/natarmor/apply_to_human(mob/living/carbon/human/recipient)
+ recipient.skin_armor = new /obj/item/clothing/suit/roguetown/armor/skin_armor/natural_armor(recipient)
diff --git a/modular_causticcove/code/modules/roguetown/roguecrafting/sewing.dm b/modular_causticcove/code/modules/roguetown/roguecrafting/sewing.dm
new file mode 100644
index 00000000..0c65483f
--- /dev/null
+++ b/modular_causticcove/code/modules/roguetown/roguecrafting/sewing.dm
@@ -0,0 +1,7 @@
+/datum/crafting_recipe/roguetown/sewing/foreigndress
+ name = "foreign dress (3 cloth, 3 fibers)"
+ result = list(/obj/item/clothing/suit/roguetown/armor/egypt)
+ reqs = list(/obj/item/natural/cloth = 3,
+ /obj/item/natural/fibers = 3)
+ craftdiff = 4
+ sellprice = 15
diff --git a/modular_causticcove/code/modules/roguetown/roguecrafting/weaving.dm b/modular_causticcove/code/modules/roguetown/roguecrafting/weaving.dm
deleted file mode 100644
index 308bfabb..00000000
--- a/modular_causticcove/code/modules/roguetown/roguecrafting/weaving.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/datum/crafting_recipe/roguetown/sewing/foreigndress
- name = "foreign dress"
- result = list(/obj/item/clothing/suit/roguetown/armor/egypt)
- reqs = list(/obj/item/natural/silk = 5)
- craftdiff = 3
- sellprice = 35
-
-/datum/crafting_recipe/roguetown/sewing/headdress
- name = "foreign headdress (blue)"
- result = list(/obj/item/clothing/head/roguetown/headdress)
- reqs = list(/obj/item/natural/silk = 2)
- craftdiff = 3
-
-/datum/crafting_recipe/roguetown/sewing/headdressalt
- name = "foreign headdress (red)"
- result = list(/obj/item/clothing/head/roguetown/headdress/alt)
- reqs = list(/obj/item/natural/silk = 2)
- craftdiff = 3
diff --git a/modular_causticcove/code/modules/sizecats/prefs.dm b/modular_causticcove/code/modules/sizecats/prefs.dm
new file mode 100644
index 00000000..cadf5628
--- /dev/null
+++ b/modular_causticcove/code/modules/sizecats/prefs.dm
@@ -0,0 +1,52 @@
+/datum/preferences
+ var/datum/sizecat/sizecat
+
+/datum/preferences/proc/_load_sizecat(S)
+ var/datum/sizecat/sc
+ S["sizecat"] >> sc
+ if(!sc)
+ sc = new /datum/sizecat/none
+ sizecat = sc
+
+/datum/preferences/proc/save_sizecat(S)
+ WRITE_FILE(S["sizecat"], sizecat)
+
+/datum/preferences/proc/select_sizecat(mob/user)
+ var/list/sizecat_choices = list()
+ for (var/path as anything in GLOB.sizecats)
+ var/datum/sizecat/sc = GLOB.sizecats[path]
+ sizecat_choices[sc.name] = sc
+ var/result = input(user, "Select a size category", "Caustic Cove") as null|anything in sizecat_choices
+ if (result)
+ var/datum/sizecat/sizecatchosen = sizecat_choices[result]
+ sizecat = sizecatchosen
+ to_chat(user, process_sizecat_text(sizecatchosen))
+
+/datum/preferences/proc/process_sizecat_text(datum/sizecat/V)
+ var/dat
+ if(V.desc)
+ dat += "[span_purple(V.desc)]
"
+ if(length(V.added_skills))
+ dat += "This Virtue adds the following skills:
"
+ for(var/list/L in V.added_skills)
+ var/name
+ if(ispath(L[1],/datum/skill))
+ var/datum/skill/S = L[1]
+ name = initial(S.name)
+ dat += "["\Roman[L[2]]"] level[L[2] > 1 ? "s" : ""] of [name][L[3] ? ", up to [SSskills.level_names_plain[L[3]]]" : ""]
"
+ dat += ""
+ if(length(V.added_traits))
+ dat += "This size category grants the following traits:
"
+ for(var/TR in V.added_traits)
+ dat += "[TR] — [GLOB.roguetraits[TR]]
"
+ dat += ""
+ if(length(V.added_stashed_items))
+ dat += "This size category adds the following items to your stash:
"
+ for(var/I in V.added_stashed_items)
+ dat += "[I]
"
+ dat += ""
+ if(V.custom_text)
+ dat += "This size category has this special behaviour:
"
+ dat += "[V.custom_text]"
+ dat += ""
+ return dat
\ No newline at end of file
diff --git a/modular_causticcove/code/modules/sizecats/sizecat_types.dm b/modular_causticcove/code/modules/sizecats/sizecat_types.dm
new file mode 100644
index 00000000..b83f0c22
--- /dev/null
+++ b/modular_causticcove/code/modules/sizecats/sizecat_types.dm
@@ -0,0 +1,47 @@
+/datum/sizecat/none
+ name = "None"
+ desc = "You are extraordinarily ordinary!"
+
+/datum/sizecat/giant
+ name = "Giant"
+ desc = "I've always been larger, stronger and hardier than the average person. I tend to lumber around a lot, and my immense size can break down frail, wooden doors."
+ added_traits = list(TRAIT_BIGGUY)
+ custom_text = "Increases your sprite size."
+
+/datum/sizecat/giant/apply_to_human(mob/living/carbon/human/recipient)
+ recipient.transform = recipient.transform.Scale(1.25, 1.25)
+ recipient.transform = recipient.transform.Translate(0, (0.25 * 16))
+ recipient.update_transform()
+
+/datum/sizecat/macro
+ name = "Macro"
+ desc = "Somehow, due to a freak accident or magical energies, my form is absolutely colossal. My strength and body are second to none. However, the ground beneath shifts, causing my speed to suffer greatly."
+ added_traits = list(TRAIT_MACRO)
+ custom_text = "Greatly increases your sprite size. Makes you very strong and durable but reduces your speed close to, if not to the minimum."
+
+/datum/sizecat/macro/apply_to_human(mob/living/carbon/human/recipient)
+ recipient.transform = recipient.transform.Scale(2, 2)
+ recipient.transform = recipient.transform.Translate(0, (0.25 * 35))
+ recipient.update_transform()
+ recipient.change_stat("strength", 8)
+ recipient.change_stat("endurance", 8)
+ recipient.change_stat("constitution", 8)
+ recipient.change_stat("speed", -14)
+
+/datum/sizecat/micro
+ name = "Micro"
+ desc ="Somehow, due to a freak accident or magical energies, my form is absolutely tiny. My strength and body are lacking. However, my dimutive size allows me to dodge blows that would otherwise hit others."
+ added_traits = list(TRAIT_MICRO)
+ custom_text = "Greatly reduces your sprite size. Makes you very agile, but slow. In addition, your stealth will be strengthened greatly. Your strength and durability will be close to, if not the minimum however."
+
+/datum/sizecat/micro/apply_to_human(mob/living/carbon/human/recipient)
+ recipient.transform = recipient.transform.Scale(0.2, 0.2)
+ recipient.transform = recipient.transform.Translate(0, (0.25 * 8))
+ recipient.update_transform()
+ recipient.change_stat("strength", -10)
+ recipient.change_stat("endurance", -4)
+ recipient.change_stat("constitution", -10)
+ recipient.change_stat("speed", -14)
+ recipient.pass_flags = PASSTABLE | PASSMOB
+ recipient.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
+ recipient.adjust_skillrank(/datum/skill/misc/stealing, 2, TRUE)
diff --git a/modular_causticcove/code/modules/sizecats/sizecats.dm b/modular_causticcove/code/modules/sizecats/sizecats.dm
new file mode 100644
index 00000000..507c95ae
--- /dev/null
+++ b/modular_causticcove/code/modules/sizecats/sizecats.dm
@@ -0,0 +1,120 @@
+GLOBAL_LIST_EMPTY(sizecats)
+#define TRAIT_SIZECAT "SizeCat"
+//Code shamelessly stolen from sizecats
+/datum/sizecat
+ /// What the sizecat is called.
+ var/name
+ /// A brief, in-character description of what the sizecat does.
+ var/desc
+ /// A list containing any traits we need to add to the mob.
+ var/list/added_traits = list()
+ /// An associative list containing any skills we want to adjust. You can also pass list objects into this in the following format: list(SKILL_TYPE, SKILL_INCREASE, SKILL_MAXIMUM) as needed.
+ var/list/added_skills = list()
+ /// An associative list containing any items we want to add to our stash.
+ var/list/added_stashed_items = list()
+ /// A list containing any extra languages we need to add to the mob.
+ var/list/added_languages = list()
+ /// An associative list containing any extra stats we need to add to the mob. NOTE: sizecats should GENERALLY NOT add stats unless they impose serious downsides.
+ var/list/added_stats = list()
+ /// The cost of the sizecat to apply in TRIUMPH points, if any.
+ var/triumph_cost = 0
+ /// A custom addendum that explains what the sizecat does outside of the traits / skill adjustments.
+ var/custom_text
+
+
+/datum/sizecat/New()
+ . = ..()
+ if (triumph_cost)
+ desc += "Costs [triumph_cost] TRIUMPH."
+
+/datum/sizecat/proc/apply_to_human(mob/living/carbon/human/recipient)
+ return
+
+/datum/sizecat/proc/handle_traits(mob/living/carbon/human/recipient)
+ if (!LAZYLEN(added_traits))
+ return
+ for(var/trait in added_traits)
+ ADD_TRAIT(recipient, trait, TRAIT_SIZECAT)
+
+/datum/sizecat/proc/handle_skills(mob/living/carbon/human/recipient)
+ if (!recipient.mind || !LAZYLEN(added_skills))
+ return
+ for(var/skill in added_skills)
+ if (!islist(skill))
+ recipient.adjust_skillrank(skill, added_skills[skill], TRUE)
+ else
+ var/list/skill_block = skill
+ var/datum/skill/the_skill = skill_block[1]
+ var/increase_by = skill_block[2]
+ var/maximum_skill = skill_block[3]
+ var/our_skill = recipient.get_skill_level(the_skill)
+ if (our_skill < maximum_skill)
+ if ((our_skill + increase_by) > maximum_skill) // we'll be pushing it higher than our max with 1 addition, so lower increase_by
+ increase_by = (maximum_skill - our_skill)
+ recipient.adjust_skillrank(the_skill.type, increase_by, TRUE)
+ else
+ to_chat(recipient, span_notice("My sizecat cannot influence my skill with [lowertext(the_skill.name)] any further."))
+
+
+/datum/sizecat/proc/handle_stashed_items(mob/living/carbon/human/recipient)
+ if (!recipient.mind || !LAZYLEN(added_stashed_items))
+ return
+ for(var/stashed_item in added_stashed_items)
+ recipient.mind?.special_items[stashed_item] = added_stashed_items[stashed_item]
+
+/datum/sizecat/proc/handle_added_languages(mob/living/carbon/human/recipient)
+ if (!LAZYLEN(added_languages))
+ return
+
+ for (var/language in added_languages)
+ recipient.grant_language(language)
+
+/datum/sizecat/proc/handle_stats(mob/living/carbon/human/recipient)
+ if (!LAZYLEN(added_stats))
+ return
+
+ for (var/stat in added_stats)
+ var/value = added_stats[stat]
+ recipient.change_stat(stat, value)
+
+/datum/sizecat/proc/check_triumphs(mob/living/carbon/human/recipient)
+ if (!triumph_cost)
+ return TRUE
+
+ if (!recipient.mind)
+ return FALSE
+
+ // we should check to see if they have triumphs first but i can't be fucked
+ recipient.adjust_triumphs(-triumph_cost, FALSE)
+ return TRUE
+
+/proc/apply_sizecat(mob/living/carbon/human/recipient, datum/sizecat/sizecat_type)
+ if (!sizecat_type.check_triumphs(recipient))
+ return
+ sizecat_type.apply_to_human(recipient)
+ sizecat_type.handle_traits(recipient)
+ sizecat_type.handle_skills(recipient)
+ sizecat_type.handle_stashed_items(recipient)
+ sizecat_type.handle_added_languages(recipient)
+ sizecat_type.handle_stats(recipient)
+ if(HAS_TRAIT(recipient, TRAIT_RESIDENT))
+ if(recipient in SStreasury.bank_accounts)
+ SStreasury.generate_money_account(20, recipient)
+ else
+ SStreasury.create_bank_account(recipient, 20)
+ if(HAS_TRAIT(recipient, TRAIT_RESIDENT))
+ REMOVE_TRAIT(recipient, TRAIT_OUTLANDER, ADVENTURER_TRAIT)
+
+/proc/apply_prefs_sizecat(mob/living/carbon/human/character, client/player)
+ if (!player)
+ player = character.client
+ if (!player)
+ return
+ if (!player.prefs)
+ return
+ var/datum/sizecat/sizecat_type = player.prefs.sizecat
+ apply_sizecat(character,sizecat_type)
+
+
+
+
diff --git a/modular_causticcove/code/modules/standardized_sprite/standardized_sprite_verb.dm b/modular_causticcove/code/modules/standardized_sprite/standardized_sprite_verb.dm
new file mode 100644
index 00000000..b14834ca
--- /dev/null
+++ b/modular_causticcove/code/modules/standardized_sprite/standardized_sprite_verb.dm
@@ -0,0 +1,29 @@
+/mob/verb/standardsprite()
+ set name = "Standardize sprite"
+ set category = "Vore"
+ set desc = "Standardizes your sprite to 100%. ONLY FOR YOURSELF!"
+ if(isliving(src))
+ var/mob/living/curruser = src
+ curruser.standardize_sprite()
+
+/mob/living
+ var/currentlystandardized = FALSE
+
+/mob/living/proc/standardize_sprite()
+ if(!currentlystandardized)
+ var/image/I = image(icon = src.icon, icon_state = src.icon_state, loc = src, layer = src.layer, pixel_x = src.pixel_x, pixel_y = src.pixel_y)
+ I.override = TRUE
+ I.overlays += overlays
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite_sizecode", I)
+ else
+ remove_alt_appearance("smallsprite_sizecode")
+
+ currentlystandardized = !currentlystandardized
+
+/mob/living/proc/refresh_standardized_sprite()
+ remove_alt_appearance("smallsprite_sizecode")
+ var/image/I = image(icon = src.icon, icon_state = src.icon_state, loc = src, layer = src.layer, pixel_x = src.pixel_x, pixel_y = src.pixel_y)
+ I.override = TRUE
+ I.overlays += overlays
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite_sizecode", I)
+
diff --git a/modular_causticcove/code/modules/surgery/bodyparts/taur.dm b/modular_causticcove/code/modules/surgery/bodyparts/taur.dm
new file mode 100644
index 00000000..ffd41fad
--- /dev/null
+++ b/modular_causticcove/code/modules/surgery/bodyparts/taur.dm
@@ -0,0 +1,23 @@
+/obj/item/bodypart/taur/caustic
+ icon = 'modular_causticcove/icons/mob/sprite_accessory/tails/taur.dmi'
+
+/obj/item/bodypart/taur/caustic/bunny
+ name = "Bunny Taur Body"
+
+ offset_x = -16
+ taur_icon_state = "bigbunny_s"
+
+ has_taur_color = TRUE
+
+
+/datum/sprite_accessory/tail_feature/taur/caustic // let's add it here since it's also markings for the taur body.
+
+/datum/sprite_accessory/tail_feature/taur/caustic/bunny
+ name = "Bunny Taur Markings"
+ icon = 'modular_causticcove/icons/mob/sprite_accessory/tail_features/bunnytaur_markings.dmi'
+ icon_state = "bigbunny_s"
+
+/datum/sprite_accessory/tail_feature/taur/caustic/deerbelly
+ name = "Deer Taur Belly Markings"
+ icon = 'modular_causticcove/icons/mob/sprite_accessory/tail_features/taurdeer_belly.dmi'
+ icon_state = "taurdeer_belly_s"
diff --git a/modular_causticcove/code/modules/vore/eating/belly_obj.dm b/modular_causticcove/code/modules/vore/eating/belly_obj.dm
index 42022d4f..9cb5910e 100644
--- a/modular_causticcove/code/modules/vore/eating/belly_obj.dm
+++ b/modular_causticcove/code/modules/vore/eating/belly_obj.dm
@@ -511,6 +511,9 @@
// Delete the digested mob
release_specific_contents_digest(M)
+ var/mob/dead/observer/G = M.ghostize(TRUE)
+ if(G)
+ G.forceMove(owner)
M.x = 1
M.y = 1
M.z = 1
diff --git a/modular_causticcove/code/modules/vore/eating/living.dm b/modular_causticcove/code/modules/vore/eating/living.dm
index 99b49073..bfbb162c 100644
--- a/modular_causticcove/code/modules/vore/eating/living.dm
+++ b/modular_causticcove/code/modules/vore/eating/living.dm
@@ -113,7 +113,7 @@
attempt_msg = text("[] is attempting to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
- if(!prey.Adjacent(user)) // let's not even bother attempting it yet if they aren't next to us.
+ if(!prey.Adjacent(user) && (get_turf(prey) != get_turf(user))) // let's not even bother attempting it yet if they aren't next to us.
return FALSE
// Announce that we start the attempt!
@@ -129,8 +129,14 @@
//Timer and progress bar
if(!do_after(user, swallow_time, TRUE, prey))
return FALSE // Prey escaped (or user disabled) before timer expired.
-
- if(!prey.Adjacent(user)) //double check'd just in case they moved during the timer and the do_mob didn't fail for whatever reason
+
+ //double check'd just in case they moved during the timer and the do_mob didn't fail for whatever reason
+ var/turf/preyturf = get_turf(prey)
+ var/turf/feederturf = get_turf(user)
+ var/adj = prey.Adjacent(user)
+ var/sameturf = preyturf == feederturf
+
+ if(!adj && !sameturf) // let's not even bother attempting it yet if they aren't next to us.
return FALSE
// If we got this far, nom successful! Announce it!
@@ -327,7 +333,9 @@
if(isanimal(B.owner))
var/mob/living/simple_animal/SA = B.owner
SA.update_icons()
-
+ else if(istype(loc,/obj/item/micro))
+ var/obj/item/micro/mh = loc
+ mh.dump_mob()
else
to_chat(src,"You aren't inside anyone, though, is the thing.")
diff --git a/modular_causticcove/icons/mob/sprite_accessory/ears/ears_big.dmi b/modular_causticcove/icons/mob/sprite_accessory/ears/ears_big.dmi
new file mode 100644
index 00000000..aede781f
Binary files /dev/null and b/modular_causticcove/icons/mob/sprite_accessory/ears/ears_big.dmi differ
diff --git a/modular_causticcove/icons/mob/sprite_accessory/horns/horns_large.dmi b/modular_causticcove/icons/mob/sprite_accessory/horns/horns_large.dmi
new file mode 100644
index 00000000..c79454ee
Binary files /dev/null and b/modular_causticcove/icons/mob/sprite_accessory/horns/horns_large.dmi differ
diff --git a/modular_causticcove/icons/mob/sprite_accessory/tail_features/bunnytaur_markings.dmi b/modular_causticcove/icons/mob/sprite_accessory/tail_features/bunnytaur_markings.dmi
new file mode 100644
index 00000000..82557be7
Binary files /dev/null and b/modular_causticcove/icons/mob/sprite_accessory/tail_features/bunnytaur_markings.dmi differ
diff --git a/modular_causticcove/icons/mob/sprite_accessory/tail_features/taurdeer_belly.dmi b/modular_causticcove/icons/mob/sprite_accessory/tail_features/taurdeer_belly.dmi
new file mode 100644
index 00000000..bbaea996
Binary files /dev/null and b/modular_causticcove/icons/mob/sprite_accessory/tail_features/taurdeer_belly.dmi differ
diff --git a/modular_causticcove/icons/mob/sprite_accessory/tails/taur.dmi b/modular_causticcove/icons/mob/sprite_accessory/tails/taur.dmi
new file mode 100644
index 00000000..03731183
Binary files /dev/null and b/modular_causticcove/icons/mob/sprite_accessory/tails/taur.dmi differ
diff --git a/modular_causticcove/icons/roguetown/harpies/f/harpy.dmi b/modular_causticcove/icons/roguetown/harpies/f/harpy.dmi
new file mode 100644
index 00000000..1744c705
Binary files /dev/null and b/modular_causticcove/icons/roguetown/harpies/f/harpy.dmi differ
diff --git a/modular_causticcove/icons/roguetown/harpies/m/harpy.dmi b/modular_causticcove/icons/roguetown/harpies/m/harpy.dmi
new file mode 100644
index 00000000..2bc12d01
Binary files /dev/null and b/modular_causticcove/icons/roguetown/harpies/m/harpy.dmi differ
diff --git a/modular_hearthstone/code/interface/LOOC.dm b/modular_hearthstone/code/interface/LOOC.dm
index 9f7842b2..3458a45b 100644
--- a/modular_hearthstone/code/interface/LOOC.dm
+++ b/modular_hearthstone/code/interface/LOOC.dm
@@ -42,9 +42,10 @@
to_chat(src, span_danger("I cannot use LOOC (perma muted)."))
return
- if(isobserver(mob))
+ // Cove edit
+ /*if(isobserver(mob))
to_chat(src, span_danger("I cannot use LOOC while dead."))
- return
+ return*/
if(!mob)
return
@@ -87,15 +88,15 @@
if((C in GLOB.admins) && (C.prefs.chat_toggles & CHAT_ADMINLOOC))
added_text += " ([mob.ckey]) \[MUTE\]"
is_admin = 1
- else if(isobserver(M))
- continue
+ /*else if(isobserver(M))
+ continue*/
mobs += C
if(C.prefs.chat_toggles & CHAT_OOC)
- if(istype(usr,/mob/living))
- var/turf/speakturf = get_turf(M)
- var/turf/sourceturf = get_turf(usr)
- if(is_admin == 1 || (wp == 1 && (M in range (7, src))))
- to_chat(C, "[prefix]: [src.mob.name][added_text]: [msg]")
- else if(speakturf in get_hear(7, sourceturf))
- to_chat(C, "[prefix]: [src.mob.name][added_text]: [msg]")
+ //if(istype(usr,/mob/living))
+ var/turf/speakturf = get_turf(M)
+ var/turf/sourceturf = get_turf(usr)
+ if(is_admin == 1 || (wp == 1 && (M in range (7, src))))
+ to_chat(C, "[prefix]: [src.mob.name][added_text]: [msg]")
+ else if(speakturf in get_hear(7, sourceturf))
+ to_chat(C, "[prefix]: [src.mob.name][added_text]: [msg]")
diff --git a/roguetown.dme b/roguetown.dme
index 52876f78..b5fdf4ef 100644
--- a/roguetown.dme
+++ b/roguetown.dme
@@ -1481,6 +1481,7 @@
#include "code\modules\jobs\job_types\roguetown\adventurer\types\antag\sellsword.dm"
#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\cleric.dm"
#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\foreigner.dm"
+#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\lurker.dm"
#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\mage.dm"
#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\noble.dm"
#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\ranger.dm"
@@ -2462,6 +2463,27 @@
#include "modular_azurepeak\virtues\size.dm"
#include "modular_azurepeak\virtues\thief.dm"
#include "modular_azurepeak\virtues\utility.dm"
+#include "modular_causticcove\code\modules\clothing\rogueclothes\armor.dm"
+#include "modular_causticcove\code\modules\harpies\_harpy_defines.dm"
+#include "modular_causticcove\code\modules\harpies\abberant_eater.dm"
+#include "modular_causticcove\code\modules\harpies\harpy_compat.dm"
+#include "modular_causticcove\code\modules\harpies\harpy_organs.dm"
+#include "modular_causticcove\code\modules\harpies\harpy_species.dm"
+#include "modular_causticcove\code\modules\harpies\wings.dm"
+#include "modular_causticcove\code\modules\micromacrointeractions\helperfunctions.dm"
+#include "modular_causticcove\code\modules\micromacrointeractions\microholder.dm"
+#include "modular_causticcove\code\modules\micromacrointeractions\prefs.dm"
+#include "modular_causticcove\code\modules\micromacrointeractions\sametile.dm"
+#include "modular_causticcove\code\modules\micromacrointeractions\scoop.dm"
+#include "modular_causticcove\code\modules\mob\dead\new_player\sprite_accessory\ears.dm"
+#include "modular_causticcove\code\modules\mob\dead\new_player\sprite_accessory\horns.dm"
+#include "modular_causticcove\code\modules\nat_armor\nat_armor.dm"
+#include "modular_causticcove\code\modules\roguetown\roguecrafting\sewing.dm"
+#include "modular_causticcove\code\modules\sizecats\prefs.dm"
+#include "modular_causticcove\code\modules\sizecats\sizecat_types.dm"
+#include "modular_causticcove\code\modules\sizecats\sizecats.dm"
+#include "modular_causticcove\code\modules\standardized_sprite\standardized_sprite_verb.dm"
+#include "modular_causticcove\code\modules\surgery\bodyparts\taur.dm"
#include "modular_causticcove\code\modules\vore\persistence.dm"
#include "modular_causticcove\code\modules\vore\SSbellies.dm"
#include "modular_causticcove\code\modules\vore\eating\belly_dat_vr.dm"
diff --git a/tgui/packages/tgui/interfaces/MiaCraft.js b/tgui/packages/tgui/interfaces/MiaCraft.js
new file mode 100644
index 00000000..b3471d9a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MiaCraft.js
@@ -0,0 +1,113 @@
+import { useBackend, useSharedState } from '../backend';
+import { Window } from '../layouts';
+import {
+ Button,
+ LabeledList,
+ Collapsible,
+ Flex,
+ Input,
+} from 'tgui-core/components';
+import { useState, useEffect} from 'react';
+
+export const MiaCraft = (props, context) => {
+ const { act, data } = useBackend();
+ const busy = data.busy;
+ const [category, setCategory] = useState();
+ const [subcategory, setSubcategory] = useState();
+ const craftability = Object.entries(data.craftability);
+ const [crafting_recipes] = useState(data.crafting_recipes);
+ let onlyCraftable = data.showonlycraftable;
+ const [searchText, setSearchText] = useState("");
+
+ return(
+
+
+
+
+
+
+ ToggleOnlyCraftable()} />
+
+
+ SearcTextModify(e.target.value.toLowerCase())} />
+
+
+
+
+ {
+ Object.entries(crafting_recipes).sort(([a], [b]) => String(a).localeCompare(String(b))).map(([key, item]) => (
+
+ ))
+ }
+
+
+
+
+ );
+
+ function ToggleOnlyCraftable() {
+ act('checkboxonlycraftable', { state : !onlyCraftable });
+ }
+ function SearcTextModify(val) {
+ setSearchText(val);
+ }
+
+
+
+};
+
+ function CraftingCategory({ crafties, key3, onlyCraftable, craftability, key, actfunc, searchText }) {
+ const visibleElements = Object.entries(crafties).filter(([key2, item2]) => !onlyCraftable || craftability.some(object => object[0] === item2.name && object[1] === 1)).sort(([, aVal], [, bVal]) => String(aVal.name).localeCompare(String(bVal.name))).filter(([id, item]) => { return item.name.toLowerCase().includes(searchText); });
+ return (visibleElements.length > 0 ?
+
+ {visibleElements.map(([key2, item2]) => (
+
+ ))}
+
+
+ : null);
+ }
+ function CraftingRecipe({ recipe, key, craftability, actfunc }) {
+ return(
+
+
+ object[0] === recipe.name && object[1] === 1) ? "" : "grey" }}>
+
+
+ {recipe.req_text}
+
+
+ {recipe.craftingdifficulty}
+
+
+ {recipe.tool_text}
+
+
+ {recipe.catalyst_text}
+
+
+ {recipe.sellprice}
+
+
+
+
+
+
+
+
+
+ );
+
+ }
\ No newline at end of file
diff --git a/tgui/packages/tgui/routes.tsx b/tgui/packages/tgui/routes.tsx
index 2d05e324..f358f525 100644
--- a/tgui/packages/tgui/routes.tsx
+++ b/tgui/packages/tgui/routes.tsx
@@ -74,8 +74,10 @@ export function getRoutedComponent() {
const interfacePathBuilders = [
(name: string) => `./${name}.tsx`,
(name: string) => `./${name}.jsx`,
+ (name: string) => `./${name}.js`,
(name: string) => `./${name}/index.tsx`,
(name: string) => `./${name}/index.jsx`,
+ (name: string) => `./${name}/index.js`,
];
let esModule;
diff --git a/tools/bootstrap/javascript.sh b/tools/bootstrap/javascript.sh
old mode 100644
new mode 100755