Multibelt fixes and QoL (#17925)

* Sets default crowbar to be robot jaws

* Stops passive burn from borg welders

* Ctrl-Z radial menu

* color changing

* Cable Color

* Picking up stacks.

* Colorful!

* Fuelrod fix

* Select the final pocket on spawn

* crowbar AND jaws

* borgstuff

* a

* pocket fix
This commit is contained in:
Cameron Lennox
2025-06-29 04:10:32 +02:00
committed by GitHub
parent 2fd29d5b21
commit 9b4ca1839c
15 changed files with 170 additions and 122 deletions
@@ -514,6 +514,22 @@
to_chat(src, span_filter_notice("You harmlessly spark."))
spark_system.start()
///Essentially, a Activate Held Object mode for borgs that acts just like pressing Z in hotkey mode but also works well with multibelts.
/mob/living/silicon/robot/verb/alt_mode()
set name = "Robot Activate Held Object"
set category = "Object"
set src = usr
if(!checkClickCooldown())
return
setClickCooldown(1)
var/obj/item/W = module_active
if(module_active)
W.attack_self(src)
return
/mob/living/silicon/robot/verb/toggle_grabbability() // Grisp the preyborgs with consent (and allows for your borg to still be pet).
set category = "Abilities.Silicon"
set name = "Toggle Pickup"
@@ -200,15 +200,6 @@ var/global/list/robot_modules = list(
CHANNEL_EXPLORATION = 1
)
/obj/item/robot_module/robot/Initialize(mapload)
. = ..()
if(!isrobot(loc))
return
var/mob/living/silicon/robot/R = loc
if(R.sprite_datum)
R.sprite_datum.do_equipment_glamour(src)
// Cyborgs (non-drones), default loadout. This will be given to every module.
/obj/item/robot_module/robot/create_equipment(var/mob/living/silicon/robot/robot)
..()
@@ -218,6 +209,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/flash/robot(src)
src.modules += new /obj/item/extinguisher(src)
src.modules += new /obj/item/tool/crowbar/cyborg(src)
src.modules += new /obj/item/melee/robotic/jaws/small(src)
src.modules += new /obj/item/gripper/scene(src)
/obj/item/robot_module/robot/standard
@@ -1,13 +1,15 @@
// Robot toolbelts, such as screwdrivers and the like. All contained in one neat little package.
// The code for actually 'how these use the item inside of them instead of the item itself' can be found in _onclick/cyborg.dm (yes, click code, gross, I know.)
// The code for actually 'how these use the item inside of them instead of the item itself' can be found in code\modules\mob\living\silicon\robot\inventory.dm (yes, click code, gross, I know.)
/*
* Engineering Tools
*/
/obj/item/robotic_multibelt
name = "Robotic multitool"
desc = "An integrated toolbelt. Use CTRL-CLICK to interact with the selected item!"
desc = "An integrated toolbelt that holds various tools."
description_info = "Pressing Z will interact with the item the multibelt has selected.<br>\
Pressing Ctrl+Z will open the radial menu to allow item swapping!<br>\
Clicking on the selected object will also open the radial menu."
icon = 'icons/obj/tools_robot.dmi'
icon_state = "toolkit_engiborg"
w_class = ITEMSIZE_HUGE
@@ -139,6 +141,15 @@
force = 10
toolspeed = 0.5
/obj/item/tool/crowbar/cyborg/jaws
name = "puppy jaws"
desc = "The jaws of a small dog. Still strong enough to pry things."
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "smalljaws_textless"
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
force = 15
/obj/item/weldingtool/electric/mounted/cyborg
name = "integrated electric welding tool"
desc = "An advanced welder designed to be used in robotic systems."
@@ -147,6 +158,7 @@
usesound = 'sound/items/Welder2.ogg'
toolspeed = 0.5
welding = TRUE
no_passive_burn = TRUE
/obj/item/tool/wirecutters/cyborg
name = "wirecutters"
@@ -180,12 +192,15 @@
uses_charge = 1
charge_costs = list(1)
/obj/item/stack/cable_coil/cyborg/verb/set_colour()
/obj/item/stack/cable_coil/cyborg/attack_self(mob/user)
set_colour(user)
/obj/item/stack/cable_coil/cyborg/proc/set_colour(mob/user)
set name = "Change Colour"
set category = "Object"
var/selected_type = tgui_input_list(usr, "Pick new colour.", "Cable Colour", GLOB.possible_cable_coil_colours)
set_cable_color(selected_type, usr)
var/selected_type = tgui_input_list(user, "Pick new colour.", "Cable Colour", GLOB.possible_cable_coil_colours)
set_cable_color(selected_type, user)
/*
* Surgical Tools
@@ -442,6 +457,16 @@
. = ..()
///Allows the material fabricator to pick up materials if they hit an appropriate stack.
/obj/item/robotic_multibelt/materials/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(istype(target, /obj/item/stack)) //We are targeting a stack.
if(!selected_item)
to_chat(user, span_warning("You need to select a material first!"))
return
var/obj/item/stack/target_stack = target
if(istype(selected_item, /obj/item/stack))
target_stack.attackby(selected_item, user)
/*
* Grippers
*/
@@ -490,7 +515,7 @@
var/obj/new_pocket = new /obj/item/storage/internal/gripper(src)
new_pocket.name = "Pocket [i]"
pockets += new_pocket
current_pocket = pick(pockets) //Pick a random pocket!
current_pocket = peek(pockets)
/obj/item/gripper/Destroy()
current_pocket = null
@@ -531,7 +556,13 @@
continue
var/obj/item/pocket_content = pocket_to_check.contents[1]
pockets_by_name["[pocket_to_check.name]" + "[pocket_content.name]"] = pocket_content
photo_images["[pocket_to_check.name]" + "[pocket_content.name]"] = image(icon = pocket_content.icon, icon_state = pocket_content.icon_state)
var/image/pocket_image = image(icon = pocket_content.icon, icon_state = pocket_content.icon_state)
if(pocket_content.color)
pocket_image.color = pocket_content.color
if(pocket_content.overlays)
for(var/overlay in pocket_content.overlays)
pocket_image.overlays += overlay
photo_images["[pocket_to_check.name]" + "[pocket_content.name]"] = pocket_image
/obj/item/gripper/attack_self(mob/user as mob)
generate_icons()
@@ -587,6 +618,9 @@
drop_item()
/obj/item/gripper/proc/drop_item()
if(!wrapped)
to_chat(src, span_warning("You have nothing to drop!"))
return
if((wrapped == current_pocket && !istype(wrapped.loc, /obj/item/storage/internal/gripper))) //We have wrapped selected as our current_pocket AND wrapped is not in a gripper storage
wrapped = null
current_pocket = pick(pockets)
@@ -668,6 +702,10 @@
else
wrapped = null
return
if((QDELETED(wrapped) || (wrapped.loc != current_pocket))) //We put our wrapped thing INTO something!
wrapped = null
current_pocket = pick(pockets)
return
else if(current_pocket_full) //Pocket is full. No grabbing more things.
to_chat(user, "Your gripper is currently full! You can't pick anything else up!")
return
@@ -732,7 +770,6 @@
user.visible_message(span_danger("[user] removes the power cell from [A]!"), "You remove the power cell.")
//Different types of grippers!
/obj/item/gripper/engineering
@@ -29,6 +29,7 @@
var/pixel_x = 0
var/icon_x = 32
var/icon_y = 32
var/dogborg_sprites = FALSE //If we have dogborg sprites or not. Used for puppyjaws.
var/is_whitelisted = FALSE
var/whitelist_ckey
@@ -205,6 +206,23 @@
return
/datum/robot_sprite/proc/do_equipment_glamour(var/obj/item/robot_module/module)
if(!dogborg_sprites)
var/obj/item/melee/robotic/jaws/small/small_jaws = locate() in module.modules
if(small_jaws)
small_jaws.name = "self defense knife"
small_jaws.icon = 'icons/obj/tools_robot.dmi'
small_jaws.icon_state = "knife_cyborg"
small_jaws.hitsound = 'sound/weapons/slash.ogg'
small_jaws.desc = "A sharp knife used for defending crew against hostile threats. Not effective for non-defense use. If emagged, can be upgraded to a claymore."
small_jaws.attack_verb = list("sliced", "slashed", "jabbed", "stabbed")
var/obj/item/melee/robotic/jaws/big/big_jaws = locate() in module.modules
if(big_jaws)
big_jaws.name = "claymore"
big_jaws.desc = "Now this is a knife!"
big_jaws.icon = 'icons/obj/tools_robot.dmi'
big_jaws.icon_state = "claymore_cyborg"
big_jaws.hitsound = 'sound/weapons/slice.ogg'
big_jaws.attack_verb = list("sliced", "slashed", "jabbed", "stabbed")
return
// Dogborgs and not-dogborgs that use dogborg stuff. Oh no.
@@ -221,20 +239,7 @@
pixel_x = -16
icon_x = 64
icon_y = 32
/datum/robot_sprite/dogborg/do_equipment_glamour(var/obj/item/robot_module/module)
if(!has_custom_equipment_sprites)
return
var/obj/item/tool/crowbar/cyborg/C = locate() in module.modules
if(C)
C.name = "puppy jaws"
C.desc = "The jaws of a small dog. Still strong enough to pry things."
C.icon = 'icons/mob/dogborg_vr.dmi'
C.icon_state = "smalljaws_textless"
C.hitsound = 'sound/weapons/bite.ogg'
C.attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
dogborg_sprites = TRUE
/datum/robot_sprite/dogborg/tall
has_dead_sprite_overlay = FALSE
@@ -242,7 +247,7 @@
vis_height = 64
icon_x = 64
icon_y = 64
dogborg_sprites = FALSE
// Default module sprite
@@ -89,11 +89,11 @@
has_custom_equipment_sprites = TRUE
/datum/robot_sprite/dogborg/tall/combat/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/melee/robotic/blade/dagger/CBB = locate() in module.modules
if(CBB)
CBB.name = "sword tail"
@@ -202,11 +202,11 @@
has_eye_sprites = FALSE
/datum/robot_sprite/dogborg/wide/combat/blade/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/melee/robotic/blade/CBB = locate() in module.modules
if(CBB)
CBB.name = "combat saw"
@@ -20,11 +20,11 @@
sprite_icon = 'icons/mob/robot/lost_wide.dmi'
/datum/robot_sprite/dogborg/lost/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/SP = locate() in module.modules
if(SP)
SP.name = "paws of life"
@@ -138,17 +138,4 @@
module_type = list("Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security", "Research")
sprite_flags = ROBOT_HAS_SHIELD_SPRITE | ROBOT_HAS_DISABLER_SPRITE | ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE
/datum/robot_sprite/fluff/catborg/do_equipment_glamour(var/obj/item/robot_module/module)
if(!has_custom_equipment_sprites)
return
var/obj/item/tool/crowbar/cyborg/C = locate() in module.modules
if(C)
C.name = "puppy jaws"
C.desc = "The jaws of a small dog. Still strong enough to pry things."
C.icon = 'icons/mob/dogborg_vr.dmi'
C.icon_state = "smalljaws_textless"
C.hitsound = 'sound/weapons/bite.ogg'
C.attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
#undef CUSTOM_BORGSPRITE
@@ -236,11 +236,11 @@
sprite_icon = 'icons/mob/robot/surgical_wide.dmi'
/datum/robot_sprite/dogborg/surgical/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/SP = locate() in module.modules
if(SP)
SP.name = "paws of life"
@@ -275,11 +275,11 @@
sprite_icon = 'icons/mob/robot/surgical_large.dmi'
/datum/robot_sprite/dogborg/tall/surgical/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/SP = locate() in module.modules
if(SP)
SP.name = "paws of life"
@@ -360,11 +360,11 @@
return ..()
*/
/datum/robot_sprite/dogborg/crisis/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/SP = locate() in module.modules
if(SP)
SP.name = "paws of life"
@@ -413,11 +413,10 @@
sprite_icon = 'icons/mob/robot/crisis_large.dmi'
/datum/robot_sprite/dogborg/tall/crisis/do_equipment_glamour(var/obj/item/robot_module/module)
if(!has_custom_equipment_sprites)
return
..()
if(!has_custom_equipment_sprites)
return
var/obj/item/shockpaddles/robot/SP = locate() in module.modules
if(SP)
SP.name = "paws of life"
@@ -104,11 +104,11 @@
sprite_icon = 'icons/mob/robot/science_wide.dmi'
/datum/robot_sprite/dogborg/science/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/jumper/J = locate() in module.modules
if(J)
J.name = "jumper paws"
@@ -154,11 +154,11 @@
sprite_icon = 'icons/mob/robot/science_large.dmi'
/datum/robot_sprite/dogborg/tall/science/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/jumper/J = locate() in module.modules
if(J)
J.name = "jumper paws"
@@ -228,11 +228,11 @@
sprite_hud_icon_state = "malf"
/datum/robot_sprite/dogborg/combat_medic/do_equipment_glamour(var/obj/item/robot_module/module)
..()
if(!has_custom_equipment_sprites)
return
..()
var/obj/item/shockpaddles/robot/SP = locate() in module.modules
if(SP)
SP.name = "paws of life"