310 lines
11 KiB
Plaintext
310 lines
11 KiB
Plaintext
//Xenobio control console
|
|
/mob/camera/aiEye/remote/xenobio
|
|
visible_icon = TRUE
|
|
icon = 'icons/mob/cameramob.dmi'
|
|
icon_state = "generic_camera"
|
|
var/allowed_area = null
|
|
|
|
/mob/camera/aiEye/remote/xenobio/Initialize()
|
|
var/area/A = get_area(loc)
|
|
allowed_area = A.name
|
|
. = ..()
|
|
|
|
/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
|
|
var/area/new_area = get_area(t)
|
|
if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible)
|
|
return ..()
|
|
else
|
|
return
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio
|
|
name = "Slime management console"
|
|
desc = "A computer used for remotely handling slimes."
|
|
networks = list("ss13")
|
|
circuit = /obj/item/circuitboard/computer/xenobiology
|
|
var/datum/action/innate/slime_place/slime_place_action
|
|
var/datum/action/innate/slime_pick_up/slime_up_action
|
|
var/datum/action/innate/feed_slime/feed_slime_action
|
|
var/datum/action/innate/monkey_recycle/monkey_recycle_action
|
|
var/datum/action/innate/slime_scan/scan_action
|
|
var/datum/action/innate/feed_potion/potion_action
|
|
|
|
var/list/stored_slimes
|
|
var/obj/item/slimepotion/slime/current_potion
|
|
var/max_slimes = 1
|
|
var/monkeys = 0
|
|
var/upgradetier = 0
|
|
|
|
icon_screen = "slime_comp"
|
|
icon_keyboard = "rd_key"
|
|
|
|
light_color = LIGHT_COLOR_PINK
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio/Initialize()
|
|
. = ..()
|
|
slime_place_action = new
|
|
slime_up_action = new
|
|
feed_slime_action = new
|
|
monkey_recycle_action = new
|
|
scan_action = new
|
|
potion_action = new
|
|
stored_slimes = list()
|
|
RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
|
|
stored_slimes = null
|
|
QDEL_NULL(current_potion)
|
|
for(var/i in contents)
|
|
var/mob/living/simple_animal/slime/S = i
|
|
if(istype(S))
|
|
S.forceMove(drop_location())
|
|
return ..()
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
|
|
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
|
|
eyeobj.origin = src
|
|
eyeobj.visible_icon = TRUE
|
|
eyeobj.icon = 'icons/mob/cameramob.dmi'
|
|
eyeobj.icon_state = "generic_camera"
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user)
|
|
..()
|
|
|
|
if(slime_up_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
|
|
slime_up_action.target = src
|
|
slime_up_action.Grant(user)
|
|
actions += slime_up_action
|
|
|
|
if(slime_place_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
|
|
slime_place_action.target = src
|
|
slime_place_action.Grant(user)
|
|
actions += slime_place_action
|
|
|
|
if(feed_slime_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
|
feed_slime_action.target = src
|
|
feed_slime_action.Grant(user)
|
|
actions += feed_slime_action
|
|
|
|
if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
|
monkey_recycle_action.target = src
|
|
monkey_recycle_action.Grant(user)
|
|
actions += monkey_recycle_action
|
|
|
|
if(scan_action)
|
|
scan_action.target = src
|
|
scan_action.Grant(user)
|
|
actions += scan_action
|
|
|
|
if(potion_action && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
|
|
potion_action.target = src
|
|
potion_action.Grant(user)
|
|
actions += potion_action
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
|
|
if(current_potion == deleted)
|
|
current_potion = null
|
|
if(deleted in stored_slimes)
|
|
stored_slimes -= deleted
|
|
|
|
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
|
|
if(istype(O, /obj/item/disk/xenobio_console_upgrade))
|
|
var/obj/item/disk/xenobio_console_upgrade/diskthing = O
|
|
var/successfulupgrade = FALSE
|
|
for(var/I in diskthing.upgradetypes)
|
|
if(upgradetier & I)
|
|
continue
|
|
else
|
|
upgradetier |= I
|
|
successfulupgrade = TRUE
|
|
if(I == XENOBIO_UPGRADE_SLIMEADV)
|
|
max_slimes = 10
|
|
if(successfulupgrade)
|
|
to_chat(user, "<span class='notice'>You have successfully upgraded [src] with [O].</span>")
|
|
else
|
|
to_chat(user, "<span class='warning'>[src] already has the contents of [O] installed!</span>")
|
|
return
|
|
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
|
monkeys++
|
|
to_chat(user, "<span class='notice'>You feed [O] to [src]. It now has [monkeys] monkey cubes stored.</span>")
|
|
qdel(O)
|
|
return
|
|
else if(istype(O, /obj/item/storage/bag) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
|
|
var/obj/item/storage/P = O
|
|
var/loaded = FALSE
|
|
for(var/obj/G in P.contents)
|
|
if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube))
|
|
loaded = TRUE
|
|
monkeys++
|
|
qdel(G)
|
|
if(loaded)
|
|
to_chat(user, "<span class='notice'>You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.</span>")
|
|
return
|
|
else if(istype(O, /obj/item/slimepotion/slime) && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
|
|
var/replaced = FALSE
|
|
if(user && !user.transferItemToLoc(O, src))
|
|
return
|
|
if(!QDELETED(current_potion))
|
|
current_potion.forceMove(drop_location())
|
|
replaced = TRUE
|
|
current_potion = O
|
|
to_chat(user, "<span class='notice'>You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].</span>")
|
|
return
|
|
..()
|
|
|
|
/datum/action/innate/slime_place
|
|
name = "Place Slimes"
|
|
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
|
button_icon_state = "slime_down"
|
|
|
|
/datum/action/innate/slime_place/Activate()
|
|
if(!target || !isliving(owner))
|
|
return
|
|
var/mob/living/C = owner
|
|
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
|
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
|
|
|
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
|
for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
|
|
S.forceMove(remote_eye.loc)
|
|
S.visible_message("[S] warps in!")
|
|
X.stored_slimes -= S
|
|
else
|
|
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
|
|
|
/datum/action/innate/slime_pick_up
|
|
name = "Pick up Slime"
|
|
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
|
button_icon_state = "slime_up"
|
|
|
|
/datum/action/innate/slime_pick_up/Activate()
|
|
if(!target || !isliving(owner))
|
|
return
|
|
var/mob/living/C = owner
|
|
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
|
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
|
|
|
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
|
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
|
|
if(X.stored_slimes.len >= X.max_slimes)
|
|
break
|
|
if(!S.ckey)
|
|
if(S.buckled)
|
|
S.Feedstop(silent = TRUE)
|
|
S.visible_message("[S] vanishes in a flash of light!")
|
|
S.forceMove(X)
|
|
X.stored_slimes += S
|
|
else
|
|
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
|
|
|
|
|
/datum/action/innate/feed_slime
|
|
name = "Feed Slimes"
|
|
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
|
button_icon_state = "monkey_down"
|
|
|
|
/datum/action/innate/feed_slime/Activate()
|
|
if(!target || !isliving(owner))
|
|
return
|
|
var/mob/living/C = owner
|
|
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
|
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
|
|
|
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
|
if(X.monkeys >= 1)
|
|
var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner)
|
|
if (!QDELETED(food))
|
|
food.LAssailant = C
|
|
X.monkeys --
|
|
to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
|
|
else
|
|
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
|
|
|
|
|
/datum/action/innate/monkey_recycle
|
|
name = "Recycle Monkeys"
|
|
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
|
button_icon_state = "monkey_up"
|
|
|
|
/datum/action/innate/monkey_recycle/Activate()
|
|
if(!target || !isliving(owner))
|
|
return
|
|
var/mob/living/C = owner
|
|
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
|
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
|
|
|
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
|
for(var/mob/living/carbon/monkey/M in remote_eye.loc)
|
|
if(M.stat)
|
|
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
|
|
X.monkeys = round(X.monkeys + 0.2,0.1)
|
|
qdel(M)
|
|
else
|
|
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
|
|
|
/datum/action/innate/slime_scan
|
|
name = "Scan Slime"
|
|
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
|
button_icon_state = "slime_scan"
|
|
|
|
/datum/action/innate/slime_scan/Activate()
|
|
if(!target || !isliving(owner))
|
|
return
|
|
var/mob/living/C = owner
|
|
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
|
|
|
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
|
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
|
|
slime_scan(S, C)
|
|
else
|
|
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
|
|
|
/datum/action/innate/feed_potion
|
|
name = "Apply Potion"
|
|
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
|
|
button_icon_state = "slime_potion"
|
|
|
|
/datum/action/innate/feed_potion/Activate()
|
|
if(!target || !isliving(owner))
|
|
return
|
|
|
|
var/mob/living/C = owner
|
|
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
|
|
var/obj/machinery/computer/camera_advanced/xenobio/X = target
|
|
|
|
if(QDELETED(X.current_potion))
|
|
to_chat(owner, "<span class='notice'>No potion loaded.</span>")
|
|
return
|
|
|
|
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
|
|
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
|
|
X.current_potion.attack(S, C)
|
|
break
|
|
else
|
|
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
|
|
|
|
/obj/item/disk/xenobio_console_upgrade
|
|
name = "Xenobiology console upgrade disk"
|
|
desc = "Allan please add detail."
|
|
icon_state = "datadisk5"
|
|
var/list/upgradetypes = list()
|
|
|
|
/obj/item/disk/xenobio_console_upgrade/admin
|
|
name = "Xenobio all access thing"
|
|
desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'"
|
|
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS)
|
|
|
|
/obj/item/disk/xenobio_console_upgrade/monkey
|
|
name = "Xenobiology console monkey upgrade disk"
|
|
desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
|
|
upgradetypes = list(XENOBIO_UPGRADE_MONKEYS)
|
|
|
|
/obj/item/disk/xenobio_console_upgrade/slimebasic
|
|
name = "Xenobiology console basic slime upgrade disk"
|
|
desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
|
|
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC)
|
|
|
|
/obj/item/disk/xenobio_console_upgrade/slimeadv
|
|
name = "Xenobiology console advanced slime upgrade disk"
|
|
desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
|
|
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV)
|