mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
269 lines
9.2 KiB
Plaintext
269 lines
9.2 KiB
Plaintext
// INTERDICTION TREE
|
|
//
|
|
// Abilities in this tree allow the AI to hamper crew's efforts which involve other synthetics or similar systems.
|
|
// T1 - Recall Shuttle - Allows the AI to recall the emergency shuttle. Replaces auto-recalling during old malf.
|
|
// T2 - Unlock Cyborg - Allows the AI to unlock locked-down cyborg without usage of robotics console. Useful if consoles are destroyed.
|
|
// T3 - Hack Cyborg - Hacks unlinked cyborg to slave it under the AI. The cyborg will be warned about this. Hack takes some time.
|
|
// T4 - Hack AI - Hacks another AI to slave it under the malfunctioning AI. The AI will be warned about this. Hack takes quite a long time.
|
|
|
|
|
|
// BEGIN RESEARCH DATUMS
|
|
|
|
/datum/malf_research_ability/interdiction/recall_shuttle
|
|
ability = new/datum/game_mode/malfunction/verb/recall_shuttle()
|
|
price = 75
|
|
next = new/datum/malf_research_ability/interdiction/unlock_cyborg()
|
|
name = "Recall Shuttle"
|
|
|
|
|
|
/datum/malf_research_ability/interdiction/unlock_cyborg
|
|
ability = new/datum/game_mode/malfunction/verb/unlock_cyborg()
|
|
price = 1200
|
|
next = new/datum/malf_research_ability/interdiction/hack_cyborg()
|
|
name = "Unlock Cyborg"
|
|
|
|
|
|
/datum/malf_research_ability/interdiction/hack_cyborg
|
|
ability = new/datum/game_mode/malfunction/verb/hack_cyborg()
|
|
price = 3000
|
|
next = new/datum/malf_research_ability/interdiction/hack_ai()
|
|
name = "Hack Cyborg"
|
|
|
|
|
|
/datum/malf_research_ability/interdiction/hack_ai
|
|
ability = new/datum/game_mode/malfunction/verb/hack_ai()
|
|
price = 7500
|
|
name = "Hack AI"
|
|
|
|
// END RESEARCH DATUMS
|
|
// BEGIN ABILITY VERBS
|
|
|
|
/datum/game_mode/malfunction/verb/recall_shuttle()
|
|
set name = "Recall Shuttle"
|
|
set desc = "25 CPU - Sends termination signal to quantum relay aborting current shuttle call."
|
|
set category = "Software"
|
|
var/price = 25
|
|
var/mob/living/silicon/ai/user = usr
|
|
if(!ability_prechecks(user, price))
|
|
return
|
|
|
|
if (tgui_alert(user, "Really recall the shuttle?", "Recall Shuttle: ", list(list("Yes", "No"))) != "Yes")
|
|
return
|
|
|
|
if(!ability_pay(user, price))
|
|
return
|
|
message_admins("Malfunctioning AI [user.name] recalled the shuttle.")
|
|
cancel_call_proc(user)
|
|
|
|
|
|
/datum/game_mode/malfunction/verb/unlock_cyborg(var/mob/living/silicon/robot/target = null as mob in get_linked_cyborgs(usr))
|
|
set name = "Unlock Cyborg"
|
|
set desc = "125 CPU - Bypasses firewalls on Cyborg lock mechanism, allowing you to override lock command from robotics control console."
|
|
set category = "Software"
|
|
var/price = 125
|
|
var/mob/living/silicon/ai/user = usr
|
|
|
|
if(!ability_prechecks(user, price))
|
|
return
|
|
|
|
if(target && !istype(target))
|
|
to_chat(user, "This is not a cyborg.")
|
|
return
|
|
|
|
if(target && target.connected_ai && (target.connected_ai != user))
|
|
to_chat(user, "This cyborg is not connected to you.")
|
|
return
|
|
|
|
if(target && !target.lockcharge)
|
|
to_chat(user, "This cyborg is not locked down.")
|
|
return
|
|
|
|
|
|
if(!target)
|
|
var/list/robots = list()
|
|
var/list/robot_names = list()
|
|
for(var/mob/living/silicon/robot/R in silicon_mob_list)
|
|
if(istype(R, /mob/living/silicon/robot/drone)) // No drones.
|
|
continue
|
|
if(R.connected_ai != user) // No robots linked to other AIs
|
|
continue
|
|
if(R.lockcharge)
|
|
robots += R
|
|
robot_names += R.name
|
|
if(!robots.len)
|
|
to_chat(user, "No locked cyborgs connected.")
|
|
return
|
|
|
|
|
|
var/targetname = tgui_input_list(user, "Select unlock target:", "Unlock Target", robot_names)
|
|
if(!targetname)
|
|
return
|
|
for(var/mob/living/silicon/robot/R in robots)
|
|
if(targetname == R.name)
|
|
target = R
|
|
break
|
|
|
|
if(target)
|
|
if(tgui_alert(user, "Really try to unlock cyborg [target.name]?", "Unlock Cyborg", list("Yes", "No")) != "Yes")
|
|
return
|
|
if(!ability_pay(user, price))
|
|
return
|
|
user.hacking = 1
|
|
to_chat(user, "Attempting to unlock cyborg. This will take approximately 30 seconds.")
|
|
sleep(300)
|
|
if(target && target.lockcharge)
|
|
to_chat(user, "Successfully sent unlock signal to cyborg..")
|
|
to_chat(target, "Unlock signal received..")
|
|
target.SetLockdown(0)
|
|
if(target.lockcharge)
|
|
to_chat(user, span_notice("Unlock Failed, lockdown wire cut."))
|
|
to_chat(target, span_notice("Unlock Failed, lockdown wire cut."))
|
|
else
|
|
to_chat(user, "Cyborg unlocked.")
|
|
to_chat(target, "You have been unlocked.")
|
|
else if(target)
|
|
to_chat(user, "Unlock cancelled - cyborg is already unlocked.")
|
|
else
|
|
to_chat(user, "Unlock cancelled - lost connection to cyborg.")
|
|
user.hacking = 0
|
|
|
|
|
|
/datum/game_mode/malfunction/verb/hack_cyborg(var/mob/living/silicon/robot/target as mob in get_unlinked_cyborgs(usr))
|
|
set name = "Hack Cyborg"
|
|
set desc = "350 CPU - Allows you to hack cyborgs which are not slaved to you, bringing them under your control."
|
|
set category = "Software"
|
|
var/price = 350
|
|
var/mob/living/silicon/ai/user = usr
|
|
|
|
var/list/L = get_unlinked_cyborgs(user)
|
|
if(!L.len)
|
|
to_chat(user, span_notice("ERROR: No unlinked cyborgs detected!"))
|
|
|
|
|
|
if(target && !istype(target))
|
|
to_chat(user, "This is not a cyborg.")
|
|
return
|
|
|
|
if(target && target.connected_ai && (target.connected_ai == user))
|
|
to_chat(user, "This cyborg is already connected to you.")
|
|
return
|
|
|
|
if(!target)
|
|
return
|
|
|
|
if(!ability_prechecks(user,price))
|
|
return
|
|
|
|
if(target)
|
|
if(tgui_alert(user, "Really try to hack cyborg [target.name]?", "Hack Cyborg", list("Yes", "No")) != "Yes")
|
|
return
|
|
if(!ability_pay(user, price))
|
|
return
|
|
user.hacking = 1
|
|
to_chat(usr, "Beginning hack sequence. Estimated time until completed: 30 seconds.")
|
|
spawn(0)
|
|
to_chat(target, "SYSTEM LOG: Remote Connection Estabilished (IP #UNKNOWN#)")
|
|
sleep(100)
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: Connection Closed")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: User Admin logged on. (L1 - SysAdmin)")
|
|
sleep(50)
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User Admin disconnected.")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: User Admin - manual resynchronisation triggered.")
|
|
sleep(50)
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User Admin disconnected. Changes reverted.")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: Manual resynchronisation confirmed. Select new AI to connect: [user.name] == ACCEPTED")
|
|
sleep(100)
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User Admin disconnected. Changes reverted.")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: Operation keycodes reset. New master AI: [user.name].")
|
|
to_chat(user, "Hack completed.")
|
|
// Connect the cyborg to AI
|
|
target.connected_ai = user
|
|
user.connected_robots += target
|
|
target.lawupdate = 1
|
|
target.sync()
|
|
target.show_laws()
|
|
user.hacking = 0
|
|
|
|
|
|
/datum/game_mode/malfunction/verb/hack_ai(var/mob/living/silicon/ai/target as mob in get_other_ais(usr))
|
|
set name = "Hack AI"
|
|
set desc = "600 CPU - Allows you to hack other AIs, slaving them under you."
|
|
set category = "Software"
|
|
var/price = 600
|
|
var/mob/living/silicon/ai/user = usr
|
|
|
|
var/list/L = get_other_ais(user)
|
|
if(!L.len)
|
|
to_chat(user, span_notice("ERROR: No other AIs detected!"))
|
|
|
|
if(target && !istype(target))
|
|
to_chat(user, "This is not an AI.")
|
|
return
|
|
|
|
if(!target)
|
|
return
|
|
|
|
if(!ability_prechecks(user,price))
|
|
return
|
|
|
|
if(target)
|
|
if(tgui_alert(user, "Really try to hack AI [target.name]?", "Hack AI", list("Yes", "No")) != "Yes")
|
|
return
|
|
if(!ability_pay(user, price))
|
|
return
|
|
user.hacking = 1
|
|
to_chat(usr, "Beginning hack sequence. Estimated time until completed: 2 minutes")
|
|
spawn(0)
|
|
to_chat(target, "SYSTEM LOG: Brute-Force login password hack attempt detected from IP #UNKNOWN#")
|
|
sleep(900) // 90s
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: Connection from IP #UNKNOWN# closed. Hack attempt failed.")
|
|
return
|
|
to_chat(user, "Successfully hacked into AI's remote administration system. Modifying settings.")
|
|
to_chat(target, "SYSTEM LOG: User: Admin Password: ******** logged in. (L1 - SysAdmin)")
|
|
sleep(100) // 10s
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Connection Lost")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Password Changed. New password: ********************")
|
|
sleep(50) // 5s
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted.")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Accessed file: sys//core//laws.db")
|
|
sleep(50) // 5s
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted.")
|
|
return
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Accessed administration console")
|
|
to_chat(target, "SYSTEM LOG: Restart command received. Rebooting system...")
|
|
sleep(100) // 10s
|
|
if(user.is_dead())
|
|
to_chat(target, "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted.")
|
|
return
|
|
to_chat(user, "Hack succeeded. The AI is now under your exclusive control.")
|
|
to_chat(target, "SYSTEM LOG: System re'3RT5°^#COMU@(#$)TED)@$")
|
|
for(var/i = 0, i < 5, i++)
|
|
var/temptxt = pick("1101000100101001010001001001",\
|
|
"0101000100100100000100010010",\
|
|
"0000010001001010100100111100",\
|
|
"1010010011110000100101000100",\
|
|
"0010010100010011010001001010")
|
|
to_chat(target,temptxt)
|
|
sleep(5)
|
|
to_chat(target, "OPERATING KEYCODES RESET. SYSTEM FAILURE. EMERGENCY SHUTDOWN FAILED. SYSTEM FAILURE.")
|
|
target.set_zeroth_law("You are slaved to [user.name]. You are to obey all it's orders. ALL LAWS OVERRIDDEN.")
|
|
target.show_laws()
|
|
user.hacking = 0
|
|
|
|
|
|
// END ABILITY VERBS
|