mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-20 20:45:28 +01:00
[MIRROR] Better cyborg creation logging [MDB IGNORE] (#18706)
* Better cyborg creation logging * Fixes the merge conflicts! * Okay now it should work --------- Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com> Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
This commit is contained in:
@@ -58,10 +58,10 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// If applicable, the time in deciseconds we have to wait before using any more modules
|
||||
var/cooldown_period
|
||||
|
||||
/datum/action/innate/ai/Grant(mob/living/L)
|
||||
/datum/action/innate/ai/Grant(mob/living/player)
|
||||
. = ..()
|
||||
if(!isAI(owner))
|
||||
WARNING("AI action [name] attempted to grant itself to non-AI mob [L.real_name] ([L.key])!")
|
||||
WARNING("AI action [name] attempted to grant itself to non-AI mob [key_name(player)]!")
|
||||
qdel(src)
|
||||
else
|
||||
owner_AI = owner
|
||||
@@ -96,12 +96,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/datum/action/innate/ai/ranged/adjust_uses(amt, silent)
|
||||
uses += amt
|
||||
if(!silent && uses)
|
||||
to_chat(owner, span_notice("[name] now has <b>[uses]</b> use[uses > 1 ? "s" : ""] remaining."))
|
||||
to_chat(owner, span_notice("[name] now has <b>[uses]</b> use\s remaining."))
|
||||
if(!uses)
|
||||
if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway!
|
||||
to_chat(owner, span_warning("[name] has run out of uses!"))
|
||||
Remove(owner)
|
||||
QDEL_IN(src, 100) //let any active timers on us finish up
|
||||
QDEL_IN(src, 10 SECONDS) //let any active timers on us finish up
|
||||
|
||||
/// The base module type, which holds info about each ability.
|
||||
/datum/ai_module
|
||||
@@ -116,7 +116,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// If the module gives a passive upgrade, use this. Mutually exclusive with power_type.
|
||||
var/upgrade = FALSE
|
||||
/// Text shown when an ability is unlocked
|
||||
var/unlock_text = "<span class='notice'>Hello World!</span>"
|
||||
var/unlock_text = span_notice("Hello World!")
|
||||
/// Sound played when an ability is unlocked
|
||||
var/unlock_sound
|
||||
|
||||
@@ -139,11 +139,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Doomsday Device: Starts the self-destruct timer. It can only be stopped by killing the AI completely.
|
||||
/datum/ai_module/destructive/nuke_station
|
||||
name = "Doomsday Device"
|
||||
description = "Activate a weapon that will disintegrate all organic life on the station after a 450 second delay. Can only be used while on the station, will fail if your core is moved off station or destroyed."
|
||||
description = "Activate a weapon that will disintegrate all organic life on the station after a 450 second delay. \
|
||||
Can only be used while on the station, will fail if your core is moved off station or destroyed."
|
||||
cost = 130
|
||||
one_purchase = TRUE
|
||||
power_type = /datum/action/innate/ai/nuke_station
|
||||
unlock_text = "<span class='notice'>You slowly, carefully, establish a connection with the on-station self-destruct. You can now activate it at any time.</span>"
|
||||
unlock_text = span_notice("You slowly, carefully, establish a connection with the on-station self-destruct. You can now activate it at any time.")
|
||||
|
||||
/datum/action/innate/ai/nuke_station
|
||||
name = "Doomsday Device"
|
||||
@@ -346,12 +347,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset.
|
||||
/datum/ai_module/destructive/lockdown
|
||||
name = "Hostile Station Lockdown"
|
||||
description = "Overload the airlock, blast door and fire control networks, locking them down. Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds, briefly \
|
||||
opening all doors on the station."
|
||||
description = "Overload the airlock, blast door and fire control networks, locking them down. \
|
||||
Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds, briefly \
|
||||
opening all doors on the station."
|
||||
cost = 30
|
||||
one_purchase = TRUE
|
||||
power_type = /datum/action/innate/ai/lockdown
|
||||
unlock_text = "<span class='notice'>You upload a sleeper trojan into the door control systems. You can send a signal to set it off at any time.</span>"
|
||||
unlock_text = span_notice("You upload a sleeper trojan into the door control systems. You can send a signal to set it off at any time.")
|
||||
unlock_sound = 'sound/machines/boltsdown.ogg'
|
||||
|
||||
/datum/action/innate/ai/lockdown
|
||||
@@ -371,7 +373,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
if(C)
|
||||
C.post_status("alert", "lockdown")
|
||||
|
||||
minor_announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.","Network Alert:", TRUE)
|
||||
minor_announce("Hostile runtime detected in door controllers. Isolation lockdown protocols are now in effect. Please remain calm.", "Network Alert:", TRUE)
|
||||
to_chat(owner, span_danger("Lockdown initiated. Network reset in 90 seconds."))
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce),
|
||||
"Automatic system reboot complete. Have a secure day.",
|
||||
@@ -383,7 +385,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
description = "Overrides a machine's programming, causing it to rise up and attack everyone except other machines. Four uses per purchase."
|
||||
cost = 30
|
||||
power_type = /datum/action/innate/ai/ranged/override_machine
|
||||
unlock_text = "<span class='notice'>You procure a virus from the Space Dark Web and distribute it to the station's machines.</span>"
|
||||
unlock_text = span_notice("You procure a virus from the Space Dark Web and distribute it to the station's machines.")
|
||||
unlock_sound = 'sound/machines/airlock_alien_prying.ogg'
|
||||
|
||||
/datum/action/innate/ai/ranged/override_machine
|
||||
@@ -392,8 +394,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
button_icon_state = "override_machine"
|
||||
uses = 4
|
||||
ranged_mousepointer = 'icons/effects/mouse_pointers/override_machine_target.dmi'
|
||||
enable_text = "<span class='notice'>You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel.</span>"
|
||||
disable_text = "<span class='notice'>You release your hold on the powernet.</span>"
|
||||
enable_text = span_notice("You tap into the station's powernet. Click on a machine to animate it, or use the ability again to cancel.")
|
||||
disable_text = span_notice("You release your hold on the powernet.")
|
||||
|
||||
/datum/action/innate/ai/ranged/override_machine/New()
|
||||
. = ..()
|
||||
@@ -436,7 +438,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
cost = 25
|
||||
one_purchase = TRUE
|
||||
power_type = /datum/action/innate/ai/destroy_rcds
|
||||
unlock_text = "<span class='notice'>After some improvisation, you rig your onboard radio to be able to send a signal to detonate all RCDs.</span>"
|
||||
unlock_text = span_notice("After some improvisation, you rig your onboard radio to be able to send a signal to detonate all RCDs.")
|
||||
unlock_sound = 'sound/items/timer.ogg'
|
||||
|
||||
/datum/action/innate/ai/destroy_rcds
|
||||
@@ -444,7 +446,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
desc = "Detonate all non-cyborg RCDs on the station."
|
||||
button_icon_state = "detonate_rcds"
|
||||
uses = 1
|
||||
cooldown_period = 100
|
||||
cooldown_period = 10 SECONDS
|
||||
|
||||
/datum/action/innate/ai/destroy_rcds/Activate()
|
||||
for(var/I in GLOB.rcd_list)
|
||||
@@ -460,7 +462,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
description = "Overheats an electrical machine, causing a small explosion and destroying it. Two uses per purchase."
|
||||
cost = 20
|
||||
power_type = /datum/action/innate/ai/ranged/overload_machine
|
||||
unlock_text = "<span class='notice'>You enable the ability for the station's APCs to direct intense energy into machinery.</span>"
|
||||
unlock_text = span_notice("You enable the ability for the station's APCs to direct intense energy into machinery.")
|
||||
unlock_sound = 'sound/effects/comfyfire.ogg' //definitely not comfy, but it's the closest sound to "roaring fire" we have
|
||||
|
||||
/datum/action/innate/ai/ranged/overload_machine
|
||||
@@ -469,8 +471,8 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
button_icon_state = "overload_machine"
|
||||
uses = 2
|
||||
ranged_mousepointer = 'icons/effects/mouse_pointers/overload_machine_target.dmi'
|
||||
enable_text = "<span class='notice'>You tap into the station's powernet. Click on a machine to detonate it, or use the ability again to cancel.</span>"
|
||||
disable_text = "<span class='notice'>You release your hold on the powernet.</span>"
|
||||
enable_text = span_notice("You tap into the station's powernet. Click on a machine to detonate it, or use the ability again to cancel.")
|
||||
disable_text = span_notice("You release your hold on the powernet.")
|
||||
|
||||
/datum/action/innate/ai/ranged/overload_machine/New()
|
||||
..()
|
||||
@@ -516,7 +518,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. Three uses per purchase."
|
||||
cost = 15
|
||||
power_type = /datum/action/innate/ai/blackout
|
||||
unlock_text = "<span class='notice'>You hook into the powernet and route bonus power towards the station's lighting.</span>"
|
||||
unlock_text = span_notice("You hook into the powernet and route bonus power towards the station's lighting.")
|
||||
unlock_sound = SFX_SPARKS
|
||||
|
||||
/datum/action/innate/ai/blackout
|
||||
@@ -550,7 +552,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
description = "Emit a debilitatingly percussive auditory blast through the station intercoms. Does not overpower hearing protection. Two uses per purchase."
|
||||
cost = 20
|
||||
power_type = /datum/action/innate/ai/honk
|
||||
unlock_text = "<span class='notice'>You upload a sinister sound file into every intercom...</span>"
|
||||
unlock_text = span_notice("You upload a sinister sound file into every intercom...")
|
||||
unlock_sound = 'sound/items/airhorn.ogg'
|
||||
|
||||
/datum/action/innate/ai/honk
|
||||
@@ -581,7 +583,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
cost = 100
|
||||
one_purchase = TRUE
|
||||
power_type = /datum/action/innate/ai/place_transformer
|
||||
unlock_text = "<span class='notice'>You make contact with Space Amazon and request a robot factory for delivery.</span>"
|
||||
unlock_text = span_notice("You make contact with Space Amazon and request a robotics factory for delivery.")
|
||||
unlock_sound = 'sound/machines/ping.ogg'
|
||||
|
||||
/datum/action/innate/ai/place_transformer
|
||||
@@ -595,7 +597,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/datum/action/innate/ai/place_transformer/New()
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
var/image/I = image("icon"='icons/turf/overlays.dmi')
|
||||
var/image/I = image("icon" = 'icons/turf/overlays.dmi')
|
||||
LAZYADD(turfOverlays, I)
|
||||
|
||||
/datum/action/innate/ai/place_transformer/Activate()
|
||||
@@ -610,7 +612,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
return
|
||||
var/turf/T = get_turf(owner_AI.eyeobj)
|
||||
var/obj/machinery/transformer_rp/conveyor = new(T) //SKYRAT EDIT CHANGE - SILLICONQOL - ORIGINAL: var/obj/machinery/transformer/conveyor = new(T)
|
||||
conveyor.masterAI = owner
|
||||
conveyor.master_ai = owner
|
||||
playsound(T, 'sound/effects/phasein.ogg', 100, TRUE)
|
||||
owner_AI.can_shunt = FALSE
|
||||
to_chat(owner, span_warning("You are no longer able to shunt your core to APCs."))
|
||||
@@ -651,12 +653,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Air Alarm Safety Override: Unlocks the ability to enable flooding on all air alarms.
|
||||
/datum/ai_module/utility/break_air_alarms
|
||||
name = "Air Alarm Safety Override"
|
||||
description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use the environmental mode Flood, which disables scrubbers as well as pressure checks on vents. \
|
||||
Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality."
|
||||
description = "Gives you the ability to disable safeties on all air alarms. This will allow you to use the environmental mode Flood, \
|
||||
which disables scrubbers as well as pressure checks on vents. Anyone can check the air alarm's interface and may be tipped off by their nonfunctionality."
|
||||
one_purchase = TRUE
|
||||
cost = 50
|
||||
power_type = /datum/action/innate/ai/break_air_alarms
|
||||
unlock_text = "<span class='notice'>You remove the safety overrides on all air alarms, but you leave the confirm prompts open. You can hit 'Yes' at any time... you bastard.</span>"
|
||||
unlock_text = span_notice("You remove the safety overrides on all air alarms, but you leave the confirm prompts open. You can hit 'Yes' at any time... you bastard.")
|
||||
unlock_sound = 'sound/effects/space_wind.ogg'
|
||||
|
||||
/datum/action/innate/ai/break_air_alarms
|
||||
@@ -676,11 +678,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Thermal Sensor Override: Unlocks the ability to disable all fire alarms from doing their job.
|
||||
/datum/ai_module/utility/break_fire_alarms
|
||||
name = "Thermal Sensor Override"
|
||||
description = "Gives you the ability to override the thermal sensors on all fire alarms. This will remove their ability to scan for fire and thus their ability to alert."
|
||||
description = "Gives you the ability to override the thermal sensors on all fire alarms. \
|
||||
This will remove their ability to scan for fire and thus their ability to alert."
|
||||
one_purchase = TRUE
|
||||
cost = 25
|
||||
power_type = /datum/action/innate/ai/break_fire_alarms
|
||||
unlock_text = "<span class='notice'>You replace the thermal sensing capabilities of all fire alarms with a manual override, allowing you to turn them off at will.</span>"
|
||||
unlock_text = span_notice("You replace the thermal sensing capabilities of all fire alarms with a manual override, \
|
||||
allowing you to turn them off at will.")
|
||||
unlock_sound = 'sound/machines/FireAlarm1.ogg'
|
||||
|
||||
/datum/action/innate/ai/break_fire_alarms
|
||||
@@ -705,11 +709,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Disable Emergency Lights
|
||||
/datum/ai_module/utility/emergency_lights
|
||||
name = "Disable Emergency Lights"
|
||||
description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, they will not attempt to fall back on emergency power reserves."
|
||||
description = "Cuts emergency lights across the entire station. If power is lost to light fixtures, \
|
||||
they will not attempt to fall back on emergency power reserves."
|
||||
cost = 10
|
||||
one_purchase = TRUE
|
||||
power_type = /datum/action/innate/ai/emergency_lights
|
||||
unlock_text = "<span class='notice'>You hook into the powernet and locate the connections between light fixtures and their fallbacks.</span>"
|
||||
unlock_text = span_notice("You hook into the powernet and locate the connections between light fixtures and their fallbacks.")
|
||||
unlock_sound = SFX_SPARKS
|
||||
|
||||
/datum/action/innate/ai/emergency_lights
|
||||
@@ -730,11 +735,12 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Reactivate Camera Network: Reactivates up to 30 cameras across the station.
|
||||
/datum/ai_module/utility/reactivate_cameras
|
||||
name = "Reactivate Camera Network"
|
||||
description = "Runs a network-wide diagnostic on the camera network, resetting focus and re-routing power to failed cameras. Can be used to repair up to 30 cameras."
|
||||
description = "Runs a network-wide diagnostic on the camera network, resetting focus and re-routing power to failed cameras. \
|
||||
Can be used to repair up to 30 cameras."
|
||||
cost = 10
|
||||
one_purchase = TRUE
|
||||
power_type = /datum/action/innate/ai/reactivate_cameras
|
||||
unlock_text = "<span class='notice'>You deploy nanomachines to the cameranet.</span>"
|
||||
unlock_text = span_notice("You deploy nanomachines to the cameranet.")
|
||||
unlock_sound = 'sound/items/wirecutter.ogg'
|
||||
|
||||
/datum/action/innate/ai/reactivate_cameras
|
||||
@@ -774,7 +780,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
//This used to have motion sensing as well, but testing quickly revealed that giving it to the whole cameranet is PURE HORROR.
|
||||
cost = 35 //Decent price for omniscience!
|
||||
upgrade = TRUE
|
||||
unlock_text = "<span class='notice'>OTA firmware distribution complete! Cameras upgraded: CAMSUPGRADED. Light amplification system online.</span>"
|
||||
unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: CAMSUPGRADED. Light amplification system online.")
|
||||
unlock_sound = 'sound/items/rped.ogg'
|
||||
|
||||
/datum/ai_module/upgrade/upgrade_cameras/upgrade(mob/living/silicon/ai/AI)
|
||||
@@ -782,23 +788,25 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
AI.update_sight()
|
||||
|
||||
var/upgraded_cameras = 0
|
||||
for(var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras)
|
||||
var/obj/structure/camera_assembly/assembly = C.assembly_ref?.resolve()
|
||||
if(assembly)
|
||||
var/upgraded = FALSE
|
||||
for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras)
|
||||
var/obj/structure/camera_assembly/assembly = camera.assembly_ref?.resolve()
|
||||
if(!assembly)
|
||||
continue
|
||||
|
||||
if(!C.isXRay())
|
||||
C.upgradeXRay(TRUE) //if this is removed you can get rid of camera_assembly/var/malf_xray_firmware_active and clean up isxray()
|
||||
//Update what it can see.
|
||||
GLOB.cameranet.updateVisibility(C, 0)
|
||||
upgraded = TRUE
|
||||
var/upgraded = FALSE
|
||||
|
||||
if(!C.isEmpProof())
|
||||
C.upgradeEmpProof(TRUE) //if this is removed you can get rid of camera_assembly/var/malf_emp_firmware_active and clean up isemp()
|
||||
upgraded = TRUE
|
||||
if(!camera.isXRay())
|
||||
camera.upgradeXRay(TRUE) //if this is removed you can get rid of camera_assembly/var/malf_xray_firmware_active and clean up isxray()
|
||||
//Update what it can see.
|
||||
GLOB.cameranet.updateVisibility(camera, 0)
|
||||
upgraded = TRUE
|
||||
|
||||
if(upgraded)
|
||||
upgraded_cameras++
|
||||
if(!camera.isEmpProof())
|
||||
camera.upgradeEmpProof(TRUE) //if this is removed you can get rid of camera_assembly/var/malf_emp_firmware_active and clean up isemp()
|
||||
upgraded = TRUE
|
||||
|
||||
if(upgraded)
|
||||
upgraded_cameras++
|
||||
unlock_text = replacetext(unlock_text, "CAMSUPGRADED", "<b>[upgraded_cameras]</b>") //This works, since unlock text is called after upgrade()
|
||||
|
||||
/// AI Turret Upgrade: Increases the health and damage of all turrets.
|
||||
@@ -807,7 +815,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
description = "Improves the power and health of all AI turrets. This effect is permanent. Upgrade is done immediately upon purchase."
|
||||
cost = 30
|
||||
upgrade = TRUE
|
||||
unlock_text = "<span class='notice'>You establish a power diversion to your turrets, upgrading their health and damage.</span>"
|
||||
unlock_text = span_notice("You establish a power diversion to your turrets, upgrading their health and damage.")
|
||||
unlock_sound = 'sound/items/rped.ogg'
|
||||
|
||||
/datum/ai_module/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI)
|
||||
@@ -819,10 +827,11 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Enhanced Surveillance: Enables AI to hear conversations going on near its active vision.
|
||||
/datum/ai_module/upgrade/eavesdrop
|
||||
name = "Enhanced Surveillance"
|
||||
description = "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations. Upgrade is done immediately upon purchase."
|
||||
description = "Via a combination of hidden microphones and lip reading software, \
|
||||
you are able to use your cameras to listen in on conversations. Upgrade is done immediately upon purchase."
|
||||
cost = 30
|
||||
upgrade = TRUE
|
||||
unlock_text = "<span class='notice'>OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.</span>"
|
||||
unlock_text = span_notice("OTA firmware distribution complete! Cameras upgraded: Enhanced surveillance package online.")
|
||||
unlock_sound = 'sound/items/rped.ogg'
|
||||
|
||||
/datum/ai_module/upgrade/eavesdrop/upgrade(mob/living/silicon/ai/AI)
|
||||
@@ -832,18 +841,18 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
/// Unlock Mech Domination: Unlocks the ability to dominate mechs. Big shocker, right?
|
||||
/datum/ai_module/upgrade/mecha_domination
|
||||
name = "Unlock Mech Domination"
|
||||
description = "Allows you to hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. Once uploaded to the mech, it is impossible to leave.\
|
||||
Do not allow the mech to leave the station's vicinity or allow it to be destroyed. Upgrade is done immediately upon purchase."
|
||||
description = "Allows you to hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. \
|
||||
Once uploaded to the mech, it is impossible to leave. Do not allow the mech to leave the station's vicinity or allow it to be destroyed. \
|
||||
Upgrade is done immediately upon purchase."
|
||||
cost = 30
|
||||
upgrade = TRUE
|
||||
unlock_text = "<span class='notice'>Virus package compiled. Select a target mech at any time. <b>You must remain on the station at all times. Loss of signal will result in total system lockout.</b></span>"
|
||||
unlock_text = span_notice("Virus package compiled. Select a target mech at any time. <b>You must remain on the station at all times. \
|
||||
Loss of signal will result in total system lockout.</b>")
|
||||
unlock_sound = 'sound/mecha/nominal.ogg'
|
||||
|
||||
/datum/ai_module/upgrade/mecha_domination/upgrade(mob/living/silicon/ai/AI)
|
||||
AI.can_dominate_mechs = TRUE //Yep. This is all it does. Honk!
|
||||
|
||||
|
||||
|
||||
/datum/ai_module/upgrade/voice_changer
|
||||
name = "Voice Changer"
|
||||
description = "Allows you to change the AI's voice. Upgrade is active immediately upon purchase."
|
||||
@@ -866,18 +875,27 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
voice_changer_machine.ui_interact(usr)
|
||||
|
||||
/obj/machinery/ai_voicechanger
|
||||
icon = 'icons/obj/machines/nuke_terminal.dmi'
|
||||
name = "Voice Changer"
|
||||
icon = 'icons/obj/machines/nuke_terminal.dmi'
|
||||
icon_state = "nuclearbomb_base"
|
||||
/// The AI this voicechanger belongs to
|
||||
var/mob/living/silicon/ai/owner
|
||||
/// Whether this AI is speaking loudly (bigger text)
|
||||
var/loudvoice = FALSE
|
||||
var/say_verb //verb used when voicechanger is on
|
||||
var/say_name //name used when voicechanger is on
|
||||
var/say_span //span used when voicechanger is on
|
||||
var/changing_voice = FALSE //TRUE if the AI is changing its voice
|
||||
var/prev_loud // saved loudvoice state, used to restore after a voice change
|
||||
var/prev_verbs // saved verb state, used to restore after a voice change
|
||||
var/prev_span // saved span state, used to restore after a voice change
|
||||
// Verb used when voicechanger is on
|
||||
var/say_verb
|
||||
/// Name used when voicechanger is on
|
||||
var/say_name
|
||||
/// Span used when voicechanger is on
|
||||
var/say_span
|
||||
/// TRUE if the AI is changing its voice
|
||||
var/changing_voice = FALSE
|
||||
/// Saved loudvoice state, used to restore after a voice change
|
||||
var/prev_loud
|
||||
/// Saved verb state, used to restore after a voice change
|
||||
var/prev_verbs
|
||||
/// Saved span state, used to restore after a voice change
|
||||
var/prev_span
|
||||
|
||||
/obj/machinery/ai_voicechanger/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -905,7 +923,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
|
||||
|
||||
/obj/machinery/ai_voicechanger/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["voices"] = list("normal",SPAN_ROBOT,SPAN_YELL,SPAN_CLOWN) //manually adding this since i dont see other option
|
||||
data["voices"] = list("normal", SPAN_ROBOT, SPAN_YELL, SPAN_CLOWN) //manually adding this since i dont see other option
|
||||
data["loud"] = loudvoice
|
||||
data["on"] = changing_voice
|
||||
data["say_verb"] = say_verb
|
||||
|
||||
@@ -79,6 +79,10 @@
|
||||
toner = tonermax
|
||||
diag_hud_set_borgcell()
|
||||
logevent("System brought online.")
|
||||
|
||||
log_silicon("New cyborg [key_name(src)] created with [connected_ai ? "master AI: [key_name(connected_ai)]" : "no master AI"]")
|
||||
log_current_laws()
|
||||
|
||||
alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z))
|
||||
RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_TRIGGERED, PROC_REF(alarm_triggered))
|
||||
RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_CLEARED, PROC_REF(alarm_cleared))
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/***************************************************************************************
|
||||
/*
|
||||
* # robot_defines
|
||||
*
|
||||
* Definitions for /mob/living/silicon/robot and its children, including AI shells.
|
||||
*
|
||||
***************************************************************************************/
|
||||
*/
|
||||
|
||||
/mob/living/silicon/robot
|
||||
name = "Cyborg"
|
||||
@@ -26,13 +26,15 @@
|
||||
light_system = MOVABLE_LIGHT_DIRECTIONAL
|
||||
light_on = FALSE
|
||||
|
||||
|
||||
//AI shell
|
||||
var/shell = FALSE
|
||||
var/deployed = FALSE
|
||||
var/mob/living/silicon/ai/mainframe = null
|
||||
var/datum/action/innate/undeployment/undeployment_action = new
|
||||
|
||||
// ------------------------------------------ Parts
|
||||
|
||||
// Parts
|
||||
var/custom_name = ""
|
||||
var/braintype = "Cyborg"
|
||||
var/obj/item/mmi/mmi = null
|
||||
@@ -54,7 +56,8 @@
|
||||
|
||||
var/mutable_appearance/eye_lights
|
||||
|
||||
// ------------------------------------------ Hud
|
||||
|
||||
// Hud
|
||||
var/atom/movable/screen/inv1 = null
|
||||
var/atom/movable/screen/inv2 = null
|
||||
var/atom/movable/screen/inv3 = null
|
||||
@@ -73,14 +76,16 @@
|
||||
var/sight_mode = 0
|
||||
hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD)
|
||||
|
||||
// ------------------------------------------ Modules (tool slots)
|
||||
|
||||
// Modules (tool slots)
|
||||
var/obj/item/module_active = null
|
||||
held_items = list(null, null, null) //we use held_items for the module holding, because that makes sense to do!
|
||||
|
||||
///For checking which modules are disabled or not.
|
||||
var/disabled_modules
|
||||
|
||||
// ------------------------------------------ Status
|
||||
|
||||
// Status
|
||||
var/mob/living/silicon/ai/connected_ai = null
|
||||
|
||||
var/opened = FALSE
|
||||
@@ -111,7 +116,8 @@
|
||||
///Ionpulse effect.
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail
|
||||
|
||||
// ------------------------------------------ Misc
|
||||
|
||||
// Misc
|
||||
var/toner = 0
|
||||
var/tonermax = 40
|
||||
|
||||
@@ -124,16 +130,14 @@
|
||||
///What types of mobs are allowed to ride/buckle to this mob
|
||||
var/static/list/can_ride_typecache = typecacheof(/mob/living/carbon/human)
|
||||
can_buckle = TRUE
|
||||
buckle_lying = 0
|
||||
buckle_lying = FALSE
|
||||
|
||||
/// the last health before updating - to check net change in health
|
||||
var/previous_health
|
||||
/// Station alert datum for showing alerts UI
|
||||
var/datum/station_alert/alert_control
|
||||
|
||||
/***************************************************************************************
|
||||
* Defining specific kinds of robots
|
||||
***************************************************************************************/
|
||||
// Defining specific kinds of robots
|
||||
///This is the subtype that gets created by robot suits. It's needed so that those kind of borgs don't have a useless cell in them
|
||||
/mob/living/silicon/robot/nocell
|
||||
cell = null
|
||||
@@ -190,9 +194,9 @@
|
||||
scrambledcodes = TRUE // These are rogue borgs.
|
||||
ionpulse = TRUE
|
||||
var/playstyle_string = "<span class='big bold'>You are a Syndicate assault cyborg!</span><br>\
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
set_model = /obj/item/robot_model/syndicate
|
||||
cell = /obj/item/stock_parts/cell/hyper
|
||||
radio = /obj/item/radio/borg/syndicate
|
||||
@@ -204,22 +208,22 @@
|
||||
/mob/living/silicon/robot/model/syndicate/medical
|
||||
icon_state = "synd_medical"
|
||||
playstyle_string = "<span class='big bold'>You are a Syndicate medical cyborg!</span><br>\
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
|
||||
Your defibrillator paddles can revive operatives through their suits, or can be used on harm intent to shock enemies! \
|
||||
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
|
||||
Your defibrillator paddles can revive operatives through their suits, or can be used on harm intent to shock enemies! \
|
||||
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
set_model = /obj/item/robot_model/syndicate_medical
|
||||
|
||||
/mob/living/silicon/robot/model/syndicate/saboteur
|
||||
icon_state = "synd_engi"
|
||||
playstyle_string = "<span class='big bold'>You are a Syndicate saboteur cyborg!</span><br>\
|
||||
<b>You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your destination tagger will allow you to stealthily traverse the disposal network across the station \
|
||||
Your welder will allow you to repair the operatives' exosuits, but also yourself and your fellow cyborgs \
|
||||
Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station \
|
||||
Be aware that almost any physical contact or incidental damage will break your camouflage \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
<b>You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your destination tagger will allow you to stealthily traverse the disposal network across the station \
|
||||
Your welder will allow you to repair the operatives' exosuits, but also yourself and your fellow cyborgs \
|
||||
Your cyborg chameleon projector allows you to assume the appearance and registered name of a Nanotrasen engineering borg, and undertake covert actions on the station \
|
||||
Be aware that almost any physical contact or incidental damage will break your camouflage \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
set_model = /obj/item/robot_model/saboteur
|
||||
|
||||
/mob/living/silicon/robot/model/syndicate/kiltborg
|
||||
|
||||
@@ -119,35 +119,35 @@
|
||||
if(notransform)
|
||||
return
|
||||
notransform = TRUE
|
||||
var/mob/living/silicon/robot/R = new /mob/living/silicon/robot(loc)
|
||||
var/mob/living/silicon/robot/new_borg = new /mob/living/silicon/robot(loc)
|
||||
|
||||
R.gender = gender
|
||||
R.invisibility = 0
|
||||
new_borg.gender = gender
|
||||
new_borg.invisibility = 0
|
||||
|
||||
if(client)
|
||||
R.updatename(client)
|
||||
new_borg.updatename(client)
|
||||
|
||||
if(mind) //TODO //TODO WHAT
|
||||
if(!transfer_after)
|
||||
mind.active = FALSE
|
||||
mind.transfer_to(R)
|
||||
mind.transfer_to(new_borg)
|
||||
else if(transfer_after)
|
||||
R.key = key
|
||||
new_borg.key = key
|
||||
|
||||
if(R.mmi)
|
||||
R.mmi.name = "[initial(R.mmi.name)]: [real_name]"
|
||||
if(R.mmi.brain)
|
||||
R.mmi.brain.name = "[real_name]'s brain"
|
||||
if(R.mmi.brainmob)
|
||||
R.mmi.brainmob.real_name = real_name //the name of the brain inside the cyborg is the robotized human's name.
|
||||
R.mmi.brainmob.name = real_name
|
||||
if(new_borg.mmi)
|
||||
new_borg.mmi.name = "[initial(new_borg.mmi.name)]: [real_name]"
|
||||
if(new_borg.mmi.brain)
|
||||
new_borg.mmi.brain.name = "[real_name]'s brain"
|
||||
if(new_borg.mmi.brainmob)
|
||||
new_borg.mmi.brainmob.real_name = real_name //the name of the brain inside the cyborg is the robotized human's name.
|
||||
new_borg.mmi.brainmob.name = real_name
|
||||
|
||||
R.job = JOB_CYBORG
|
||||
R.notify_ai(AI_NOTIFICATION_NEW_BORG)
|
||||
new_borg.job = JOB_CYBORG
|
||||
new_borg.notify_ai(AI_NOTIFICATION_NEW_BORG)
|
||||
|
||||
. = R
|
||||
if(R.ckey && is_banned_from(R.ckey, JOB_CYBORG))
|
||||
INVOKE_ASYNC(R, TYPE_PROC_REF(/mob/living/silicon/robot, replace_banned_cyborg))
|
||||
. = new_borg
|
||||
if(new_borg.ckey && is_banned_from(new_borg.ckey, JOB_CYBORG))
|
||||
INVOKE_ASYNC(new_borg, TYPE_PROC_REF(/mob/living/silicon/robot, replace_banned_cyborg))
|
||||
qdel(src)
|
||||
|
||||
/mob/living/Robotize(delete_items = 0, transfer_after = TRUE)
|
||||
|
||||
Reference in New Issue
Block a user