diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm
index 284e095333c..cea30327af1 100644
--- a/code/_onclick/hud/radial.dm
+++ b/code/_onclick/hud/radial.dm
@@ -18,10 +18,12 @@ GLOBAL_LIST_EMPTY(radial_menus)
/obj/screen/radial/slice/MouseEntered(location, control, params)
. = ..()
icon_state = "radial_slice_focus"
+ openToolTip(usr, src, params, title = name)
/obj/screen/radial/slice/MouseExited(location, control, params)
. = ..()
icon_state = "radial_slice"
+ closeToolTip(usr)
/obj/screen/radial/slice/Click(location, control, params)
if(usr.client == parent.current_user)
diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm
index ea94aa6407b..d8b893caaf9 100644
--- a/code/datums/mutable_appearance.dm
+++ b/code/datums/mutable_appearance.dm
@@ -10,4 +10,11 @@
MA.icon = icon
MA.icon_state = icon_state
MA.layer = layer
- return MA
\ No newline at end of file
+ return MA
+
+/mutable_appearance/clean
+/mutable_appearance/clean/New()
+ . = ..()
+ alpha = 255
+ opacity = 1
+ transform = null
\ No newline at end of file
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index c3c89231664..297e76cf19f 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -24,7 +24,7 @@
force = 5
armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items)
- var/can_move = 1
+ var/can_move = 0 // time of next allowed movement
var/mob/living/carbon/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
@@ -96,8 +96,8 @@
hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD)
-/obj/mecha/New()
- ..()
+/obj/mecha/Initialize()
+ . = ..()
events = new
icon_state += "-open"
add_radio()
@@ -124,13 +124,6 @@
////////////////////////
////// Helpers /////////
////////////////////////
-
-/obj/mecha/proc/removeVerb(verb_path)
- verbs -= verb_path
-
-/obj/mecha/proc/addVerb(verb_path)
- verbs += verb_path
-
/obj/mecha/proc/add_airtank()
internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
return internal_tank
@@ -159,7 +152,6 @@
radio.icon_state = icon_state
radio.subspace_transmission = 1
-
/obj/mecha/examine(mob/user)
..(user)
var/integrity = health/initial(health)*100
@@ -179,13 +171,10 @@
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
to_chat(user, "[bicon(ME)] [ME]")
-
-
/obj/mecha/hear_talk(mob/M, text)
if(M == occupant && radio.broadcasting)
radio.talk_into(M, text)
-
/obj/mecha/proc/click_action(atom/target, mob/user, params)
if(!occupant || occupant != user )
return
@@ -298,7 +287,7 @@
return domove(direction)
/obj/mecha/proc/domove(direction)
- if(!can_move)
+ if(can_move >= world.time)
return 0
if(!Process_Spacemove(direction))
return 0
@@ -327,12 +316,9 @@
move_result = mechstep(direction)
move_type = MECHAMOVE_STEP
- can_move = FALSE
- spawn(step_in)
- can_move = TRUE
-
if(move_result && move_type)
aftermove(move_type)
+ can_move = world.time + step_in
return TRUE
return FALSE
@@ -354,7 +340,6 @@
step_energy_drain = initial(step_energy_drain)
occupant_message("Leg actuators damage threshold exceded. Disabling overload.")
-
/obj/mecha/proc/mechturn(direction)
dir = direction
if(turnsound)
@@ -365,15 +350,13 @@
. = step(src, direction)
if(!.)
if(phasing && get_charge() >= phasing_energy_drain)
- if(can_move)
- can_move = 0
- . = TRUE
+ if(can_move < world.time)
+ . = FALSE // We lie to mech code and say we didn't get to move, because we want to handle power usage + cooldown ourself
flick("phazon-phase", src)
forceMove(get_step(src, direction))
use_power(phasing_energy_drain)
playsound(src, stepsound, 40, 1)
- spawn(step_in * 3)
- can_move = 1
+ can_move = world.time + (step_in * 3)
else if(stepsound)
playsound(src, stepsound, 40, 1)
@@ -382,8 +365,6 @@
if(. && stepsound)
playsound(src, stepsound, 40, 1)
-
-
/obj/mecha/Bump(var/atom/obstacle, bump_allowed)
if(throwing) //high velocity mechas in your face!
var/breakthrough = 0
@@ -1496,3 +1477,35 @@
else if(damtype == TOX)
visual_effect_icon = ATTACK_EFFECT_MECHTOXIN
..()
+
+/obj/mecha/CtrlClick(mob/living/L)
+ if(occupant != L || !istype(L))
+ return ..()
+
+ var/list/choices = list("Cancel / No Change" = mutable_appearance(icon = 'icons/mob/screen_gen.dmi', icon_state = "x"))
+ var/list/choices_to_refs = list()
+
+ for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment)
+ if(!MT.selectable || selected == MT)
+ continue
+ var/mutable_appearance/clean/MA = new(MT)
+ choices[MT.name] = MA
+ choices_to_refs[MT.name] = MT
+
+ var/choice = show_radial_menu(L, src, choices, radius = 48, custom_check = CALLBACK(src, .proc/check_menu, L))
+ if(!check_menu(L) || choice == "Cancel / No Change")
+ return
+
+ var/obj/item/mecha_parts/mecha_equipment/new_sel = LAZYACCESS(choices_to_refs, choice)
+ if(istype(new_sel))
+ selected = new_sel
+ occupant_message("You switch to [selected].")
+ visible_message("[src] raises [selected]")
+ send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list())
+
+/obj/mecha/proc/check_menu(mob/living/L)
+ if(L != occupant || !istype(L))
+ return FALSE
+ if(L.incapacitated())
+ return FALSE
+ return TRUE
\ No newline at end of file