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} + + +