diff --git a/_maps/shuttles/roumain/srm_glaive.dmm b/_maps/shuttles/roumain/srm_glaive.dmm index 6ac9e480222e..8b5cb2a3fdc8 100644 --- a/_maps/shuttles/roumain/srm_glaive.dmm +++ b/_maps/shuttles/roumain/srm_glaive.dmm @@ -208,9 +208,7 @@ /obj/structure/flora/ausbushes/brflowers, /obj/structure/flora/ausbushes/sparsegrass, /obj/item/book/manual/trickwines_4_brewers, -/turf/open/floor/grass{ - icon_state = "junglegrass" - }, +/turf/open/floor/grass/ship/jungle, /area/ship/roumain) "cJ" = ( /obj/structure/cable/orange{ @@ -255,6 +253,7 @@ "ds" = ( /obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/brflowers, +/obj/item/reagent_containers/food/drinks/breakawayflask, /turf/open/floor/grass/ship/jungle, /area/ship/roumain) "dt" = ( @@ -726,15 +725,7 @@ /area/ship/engineering/engine) "jG" = ( /obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/tree/jungle{ - icon_state = "churchtree"; - icon = 'icons/obj/flora/chapeltree.dmi'; - randomize_icon = 0; - pixel_x = -16; - pixel_y = 0; - desc = "A sturdy oak tree imported directly from the homeworld of the Montagne who runs the ship it resides on. It is planted in soil from the same place."; - name = "Montagne's Oak" - }, +/obj/structure/flora/tree/srm, /turf/open/floor/grass/ship/jungle, /area/ship/roumain) "ko" = ( @@ -753,6 +744,12 @@ }, /turf/open/floor/wood/maple, /area/ship/construction) +"lb" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/fermenting_barrel, +/turf/open/floor/grass/ship/jungle, +/area/ship/roumain) "lf" = ( /obj/structure/cable/orange{ icon_state = "2-8" @@ -1680,7 +1677,7 @@ /area/ship/medical) "At" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageash, +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine, /turf/open/floor/plating{ icon_state = "greenerdirt" }, @@ -1776,7 +1773,7 @@ /obj/structure/railing{ dir = 1 }, -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageash, +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine, /turf/open/floor/ship/dirt/dark, /area/ship/roumain) "BB" = ( @@ -2106,6 +2103,7 @@ name = "Body Holofield Switch"; id = "glaive_body_holo" }, +/obj/structure/fermenting_barrel, /turf/open/floor/grass/ship/jungle, /area/ship/roumain) "FA" = ( @@ -2889,8 +2887,10 @@ /turf/open/floor/plating, /area/ship/engineering) "Sl" = ( -/obj/structure/fermenting_barrel, -/turf/open/floor/ship/dirt/dark, +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/fermenting_barrel/distiller, +/turf/open/floor/grass/ship/jungle, /area/ship/roumain) "Sx" = ( /obj/structure/window/reinforced/spawner{ @@ -3951,8 +3951,8 @@ Lk cz YP ds -aM -aM +lb +Sl Fu wp wp @@ -4177,7 +4177,7 @@ ZE MZ qN NL -Sl +NL NL NL NL diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 8e2f1e52758d..c66d3f34c1ad 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -22,7 +22,7 @@ #define VAPOR 3 // foam, spray, blob attack #define PATCH 4 // patches #define INJECT 5 // injection - +#define SMOKE 6 //smoking //defines passed through to the on_reagent_change proc #define DEL_REAGENT 1 // reagent deleted (fully cleared) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 96a013df406a..fed83f681242 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -1164,9 +1164,23 @@ /datum/crafting_recipe/breakawayflask name = "Breakaway Flask" - result = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask + result = /obj/item/reagent_containers/food/drinks/breakawayflask time = 5 SECONDS reqs = list(/obj/item/stack/sheet/glass = 5, /obj/item/stack/sheet/mineral/plasma = 1) tools = list(TOOL_WELDER) category = CAT_MISC + +/datum/crafting_recipe/fermenting_barrel + name = "Wooden Barrel" + result = /obj/structure/fermenting_barrel + reqs = list(/obj/item/stack/sheet/mineral/wood = 8) + time = 50 + category = CAT_PRIMAL + +/datum/crafting_recipe/distiller + name = "Distiller" + result = /obj/structure/fermenting_barrel/distiller + reqs = list(/obj/item/stack/sheet/mineral/wood = 8, /obj/item/stack/sheet/metal = 5, /datum/reagent/srm_bacteria = 30) + time = 50 + category = CAT_PRIMAL diff --git a/code/game/MapData/shuttles/srm_glaive.dm b/code/game/MapData/shuttles/srm_glaive.dm index 738bebeda36b..a40e9bd426c1 100644 --- a/code/game/MapData/shuttles/srm_glaive.dm +++ b/code/game/MapData/shuttles/srm_glaive.dm @@ -91,10 +91,6 @@ ) generate_items_inside(items_inside, src) -/obj/structure/flora/tree/chapel/srm - name = "Montagne's Oak" - desc = "A sturdy oak tree imported directly from the homeworld of the Montagne who runs the ship it resides on. It is planted in soil from the same place." - /obj/item/book/manual/srmlore name = "Notes on the SRM" icon_state = "book5" diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 29edfe40d4fd..7fc59d075356 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -223,9 +223,9 @@ for(var/atom/movable/AM in T) if(AM.type == src.type) continue - reagents.expose(AM, TOUCH, fraction) + reagents.expose(AM, SMOKE, fraction) - reagents.expose(T, TOUCH, fraction) + reagents.expose(T, SMOKE, fraction) return 1 /obj/effect/particle_effect/smoke/chem/smoke_mob(mob/living/carbon/M) diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 751025e7b49c..e46d8d92e82a 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -8,8 +8,11 @@ CanAtmosPass = ATMOS_PASS_DENSITY var/timeleft = 300 //Set to 0 for permanent forcefields (ugh) -/obj/effect/forcefield/Initialize() +/obj/effect/forcefield/Initialize(mapload, new_timeleft) . = ..() + //used to change the time for forcewine + if(new_timeleft) + timeleft = new_timeleft if(timeleft) QDEL_IN(src, timeleft) @@ -36,3 +39,10 @@ name = "invisible blockade" desc = "You're gonna be here awhile." timeleft = 600 + +/obj/effect/forcefield/resin + desc = "It's rapidly decaying!" + name = "resin" + icon_state = "atmos_resin" + CanAtmosPass = ATMOS_PASS_NO + timeleft = 1 diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index c0773b2032cf..da1906143abc 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -242,7 +242,7 @@ /obj/item/book/manual/trickwines_4_brewers name = "Trickwines for brewers" icon_state = "book2" - author = "Baxter Baxter" + author = "Bridget Saint-Baskett" title = "Trickwines for brewers" dat = {" @@ -262,7 +262,16 @@

Breakaway flasks

Honestly, I love these things. I'm not a scientist so I cant exactly explain how it works but somehow when you fuse plasma into glass it makes it ultra sharp and makes it really good for cracking over fauna heads.
The simplest way I have found of making them is crafting them with a chunk of glass, plasma, and a welder.
- I should note: trickwines don't seem to form without flasks. I think it's something to do with the plasma reacting with the mixture.
+ +

Bacteria

+ A speical speices of bacteria native to Illestren is what allows Trickwines form.
+ Now we use a special distiller that keeps just enough bacertia alive to ferment without turning the batch sour.
+ Now you should still have one on board but if you dont its fine.
+ It just so happens we have trees on board our ships host to the Bacteria.
+ To get enough Bacteria your going to need to feed it anything that would help a plant.
+ Water, Fertilizer, Ashwine are all good options.
+ Soon it will drops some apples and you can grind them for the bacteria.
+ Once you have enough you can fabricate it the same way you would a normal barrel.

Ashwine

It's kind of our trademark, and it's one of the simplest trickwines to make. The Montagnes love using this stuff in ceremonies as well so it should get you some good boy points.
@@ -285,11 +294,30 @@ It's a nice upper. Great if you're trying to run away.
This one's really flashy. Expect some severe burns on your target
-
Baxter Baxter, Senior Brewer
- P.S.: please stop asking how the uranium got into those flasks. +

Hearthwine

+ I once threw back a flask of this stuff in the heat of a really bad battle and it sealed my wounds within seconds its honestly increadible.
+ It also acts like the inverse of Icewine heating you up more then a fever.
+ Last time I threw it at someone though i almost burnt down the forest I was in.
+ Its made out of ground up fireblossems with some nice hard cider and a bit of welding fuel with of course a ratio of 3:1:1.
- - "} +

Forcewine

+ I once had a duel with a wizard and and I was able to completly ignore a few of his spells! Its like they just fizzled out when they hit me.
+ Would recomend for any esoteric senarios even though I have only been in a few of those.
+ You can also use it to entrap Fauna inside of a forcefield like bubble, Gives you time to breath and laugh at them.
+ 3:1:1 Tequila, Space Montain Wind, and I know its strange but hollow water, Its that stuff you can extract from geysers
+ +

Prismwine

+ Gives you a nice shiny layer of armour, fire seems to have alot harder time sticking to me when i tested it.
+ Throwing it seeems to do the reverse acting like a magnifying glass to burns and lasers
+ Made 3:1:1 with good ol Gin, then add plasma and tinea luxor which is found from mushroom stems
+ + Some of these can be a bit situatinal but its always nice to have a few in your bag for emergecys.
+ As a bonus, most of the other factions have no clue how to make these so you can sell them for a fair chunk of cash.
+ +
Bridget Saint-Baskett, Senior Brewer
+ + + "} // Wiki books that are linked to the configured wiki link. diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index b316d8b40fa5..50b578a3aee2 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -535,201 +535,6 @@ . = ..() icon_state = "[initial(icon_state)][rand(1,3)]" -// Special tree used in chapel ship -/obj/structure/flora/tree/chapel - name = "sacred oak tree" - icon = 'icons/obj/flora/chapeltree.dmi' - icon_state = "churchtree" - desc = "A true earthen oak tree imported directly from the holy soil of earth. It's radiates a spiritual warmth that calms the soul." - pixel_x = -16 - max_integrity = 200 - bound_height = 64 - var/karma = 0 - var/mojorange = 4 - var/lastcycle = 0 - // Determines the karma gained/lost when feeding the tree this chem - var/list/moralchems = list( - /datum/reagent/water = 0.1, - /datum/reagent/plantnutriment = 0.2, - /datum/reagent/medicine/earthsblood = 1, - /datum/reagent/water/holywater = 0.8, - /datum/reagent/medicine/cryoxadone = 0.3, - /datum/reagent/ammonia = 0.4, - /datum/reagent/saltpetre = 0.5, - /datum/reagent/ash = 0.2, - /datum/reagent/diethylamine = 0.5, - /datum/reagent/consumable/nutriment = 0.1, - /datum/reagent/consumable/virus_food = 0.1, - /datum/reagent/blood = -0.1, - /datum/reagent/consumable/ethanol = -0.1, - /datum/reagent/toxin = -0.2, - /datum/reagent/fluorine = -0.3, - /datum/reagent/chlorine = -0.3, - /datum/reagent/toxin/acid = -0.3, - /datum/reagent/toxin/acid/fluacid = -0.4, - /datum/reagent/toxin/plantbgone = -0.5, - /datum/reagent/napalm = -0.6, - /datum/reagent/hellwater = -1, - /datum/reagent/liquidgibs = -0.2, - /datum/reagent/consumable/ethanol/demonsblood = -0.8, - /datum/reagent/medicine/soulus = -0.2 - ) - -/obj/structure/flora/tree/chapel/Initialize() - START_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/flora/tree/chapel/process() - if(world.time > (lastcycle + 200)) - if(abs(karma) > 100) - pulseKarma() - //Clean up the air a bit - if(isopenturf(loc)) - var/turf/open/T = src.loc - if(T.air) - var/co2 = T.air.get_moles(GAS_CO2) - if(co2 > 0 && prob(50)) - var/amt = min(co2, 10) - T.air.adjust_moles(GAS_CO2, -amt) - T.atmos_spawn_air("o2=[amt];TEMP=293.15") - lastcycle = world.time - -/obj/structure/flora/tree/chapel/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/container = I - if(istype(container, /obj/item/reagent_containers/syringe)) - var/obj/item/reagent_containers/syringe/syr = container - if(syr.mode != 1) - to_chat(user, "You can't get any extract out of this plant.") - return - if(!container.reagents.total_volume) - to_chat(user, "[container] is empty!") - return 1 - if(!container.is_drainable()) - if(container.can_have_cap) - to_chat(user, "[container] has a cap on!") - else - to_chat(user, "You can't use [container] on [src]!") - return 1 - to_chat(user, "You feed [src] [container.amount_per_transfer_from_this]u from [container]...") - playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) - var/datum/reagents/R = new /datum/reagents() - R.my_atom = src - container.reagents.trans_to(R, container.amount_per_transfer_from_this, transfered_by = user) - apply_reagents(R, user) - else if(I.get_sharpness() && I.force > 0) - if(I.hitsound) - playsound(get_turf(src), I.hitsound, 100, FALSE, FALSE) - user.visible_message("[user] begins to cut down [src] with [I].","You begin to cut down [src] with [I].", "You hear the sound of sawing.") - if(do_after(user, 1000/I.force, target = src)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard. - //Regret.dm - to_chat(user, "As you pierce the bark, a supernatural shock jolts through your body...") - user.log_message("attempted to cut down [src] and was smitten") - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(C.can_heartattack()) - C.set_heartattack(TRUE) - else if (isliving(user)) - var/mob/living/L = user - L.Immobilize(100, TRUE) - L.jitteriness += 50 - L.adjustToxLoss(66) - return 1 - else ..() - -/obj/structure/flora/tree/chapel/proc/apply_reagents(datum/reagents/S, mob/user) - var/gainedkarma = 0 - for(var/datum/reagent/R in moralchems) - if(S.has_reagent(R, 1)) - gainedkarma += S.get_reagent_amount(R) * moralchems[R] - if(isliving(user)) - var/mob/living/M = user - if(gainedkarma >= 0) - to_chat(M, "[src] fills with new life as a wave of comfort washes over you.") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/good_tree, name) - if(karma >= 0) - M.adjustBruteLoss(-0.25*karma, 0) - M.adjustFireLoss(-0.25*karma, 0) - M.adjustToxLoss(-0.25*karma, 0) - M.adjustCloneLoss(-0.25*karma, 0) - else - to_chat(M, "Colors fade from [src] as a wave of guilt crawls into your skin.") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/bad_tree, name) - M.adjustToxLoss(abs(karma)*0.25, 0) - adjustKarma(gainedkarma) - -/obj/structure/flora/tree/chapel/proc/update_tree() - if(100 > karma > -100) - name = initial(src.name) - icon_state = initial(src.name) - desc = initial(src.name) - else if (karma >= 100) - name = "hallowed oak tree" - icon_state = "churchtree_nice" - desc = "The sacred spirits of nature have been awoken, washing the area in a holy aura." - else - name = "accursed oak tree" - icon_state = "churchtree_naughty" - desc = "As the bark rots and the leafs turn blood red a sinister aura bleeds into the area." - update_icon_state() - -/obj/structure/flora/tree/chapel/proc/adjustKarma(x) - var/need_update = 0 - var/newkarma = karma + x - if(karma < 100 && newkarma >= 100) - need_update = 1 - visible_message("[src] shifts colors as a heavenly warmth washes over the room.") - if(karma > -100 && newkarma <= -100) - need_update = 1 - visible_message("As the life fades from [src] something evil seeps into the air.") - if(abs(karma) > 100 && newkarma < 100) - need_update = 1 - if(need_update) - update_tree() - karma = newkarma - -/obj/structure/flora/tree/chapel/proc/pulseKarma() - for(var/mob/living/L in range(mojorange, src)) - var/luck = rand(1, 100) - if(karma > 100) - if(luck > 90) - L.reagents.add_reagent(/datum/reagent/medicine/omnizine, 5) - else if (luck > 50) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/better_tree, name) - else if (luck > 25) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/good_tree, name) - else if (luck == 1) - adjustKarma(-10) //Nothing good lasts forever - else - if(luck > 90) - L.reagents.add_reagent(/datum/reagent/toxin, 5) - else if (luck > 50) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/bad_tree, name) - else if (luck > 25) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/worse_tree, name) - else if (luck == 1) - adjustKarma(10) - -/datum/mood_event/good_tree - description = "I feel closer to my soul.\n" - mood_change = 3 - timeout = 5 MINUTES - -/datum/mood_event/bad_tree - description = "I should stop gardening.\n" - mood_change = -3 - timeout = 5 MINUTES - -/datum/mood_event/better_tree - description = "I feel blessed by the gods!\n" - mood_change = 6 - timeout = 5 MINUTES - -/datum/mood_event/worse_tree - description = "It's like a root is digging into my heart.\n" - mood_change = -6 - timeout = 5 MINUTES - /obj/structure/flora/firebush name = "flaming bush" desc = "A bush being consumed by flames. Maybe it'll rise from its ashes like a phoenix?" @@ -980,3 +785,274 @@ desc= "This patch seems to have run dry on life-giving water." icon_state = "dry_grass_1" base_icon_state = "dry_grass" + +// Special tree used in chapel ship +/obj/structure/flora/tree/chapel + name = "sacred oak tree" + icon = 'icons/obj/flora/chapeltree.dmi' + icon_state = "churchtree" + desc = "A true earthen oak tree imported directly from the holy soil of earth. It's radiates a spiritual warmth that calms the soul." + pixel_x = -16 + max_integrity = 200 + bound_height = 64 + var/karma = 0 + var/mojorange = 4 + var/lastcycle = 0 + // Determines the karma gained/lost when feeding the tree this chem + var/list/moralchems = list( + /datum/reagent/water = 0.1, + /datum/reagent/plantnutriment = 0.2, + /datum/reagent/medicine/earthsblood = 1, + /datum/reagent/water/holywater = 0.8, + /datum/reagent/medicine/cryoxadone = 0.3, + /datum/reagent/ammonia = 0.4, + /datum/reagent/saltpetre = 0.5, + /datum/reagent/ash = 0.2, + /datum/reagent/diethylamine = 0.5, + /datum/reagent/consumable/nutriment = 0.1, + /datum/reagent/consumable/virus_food = 0.1, + /datum/reagent/blood = -0.1, + /datum/reagent/consumable/ethanol = -0.1, + /datum/reagent/toxin = -0.2, + /datum/reagent/fluorine = -0.3, + /datum/reagent/chlorine = -0.3, + /datum/reagent/toxin/acid = -0.3, + /datum/reagent/toxin/acid/fluacid = -0.4, + /datum/reagent/toxin/plantbgone = -0.5, + /datum/reagent/napalm = -0.6, + /datum/reagent/hellwater = -1, + /datum/reagent/liquidgibs = -0.2, + /datum/reagent/consumable/ethanol/demonsblood = -0.8, + /datum/reagent/medicine/soulus = -0.2 + ) + +/obj/structure/flora/tree/chapel/Initialize() + START_PROCESSING(SSobj, src) + . = ..() + +/obj/structure/flora/tree/chapel/process() + if(world.time > (lastcycle + 200)) + if(abs(karma) > 100) + pulseKarma() + //Clean up the air a bit + if(isopenturf(loc)) + var/turf/open/T = src.loc + if(T.air) + var/co2 = T.air.get_moles(GAS_CO2) + if(co2 > 0 && prob(50)) + var/amt = min(co2, 10) + T.air.adjust_moles(GAS_CO2, -amt) + T.atmos_spawn_air("o2=[amt];TEMP=293.15") + lastcycle = world.time + +/obj/structure/flora/tree/chapel/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/container = I + if(istype(container, /obj/item/reagent_containers/syringe)) + var/obj/item/reagent_containers/syringe/syr = container + if(syr.mode != 1) + to_chat(user, "You can't get any extract out of this plant.") + return + if(!container.reagents.total_volume) + to_chat(user, "[container] is empty!") + return 1 + if(!container.is_drainable()) + if(container.can_have_cap) + to_chat(user, "[container] has a cap on!") + else + to_chat(user, "You can't use [container] on [src]!") + return 1 + to_chat(user, "You feed [src] [container.amount_per_transfer_from_this]u from [container]...") + playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) + var/datum/reagents/R = new /datum/reagents() + R.my_atom = src + container.reagents.trans_to(R, container.amount_per_transfer_from_this, transfered_by = user) + apply_reagents(R, user) + else if(I.get_sharpness() && I.force > 0) + if(I.hitsound) + playsound(get_turf(src), I.hitsound, 100, FALSE, FALSE) + user.visible_message("[user] begins to cut down [src] with [I].","You begin to cut down [src] with [I].", "You hear the sound of sawing.") + if(do_after(user, 1000/I.force, target = src)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard. + //Regret.dm + to_chat(user, "As you pierce the bark, a supernatural shock jolts through your body...") + user.log_message("attempted to cut down [src] and was smitten") + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.can_heartattack()) + C.set_heartattack(TRUE) + else if (isliving(user)) + var/mob/living/L = user + L.Immobilize(100, TRUE) + L.jitteriness += 50 + L.adjustToxLoss(66) + return 1 + else ..() + +/obj/structure/flora/tree/chapel/proc/apply_reagents(datum/reagents/S, mob/user) + var/gainedkarma = 0 + for(var/datum/reagent/R in moralchems) + if(S.has_reagent(R, 1)) + gainedkarma += S.get_reagent_amount(R) * moralchems[R] + if(isliving(user)) + var/mob/living/M = user + if(gainedkarma >= 0) + to_chat(M, "[src] fills with new life as a wave of comfort washes over you.") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/good_tree, name) + if(karma >= 0) + M.adjustBruteLoss(-0.25*karma, 0) + M.adjustFireLoss(-0.25*karma, 0) + M.adjustToxLoss(-0.25*karma, 0) + M.adjustCloneLoss(-0.25*karma, 0) + else + to_chat(M, "Colors fade from [src] as a wave of guilt crawls into your skin.") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/bad_tree, name) + M.adjustToxLoss(abs(karma)*0.25, 0) + adjustKarma(gainedkarma) + +/obj/structure/flora/tree/chapel/proc/update_tree() + if(100 > karma > -100) + name = initial(src.name) + icon_state = initial(src.name) + desc = initial(src.name) + else if (karma >= 100) + name = "hallowed oak tree" + icon_state = "churchtree_nice" + desc = "The sacred spirits of nature have been awoken, washing the area in a holy aura." + else + name = "accursed oak tree" + icon_state = "churchtree_naughty" + desc = "As the bark rots and the leafs turn blood red a sinister aura bleeds into the area." + update_icon_state() + +/obj/structure/flora/tree/chapel/proc/adjustKarma(x) + var/need_update = 0 + var/newkarma = karma + x + if(karma < 100 && newkarma >= 100) + need_update = 1 + visible_message("[src] shifts colors as a heavenly warmth washes over the room.") + if(karma > -100 && newkarma <= -100) + need_update = 1 + visible_message("As the life fades from [src] something evil seeps into the air.") + if(abs(karma) > 100 && newkarma < 100) + need_update = 1 + if(need_update) + update_tree() + karma = newkarma + +/obj/structure/flora/tree/chapel/proc/pulseKarma() + for(var/mob/living/L in range(mojorange, src)) + var/luck = rand(1, 100) + if(karma > 100) + if(luck > 90) + L.reagents.add_reagent(/datum/reagent/medicine/omnizine, 5) + else if (luck > 50) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/better_tree, name) + else if (luck > 25) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/good_tree, name) + else if (luck == 1) + adjustKarma(-10) //Nothing good lasts forever + else + if(luck > 90) + L.reagents.add_reagent(/datum/reagent/toxin, 5) + else if (luck > 50) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/bad_tree, name) + else if (luck > 25) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/worse_tree, name) + else if (luck == 1) + adjustKarma(10) + +/datum/mood_event/good_tree + description = "I feel closer to my soul.\n" + mood_change = 3 + timeout = 5 MINUTES + +/datum/mood_event/bad_tree + description = "I should stop gardening.\n" + mood_change = -3 + timeout = 5 MINUTES + +/datum/mood_event/better_tree + description = "I feel blessed by the gods!\n" + mood_change = 6 + timeout = 5 MINUTES + +/datum/mood_event/worse_tree + description = "It's like a root is digging into my heart.\n" + mood_change = -6 + timeout = 5 MINUTES + +// Tree used in the SRM ships. +/obj/structure/flora/tree/srm + name = "Montagne's Oak" + icon = 'icons/obj/flora/chapeltree.dmi' + icon_state = "churchtree" + desc = "A sturdy oak tree imported directly from Illestren the homeworld of the Saint-Roumain Militia. It contains a bacteria native to the planet. The soil was carfuly transfered from the same place it was planted. A apple tree branch has been grafted onto it. You could try watering it" + pixel_x = -16 + max_integrity = 200 + bound_height = 64 + var/health = 0 + var/lastcycle = 0 + //Decides where the apple gets dropped + var/apple_direction = SOUTH + //Determines the health gained/lost when feeding the tree this chem + var/list/healthchems = list( + /datum/reagent/consumable/ethanol/trickwine/ash_wine = 0.8, + /datum/reagent/water = 0.1, + /datum/reagent/plantnutriment = 0.2, + /datum/reagent/medicine/earthsblood = 1, + /datum/reagent/water/holywater = 0.8, + /datum/reagent/medicine/cryoxadone = 0.3, + /datum/reagent/ammonia = 0.4, + /datum/reagent/saltpetre = 0.5, + /datum/reagent/ash = 0.2, + /datum/reagent/diethylamine = 0.5, + /datum/reagent/consumable/nutriment = 0.1, + /datum/reagent/consumable/virus_food = 0.1, + /datum/reagent/blood = -0.1, + /datum/reagent/consumable/ethanol = -0.1, + /datum/reagent/toxin = -0.2, + /datum/reagent/fluorine = -0.3, + /datum/reagent/chlorine = -0.3, + /datum/reagent/toxin/acid = -0.3, + /datum/reagent/toxin/acid/fluacid = -0.4, + /datum/reagent/toxin/plantbgone = -0.5, + /datum/reagent/napalm = -0.6, + /datum/reagent/hellwater = -1, + /datum/reagent/liquidgibs = -0.2, + /datum/reagent/consumable/ethanol/demonsblood = -0.8, + /datum/reagent/medicine/soulus = -0.2 + ) + +/obj/structure/flora/tree/srm/Initialize() + START_PROCESSING(SSobj, src) + create_reagents(300, OPENCONTAINER) + . = ..() + +/obj/structure/flora/tree/srm/process() + if(world.time > (lastcycle + 100)) + if(reagents.total_volume > 0) + var/gainedhealth = 0 + for(var/reagent in healthchems) + if(reagents.has_reagent(reagent, 1)) + gainedhealth += reagents.get_reagent_amount(reagent) * healthchems[reagent] + health += gainedhealth + reagents.remove_reagent(reagent, reagents.get_reagent_amount(reagent)) + reagents.clear_reagents() + if(health > 25) + if(prob(50)) + var/obj/item/reagent_containers/food/snacks/grown/apple/apple = new(get_step(get_turf(src), apple_direction)) + apple.name = "illestren Apple" + apple.desc = "You can grind this for bacteria." + apple.reagents.add_reagent(/datum/reagent/srm_bacteria, 10) + visible_message("An [apple] falls from the tree.") + health -= 25 + //Clean up the air a bit + if(isopenturf(loc)) + var/turf/open/T = src.loc + if(T.air) + var/co2 = T.air.get_moles(GAS_CO2) + if(co2 > 0 && prob(50)) + var/amt = min(co2, 10) + T.air.adjust_moles(GAS_CO2, -amt) + T.atmos_spawn_air("o2=[amt];TEMP=293.15") + lastcycle = world.time diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index ca7d208e7a7a..05dccfc0ca75 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -38,6 +38,10 @@ cross.icon_state = "holylight" font_color = "blue" prayer_type = "SPIRITUAL PRAYER" + else if((usr.faction && ("roumain" in usr.faction))) + font_color = "purple" + prayer_type = "SRM PRAYER" + deity = "Ashen Hunter" var/msg_tmp = msg msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" diff --git a/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm b/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm new file mode 100644 index 000000000000..e4e839468ed3 --- /dev/null +++ b/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm @@ -0,0 +1,84 @@ +/obj/item/reagent_containers/food/drinks/breakawayflask + name = "breakaway flask" + desc = "A special flask designed to stabilize trick wines and shatter violently on contact." + icon_state = "breakawayflask" + item_state = "breakawayflask" + w_class = WEIGHT_CLASS_SMALL + gulp_size = 25 + amount_per_transfer_from_this = 25 + volume = 50 + throwforce = 10 + custom_materials = list(/datum/material/glass=2500, /datum/material/plasma=500) + max_integrity = 20 + spillable = TRUE + resistance_flags = ACID_PROOF + obj_flags = UNIQUE_RENAME + drop_sound = 'sound/items/handling/drinkglass_drop.ogg' + pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' + custom_price = 25 + can_have_cap = TRUE + cap_icon_state = "baflask_cap" + cap_on = TRUE + var/vintage = FALSE + +/obj/item/reagent_containers/food/drinks/breakawayflask/on_reagent_change(changetype) + cut_overlays() + + gulp_size = max(round(reagents.total_volume / 25), 25) + var/datum/reagent/largest_reagent = reagents.get_master_reagent() + if (reagents.reagent_list.len > 0) + if(!renamedByPlayer && vintage == FALSE) + name = largest_reagent.glass_name + desc = largest_reagent.glass_desc + if(largest_reagent.breakaway_flask_icon_state) + icon_state = largest_reagent.breakaway_flask_icon_state + else + var/mutable_appearance/baflask_overlay = mutable_appearance(icon, "baflaskoverlay") + icon_state = "baflaskclear" + baflask_overlay.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(baflask_overlay) + + else + icon_state = "breakawayflask" + name = "breakaway flask" + desc = "A special flask designed to stabilize trick wines and shatter violently on contact." + return + +/obj/item/reagent_containers/food/drinks/breakawayflask/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + spillable = TRUE + . = ..() + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage + name = "Vintange Saint-Roumain Trickwine" + desc = "Supposedly one of the first bottles made" + vintage = TRUE + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine + name = "Vintange Saint-Roumain Ashwine" + list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/ash_wine = 45, /datum/reagent/consumable/ethanol/absinthe = 5) + desc = "Ashwine was originally created using herbs native to Illestren, as a means of relaxing after a long hunt. The Saint-Roumain Militia has no prohibition on a little fun." + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine + name = "Vintange Saint-Roumain Icewine" + list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/ice_wine = 45, /datum/reagent/consumable/ethanol/sake = 5) + desc = "Icewine, inspired by the frigid slopes of the 'Godforsaken Precipice' that forged the group's reputation as valiant survivalists, was engineered to both soothe overheated Hunters and freeze their foes in their tracks." + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine + name = "Vintange Saint-Roumain Shockwine" + list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/shock_wine = 45, /datum/reagent/consumable/ethanol/vodka = 5) + desc = "Shockwine, made to invigorate consumers and incapacitate targets, took inspiration from an incident early in the Saint-Roumain Militia's history, when a young Shadow stopped a rampaging beast by plunging an electrical cable that had been dislodged in the fighting into its side." + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine + name = "Vintange Saint-Roumain Hearthwine" + list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/hearth_wine = 45, /datum/reagent/consumable/ethanol/hcider = 5) + desc = "Hearthwine is one of the most important tonics devised by the SRM – both for its potent abilities in staunching wounds or setting enemies aflame, and for its closeness to the divine fire associated with the Ashen Huntsman." + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine + name = "Vintange Saint-Roumain Forcewine" + list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/force_wine = 45, /datum/reagent/consumable/ethanol/tequila = 5) + desc = "Forcewine was originally created as a means to create temporary shelters during long tracking expeditions. While the structures proved to be not as versatile in shape as its brewers had hoped, its utility in creating barricades or heming in hostiles was still greatly appreciated." + +/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine + name = "Vintange Saint-Roumain Prismwine" + list_reagents = list(/datum/reagent/consumable/ethanol/trickwine/prism_wine = 45, /datum/reagent/consumable/ethanol/gin = 5) + desc = "Prismwine is one of the most recent additions to the Saint-Roumain Militia's reserve of trickwines. It was purpose-created for fighting hostiles that utilized more advanced energy projection attacks, such as the cryonic beams of watchers or the laser guns of interstellar pirates." diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 4ca34b224689..1d7adb7db4f2 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -88,63 +88,6 @@ if(ishumanbasic(user)) . += "You feel like this might be in poor taste." -//Breakaway Flasks! - -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask - name = "breakaway flask" - desc = "A special flask designed to stabilize trick wines and shatter violently on contact" - icon_state = "breakawayflask" - gulp_size = 25 - amount_per_transfer_from_this = 25 - volume = 50 - throwforce = 20 - custom_materials = list(/datum/material/glass=2500, /datum/material/plasma=500) - max_integrity = 20 - spillable = TRUE - resistance_flags = ACID_PROOF - obj_flags = UNIQUE_RENAME - drop_sound = 'sound/items/handling/drinkglass_drop.ogg' - pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' - custom_price = 25 - -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/on_reagent_change(changetype) - cut_overlays() - - gulp_size = max(round(reagents.total_volume / 25), 25) - var/datum/reagent/largest_reagent = reagents.get_master_reagent() - if (reagents.reagent_list.len > 0) - if(!renamedByPlayer) - name = largest_reagent.glass_name - desc = largest_reagent.glass_desc - if(largest_reagent.breakaway_flask_icon_state) - icon_state = largest_reagent.breakaway_flask_icon_state - else - var/mutable_appearance/baflask_overlay = mutable_appearance(icon, "baflaskoverlay") - icon_state = "baflaskclear" - baflask_overlay.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(baflask_overlay) - - else - icon_state = "breakawayflask" - name = initial(src.name) - desc = initial(src.desc) - return - -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageash - name = "Vintange Saint-Roumain Ashwine" - desc = "Supposedly one of the first bottles of ashwine made" - list_reagents = list(/datum/reagent/consumable/ethanol/ash_wine = 45, /datum/reagent/uranium = 5) - -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageice - name = "Vintange Saint-Roumain Icewine" - desc = "Supposedly one of the first bottles of icewine made" - list_reagents = list(/datum/reagent/consumable/ethanol/ice_wine = 45, /datum/reagent/uranium = 5) - -/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageshock - name = "Vintange Saint-Roumain Shockwine" - desc = "Supposedly one of the first bottles of shockwine made" - list_reagents = list(/datum/reagent/consumable/ethanol/shock_wine = 45, /datum/reagent/uranium = 5) - /obj/item/reagent_containers/food/drinks/drinkingglass/filled/Initialize() . = ..() on_reagent_change(ADD_REAGENT) diff --git a/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm b/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm index 2dbbb4f5cc86..3024c188facf 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/big_mortar.dm @@ -113,6 +113,7 @@ juice_target_item(target_item, user) else grind_target_item(target_item, user) + target_item = null if("Grind") for(var/obj/item/target_item as anything in contents) @@ -120,6 +121,7 @@ grind_target_item(target_item, user) else juice_target_item(target_item, user) + target_item = null return if(!attacking_item.juice_results && !attacking_item.grind_results) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 2625b25233e5..3d759bce3fd2 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -634,19 +634,37 @@ mix_sound = 'sound/effects/clockcult_gateway_closing.ogg' /datum/chemical_reaction/ash_wine - results = list(/datum/reagent/consumable/ethanol/ash_wine = 5) + results = list(/datum/reagent/consumable/ethanol/trickwine/ash_wine = 5) required_reagents = list(/datum/reagent/consumable/ethanol/absinthe = 3, /datum/reagent/ash = 1, /datum/reagent/drug/mushroomhallucinogen = 1) - required_container = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask + required_container = /obj/structure/fermenting_barrel/distiller mix_sound ='sound/weather/ashstorm/inside/weak_end.ogg' /datum/chemical_reaction/ice_wine - results = list(/datum/reagent/consumable/ethanol/ice_wine = 5) + results = list(/datum/reagent/consumable/ethanol/trickwine/ice_wine = 5) required_reagents = list(/datum/reagent/consumable/ethanol/sake = 3, /datum/reagent/polar_bear_fur = 1, /datum/reagent/consumable/frostoil = 1) - required_container = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask + required_container = /obj/structure/fermenting_barrel/distiller mix_sound ='sound/effects/glassbr3.ogg' /datum/chemical_reaction/shock_wine - results = list(/datum/reagent/consumable/ethanol/shock_wine = 5) + results = list(/datum/reagent/consumable/ethanol/trickwine/shock_wine = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/lemonjuice = 1) - required_container = /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask + required_container = /obj/structure/fermenting_barrel/distiller mix_sound ='sound/machines/defib_zap.ogg' + +/datum/chemical_reaction/hearth_wine + results = list(/datum/reagent/consumable/ethanol/trickwine/hearth_wine = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/hcider = 3, /datum/reagent/consumable/pyre_elementum = 1, /datum/reagent/fuel = 1) + required_container = /obj/structure/fermenting_barrel/distiller + mix_sound ='sound/items/welder.ogg' + +/datum/chemical_reaction/force_wine + results = list(/datum/reagent/consumable/ethanol/trickwine/force_wine = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 3, /datum/reagent/calcium = 1, /datum/reagent/consumable/spacemountainwind = 1) + required_container = /obj/structure/fermenting_barrel/distiller + mix_sound ='sound/magic/forcewall.ogg' + +/datum/chemical_reaction/prism_wine + results = list(/datum/reagent/consumable/ethanol/trickwine/prism_wine = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/gin = 3, /datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/tinlux = 1) + required_container = /obj/structure/fermenting_barrel/distiller + mix_sound ='sound/weapons/laser.ogg' diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index b98175f4cf6a..30e94845e593 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -75,9 +75,14 @@ icon_state = "barrel" return ..() -/datum/crafting_recipe/fermenting_barrel - name = "Wooden Barrel" - result = /obj/structure/fermenting_barrel - reqs = list(/obj/item/stack/sheet/mineral/wood = 8) - time = 50 - category = CAT_PRIMAL +/obj/structure/fermenting_barrel/distiller + name = "Distiller" + icon_state = "distiller" + desc = "A repurposed barrel and keg host to a special culture of bacteria native to Illestren" + +/obj/structure/fermenting_barrel/distiller/update_icon_state() + if(open) + icon_state = "distiller_open" + else + icon_state = "distiller" + return ..() diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 26df953b9523..b098e79dadac 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -153,8 +153,6 @@ Assistant gloves = /obj/item/clothing/gloves/color/white accessory = /obj/item/clothing/neck/scarf/darkblue - - /datum/outfit/job/assistant/roumain name = "Shadow (Saint-Roumain Militia)" @@ -165,7 +163,8 @@ Assistant head = /obj/item/clothing/head/cowboy/sec/roumain/shadow - +/datum/outfit/job/assistant/roumain/post_equip(mob/living/carbon/human/H) + H.faction |= list("roumain") /datum/outfit/job/assistant/pharma name = "Pharmacology Student" diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 8c59ec2a7cad..a122b4249b98 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -112,6 +112,9 @@ /obj/item/melee/classic_baton/telescopic=1 ) +/datum/outfit/job/hos/roumain/post_equip(mob/living/carbon/human/H) + H.faction |= list("roumain") + /datum/job/hos/roumain outfit = /datum/outfit/job/hos/roumain mind_traits = null diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 66a3f950bc57..f46b1f243582 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -124,6 +124,9 @@ courierbag = /obj/item/storage/backpack/messenger backpack_contents = list(/obj/item/storage/firstaid/roumain=1) +/datum/outfit/job/doctor/roumain/post_equip(mob/living/carbon/human/H) + H.faction |= list("roumain") + /datum/outfit/job/doctor/frontiersmen name = "Surgeon (frontiersmen)" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 20b753f56abd..3fe484c56986 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -287,6 +287,9 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S courierbag = /obj/item/storage/backpack/messenger backpack_contents = null +/datum/outfit/job/security/roumain/post_equip(mob/living/carbon/human/H) + H.faction |= list("roumain") + /datum/outfit/job/security/aipirate name = "Nodesman (Security)" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 7be0cf76bbd7..bdc4124ed929 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -1036,5 +1036,11 @@ if(prob(75)) backpack_contents += list(/obj/item/ammo_box/c38_box = 1) if(prob(75)) - backpack_contents += list(pick(/obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageash, /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageice, /obj/item/reagent_containers/food/drinks/drinkingglass/breakawayflask/vintageshock) = 1) + backpack_contents += list(pick( + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine,) = 2) . = ..() diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm index fb4994f00ad3..d6b0703ccb59 100644 --- a/code/modules/movespeed/modifiers/reagent.dm +++ b/code/modules/movespeed/modifiers/reagent.dm @@ -38,4 +38,4 @@ multiplicative_slowdown = -0.45 /datum/movespeed_modifier/reagent/shock_wine - multiplicative_slowdown = -0.15 + multiplicative_slowdown = -0.40 diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index bf22e6967862..a35a8c91542a 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -101,6 +101,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/amount = round(reac_volume*modifier, 0.1) if(amount >= 0.5) M.reagents.add_reagent(type, amount) + SSblackbox.record_feedback("nested tally", "reagent expose mob", 1, list("[name]", "[M]", "[method]", "[reac_volume]")) return 1 /// Applies this reagent to an [/obj] diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index b2c8633321ea..0e6b166ff810 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -73,7 +73,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(!isliving(M)) return - if(method in list(TOUCH, VAPOR, PATCH)) + if(method in list(TOUCH, SMOKE, VAPOR, PATCH)) M.adjust_fire_stacks(reac_volume / 15) if(iscarbon(M)) @@ -2434,7 +2434,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A spin on the classic. Artists and street fighters swear by this stuff." /datum/reagent/consumable/ethanol/out_of_lime/expose_mob(mob/living/carbon/human/consumer, method=INGEST, reac_volume) - if(method == INGEST || method == TOUCH) + if(method == INGEST || method == TOUCH || method == SMOKE) if(istype(consumer)) consumer.hair_color = pick("0ad","a0f","f73","d14","0b5","fc2","084","05e","d22","fa0") consumer.facial_hair_color = pick("0ad","a0f","f73","d14","0b5","fc2","084","05e","d22","fa0") @@ -2455,89 +2455,3 @@ All effects don't start immediately, but rather get worse over time; the rate is M.clockcultslurring = min(M.clockcultslurring + 3, 3) M.stuttering = min(M.stuttering + 3, 3) ..() - -/datum/reagent/consumable/ethanol/ash_wine - name = "Ashwine" - description = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels." - color = "#293D25" - boozepwr = 80 - quality = DRINK_VERYGOOD - taste_description = "devotional energy and a hint of high-potency hallucinogens" - glass_name = "Ashwine" - glass_desc = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels." - breakaway_flask_icon_state = "baflaskashwine" - -/datum/reagent/consumable/ethanol/ash_wine/on_mob_life(mob/living/M) - var/high_message = pick("you feel far more devoted to the cause", "you feel like you should go on a hunt") - var/cleanse_message = pick("divine light purifies you", "you are purged of foul spirts") - //needs to get updated anytime someone adds a srm job - var/static/list/increased_toxin_loss = list("Hunter Montagne", "Hunter Doctor", "Hunter", "Shadow") - if(prob(10)) - M.set_drugginess(10) - to_chat(M, "[high_message]") - if(M.mind && (M.mind.assigned_role in increased_toxin_loss)) - M.adjustToxLoss(-2) - if(prob(10)) - to_chat(M, "[cleanse_message]") - ..() - . = 1 - -/datum/reagent/consumable/ethanol/ash_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(method == TOUCH) - if(!iscarbon(M)) - reac_volume = reac_volume * 2 - M.Jitter(3 * reac_volume) - M.Dizzy(2 * reac_volume) - M.set_drugginess(3 * reac_volume) - M.emote(pick("twitch","giggle")) - -/datum/reagent/consumable/ethanol/ice_wine - name = "Icewine" - description = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown." - color = "#21EFEB" - boozepwr = 70 - taste_description = "a cold night on the hunt" - glass_name = "Icewine" - glass_desc = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown." - breakaway_flask_icon_state = "baflaskicewine" - -/datum/reagent/consumable/ethanol/ice_wine/on_mob_life(mob/living/M) - M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) - M.adjustFireLoss(-1) - ..() - return TRUE - -/datum/reagent/consumable/ethanol/ice_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(method == TOUCH) - if(!iscarbon(M)) - reac_volume = reac_volume * 2 - M.adjust_bodytemperature((-20*reac_volume) * TEMPERATURE_DAMAGE_COEFFICIENT) - M.Paralyze(reac_volume) - walk(M, 0) //stops them mid pathing even if they're stunimmunee - M.apply_status_effect(/datum/status_effect/ice_block_talisman, (0.1 * reac_volume) SECONDS) - -/datum/reagent/consumable/ethanol/shock_wine - name = "Shock Wine" - description = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown" - color = "#00008b" - taste_description = "the adrenaline of the chase" - glass_name = "Shock Wine" - glass_desc = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown" - breakaway_flask_icon_state = "baflaskshockwine" - -/datum/reagent/consumable/ethanol/shock_wine/on_mob_metabolize(mob/living/M) - ..() - M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine) - -/datum/reagent/consumable/ethanol/shock_wine/on_mob_end_metabolize(mob/living/M) - M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine) - ..() - -/datum/reagent/consumable/ethanol/shock_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) - if(method == TOUCH) - //simple mobs are so tanky and i want this to be useful on them - if(iscarbon(M)) - reac_volume = reac_volume / 4 - M.electrocute_act(reac_volume, src, siemens_coeff = 1, flags = SHOCK_NOSTUN|SHOCK_TESLA) - do_sparks(5, FALSE, M) - playsound(M, 'sound/machines/defib_zap.ogg', 100, TRUE) diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 4fc71a1eba0d..88ce3870e575 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -425,7 +425,7 @@ WS End*/ var/mob/living/carbon/carbies = M if (carbies.stat == DEAD) show_message = 0 - if(method in list(PATCH, TOUCH)) + if(method in list(PATCH, TOUCH, SMOKE)) var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) carbies.adjustToxLoss((harmies+burnies)*0.66) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 1fca654b01a4..e4e6bdd1d620 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -118,18 +118,18 @@ F.fry(volume) F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) -/datum/reagent/consumable/cooking_oil/expose_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0) +/datum/reagent/consumable/cooking_oil/expose_mob(mob/living/M, method = TOUCH, method = SMOKE, reac_volume, show_message = 1, touch_protection = 0) if(!istype(M)) return var/boiling = FALSE if(holder && holder.chem_temp >= fry_temperature) boiling = TRUE - if(method != VAPOR && method != TOUCH) //Directly coats the mob, and doesn't go into their bloodstream + if(method != VAPOR && method != TOUCH && method != SMOKE) //Directly coats the mob, and doesn't go into their bloodstream return ..() if(!boiling) return TRUE var/oil_damage = ((holder.chem_temp / fry_temperature) * 0.33) //Damage taken per unit - if(method == TOUCH) + if(method == TOUCH || method == SMOKE) oil_damage *= 1 - M.get_permeability_protection() var/FryLoss = round(min(38, oil_damage * reac_volume)) if(!HAS_TRAIT(M, TRAIT_OIL_FRIED)) @@ -287,7 +287,7 @@ return var/mob/living/carbon/victim = M - if(method == TOUCH || method == VAPOR) + if(method == TOUCH || method == SMOKE || method == VAPOR) var/pepper_proof = victim.is_pepper_proof() //check for protection @@ -561,7 +561,7 @@ ..() /datum/reagent/consumable/honey/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) + if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH, SMOKE))) var/mob/living/carbon/C = M for(var/s in C.surgeries) var/datum/surgery/S = s @@ -821,7 +821,7 @@ ingested = TRUE return SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "pyre_elementum", /datum/mood_event/irritate, name) // Applied if not eaten - if(method == TOUCH || method == VAPOR) + if(method == TOUCH || method == SMOKE || method == VAPOR) M.adjust_fire_stacks(reac_volume / 5) return ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 20e1240d7e01..24be546cb3f6 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -415,7 +415,7 @@ if(iscarbon(M)) if (M.stat == DEAD) show_message = 0 - if(method in list(PATCH, TOUCH)) + if(method in list(PATCH, TOUCH, SMOKE)) M.adjustBruteLoss(-1.25 * reac_volume) M.adjustFireLoss(-1.25 * reac_volume) if(show_message) @@ -1642,7 +1642,7 @@ . = 1 /datum/reagent/medicine/polypyr/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if(method == TOUCH || method == SMOKE || method == VAPOR) if(M && ishuman(M) && reac_volume >= 0.5) var/mob/living/carbon/human/H = M H.hair_color = "92f" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index e878cfc0f71d..9915ca9c4d24 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -18,7 +18,7 @@ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue - if((method == TOUCH || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + if(((method == TOUCH || method == SMOKE) || method == VAPOR) && (D.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) L.ContactContractDisease(D) else //ingest, patch or inject L.ForceContractDisease(D) @@ -198,7 +198,7 @@ /datum/reagent/water/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with water can help put them out! if(!istype(M)) return - if(method == TOUCH) + if(method == TOUCH || method == SMOKE) M.adjust_fire_stacks(-(reac_volume / 10)) M.ExtinguishMob() ..() @@ -330,7 +330,7 @@ /datum/reagent/hydrogen_peroxide/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with h2o2 can burn them ! if(!istype(M)) return - if(method == TOUCH) + if(method == TOUCH || method == SMOKE) M.adjustFireLoss(2, 0) // burns ..() @@ -340,7 +340,7 @@ taste_description = "suffering" /datum/reagent/fuel/unholywater/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) M.reagents.add_reagent(type,reac_volume/4) return return ..() @@ -750,7 +750,7 @@ taste_description = "slime" /datum/reagent/aslimetoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume) - if(method != TOUCH) + if(method != TOUCH && method != SMOKE) L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) /datum/reagent/gluttonytoxin @@ -998,7 +998,7 @@ taste_description = "bitterness" /datum/reagent/space_cleaner/sterilizine/expose_mob(mob/living/carbon/C, method=TOUCH, reac_volume) - if(method in list(TOUCH, VAPOR, PATCH)) + if(method in list(TOUCH, VAPOR, PATCH, SMOKE)) for(var/s in C.surgeries) var/datum/surgery/S = s S.speed_modifier = max(0.2, S.speed_modifier) @@ -1119,7 +1119,7 @@ //WS End /datum/reagent/bluespace/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) do_teleport(M, get_turf(M), (reac_volume / 5), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //4 tiles per crystal ..() @@ -1179,7 +1179,7 @@ accelerant_quality = 10 /datum/reagent/fuel/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite! - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) M.adjust_fire_stacks(reac_volume / 10) return ..() @@ -1212,7 +1212,7 @@ M.adjustToxLoss(rand(5,10)) /datum/reagent/space_cleaner/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) M.wash(clean_types) /datum/reagent/space_cleaner/ez_clean @@ -1229,7 +1229,7 @@ /datum/reagent/space_cleaner/ez_clean/expose_mob(mob/living/M, method=TOUCH, reac_volume) ..() - if((method == TOUCH || method == VAPOR) && !issilicon(M)) + if(((method == TOUCH || method == SMOKE) || method == VAPOR) && !issilicon(M)) M.adjustBruteLoss(1.5) M.adjustFireLoss(1.5) @@ -1870,7 +1870,7 @@ /datum/reagent/acetone_oxide/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people kills people! if(!istype(M)) return - if(method == TOUCH) + if(method == TOUCH || method == SMOKE) M.adjustFireLoss(2, FALSE) // burns, M.adjust_fire_stacks((reac_volume / 10)) ..() @@ -1950,7 +1950,7 @@ color = pick(potential_colors) /datum/reagent/hair_dye/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) if(M && ishuman(M)) var/mob/living/carbon/human/H = M H.hair_color = pick(potential_colors) @@ -1965,7 +1965,7 @@ taste_description = "sourness" /datum/reagent/barbers_aid/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) if(M && ishuman(M) && !HAS_TRAIT(M, TRAIT_BALD)) var/mob/living/carbon/human/H = M var/datum/sprite_accessory/hair/picked_hair = pick(GLOB.hairstyles_list) @@ -1983,7 +1983,7 @@ taste_description = "sourness" /datum/reagent/concentrated_barbers_aid/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) if(M && ishuman(M) && !HAS_TRAIT(M, TRAIT_BALD)) var/mob/living/carbon/human/H = M to_chat(H, "Your hair starts growing at an incredible speed!") @@ -1999,7 +1999,7 @@ taste_description = "bitterness" /datum/reagent/baldium/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) if(M && ishuman(M)) var/mob/living/carbon/human/H = M to_chat(H, "Your hair is falling out in clumps!") @@ -2786,3 +2786,9 @@ description = "Fur obtained from griding up a polar bears hide" reagent_state = SOLID color = "#eeeeee" // rgb: 238, 238, 238 + +/datum/reagent/srm_bacteria + name = "Illestren Bacteria" + description = "Bacteria native to the Saint-Roumain Militia home planet." + color = "#5a4f42" + taste_description = "sour" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 0445138a4e20..62c743558e13 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -319,7 +319,7 @@ O.extinguish() /datum/reagent/firefighting_foam/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method in list(VAPOR, TOUCH)) + if(method in list(VAPOR, TOUCH, SMOKE)) M.adjust_fire_stacks(-reac_volume) M.ExtinguishMob() ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 9cde25afcac0..6af26706b9f8 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -104,7 +104,7 @@ T.atmos_spawn_air("plasma=[reac_volume];TEMP=[temp]") /datum/reagent/toxin/plasma/expose_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with plasma is stronger than fuel! - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) M.adjust_fire_stacks(reac_volume / 5) return ..() @@ -574,7 +574,7 @@ toxpwr = 0 /datum/reagent/toxin/itching_powder/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(method == TOUCH || method == VAPOR) + if((method == TOUCH || method == SMOKE) || method == VAPOR) M.reagents?.add_reagent(/datum/reagent/toxin/itching_powder, reac_volume) /datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm new file mode 100644 index 000000000000..8b13d62e72b0 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm @@ -0,0 +1,207 @@ +/datum/reagent/consumable/ethanol/trickwine + name = "Trickwine" + description = "How is this even possible" + +/datum/reagent/consumable/ethanol/trickwine/ash_wine + name = "Ashwine" + description = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels." + color = "#293D25" + boozepwr = 80 + quality = DRINK_VERYGOOD + taste_description = "devotional energy and a hint of high-potency hallucinogens" + glass_name = "Ashwine" + glass_desc = "A traditional sacrament for members of the Saint-Roumain Militia. Known to grant visions, and is used both for ritual and entertainment purposes aboard Saint-Roumain vessels." + breakaway_flask_icon_state = "baflaskashwine" + +/datum/reagent/consumable/ethanol/trickwine/ash_wine/on_mob_life(mob/living/M) + var/high_message = pick("You feel far more devoted to the cause", "You feel like you should go on a hunt") + var/cleanse_message = pick("Divine light purifies you.", "You are purged of foul spirts.") + if(prob(10)) + M.set_drugginess(10) + to_chat(M, "[high_message]") + if(M.faction && ("roumain" in M.faction)) + M.adjustToxLoss(-2) + if(prob(10)) + to_chat(M, "[cleanse_message]") + return ..() + +/datum/reagent/consumable/ethanol/trickwine/ash_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH) + if(!iscarbon(M)) + var/mob/living/simple_animal/hostile/hostile_target = M + var/hostile_ai_status = hostile_target.AIStatus + hostile_target.AIStatus = AI_OFF + addtimer(VARSET_CALLBACK(hostile_target, AIStatus, hostile_ai_status),reac_volume) + M.Jitter(3 * reac_volume) + M.Dizzy(2 * reac_volume) + M.set_drugginess(3 * reac_volume) + M.emote(pick("twitch","giggle")) + return ..() + +/datum/reagent/consumable/ethanol/trickwine/ice_wine + name = "Icewine" + description = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown." + color = "#21EFEB" + boozepwr = 70 + taste_description = "a cold night on the hunt" + glass_name = "Icewine" + glass_desc = "A specialized brew utilized by members of the Saint-Roumain Militia, designed to assist in temperature regulation while working in hot environments. Known to give one the cold shoulder when thrown." + breakaway_flask_icon_state = "baflaskicewine" + +/datum/reagent/consumable/ethanol/trickwine/ice_wine/on_mob_life(mob/living/M) + M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) + M.adjustFireLoss(-1) + return ..() + + +/datum/reagent/consumable/ethanol/trickwine/ice_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH) + var/paralyze_dur + if(!iscarbon(M)) + reac_volume = reac_volume * 2 + paralyze_dur = reac_volume + else + if(reac_volume <= 50) + paralyze_dur = reac_volume + else + paralyze_dur = 50 + ((reac_volume - 50) / 4) + M.adjust_bodytemperature((-20*reac_volume) * TEMPERATURE_DAMAGE_COEFFICIENT, 50) + M.Paralyze(paralyze_dur) + walk(M, 0) //stops them mid pathing even if they're stunimmunee + M.apply_status_effect(/datum/status_effect/ice_block_talisman, paralyze_dur) + return ..() + +/datum/reagent/consumable/ethanol/trickwine/shock_wine + name = "Shockwine" + description = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown" + color = "#00008b" + boozepwr = 70 + taste_description = "the adrenaline of the chase" + glass_name = "Shockwine" + glass_desc = "A stimulating brew utilized by members of the Saint-Roumain Militia, created to allow trackers to keep up with highly mobile prey. Known to have a shocking effect when thrown" + breakaway_flask_icon_state = "baflaskshockwine" + +/datum/reagent/consumable/ethanol/trickwine/shock_wine/on_mob_metabolize(mob/living/M) + ..() + M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine) + to_chat(M, "You feel faster the lightning!") + +/datum/reagent/consumable/ethanol/trickwine/shock_wine/on_mob_end_metabolize(mob/living/M) + M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/shock_wine) + to_chat(M, "You slow to a crawl...") + ..() + +/datum/reagent/consumable/ethanol/trickwine/shock_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH) + //simple mobs are so tanky and i want this to be useful on them + if(iscarbon(M)) + reac_volume = reac_volume / 4 + M.electrocute_act(reac_volume, src, siemens_coeff = 1, flags = SHOCK_NOSTUN|SHOCK_TESLA) + do_sparks(5, FALSE, M) + playsound(M, 'sound/machines/defib_zap.ogg', 100, TRUE) + return ..() + +/datum/reagent/consumable/ethanol/trickwine/hearth_wine + name = "Hearthwine" + description = "A fiery brew utilized by members of the Saint-Roumain Militia, engineered to cauterize wounds in the field. Goes out in a blaze of glory when thrown." + color = "#ff8c00" + boozepwr = 70 + taste_description = "the heat of battle" + glass_name = "Hearthwine" + glass_desc = "Fiery brew utilized by members of the Saint-Roumain Militia, engineered to cauterize wounds in the field. Goes out in a blaze of glory when thrown." + breakaway_flask_icon_state = "baflaskhearthwine" + +/datum/reagent/consumable/ethanol/trickwine/hearth_wine/on_mob_life(mob/living/M) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal()) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.bleed_rate = max(H.bleed_rate - 0.25, 0) + return ..() + +/datum/reagent/consumable/ethanol/trickwine/hearth_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH) + if(!iscarbon(M)) + reac_volume = reac_volume * 2 + M.fire_act() + var/turf/T = get_turf(M) + T.IgniteTurf(reac_volume) + new /obj/effect/hotspot(T, reac_volume * 1, FIRE_MINIMUM_TEMPERATURE_TO_EXIST + reac_volume * 10) + var/turf/otherT + for(var/direction in GLOB.cardinals) + otherT = get_step(T, direction) + otherT.IgniteTurf(reac_volume) + new /obj/effect/hotspot(otherT, reac_volume * 1, FIRE_MINIMUM_TEMPERATURE_TO_EXIST + reac_volume * 10) + return ..() + +/datum/reagent/consumable/ethanol/trickwine/force_wine + name = "Forcewine" + description = "A fortifying brew utilized by members of the Saint-Roumain Militia, created to protect against the esoteric. Known to act defensively when thrown." + color = "#8b009b" + boozepwr = 70 + taste_description = "the strength of your convictions" + glass_name = "Forcewine" + glass_desc = "A fortifying brew utilized by members of the Saint-Roumain Militia, created to protect against the esoteric. Known to act defensively when thrown." + breakaway_flask_icon_state = "baflaskforcewine" + +/datum/reagent/consumable/ethanol/trickwine/force_wine/on_mob_metabolize(mob/living/M) + ..() + ADD_TRAIT(M, TRAIT_ANTIMAGIC, "trickwine") + ADD_TRAIT(M, TRAIT_MINDSHIELD, "trickwine") + M.visible_message("[M] glows a dim grey aura") + +/datum/reagent/consumable/ethanol/trickwine/force_wine/on_mob_end_metabolize(mob/living/M) + M.visible_message("[M]'s aura fades away ") + REMOVE_TRAIT(M, TRAIT_ANTIMAGIC, "trickwine") + REMOVE_TRAIT(M, TRAIT_MINDSHIELD, "trickwine") + ..() + +/datum/reagent/consumable/ethanol/trickwine/force_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH) + if(!iscarbon(M)) + reac_volume = reac_volume * 2 + var/turf/T = get_turf(M) + var/turf/otherT + new /obj/effect/forcefield/resin(T, reac_volume * 4) + for(var/direction in GLOB.cardinals) + otherT = get_step(T, direction) + new /obj/effect/forcefield/resin(otherT, reac_volume * 4) + return ..() + +/datum/reagent/consumable/ethanol/trickwine/prism_wine + name = "Prismwine" + description = "A glittering brew utilized by members of the Saint-Roumain Militia, mixed to provide defense against the blasts and burns of foes and fauna alike. Softens targets against your own burns when thrown." + color = "#add8e6" + boozepwr = 70 + taste_description = "the reflective quality of meditation" + glass_name = "Prismwine" + glass_desc = "A glittering brew utilized by members of the Saint-Roumain Militia, mixed to provide defense against the blasts and burns of foes and fauna alike. Softens targets against your own burns when thrown." + breakaway_flask_icon_state = "baflaskprismwine" + +/datum/reagent/consumable/ethanol/trickwine/prism_wine/on_mob_metabolize(mob/living/carbon/human/M) + ..() + if(M.physiology.burn_mod <= initial(M.physiology.burn_mod)) + M.physiology.burn_mod *= 0.5 + M.visible_message("[M] seems to shimmer with power!") + +/datum/reagent/consumable/ethanol/trickwine/prism_wine/on_mob_end_metabolize(mob/living/carbon/human/M) + if(M.physiology.burn_mod > initial(M.physiology.burn_mod)) + M.physiology.burn_mod *= 2 + M.visible_message("[M] has returned to normal!") + ..() + +/datum/reagent/consumable/ethanol/trickwine/prism_wine/expose_mob(mob/living/M, method=TOUCH, reac_volume) + if(method == TOUCH) + if(istype(M, /mob/living/simple_animal/hostile/asteroid)) + var/mob/living/simple_animal/hostile/asteroid/the_animal = M + the_animal.armor.modifyRating(energy = -50) + spawn(reac_volume SECONDS) + the_animal.armor.modifyRating(energy = 50) + if(ishuman(M)) + var/mob/living/carbon/human/the_human = M + if(the_human.physiology.burn_mod < 2) + the_human.physiology.burn_mod *= 2 + the_human.visible_message("[the_human] seemed weakend!") + spawn(reac_volume SECONDS) + the_human.physiology.burn_mod *= 0.5 + the_human.visible_message("[the_human] has returned to normal!") + return ..() diff --git a/code/modules/reagents/reagent_containers/mortar.dm b/code/modules/reagents/reagent_containers/mortar.dm index 6fc3cd85e0d9..3c1443bfb9d2 100644 --- a/code/modules/reagents/reagent_containers/mortar.dm +++ b/code/modules/reagents/reagent_containers/mortar.dm @@ -3,6 +3,9 @@ Originally in glass.dm, moved here to accommodate additional materials. \*/ +#define MORTAR_STAMINA_MINIMUM 50 //What is the amount of stam damage that we prevent mortar use at +#define MORTAR_STAMINA_USE 40 //How much stam damage is given to people when the mortar is used + /obj/item/pestle name = "pestle" desc = "An ancient, simple tool used in conjunction with a mortar to grind or juice items." @@ -33,41 +36,83 @@ to accommodate additional materials. grinded = null to_chat(user, "You eject the item inside.") -/obj/item/reagent_containers/glass/mortar/attackby(obj/item/I, mob/living/carbon/human/user) +/obj/item/reagent_containers/glass/mortar/attackby(obj/item/attacking_item, mob/living/carbon/human/user) ..() - if(istype(I,/obj/item/pestle)) - if(grinded) - if(user.getStaminaLoss() > 50) - to_chat(user, "You are too tired to work!") - return - to_chat(user, "You start grinding...") - if((do_after(user, 25, target = src)) && grinded) - user.adjustStaminaLoss(40) - if(grinded.juice_results) //prioritize juicing - grinded.on_juice() - reagents.add_reagent_list(grinded.juice_results) - to_chat(user, "You juice [grinded] into a fine liquid.") - QDEL_NULL(grinded) - return - grinded.on_grind() - reagents.add_reagent_list(grinded.grind_results) - if(grinded.reagents) //food and pills - grinded.reagents.trans_to(src, grinded.reagents.total_volume, transfered_by = user) - to_chat(user, "You break [grinded] into powder.") - QDEL_NULL(grinded) - return + if(istype(attacking_item, /obj/item/pestle)) + if(!grinded) + balloon_alert(user, "nothing to grind") return - else - to_chat(user, "There is nothing to grind!") + + if(user.getStaminaLoss() > MORTAR_STAMINA_MINIMUM) + balloon_alert(user, "too tired") return - if(grinded) - to_chat(user, "There is something inside already!") + + var/list/choose_options = list( + "Grind" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_grind"), + "Juice" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_juice") + ) + var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) + + if(!grinded || !in_range(src, user) || !user.is_holding(attacking_item) || !picked_option) + return + + balloon_alert(user, "grinding...") + if(!do_after(user, grind_speed, target = src)) + balloon_alert(user, "stopped grinding") + return + + user.adjustStaminaLoss(MORTAR_STAMINA_USE) + switch(picked_option) + if("Juice") + if(grinded.juice_results) + juice_target_item(grinded, user) + else + grind_target_item(grinded, user) + grinded = null + + if("Grind") + if(grinded.grind_results) + grind_target_item(grinded, user) + else + juice_target_item(grinded, user) + grinded = null return - if(I.juice_results || I.grind_results) - I.forceMove(src) - grinded = I + + if(!attacking_item.juice_results && !attacking_item.grind_results) + balloon_alert(user, "can't grind this") + return ..() + + if(grinded) + balloon_alert(user, "already full") return - to_chat(user, "You can't grind this!") + + attacking_item.forceMove(src) + grinded = attacking_item + +///Juices the passed target item, and transfers any contained chems to the mortar as well +/obj/item/reagent_containers/glass/mortar/proc/juice_target_item(obj/item/to_be_juiced, mob/living/carbon/human/user) + to_be_juiced.on_juice() + reagents.add_reagent_list(to_be_juiced.juice_results) + + if(to_be_juiced.reagents) //If juiced item has reagents within, transfer them to the mortar + to_be_juiced.reagents.trans_to(src, to_be_juiced.reagents.total_volume, transfered_by = user) + + to_chat(user, span_notice("You juice [to_be_juiced] into a fine liquid.")) + QDEL_NULL(to_be_juiced) + +///Grinds the passed target item, and transfers any contained chems to the mortar as well +/obj/item/reagent_containers/glass/mortar/proc/grind_target_item(obj/item/to_be_ground, mob/living/carbon/human/user) + to_be_ground.on_grind() + reagents.add_reagent_list(to_be_ground.grind_results) + + if(to_be_ground.reagents) //If grinded item has reagents within, transfer them to the mortar + to_be_ground.reagents.trans_to(src, to_be_ground.reagents.total_volume, transfered_by = user) + + to_chat(user, span_notice("You break [to_be_ground] into powder.")) + QDEL_NULL(to_be_ground) + +#undef MORTAR_STAMINA_MINIMUM +#undef MORTAR_STAMINA_USE /obj/item/reagent_containers/glass/mortar/glass //mmm yes... this glass is made of glass icon_state = "mortar_glass" diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index 62bd538120e1..e4da9b63aa6d 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -14,19 +14,19 @@ var/wall_type = /obj/effect/forcefield/wizard /obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr) - new wall_type(get_turf(user),user) + new wall_type(get_turf(user), null, user) if(user.dir == SOUTH || user.dir == NORTH) - new wall_type(get_step(user, EAST),user) - new wall_type(get_step(user, WEST),user) + new wall_type(get_step(user, EAST), null, user) + new wall_type(get_step(user, WEST), null, user) else - new wall_type(get_step(user, NORTH),user) - new wall_type(get_step(user, SOUTH),user) + new wall_type(get_step(user, NORTH), null, user) + new wall_type(get_step(user, SOUTH), null, user) /obj/effect/forcefield/wizard var/mob/wizard -/obj/effect/forcefield/wizard/Initialize(mapload, mob/summoner) +/obj/effect/forcefield/wizard/Initialize(mapload, new_timeleft, mob/summoner) . = ..() wizard = summoner diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 4d8c0f925b41..1e03d316c2e3 100644 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/mob/inhands/misc/food_lefthand.dmi b/icons/mob/inhands/misc/food_lefthand.dmi index da4f2fa1826c..a26002a20b9a 100644 Binary files a/icons/mob/inhands/misc/food_lefthand.dmi and b/icons/mob/inhands/misc/food_lefthand.dmi differ diff --git a/icons/mob/inhands/misc/food_righthand.dmi b/icons/mob/inhands/misc/food_righthand.dmi index b6426e836780..1e90ac3cb75a 100644 Binary files a/icons/mob/inhands/misc/food_righthand.dmi and b/icons/mob/inhands/misc/food_righthand.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 5083b4acc226..dbc04307a37a 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index ff211d21d5c2..340bc0f9a5c6 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/shiptest.dme b/shiptest.dme index b39d8c19e544..3585b14b2e85 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2102,6 +2102,7 @@ #include "code\modules\food_and_drinks\pizzabox.dm" #include "code\modules\food_and_drinks\drinks\drinks.dm" #include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\breakawayflask.dm" #include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" #include "code\modules\food_and_drinks\drinks\drinks\modglass.dm" #include "code\modules\food_and_drinks\food\bait.dm" @@ -3073,6 +3074,7 @@ #include "code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" #include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\trickwine_reagents.dm" #include "code\modules\reagents\chemistry\recipes\cat2_medicines.dm" #include "code\modules\reagents\chemistry\recipes\drugs.dm" #include "code\modules\reagents\chemistry\recipes\medicine.dm"