@@ -216,13 +145,3 @@
"}
output += ..()
return output
-
-/obj/mecha/combat/marauder/Topic(href, href_list)
- ..()
- if (href_list["toggle_thrusters"])
- src.toggle_thrusters()
- if (href_list["smoke"])
- src.smoke()
- if (href_list["toggle_zoom"])
- src.zoom()
- return
\ No newline at end of file
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 48394f47f4..90ac9ad789 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -17,9 +17,6 @@
//operation_req_access = list()
internal_damage_threshold = 25
force = 15
- var/phasing = 0
- var/can_phase = TRUE
- var/phasing_energy_drain = 200
max_equip = 4
max_hull_equip = 3
@@ -28,6 +25,9 @@
max_universal_equip = 3
max_special_equip = 4
+ phasing_possible = 1
+ switch_dmg_type_possible = 1
+
/obj/mecha/combat/phazon/equipped/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd
@@ -36,6 +36,7 @@
ME.attach(src)
return
+/* Leaving this until we are really sure we don't need it for reference.
/obj/mecha/combat/phazon/Bump(var/atom/obstacle)
if(phasing && get_charge()>=phasing_energy_drain)
spawn()
@@ -49,35 +50,8 @@
else
. = ..()
return
+*/
-/obj/mecha/combat/phazon/click_action(atom/target,mob/user)
- if(phasing)
- src.occupant_message("Unable to interact with objects while phasing")
- return
- else
- return ..()
-
-/obj/mecha/combat/phazon/verb/switch_damtype()
- set category = "Exosuit Interface"
- set name = "Change melee damage type"
- set src = usr.loc
- set popup_menu = 0
- if(usr!=src.occupant)
- return
-
- query_damtype()
-
-/obj/mecha/combat/phazon/proc/query_damtype()
- var/new_damtype = alert(src.occupant,"Melee Damage Type",null,"Brute","Fire","Toxic")
- switch(new_damtype)
- if("Brute")
- damtype = "brute"
- if("Fire")
- damtype = "fire"
- if("Toxic")
- damtype = "tox"
- src.occupant_message("Melee damage type switched to [new_damtype ]")
- return
/obj/mecha/combat/phazon/get_commands()
var/output = {"
@@ -91,15 +65,7 @@
output += ..()
return output
-/obj/mecha/combat/phazon/Topic(href, href_list)
- ..()
- if (href_list["switch_damtype"])
- src.switch_damtype()
- if (href_list["phasing"])
- phasing = !phasing
- send_byjax(src.occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing")
- src.occupant_message("
En":"#f00\">Dis"]abled phasing.")
- return
+
/obj/mecha/combat/phazon/janus
name = "Phazon Prototype Janus Class"
@@ -121,7 +87,6 @@
wreckage = /obj/effect/decal/mecha_wreckage/janus
internal_damage_threshold = 25
force = 20
- phasing = FALSE
phasing_energy_drain = 300
max_hull_equip = 2
@@ -130,6 +95,9 @@
max_universal_equip = 2
max_special_equip = 2
+ phasing_possible = 1
+ switch_dmg_type_possible = 1
+
/obj/mecha/combat/phazon/janus/take_damage(amount, type="brute")
..()
if(phasing)
diff --git a/code/game/mecha/equipment/tools/speedboost.dm b/code/game/mecha/equipment/tools/speedboost.dm
index 1cb0df9469..6e7ad06f69 100644
--- a/code/game/mecha/equipment/tools/speedboost.dm
+++ b/code/game/mecha/equipment/tools/speedboost.dm
@@ -10,9 +10,9 @@
/obj/item/mecha_parts/mecha_equipment/speedboost/attach(obj/mecha/M as obj)
..()
if(enable_special)
- chassis.step_in = (chassis.step_in-2) // Make the ripley as fast as a durand
+ chassis.step_in = 3 // As fast as a gygax without overload. Slower than Ody.
else
- chassis.step_in = (chassis.step_in+1) // Improper parts slow the mech down
+ chassis.step_in = 6 // Improper parts slow the mech down
return
/obj/item/mecha_parts/mecha_equipment/speedboost/detach()
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 1b00505bc9..f62262081d 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -80,6 +80,7 @@
var/obj/item/mecha_parts/mecha_equipment/selected
var/max_equip = 2
var/datum/events/events
+
//mechaequipt2 stuffs
var/list/hull_equipment = new
var/list/weapon_equipment = new
@@ -91,6 +92,7 @@
var/max_utility_equip = 2
var/max_universal_equip = 2
var/max_special_equip = 1
+
//Working exosuit vars
var/list/cargo = list()
var/cargo_capacity = 3
@@ -100,8 +102,62 @@
var/static/image/radial_image_lighttoggle = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_light")
var/static/image/radial_image_statpanel = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine2")
+<<<<<<< HEAD
var/datum/mini_hud/mech/minihud //VOREStation Edit
var/strafing = 0
+=======
+
+//Mech actions
+
+ var/strafing = 0 //Are we strafing or not?
+
+ var/defence_mode_possible = 0 //Can we even use defence mode? This is used to assign it to mechs and check for verbs.
+ var/defence_mode = 0 //Are we in defence mode
+ var/defence_deflect = 35 //How much it deflect
+
+ var/overload_possible = 0 //Same as above. Don't forget to GRANT the verb&actions if you want everything to work proper.
+ var/overload = 0 //Are our legs overloaded
+ var/overload_coeff = 1 //How much extra energy you use when use the L E G
+
+ var/zoom = 0
+ var/zoom_possible = 0
+
+ var/thrusters = 0
+ var/thrusters_possible = 0
+
+ var/phasing = 0 //Are we currently phasing
+ var/phasing_possible = 0 //This is to allow phasing.
+ var/can_phase = TRUE //This is an internal check during the relevant procs.
+ var/phasing_energy_drain = 200
+
+ var/switch_dmg_type_possible = 0 //Can you switch damage type? It is mostly for the Phazon and its children.
+
+ var/smoke_possible = 0
+ var/smoke_reserve = 5 //How many shots you have. Might make a reload later on. MIGHT.
+ var/smoke_ready = 1 //This is a check for the whether or not the cooldown is ongoing.
+ var/smoke_cooldown = 100 //How long you have between uses.
+ var/datum/effect/effect/system/smoke_spread/smoke_system = new
+
+////All of those are for the HUD buttons in the top left. See Grant and Remove procs in mecha_actions.
+
+ var/datum/action/innate/mecha/mech_eject/eject_action = new
+ var/datum/action/innate/mecha/mech_toggle_internals/internals_action = new
+ var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new
+ var/datum/action/innate/mecha/mech_view_stats/stats_action = new
+ var/datum/action/innate/mecha/strafe/strafing_action = new
+
+ var/datum/action/innate/mecha/mech_defence_mode/defence_action = new
+ var/datum/action/innate/mecha/mech_overload_mode/overload_action = new
+ var/datum/action/innate/mecha/mech_smoke/smoke_action = new
+ var/datum/action/innate/mecha/mech_zoom/zoom_action = new
+ var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new
+ var/datum/action/innate/mecha/mech_cycle_equip/cycle_action = new
+ var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new
+ var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new
+
+
+
+>>>>>>> ce9ceb4... Add clickable action buttons from /TG/, rework a lot of backend and other improvements. (#7315)
/obj/mecha/drain_power(var/drain_check)
@@ -123,8 +179,14 @@
if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP
removeVerb(/obj/mecha/verb/connect_to_port)
removeVerb(/obj/mecha/verb/toggle_internal_tank)
+
spark_system.set_up(2, 0, src)
spark_system.attach(src)
+
+ if(smoke_possible)//I am pretty sure that's needed here.
+ src.smoke_system.set_up(3, 0, src)
+ src.smoke_system.attach(src)
+
add_cell()
add_iterators()
removeVerb(/obj/mecha/verb/disconnect_from_port)
@@ -192,6 +254,9 @@
cell = null
internal_tank = null
+ if(smoke_possible) //Just making sure nothing is running.
+ qdel(smoke_system)
+
QDEL_NULL(pr_int_temp_processor)
QDEL_NULL(pr_inertial_movement)
QDEL_NULL(pr_give_air)
@@ -283,11 +348,11 @@
if(65 to 85)
. += "It's slightly damaged."
if(45 to 65)
- . += "It's badly damaged."
+ . += "
It's badly damaged."
if(25 to 45)
- . += "It's heavily damaged."
+ . += "
It's heavily damaged."
else
- . += "It's falling apart."
+ . += "
It's falling apart. "
if(equipment?.len)
. += "It's equipped with:"
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
@@ -319,6 +384,7 @@
"Toggle Light" = radial_image_lighttoggle,
"View Stats" = radial_image_statpanel
)
+
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_occupant_radial, user), require_near = TRUE, tooltips = TRUE)
if(!check_occupant_radial(user))
return
@@ -380,6 +446,11 @@
if(state)
occupant_message("
Maintenance protocols in effect")
return
+
+ if(phasing)//Phazon and other mechs with phasing.
+ src.occupant_message("Unable to interact with objects while phasing")//Haha dumbass.
+ return
+
if(!get_charge()) return
if(src == target) return
var/dir_to_target = get_dir(src,target)
@@ -463,6 +534,13 @@
if(state)
occupant_message("
Maintenance protocols in effect")
return
+/*
+ if(zoom)
+ if(world.time - last_message > 20)
+ src.occupant_message("Unable to move while in zoom mode.")
+ last_message = world.time
+ return 0
+*/
return domove(direction)
/obj/mecha/proc/can_ztravel()
@@ -482,6 +560,32 @@
if(!has_charge(step_energy_drain))
return 0
+ //Can we even move, below is if yes.
+
+ if(defence_mode)//Check if we are currently locked down
+ if(world.time - last_message > 20)
+ src.occupant_message("
Unable to move while in defence mode")
+ last_message = world.time
+ return 0
+
+ if(zoom)//:eyes:
+ if(world.time - last_message > 20)
+ src.occupant_message("Unable to move while in zoom mode.")
+ last_message = world.time
+ return 0
+
+ if(!thrusters && src.pr_inertial_movement.active()) //I think this mean 'if you try to move in space without thruster, u no move'
+ return 0
+
+ if(overload)//Check if you have leg overload
+ health--
+ if(health < initial(health) - initial(health)/3)
+ overload = 0
+ step_in = initial(step_in)
+ step_energy_drain = initial(step_energy_drain)
+ src.occupant_message("
Leg actuators damage threshold exceded. Disabling overload.")
+
+
var/move_result = 0
if(hasInternalDamage(MECHA_INT_CONTROL_LOST))
@@ -572,21 +676,35 @@
/obj/mecha/Bump(var/atom/obstacle)
// src.inertia_dir = null
- if(istype(obstacle, /obj))
+ if(istype(obstacle, /mob))//First we check if it is a mob. Mechs mostly shouln't go through them, even while phasing.
+ var/mob/M = obstacle
+ M.Move(get_step(obstacle,src.dir))
+ else if(istype(obstacle, /obj))//Then we check for regular obstacles.
var/obj/O = obstacle
- if(istype(O, /obj/effect/portal)) //derpfix
- src.anchored = 0
+
+ if(phasing && get_charge()>=phasing_energy_drain)//Phazon check. This could use an improvement elsewhere.
+ spawn()
+ if(can_phase)
+ can_phase = FALSE
+ flick("[initial_icon]-phase", src)
+ src.loc = get_step(src,src.dir)
+ src.use_power(phasing_energy_drain)
+ sleep(step_in*3)
+ can_phase = TRUE
+ occupant_message("Phazed.")
+ . = ..(obstacle)
+ return
+ if(istype(O, /obj/effect/portal)) //derpfix
+ src.anchored = 0 //I have no idea what this really fix.
O.Crossed(src)
spawn(0)//countering portal teleport spawn(0), hurr
src.anchored = 1
- else if(!O.anchored)
- step(obstacle,src.dir)
- else //I have no idea why I disabled this
+ else if(O.anchored)
obstacle.Bumped(src)
- else if(istype(obstacle, /mob))
- var/mob/M = obstacle
- M.Move(get_step(obstacle,src.dir))
- else
+ else
+ step(obstacle,src.dir)
+
+ else//No idea when this triggers, so i won't touch it.
. = ..(obstacle)
return
@@ -1229,6 +1347,9 @@
set category = "Exosuit Interface"
set src = usr.loc
set popup_menu = 0
+ lights()
+
+/obj/mecha/verb/lights()
if(usr!=occupant) return
lights = !lights
if(lights) set_light(light_range + lights_power)
@@ -1244,18 +1365,25 @@
set category = "Exosuit Interface"
set src = usr.loc
set popup_menu = 0
+ internal_tank()
+
+/obj/mecha/proc/internal_tank()
if(usr!=src.occupant)
return
use_internal_tank = !use_internal_tank
src.occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
src.log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
+ playsound(src, 'sound/mecha/gasdisconnected.ogg', 30, 1)
return
+
/obj/mecha/verb/toggle_strafing()
set name = "Toggle strafing"
set category = "Exosuit Interface"
set src = usr.loc
set popup_menu = 0
+
+/obj/mecha/proc/strafing()
if(usr!=src.occupant)
return
strafing = !strafing
@@ -1324,6 +1452,8 @@
if(enter_after(40,usr))
if(!src.occupant)
moved_inside(usr)
+ if(ishuman(occupant)) //Aeiou
+ GrantActions(occupant, 1)
else if(src.occupant!=usr)
to_chat(usr, "[src.occupant] was faster. Try better next time, loser.")
else
@@ -1345,8 +1475,31 @@
src.verbs += /obj/mecha/verb/eject
src.log_append_to_last("[H] moved in as pilot.")
src.icon_state = src.reset_icon()
+<<<<<<< HEAD
if(occupant.hud_used)
minihud = new (occupant.hud_used, src)
+=======
+
+//This part removes all the verbs if you don't have them the _possible on your mech. This is a little clunky, but it lets you just add that to any mech.
+//And it's not like this 10yo code wasn't clunky before.
+
+ if(!smoke_possible) //Can't use smoke? No verb for you.
+ verbs -= /obj/mecha/verb/toggle_smoke
+ if(!thrusters_possible) //Can't use thrusters? No verb for you.
+ verbs -= /obj/mecha/verb/toggle_thrusters
+ if(!defence_mode_possible) //Do i need to explain everything?
+ verbs -= /obj/mecha/verb/toggle_defence_mode
+ if(!overload_possible)
+ verbs -= /obj/mecha/verb/toggle_overload
+ if(!zoom_possible)
+ verbs -= /obj/mecha/verb/toggle_zoom
+ if(!phasing_possible)
+ verbs -= /obj/mecha/verb/toggle_phasing
+ if(!switch_dmg_type_possible)
+ verbs -= /obj/mecha/verb/switch_damtype
+
+ occupant.in_enclosed_vehicle = 1 //Useful for when you need to know if someone is in a mecho.
+>>>>>>> ce9ceb4... Add clickable action buttons from /TG/, rework a lot of backend and other improvements. (#7315)
update_cell_alerts()
update_damage_alerts()
set_dir(dir_in)
@@ -1415,6 +1568,7 @@
QDEL_NULL(minihud)
if(ishuman(occupant))
mob_container = src.occupant
+ RemoveActions(occupant, human_occupant=1)//AEIOU
else if(istype(occupant, /mob/living/carbon/brain))
var/mob/living/carbon/brain/brain = occupant
mob_container = brain.container
@@ -1434,10 +1588,19 @@
occupant.canmove = 0
occupant.clear_alert("charge")
occupant.clear_alert("mech damage")
+ occupant.in_enclosed_vehicle = 0
occupant = null
icon_state = src.reset_icon()+"-open"
set_dir(dir_in)
verbs -= /obj/mecha/verb/eject
+
+ //src.zoom = 0
+
+ // Doesn't seem needed.
+ if(src.occupant && src.occupant.client)
+ src.occupant.client.view = world.view
+ src.zoom = 0
+
strafing = 0
return
@@ -1567,7 +1730,18 @@
Lights: [lights?"on":"off"]
[src.dna?"
DNA-locked: [src.dna] \[
Reset\]
":null]
"}
-//Cargo components.
+
+
+ if(defence_mode_possible)
+ output += "
Defence mode: [defence_mode?"on":"off"]"
+ if(overload_possible)
+ output += "
Leg actuators overload: [overload?"on":"off"]"
+ if(smoke_possible)
+ output += "
Smoke: [smoke_reserve]
"
+ if(thrusters_possible)
+ output += "
Thrusters: [thrusters?"on":"off"]
"
+
+//Cargo components. Keep this last otherwise it does weird alignment issues.
output += "
Cargo Compartment Contents:"
if(src.cargo.len)
for(var/obj/O in src.cargo)
@@ -1769,12 +1943,31 @@
return
if(href_list["toggle_lights"])
if(usr != src.occupant) return
- src.toggle_lights()
+ src.lights()
return
+/*
+ if(href_list["toggle_strafing"])
+ if(usr != src.occupant) return
+ src.strafing()
+ return*/
+
if(href_list["toggle_airtank"])
if(usr != src.occupant) return
- src.toggle_internal_tank()
+ src.internal_tank()
return
+ if (href_list["toggle_thrusters"])
+ src.toggle_thrusters()
+ if (href_list["smoke"])
+ src.smoke()
+ if (href_list["toggle_zoom"])
+ src.zoom()
+ if(href_list["toggle_defence_mode"])
+ src.defence_mode()
+ if(href_list["switch_damtype"])
+ src.switch_damtype()
+ if(href_list["phasing"])
+ src.phasing()
+
if(href_list["rmictoggle"])
if(usr != src.occupant) return
radio.broadcasting = !radio.broadcasting
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
new file mode 100644
index 0000000000..0d2034d790
--- /dev/null
+++ b/code/game/mecha/mecha_actions.dm
@@ -0,0 +1,421 @@
+//AEIOU
+//
+//THIS FILE CONTAINS THE CODE TO ADD THE HUD BUTTONS AND THE MECH ACTIONS THEMSELVES.
+//
+//
+// I better get some free food for this..
+
+
+
+//
+/// Adding the buttons things to the player. The interactive, top left things, at least at time of writing.
+/// If you want it to be only for a special mech, you have to go and make an override like in the durand mech.
+//
+
+/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0)
+ if(human_occupant)
+ eject_action.Grant(user, src)
+ internals_action.Grant(user, src)
+ cycle_action.Grant(user, src)
+ lights_action.Grant(user, src)
+ stats_action.Grant(user, src)
+ strafing_action.Grant(user, src)//The defaults.
+
+ if(defence_mode_possible)
+ defence_action.Grant(user, src)
+ if(overload_possible)
+ overload_action.Grant(user, src)
+ if(smoke_possible)
+ smoke_action.Grant(user, src)
+ if(zoom_possible)
+ zoom_action.Grant(user, src)
+ if(thrusters_possible)
+ thrusters_action.Grant(user, src)
+ if(phasing_possible)
+ phasing_action.Grant(user, src)
+ if(switch_dmg_type_possible)
+ switch_damtype_action.Grant(user, src)
+
+/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0)
+ if(human_occupant)
+ eject_action.Remove(user, src)
+ internals_action.Remove(user, src)
+ cycle_action.Remove(user, src)
+ lights_action.Remove(user, src)
+ stats_action.Remove(user, src)
+ strafing_action.Remove(user, src)
+
+ defence_action.Remove(user, src)
+ smoke_action.Remove(user, src)
+ zoom_action.Remove(user, src)
+ thrusters_action.Remove(user, src)
+ phasing_action.Remove(user, src)
+ switch_damtype_action.Remove(user, src)
+ overload_action.Remove(user, src)
+
+
+
+//
+////BUTTONS STUFF
+//
+
+/datum/action/innate/mecha
+ check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_ALIVE
+ button_icon = 'icons/effects/actions_mecha.dmi'
+ var/obj/mecha/chassis
+
+/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M)
+ if(M)
+ chassis = M
+ ..()
+
+
+/datum/action/innate/mecha/mech_toggle_lights
+ name = "Toggle Lights"
+ button_icon_state = "mech_lights_off"
+
+/datum/action/innate/mecha/mech_toggle_lights/Activate()
+ button_icon_state = "mech_lights_[chassis.lights ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.lights()
+
+
+
+/datum/action/innate/mecha/mech_toggle_internals
+ name = "Toggle Internal Airtank Usage"
+ button_icon_state = "mech_internals_off"
+
+/datum/action/innate/mecha/mech_toggle_internals/Activate()
+ button_icon_state = "mech_internals_[chassis.use_internal_tank ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.internal_tank()
+
+
+
+/datum/action/innate/mecha/mech_view_stats
+ name = "View stats"
+ button_icon_state = "mech_view_stats"
+
+/datum/action/innate/mecha/mech_view_stats/Activate()
+ chassis.view_stats()
+
+
+
+/datum/action/innate/mecha/mech_eject
+ name = "Eject From Mech"
+ button_icon_state = "mech_eject"
+
+/datum/action/innate/mecha/mech_eject/Activate()
+ chassis.go_out()
+
+
+
+/datum/action/innate/mecha/strafe
+ name = "Toggle Mech Strafing"
+ button_icon_state = "mech_strafe_off"
+
+/datum/action/innate/mecha/strafe/Activate()
+ button_icon_state = "mech_strafe_[chassis.strafing ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.strafing()
+
+
+
+/datum/action/innate/mecha/mech_defence_mode
+ name = "Toggle Mech defence mode"
+ button_icon_state = "mech_defense_mode_off"
+
+/datum/action/innate/mecha/mech_defence_mode/Activate()
+ button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.defence_mode()
+
+
+
+/datum/action/innate/mecha/mech_overload_mode
+ name = "Toggle Mech Leg Overload"
+ button_icon_state = "mech_overload_off"
+
+/datum/action/innate/mecha/mech_overload_mode/Activate()
+ button_icon_state = "mech_overload_[chassis.overload ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.overload()
+
+
+
+/datum/action/innate/mecha/mech_smoke
+ name = "Toggle Mech Smoke"
+ button_icon_state = "mech_smoke_off"
+
+/datum/action/innate/mecha/mech_smoke/Activate()
+ //button_icon_state = "mech_smoke_[chassis.smoke ? "off" : "on"]"
+ //button.UpdateIcon() //Dual colors notneeded ATM
+ chassis.smoke()
+
+
+
+/datum/action/innate/mecha/mech_zoom
+ name = "Toggle Mech Zoom"
+ button_icon_state = "mech_zoom_off"
+
+/datum/action/innate/mecha/mech_zoom/Activate()
+ button_icon_state = "mech_zoom_[chassis.zoom ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.zoom()
+
+
+
+/datum/action/innate/mecha/mech_toggle_thrusters
+ name = "Toggle Mech thrusters"
+ button_icon_state = "mech_thrusters_off"
+
+/datum/action/innate/mecha/mech_toggle_thrusters/Activate()
+ button_icon_state = "mech_thrusters_[chassis.thrusters ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.thrusters()
+
+
+
+/datum/action/innate/mecha/mech_cycle_equip //I'll be honest, i don't understand this part, buuuuuut it works!
+ name = "Cycle Equipment"
+ button_icon_state = "mech_cycle_equip_off"
+
+/datum/action/innate/mecha/mech_cycle_equip/Activate()
+
+ var/list/available_equipment = list()
+ available_equipment = chassis.equipment
+
+ if(available_equipment.len == 0)
+ chassis.occupant_message("No equipment available.")
+ return
+ if(!chassis.selected)
+ chassis.selected = available_equipment[1]
+ chassis.occupant_message("You select [chassis.selected]")
+ send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
+ button_icon_state = "mech_cycle_equip_on"
+ button.UpdateIcon()
+ return
+ var/number = 0
+ for(var/A in available_equipment)
+ number++
+ if(A == chassis.selected)
+ if(available_equipment.len == number)
+ chassis.selected = null
+ chassis.occupant_message("You switch to no equipment")
+ button_icon_state = "mech_cycle_equip_off"
+ else
+ chassis.selected = available_equipment[number+1]
+ chassis.occupant_message("You switch to [chassis.selected]")
+ button_icon_state = "mech_cycle_equip_on"
+ send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
+ button.UpdateIcon()
+ return
+
+
+
+/datum/action/innate/mecha/mech_switch_damtype
+ name = "Reconfigure arm microtool arrays"
+ button_icon_state = "mech_damtype_brute"
+
+
+/datum/action/innate/mecha/mech_switch_damtype/Activate()
+
+
+ button_icon_state = "mech_damtype_[chassis.damtype]"
+ playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1)
+ button.UpdateIcon()
+ chassis.query_damtype()
+
+
+
+/datum/action/innate/mecha/mech_toggle_phasing
+ name = "Toggle Mech phasing"
+ button_icon_state = "mech_phasing_off"
+
+/datum/action/innate/mecha/mech_toggle_phasing/Activate()
+ button_icon_state = "mech_phasing_[chassis.phasing ? "off" : "on"]"
+ button.UpdateIcon()
+ chassis.phasing()
+
+
+
+
+
+/////
+/////
+///// ACTUAL MECANICS FOR THE ACTIONS
+///// OVERLOAD, DEFENCE, SMOKE
+/////
+/////
+
+
+/obj/mecha/verb/toggle_defence_mode()
+ set category = "Exosuit Interface"
+ set name = "Toggle defence mode"
+ set src = usr.loc
+ set popup_menu = 0
+ defence_mode()
+
+/obj/mecha/proc/defence_mode()
+ if(usr!=src.occupant)
+ return
+ playsound(src, 'sound/mecha/duranddefencemode.ogg', 50, 1)
+ defence_mode = !defence_mode
+ if(defence_mode)
+ deflect_chance = defence_deflect
+ src.occupant_message("
You enable [src] defence mode.")
+ else
+ deflect_chance = initial(deflect_chance)
+ src.occupant_message("
You disable [src] defence mode.")
+ src.log_message("Toggled defence mode.")
+ return
+
+
+
+/obj/mecha/verb/toggle_overload()
+ set category = "Exosuit Interface"
+ set name = "Toggle leg actuators overload"
+ set src = usr.loc
+ set popup_menu = 0
+ overload()
+
+/obj/mecha/proc/overload()
+ if(usr.stat == 1)//No manipulating things while unconcious.
+ return
+ if(usr!=src.occupant)
+ return
+ if(health < initial(health) - initial(health)/3)//Same formula as in movement, just beforehand.
+ src.occupant_message("
Leg actuators damage critical, unable to engage overload.")
+ overload = 0 //Just to be sure
+ return
+ if(overload)
+ overload = 0
+ step_in = initial(step_in)
+ step_energy_drain = initial(step_energy_drain)
+ src.occupant_message("
You disable leg actuators overload.")
+ else
+ overload = 1
+ step_in = min(1, round(step_in/2))
+ step_energy_drain = step_energy_drain*overload_coeff
+ src.occupant_message("
You enable leg actuators overload.")
+ src.log_message("Toggled leg actuators overload.")
+ playsound(src, 'sound/mecha/mechanical_toggle.ogg', 50, 1)
+ return
+
+
+/obj/mecha/verb/toggle_smoke()
+ set category = "Exosuit Interface"
+ set name = "Activate Smoke"
+ set src = usr.loc
+ set popup_menu = 0
+ smoke()
+
+/obj/mecha/proc/smoke()
+ if(usr!=src.occupant)
+ return
+
+ if(smoke_reserve < 1)
+ src.occupant_message("
You don't have any smoke left in stock!")
+ return
+
+ if(smoke_ready)
+ smoke_reserve-- //Remove ammo
+ src.occupant_message("
Smoke fired. [smoke_reserve] usages left.")
+
+ var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
+ smoke.attach(src)
+ smoke.set_up(10, 0, usr.loc)
+ smoke.start()
+ playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3)
+
+ smoke_ready = 0
+ spawn(smoke_cooldown)
+ smoke_ready = 1
+ return
+
+
+
+/obj/mecha/verb/toggle_zoom()
+ set category = "Exosuit Interface"
+ set name = "Zoom"
+ set src = usr.loc
+ set popup_menu = 0
+ zoom()
+
+/obj/mecha/proc/zoom()//This could use improvements but maybe later.
+ if(usr!=src.occupant)
+ return
+ if(src.occupant.client)
+ src.zoom = !src.zoom
+ src.log_message("Toggled zoom mode.")
+ src.occupant_message("
Zoom mode [zoom?"en":"dis"]abled.")
+ if(zoom)
+ src.occupant.set_viewsize(12)
+ src.occupant << sound('sound/mecha/imag_enh.ogg',volume=50)
+ else
+ src.occupant.set_viewsize() // Reset to default
+ return
+
+
+
+/obj/mecha/verb/toggle_thrusters()
+ set category = "Exosuit Interface"
+ set name = "Toggle thrusters"
+ set src = usr.loc
+ set popup_menu = 0
+ thrusters()
+
+/obj/mecha/proc/thrusters()
+ if(usr!=src.occupant)
+ return
+ if(src.occupant)
+ if(get_charge() > 0)
+ thrusters = !thrusters
+ src.log_message("Toggled thrusters.")
+ src.occupant_message("
Thrusters [thrusters?"en":"dis"]abled.")
+ return
+
+
+
+/obj/mecha/verb/switch_damtype()
+ set category = "Exosuit Interface"
+ set name = "Change melee damage type"
+ set src = usr.loc
+ set popup_menu = 0
+ query_damtype()
+
+/obj/mecha/proc/query_damtype()
+ if(usr!=src.occupant)
+ return
+ var/new_damtype = alert(src.occupant,"Melee Damage Type",null,"Brute","Fire","Toxic")
+ switch(new_damtype)
+ if("Brute")
+ damtype = "brute"
+ src.occupant_message("Your exosuit's hands form into fists.")
+ if("Fire")
+ damtype = "fire"
+ src.occupant_message("A torch tip extends from your exosuit's hand, glowing red.")
+ if("Toxic")
+ damtype = "tox"
+ src.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.")
+ src.occupant_message("Melee damage type switched to [new_damtype]")
+ return
+
+
+
+/obj/mecha/verb/toggle_phasing()
+ set category = "Exosuit Interface"
+ set name = "Toggle phasing"
+ set src = usr.loc
+ set popup_menu = 0
+ phasing()
+
+/obj/mecha/proc/phasing()
+ if(usr!=src.occupant)
+ return
+ phasing = !phasing
+ send_byjax(src.occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing")
+ src.occupant_message("
En":"#f00\">Dis"]abled phasing.")
+ return
+
+
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 0b516955ef..511073270f 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -224,4 +224,8 @@
var/registered_z
- var/list/progressbars = null //for stacking do_after bars
\ No newline at end of file
+<<<<<<< HEAD
+ var/list/progressbars = null //for stacking do_after bars
+=======
+ var/in_enclosed_vehicle = 0 //For mechs and fighters ambiance. Can be used in other cases.
+>>>>>>> ce9ceb4... Add clickable action buttons from /TG/, rework a lot of backend and other improvements. (#7315)
diff --git a/icons/effects/actions_mecha.dmi b/icons/effects/actions_mecha.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..0a505767a3021ec6bedfbb260e2edf3d19bc3b7d
GIT binary patch
literal 7707
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