mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Implants work on /living mobs (#22392)
This commit is contained in:
@@ -36,7 +36,7 @@
|
||||
Tr = get_turf(C)
|
||||
if((Tr) && (Tr.z != src.z))
|
||||
continue//Out of range
|
||||
if(!C.implanted)
|
||||
if(!C.imp_in)
|
||||
continue
|
||||
dat += "ID: [C.imp_in.name] | Remaining Units: [C.reagents.total_volume] <BR>"
|
||||
dat += "| Inject: "
|
||||
@@ -48,8 +48,6 @@
|
||||
for(var/obj/item/weapon/implant/tracking/T in tracked_implants)
|
||||
if(!iscarbon(T.imp_in))
|
||||
continue
|
||||
if(!T.implanted)
|
||||
continue
|
||||
Tr = get_turf(T)
|
||||
if((Tr) && (Tr.z != src.z))
|
||||
continue//Out of range
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
L[tmpname] = R
|
||||
|
||||
for (var/obj/item/weapon/implant/tracking/I in tracked_implants)
|
||||
if (!I.implanted || !ismob(I.loc))
|
||||
if (!I.imp_in || !ismob(I.loc))
|
||||
continue
|
||||
else
|
||||
var/mob/M = I.loc
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/obj/item/stack/telecrystal/attack(mob/target, mob/user)
|
||||
if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not.
|
||||
for(var/obj/item/weapon/implant/uplink/I in target)
|
||||
if(I && I.implanted)
|
||||
if(I && I.imp_in)
|
||||
I.hidden_uplink.telecrystals += 1
|
||||
use(1)
|
||||
user << "<span class='notice'>You press [src] onto yourself and charge your hidden uplink.</span>"
|
||||
|
||||
@@ -5,10 +5,9 @@
|
||||
origin_tech = "materials=2;biotech=3;programming=2"
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants
|
||||
var/implanted = null
|
||||
var/mob/living/carbon/imp_in = null
|
||||
var/mob/living/imp_in = null
|
||||
item_color = "b"
|
||||
var/allow_multiple = 0
|
||||
var/allow_multiple = FALSE
|
||||
var/uses = -1
|
||||
flags = DROPDEL
|
||||
|
||||
@@ -22,13 +21,29 @@
|
||||
/obj/item/weapon/implant/ui_action_click()
|
||||
activate("action_button")
|
||||
|
||||
/obj/item/weapon/implant/proc/can_be_implanted_in(mob/living/target) // for human-only and other special requirements
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/can_be_implanted()
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/can_be_implanted()
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/can_be_implanted()
|
||||
return healable //Applies to robots and most non-organics, exceptions can override.
|
||||
|
||||
|
||||
|
||||
//What does the implant do upon injection?
|
||||
//return 1 if the implant injects
|
||||
//return -1 if the implant fails to inject
|
||||
//return 0 if there is no room for implant
|
||||
/obj/item/weapon/implant/proc/implant(mob/living/carbon/source, mob/user, silent = 0)
|
||||
for(var/X in source.implants)
|
||||
/obj/item/weapon/implant/proc/implant(mob/living/target, mob/user, silent = 0)
|
||||
LAZYINITLIST(target.implants)
|
||||
if(!target.can_be_implanted() || !can_be_implanted_in(target))
|
||||
return -1
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/weapon/implant/imp_e = X
|
||||
if(!allow_multiple)
|
||||
@@ -42,27 +57,25 @@
|
||||
else
|
||||
return 0
|
||||
|
||||
src.loc = source
|
||||
imp_in = source
|
||||
source.implants += src
|
||||
implanted = 1
|
||||
src.loc = target
|
||||
imp_in = target
|
||||
target.implants += src
|
||||
if(activated)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(source)
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/H = source
|
||||
A.Grant(target)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
if(user)
|
||||
add_logs(user, source, "implanted", object="[name]")
|
||||
add_logs(user, target, "implanted", object="[name]")
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/implant/proc/removed(mob/living/carbon/source, silent = 0, special = 0)
|
||||
/obj/item/weapon/implant/proc/removed(mob/living/source, silent = 0, special = 0)
|
||||
src.loc = null
|
||||
imp_in = null
|
||||
implanted = 0
|
||||
source.implants -= src
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
if(cooldown == initial(cooldown))
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/weapon/implant/abductor/implant(var/mob/source, var/mob/user)
|
||||
/obj/item/weapon/implant/abductor/implant(mob/living/target, mob/user)
|
||||
if(..())
|
||||
var/obj/machinery/abductor/console/console
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/H = source
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.dna.species.id == "abductor")
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
console = get_team_console(S.team)
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
return
|
||||
timed_explosion()
|
||||
|
||||
/obj/item/weapon/implant/explosive/implant(mob/living/carbon/source)
|
||||
for(var/X in source.implants)
|
||||
/obj/item/weapon/implant/explosive/implant(mob/living/target)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/weapon/implant/explosive/imp_e = X
|
||||
imp_e.heavy += heavy
|
||||
@@ -86,12 +86,12 @@
|
||||
heavy = 4
|
||||
delay = 70
|
||||
|
||||
/obj/item/weapon/implant/explosive/macro/implant(mob/living/carbon/source)
|
||||
for(var/X in source.implants)
|
||||
/obj/item/weapon/implant/explosive/macro/implant(mob/living/target)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
return 0
|
||||
|
||||
for(var/Y in source.implants)
|
||||
for(var/Y in target.implants)
|
||||
if(istype(Y, /obj/item/weapon/implant/explosive))
|
||||
var/obj/item/weapon/implant/explosive/imp_e = Y
|
||||
heavy += imp_e.heavy
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<b>Integrity:</b> Implant's EMP function will destroy itself in the process."}
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/implant/gang/implant(mob/living/carbon/target, mob/user, silent = 0)
|
||||
/obj/item/weapon/implant/gang/implant(mob/living/target, mob/user, silent = 0)
|
||||
if(..())
|
||||
for(var/obj/item/weapon/implant/I in target.implants)
|
||||
if(I != src)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
return dat
|
||||
|
||||
|
||||
/obj/item/weapon/implant/mindshield/implant(mob/living/carbon/target, mob/user, silent = 0)
|
||||
/obj/item/weapon/implant/mindshield/implant(mob/living/target, mob/user, silent = 0)
|
||||
if(..())
|
||||
if((target.mind in (ticker.mode.head_revolutionaries | ticker.mode.get_gang_bosses())))
|
||||
if(!silent)
|
||||
|
||||
@@ -71,11 +71,11 @@
|
||||
var/healthstring = ""
|
||||
|
||||
/obj/item/weapon/implant/health/proc/sensehealth()
|
||||
if (!implanted)
|
||||
if (!imp_in)
|
||||
return "ERROR"
|
||||
else
|
||||
if(isliving(implanted))
|
||||
var/mob/living/L = implanted
|
||||
if(isliving(imp_in))
|
||||
var/mob/living/L = imp_in
|
||||
healthstring = "<small>Oxygen Deprivation Damage => [round(L.getOxyLoss())]<br />Fire Damage => [round(L.getFireLoss())]<br />Toxin Damage => [round(L.getToxLoss())]<br />Brute Force Damage => [round(L.getBruteLoss())]</small>"
|
||||
if (!healthstring)
|
||||
healthstring = "ERROR"
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
storage.remove_from_storage(I, get_turf(source))
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/implant/storage/implant(mob/living/carbon/source, mob/user, silent = 0)
|
||||
for(var/X in source.implants)
|
||||
/obj/item/weapon/implant/storage/implant(mob/living/target, mob/user, silent = 0)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/weapon/implant/storage/imp_e = X
|
||||
imp_e.storage.storage_slots += storage.storage_slots
|
||||
@@ -38,7 +38,7 @@
|
||||
imp_e.storage.contents += storage.contents
|
||||
|
||||
storage.close_all()
|
||||
storage.show_to(source)
|
||||
storage.show_to(target)
|
||||
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
else if(istype(W, /obj/item/weapon/implanter))
|
||||
var/obj/item/weapon/implanter/I = W
|
||||
if(I.imp)
|
||||
if(imp || I.imp.implanted)
|
||||
if(imp || I.imp.imp_in)
|
||||
return
|
||||
I.imp.loc = src
|
||||
imp = I.imp
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
implant(occupant,usr)
|
||||
. = TRUE
|
||||
|
||||
/obj/machinery/implantchair/proc/implant(mob/living/carbon/M,mob/user)
|
||||
/obj/machinery/implantchair/proc/implant(mob/living/M,mob/user)
|
||||
if (!istype(M))
|
||||
return
|
||||
if(!ready_implants || !ready)
|
||||
@@ -85,7 +85,7 @@
|
||||
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, 1)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/implantchair/proc/implant_action(mob/living/carbon/M)
|
||||
/obj/machinery/implantchair/proc/implant_action(mob/living/M)
|
||||
var/obj/item/weapon/implant/I = new implant_type
|
||||
if(I.implant(M))
|
||||
visible_message("<span class='warning'>[M] has been implanted by the [name].</span>")
|
||||
@@ -133,11 +133,11 @@
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
|
||||
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser())
|
||||
return
|
||||
close_machine(target)
|
||||
|
||||
/obj/machinery/implantchair/close_machine(mob/user)
|
||||
/obj/machinery/implantchair/close_machine(mob/living/user)
|
||||
if((isnull(user) || istype(user)) && state_open)
|
||||
..(user)
|
||||
if(auto_inject && ready && ready_implants > 0)
|
||||
@@ -171,8 +171,8 @@
|
||||
var/objective = "Obey the law. Praise Nanotrasen."
|
||||
var/custom = FALSE
|
||||
|
||||
/obj/machinery/implantchair/brainwash/implant_action(mob/living/carbon/C,mob/user)
|
||||
if(!istype(C) || !C.mind)
|
||||
/obj/machinery/implantchair/brainwash/implant_action(mob/living/C,mob/user)
|
||||
if(!istype(C) || !C.mind) // I don't know how this makes any sense for silicons but laws trump objectives anyway.
|
||||
return 0
|
||||
if(custom)
|
||||
if(!user || !user.Adjacent(src))
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
origin_tech = initial(origin_tech)
|
||||
|
||||
|
||||
/obj/item/weapon/implanter/attack(mob/living/carbon/M, mob/user)
|
||||
if(!iscarbon(M))
|
||||
/obj/item/weapon/implanter/attack(mob/living/M, mob/user)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(user && imp)
|
||||
if(M != user)
|
||||
@@ -55,8 +55,7 @@
|
||||
|
||||
/obj/item/weapon/implanter/New()
|
||||
..()
|
||||
spawn(1)
|
||||
update_icon()
|
||||
update_icon()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
hidden_uplink.telecrystals = 10
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implant/uplink/implant(mob/living/carbon/source, mob/user, silent = 0)
|
||||
for(var/X in source.implants)
|
||||
/obj/item/weapon/implant/uplink/implant(mob/living/target, mob/user, silent = 0)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/weapon/implant/imp_e = X
|
||||
imp_e.hidden_uplink.telecrystals += hidden_uplink.telecrystals
|
||||
|
||||
@@ -79,7 +79,7 @@ Frequency:
|
||||
|
||||
src.temp += "<B>Extranneous Signals:</B><BR>"
|
||||
for (var/obj/item/weapon/implant/tracking/W in tracked_implants)
|
||||
if (!W.implanted || !ismob(W.loc))
|
||||
if (!W.imp_in || !ismob(W.loc))
|
||||
continue
|
||||
else
|
||||
var/mob/M = W.loc
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
var/list/internal_organs = list() //List of /obj/item/organ in the mob. They don't go in the contents for some reason I don't want to know.
|
||||
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
|
||||
|
||||
var/list/implants = list()
|
||||
|
||||
var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
|
||||
|
||||
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
|
||||
|
||||
@@ -75,3 +75,5 @@
|
||||
var/list/status_effects //a list of all status effects the mob has
|
||||
|
||||
var/slipping = FALSE
|
||||
|
||||
var/list/implants = null
|
||||
Reference in New Issue
Block a user