diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index ba73a8faf8..1f4d5138e4 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -397,6 +397,12 @@ var/obj/item/I = O if(!I || !istype(I,/obj/item)) return + //CHOMPAdd Start + if(istype(I, /obj/item/device/robot_tongue) && isrobot(user)) + var/obj/item/device/robot_tongue/J = I + if(J.water.energy < J.water.max_energy) return + //CHOMPAdd End + to_chat(usr, "You start washing \the [I].") busy = 1 @@ -433,4 +439,4 @@ /obj/structure/sink/puddle/attackby(obj/item/O as obj, mob/user as mob) icon_state = "puddle-splash" ..() - icon_state = "puddle" \ No newline at end of file + icon_state = "puddle" diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index cfdea2fc86..d74b7e9183 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -241,6 +241,8 @@ icon_state = "synthtongue" hitsound = 'sound/effects/attackblob.ogg' var/emagged = 0 + var/datum/matter_synth/water = null //CHOMPAdd readds water + var/busy = 0 //CHOMPAdd prevents abuse /obj/item/device/robot_tongue/New() ..() @@ -269,16 +271,49 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(user.client && (target in user.client.screen)) to_chat(user, "You need to take \the [target.name] off before cleaning it!") + //CHOMPADD Start + if(busy) + to_chat(user, "You are already licking something else.") return + if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/toilet)) //Dog vibes. + if (water.energy == water.max_energy && istype(target, /obj/structure/sink)) return + if (water.energy == water.max_energy && istype(target, /obj/structure/toilet)) + to_chat(user, "You refrain from lapping water from the [target.name] with your reserves filled.") + return + user.visible_message("[user] begins to lap up water from [target.name].", "You begin to lap up water from [target.name].") + busy = 1 + if(do_after(user, 50)) + busy = 0 + water.add_charge(50) + to_chat(src, "You refill some of your water reserves.") + else if(water.energy < 5) + to_chat(user, "Your mouth feels dry. You should drink up some water .") + //CHOMPADD End + return + //CHOMPADD Start + else if(istype(target,/obj/effect/decal/cleanable)) + user.visible_message("[user] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") + busy = 1 + if(do_after(user, 50)) + busy = 0 + to_chat(user, "You finish licking off \the [target.name].") + water.use_charge(5) + qdel(target) + var/mob/living/silicon/robot/R = user + R.cell.charge += 50 + //CHOMPADD End else if(istype(target,/obj/item)) if(istype(target,/obj/item/trash)) user.visible_message("[user] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") + busy = 1 //CHOMPAdd prevents abuse if(do_after (user, 50)) + busy = 0 //CHOMPAdd prevents abuse user.visible_message("[user] finishes eating \the [target.name].", "You finish eating \the [target.name].") to_chat(user, "You finish off \the [target.name].") qdel(target) var/mob/living/silicon/robot/R = user R.cell.charge += 250 + water.use_charge(5) //CHOMPAdd return if(istype(target,/obj/item/weapon/reagent_containers/food)) user.visible_message("[user] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...") @@ -291,14 +326,28 @@ return if(istype(target,/obj/item/weapon/cell)) user.visible_message("[user] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") + busy = 1 //CHOMPAdd prevents abuse if(do_after (user, 50)) + busy = 0 //CHOMPAdd prevents abuse user.visible_message("[user] finishes gulping down \the [target.name].", "You finish swallowing \the [target.name].") to_chat(user, "You finish off \the [target.name], and gain some charge!") var/mob/living/silicon/robot/R = user var/obj/item/weapon/cell/C = target R.cell.charge += C.charge / 3 + water.use_charge(5) //CHOMPAdd qdel(target) return + //CHOMPAdd Start + user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + busy = 1 + if(do_after(user, 50, exclusive = TRUE)) + busy = 0 + to_chat(user, "You clean \the [target.name].") + water.use_charge(5) + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + target.clean_blood() + //CHOMPADD End else if(ishuman(target)) if(src.emagged) var/mob/living/silicon/robot/R = user @@ -315,9 +364,26 @@ else user.visible_message("\The [user] affectionately licks all over \the [target]'s face!", "You affectionately lick all over \the [target]'s face!") playsound(src, 'sound/effects/attackblob.ogg', 50, 1) + water.use_charge(5) //CHOMPAdd var/mob/living/carbon/human/H = target if(H.species.lightweight == 1) H.Weaken(3) + //CHOMPAdd Start + else + user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") + busy = 1 + if(do_after(user, 50)) + busy = 0 + to_chat(user, "You clean \the [target.name].") + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + target.clean_blood() + water.use_charge(5) + if(istype(target, /turf/simulated)) + var/turf/simulated/T = target + T.dirt = 0 + busy = 0 + //CHOMPADD End return /obj/item/pupscrubber diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index e0fcab3fa6..de07fac4cf 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -37,6 +37,7 @@ var/datum/matter_synth/glass = null var/datum/matter_synth/wood = null var/datum/matter_synth/plastic = null + var/datum/matter_synth/water = null //CHOMPAdd readd water var/digest_brute = 2 var/digest_burn = 3 var/digest_multiplier = 1 @@ -583,6 +584,7 @@ if(air_master.current_cycle%3==1 && length(touchable_items)) //Burn all the mobs or add them to the exclusion list + var/volume = 0 //CHOMPAdd for(var/mob/living/T in (touchable_items)) touchable_items -= T //Exclude mobs from loose item picking. if((T.status_flags & GODMODE) || !T.digestable) @@ -596,6 +598,10 @@ var/actual_burn = T.getFireLoss() - old_burn var/damage_gain = actual_brute + actual_burn hound.nutrition += 2.5 * damage_gain //drain(-25 * damage_gain) //25*total loss as with voreorgan stats.//CHOMPEdit + //CHOMPAdd Start + if(water) + water.add_charge(damage_gain) + //CHOMPAdd End if(T.stat == DEAD) if(ishuman(T)) log_admin("[key_name(hound)] has digested [key_name(T)] with a cyborg belly. ([hound ? "JMP" : "null"])") @@ -629,6 +635,17 @@ items_preserved |= brain else T.drop_from_inventory(I, src) + //CHOMPAdd Start + if(ishuman(T)) + var/mob/living/carbon/human/Prey = T + volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier + if(water) + water.add_charge(volume) + if(T.reagents) + volume = T.reagents.total_volume + if(water) + water.add_charge(volume) + //CHOMPAdd End if(T.ckey) GLOB.prey_digested_roundstat++ if(patient == T) @@ -644,6 +661,10 @@ //Handle the target being anything but a /mob/living var/obj/item/T = target if(istype(T)) + //CHOMPAdd Start + if(T.reagents) + volume = T.reagents.total_volume + //CHOMPAdd End var/digested = T.digest_act(item_storage = src) if(!digested) items_preserved |= T @@ -653,6 +674,10 @@ for(var/tech in tech_item.origin_tech) files.UpdateTech(tech, tech_item.origin_tech[tech]) synced = FALSE + //CHOMPAdd Start + if(volume && water) + water.add_charge(volume) + //CHOMPAdd End if(recycles && T.matter) for(var/material in T.matter) var/total_material = T.matter[material] diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5ac9f900f4..054167cc75 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -108,6 +108,7 @@ /mob/living/silicon/robot/proc/sensor_mode, /mob/living/silicon/robot/proc/robot_checklaws, /mob/living/silicon/robot/proc/robot_mount, + /mob/living/silicon/robot/proc/ex_reserve_refill, //CHOMPEdit re-adds the extinquisher refill from water /mob/living/proc/toggle_rider_reins, /mob/living/proc/shred_limb ) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index d6dc67c4b0..26465af10a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -205,9 +205,19 @@ var/global/list/robot_modules = list( // Cyborgs (non-drones), default loadout. This will be given to every module. /obj/item/weapon/robot_module/robot/create_equipment(var/mob/living/silicon/robot/robot) ..() + //CHOMPEdit Start + var/datum/matter_synth/water = new /datum/matter_synth(500) + water.name = "Water reserves" + water.recharge_rate = 10 + water.max_energy = 1000 + robot.water_res = water + synths += water + var/obj/item/device/robot_tongue/T = new /obj/item/device/robot_tongue(src) + T.water = water + src.modules += T + //CHOMPEdit End src.modules += new /obj/item/device/gps/robot(src) src.modules += new /obj/item/device/boop_module(src) - src.modules += new /obj/item/device/robot_tongue(src) src.modules += new /obj/item/device/flash/robot(src) src.modules += new /obj/item/weapon/extinguisher(src) src.modules += new /obj/item/weapon/gripper/scene(src) //CHOMPEdit - Give all borgs a scene gripper diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 579c2fd9a2..adc49d3e50 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -1,6 +1,3 @@ -/mob/living/silicon/robot //ChompEDIT - var/sleeper_resting = FALSE //CHOMPEdit - Enable resting belly sprites for dogborgs that have the sprites - /mob/living/silicon/robot/verb/robot_nom(var/mob/living/T in living_mobs(1)) set name = "Robot Nom" set category = "IC" @@ -126,4 +123,4 @@ if(nutrition >= 1 * CYBORG_POWER_USAGE_MULTIPLIER) nutrition -= 1 * CYBORG_POWER_USAGE_MULTIPLIER cell.charge += 10 * CYBORG_POWER_USAGE_MULTIPLIER - ..() \ No newline at end of file + ..() diff --git a/modular_chomp/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm b/modular_chomp/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm new file mode 100644 index 0000000000..e734db35c2 --- /dev/null +++ b/modular_chomp/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm @@ -0,0 +1,7 @@ +/obj/item/device/robot_tongue/examine(user) + . = ..() + if(Adjacent(user)) + if(water.energy) + . += "[src] is wet. Just like it should be." + if(water.energy < 5) + . += "[src] is dry." diff --git a/modular_chomp/code/modules/mob/living/silicon/robot/robot.dm b/modular_chomp/code/modules/mob/living/silicon/robot/robot.dm index d231124508..d9f3588b4d 100644 --- a/modular_chomp/code/modules/mob/living/silicon/robot/robot.dm +++ b/modular_chomp/code/modules/mob/living/silicon/robot/robot.dm @@ -1,3 +1,7 @@ +/mob/living/silicon/robot + var/sleeper_resting = FALSE //Enable resting belly sprites for dogborgs that have the sprites + var/datum/matter_synth/water_res = null //Enable water for lick clean + /mob/living/silicon/robot/verb/purge_nutrition() set name = "Purge Nutrition" set category = "IC" @@ -8,3 +12,19 @@ nutrition = 1000 to_chat(src, "You have purged most of the nutrition lingering in your systems.") return TRUE + +/mob/living/silicon/robot/proc/ex_reserve_refill() + set name = "Refill Extinguisher" + set category = "Object" + var/datum/matter_synth/water = water_res + for(var/obj/item/weapon/extinguisher/E in module.modules) + if(E.reagents.total_volume < E.max_water) + if(water && water.energy > 0) + var/amount = E.max_water - E.reagents.total_volume + if(water.energy < amount) + amount = water.energy + water.use_charge(amount) + E.reagents.add_reagent("water", amount) + to_chat(src, "You refill the extinguisher using your water reserves.") + else + to_chat(src, "Insufficient water reserves.") diff --git a/vorestation.dme b/vorestation.dme index 4cd5eeb3f4..0f053ed0d4 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4738,6 +4738,7 @@ #include "modular_chomp\code\modules\mob\living\carbon\human\species\station\traits\xenomorph_hybrid_trait.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "modular_chomp\code\modules\mob\living\silicon\robot\dogborg\dog_modules.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\sprites\civilian.dm" #include "modular_chomp\code\modules\mob\living\silicon\robot\sprites\clown.dm"