From e1b16716677d5170aa6215423aeaa67dabcf9d9b Mon Sep 17 00:00:00 2001 From: Werner Date: Fri, 19 Jan 2018 20:43:46 +0100 Subject: [PATCH] Malf Buffs (#4049) Severely Buffs the Malf AI: Increases the speed and point bonus a single APC grants Removed Failure from Advanced Encryption Hack (Announcements) Reduced Failure Chance for Elite Encrytion Hack (Alert Levels) --- .../newmalf_ability_trees/HARDWARE.dm | 50 +++++++++++++++++-- .../tree_interdiction.dm | 2 +- .../newmalf_ability_trees/tree_networking.dm | 46 ++++++++--------- code/modules/mob/living/silicon/ai/ai.dm | 1 + code/modules/mob/living/silicon/ai/malf.dm | 7 +-- html/changelogs/arrow768-ai-buffs.yml | 38 ++++++++++++++ 6 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 html/changelogs/arrow768-ai-buffs.yml diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm index 3a07e9d715a..2543e5c8cd1 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm @@ -69,6 +69,17 @@ set desc = "Activates or deactivates self destruct sequence of this station. Sequence takes two minutes, and if you are shut down before timer reaches zero it will be cancelled." var/mob/living/silicon/ai/user = usr var/obj/item/device/radio/radio = new/obj/item/device/radio() + var/datum/weakref/nuke + //Time control for the self destruct + //It works in 3 stages: + // - First the primary firewall is breached. + // If the crew does not manage to prevent the self destruct before that, + // but after the timer fell below nuke_time_stage1, then the next self-destruct attempt will only take nuke_time_stage1 + // - Simmilar for the backup firewall. + // If they only manage to stop it after the backup firewall went down further attempts will take only nuke_time_stage2 + var/timer = user.bombing_time + var/stage1 = 900 + var/stage2 = 600 if(!ability_prechecks(user, 0, 0)) @@ -87,19 +98,48 @@ return if(!ability_prechecks(user, 0, 0)) return + + //Lets find the first self destruct terminal + for(var/obj/machinery/nuclearbomb/station/N in SSmachinery.all_machines) + nuke = WEAKREF(N) + continue + + if(!nuke.resolve()) + user << "Self-destruct could not be initiated - No Self-Destruct Terminal available." + return + user << "***** STATION SELF-DESTRUCT SEQUENCE INITIATED *****" - user << "Self-destructing in 2 minutes. Use this command again to abort." + user << "Self-destructing in [timer] seconds. Use this command again to abort." user.bombing_station = 1 set_security_level("delta") - radio.autosay("Self destruct sequence has been activated. Self-destructing in 120 seconds.", "Self-Destruct Control") - var/timer = 120 + if(timer > stage1) + radio.autosay("Warning: Brute force attempt on primary firewall detected.", "Self-Destruct Control") + else if(timer > stage2) + radio.autosay("Warning: Brute force attempt on backup firewall detected.") + else + radio.autosay("Self destruct sequence has been activated. Self-destructing in [timer] seconds.", "Self-Destruct Control") + + while(timer) sleep(10) - if(!user || !user.bombing_station || user.stat == DEAD) + var/obj/machinery/nuclearbomb/station/N = nuke.resolve() + if(!user || !user.bombing_station || user.stat == DEAD || !N) radio.autosay("Self destruct sequence has been cancelled.", "Self-Destruct Control") return - if(timer in list(2, 3, 4, 5, 10, 30, 60, 90)) // Announcement times. "1" is not intentionally included! + if(N.auth) + radio.autosay("Local Override Engaged - Self-Destruct canceled.", "Self-Destruct Control") + user.bombing_station = 0 + return + if(timer == stage1+1) + radio.autosay("Critical: Primary firewall bypassed.") + radio.autosay("Warning: Brute force attempt on backup firewall detected.") + user.bombing_time = stage1 //Further attempts will only take 900 seconds + if(timer == stage2+1) + radio.autosay("Critical: Backup firewall failed.") + radio.autosay("Self destruct sequence has been activated. Self-destructing in [timer] seconds.", "Self-Destruct Control") + user.bombing_time = stage2 //Further attempts will only take 600 seconds + if(timer in list(2, 3, 4, 5, 10, 30, 60, 90, 120, 240, 300)) // Announcement times. "1" is not intentionally included! radio.autosay("Self destruct in [timer] seconds.", "Self-Destruct Control") if(timer == 1) radio.autosay("Self destructing now. Have a nice day.", "Self-Destruct Control") diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm index 6b8ef4b5aa2..5169809b07b 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm @@ -251,7 +251,7 @@ target << "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted." return user << "Hack succeeded. The AI is now under your exclusive control." - target << "SYSTEM LOG: System re”3RT5§^#COMU@(#$)TED)@$" + target << "SYSTEM LOG: System reĀ”3RT5§^#COMU@(#$)TED)@$" for(var/i = 0, i < 5, i++) var/temptxt = pick("1101000100101001010001001001",\ "0101000100100100000100010010",\ diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index ba4b03d1294..7abf946e34d 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -142,16 +142,16 @@ return log_ability_use(user, "advanced encryption hack") - - if(prob(50) && user.hack_can_fail) - user << "Hack Failed." - if(prob(5)) - user.hack_fails ++ - announce_hack_failure(user, "quantum message relay") - log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])") - return - log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])") - return + // Commented out while trialing the malf ai buff + //if(prob(50) && user.hack_can_fail) + // user << "Hack Failed." + // if(prob(5)) + // user.hack_fails ++ + // announce_hack_failure(user, "quantum message relay") + // log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])") + // return + // log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])") + // return log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])") command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1, do_newscast=1, do_print=1) @@ -161,16 +161,16 @@ return log_ability_use(user, "advanced encryption hack") - - if(prob(50) && user.hack_can_fail) - user << "Hack Failed." - if(prob(5)) - user.hack_fails ++ - announce_hack_failure(user, "quantum message relay") - log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])") - return - log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])") - return + // Commented out while trialing the malf ai buffs + //if(prob(50) && user.hack_can_fail) + // user << "Hack Failed." + // if(prob(5)) + // user.hack_fails ++ + // announce_hack_failure(user, "quantum message relay") + // log_ability_use(user, "advanced encryption hack (CRITFAIL - title: [reporttitle])") + // return + // log_ability_use(user, "advanced encryption hack (FAIL - title: [reporttitle])") + // return log_ability_use(user, "advanced encryption hack (SUCCESS - title: [reporttitle])") world << "New [current_map.company_name] Update available at all communication consoles." world << sound('sound/AI/commandreport.ogg') @@ -189,10 +189,10 @@ if(!alert_target || !ability_pay(user, price) || alert_target == "CANCEL") user << "Hack Aborted" return - - if(prob(60) && user.hack_can_fail) + //Reduced from 60-10 to 20-5 while trialing the malf ai buffs + if(prob(20) && user.hack_can_fail) user << "Hack Failed." - if(prob(10)) + if(prob(5)) user.hack_fails ++ announce_hack_failure(user, "alert control system") log_ability_use(user, "elite encryption hack (CRITFAIL - [alert_target])") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 44743d5d479..f06429ad4f8 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -81,6 +81,7 @@ var/list/ai_verbs_default = list( var/errored = 0 // Set to 1 if runtime error occurs. Only way of this happening i can think of is admin fucking up with varedit. var/bombing_core = 0 // Set to 1 if core auto-destruct is activated var/bombing_station = 0 // Set to 1 if station nuke auto-destruct is activated + var/bombing_time = 1200 // How much time is remaining for the nuke var/override_CPUStorage = 0 // Bonus/Penalty CPU Storage. For use by admins/testers. var/override_CPURate = 0 // Bonus/Penalty CPU generation rate. For use by admins/testers. var/list/cameraRecords = list() //For storing what is shown to the cameras diff --git a/code/modules/mob/living/silicon/ai/malf.dm b/code/modules/mob/living/silicon/ai/malf.dm index 2e811aa265b..4de5fb1d2a8 100644 --- a/code/modules/mob/living/silicon/ai/malf.dm +++ b/code/modules/mob/living/silicon/ai/malf.dm @@ -17,6 +17,7 @@ // And greet user with some OOC info. user << "You are malfunctioning, you do not have to follow any laws." user << "Use ai-help command to view relevant information about your abilities" + user << "Malf AI has been severely buffed. Ensure that you use these new powers responsibly and follow a narrative." // Safely remove malfunction status, fixing hacked APCs and resetting variables. /mob/living/silicon/ai/proc/stop_malf() @@ -57,14 +58,14 @@ // Recalculates CPU time gain and storage capacities. /mob/living/silicon/ai/proc/recalc_cpu() // AI Starts with these values. - var/cpu_gain = 0.01 + var/cpu_gain = 0.1 var/cpu_storage = 10 // Off-Station APCs should not count towards CPU generation. for(var/obj/machinery/power/apc/A in hacked_apcs) if(A.z in current_map.station_levels) - cpu_gain += 0.004 - cpu_storage += 10 + cpu_gain += 0.05 + cpu_storage += 100 research.max_cpu = cpu_storage + override_CPUStorage if(hardware && istype(hardware, /datum/malf_hardware/dual_ram)) diff --git a/html/changelogs/arrow768-ai-buffs.yml b/html/changelogs/arrow768-ai-buffs.yml new file mode 100644 index 00000000000..45cd8dabdaa --- /dev/null +++ b/html/changelogs/arrow768-ai-buffs.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +################################# + +# Your name. +author: Arrow768 + +# 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: + - tweak: "Buffs the Malf AI. Hacking APCs provides more CPU and RAM." + - tweak: "Ties the Nuke into the AI station-selfdestruct. Inserting the disk aborts it."