diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 8210f80fbb..08a5d44078 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -677,7 +677,7 @@ /area/rogue/indoors/vampire_manor) "bG" = ( /obj/structure/fluff/wallclock/vampire, -/obj/machinery/light/rogue/hearth/big_fireplace, +/obj/machinery/light/rogue/wallfire/big_fireplace, /turf/open/floor/rogue/hexstone, /area/rogue/indoors/vampire_manor) "bH" = ( diff --git a/code/datums/pollutants/foods.dm b/code/datums/pollutants/foods.dm index c54f70bf13..0b669b0051 100644 --- a/code/datums/pollutants/foods.dm +++ b/code/datums/pollutants/foods.dm @@ -112,9 +112,9 @@ name = "cooked sausage" scent = "cooked sausage" -/datum/pollutant/food/sausage - name = "cooked sausage" - scent = "cooked sausage" +/datum/pollutant/food/wiener + name = "cooked wiener" + scent = "cooked wiener" /datum/pollutant/food/fried_cabbage name = "fried cabbage" diff --git a/code/game/objects/lighting/_base_roguelight.dm b/code/game/objects/lighting/_base_roguelight.dm new file mode 100644 index 0000000000..bdb1889341 --- /dev/null +++ b/code/game/objects/lighting/_base_roguelight.dm @@ -0,0 +1,185 @@ +/obj/machinery/light/rogue + icon = 'icons/roguetown/misc/lighting.dmi' + brightness = 8 + nightshift_allowed = FALSE + fueluse = 60 MINUTES + bulb_colour = "#f9ad80" + bulb_power = 1 + var/datum/looping_sound/soundloop = /datum/looping_sound/fireloop + pass_flags = LETPASSTHROW + flags_1 = NODECONSTRUCT_1 + var/cookonme = FALSE + var/crossfire = TRUE + var/can_damage = FALSE + +/obj/machinery/light/rogue/Initialize() + if(soundloop) + soundloop = new soundloop(src, FALSE) + soundloop.start() + GLOB.fires_list += src + if(fueluse) + fueluse = fueluse - (rand(fueluse*0.1,fueluse*0.3)) + update_icon() + seton(TRUE) + . = ..() + +/obj/machinery/light/rogue/weather_trigger(W) + if(W==/datum/weather/rain) + START_PROCESSING(SSweather,src) + +/obj/machinery/light/rogue/OnCrafted(dirin) + . = ..() + can_damage = TRUE + burn_out() + +/obj/machinery/light/rogue/examine(mob/user) + . = ..() + if(Adjacent(user)) + if(fueluse > 0) + var/minsleft = fueluse / 600 + minsleft = round(minsleft) + if(minsleft <= 1) + minsleft = "less than a minute" + else + minsleft = "[round(minsleft)] minutes" + . += span_info("The fire will last for [minsleft].") + else + if(initial(fueluse) > 0) + . += span_warning("The fire is burned out and hungry...") + + +/obj/machinery/light/rogue/extinguish() + if(on) + burn_out() + new /obj/effect/temp_visual/small_smoke(src.loc) + ..() + + + +/obj/machinery/light/rogue/burn_out() + if(soundloop) + soundloop.stop() + if(on) + playsound(src.loc, 'sound/items/firesnuff.ogg', 100) + ..() + update_icon() + +/obj/machinery/light/rogue/update_icon() + if(on) + icon_state = "[base_state]1" + else + icon_state = "[base_state]0" + +/obj/machinery/light/rogue/update() + . = ..() + if(on) + GLOB.fires_list |= src + else + GLOB.fires_list -= src + +/obj/machinery/light/rogue/Destroy() + QDEL_NULL(soundloop) + GLOB.fires_list -= src + . = ..() + +/obj/machinery/light/rogue/fire_act(added, maxstacks) + if(!on && ((fueluse > 0) || (initial(fueluse) == 0))) + playsound(src.loc, 'sound/items/firelight.ogg', 100) + on = TRUE + update() + update_icon() + if(soundloop) + soundloop.start() + addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) + return TRUE + +/obj/proc/trigger_weather() + if(!QDELETED(src)) + if(isturf(loc)) + var/turf/T = loc + T.trigger_weather(src) + +/obj/machinery/light/rogue/Crossed(atom/movable/AM, oldLoc) + ..() + if(crossfire) + if(on) + AM.fire_act(1,5) + +/obj/machinery/light/rogue/spark_act() + fire_act() + +/obj/machinery/light/rogue/attackby(obj/item/W, mob/living/user, params) + if(cookonme) + if(istype(W, /obj/item/reagent_containers/food/snacks)) + if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) + to_chat(user, span_warning("I wouldn't be able to cook this over the fire...")) + return FALSE + var/obj/item/A = user.get_inactive_held_item() + if(A) + var/foundstab = FALSE + for(var/X in A.possible_item_intents) + var/datum/intent/D = new X + if(D.blade_class == BCLASS_STAB) + foundstab = TRUE + break + if(foundstab) + var/prob2spoil = 33 + if(user.mind.get_skill_level(/datum/skill/craft/cooking)) + prob2spoil = 1 + user.visible_message(span_notice("[user] starts to cook [W] over [src].")) + for(var/i in 1 to 6) + if(do_after(user, 30, target = src)) + var/obj/item/reagent_containers/food/snacks/S = W + var/obj/item/C + if(prob(prob2spoil)) + user.visible_message(span_warning("[user] burns [S].")) + if(user.client?.prefs.showrolls) + to_chat(user, span_warning("Critfail... [prob2spoil]%.")) + C = S.cooking(1000, null) + else + C = S.cooking(S.cooktime/4, src) + if(C) + user.dropItemToGround(S, TRUE) + qdel(S) + C.forceMove(get_turf(user)) + user.put_in_hands(C) + break + else + break + return + if(W.firefuel) + if(initial(fueluse)) + if(fueluse > initial(fueluse) - 5 SECONDS) + to_chat(user, span_warning("[src] is fully fueled.")) + return + else + if(!on) + return + if (alert(usr, "Feed [W] to the fire?", "ROGUETOWN", "Yes", "No") != "Yes") + return + qdel(W) + user.visible_message(span_warning("[user] feeds [W] to [src].")) + if(initial(fueluse)) + fueluse = fueluse + W.firefuel + if(fueluse > initial(fueluse)) //keep it at the max + fueluse = initial(fueluse) + return + else + if(on) + if(istype(W, /obj/item/natural/dirtclod)) + if(!user.temporarilyRemoveItemFromInventory(W)) + return + on = FALSE + set_light(0) + update_icon() + qdel(W) + src.visible_message(span_warning("[user] snuffs the fire.")) + return + if(user.used_intent?.type != INTENT_SPLASH) + W.spark_act() + . = ..() + +/obj/machinery/light/rogue/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) + if(!can_damage) + return + . = ..() diff --git a/code/game/objects/lighting/_base_roguestreet.dm b/code/game/objects/lighting/_base_roguestreet.dm new file mode 100644 index 0000000000..d7b750149d --- /dev/null +++ b/code/game/objects/lighting/_base_roguestreet.dm @@ -0,0 +1,54 @@ +/obj/machinery/light/roguestreet + icon = 'icons/roguetown/misc/tallstructure.dmi' + icon_state = "slamp1" + base_state = "slamp" + brightness = 10 + //nightshift_allowed = FALSE + fueluse = 0 + bulb_colour = "#f9e080" + bulb_power = 1 + max_integrity = 0 + pass_flags = LETPASSTHROW + +/obj/machinery/light/roguestreet/midlamp + icon = 'icons/roguetown/misc/64x64.dmi' + icon_state = "midlamp1" + base_state = "midlamp" + pixel_x = -16 + density = TRUE + +/obj/machinery/light/roguestreet/proc/lights_out() + on = FALSE + set_light(0) + update_icon() + addtimer(CALLBACK(src, PROC_REF(lights_on)), 5 MINUTES) + +/obj/machinery/light/roguestreet/proc/lights_on() + on = TRUE + update() + update_icon() + +/obj/machinery/light/roguestreet/update_icon() + if(on) + icon_state = "[base_state]1" + else + icon_state = "[base_state]0" + +/obj/machinery/light/roguestreet/update() + . = ..() + if(on) + GLOB.fires_list |= src + else + GLOB.fires_list -= src + +/obj/machinery/light/roguestreet/Initialize() + lights_on() + GLOB.streetlamp_list += src + update_icon() + . = ..() + +/obj/machinery/light/roguestreet/update_icon() + if(on) + icon_state = "[base_state]1" + else + icon_state = "[base_state]0" diff --git a/code/game/objects/lighting/rogue_fires.dm b/code/game/objects/lighting/rogue_fires.dm new file mode 100644 index 0000000000..dd173f0346 --- /dev/null +++ b/code/game/objects/lighting/rogue_fires.dm @@ -0,0 +1,586 @@ +/obj/machinery/light/rogue/firebowl + name = "brazier" + icon = 'icons/roguetown/misc/lighting.dmi' + icon_state = "stonefire1" + density = TRUE +// pixel_y = 10 + base_state = "stonefire" + climbable = TRUE + pass_flags = LETPASSTHROW + cookonme = TRUE + dir = SOUTH + crossfire = TRUE + fueluse = 0 + +/obj/machinery/light/rogue/firebowl/CanPass(atom/movable/mover, turf/target) + if(istype(mover) && (mover.pass_flags & PASSTABLE)) + return 1 + if(mover.throwing) + return 1 + if(locate(/obj/structure/table) in get_turf(mover)) + return 1 + return !density + +/obj/machinery/light/rogue/firebowl/attack_hand(mob/user) + . = ..() + if(.) + return + + if(on) + var/mob/living/carbon/human/H = user + + if(istype(H)) + H.visible_message(span_info("[H] warms \his hand over the fire.")) + + if(do_after(H, 15, target = src)) + var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") + to_chat(H, span_warning("HOT!")) + if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays() + return TRUE //fires that are on always have this interaction with lmb unless its a torch + + else + if(icon_state == "[base_state]over") + user.visible_message("[user] starts to pick up [src]...", \ + "I start to pick up [src]...") + if(do_after(user, 30, target = src)) + icon_state = "[base_state]0" + return + +/obj/machinery/light/rogue/firebowl/stump + icon_state = "stumpfire1" + base_state = "stumpfire" + +/obj/machinery/light/rogue/firebowl/church + icon_state = "churchfire1" + base_state = "churchfire" + + +/obj/machinery/light/rogue/firebowl/standing + name = "standing fire" + icon_state = "standing1" + base_state = "standing" + bulb_colour = "#ff9648" + cookonme = FALSE + crossfire = FALSE + + +/obj/machinery/light/rogue/firebowl/standing/blue + bulb_colour = "#b9bcff" + icon_state = "standingb1" + base_state = "standingb" + +/obj/machinery/light/rogue/firebowl/standing/proc/knock_over() //use this later for jump impacts and shit + icon_state = "[base_state]over" + +/obj/machinery/light/rogue/firebowl/standing/fire_act(added, maxstacks) + if(icon_state != "[base_state]over") + ..() + +/obj/machinery/light/rogue/firebowl/standing/onkick(mob/user) + if(isliving(user)) + var/mob/living/L = user + if(icon_state == "[base_state]over") + playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100) + user.visible_message("[user] kicks [src]!", \ + "I kick [src]!") + return + if(prob(L.STASTR * 8)) + playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100) + user.visible_message("[user] kicks over [src]!", \ + "I kick over [src]!") + burn_out() + knock_over() + else + playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100) + user.visible_message("[user] kicks [src]!", \ + "I kick [src]!") + +/obj/machinery/light/rogue/wallfire + name = "fireplace" + icon_state = "wallfire1" + base_state = "wallfire" + density = FALSE + fueluse = 0 + crossfire = FALSE + cookonme = TRUE + +/obj/machinery/light/rogue/wallfire/big_fireplace + icon_state = "fireplace1" + base_state = "fireplace" + icon = 'icons/roguetown/misc/fireplace64.dmi' + +/obj/machinery/light/rogue/wallfire/candle + name = "candles" + icon_state = "wallcandle1" + base_state = "wallcandle" + crossfire = FALSE + cookonme = FALSE + pixel_y = 32 + soundloop = null + +/obj/machinery/light/rogue/wallfire/candle/OnCrafted(dirin) + pixel_x = 0 + pixel_y = 0 + switch(dirin) + if(NORTH) + pixel_y = 32 + if(SOUTH) + pixel_y = -32 + if(EAST) + pixel_x = 32 + if(WEST) + pixel_x = -32 + . = ..() + +/obj/machinery/light/rogue/wallfire/candle/attack_hand(mob/user) + if(isliving(user) && on) + user.visible_message(span_warning("[user] snuffs [src].")) + burn_out() + return TRUE //fires that are on always have this interaction with lmb unless its a torch + . = ..() + +/obj/machinery/light/rogue/wallfire/candle/r + pixel_y = 0 + pixel_x = 32 +/obj/machinery/light/rogue/wallfire/candle/l + pixel_y = 0 + pixel_x = -32 + +/obj/machinery/light/rogue/wallfire/candle/blue + bulb_colour = "#b9bcff" + icon_state = "wallcandleb1" + base_state = "wallcandleb" + +/obj/machinery/light/rogue/wallfire/candle/blue/r + pixel_y = 0 + pixel_x = 32 +/obj/machinery/light/rogue/wallfire/candle/blue/l + pixel_y = 0 + pixel_x = -32 + +/obj/machinery/light/rogue/wallfire/candle/weak + light_power = 0.9 + light_outer_range = 6 +/obj/machinery/light/rogue/wallfire/candle/weak/l + pixel_x = -32 + pixel_y = 0 +/obj/machinery/light/rogue/wallfire/candle/weak/r + pixel_x = 32 + pixel_y = 0 + +/obj/machinery/light/rogue/wallfire/candle/lamp + name = "candle lamp" + icon_state = "candle" + base_state = "candle" + icon = 'icons/roguetown/misc/decoration.dmi' + layer = WALL_OBJ_LAYER+0.1 + light_power = 0.9 + light_outer_range = 6 + +/obj/machinery/light/rogue/torchholder + name = "sconce" + icon_state = "torchwall1" + base_state = "torchwall" + brightness = 5 + density = FALSE + var/obj/item/flashlight/flare/torch/torchy + fueluse = FALSE //we use the torch's fuel + soundloop = null + crossfire = FALSE + plane = GAME_PLANE_UPPER + cookonme = FALSE + +/obj/machinery/light/rogue/torchholder/c + pixel_y = 32 + +/obj/machinery/light/rogue/torchholder/r + dir = WEST + +/obj/machinery/light/rogue/torchholder/l + dir = EAST + +/obj/machinery/light/rogue/torchholder/fire_act(added, maxstacks) + if(torchy) + if(!on) + if(torchy.fuel > 0) + torchy.spark_act() + playsound(src.loc, 'sound/items/firelight.ogg', 100) + on = TRUE + update() + update_icon() + if(soundloop) + soundloop.start() + addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) + return TRUE + +/obj/machinery/light/rogue/torchholder/Initialize() + torchy = new /obj/item/flashlight/flare/torch(src) + torchy.spark_act() + . = ..() + +/obj/machinery/light/rogue/torchholder/OnCrafted(dirin, user) + dir = turn(dirin, 180) + if(dir == SOUTH) + pixel_y = 32 + QDEL_NULL(torchy) + . = ..() + +/obj/machinery/light/rogue/torchholder/process() + if(on) + if(torchy) + if(torchy.fuel <= 0) + burn_out() + if(!torchy.on) + burn_out() + else + return PROCESS_KILL + +/obj/machinery/light/rogue/torchholder/attack_hand(mob/user) + . = ..() + if(.) + return + if(torchy) + if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(torchy)) + torchy.forceMove(loc) + torchy = null + on = FALSE + set_light(0) + update_icon() + playsound(src.loc, 'sound/foley/torchfixturetake.ogg', 70) + +/obj/machinery/light/rogue/torchholder/update_icon() + if(torchy) + if(on) + icon_state = "[base_state]1" + else + icon_state = "[base_state]0" + else + icon_state = "torchwall" + +/obj/machinery/light/rogue/torchholder/burn_out() + if(torchy && torchy.on) + torchy.turn_off() + ..() + +/obj/machinery/light/rogue/torchholder/attackby(obj/item/W, mob/living/user, params) + if(istype(W, /obj/item/flashlight/flare/torch)) + var/obj/item/flashlight/flare/torch/LR = W + if(torchy) + if(LR.on && !on) + if(torchy.fuel <= 0) + to_chat(user, span_warning("The mounted torch is burned out.")) + return + else + torchy.spark_act() + user.visible_message(span_info("[user] lights [src].")) + playsound(src.loc, 'sound/items/firelight.ogg', 100) + on = TRUE + update() + update_icon() + addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) + return + if(!LR.on && on) + if(LR.fuel > 0) + LR.spark_act() + user.visible_message(span_info("[user] lights [LR] in [src].")) + user.update_inv_hands() + else + if(LR.on) + if(!user.transferItemToLoc(LR, src)) + return + torchy = LR + on = TRUE + update() + update_icon() + addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) + else + if(!user.transferItemToLoc(LR, src)) + return + torchy = LR + update_icon() + playsound(src.loc, 'sound/foley/torchfixtureput.ogg', 70) + return + . = ..() + +/obj/machinery/light/rogue/chand + name = "chandelier" + icon_state = "chand1" + base_state = "chand" + icon = 'icons/roguetown/misc/tallwide.dmi' + density = FALSE + brightness = 10 + pixel_x = -10 + pixel_y = -10 + layer = 2.0 + fueluse = 0 + soundloop = null + crossfire = FALSE + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP + +/obj/machinery/light/rogue/chand/attack_hand(mob/user) + if(isliving(user) && on) + user.visible_message(span_warning("[user] snuffs [src].")) + burn_out() + return TRUE //fires that are on always have this interaction with lmb unless its a torch + . = ..() + + +/obj/machinery/light/rogue/hearth + name = "hearth" + icon_state = "hearth1" + base_state = "hearth" + density = TRUE + anchored = TRUE + climbable = TRUE + climb_time = 3 SECONDS + layer = TABLE_LAYER + climb_offset = 14 + on = FALSE + cookonme = TRUE + var/obj/item/attachment = null + var/obj/item/reagent_containers/food/snacks/food = null + var/datum/looping_sound/boilloop/boilloop + var/rawegg = FALSE + +/obj/machinery/light/rogue/hearth/Initialize() + boilloop = new(src, FALSE) + . = ..() + +/obj/machinery/light/rogue/hearth/attackby(obj/item/W, mob/living/user, params) + if(!attachment) + if(istype(W, /obj/item/cooking/pan) || istype(W, /obj/item/reagent_containers/glass/bucket/pot)) + playsound(get_turf(user), 'sound/foley/dropsound/shovel_drop.ogg', 40, TRUE, -1) + attachment = W + W.forceMove(src) + update_icon() + return + else + if(istype(W, /obj/item/reagent_containers/glass/bowl)) + to_chat(user, span_notice("Remove the pot from the hearth first.")) + return + if(istype(attachment, /obj/item/cooking/pan)) + if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/S = W + if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) // added + playsound(get_turf(user), 'modular/Neu_Food/sound/eggbreak.ogg', 100, TRUE, 0) + sleep(25) // to get egg crack before frying hiss + W.icon_state = "rawegg" // added + rawegg = TRUE + if(!food) + S.forceMove(src) + food = S + update_icon() + if(on) + playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 5) + return +// New concept = boil at least 33 water, add item, it turns into food reagent volume 33 of the appropriate type + else if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) + var/obj/item/reagent_containers/glass/bucket/pot/pot = attachment + if(!pot.reagents.has_reagent(/datum/reagent/water, 33)) + to_chat(user, span_notice("Not enough water.")) + return TRUE + if(pot.reagents.chem_temp < 374) + to_chat(user, span_warning("[pot] isn't boiling!")) + return + pot.attempt_pot_recipes(W, user) + . = ..() + +////////////////////////////////// + +/obj/machinery/light/rogue/hearth/fire_act(added, maxstacks) + . = ..() + if(food) + playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 2) + +/obj/machinery/light/rogue/hearth/update_icon() + cut_overlays() + icon_state = "[base_state][on]" + if(attachment) + if(istype(attachment, /obj/item/cooking/pan) || istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) + var/obj/item/I = attachment + I.pixel_x = 0 + I.pixel_y = 0 + add_overlay(new /mutable_appearance(I)) + if(food) + I = food + I.pixel_x = 0 + I.pixel_y = 0 + add_overlay(new /mutable_appearance(I)) + +/obj/machinery/light/rogue/hearth/attack_hand(mob/user) + . = ..() + if(.) + return + + if(attachment) + if(istype(attachment, /obj/item/cooking/pan)) + if(food) + if(rawegg) + to_chat(user, span_notice("Throws away the raw egg.")) + rawegg = FALSE + qdel(food) + update_icon() + if(!user.put_in_active_hand(food)) + food.forceMove(user.loc) + food = null + update_icon() + else + if(!user.put_in_active_hand(attachment)) + attachment.forceMove(user.loc) + attachment = null + update_icon() + if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) + if(!user.put_in_active_hand(attachment)) + attachment.forceMove(user.loc) + attachment = null + update_icon() + boilloop.stop() + else + if(on) + var/mob/living/carbon/human/H = user + if(istype(H)) + H.visible_message(span_info("[H] warms \his hand over the embers.")) + if(do_after(H, 50, target = src)) + var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") + to_chat(H, span_warning("HOT!")) + if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays() + return TRUE + + +/obj/machinery/light/rogue/hearth/process() + if(isopenturf(loc)) + var/turf/open/O = loc + if(IS_WET_OPEN_TURF(O)) + extinguish() + if(on) + if(initial(fueluse) > 0) + if(fueluse > 0) + fueluse = max(fueluse - 10, 0) + if(fueluse == 0) + burn_out() + if(attachment) + if(istype(attachment, /obj/item/cooking/pan)) + if(food) + var/obj/item/C = food.cooking(20, src) + if(C) + if(rawegg) + rawegg = FALSE + qdel(food) + food = C + if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) + if(attachment.reagents) + attachment.reagents.expose_temperature(400, 0.033) + if(attachment.reagents.chem_temp > 374) + boilloop.start() + else + boilloop.stop() + update_icon() + + +/obj/machinery/light/rogue/hearth/onkick(mob/user) + if(isliving(user) && on) + user.visible_message(span_warning("[user] snuffs [src].")) + burn_out() + +/obj/machinery/light/rogue/hearth/Destroy() + QDEL_NULL(boilloop) + . = ..() + +/obj/machinery/light/rogue/campfire + name = "campfire" + icon_state = "badfire1" + base_state = "badfire" + density = FALSE + layer = 2.8 + brightness = 5 + on = FALSE + fueluse = 15 MINUTES + bulb_colour = "#da5e21" + cookonme = TRUE + max_integrity = 30 + +/obj/machinery/light/rogue/campfire/process() + ..() + if(isopenturf(loc)) + var/turf/open/O = loc + if(IS_WET_OPEN_TURF(O)) + extinguish() + +/obj/machinery/light/rogue/campfire/onkick(mob/user) + if(isliving(user) && on) + var/mob/living/L = user + L.visible_message(span_info("[L] snuffs [src].")) + burn_out() + +/obj/machinery/light/rogue/campfire/attack_hand(mob/user) + . = ..() + if(.) + return + + if(on) + var/mob/living/carbon/human/H = user + + if(istype(H)) + H.visible_message(span_info("[H] warms \his hand near the fire.")) + + if(do_after(H, 100, target = src)) + var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") + to_chat(H, span_warning("HOT!")) + if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays() + return TRUE //fires that are on always have this interaction with lmb unless its a torch + +/obj/machinery/light/rogue/campfire/densefire + icon_state = "densefire1" + base_state = "densefire" + density = TRUE + layer = 2.8 + brightness = 5 + climbable = TRUE + on = FALSE + fueluse = 30 MINUTES + pass_flags = LETPASSTHROW + bulb_colour = "#eea96a" + max_integrity = 60 + +/obj/machinery/light/rogue/campfire/densefire/CanPass(atom/movable/mover, turf/target) + if(istype(mover) && (mover.pass_flags & PASSTABLE)) + return 1 + if(mover.throwing) + return 1 + if(locate(/obj/structure/table) in get_turf(mover)) + return 1 + if(locate(/obj/machinery/light/rogue/firebowl) in get_turf(mover)) + return 1 + return !density + + +/obj/machinery/light/rogue/campfire/pyre + name = "pyre" + icon = 'icons/roguetown/misc/tallstructure.dmi' + icon_state = "pyre1" + base_state = "pyre" + brightness = 10 + fueluse = 30 MINUTES + layer = BELOW_MOB_LAYER + buckleverb = "crucifie" + can_buckle = 1 + buckle_lying = 0 + dir = NORTH + buckle_requires_restraints = 1 + buckle_prevents_pull = 1 + + +/obj/machinery/light/rogue/campfire/pyre/post_buckle_mob(mob/living/M) + ..() + M.set_mob_offsets("bed_buckle", _x = 0, _y = 10) + M.setDir(SOUTH) + +/obj/machinery/light/rogue/campfire/pyre/post_unbuckle_mob(mob/living/M) + ..() + M.reset_offsets("bed_buckle") + +/obj/machinery/light/rogue/campfire/longlived + fueluse = 180 MINUTES diff --git a/code/game/objects/lighting/roguelighting.dm b/code/game/objects/lighting/roguelighting.dm deleted file mode 100644 index b779563bff..0000000000 --- a/code/game/objects/lighting/roguelighting.dm +++ /dev/null @@ -1,1016 +0,0 @@ -/obj/machinery/light/roguestreet - icon = 'icons/roguetown/misc/tallstructure.dmi' - icon_state = "slamp1" - base_state = "slamp" - brightness = 10 - nightshift_allowed = FALSE - fueluse = 0 - bulb_colour = "#f9e080" - bulb_power = 0.85 - max_integrity = 0 - use_power = NO_POWER_USE - var/datum/looping_sound/soundloop - pass_flags = LETPASSTHROW - -/obj/machinery/light/roguestreet/midlamp - icon = 'icons/roguetown/misc/64x64.dmi' - icon_state = "midlamp1" - base_state = "midlamp" - pixel_x = -16 - density = TRUE - -/obj/machinery/light/roguestreet/proc/lights_out() - if(soundloop) - soundloop.stop() - on = FALSE - set_light(0) - update_icon() - addtimer(CALLBACK(src, PROC_REF(lights_on)), 5 MINUTES) - -/obj/machinery/light/roguestreet/proc/lights_on() - on = TRUE - update() - update_icon() - if(soundloop) - soundloop.start() - -/obj/machinery/light/roguestreet/update_icon() - if(on) - icon_state = "[base_state]1" - else - icon_state = "[base_state]0" - -/obj/machinery/light/roguestreet/update() - . = ..() - if(on) - GLOB.fires_list |= src - else - GLOB.fires_list -= src - -/obj/machinery/light/roguestreet/Initialize() - soundloop = pick(/datum/looping_sound/streetlamp1,/datum/looping_sound/streetlamp2,/datum/looping_sound/streetlamp3) - if(soundloop) - soundloop = new soundloop(src, FALSE) - soundloop.start() - GLOB.streetlamp_list += src - update_icon() - . = ..() - -/obj/machinery/light/roguestreet/update_icon() - if(on) - icon_state = "[base_state]1" - else - icon_state = "[base_state]0" - -//fires -/obj/machinery/light/rogue - icon = 'icons/roguetown/misc/lighting.dmi' - brightness = 8 - nightshift_allowed = FALSE - fueluse = 60 MINUTES - bulb_colour = "#f9ad80" - bulb_power = 1 - use_power = NO_POWER_USE - var/datum/looping_sound/soundloop = /datum/looping_sound/fireloop - pass_flags = LETPASSTHROW - var/cookonme = FALSE - var/crossfire = TRUE - -/obj/machinery/light/rogue/Initialize() - if(soundloop) - soundloop = new soundloop(src, FALSE) - soundloop.start() - GLOB.fires_list += src - if(fueluse) - fueluse = fueluse - (rand(fueluse*0.1,fueluse*0.3)) - update_icon() - seton(TRUE) - . = ..() - -/obj/machinery/light/rogue/weather_trigger(W) - if(W==/datum/weather/rain) - START_PROCESSING(SSweather,src) - -/obj/machinery/light/rogue/attack_hand(mob/living/carbon/human/user) - . = ..() - if(.) - return - user.changeNext_move(CLICK_CD_MELEE) - add_fingerprint(user) - - -/obj/machinery/light/rogue/examine(mob/user) - . = ..() - if(Adjacent(user)) - if(fueluse > 0) - var/minsleft = fueluse / 600 - minsleft = round(minsleft) - if(minsleft <= 1) - minsleft = "less than a minute" - else - minsleft = "[round(minsleft)] minutes" - . += "The fire will last for [minsleft]." - else - if(initial(fueluse) > 0) - . += "The fire is burned out and hungry..." - - -/obj/machinery/light/rogue/extinguish() - if(on) - burn_out() - new /obj/effect/temp_visual/small_smoke(src.loc) - ..() - - - -/obj/machinery/light/rogue/burn_out() - if(soundloop) - soundloop.stop() - if(on) - playsound(src.loc, 'sound/items/firesnuff.ogg', 100) - ..() - update_icon() - -/obj/machinery/light/rogue/update_icon() - if(on) - icon_state = "[base_state]1" - else - icon_state = "[base_state]0" - -/obj/machinery/light/rogue/update() - . = ..() - if(on) - GLOB.fires_list |= src - else - GLOB.fires_list -= src - -/obj/machinery/light/rogue/Destroy() - QDEL_NULL(soundloop) - GLOB.fires_list -= src - . = ..() - -/obj/machinery/light/rogue/fire_act(added, maxstacks) - if(!on && ((fueluse > 0) || (initial(fueluse) == 0))) - playsound(src.loc, 'sound/items/firelight.ogg', 100) - on = TRUE - update() - update_icon() - if(soundloop) - soundloop.start() - addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) - return TRUE - -/obj/proc/trigger_weather() - if(!QDELETED(src)) - if(isturf(loc)) - var/turf/T = loc - T.trigger_weather(src) - -/obj/machinery/light/rogue/Crossed(atom/movable/AM, oldLoc) - ..() - if(crossfire) - if(on) - AM.fire_act(1,5) - -/obj/machinery/light/rogue/spark_act() - fire_act() - -/obj/machinery/light/rogue/attackby(obj/item/W, mob/living/user, params) - if(cookonme) - if(istype(W, /obj/item/reagent_containers/food/snacks)) - if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) - to_chat(user, "I wouldn't be able to cook this over the fire...") - return FALSE - var/obj/item/A = user.get_inactive_held_item() - if(A) - var/foundstab = FALSE - for(var/X in A.possible_item_intents) - var/datum/intent/D = new X - if(D.blade_class == BCLASS_STAB) - foundstab = TRUE - break - if(foundstab) - var/prob2spoil = 33 - if(user.mind.get_skill_level(/datum/skill/craft/cooking)) - prob2spoil = 1 - user.visible_message("[user] starts to cook [W] over [src].") - for(var/i in 1 to 6) - if(do_after(user, 30, target = src)) - var/obj/item/reagent_containers/food/snacks/S = W - var/obj/item/C - if(prob(prob2spoil)) - user.visible_message("[user] burns [S].") - if(user.client?.prefs.showrolls) - to_chat(user, "Critfail... [prob2spoil]%.") - C = S.cooking(1000, null) - else - C = S.cooking(S.cooktime/4, src) - if(C) - user.dropItemToGround(S, TRUE) - qdel(S) - C.forceMove(get_turf(user)) - user.put_in_hands(C) - break - else - break - return - if(W.firefuel) - if(initial(fueluse)) - if(fueluse > initial(fueluse) - 5 SECONDS) - to_chat(user, "Full.") - return - else - if(!on) - return - if (alert(usr, "Feed [W] to the fire?", "ROGUETOWN", "Yes", "No") != "Yes") - return - qdel(W) - user.visible_message("[user] feeds [W] to [src].") - if(initial(fueluse)) - fueluse = fueluse + W.firefuel - if(fueluse > initial(fueluse)) //keep it at the max - fueluse = initial(fueluse) - return - else - if(on) - if(istype(W, /obj/item/natural/dirtclod)) - if(!user.temporarilyRemoveItemFromInventory(W)) - return - on = FALSE - set_light(0) - update_icon() - qdel(W) - src.visible_message("[user] snuffs the fire.") - return - if(user.used_intent?.type != INTENT_SPLASH) - W.spark_act() - ..() - -/obj/machinery/light/rogue/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) - return - -/obj/machinery/light/rogue/firebowl - name = "brazier" - icon = 'icons/roguetown/misc/lighting.dmi' - icon_state = "stonefire1" - density = TRUE -// pixel_y = 10 - base_state = "stonefire" - climbable = TRUE - pass_flags = LETPASSTHROW - cookonme = TRUE - dir = SOUTH - crossfire = TRUE - fueluse = 0 - light_outer_range = 9 - -/obj/machinery/light/rogue/firebowl/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return 1 - if(mover.throwing) - return 1 - if(locate(/obj/structure/table) in get_turf(mover)) - return 1 - return !density - -/obj/machinery/light/rogue/firebowl/attack_hand(mob/user) - . = ..() - if(.) - return - - if(on) - var/mob/living/carbon/human/H = user - - if(istype(H)) - H.visible_message("[H] warms \his hand over the fire.") - - if(do_after(H, 15, target = src)) - var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - to_chat(H, "HOT!") - if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage - H.update_damage_overlays() - return TRUE //fires that are on always have this interaction with lmb unless its a torch - - else - if(icon_state == "[base_state]over") - user.visible_message("[user] starts to pick up [src]...", \ - "I start to pick up [src]...") - if(do_after(user, 30, target = src)) - icon_state = "[base_state]0" - return - -/obj/machinery/light/rogue/firebowl/stump - icon_state = "stumpfire1" - base_state = "stumpfire" - -/obj/machinery/light/rogue/firebowl/church - icon_state = "churchfire1" - base_state = "churchfire" - - -/obj/machinery/light/rogue/firebowl/standing - name = "standing fire" - icon_state = "standing1" - base_state = "standing" - bulb_colour = "#ff9648" - cookonme = FALSE - crossfire = FALSE - - -/obj/machinery/light/rogue/firebowl/standing/blue - bulb_colour = "#b9bcff" - icon_state = "standingb1" - base_state = "standingb" - -/obj/machinery/light/rogue/firebowl/standing/proc/knock_over() //use this later for jump impacts and shit - icon_state = "[base_state]over" - -/obj/machinery/light/rogue/firebowl/standing/fire_act(added, maxstacks) - if(icon_state != "[base_state]over") - ..() - -/obj/machinery/light/rogue/firebowl/standing/onkick(mob/user) - if(isliving(user)) - var/mob/living/L = user - if(icon_state == "[base_state]over") - playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100) - user.visible_message("[user] kicks [src]!", \ - "I kick [src]!") - return - if(prob(L.STASTR * 8)) - playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100) - user.visible_message("[user] kicks over [src]!", \ - "I kick over [src]!") - burn_out() - knock_over() - else - playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100) - user.visible_message("[user] kicks [src]!", \ - "I kick [src]!") - -/obj/machinery/light/rogue/wallfire - name = "fireplace" - icon_state = "wallfire1" - base_state = "wallfire" - density = FALSE - fueluse = 0 - crossfire = FALSE - cookonme = TRUE - -/obj/machinery/light/rogue/wallfire/candle - name = "candles" - icon_state = "wallcandle1" - base_state = "wallcandle" - crossfire = FALSE - cookonme = FALSE - pixel_y = 32 - soundloop = null - -/obj/machinery/light/rogue/wallfire/candle/attack_hand(mob/user) - if(isliving(user) && on) - user.visible_message("[user] snuffs [src].") - burn_out() - return TRUE //fires that are on always have this interaction with lmb unless its a torch - . = ..() - -/obj/machinery/light/rogue/wallfire/candle/r - pixel_y = 0 - pixel_x = 32 -/obj/machinery/light/rogue/wallfire/candle/l - pixel_y = 0 - pixel_x = -32 - -/obj/machinery/light/rogue/wallfire/candle/blue - bulb_colour = "#b9bcff" - icon_state = "wallcandleb1" - base_state = "wallcandleb" - -/obj/machinery/light/rogue/wallfire/candle/blue/r - pixel_y = 0 - pixel_x = 32 -/obj/machinery/light/rogue/wallfire/candle/blue/l - pixel_y = 0 - pixel_x = -32 - -/obj/machinery/light/rogue/wallfire/candle/weak - light_power = 0.9 - light_outer_range = 6 -/obj/machinery/light/rogue/wallfire/candle/weak/l - pixel_x = -32 - pixel_y = 0 -/obj/machinery/light/rogue/wallfire/candle/weak/r - pixel_x = 32 - pixel_y = 0 - -/obj/machinery/light/rogue/torchholder - name = "sconce" - icon_state = "torchwall1" - base_state = "torchwall" - brightness = 5 - density = FALSE - var/obj/item/flashlight/flare/torch/torchy - fueluse = FALSE //we use the torch's fuel - soundloop = null - crossfire = FALSE - plane = GAME_PLANE_UPPER - cookonme = FALSE - var/lacks_torch - -/obj/machinery/light/rogue/torchholder/c - pixel_y = 32 - -/obj/machinery/light/rogue/torchholder/r - dir = WEST - -/obj/machinery/light/rogue/torchholder/l - dir = EAST - -/obj/machinery/light/rogue/torchholder/fire_act(added, maxstacks) - if(torchy) - if(!on) - if(torchy.fuel > 0) - torchy.spark_act() - playsound(src.loc, 'sound/items/firelight.ogg', 100) - on = TRUE - update() - update_icon() - if(soundloop) - soundloop.start() - addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) - return TRUE - -/obj/machinery/light/rogue/torchholder/Initialize() - if(!lacks_torch) - torchy = new /obj/item/flashlight/flare/torch(src) - torchy.spark_act() - . = ..() - -/obj/machinery/light/rogue/torchholder/process() - if(on) - if(torchy) - if(torchy.fuel <= 0) - burn_out() - if(!torchy.on) - burn_out() - else - return PROCESS_KILL - -/obj/machinery/light/rogue/torchholder/attack_hand(mob/user) - . = ..() - if(.) - return - if(torchy) - if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(torchy)) - torchy.forceMove(loc) - torchy = null - on = FALSE - set_light(0) - update_icon() - playsound(src.loc, 'sound/foley/torchfixturetake.ogg', 70) - -/obj/machinery/light/rogue/torchholder/update_icon() - if(torchy) - if(on) - icon_state = "[base_state]1" - else - icon_state = "[base_state]0" - else - icon_state = "torchwall" - -/obj/machinery/light/rogue/torchholder/burn_out() - if(torchy.on) - torchy.turn_off() - ..() - -/obj/machinery/light/rogue/torchholder/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/flashlight/flare/torch)) - var/obj/item/flashlight/flare/torch/LR = W - if(torchy) - if(LR.on && !on) - if(torchy.fuel <= 0) - to_chat(user, "The mounted torch is burned out.") - return - else - torchy.spark_act() - user.visible_message("[user] lights [src].") - playsound(src.loc, 'sound/items/firelight.ogg', 100) - on = TRUE - update() - update_icon() - addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) - return - if(!LR.on && on) - if(LR.fuel > 0) - LR.spark_act() - user.visible_message("[user] lights [LR] in [src].") - user.update_inv_hands() - else - if(LR.on) - LR.forceMove(src) - torchy = LR - on = TRUE - update() - update_icon() - addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20)) - else - LR.forceMove(src) - torchy = LR - update_icon() - playsound(src.loc, 'sound/foley/torchfixtureput.ogg', 70) - return - . = ..() - -/obj/machinery/light/rogue/torchholder/cold - lacks_torch = TRUE - pixel_y = 32 - -/obj/machinery/light/rogue/chand - name = "chandelier" - icon_state = "chand1" - base_state = "chand" - icon = 'icons/roguetown/misc/tallwide.dmi' - density = FALSE - brightness = 10 - pixel_x = -10 - pixel_y = -10 - layer = 2.0 - fueluse = 0 - soundloop = null - crossfire = FALSE - obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP - -/obj/machinery/light/rogue/chand/attack_hand(mob/user) - if(isliving(user) && on) - user.visible_message("[user] snuffs [src].") - burn_out() - return TRUE //fires that are on always have this interaction with lmb unless its a torch - . = ..() - - -/obj/machinery/light/rogue/hearth - name = "hearth" - icon_state = "hearth1" - base_state = "hearth" - density = TRUE - anchored = TRUE - climbable = TRUE - climb_time = 3 SECONDS - layer = TABLE_LAYER - climb_offset = 14 - on = FALSE - cookonme = TRUE - var/obj/item/attachment = null - var/obj/item/reagent_containers/food/snacks/food = null - var/datum/looping_sound/boilloop/boilloop - var/rawegg = FALSE - -/obj/machinery/light/rogue/hearth/Initialize() - boilloop = new(src, FALSE) - . = ..() - -/obj/machinery/light/rogue/hearth/attackby(obj/item/W, mob/living/user, params) - if(!attachment) - if(istype(W, /obj/item/cooking/pan) || istype(W, /obj/item/reagent_containers/glass/bucket/pot)) - playsound(get_turf(user), 'sound/foley/dropsound/shovel_drop.ogg', 40, TRUE, -1) - attachment = W - W.forceMove(src) - update_icon() - return - else - if(istype(W, /obj/item/reagent_containers/glass/bowl)) - to_chat(user, "Remove the pot from the hearth first.") - return - if(istype(attachment, /obj/item/cooking/pan)) - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks)) - var/obj/item/reagent_containers/food/snacks/S = W - if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) // added - playsound(get_turf(user), 'modular/Neu_Food/sound/eggbreak.ogg', 100, TRUE, 0) - sleep(25) // to get egg crack before frying hiss - W.icon_state = "rawegg" // added - rawegg = TRUE - if(!food) - S.forceMove(src) - food = S - update_icon() - if(on) - playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 5) - return -// New concept = boil at least 33 water, add item, it turns into food reagent volume 33 of the appropriate type - else if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) - var/obj/item/reagent_containers/glass/bucket/pot = attachment - if(!pot.reagents.has_reagent(/datum/reagent/water, 33)) - to_chat(user, "Not enough water.") - return TRUE - if(pot.reagents.chem_temp < 374) - to_chat(user, "[pot] isn't boiling!") - return - if(istype(W, /obj/item/reagent_containers/food/snacks/produce/oat)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - qdel(W) - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - sleep(300) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/oatmeal, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - return - - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rogue/veg)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/potato_sliced)) - qdel(W) - sleep(800) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/potato, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/onion_sliced)) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/onion, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/cabbage_sliced)) - qdel(W) - sleep(700) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/cabbage, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/turnip_sliced)) - qdel(W) - sleep(700) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/turnip, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - return - - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rogue/meat)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/mince/fish)) - qdel(W) - sleep(800) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/fish, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/poultry/cutlet) || istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/mince/poultry)) - qdel(W) - sleep(900) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/chicken, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/spider)) - qdel(W) - sleep(1000) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/gross, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - else - qdel(W) - sleep(900) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/meat, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places the [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(800) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/egg, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/truffles)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places the [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(800) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/truffle, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/cheese) || istype(W, /obj/item/reagent_containers/food/snacks/rogue/cheddarwedge)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places the [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(800) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/cheese, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - // drugs and such - if(istype(W, /obj/item/reagent_containers/powder/spice)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places the [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(500) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/druqks = 15) - pot.reagents.add_reagent(/datum/reagent/water/spicy = 17) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - // Bad and rotten and toxic stuff below. Less lethal due to boiling, but really disgusting. Graggars inhumen followers love this stuff, get some healing from it too. - if(istype(W, /obj/item/reagent_containers/food/snacks/produce/jacksberry/poison) || istype(W, /obj/item/natural/poo)|| istype(W, /obj/item/reagent_containers/food/snacks/rogue/toxicshrooms) || istype(W, /obj/item/natural/worms)) - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rotten)) // Graggar likes rotten food I guess - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(W.type in subtypesof(/obj/item/organ)) // ....and leeches and such....andd organs more MORE MORE if()!!! GIVE ME MOOORE - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(W.type in subtypesof(/obj/item/natural/worms)) // ....and leeches and such....andd organs more MORE MORE if()!!! GIVE ME MOOORE - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - if(istype(W, /obj/item/reagent_containers/food/snacks/smallrat/dead) || istype(W, /obj/item/reagent_containers/food/snacks/badrecipe)) // every beggar loves ratsoup - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] places the [W] into the pot.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/gross, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - - else if(istype(W, /obj/item/reagent_containers/food/snacks/smallrat)) // a step to far for most beggars, paying tribute to Graggar - if(do_after(user,2 SECONDS, target = src)) - user.visible_message("[user] throws [W] into the boiling water.") - playsound(src.loc, 'sound/items/Fish_out.ogg', 60, TRUE) - sleep(3) - playsound(src, 'sound/vo/mobs/rat/rat_death.ogg', 100, FALSE, -1) - pot.reagents.remove_reagent(/datum/reagent/water, 32) - qdel(W) - sleep(600) - playsound(src, "bubbles", 30, TRUE) - pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32) - pot.reagents.remove_reagent(/datum/reagent/water, 1) - . = ..() - -////////////////////////////////// - -/obj/machinery/light/rogue/hearth/fire_act(added, maxstacks) - . = ..() - if(food) - playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 2) - -/obj/machinery/light/rogue/hearth/update_icon() - cut_overlays() - icon_state = "[base_state][on]" - if(attachment) - if(istype(attachment, /obj/item/cooking/pan) || istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) - var/obj/item/I = attachment - I.pixel_x = 0 - I.pixel_y = 0 - add_overlay(new /mutable_appearance(I)) - if(food) - I = food - I.pixel_x = 0 - I.pixel_y = 0 - add_overlay(new /mutable_appearance(I)) - -/obj/machinery/light/rogue/hearth/attack_hand(mob/user) - . = ..() - if(.) - return - - if(attachment) - if(istype(attachment, /obj/item/cooking/pan)) - if(food) - if(rawegg) - to_chat(user, "Throws away the raw egg.") - rawegg = FALSE - qdel(food) - update_icon() - if(!user.put_in_active_hand(food)) - food.forceMove(user.loc) - food = null - update_icon() - else - if(!user.put_in_active_hand(attachment)) - attachment.forceMove(user.loc) - attachment = null - update_icon() - if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) - if(!user.put_in_active_hand(attachment)) - attachment.forceMove(user.loc) - attachment = null - update_icon() - boilloop.stop() - else - if(on) - var/mob/living/carbon/human/H = user - if(istype(H)) - H.visible_message("[H] warms \his hand over the embers.") - if(do_after(H, 50, target = src)) - var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - to_chat(H, "HOT!") - if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage - H.update_damage_overlays() - return TRUE - - -/obj/machinery/light/rogue/hearth/process() - if(isopenturf(loc)) - var/turf/open/O = loc - if(IS_WET_OPEN_TURF(O)) - extinguish() - if(on) - if(initial(fueluse) > 0) - if(fueluse > 0) - fueluse = max(fueluse - 10, 0) - if(fueluse == 0) - burn_out() - if(attachment) - if(istype(attachment, /obj/item/cooking/pan)) - if(food) - var/obj/item/C = food.cooking(20, src) - if(C) - if(rawegg) - rawegg = FALSE - qdel(food) - food = C - if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot)) - if(attachment.reagents) - attachment.reagents.expose_temperature(400, 0.033) - if(attachment.reagents.chem_temp > 374) - boilloop.start() - else - boilloop.stop() - update_icon() - - -/obj/machinery/light/rogue/hearth/onkick(mob/user) - if(isliving(user) && on) - user.visible_message("[user] snuffs [src].") - burn_out() - -/obj/machinery/light/rogue/hearth/Destroy() - QDEL_NULL(boilloop) - . = ..() - -/obj/machinery/light/rogue/campfire - name = "campfire" - icon_state = "badfire1" - base_state = "badfire" - density = FALSE - layer = 2.8 - brightness = 5 - on = FALSE - fueluse = 15 MINUTES - bulb_colour = "#da5e21" - cookonme = TRUE - light_outer_range = 7 - -/obj/machinery/light/rogue/campfire/process() - ..() - if(isopenturf(loc)) - var/turf/open/O = loc - if(IS_WET_OPEN_TURF(O)) - extinguish() - -/obj/machinery/light/rogue/campfire/onkick(mob/user) - if(isliving(user) && on) - var/mob/living/L = user - L.visible_message("[L] snuffs [src].") - burn_out() - -/obj/machinery/light/rogue/campfire/attack_hand(mob/user) - . = ..() - if(.) - return - - if(on) - var/mob/living/carbon/human/H = user - - if(istype(H)) - H.visible_message("[H] warms \his hand near the fire.") - - if(do_after(H, 100, target = src)) - var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - to_chat(H, "HOT!") - if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage - H.update_damage_overlays() - return TRUE //fires that are on always have this interaction with lmb unless its a torch - -/obj/machinery/light/rogue/campfire/densefire - icon_state = "densefire1" - base_state = "densefire" - density = TRUE - layer = 2.8 - brightness = 5 - climbable = TRUE - on = FALSE - fueluse = 30 MINUTES - pass_flags = LETPASSTHROW - bulb_colour = "#eea96a" - -/obj/machinery/light/rogue/campfire/densefire/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return 1 - if(mover.throwing) - return 1 - if(locate(/obj/structure/table) in get_turf(mover)) - return 1 - if(locate(/obj/machinery/light/rogue/firebowl) in get_turf(mover)) - return 1 - return !density - - -/obj/machinery/light/rogue/campfire/pyre - name = "Pyre" - icon = 'icons/roguetown/misc/tallstructure.dmi' - icon_state = "pyre1" - base_state = "pyre" - brightness = 10 - fueluse = 30 MINUTES - layer = BELOW_MOB_LAYER - buckleverb = "crucifie" - can_buckle = 1 - buckle_lying = 0 - dir = NORTH - buckle_requires_restraints = 1 - buckle_prevents_pull = 1 - - -/obj/machinery/light/rogue/campfire/pyre/post_buckle_mob(mob/living/M) - ..() - M.set_mob_offsets("bed_buckle", _x = 0, _y = 10) - M.setDir(SOUTH) - -/obj/machinery/light/rogue/campfire/pyre/post_unbuckle_mob(mob/living/M) - ..() - M.reset_offsets("bed_buckle") - -/obj/machinery/light/rogue/campfire/longlived - fueluse = 180 MINUTES - -// ====================================================================== -/obj/machinery/light/rogue/wallfire/candle/lamp // cant get them to start unlit but they work as is - name = "candle lamp" - icon = 'icons/roguetown/misc/decoration.dmi' - icon_state = "candle" - base_state = "candle" - layer = WALL_OBJ_LAYER+0.1 - light_power = 0.9 - light_outer_range = 6 - -/obj/machinery/light/rogue/wallfire/big_fireplace - icon_state = "fireplace1" - base_state = "fireplace" - icon = 'icons/roguetown/misc/fireplace64.dmi' - -/obj/machinery/light/rogue/hearth/big_fireplace - name = "fireplace" - icon_state = "fireplace1" - base_state = "fireplace" - icon = 'icons/roguetown/misc/fireplace64.dmi' - fueluse = -1 - pixel_x = -16 - climb_offset = 4 diff --git a/code/modules/roguetown/roguecrafting/weaving.dm b/code/modules/roguetown/roguecrafting/weaving.dm index d75c82b0dd..29092d3645 100644 --- a/code/modules/roguetown/roguecrafting/weaving.dm +++ b/code/modules/roguetown/roguecrafting/weaving.dm @@ -173,6 +173,20 @@ craftdiff = 4 sellprice = 25 +/datum/crafting_recipe/roguetown/weaving/nocrobe + name = "noc robes" + result = list(/obj/item/clothing/suit/roguetown/shirt/robe/noc) + reqs = list(/obj/item/natural/cloth = 4) + craftdiff = 4 + sellprice = 25 + +/datum/crafting_recipe/roguetown/weaving/nochood + name = "moon hood" + result = list(/obj/item/clothing/head/roguetown/roguehood/nochood) + reqs = list(/obj/item/natural/cloth = 2) + craftdiff = 4 + sellprice = 25 + /datum/crafting_recipe/roguetown/weaving/dendorrobe name = "dendor robes" result = list(/obj/item/clothing/suit/roguetown/shirt/robe/dendor) diff --git a/code/modules/roguetown/roguejobs/cook/tools/pot.dm b/code/modules/roguetown/roguejobs/cook/tools/pot.dm index db48544709..89a67b4750 100644 --- a/code/modules/roguetown/roguejobs/cook/tools/pot.dm +++ b/code/modules/roguetown/roguejobs/cook/tools/pot.dm @@ -10,18 +10,85 @@ slot_flags = null w_class = WEIGHT_CLASS_BULKY drop_sound = 'sound/foley/dropsound/shovel_drop.ogg' + var/processing_amount = 0 ///we use this to "reserve" reagents + var/list/in_progress_recipes = list() //these are unique creations only ever used + var/static/list/checker_recipes = list() + +/obj/item/reagent_containers/glass/bucket/pot/Destroy() + . = ..() + in_progress_recipes = null + +/obj/item/reagent_containers/glass/bucket/pot/proc/attempt_pot_recipes(obj/item/attacked_item, mob/living/user) + var/water_amount = reagents.get_reagent_amount(/datum/reagent/water) + water_amount -= processing_amount + + if(!length(checker_recipes)) + for(var/datum/pot_recipe/recipe as anything in typesof(/datum/pot_recipe)) + if(is_abstract(recipe)) + continue + checker_recipes |= new recipe + + for(var/datum/pot_recipe/recipe as anything in in_progress_recipes) + for(var/required_type as anything in recipe.required_items) + if(!istype(attacked_item, required_type)) + continue + qdel(attacked_item) + user.visible_message("[user] places [attacked_item] into the pot.") + playsound(get_turf(src), 'sound/items/Fish_out.ogg', 20, TRUE) + recipe.required_items[required_type]-- + if(recipe.required_items[required_type] <= 0) + recipe.required_items -= required_type + break + if(!length(recipe.required_items) && !recipe.cooking) + recipe.start_cooking(src, user) + return TRUE + + var/datum/pot_recipe/fallback + var/datum/pot_recipe/recipe_type + ///this is wonky but we always check for the first item, so we don't need to radial soups because that would suck + for(var/datum/pot_recipe/recipe as anything in checker_recipes) + var/obj/item/first_type = recipe.required_items[1] + if(water_amount < recipe.water_volume) + continue //lack of water + if(!istype(attacked_item, first_type)) + continue + + if(recipe.fallback) + fallback = recipe.type + continue + recipe_type = recipe.type + + if(!recipe_type) + recipe_type = fallback + + if(!recipe_type) + return FALSE + + var/datum/pot_recipe/created_recipe = new recipe_type + var/obj/item/first_type = created_recipe.required_items[1] + in_progress_recipes |= created_recipe + qdel(attacked_item) + user.visible_message("[user] places [attacked_item] into the pot.") + playsound(get_turf(src), 'sound/items/Fish_out.ogg', 20, TRUE) + created_recipe.required_items[first_type]-- + if(created_recipe.required_items[first_type] <= 0) + created_recipe.required_items -= first_type + if(!length(created_recipe.required_items) && !created_recipe.cooking) + created_recipe.start_cooking(src, user) + return TRUE + return TRUE /obj/item/reagent_containers/glass/bucket/pot/update_icon() cut_overlays() - if(reagents.total_volume > 0) - if(reagents.total_volume <= 50) + if(reagents.total_volume > 0) + if(reagents.total_volume <= 50) var/mutable_appearance/filling = mutable_appearance('modular/Neu_Food/icons/cooking.dmi', "pote_half") filling.color = mix_color_from_reagents(reagents.reagent_list) filling.alpha = mix_alpha_from_reagents(reagents.reagent_list) add_overlay(filling) - if(reagents.total_volume > 50) + if(reagents.total_volume > 50) var/mutable_appearance/filling = mutable_appearance('modular/Neu_Food/icons/cooking.dmi', "pote_full") filling.color = mix_color_from_reagents(reagents.reagent_list) filling.alpha = mix_alpha_from_reagents(reagents.reagent_list) @@ -37,7 +104,7 @@ return TRUE /obj/item/reagent_containers/glass/bucket/pot/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing) - if(reagents.total_volume > 5) + if(reagents.total_volume > 5) new /obj/effect/decal/cleanable/food/mess/soup(get_turf(src)) ..() @@ -48,3 +115,183 @@ if("gen") return list("shrink" = 0.5,"sx" = -5,"sy" = -8,"nx" = 7,"ny" = -9,"wx" = -1,"wy" = -8,"ex" = -1,"ey" = -8,"northabove" = 0,"southabove" = 1,"eastabove" = 1,"westabove" = 0,"nturn" = 0,"sturn" = 0,"wturn" = 0,"eturn" = 0,"nflip" = 0,"sflip" = 0,"wflip" = 0,"eflip" = 0) +///this is where pot recipes go + +/datum/pot_recipe + abstract_type = /datum/pot_recipe + var/datum/reagent/produced_reagent + var/water_volume = 33 + ///cannot be greated then 1 as we don't extra reserve. + var/water_conversion = 1 + + var/list/required_items = list() + + var/obj/item/reagent_containers/glass/bucket/pot/cooking_pot + var/cooking_time = 30 SECONDS + ///we spawn a burst of this as it finishes cooking + var/datum/pollutant/finished_smell + ///are we cooking? + var/cooking = FALSE + ///are we a fallback recipe (only picked if no recipe at all left) + var/fallback = FALSE + ///the amount we pollute + var/pollute_amount = 600 + +/datum/pot_recipe/proc/start_cooking(obj/item/reagent_containers/glass/bucket/pot, mob/living/user) + cooking_pot = pot + RegisterSignal(cooking_pot, COMSIG_PARENT_QDELETING, PROC_REF(end_recipe)) + + var/real_cooking_time = cooking_time + if(user.mind) + real_cooking_time /= 1 + (user.mind.get_skill_level(/datum/skill/craft/cooking) * 0.5) + real_cooking_time = round(real_cooking_time) + + cooking = TRUE + cooking_pot.processing_amount += water_volume + addtimer(CALLBACK(src, PROC_REF(finish_cooking)), cooking_time) + + +/datum/pot_recipe/proc/end_recipe() + cooking_pot.in_progress_recipes -= src + cooking_pot = null + cooking = FALSE + qdel(src) + +/datum/pot_recipe/proc/finish_cooking() + if(!cooking_pot) + return + + var/turf/pot_turf = get_turf(cooking_pot) + if(finished_smell) + pot_turf.pollute_turf(finished_smell, pollute_amount) + playsound(pot_turf, "bubbles", 30, TRUE) + + cooking_pot.processing_amount -= water_volume + cooking_pot.reagents.remove_reagent(/datum/reagent/water, water_volume) + cooking_pot.reagents.add_reagent(produced_reagent, CEILING(water_volume * water_conversion, 1)) + + post_recipe() //mainly useful for drugs where we take the remainder of the water and turn it spicy + end_recipe() + +/datum/pot_recipe/proc/post_recipe() + return + +/datum/pot_recipe/oatmeal + produced_reagent = /datum/reagent/consumable/soup/oatmeal + required_items = list(/obj/item/reagent_containers/food/snacks/produce/oat = 1) + finished_smell = /datum/pollutant/food/oatmeal + +/datum/pot_recipe/potato_stew + cooking_time = 80 SECONDS + produced_reagent = /datum/reagent/consumable/soup/veggie/potato + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/potato_sliced = 1) + finished_smell = /datum/pollutant/food/potato_stew + +/datum/pot_recipe/onion_stew + cooking_time = 60 SECONDS + produced_reagent = /datum/reagent/consumable/soup/veggie/onion + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/onion_sliced = 1) + finished_smell = /datum/pollutant/food/onion_stew + +/datum/pot_recipe/cabbage_stew + cooking_time = 70 SECONDS + produced_reagent = /datum/reagent/consumable/soup/veggie/cabbage + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/cabbage_sliced = 1) + finished_smell = /datum/pollutant/food/cabbage_stew + +/datum/pot_recipe/turnip_stew + cooking_time = 70 SECONDS + produced_reagent = /datum/reagent/consumable/soup/veggie/turnip + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/turnip_sliced = 1) + finished_smell = /datum/pollutant/food/turnip_stew + +/datum/pot_recipe/egg_soup + cooking_time = 80 SECONDS + produced_reagent = /datum/reagent/consumable/soup/egg + required_items = list(/obj/item/reagent_containers/food/snacks/egg = 1) + finished_smell = /datum/pollutant/food/egg_soup + +/datum/pot_recipe/cheese_soup + cooking_time = 80 SECONDS + produced_reagent = /datum/reagent/consumable/soup/cheese + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/cheese = 1) + finished_smell = /datum/pollutant/food/cheese_soup + +/datum/pot_recipe/cheese_soup/wedge + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/cheddarwedge = 1) + +/datum/pot_recipe/chicken_stew + cooking_time = 90 SECONDS + produced_reagent = /datum/reagent/consumable/soup/stew/chicken + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/mince/poultry = 1) + finished_smell = /datum/pollutant/food/chicken_stew + +/datum/pot_recipe/chicken_stew/cutlet + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/poultry/cutlet = 1) + +/datum/pot_recipe/generic_meat_stew + cooking_time = 90 SECONDS + produced_reagent = /datum/reagent/consumable/soup/stew/meat + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat = 1) + finished_smell = /datum/pollutant/food/meat_stew + fallback = TRUE + +/datum/pot_recipe/fish_stew + cooking_time = 80 SECONDS + produced_reagent = /datum/reagent/consumable/soup/stew/fish + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/mince/fish = 1) + finished_smell = /datum/pollutant/food/fish_stew + +/datum/pot_recipe/truffle_stew + cooking_time = 80 SECONDS + produced_reagent = /datum/reagent/consumable/soup/stew/truffle + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/truffles = 1) + finished_smell = /datum/pollutant/food/truffle_stew + +/datum/pot_recipe/gross_stew + cooking_time = 60 SECONDS + produced_reagent = /datum/reagent/consumable/soup/stew/gross + required_items = list(/obj/item/reagent_containers/food/snacks/smallrat/dead = 1) + +/datum/pot_recipe/gross_stew/bad_recipe + required_items = list(/obj/item/reagent_containers/food/snacks/badrecipe = 1) + +/datum/pot_recipe/drugs + cooking_time = 50 SECONDS + water_conversion = 0.45 + produced_reagent = /datum/reagent/druqks + required_items = list(/obj/item/reagent_containers/powder/spice = 1) + finished_smell = /datum/pollutant/food/druqks + pollute_amount = 100 + +/datum/pot_recipe/drugs/post_recipe() + var/remaining_water = water_volume - CEILING(water_volume * water_conversion, 1) + cooking_pot.reagents.add_reagent(/datum/reagent/water/spicy, remaining_water) + +/datum/pot_recipe/yuck_soup + cooking_time = 60 SECONDS + produced_reagent = /datum/reagent/yuck/cursed_soup + required_items = list(/obj/item/reagent_containers/food/snacks/produce/jacksberry/poison = 1) + +/datum/pot_recipe/yuck_soup/poo + required_items = list(/obj/item/natural/poo = 1) + +/datum/pot_recipe/yuck_soup/toxicshrooms + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/toxicshrooms = 1) + +/datum/pot_recipe/yuck_soup/worms + required_items = list(/obj/item/natural/worms = 1) + +/datum/pot_recipe/yuck_soup/rotten_food + required_items = list(/obj/item/reagent_containers/food/snacks/rotten = 1) + +/datum/pot_recipe/yuck_soup/organ + required_items = list(/obj/item/organ = 1) + +/datum/pot_recipe/yuck_soup/spider + required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/spider = 1) + fallback = TRUE + +/datum/pot_recipe/yuck_soup/living_rat + required_items = list(/obj/item/reagent_containers/food/snacks/smallrat = 1) + fallback = TRUE diff --git a/modular/Neu_Food/code/raw/NeuFood_dough.dm b/modular/Neu_Food/code/raw/NeuFood_dough.dm index a897c60422..2840d9a896 100644 --- a/modular/Neu_Food/code/raw/NeuFood_dough.dm +++ b/modular/Neu_Food/code/raw/NeuFood_dough.dm @@ -813,6 +813,7 @@ name = "uncooked prezzel" icon_state = "prezzel_raw" cooked_type = /obj/item/reagent_containers/food/snacks/rogue/prezzel + cooked_smell = /datum/pollutant/food/prezzel w_class = WEIGHT_CLASS_NORMAL eat_effect = null rotprocess = SHELFLIFE_LONG @@ -925,6 +926,7 @@ icon_state = "cheesecakeuncook" slices_num = 0 cooked_type = /obj/item/reagent_containers/food/snacks/rogue/ccake + cooked_smell = /datum/pollutant/food/cheese_cake list_reagents = list(/datum/reagent/consumable/nutriment = 1) foodtype = GRAIN | DAIRY | SUGAR w_class = WEIGHT_CLASS_NORMAL diff --git a/modular/Neu_Food/code/raw/NeuFood_meat.dm b/modular/Neu_Food/code/raw/NeuFood_meat.dm index 8350cf5c61..28590ebfdd 100644 --- a/modular/Neu_Food/code/raw/NeuFood_meat.dm +++ b/modular/Neu_Food/code/raw/NeuFood_meat.dm @@ -171,7 +171,7 @@ ingredient_size = 1 fried_type = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage/cooked/wiener cooked_type = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage/cooked/wiener - cooked_smell = /datum/pollutant/food/sausage + cooked_smell = /datum/pollutant/food/wiener become_rot_type = /obj/item/reagent_containers/food/snacks/rotten/sausage diff --git a/stonekeep.dme b/stonekeep.dme index 840982794d..55957e77a9 100644 --- a/stonekeep.dme +++ b/stonekeep.dme @@ -1046,8 +1046,10 @@ #include "code\game\objects\items\tools\wirecutters.dm" #include "code\game\objects\items\tools\wrench.dm" #include "code\game\objects\lighting\_base_light.dm" +#include "code\game\objects\lighting\_base_roguelight.dm" +#include "code\game\objects\lighting\_base_roguestreet.dm" #include "code\game\objects\lighting\lantern_post.dm" -#include "code\game\objects\lighting\roguelighting.dm" +#include "code\game\objects\lighting\rogue_fires.dm" #include "code\game\objects\lighting\sunlight.dm" #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barricades.dm"