diff --git a/code/global_vr.dm b/code/global_vr.dm index a96af13dd6..8b4ab024fc 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -3,4 +3,5 @@ robot_module_types += "K9" robot_module_types += "Janihound" robot_module_types += "Sci-borg" + robot_module_types += "Pupdozer" return 1 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 603cdb98d5..7d24676e0b 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 @@ -25,7 +25,7 @@ /obj/item/weapon/dogborg/jaws/small/attack_self(mob/user) var/mob/living/silicon/robot.R = user - if(R.emagged) + if(R.emagged || R.emag_items) emagged = !emagged if(emagged) name = "combat jaws" @@ -140,7 +140,7 @@ combat = 1 attack_verb = list("batted", "pawed", "bopped", "whapped") chargecost = 500 - + /obj/item/weapon/shockpaddles/robot/hound/jumper name = "paws of life" icon = 'icons/mob/dogborg_vr.dmi' @@ -159,6 +159,7 @@ icon_state = "synthtongue" hitsound = 'sound/effects/attackblob.ogg' var/emagged = 0 + var/datum/matter_synth/water = null /obj/item/device/dogborg/tongue/New() ..() @@ -166,7 +167,7 @@ /obj/item/device/dogborg/tongue/attack_self(mob/user) var/mob/living/silicon/robot.R = user - if(R.emagged) + if(R.emagged || R.emag_items) emagged = !emagged if(emagged) name = "hacked tongue of doom" @@ -187,14 +188,15 @@ 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!") - else if(istype(target,/obj/effect/decal/cleanable)) + else if(istype(target,/obj/effect/decal/cleanable) && water.energy >= 5) user.visible_message("[user] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") if(do_after (user, 50)) 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 - else if(istype(target,/obj/item)) + else if(istype(target,/obj/item) && water.energy >= 5) 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]...") if(do_after (user, 50)) @@ -203,6 +205,7 @@ qdel(target) var/mob/living/silicon/robot.R = user R.cell.charge += 250 + water.use_charge(5) 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...") @@ -212,11 +215,13 @@ var/mob/living/silicon/robot.R = user var/obj/item/weapon/cell.C = target R.cell.charge += C.maxcharge / 3 + water.use_charge(5) qdel(target) return user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") if(do_after (user, 50)) 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() @@ -226,35 +231,66 @@ var/mob/living/L = target if(R.cell.charge <= 666) return - L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! - L.Weaken(4) - L.apply_effect(STUTTER, 4) + L.Stun(1) + L.Weaken(1) + L.apply_effect(STUTTER, 1) L.visible_message("[user] has shocked [L] with its tongue!", \ "[user] has shocked you with its tongue! You can feel the betrayal.") playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) R.cell.charge -= 666 - else + else if(water.energy >= 5) user.visible_message("\the [user] affectionally licks all over \the [target]'s face!", "You affectionally lick all over \the [target]'s face!") playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + water.use_charge(5) + var/mob/living/carbon/human/H = target + if(H.species.lightweight == 1) + H.Weaken(3) return - else if(istype(target, /obj/structure/window)) + else if(istype(target, /obj/structure/window) && water.energy >= 1) user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") if(do_after (user, 50)) to_chat(user, "You clean \the [target.name].") + water.use_charge(5) target.color = initial(target.color) - //target.SetOpacity(initial(target.opacity)) //Apparantly this doesn't work? - else + else if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/toilet)) //Dog vibes. + user.visible_message("[user] begins to lap up water from [target.name].", "You begin to lap up water from [target.name].") + if(do_after (user, 50)) + water.add_charge(100) + else if(water.energy >= 5) user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") if(do_after (user, 50)) 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 return +/obj/item/pupscrubber + name = "floor scrubber" + desc = "Toggles floor scrubbing." + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "scrub0" + var/enabled = FALSE + +/obj/item/pupscrubber/New() + ..() + flags |= NOBLUDGEON + +/obj/item/pupscrubber/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(!enabled) + R.scrubbing = TRUE + enabled = TRUE + icon_state = "scrub1" + else + R.scrubbing = FALSE + enabled = FALSE + icon_state = "scrub0" + /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works. name = "disabler" desc = "A small and nonlethal gun produced by NT.." @@ -284,25 +320,23 @@ name = "light replacer" desc = "A device to automatically replace lights. This version is capable to produce a few replacements using your internal matter reserves." max_uses = 16 + uses = 10 var/cooldown = 0 + var/datum/matter_synth/glass = null -/obj/item/device/lightreplacer/dogborg/proc/AddUses(var/amount = 1) - uses = min(max(uses + amount, 0), max_uses) - -/obj/item/device/lightreplacer/dogborg/attack_self(mob/user)//Boo recharger fill is slow as shit and removes all the extra cyberfat gains you worked so hard for! +/obj/item/device/lightreplacer/dogborg/attack_self(mob/user)//Recharger refill is so last season. Now we recycle without magic! if(uses >= max_uses) to_chat(user, "[src.name] is full.") return if(uses < max_uses && cooldown == 0) - var/mob/living/silicon/robot.R = user - if(R.cell.charge <= 1000) - to_chat(user, "Insufficient power reserves. Please recharge.") + if(glass.energy < 125) + to_chat(user, "Insufficient material reserves.") return to_chat(user, "It has [uses] lights remaining. Attempting to fabricate a replacement. Please stand still.") cooldown = 1 if(do_after(user, 50)) - R.cell.charge -= 800 - AddUses(1) + glass.use_charge(125) + add_uses(1) cooldown = 0 else cooldown = 0 @@ -324,7 +358,7 @@ flags |= NOBLUDGEON /obj/item/weapon/dogborg/pounce/attack_self(mob/user) - var/mob/living/silicon/robot.R = user + var/mob/living/silicon/robot/R = user R.leap() /mob/living/silicon/robot/proc/leap() @@ -385,5 +419,5 @@ var/armor_block = run_armor_check(T, "melee") var/armor_soak = get_armor_soak(T, "melee") T.apply_damage(20, HALLOSS,, armor_block, armor_soak) - if(prob(25)) + if(prob(33)) T.apply_effect(3, WEAKEN, armor_block) 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 5f9d93bb72..39236a824f 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 @@ -18,11 +18,17 @@ var/UI_open = FALSE var/compactor = FALSE var/analyzer = FALSE + var/decompiler = FALSE var/datum/research/techonly/files //Analyzerbelly var. var/synced = FALSE var/startdrain = 500 var/max_item_count = 1 var/gulpsound = 'sound/vore/gulp.ogg' + var/datum/matter_synth/metal = null + var/datum/matter_synth/glass = null + var/datum/matter_synth/wood = null + var/datum/matter_synth/plastic = null + var/datum/matter_synth/water = null var/digest_brute = 2 var/digest_burn = 3 @@ -518,6 +524,7 @@ //Pick a random item to deal with (if there are any) var/atom/target = pick(touchable_items) + var/volume = 0 //Handle the target being a mob if(isliving(target)) @@ -559,6 +566,13 @@ items_preserved += brain else T.drop_from_inventory(I, src) + 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 + water.add_charge(volume) + if(T.reagents) + volume = T.reagents.total_volume + water.add_charge(volume) qdel(T) update_patient() if(UI_open == TRUE) @@ -568,26 +582,45 @@ else var/obj/item/T = target if(istype(T)) - if(analyzer == TRUE) - var/obj/item/tech_item = T - for(var/tech in tech_item.origin_tech) - files.UpdateTech(tech, tech_item.origin_tech[tech]) - synced = FALSE + if(T.reagents) + volume = T.reagents.total_volume var/digested = T.digest_act(item_storage = src) if(!digested) items_preserved |= T else - drain(-50 * digested) + if(analyzer && digested) + var/obj/item/tech_item = T + for(var/tech in tech_item.origin_tech) + files.UpdateTech(tech, tech_item.origin_tech[tech]) + synced = FALSE + drain(-50 * digested) + if(volume) + water.add_charge(volume) + if(!analyzer && compactor && T.matter) + for(var/material in T.matter) + var/total_material = T.matter[material] + if(istype(T,/obj/item/stack)) + var/obj/item/stack/stack = T + total_material *= stack.get_amount() + if(material == DEFAULT_WALL_MATERIAL) + metal.add_charge(total_material) + if(material == "glass") + glass.add_charge(total_material) + if(decompiler) + if(material == "plastic") + plastic.add_charge(total_material) + if(material == "wood") + wood.add_charge(total_material) + else + drain(-50 * digested) else if(istype(target,/obj/effect/decal/remains)) qdel(target) drain(-100) else items_preserved |= target - if(UI_open == TRUE) update_patient() sleeperUI(hound) - return /obj/item/device/dogborg/sleeper/process() @@ -632,3 +665,10 @@ max_item_count = 1 startdrain = 100 analyzer = TRUE + +/obj/item/device/dogborg/sleeper/compactor/decompiler + name = "Matter Decompiler" + desc = "A mounted matter decompiling unit with fuel processor." + icon_state = "decompiler" + max_item_count = 10 + decompiler = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index ce7e41b131..2adb7f063b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -42,6 +42,7 @@ robot_modules["ERT"] = /obj/item/weapon/robot_module/robot/ert robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/scrubpup robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/science + robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog return 1 //Just add a new proc with the robot_module type if you wish to run some other vore code @@ -139,21 +140,35 @@ src.modules += new /obj/item/weapon/dogborg/jaws/big(src) //In case there's some kind of hostile mob. src.modules += new /obj/item/weapon/melee/baton/robot(src) //Since the pounce module refused to work, they get a stunbaton instead. src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop people on the nose. - src.modules += new /obj/item/device/dogborg/tongue(src) //This is so they can clean up bloody evidence after it's examined, and so they can lick crew. src.modules += new /obj/item/taperoll/police(src) //Block out crime scenes. - src.modules += new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig. src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) //They /are/ a security borg, after all. src.modules += new /obj/item/weapon/dogborg/pounce(src) //Pounce src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) //Emag. Not a big problem. + + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0 + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig. + B.water = water + R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE - //R.icon_state = "k9" R.pixel_x = -16 R.old_x = -16 R.default_pixel_x = -16 R.dogborg = TRUE R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() /obj/item/weapon/robot_module/robot/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) @@ -190,24 +205,38 @@ /obj/item/weapon/robot_module/robot/medihound/New(var/mob/living/silicon/robot/R) src.modules += new /obj/item/weapon/dogborg/jaws/small(src) //In case a patient is being attacked by carp. src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop the crew. - src.modules += new /obj/item/device/dogborg/tongue(src) //Clean up bloody items by licking them, and eat rubbish for minor energy. src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially. - src.modules += new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)//So medi-hounds aren't nearly useless src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice! src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the chemicals when the chemist is nice src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people. src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) //Paws of life src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce + + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0 + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/dogborg/sleeper/B = new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them + B.water = water + R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE - //R.icon_state = "medihound" R.pixel_x = -16 R.old_x = -16 R.default_pixel_x = -16 R.dogborg = TRUE R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() /obj/item/weapon/robot_module/robot/ert @@ -223,12 +252,26 @@ src.modules += new /obj/item/weapon/handcuffs/cyborg(src) src.modules += new /obj/item/weapon/dogborg/jaws/big(src) src.modules += new /obj/item/weapon/melee/baton/robot(src) - src.modules += new /obj/item/device/dogborg/tongue(src) src.modules += new /obj/item/taperoll/police(src) - src.modules += new /obj/item/device/dogborg/sleeper/K9(src) src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun(src) src.modules += new /obj/item/weapon/dogborg/swordtail(src) src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) + + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0 + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src) + B.water = water + R.icon = 'icons/mob/64x64robot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE @@ -237,6 +280,7 @@ R.default_pixel_x = -16 R.dogborg = TRUE R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() /obj/item/weapon/robot_module/robot/scrubpup @@ -248,27 +292,76 @@ can_be_pushed = 0 /obj/item/weapon/robot_module/robot/scrubpup/New(var/mob/living/silicon/robot/R) - src.modules += new /obj/item/device/lightreplacer/dogborg(src) src.modules += new /obj/item/weapon/dogborg/jaws/small(src) src.modules += new /obj/item/device/dogborg/boop_module(src) - src.modules += new /obj/item/device/dogborg/tongue(src) - src.modules += new /obj/item/device/dogborg/sleeper/compactor(src) + src.modules += new /obj/item/pupscrubber(src) src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce + + //Starts empty. Can only recharge with recycled material. + var/datum/matter_synth/metal = new /datum/matter_synth/metal() + metal.name = "Steel reserves" + metal.recharge_rate = 0 + metal.max_energy = 100000 + metal.energy = 0 + var/datum/matter_synth/glass = new /datum/matter_synth/glass() + glass.name = "Glass reserves" + glass.recharge_rate = 0 + glass.max_energy = 100000 + glass.energy = 0 + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0 + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + + synths += metal + synths += glass + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/lightreplacer/dogborg/LR = new /obj/item/device/lightreplacer/dogborg(src) + LR.glass = glass + src.modules += LR + + var/obj/item/device/dogborg/sleeper/compactor/C = new /obj/item/device/dogborg/sleeper/compactor(src) + C.metal = metal + C.glass = glass + C.water = water + src.modules += C + + //Sheet refiners can only produce raw sheets. + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.name = "steel recycler" + M.desc = "A device that refines recycled steel into sheets." + M.synths = list(metal) + M.recipes = list() + M.recipes += new/datum/stack_recipe("steel sheet", /obj/item/stack/material/steel, 1, 1, 20) + src.modules += M + + var/obj/item/stack/material/cyborg/glass/G = new (src) + G.name = "glass recycler" + G.desc = "A device that refines recycled glass into sheets." + G.material = get_material_by_name("placeholder") //Hacky shit but we want sheets, not windows. + G.synths = list(glass) + G.recipes = list() + G.recipes += new/datum/stack_recipe("glass sheet", /obj/item/stack/material/glass, 1, 1, 20) + src.modules += G + R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE - //R.icon_state = "scrubpup" R.pixel_x = -16 R.old_x = -16 R.default_pixel_x = -16 R.dogborg = TRUE R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() -/obj/item/weapon/robot_module/robot/scrubpup/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R, amount) - /obj/item/weapon/robot_module/robot/science name = "Research Hound Module" sprites = list( @@ -280,24 +373,160 @@ /obj/item/weapon/robot_module/robot/science/New(var/mob/living/silicon/robot/R) src.modules += new /obj/item/weapon/dogborg/jaws/small(src) src.modules += new /obj/item/device/dogborg/boop_module(src) - src.modules += new /obj/item/device/dogborg/tongue(src) - src.modules += new /obj/item/device/dogborg/sleeper/compactor/analyzer(src) - //src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) //Belly works now. src.modules += new /obj/item/weapon/gripper/research(src) src.modules += new /obj/item/weapon/gripper/no_use/loader(src) src.modules += new /obj/item/weapon/screwdriver/cyborg(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.modules += new /obj/item/weapon/storage/part_replacer(src) src.emag = new /obj/item/weapon/hand_tele(src) + + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0 + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/dogborg/sleeper/compactor/analyzer/B = new /obj/item/device/dogborg/sleeper/compactor/analyzer(src) + B.water = water + R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE - //R.icon_state = "science" R.pixel_x = -16 R.old_x = -16 R.default_pixel_x = -16 R.dogborg = TRUE R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + ..() + +/obj/item/weapon/robot_module/robot/engiedog + name = "Construction Hound module" + sprites = list( + "Pupdozer" = "pupdozer", + ) + channels = list("Engineering" = 1) + networks = list(NETWORK_ENGINEERING) + subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) + can_be_pushed = 0 + +/obj/item/weapon/robot_module/robot/engiedog/New(var/mob/living/silicon/robot/R) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/t_scanner(src) + src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) + src.modules += new /obj/item/device/geiger(src) + src.modules += new /obj/item/weapon/dogborg/jaws/small(src) + src.modules += new /obj/item/device/dogborg/boop_module(src) + src.emag = new /obj/item/weapon/dogborg/pounce(src) + + //Painfully slow charger regen but high capacity. Also starts with low amount. + var/datum/matter_synth/metal = new /datum/matter_synth/metal() + metal.name = "Steel reserves" + metal.recharge_rate = 50 + metal.max_energy = 100000 + metal.energy = 5000 + var/datum/matter_synth/glass = new /datum/matter_synth/glass() + glass.name = "Glass reserves" + glass.recharge_rate = 50 + glass.max_energy = 100000 + glass.energy = 5000 + var/datum/matter_synth/wood = new /datum/matter_synth/wood() + wood.name = "Wood reserves" + wood.recharge_rate = 50 + wood.max_energy = 100000 + wood.energy = 5000 + var/datum/matter_synth/plastic = new /datum/matter_synth/plastic() + plastic.name = "Plastic reserves" + plastic.recharge_rate = 50 + plastic.max_energy = 100000 + plastic.energy = 5000 + var/datum/matter_synth/water = new /datum/matter_synth() + water.name = "Water reserves" + water.recharge_rate = 0 + water.max_energy = 1000 + water.energy = 0 + R.water_res = water + + var/datum/matter_synth/wire = new /datum/matter_synth/wire() + synths += metal + synths += glass + synths += wood + synths += plastic + synths += wire + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/lightreplacer/dogborg/LR = new /obj/item/device/lightreplacer/dogborg(src) + LR.glass = glass + src.modules += LR + + var/obj/item/device/dogborg/sleeper/compactor/decompiler/MD = new /obj/item/device/dogborg/sleeper/compactor/decompiler(src) + MD.metal = metal + MD.glass = glass + MD.wood = wood + MD.plastic = plastic + src.modules += MD + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/material/cyborg/glass/G = new (src) + G.synths = list(glass) + src.modules += G + + var/obj/item/stack/rods/cyborg/RD = new /obj/item/stack/rods/cyborg(src) + RD.synths = list(metal) + src.modules += RD + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + S.synths = list(metal) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG + + var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + WT.synths = list(wood) + src.modules += WT + + var/obj/item/stack/material/cyborg/wood/W = new (src) + W.synths = list(wood) + src.modules += W + + var/obj/item/stack/material/cyborg/plastic/PL = new (src) + PL.synths = list(plastic) + src.modules += PL + + R.icon = 'icons/mob/widerobot_vr.dmi' + R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' + R.ui_style_vr = TRUE + R.pixel_x = -16 + R.old_x = -16 + R.default_pixel_x = -16 + R.dogborg = TRUE + R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill ..() /obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R) @@ -308,4 +537,6 @@ R.wideborg = FALSE R.ui_style_vr = FALSE R.default_pixel_x = initial(pixel_x) + R.scrubbing = FALSE + R.verbs -= /mob/living/silicon/robot/proc/ex_reserve_refill ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index f57f7dca64..14b58b726a 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -7,6 +7,8 @@ var/leap_at var/dogborg = FALSE //Dogborg special features (overlays etc.) var/wideborg = FALSE //When the borg simply doesn't use standard 32p size. + var/scrubbing = FALSE //Floor cleaning enabled + var/datum/matter_synth/water_res = null var/notransform var/original_icon = 'icons/mob/robots.dmi' var/ui_style_vr = FALSE //Do we use our hud icons? @@ -64,13 +66,13 @@ add_overlay("wreck-overlay") /mob/living/silicon/robot/Move(a, b, flag) - . = ..() - - if(module) - if(module.type == /obj/item/weapon/robot_module/robot/scrubpup)//no water reserve mechanics yet. + if(scrubbing) + var/datum/matter_synth/water = water_res + if(water && water.energy >= 1) var/turf/tile = loc if(isturf(tile)) + water.use_charge(1) tile.clean_blood() if(istype(tile, /turf/simulated)) var/turf/simulated/T = tile @@ -95,7 +97,6 @@ cleaned_human.update_inv_shoes(0) cleaned_human.clean_blood(1) cleaned_human << "[src] cleans your face!" - return return /mob/living/silicon/robot/proc/vr_sprite_check() @@ -107,3 +108,19 @@ icon = 'icons/mob/robots_vr.dmi' else if(!(icon_state in vr_icons)) icon = original_icon + +/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.") \ No newline at end of file diff --git a/icons/mob/dogborg_vr.dmi b/icons/mob/dogborg_vr.dmi index d0a07f60ee..78d646c6aa 100644 Binary files a/icons/mob/dogborg_vr.dmi and b/icons/mob/dogborg_vr.dmi differ diff --git a/icons/mob/screen1_robot_vr.dmi b/icons/mob/screen1_robot_vr.dmi index 01647f02cf..3c8a67154e 100644 Binary files a/icons/mob/screen1_robot_vr.dmi and b/icons/mob/screen1_robot_vr.dmi differ diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi index 1682e1518f..afb91c0423 100644 Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ