mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-27 23:14:18 +01:00
Synthetic Smörgåsbord (#12417)
This commit is contained in:
@@ -260,7 +260,7 @@
|
||||
burn += burn_amt
|
||||
total_dam = brute + burn
|
||||
if(total_dam >= max_dam)
|
||||
var/obj/item/circuitboard/broken/broken_device = new(get_turf(src))
|
||||
var/obj/item/trash/broken_electronics/broken_device = new(get_turf(src))
|
||||
if(icon_state_broken != "broken")
|
||||
broken_device.icon = src.icon
|
||||
broken_device.icon_state = icon_state_broken
|
||||
|
||||
@@ -21,12 +21,7 @@
|
||||
/mob/living/silicon/robot/drone
|
||||
// Look and feel
|
||||
name = "maintenance drone"
|
||||
desc_info = "Drones are player-controlled synthetics which are lawed to maintain the station and not \
|
||||
interact with anyone else, except for other drones. They hold a wide array of tools to build, repair, maintain, and clean. \
|
||||
They fuction similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, \
|
||||
such as fire, radiation, vacuum, and more. Ghosts can join the round as a maintenance drone by using the appropriate verb in the 'ghost' tab. \
|
||||
An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access, and an active drone can be shut down in the same manner."
|
||||
desc_antag = "An Electromagnetic Sequencer can be used to subvert the drone to your cause."
|
||||
var/desc_flavor = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '%MAPNAME% Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'<br><br><b>OOC Info:</b><br><br>Drones are player-controlled synthetics which are lawed to maintain the station and not interact with anyone else, except for other drones.<br><br>They hold a wide array of tools to build, repair, maintain, and clean. They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, such as fire, radiation, vacuum, and more.<br><br>Ghosts can join the round as a maintenance drone by accessing the 'Ghost Spawner' menu in the 'Ghost' tab. An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access, and an active drone can be shut down in the same manner.<br><br>An antagonist can use an Electromagnetic Sequencer to corrupt their laws and make them follow their orders."
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "repairbot"
|
||||
braintype = "Robot"
|
||||
@@ -79,6 +74,7 @@
|
||||
var/hat_x_offset = 0
|
||||
var/hat_y_offset = -13
|
||||
|
||||
var/can_swipe = TRUE
|
||||
var/rebooting = FALSE
|
||||
|
||||
/mob/living/silicon/robot/drone/can_be_possessed_by(var/mob/abstract/observer/possessor)
|
||||
@@ -122,6 +118,7 @@
|
||||
/mob/living/silicon/robot/drone/construction
|
||||
// Look and feel
|
||||
name = "construction drone"
|
||||
desc_flavor = "It's a bulky construction drone stamped with a NanoTrasen glyph."
|
||||
icon_state = "constructiondrone"
|
||||
|
||||
// Components
|
||||
@@ -131,7 +128,7 @@
|
||||
law_type = /datum/ai_laws/construction_drone
|
||||
|
||||
// Interaction
|
||||
can_pull_size = 5
|
||||
can_pull_size = ITEMSIZE_IMMENSE
|
||||
can_pull_mobs = MOB_PULL_SAME
|
||||
holder_type = /obj/item/holder/drone/heavy
|
||||
|
||||
@@ -141,14 +138,44 @@
|
||||
|
||||
var/my_home_z
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
my_home_z = T.z
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/welcome_drone()
|
||||
to_chat(src, SPAN_NOTICE("<b>You are a construction drone, an autonomous engineering and fabrication system.</b>."))
|
||||
to_chat(src, SPAN_NOTICE("You are assigned to a NanoTrasen construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible."))
|
||||
to_chat(src, SPAN_NOTICE("Use <b>:d</b> to talk to other drones and <b>say</b> to speak silently to your nearby fellows."))
|
||||
to_chat(src, SPAN_NOTICE("<b>You do not follow orders from anyone; not the AI, not humans, and not other synthetics.</b>."))
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/process_level_restrictions()
|
||||
//Abort if they should not get blown
|
||||
if(lock_charge || scrambled_codes || emagged)
|
||||
return FALSE
|
||||
//Check if they are not on a station level -> else abort
|
||||
var/turf/T = get_turf(src)
|
||||
if (!T || AreConnectedZLevels(my_home_z, T.z))
|
||||
return FALSE
|
||||
|
||||
if(!self_destructing)
|
||||
to_chat(src, SPAN_DANGER("WARNING: Removal from [current_map.company_name] property detected. Anti-Theft mode activated."))
|
||||
start_self_destruct(TRUE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/matriarch
|
||||
name = "matriarch drone"
|
||||
desc_flavor = "It's a small matriarch drone. The casing is stamped with an corporate logo and the subscript: '%MAPNAME% Recursive Repair Systems: Heart Of The Swarm!'<br><br><b>OOC Info:</b><br><br>Matriarch drones are player-controlled synthetics which are lawed to maintain the station and not interact with anyone else, except for other drones. They are in command of all the smaller maintenance drones.<br><br>They hold a wide array of tools to build, repair, maintain, and clean. They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, such as fire, radiation, vacuum, and more.<br><br>Ghosts can join the round as a matriarch drone by having a Command whitelist and accessing the 'Ghost Spawner' menu in the 'Ghost' tab.<br><br>An antagonist can use an Electromagnetic Sequencer to corrupt their laws and make them follow their orders."
|
||||
law_type = /datum/ai_laws/matriarch_drone
|
||||
can_swipe = FALSE
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/matriarch/Initialize()
|
||||
. = ..()
|
||||
check_add_to_late_firers()
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/matriarch/shut_down()
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/matriarch/assign_player(mob/user)
|
||||
. = ..()
|
||||
SSghostroles.remove_spawn_atom("matriarchmaintdrone", src)
|
||||
@@ -202,7 +229,7 @@
|
||||
module = new module_type(src, src)
|
||||
recalculate_synth_capacities()
|
||||
|
||||
flavor_text = "It's a tiny little repair drone. The casing is stamped with an corporate logo and the subscript: '[current_map.company_name] Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'"
|
||||
flavor_text = replacetext(desc_flavor, "%MAPNAME%", current_map.company_name)
|
||||
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 50, 0)
|
||||
|
||||
//Redefining some robot procs...
|
||||
@@ -264,6 +291,9 @@
|
||||
to_chat(user, SPAN_WARNING("\The [src] is hermetically sealed. You can't open the case."))
|
||||
return
|
||||
else if(W.GetID() || istype(W, /obj/item/card/robot))
|
||||
if(!can_swipe)
|
||||
to_chat(user, SPAN_WARNING("\The [src] doesn't have an ID swipe interface."))
|
||||
return
|
||||
if(stat == DEAD)
|
||||
if(!config.allow_drone_spawn || emagged || health < -maxHealth) //It's dead, Dave.
|
||||
to_chat(user, SPAN_WARNING("The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one."))
|
||||
@@ -278,10 +308,10 @@
|
||||
request_player()
|
||||
return
|
||||
else
|
||||
user.visible_message(SPAN_WARNING("\The [user] swipes [user.get_pronoun("his")] ID card through \the [src], attempting to shut it down."), SPAN_WARNING("You swipe your ID card through \the [src], attempting to shut it down."))
|
||||
if(emagged)
|
||||
return
|
||||
if(allowed(user))
|
||||
user.visible_message(SPAN_WARNING("\The [user] swipes [user.get_pronoun("his")] ID card through \the [src] shutting it down."), SPAN_NOTICE("You swipe your ID over \the [src], shutting it down! You can swipe it again to make it search for a new intelligence."))
|
||||
shut_down()
|
||||
else
|
||||
to_chat(user, SPAN_WARNING("Access denied."))
|
||||
@@ -500,32 +530,6 @@
|
||||
/mob/living/silicon/robot/drone/set_respawn_time()
|
||||
set_death_time(MINISYNTH, world.time)
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
my_home_z = T.z
|
||||
flavor_text = "It's a bulky construction drone stamped with a NanoTrasen glyph."
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/welcome_drone()
|
||||
to_chat(src, SPAN_NOTICE("<b>You are a construction drone, an autonomous engineering and fabrication system.</b>."))
|
||||
to_chat(src, SPAN_NOTICE("You are assigned to a NanoTrasen construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible."))
|
||||
to_chat(src, SPAN_NOTICE("Use <b>:d</b> to talk to other drones and <b>say</b> to speak silently to your nearby fellows."))
|
||||
to_chat(src, SPAN_NOTICE("<b>You do not follow orders from anyone; not the AI, not humans, and not other synthetics.</b>."))
|
||||
|
||||
/mob/living/silicon/robot/drone/construction/process_level_restrictions()
|
||||
//Abort if they should not get blown
|
||||
if(lock_charge || scrambled_codes || emagged)
|
||||
return FALSE
|
||||
//Check if they are not on a station level -> else abort
|
||||
var/turf/T = get_turf(src)
|
||||
if (!T || AreConnectedZLevels(my_home_z, T.z))
|
||||
return FALSE
|
||||
|
||||
if(!self_destructing)
|
||||
to_chat(src, SPAN_DANGER("WARNING: Removal from [current_map.company_name] property detected. Anti-Theft mode activated."))
|
||||
start_self_destruct(TRUE)
|
||||
return TRUE
|
||||
|
||||
/proc/too_many_active_drones()
|
||||
var/drones = 0
|
||||
for(var/mob/living/silicon/robot/drone/D in mob_list)
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
/obj/item/gift
|
||||
)
|
||||
|
||||
var/list/cant_hold
|
||||
|
||||
var/obj/item/wrapped
|
||||
|
||||
var/force_holder
|
||||
@@ -55,18 +57,17 @@
|
||||
/obj/item/gripper/proc/grip_item(var/obj/item/I, var/mob/user, var/feedback = 1)
|
||||
//This function returns 1 if we successfully took the item, or 0 if it was invalid. This information is useful to the caller
|
||||
if(!wrapped)
|
||||
for(var/typepath in can_hold)
|
||||
if(istype(I,typepath))
|
||||
if(feedback)
|
||||
to_chat(user, SPAN_NOTICE("You collect \the [I]."))
|
||||
if(isturf(I.loc) && I.Adjacent(user))
|
||||
I.do_pickup_animation(user)
|
||||
I.forceMove(src)
|
||||
wrapped = I
|
||||
wrapped.pixel_x = 0
|
||||
wrapped.pixel_y = 0
|
||||
update_icon()
|
||||
return TRUE
|
||||
if((can_hold && is_type_in_list(I, can_hold)) || (cant_hold && !is_type_in_list(I, cant_hold)))
|
||||
if(feedback)
|
||||
to_chat(user, SPAN_NOTICE("You collect \the [I]."))
|
||||
if(isturf(I.loc) && I.Adjacent(user))
|
||||
I.do_pickup_animation(user)
|
||||
I.forceMove(src)
|
||||
wrapped = I
|
||||
wrapped.pixel_x = 0
|
||||
wrapped.pixel_y = 0
|
||||
update_icon()
|
||||
return TRUE
|
||||
if(feedback)
|
||||
to_chat(user, SPAN_WARNING("Your gripper cannot hold \the [I]."))
|
||||
return FALSE
|
||||
@@ -320,3 +321,16 @@
|
||||
/obj/item/stack/material,
|
||||
/obj/item/stack/tile
|
||||
)
|
||||
|
||||
/obj/item/gripper/multi_purpose
|
||||
name = "multi-purpose gripper"
|
||||
desc = "An articulate gripper suited to carrying a wide variety of objects you could encounter on a space-faring vessel."
|
||||
can_hold = null
|
||||
cant_hold = list(
|
||||
/obj/item/stack,
|
||||
/obj/item/gun,
|
||||
/obj/item/clothing,
|
||||
/obj/item/storage,
|
||||
/obj/item/modular_computer,
|
||||
/obj/item/card/id
|
||||
)
|
||||
@@ -208,8 +208,8 @@
|
||||
mult += storage.rating
|
||||
for(var/datum/matter_synth/M in module.synths)
|
||||
M.set_multiplier(mult)
|
||||
for(var/obj/item/stack/material/SM in module.modules)
|
||||
SM.update_strings()
|
||||
for(var/obj/item/stack/SM in module.modules)
|
||||
SM.update_icon()
|
||||
|
||||
/mob/living/silicon/robot/proc/init()
|
||||
ai_camera = new /obj/item/device/camera/siliconcam/robot_camera(src)
|
||||
@@ -346,7 +346,6 @@
|
||||
else
|
||||
braintype = "Cyborg"
|
||||
|
||||
|
||||
var/changed_name = ""
|
||||
if(custom_name)
|
||||
changed_name = custom_name
|
||||
@@ -354,22 +353,7 @@
|
||||
else
|
||||
changed_name = "[mod_type] [braintype]-[rand(1, 999)]"
|
||||
|
||||
real_name = changed_name
|
||||
name = real_name
|
||||
if(mmi)
|
||||
mmi.brainmob.name = src.name
|
||||
mmi.brainmob.real_name = src.name
|
||||
mmi.name = "[initial(mmi.name)]: [src.name]"
|
||||
|
||||
// We also need to update our internal ID
|
||||
if(id_card)
|
||||
id_card.assignment = prefix
|
||||
id_card.registered_name = changed_name
|
||||
id_card.update_name()
|
||||
|
||||
//We also need to update name of internal camera.
|
||||
if(camera)
|
||||
camera.c_tag = changed_name
|
||||
set_name(changed_name, prefix)
|
||||
|
||||
if(!custom_sprite) //Check for custom sprite
|
||||
set_custom_sprite()
|
||||
@@ -493,6 +477,15 @@
|
||||
to_chat(src, SPAN_NOTICE("You [C.toggled ? "disable" : "enable"] [C.name]."))
|
||||
C.toggled = !C.toggled
|
||||
|
||||
/mob/living/silicon/robot/verb/rebuild_overlays()
|
||||
set category = "Robot Commands"
|
||||
set name = "Rebuild Overlays"
|
||||
set desc = "An OOC tool that rebuilds your overlays, useful if your talk bubble gets stuck to you."
|
||||
|
||||
cut_overlays()
|
||||
handle_panel_overlay()
|
||||
set_intent(a_intent)
|
||||
|
||||
/obj/item/robot_module/janitor/verb/toggle_mop()
|
||||
set category = "Robot Commands"
|
||||
set name = "Toggle Mop"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1257,3 +1257,21 @@ proc/is_blind(A)
|
||||
|
||||
/mob/proc/get_organ_name_from_zone(var/def_zone)
|
||||
return parse_zone(def_zone)
|
||||
|
||||
/mob/living/silicon/robot/set_name(var/new_name, var/prefix)
|
||||
..()
|
||||
if(mmi)
|
||||
mmi.brainmob.name = real_name
|
||||
mmi.brainmob.real_name = real_name
|
||||
mmi.name = "[initial(mmi.name)]: [real_name]"
|
||||
|
||||
// We also need to update our internal ID
|
||||
if(id_card)
|
||||
if(prefix)
|
||||
id_card.assignment = prefix
|
||||
id_card.registered_name = real_name
|
||||
id_card.update_name()
|
||||
|
||||
//We also need to update name of internal camera.
|
||||
if(camera)
|
||||
camera.c_tag = real_name
|
||||
|
||||
Reference in New Issue
Block a user