mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-23 21:12:24 +01:00
ED 209 update (#5182)
Depends on #5075 ED 209 uses verbal command like "stay, stop, patrol, arrest, detain". ED 209 can arrest/detain people if given the command.
This commit is contained in:
committed by
Erki
parent
06bbe3f943
commit
78b52be7f0
@@ -1,9 +1,19 @@
|
||||
#define SECBOT_IDLE 0 // idle
|
||||
#define SECBOT_HUNT 1 // found target, hunting
|
||||
#define SECBOT_ARREST 2 // arresting target
|
||||
#define SECBOT_START_PATROL 3 // start patrol
|
||||
#define SECBOT_WAIT_PATROL 4 // waiting for signals
|
||||
#define SECBOT_PATROL 5 // patrolling
|
||||
#define SECBOT_SUMMON 6 // summoned by PDA
|
||||
#define SECBOT_STOP 7 // basically 'do nothing'
|
||||
#define SECBOT_FOLLOW 8 // follows a target
|
||||
|
||||
/mob/living/bot/secbot/ed209
|
||||
name = "ED-209 Security Robot"
|
||||
desc = "A security robot. He looks less than thrilled."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "ed2090"
|
||||
density = 1
|
||||
density = 0
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
|
||||
@@ -19,6 +29,213 @@
|
||||
var/shot_delay = 4
|
||||
var/last_shot = 0
|
||||
|
||||
// vars for verbal commands
|
||||
var/short_name = null
|
||||
var/list/command_buffer = list()
|
||||
var/list/known_commands = list("stay", "stop", "arrest", "detain", "follow", "patrol")
|
||||
var/emote_hear = "states"
|
||||
move_to_delay = 3
|
||||
|
||||
/mob/living/bot/secbot/ed209/Initialize()
|
||||
..()
|
||||
if(!short_name)
|
||||
short_name = name
|
||||
|
||||
/mob/living/bot/secbot/ed209/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
|
||||
if(thinking_enabled && !stat && has_ui_access(speaker))
|
||||
command_buffer.Add(speaker)
|
||||
command_buffer.Add(lowertext(html_decode(message)))
|
||||
return 0
|
||||
|
||||
/mob/living/bot/secbot/ed209/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0)
|
||||
if(thinking_enabled && !stat && has_ui_access(speaker))
|
||||
command_buffer.Add(speaker)
|
||||
command_buffer.Add(lowertext(html_decode(message)))
|
||||
return 0
|
||||
|
||||
/mob/living/bot/secbot/ed209/think()
|
||||
while(command_buffer.len > 0)
|
||||
var/mob/speaker = command_buffer[1]
|
||||
var/text = command_buffer[2]
|
||||
var/filtered_name = lowertext(html_decode(name))
|
||||
var/filtered_short = lowertext(html_decode(short_name))
|
||||
if(dd_hasprefix(text,filtered_name))
|
||||
var/substring = copytext(text,length(filtered_name)+1) //get rid of the name.
|
||||
listen(speaker,substring)
|
||||
else if(dd_hasprefix(text,filtered_short))
|
||||
var/substring = copytext(text,length(filtered_short)+1) //get rid of the name.
|
||||
listen(speaker,substring)
|
||||
command_buffer.Remove(command_buffer[1],command_buffer[2])
|
||||
..()
|
||||
switch(mode)
|
||||
if(SECBOT_FOLLOW)
|
||||
follow_target()
|
||||
if(SECBOT_STOP)
|
||||
commanded_stop()
|
||||
|
||||
/mob/living/bot/secbot/ed209/on_think_disabled()
|
||||
..()
|
||||
command_buffer.Cut()
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/follow_target()
|
||||
if(!target)
|
||||
return
|
||||
if(target in view(7, src))
|
||||
walk_to(src,target,1,move_to_delay)
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused.
|
||||
return
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/listen(var/mob/speaker, var/text)
|
||||
for(var/command in known_commands)
|
||||
if(findtext(text,command))
|
||||
switch(command)
|
||||
if("stay")
|
||||
if(stay_command(speaker,text)) //find a valid command? Stop. Dont try and find more.
|
||||
break
|
||||
if("stop")
|
||||
if(stop_command(speaker,text))
|
||||
break
|
||||
if("arrest")
|
||||
if(arrest_command(speaker,text))
|
||||
break
|
||||
if("detain")
|
||||
if(arrest_command(speaker,text))
|
||||
break
|
||||
if("follow")
|
||||
if(follow_command(speaker,text))
|
||||
break
|
||||
if("patrol")
|
||||
if(patrol_command(speaker, text))
|
||||
break
|
||||
|
||||
return 1
|
||||
|
||||
//returns a list of everybody we wanna do stuff with.
|
||||
/mob/living/bot/secbot/ed209/proc/get_target_by_name(var/text)
|
||||
var/list/possible_targets = hearers(src,10)
|
||||
for(var/mob/M in possible_targets)
|
||||
if(findtext(text, "[M]"))
|
||||
return M
|
||||
else
|
||||
var/list/parsed_name = splittext(replace_characters(lowertext(html_decode("[M]")),list("-"=" ", "."=" ", "," = " ", "'" = " ")), " ") //this big MESS is basically 'turn this into words, no punctuation, lowercase so we can check first name/last name/etc'
|
||||
for(var/a in parsed_name)
|
||||
if(a == "the" || length(a) < 2) //get rid of shit words.
|
||||
continue
|
||||
if(findtext(text,"[a]"))
|
||||
return M
|
||||
return null
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/arrest_command(var/mob/speaker,var/text)
|
||||
target = null //want me to attack something? Well I better forget my old target.
|
||||
walk_to(src,0)
|
||||
|
||||
target = get_target_by_name(text)
|
||||
if(!(target in view(7, src)))
|
||||
return 0
|
||||
|
||||
if(findtext(text,"detain"))
|
||||
arrest_type = 1
|
||||
else
|
||||
arrest_type = 0
|
||||
|
||||
if(isnull(target))
|
||||
custom_emote(2, "[emote_hear], \"Error, unit is unable to find target in view range!\"")
|
||||
return 0
|
||||
else
|
||||
if(ishuman(target))
|
||||
idcheck = TRUE
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/perpname = H.name
|
||||
var/obj/item/weapon/card/id/id = H.GetIdCard()
|
||||
if(id)
|
||||
perpname = id.registered_name
|
||||
|
||||
var/datum/data/record/R = find_security_record("name", perpname)
|
||||
if(R)
|
||||
R.fields["criminal"] = "*Arrest*"
|
||||
else
|
||||
custom_emote(2, "[emote_hear], \"Warning, [target] does not have Security records! Enabling security records check mode!\"")
|
||||
check_records = TRUE
|
||||
mode = SECBOT_HUNT
|
||||
custom_emote(2, "[emote_hear], \"[arrest_type ? ("Detaining") : ("Arresting")] [target]\"")
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/stay_command(var/mob/speaker,var/text)
|
||||
walk_to(src, src, 0, move_to_delay)
|
||||
mode = SECBOT_IDLE
|
||||
auto_patrol = 0
|
||||
target = null
|
||||
check_records = FALSE
|
||||
custom_emote(2, "[emote_hear], \"Roger that, going into idle mode. Auto patrol disabled.\"")
|
||||
return 1
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/stop_command(var/mob/speaker,var/text)
|
||||
if(!on)
|
||||
return
|
||||
walk_to(src, src, 0, move_to_delay)
|
||||
check_records = FALSE
|
||||
custom_emote(2, "[emote_hear], \"Roger that, unit going offline.\"")
|
||||
turn_off()
|
||||
return 1
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/patrol_command(var/mob/speaker,var/text)
|
||||
walk_to(src, src, 0, move_to_delay)
|
||||
mode = SECBOT_IDLE
|
||||
auto_patrol = 1
|
||||
target = null
|
||||
custom_emote(2, "[emote_hear], \"Roger that, starting patrol now.\"")
|
||||
return 1
|
||||
|
||||
/mob/living/bot/secbot/ed209/proc/follow_command(var/mob/speaker,var/text)
|
||||
//we can assume 'stop following' is handled by stop_command
|
||||
if(findtext(text,"me"))
|
||||
mode = SECBOT_FOLLOW
|
||||
target = speaker
|
||||
custom_emote(2, "[emote_hear], \"Roger that, following you\"")
|
||||
return 1
|
||||
|
||||
target = get_target_by_name(text)
|
||||
if(!(target in view(7, src)))
|
||||
return 0
|
||||
|
||||
if(!target)
|
||||
return 0
|
||||
|
||||
mode = SECBOT_FOLLOW
|
||||
custom_emote(2, "[emote_hear], \"Roger that, following [target]\"")
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/bot/secbot/ed209/verb/change_name()
|
||||
set name = "Change nickname"
|
||||
set category = "IC"
|
||||
set src in view(1)
|
||||
|
||||
if(!usr.mind) return 0
|
||||
|
||||
// Check if they are set to arrest
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
var/perpname = H.name
|
||||
var/obj/item/weapon/card/id/id = H.GetIdCard()
|
||||
if(id)
|
||||
perpname = id.registered_name
|
||||
|
||||
var/datum/data/record/R = find_security_record("name", perpname)
|
||||
if(R && R.fields["criminal"] == "*Arrest*")
|
||||
to_chat(usr, "<span class='warning'>Warning, you do not have access!</span>")
|
||||
|
||||
// Check if they have access to the bot
|
||||
if(!has_ui_access(usr))
|
||||
to_chat(usr, "<span class='warning'>Warning, you do not have access!</span>")
|
||||
return 0
|
||||
|
||||
var/short_input = sanitizeSafe(input("What do you want [src] respond to?", , ""), MAX_NAME_LEN)
|
||||
|
||||
if(src && short_input && !usr.stat && in_range(usr,src))
|
||||
short_name = short_input
|
||||
return 1
|
||||
|
||||
/mob/living/bot/secbot/ed209/update_icons()
|
||||
if(on && is_attacking)
|
||||
icon_state = "ed209-c"
|
||||
@@ -26,7 +243,7 @@
|
||||
icon_state = "ed209[on]"
|
||||
|
||||
/mob/living/bot/secbot/ed209/explode()
|
||||
visible_message("<span class='warning'>[src] blows apart!</span>")
|
||||
visible_message("<span class='danger'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
new /obj/item/weapon/secbot_assembly/ed209_assembly(Tsec)
|
||||
@@ -188,3 +405,13 @@
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
#undef SECBOT_IDLE
|
||||
#undef SECBOT_HUNT
|
||||
#undef SECBOT_ARREST
|
||||
#undef SECBOT_START_PATROL
|
||||
#undef SECBOT_WAIT_PATROL
|
||||
#undef SECBOT_PATROL
|
||||
#undef SECBOT_SUMMON
|
||||
#undef SECBOT_STOP
|
||||
#undef SECBOT_FOLLOW
|
||||
@@ -561,6 +561,21 @@
|
||||
..()
|
||||
|
||||
if (ismob(P.firer))
|
||||
var/found = 0
|
||||
// Check if we can see them.
|
||||
for(var/mob/living/M in view(7, src))
|
||||
if(M.invisibility >= INVISIBILITY_LEVEL_ONE)
|
||||
continue
|
||||
if(M.stat)
|
||||
continue
|
||||
if(M == P.firer)
|
||||
found = 1
|
||||
break
|
||||
|
||||
if(!found)
|
||||
broadcast_security_hud_message("[src] was shot with <b>[P]</b>, Unable to locate source! Requesting backup", src)
|
||||
return
|
||||
|
||||
target = P.firer
|
||||
mode = SECBOT_HUNT
|
||||
if(ishuman(P.firer))
|
||||
@@ -698,3 +713,11 @@
|
||||
if(!in_range(src, usr) && loc != usr)
|
||||
return
|
||||
created_name = t
|
||||
|
||||
#undef SECBOT_IDLE
|
||||
#undef SECBOT_HUNT
|
||||
#undef SECBOT_ARREST
|
||||
#undef SECBOT_START_PATROL
|
||||
#undef SECBOT_WAIT_PATROL
|
||||
#undef SECBOT_PATROL
|
||||
#undef SECBOT_SUMMON
|
||||
@@ -251,7 +251,7 @@
|
||||
stance = HOSTILE_STANCE_IDLE
|
||||
audible_emote("[pick(sad_emote)].",0)
|
||||
|
||||
mob/living/simple_animal/hostile/commanded/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve
|
||||
/mob/living/simple_animal/hostile/commanded/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve
|
||||
..()
|
||||
|
||||
if(istype(AM,/obj/))
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
author: PoZe
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "ED 209 now listesn to verbal command such as 'stay', 'stop', 'arrest', 'detain', 'patrol'. So you can say something like 'ED, can you go on your damn patrol?!' or 'ED, arrest that scummbag Urist'. Also you do not need to give full First and Last name in order for ED to arrest/detain tha person, either first of Last works."
|
||||
- rscadd: "ED 209 now has a verb that lets you to set its nickname to which he will respond. So that you can call it something like 'ED', etc. It will not change its name however. Also only people with access and who are not set to arrest can use that verb."
|
||||
Reference in New Issue
Block a user