From 58db30b2656ce28f67b6ba0a3d2114a56c546248 Mon Sep 17 00:00:00 2001 From: CHOMPStation2 <58959929+CHOMPStation2@users.noreply.github.com> Date: Sat, 6 Apr 2024 23:28:26 -0700 Subject: [PATCH] [MIRROR] borgs can walk, vtec overhaul, no more borg light and some glow flicker (#8179) Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> Co-authored-by: Kashargul --- code/_onclick/hud/_defines.dm | 8 ++-- code/_onclick/hud/hud.dm | 2 + code/_onclick/hud/robot.dm | 39 +++++++++++++++++- code/_onclick/hud/screen_objects.dm | 13 ++++++ .../objects/items/robot/robot_upgrades.dm | 3 +- .../human/species/station/prommie_blob.dm | 3 +- code/modules/mob/living/silicon/robot/life.dm | 10 ++--- .../modules/mob/living/silicon/robot/robot.dm | 10 ++--- .../simple_mob/subtypes/vore/oregrub.dm | 7 +++- .../living/simple_mob/subtypes/vore/scel.dm | 17 -------- .../simple_mob/subtypes/vore/solargrub.dm | 3 ++ .../subtypes/vore/solargrub_larva.dm | 4 ++ icons/mob/screen1_robot.dmi | Bin 129902 -> 132820 bytes 13 files changed, 83 insertions(+), 36 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index b6d39fde0e..e89b3beb2f 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -58,9 +58,11 @@ #define ui_zonesel "EAST-1:28,SOUTH:5" #define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) -#define ui_borg_pull "EAST-3:24,SOUTH+1:7" -#define ui_borg_module "EAST-2:26,SOUTH+1:7" -#define ui_borg_panel "EAST-1:28,SOUTH+1:7" +#define ui_borg_pull "EAST-4:24,SOUTH+1:7" //borgs +#define ui_borg_radio "EAST-2:26,SOUTH+1:7" //borgs +#define ui_borg_panel "EAST-1:28,SOUTH+1:7" //borgs +#define ui_borg_module "EAST-3:24,SOUTH+1:5"//borgs +#define ui_vtec_control "EAST-3:24,SOUTH:5"//borgs #define ui_ai_core "SOUTH:6,WEST:16" #define ui_ai_camera_list "SOUTH:6,WEST+1:16" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 2a997afba0..af26526846 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -176,6 +176,7 @@ var/list/global_huds = list( var/obj/screen/l_hand_hud_object var/obj/screen/action_intent var/obj/screen/move_intent + var/obj/screen/control_vtec var/list/adding /// Misc hud elements that are hidden when the hud is minimized @@ -219,6 +220,7 @@ var/list/global_huds = list( l_hand_hud_object = null action_intent = null move_intent = null + control_vtec = null adding = null other = null other_important = null diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 3553ae1aa9..c9cd99ba45 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -25,7 +25,7 @@ var/obj/screen/robot_inventory using.color = HUD.ui_color using.alpha = HUD.ui_alpha using.icon_state = "radio" - using.screen_loc = ui_movi + using.screen_loc = ui_borg_radio using.layer = HUD_LAYER adding += using @@ -81,6 +81,17 @@ var/obj/screen/robot_inventory adding += using HUD.action_intent = using + //Move intent (walk/run) + using = new /obj/screen() + using.name = "mov_intent" + using.icon = HUD.ui_style + using.icon_state = (m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.color = HUD.ui_color + using.alpha = HUD.ui_alpha + HUD.adding += using + HUD.move_intent = using + //Health healths = new /obj/screen() healths.icon = HUD.ui_style @@ -206,6 +217,32 @@ var/obj/screen/robot_inventory client.screen += HUD.adding + HUD.other client.screen += client.void +/datum/hud/proc/toggle_vtec_control() + if(!isrobot(mymob)) + return + + var/mob/living/silicon/robot/R = mymob + if(!control_vtec) + var/obj/screen/using = new /obj/screen() + using.name = "control_vtec" + using.icon = ui_style + using.screen_loc = ui_vtec_control + using.color = ui_color + using.alpha = ui_alpha + control_vtec = using + if(R.vtec_active) + if(R.speed == 0) + control_vtec.icon_state = "speed_0" + else if(R.speed == -0.5) + control_vtec.icon_state = "speed_1" + else if(R.speed == -1) + control_vtec.icon_state = "speed_2" + R.m_intent = "run" + R.hud_used.move_intent.icon_state = "running" + R.client.screen += control_vtec + else + R.client.screen -= control_vtec + R.speed = 0 /datum/hud/proc/toggle_show_robot_modules() if(!isrobot(mymob)) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index dde89b98ab..cd9c4044b6 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -272,6 +272,19 @@ var/mob/living/L = usr L.resist() + if("control_vtec") + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + if(R.speed == 0 && R.vtec_active) + R.speed = -0.5 + R.hud_used.control_vtec.icon_state = "speed_1" + else if(R.speed == -0.5 && R.vtec_active) + R.speed = -1 + R.hud_used.control_vtec.icon_state = "speed_2" + else + R.speed = 0 + R.hud_used.control_vtec.icon_state = "speed_0" + if("mov_intent") if(isliving(usr)) if(iscarbon(usr)) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index dc8c5bc62c..2d25ddca88 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -109,7 +109,8 @@ return 0 add_verb(R,/mob/living/silicon/robot/proc/toggle_vtec) //CHOMPEdit - R.speed = -1 + R.vtec_active = TRUE + R.hud_used.toggle_vtec_control() return 1 /obj/item/borg/upgrade/basic/sizeshift diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm index defb25ccb8..1ad0f4db7e 100644 --- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm @@ -428,7 +428,8 @@ blob.rad_glow = CLAMP(radiation,0,250) set_light(0) blob.set_light(max(1,min(5,radiation/15)), max(1,min(10,radiation/25)), blob.color) - blob.handle_light() + else + blob.set_light(0) if(has_hat) blob.hat = new_hat new_hat.forceMove(src) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index d33c7eb37f..000974f1b9 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -371,8 +371,8 @@ IgniteMob() /mob/living/silicon/robot/handle_light() - . = ..() - if(. == FALSE) // If no other light sources are on. - if(lights_on) - set_light(integrated_light_power, 1, "#FFFFFF") - return TRUE + if(lights_on) + set_light(integrated_light_power, 1, "#FFFFFF") + return TRUE + else + . = ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d749872f04..a961b28e2d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -120,6 +120,7 @@ ) var/has_recoloured = FALSE + var/vtec_active = FALSE /mob/living/silicon/robot/New(loc, var/unfinished = 0) spark_system = new /datum/effect/effect/system/spark_spread() @@ -549,12 +550,9 @@ /mob/living/silicon/robot/proc/toggle_vtec() set name = "Toggle VTEC" set category = "Abilities" - if(speed == -1) - to_chat(src, "VTEC module disabled.") - speed = 0 - else - to_chat(src, "VTEC module enabled.") - speed = -1 + vtec_active = !vtec_active + hud_used.toggle_vtec_control() + to_chat(src, "VTEC module [vtec_active ? "enabled" : "disabled"].") // update the status screen display /mob/living/silicon/robot/get_status_tab_items() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm index f10ed399e7..29fd323319 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm @@ -89,6 +89,7 @@ ) can_be_drop_prey = FALSE //CHOMP Add + glow_override = TRUE /mob/living/simple_mob/vore/oregrub/lava name = "mature lavagrub" @@ -145,6 +146,8 @@ if(. == 0 && !is_dead()) set_light(2.5, 1, COLOR_ORANGE) return 1 + else if(is_dead()) + glow_override = FALSE /mob/living/simple_mob/vore/oregrub/lava/death() set_light(0) @@ -174,7 +177,7 @@ B.fancy_vore = 1 // CHOMPedit - Fancy Vore Sounds B.belly_fullscreen_color = "#1b4ba3" // CHOMPedit - Belly Fullscreen B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen - + // CHOMPEdit: Yes, these are copied + modified from the solargrub list. These are better placeholders than ~nothing~, and will give us more voremobs to work with. B.emote_lists[DM_HOLD] = list( "The air trapped within the grub is hot, humid, and tinged with soot, but otherwise mercifully harmless to you aside from being heavy on the lungs.", @@ -191,7 +194,7 @@ "The grub's inner muscles are in a constant state of clenching all over you, adding an additional layer of processing to its stomach's slow, steady churning, helping break you down faster!", "The grub chitters in irritation at your continued solidity, followed by a string of crushingly tight stomach clenches that grind its caustic stomach ooze into your body!", "The deceptively severe heat trapped within the grub works in tandem with its inner muscles and your tingling, prickling stomach juice bath to weaken you!") - + /mob/living/simple_mob/vore/oregrub/lava/init_vore() // Should inherit everything from parent, and then change our belly fullscreen color. if(!voremob_loaded) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm b/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm index 4f2466b9a3..22c3f81a32 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm @@ -242,20 +242,3 @@ icon_state = "scel_red" icon_rest = "scel_red-rest" random_skin = 0 - -/mob/living/simple_mob/vore/scel/handle_light() - if(glow_override) - return FALSE - - if(instability >= TECHNOMANCER_INSTABILITY_MIN_GLOW) - var/distance = round(sqrt(instability / 2)) - if(distance) - set_light(distance, distance * 4, l_color = "#660066") - return TRUE - - else if(glow_toggle) - set_light(glow_range, glow_intensity, glow_color) - - else - set_light(0) - return FALSE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 107be23fc3..e45d3b6c9b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -62,6 +62,7 @@ var/global/moth_amount = 0 // Chompstation Addition, Rykka waz here. *pawstamp* var/tracked = FALSE can_be_drop_prey = FALSE //CHOMP Add + glow_override = TRUE /datum/say_list/solargrub emote_see = list("squelches", "squishes") @@ -171,6 +172,8 @@ var/global/moth_amount = 0 // Chompstation Addition, Rykka waz here. *pawstamp* if(. == 0 && !is_dead()) set_light(2.5, 1, COLOR_YELLOW) return 1 + else if(is_dead()) + glow_override = FALSE /mob/living/simple_mob/vore/solargrub/init_vore() if(!voremob_loaded) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm index 38c1fa881a..9a9ee43564 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm @@ -51,6 +51,8 @@ var/global/list/grub_machine_overlays = list() ai_holder_type = /datum/ai_holder/simple_mob/solargrub_larva + glow_override = TRUE + /mob/living/simple_mob/animal/solargrub_larva/New() ..() existing_solargrubs += src @@ -186,6 +188,8 @@ var/global/list/grub_machine_overlays = list() if(. == 0 && !is_dead()) set_light(1.5, 1, COLOR_YELLOW) return 1 + else if(is_dead()) + glow_override = FALSE /obj/machinery/abstract_grub_machine diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi index 98f475349c8d563c7ba6817ae72937ae4c4792f5..5e8e0f431afc0e8fd898f9b99e3c3d5bc524e661 100644 GIT binary patch delta 10704 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 RP7nqBD9ETvm%lX&`5z4fb9(>)