From f430de98ccff37ab0359c7d0fcfcb9a9b7d2856e Mon Sep 17 00:00:00 2001 From: Seris02 Date: Tue, 10 Jan 2023 13:43:06 +0800 Subject: [PATCH 1/2] actual ingestion ports + laying delay fix --- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 55 ++++++++++++++++--- .../mob/living/silicon/robot/robot_vr.dm | 4 ++ 2 files changed, 52 insertions(+), 7 deletions(-) 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 9ae6d47c7e0..6c3ac4b67cf 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 @@ -14,7 +14,7 @@ var/cleaning = 0 var/patient_laststat = null var/list/injection_chems = list("inaprovaline", "dexalin", "bicaridine", "kelotane", "anti_toxin", "spaceacillin", "paracetamol") //The borg is able to heal every damage type. As a nerf, they use 750 charge per injection. - var/eject_port = "ingestion" + var/eject_port = "disposal" var/list/items_preserved = list() var/UI_open = FALSE var/compactor = FALSE @@ -51,7 +51,7 @@ med_analyzer = new /obj/item/device/healthanalyzer /obj/item/device/dogborg/sleeper/Destroy() - go_out() + go_out(forced=TRUE) ..() /obj/item/device/dogborg/sleeper/Exit(atom/movable/O) @@ -164,8 +164,45 @@ message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") playsound(src, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) -/obj/item/device/dogborg/sleeper/proc/go_out(var/target) +/obj/item/device/dogborg/sleeper/proc/ingest_atom(var/atom/ingesting) + if (!ingesting || ingesting == hound) + return + var/obj/belly/belly = hound.vore_selected + if (!istype(hound) || !istype(belly) || !(belly in hound.vore_organs)) + return + if (isliving(ingesting)) + ingest_living(ingesting, belly) + else if (istype(ingesting, /obj/item)) + var/obj/item/to_eat = ingesting + if (is_type_in_list(to_eat, item_vore_blacklist)) + return + if (istype(to_eat, /obj/item/weapon/holder)) + var/obj/item/weapon/holder/micro = ingesting + var/delete_holder = TRUE + for (var/mob/living/M in micro.contents) + if (!ingest_living(M, belly) || M.loc == micro) + delete_holder = FALSE + if (delete_holder) + micro.held_mob = null + qdel(micro) + return + to_eat.forceMove(belly) + log_admin("VORE: [hound] used their [src] to swallow [to_eat].") + +/obj/item/device/dogborg/sleeper/proc/ingest_living(var/mob/living/victim, var/obj/belly/belly) + if (victim.devourable && is_vore_predator(hound)) + belly.nom_mob(victim, hound) + add_attack_logs(hound, victim, "Eaten via [belly.name]") + return TRUE + return FALSE + +/obj/item/device/dogborg/sleeper/proc/go_out(var/forced=FALSE) hound = src.loc + if (forced == TRUE) + eject_port = "disposal" + if (eject_port == "ingestion" && (!istype(hound) || !hound.vore_selected)) + to_chat(hound, "You don't have a belly selected for the ingestion port to empty into!") + return items_preserved.Cut() cleaning = 0 for(var/list/dlist in deliverylists) @@ -173,6 +210,9 @@ if(length(contents) > 0) hound.visible_message("[hound.name] empties out their contents via their [eject_port] port.", "You empty your contents via your [eject_port] port.") for(var/C in contents) + if (eject_port == "ingestion" && (isliving(C) || isitem(C))) + ingest_atom(C) + continue if(ishuman(C)) var/mob/living/carbon/human/person = C person.forceMove(get_turf(src)) @@ -180,10 +220,11 @@ else var/obj/T = C T.loc = hound.loc - playsound(src, 'sound/effects/splat.ogg', 50, 1) - update_patient() - else //You clicked eject with nothing in you, let's just reset stuff to be sure. - update_patient() + if (eject_port == "ingestion") + hound.updateVRPanel() //already checked that it's a hound and not something else + else + playsound(src, 'sound/effects/splat.ogg', 50, 1) + update_patient() /obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov) hound = src.loc diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 231f7c9d475..d2f1a92569f 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -87,6 +87,10 @@ return return feed_grabbed_to_self(src,T) +/mob/living/silicon/robot/lay_down() + . = ..() + updateicon() + /mob/living/silicon/robot/proc/rest_style() set name = "Switch Rest Style" set category = "IC" From efe226a249d947b8eb01517d31552c2eed336b8b Mon Sep 17 00:00:00 2001 From: Seris02 Date: Sun, 15 Jan 2023 16:12:11 +0800 Subject: [PATCH 2/2] better code, new button, better formatting --- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) 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 6c3ac4b67cf..f1ec9da9d14 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 @@ -14,7 +14,7 @@ var/cleaning = 0 var/patient_laststat = null var/list/injection_chems = list("inaprovaline", "dexalin", "bicaridine", "kelotane", "anti_toxin", "spaceacillin", "paracetamol") //The borg is able to heal every damage type. As a nerf, they use 750 charge per injection. - var/eject_port = "disposal" + var/eject_port = "ingestion" var/list/items_preserved = list() var/UI_open = FALSE var/compactor = FALSE @@ -51,7 +51,7 @@ med_analyzer = new /obj/item/device/healthanalyzer /obj/item/device/dogborg/sleeper/Destroy() - go_out(forced=TRUE) + go_out() ..() /obj/item/device/dogborg/sleeper/Exit(atom/movable/O) @@ -176,7 +176,7 @@ var/obj/item/to_eat = ingesting if (is_type_in_list(to_eat, item_vore_blacklist)) return - if (istype(to_eat, /obj/item/weapon/holder)) + if (istype(to_eat, /obj/item/weapon/holder)) //just in case var/obj/item/weapon/holder/micro = ingesting var/delete_holder = TRUE for (var/mob/living/M in micro.contents) @@ -196,13 +196,8 @@ return TRUE return FALSE -/obj/item/device/dogborg/sleeper/proc/go_out(var/forced=FALSE) +/obj/item/device/dogborg/sleeper/proc/go_out() hound = src.loc - if (forced == TRUE) - eject_port = "disposal" - if (eject_port == "ingestion" && (!istype(hound) || !hound.vore_selected)) - to_chat(hound, "You don't have a belly selected for the ingestion port to empty into!") - return items_preserved.Cut() cleaning = 0 for(var/list/dlist in deliverylists) @@ -210,9 +205,6 @@ if(length(contents) > 0) hound.visible_message("[hound.name] empties out their contents via their [eject_port] port.", "You empty your contents via your [eject_port] port.") for(var/C in contents) - if (eject_port == "ingestion" && (isliving(C) || isitem(C))) - ingest_atom(C) - continue if(ishuman(C)) var/mob/living/carbon/human/person = C person.forceMove(get_turf(src)) @@ -220,10 +212,20 @@ else var/obj/T = C T.loc = hound.loc - if (eject_port == "ingestion") - hound.updateVRPanel() //already checked that it's a hound and not something else - else - playsound(src, 'sound/effects/splat.ogg', 50, 1) + playsound(src, 'sound/effects/splat.ogg', 50, 1) + update_patient() + +/obj/item/device/dogborg/sleeper/proc/vore_ingest_all() + hound = src.loc + if (!istype(hound) || length(contents) <= 0) + return + if (!hound.vore_selected) + to_chat(hound, "You don't have a belly selected to empty the contents into!") + return + for (var/C in contents) + if (isliving(C) || isitem(C)) + ingest_atom(C) + hound.updateVRPanel() update_patient() /obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov) @@ -254,21 +256,23 @@ dat += "Inject [C.name]
" dat += "

[name] Status

" + dat += "
" dat += "Refresh" dat += "Eject All" dat += "Eject port: [eject_port]" + dat += "Vore All" //might as well make it obvious if(!cleaning) dat += "Self-Clean" - if(medsensor) - dat += "Analyze Patient" else dat += "Self-Clean" + if(medsensor) + dat += "Analyze Patient" if(delivery) dat += "

Cargo Compartment


" dat += "Active Slot: [delivery_tag]" if(islist(deliverylists[delivery_tag])) dat += "Eject Slot" - + dat += "
" dat += "
" if(!delivery && compactor && length(contents))//garbage counter for trashpup @@ -342,7 +346,7 @@ dat += "
[R.name]:
[round(R.volume, 0.1)] units

" dat += "
" - var/datum/browser/popup = new(user, "sleeper_b", "[name] Console", 400, 500, src) + var/datum/browser/popup = new(user, "sleeper_b", "[name] Console", 450, 500, src) popup.set_content(dat) popup.open() UI_open = TRUE @@ -391,6 +395,10 @@ eject_port = "ingestion" sleeperUI(usr) return + if (href_list["ingest"]) + vore_ingest_all() + sleeperUI(usr) + return if(href_list["deliveryslot"]) var/tag = tgui_input_list(usr, "Select active delivery slot:", "Slot Choice", deliverylists) if(!tag)