mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-21 04:48:18 +01:00
Can now connect cryo pods and computers with each other using the new multitool methodology.
Also cleans up Destroys().
This commit is contained in:
@@ -196,7 +196,11 @@
|
||||
#include "code\datums\diseases\advance\symptoms\vomit.dm"
|
||||
#include "code\datums\diseases\advance\symptoms\weight.dm"
|
||||
#include "code\datums\expansions\expansion.dm"
|
||||
#include "code\datums\expansions\multitool\_multitool.dm"
|
||||
#include "code\datums\expansions\multitool\cloning.dm"
|
||||
#include "code\datums\expansions\multitool\multitool.dm"
|
||||
#include "code\datums\expansions\multitool\store.dm"
|
||||
#include "code\datums\expansions\multitool\~multitool.dm"
|
||||
#include "code\datums\helper_datums\construction_datum.dm"
|
||||
#include "code\datums\helper_datums\events.dm"
|
||||
#include "code\datums\helper_datums\getrev.dm"
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
#define isnewplayer(A) istype(A, /mob/new_player)
|
||||
|
||||
#define isobj(A) istype(A, /obj)
|
||||
|
||||
#define isobserver(A) istype(A, /mob/dead/observer)
|
||||
|
||||
#define isorgan(A) istype(A, /obj/item/organ/external)
|
||||
|
||||
@@ -12,3 +12,13 @@
|
||||
/datum/expansion/Destroy()
|
||||
holder = null
|
||||
return ..()
|
||||
|
||||
/datum/expansion/CanUseTopic(var/mob/user)
|
||||
return holder && user && !user.incapacitated() ? STATUS_INTERACTIVE : STATUS_CLOSE
|
||||
|
||||
/datum/expansion/Topic()
|
||||
if(..())
|
||||
return 1
|
||||
if(CanUseTopic(usr) != STATUS_INTERACTIVE)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
#define MT_NOACTION 0
|
||||
#define MT_REFRESH 1
|
||||
#define MT_CLOSE 2
|
||||
@@ -0,0 +1,24 @@
|
||||
/datum/expansion/multitool/cryo/get_interact_window(var/obj/item/device/multitool/M, var/mob/user)
|
||||
return buffer(M)
|
||||
|
||||
/datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
|
||||
var/obj/machinery/clonepod/P = M.get_buffer(/obj/machinery/clonepod)
|
||||
var/obj/machinery/computer/cloning/C = holder
|
||||
|
||||
if(!P)
|
||||
user << "<span class='warning'>No valid connection data in \the [M] buffer.</span>"
|
||||
return MT_NOACTION
|
||||
|
||||
var/is_connected = (P in C.pods)
|
||||
if(!is_connected)
|
||||
if(C.connect_pod(P))
|
||||
user << "<span class='notice'>You connect \the [P] to \the [C].</span>"
|
||||
else
|
||||
user << "<span class='warning'>You failed to connect \the [P] to \the [C].</span>"
|
||||
return MT_REFRESH
|
||||
|
||||
if(C.release_pod(P))
|
||||
user << "<span class='notice'>You disconnect \the [P] from \the [C].</span>"
|
||||
else
|
||||
user << "<span class='notice'>You failed to disconnect \the [P] from \the [C].</span>"
|
||||
return MT_REFRESH
|
||||
@@ -1,2 +1,69 @@
|
||||
/datum/expansion/multitool/proc/interact()
|
||||
/datum/expansion/multitool
|
||||
var/window_x = 370
|
||||
var/window_y = 470
|
||||
|
||||
/datum/expansion/multitool/proc/interact(var/obj/item/device/multitool/M, var/mob/user)
|
||||
if(!CanUseTopic(user))
|
||||
return
|
||||
|
||||
var/html = get_interact_window(M, user)
|
||||
if(html)
|
||||
var/datum/browser/popup = new(usr, "multitool", holder.name, window_x, window_y)
|
||||
popup.set_content(html)
|
||||
popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state))
|
||||
popup.open()
|
||||
else
|
||||
close_window(usr)
|
||||
|
||||
/datum/expansion/multitool/proc/get_interact_window(var/obj/item/device/multitool/M, var/mob/user)
|
||||
return
|
||||
|
||||
/datum/expansion/multitool/proc/close_window(var/mob/user)
|
||||
user << browse(null, "window=multitool")
|
||||
|
||||
/datum/expansion/multitool/proc/buffer(var/obj/item/device/multitool/multitool)
|
||||
. += "<b>Buffer Memory:</b><br>"
|
||||
if(multitool.buffer_name)
|
||||
. += "[multitool.buffer_name] <a href='?src=\ref[src];send=\ref[multitool.buffer_object]'>Send</a> <a href='?src=\ref[src];purge=1'>Purge</a><br>"
|
||||
else
|
||||
. += "No connection stored in the buffer."
|
||||
|
||||
/datum/expansion/multitool/CanUseTopic(var/mob/user)
|
||||
. = ..()
|
||||
if(. == STATUS_CLOSE)
|
||||
return
|
||||
|
||||
return user.get_multitool() && user.Adjacent(holder) ? STATUS_INTERACTIVE : STATUS_CLOSE
|
||||
|
||||
/datum/expansion/multitool/Topic(href, href_list)
|
||||
if(..())
|
||||
close_window(usr)
|
||||
return 1
|
||||
|
||||
var/mob/user = usr
|
||||
var/obj/item/device/multitool/M = user.get_multitool()
|
||||
if(href_list["send"])
|
||||
var/atom/buffer = locate(href_list["send"])
|
||||
. = send_buffer(M, buffer, user)
|
||||
else if(href_list["purge"])
|
||||
M.set_buffer(null)
|
||||
. = MT_REFRESH
|
||||
else
|
||||
. = OnTopic(href, href_list, user)
|
||||
|
||||
switch(.)
|
||||
if(MT_REFRESH)
|
||||
interact(M, user)
|
||||
if(MT_CLOSE)
|
||||
close_window(user)
|
||||
return 1
|
||||
|
||||
/datum/expansion/multitool/proc/OnTopic(href, href_list, usr)
|
||||
return
|
||||
|
||||
/datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
|
||||
if(M.buffer_object == buffer)
|
||||
receive_buffer(M, buffer, user)
|
||||
|
||||
/datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/datum/expansion/multitool/store
|
||||
var/can_load_connection
|
||||
|
||||
/datum/expansion/multitool/store/New(var/atom/holder, var/can_load_connection)
|
||||
..()
|
||||
src.can_load_connection = can_load_connection
|
||||
|
||||
/datum/expansion/multitool/store/CanUseTopic()
|
||||
if(can_load_connection && !call(src, can_load_connection)())
|
||||
return STATUS_CLOSE
|
||||
return ..()
|
||||
|
||||
/datum/expansion/multitool/store/interact(var/obj/item/device/multitool/M, var/mob/user)
|
||||
if(!CanUseTopic(user))
|
||||
return
|
||||
|
||||
if(M.get_buffer() == holder)
|
||||
M.set_buffer(null)
|
||||
user << "<span class='warning'>You purge the connection data of \the [holder] from \the [M].</span>"
|
||||
else
|
||||
M.set_buffer(holder)
|
||||
user << "<span class='notice'>You load connection data from \the [holder] to \the [M].</span>"
|
||||
@@ -0,0 +1,3 @@
|
||||
#undef MT_NOACTION
|
||||
#undef MT_REFRESH
|
||||
#undef MT_CLOSE
|
||||
@@ -57,6 +57,12 @@
|
||||
|
||||
RefreshParts()
|
||||
update_icon()
|
||||
expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/store(src)
|
||||
|
||||
/obj/machinery/clonepod/Destroy()
|
||||
if(connected)
|
||||
connected.release_pod(src)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/clonepod/attack_ai(mob/user as mob)
|
||||
|
||||
@@ -239,11 +245,6 @@
|
||||
user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
|
||||
else
|
||||
user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.")
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
var/obj/item/device/multitool/M = W
|
||||
M.set_buffer(src)
|
||||
user << "<span class='notice'>You load connection data from [src] to [M].</span>"
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -18,11 +18,12 @@
|
||||
|
||||
/obj/machinery/computer/cloning/initialize()
|
||||
..()
|
||||
expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/cryo(src)
|
||||
updatemodules()
|
||||
|
||||
/obj/machinery/computer/cloning/Destroy()
|
||||
releasecloner()
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/cloning/proc/updatemodules()
|
||||
src.scanner = findscanner()
|
||||
@@ -52,6 +53,33 @@
|
||||
P.name = initial(P.name)
|
||||
pods.Cut()
|
||||
|
||||
/obj/machinery/computer/cloning/proc/connect_pod(var/obj/machinery/clonepod/P)
|
||||
if(P in pods)
|
||||
return 0
|
||||
|
||||
if(P.connected)
|
||||
P.connected.release_pod(P)
|
||||
P.connected = src
|
||||
pods += P
|
||||
rename_pods()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/cloning/proc/release_pod(var/obj/machinery/clonepod/P)
|
||||
if(!(P in pods))
|
||||
return
|
||||
|
||||
P.connected = null
|
||||
P.name = initial(P.name)
|
||||
pods -= P
|
||||
rename_pods()
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/cloning/proc/rename_pods()
|
||||
for(var/i = 1 to pods.len)
|
||||
var/atom/P = pods[i]
|
||||
P.name = "[initial(P.name)] #[i]"
|
||||
|
||||
/obj/machinery/computer/cloning/proc/findcloner()
|
||||
var/num = 1
|
||||
var/area/A = get_area(src)
|
||||
@@ -70,14 +98,6 @@
|
||||
user << "You insert [W]."
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
var/obj/item/device/multitool/M = W
|
||||
var/obj/machinery/clonepod/P = M.get_buffer()
|
||||
if(istype(P) && !(P in pods))
|
||||
pods += P
|
||||
P.connected = src
|
||||
P.name = "[initial(P.name)] #[pods.len]"
|
||||
user << "<span class='notice'>You connect [P] to [src].</span>"
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -23,18 +23,20 @@
|
||||
var/buffer_name
|
||||
var/atom/buffer_object
|
||||
|
||||
/obj/item/device/multitool/proc/get_buffer()
|
||||
if(buffer_object)
|
||||
/obj/item/device/multitool/proc/get_buffer(var/typepath)
|
||||
// Update the buffer name only when someone fetches the buffer.
|
||||
// Means you cannot be sure the source hasn't been destroyed until the very moment it's needed.
|
||||
buffer_name = buffer_object ? buffer_object.name : null
|
||||
if(buffer_object && (!typepath || istype(buffer_object, typepath)))
|
||||
return buffer_object
|
||||
buffer_name = null
|
||||
|
||||
/obj/item/device/multitool/proc/set_buffer(var/atom/buffer)
|
||||
if(!buffer || istype(buffer))
|
||||
buffer_object = buffer
|
||||
buffer_name = buffer ? buffer_name : null
|
||||
buffer_name = buffer ? buffer.name : null
|
||||
|
||||
/obj/item/device/multitool/resolve_attackby(atom/A, mob/user)
|
||||
if(!isobject(A))
|
||||
if(!isobj(A))
|
||||
return ..(A, user)
|
||||
|
||||
var/obj/O = A
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
processing_objects -= src
|
||||
for(var/expansion in expansions)
|
||||
qdel(expansions[expansion])
|
||||
expansions.Cut()
|
||||
if(expansions)
|
||||
expansions.Cut()
|
||||
return ..()
|
||||
|
||||
/obj/Topic(href, href_list, var/datum/topic_state/state = default_state)
|
||||
|
||||
@@ -29,6 +29,8 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
|
||||
var/image/ghostimage = null //this mobs ghost image, for deleting and stuff
|
||||
var/ghostvision = 1 //is the ghost able to see things humans can't?
|
||||
var/seedarkness = 1
|
||||
|
||||
var/obj/item/device/multitool/ghost_multitool
|
||||
incorporeal_move = 1
|
||||
|
||||
/mob/dead/observer/New(mob/body)
|
||||
@@ -79,9 +81,14 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
|
||||
if(!name) //To prevent nameless ghosts
|
||||
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||
real_name = name
|
||||
|
||||
ghost_multitool = new(src)
|
||||
..()
|
||||
|
||||
/mob/dead/observer/Destroy()
|
||||
qdel(ghost_multitool)
|
||||
ghost_multitool = null
|
||||
|
||||
if (ghostimage)
|
||||
ghost_darkness_images -= ghostimage
|
||||
qdel(ghostimage)
|
||||
|
||||
@@ -83,6 +83,8 @@ var/list/ai_verbs_default = list(
|
||||
var/custom_sprite = 0 // Whether the selected icon is custom
|
||||
var/carded
|
||||
|
||||
var/obj/item/device/multitool/ai_multitool
|
||||
|
||||
/mob/living/silicon/ai/proc/add_ai_verbs()
|
||||
src.verbs |= ai_verbs_default
|
||||
src.verbs |= silicon_subsystems
|
||||
@@ -173,7 +175,6 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
ai_list += src
|
||||
..()
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/proc/on_mob_init()
|
||||
src << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
@@ -201,9 +202,17 @@ var/list/ai_verbs_default = list(
|
||||
setup_icon()
|
||||
|
||||
/mob/living/silicon/ai/Destroy()
|
||||
qdel(aiPDA)
|
||||
qdel(aiMulti)
|
||||
qdel(aiRadio)
|
||||
aiPDA = null
|
||||
aiMulti = null
|
||||
aiRadio = null
|
||||
|
||||
ai_list -= src
|
||||
qdel(eyeobj)
|
||||
..()
|
||||
eyeobj = null
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/ai/proc/setup_icon()
|
||||
var/file = file2text("config/custom_sprites.txt")
|
||||
|
||||
@@ -570,3 +570,19 @@ proc/is_blind(A)
|
||||
return threatcount
|
||||
|
||||
#undef SAFE_PERP
|
||||
|
||||
/mob/proc/get_multitool(var/obj/item/device/multitool/P)
|
||||
if(istype(P))
|
||||
return P
|
||||
|
||||
mob/dead/observer/get_multitool()
|
||||
return can_admin_interact() && ..(ghost_multitool)
|
||||
|
||||
/mob/living/carbon/human/get_multitool()
|
||||
return ..(get_active_hand())
|
||||
|
||||
/mob/living/silicon/robot/get_multitool()
|
||||
return ..(get_active_hand())
|
||||
|
||||
/mob/living/silicon/ai/get_multitool()
|
||||
return ..(aiMulti)
|
||||
|
||||
Reference in New Issue
Block a user