Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
MosleyTheMalO committed May 20, 2024
2 parents 3a44ff3 + de83d33 commit 652a380
Show file tree
Hide file tree
Showing 11 changed files with 111 additions and 98 deletions.
1 change: 1 addition & 0 deletions code/__DEFINES/hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5"
#define ui_borg_pda_send "CENTER+5:21,SOUTH:5" // To the right of the alert panel
#define ui_borg_pda_log "CENTER+6:21,SOUTH:5"
#define ui_borg_movi "CENTER+7:21,SOUTH:5"
#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY
#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY

Expand Down
67 changes: 49 additions & 18 deletions code/_onclick/hud/robot.dm
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,26 @@
static_inventory += using
robit.thruster_button = using

//PDA message
using = new /atom/movable/screen/robot/pda_msg_send
using.screen_loc = ui_borg_pda_send
using.hud = src
static_inventory += using

//PDA log
using = new /atom/movable/screen/robot/pda_msg_show
using.screen_loc = ui_borg_pda_log
using.hud = src
static_inventory += using

//Intent
action_intent = new /atom/movable/screen/act_intent/robot()
action_intent.icon_state = mymob.a_intent
action_intent.hud = src
static_inventory += action_intent

assert_move_intent_ui(owner, TRUE)

//Health
healths = new /atom/movable/screen/healths/robot()
healths.hud = src
Expand Down Expand Up @@ -190,6 +204,41 @@
zone_select.update_icon()
static_inventory += zone_select

/datum/hud/robot/proc/assert_move_intent_ui(mob/living/silicon/robot/owner = mymob, on_new = FALSE)
var/atom/movable/screen/using
// delete old ones
var/list/atom/movable/screen/victims = list()
victims += locate(/atom/movable/screen/mov_intent) in static_inventory
victims += locate(/atom/movable/screen/sprintbutton) in static_inventory
if(victims)
static_inventory -= victims
if(mymob?.client)
mymob.client.screen -= victims
QDEL_LIST(victims)

// make new ones
// walk/run
using = new /atom/movable/screen/mov_intent
using.icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
using.screen_loc = ui_borg_movi
using.hud = src
using.update_icon()
static_inventory += using
if(!on_new)
owner?.client?.screen += using

if(!CONFIG_GET(flag/sprint_enabled))
return

// sprint button
using = new /atom/movable/screen/sprintbutton
using.icon = 'modular_citadel/icons/ui/screen_cyborg.dmi'
using.icon_state = owner.cansprint ? ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") : "act_sprint_locked"
using.screen_loc = ui_borg_movi
using.hud = src
static_inventory += using
if(!on_new)
owner?.client?.screen += using

/datum/hud/proc/toggle_show_robot_modules()
if(!iscyborg(mymob))
Expand Down Expand Up @@ -357,24 +406,6 @@
return
robot.modularInterface?.interact(robot)

//borg pda
/datum/hud/robot/New(mob/owner)
. = ..()

var/atom/movable/screen/using

//PDA message
using = new /atom/movable/screen/robot/pda_msg_send
using.screen_loc = ui_borg_pda_send
using.hud = src
static_inventory += using

//PDA log
using = new /atom/movable/screen/robot/pda_msg_show
using.screen_loc = ui_borg_pda_log
using.hud = src
static_inventory += using

/atom/movable/screen/robot/pda_msg_send
name = "PDA - Send Message"
icon = 'icons/mob/screen_ai.dmi'
Expand Down
6 changes: 3 additions & 3 deletions code/_onclick/hud/screen_objects/sprint.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
var/mutable_appearance/flashy

/atom/movable/screen/sprintbutton/Click()
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.default_toggle_sprint()
if(isliving(usr))
var/mob/living/owner = usr
owner.default_toggle_sprint()

/atom/movable/screen/sprintbutton/update_icon_state()
var/mob/living/user = hud?.mymob
Expand Down
2 changes: 2 additions & 0 deletions code/controllers/configuration/entries/movespeed.dm
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@
. = ..()
for(var/datum/hud/human/H)
H.assert_move_intent_ui()
for(var/datum/hud/robot/robot)
robot.assert_move_intent_ui()
if(!config_entry_value) // disabled
for(var/mob/living/L in world)
L.disable_intentional_sprint_mode()
Expand Down
6 changes: 6 additions & 0 deletions code/game/objects/items/robot/robot_upgrades.dm
Original file line number Diff line number Diff line change
Expand Up @@ -92,13 +92,19 @@
VC = new /obj/effect/proc_holder/silicon/cyborg/vtecControl
R.AddAbility(VC)
R.cansprint = 0
var/datum/hud/robot/robohud = R.hud_used
if(istype(robohud))
robohud.assert_move_intent_ui()

/obj/item/borg/upgrade/vtec/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
R.RemoveAbility(VC)
R.vtec = initial(R.vtec)
R.cansprint = 1
var/datum/hud/robot/robohud = R.hud_used
if(istype(robohud))
robohud.assert_move_intent_ui()

/obj/item/borg/upgrade/disablercooler
name = "cyborg rapid energy blaster cooling module"
Expand Down
71 changes: 14 additions & 57 deletions code/modules/mob/living/silicon/ai/ai.dm
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
var/obj/item/pda/ai/aiPDA
var/obj/item/multitool/aiMulti
var/mob/living/simple_animal/bot/Bot
var/datum/weakref/bot_ref
var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed.
var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever/N
var/obj/machinery/status_display/controlled_display
Expand Down Expand Up @@ -100,7 +100,6 @@
var/display_icon_override
var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it.

// TODO: Currently unused, needs port from TG.
var/datum/robot_control/robot_control
// TODO: Currently unused, needs port from TG.
/// Station alert datum for showing alerts UI
Expand Down Expand Up @@ -203,14 +202,13 @@
QDEL_NULL(spark_system)
QDEL_NULL(malf_picker)
QDEL_NULL(doomsday_device)
// TODO: Port implementation of these from TG or remove the unused code.
// QDEL_NULL(robot_control)
QDEL_NULL(robot_control)
// QDEL_NULL(alert_control)
QDEL_NULL(aiMulti)
QDEL_NULL(aiPDA)
malfhack = null
current = null
Bot = null
bot_ref = null
controlled_equipment = null
linked_core = null
apc_override = null
Expand Down Expand Up @@ -480,24 +478,6 @@
else
to_chat(src, "Target is not on or near any active cameras on the station.")
return
if(href_list["callbot"]) //Command a bot to move to a selected location.
if(call_bot_cooldown > world.time)
to_chat(src, "<span class='danger'>Error: Your last call bot command is still processing, please wait for the bot to finish calculating a route.</span>")
return
Bot = locate(href_list["callbot"]) in GLOB.alive_mob_list
if(!Bot || Bot.remote_disabled || src.control_disabled)
return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off.
waypoint_mode = 1
to_chat(src, "<span class='notice'>Set your waypoint by clicking on a valid location free of obstructions.</span>")
return
if(href_list["interface"]) //Remotely connect to a bot!
Bot = locate(href_list["interface"]) in GLOB.alive_mob_list
if(!Bot || Bot.remote_disabled || src.control_disabled)
return
Bot.attack_ai(src)
if(href_list["botrefresh"]) //Refreshes the bot control panel.
botcall()
return

if (href_list["ai_take_control"]) //Mech domination
var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in GLOB.mechas_list
Expand Down Expand Up @@ -544,33 +524,11 @@
set category = "AI Commands"
set name = "Access Robot Control"
set desc = "Wirelessly control various automatic robots."
if(incapacitated())
return

if(control_disabled)
to_chat(src, "<span class='warning'>Wireless control is disabled.</span>")
return
var/turf/ai_current_turf = get_turf(src)
var/ai_Zlevel = ai_current_turf.z
var/d
d += "<A HREF=?src=[REF(src)];botrefresh=1>Query network status</A><br>"
d += "<table width='100%'><tr><td width='40%'><h3>Name</h3></td><td width='30%'><h3>Status</h3></td><td width='30%'><h3>Location</h3></td><td width='10%'><h3>Control</h3></td></tr>"

for (Bot in GLOB.alive_mob_list)
if(Bot.z == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected!
var/bot_mode = Bot.get_mode()
d += "<tr><td width='30%'>[Bot.hacked ? "<span class='bad'>(!)</span>" : ""] [Bot.name]</A> ([Bot.model])</td>"
//If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all.
d += "<td width='30%'>[bot_mode]</td>"
d += "<td width='30%'>[get_area_name(Bot, TRUE)]</td>"
d += "<td width='10%'><A HREF=?src=[REF(src)];interface=[REF(Bot)]>Interface</A></td>"
d += "<td width='10%'><A HREF=?src=[REF(src)];callbot=[REF(Bot)]>Call</A></td>"
d += "</tr>"
d = format_text(d)

var/datum/browser/popup = new(src, "botcall", "Remote Robot Control", 700, 400)
popup.set_content(d)
popup.open()
if(!robot_control)
robot_control = new(src)

robot_control.ui_interact(src)

/mob/living/silicon/ai/proc/set_waypoint(atom/A)
var/turf/turf_check = get_turf(A)
Expand All @@ -580,22 +538,21 @@
else if(GLOB.cameranet && GLOB.cameranet.checkTurfVis(turf_check))
call_bot(turf_check)
else
to_chat(src, "<span class='danger'>Selected location is not visible.</span>")
to_chat(src, span_danger("Selected location is not visible."))

/mob/living/silicon/ai/proc/call_bot(turf/waypoint)

if(!Bot)
var/mob/living/simple_animal/bot/bot = bot_ref.resolve()
if(!bot)
return

if(Bot.calling_ai && Bot.calling_ai != src) //Prevents an override if another AI is controlling this bot.
to_chat(src, "<span class='danger'>Interface error. Unit is already in use.</span>")
if(bot.calling_ai && bot.calling_ai != src) //Prevents an override if another AI is controlling this bot.
to_chat(src, span_danger("Interface error. Unit is already in use."))
return
to_chat(src, "<span class='notice'>Sending command to bot...</span>")
to_chat(src, span_notice("Sending command to bot..."))
call_bot_cooldown = world.time + CALL_BOT_COOLDOWN
Bot.call_bot(src, waypoint)
bot.call_bot(src, waypoint)
call_bot_cooldown = 0


/mob/living/silicon/ai/triggerAlarm(class, area/home, cameras, obj/source)
if(source.z != z)
return
Expand Down
51 changes: 32 additions & 19 deletions code/modules/mob/living/silicon/ai/robot_control.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
if(user != owner || owner.incapacitated())
return FALSE
if(owner.control_disabled)
to_chat(user, "<span class='warning'>Wireless control is disabled.</span>")
to_chat(user, span_warning("Wireless control is disabled."))
return FALSE
return TRUE

Expand All @@ -35,17 +35,23 @@
var/turf/ai_current_turf = get_turf(owner)
var/ai_zlevel = ai_current_turf.z

var/mob/living/simple_animal/bot/bot = owner.bot_ref?.resolve()
if((owner.waypoint_mode && bot) && !(bot.remote_disabled || owner.control_disabled))
data["commandeering"] = REF(bot)
else
data["commandeering"] = null

data["robots"] = list()
for(var/mob/living/simple_animal/bot/B in GLOB.bots_list)
if(B.z != ai_zlevel || B.remote_disabled) //Only non-emagged bots on the same Z-level are detected!
for(var/mob/living/simple_animal/bot/our_bot as anything in GLOB.bots_list)
if(our_bot.z != ai_zlevel || our_bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected!
continue
var/list/robot_data = list(
name = B.name,
model = B.model,
mode = B.get_mode(),
hacked = B.hacked,
location = get_area_name(B, TRUE),
ref = REF(B)
name = our_bot.name,
model = our_bot.model,
mode = our_bot.get_mode(),
hacked = our_bot.hacked,
location = get_area_name(our_bot, TRUE),
ref = REF(our_bot)
)
data["robots"] += list(robot_data)

Expand All @@ -54,23 +60,30 @@
/datum/robot_control/ui_act(action, params)
if(..())
return
if(!is_interactable(usr))
var/mob/living/our_user = usr
if(!is_interactable(our_user))
return

var/mob/living/simple_animal/bot/bot = locate(params["ref"]) in GLOB.bots_list
if(isnull(bot))
return

switch(action)
if("callbot") //Command a bot to move to a selected location.
if(owner.call_bot_cooldown > world.time)
to_chat(usr, "<span class='danger'>Error: Your last call bot command is still processing, please wait for the bot to finish calculating a route.</span>")
to_chat(our_user, span_danger("Error: Your last call bot command is still processing, please wait for the bot to finish calculating a route."))
return
owner.Bot = locate(params["ref"]) in GLOB.bots_list
if(!owner.Bot || owner.Bot.remote_disabled || owner.control_disabled)

if(bot.remote_disabled)
return

owner.bot_ref = WEAKREF(bot)
owner.waypoint_mode = TRUE
to_chat(usr, "<span class='notice'>Set your waypoint by clicking on a valid location free of obstructions.</span>")
. = TRUE
to_chat(our_user, span_notice("Set your waypoint by clicking on a valid location free of obstructions."))
if("interface") //Remotely connect to a bot!
owner.Bot = locate(params["ref"]) in GLOB.bots_list
if(!owner.Bot || owner.Bot.remote_disabled || owner.control_disabled)
owner.bot_ref = WEAKREF(bot)
if(bot.remote_disabled)
return
owner.Bot.attack_ai(usr)
. = TRUE
bot.attack_ai(our_user)

return TRUE
2 changes: 1 addition & 1 deletion config/entries/movespeed.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ MULTIPLICATIVE_MOVESPEED_FLOATING /mob/living/carbon -0.5
MULTIPLICATIVE_MOVESPEED_FLOATING /mob/living 0

## Whether or not sprint is enabled
SPRINT_ENABLED 1
SPRINT_ENABLED

## When sprint is off, how much does getting staggered slow you
SPRINTLESS_STAGGER_SLOWDOWN 0.5
Expand Down
Binary file modified modular_citadel/icons/ui/screen_cyborg.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -2893,6 +2893,7 @@
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
#include "code\modules\mob\living\silicon\ai\multicam.dm"
#include "code\modules\mob\living\silicon\ai\robot_control.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
#include "code\modules\mob\living\silicon\ai\vox_sounds.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
Expand Down
2 changes: 2 additions & 0 deletions tgui/packages/tgui/interfaces/RemoteRobotControl.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export const RemoteRobotControlContent = (props, context) => {
const { act, data } = useBackend(context);
const {
robots = [],
commandeering,
} = data;
if (!robots.length) {
return (
Expand All @@ -47,6 +48,7 @@ export const RemoteRobotControlContent = (props, context) => {
<Button
icon="phone-alt"
content="Call"
selected={robot.ref === commandeering}
onClick={() => act('callbot', {
ref: robot.ref,
})} />
Expand Down

0 comments on commit 652a380

Please sign in to comment.