Syncs maps, and a bunch of other things that no one will care about/notice/give fucks about until they break. Welcome to conflict hell. (#2460)
* fuck pubby * fuck you too ceres * ree * this is going to be a disaster isn't it * disaster * dme * -_- * tg * woops * proper sync * Welcome to conflict hell. * lets hope this fixes more things than it breaks * gdi * goddamnit
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
/obj/item/implant
|
||||
name = "implant"
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state = "generic" //Shows up as the action button icon
|
||||
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/mob/living/imp_in = null
|
||||
item_color = "b"
|
||||
var/allow_multiple = FALSE
|
||||
var/uses = -1
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
|
||||
/obj/item/implant/proc/trigger(emote, mob/living/carbon/source)
|
||||
return
|
||||
|
||||
/obj/item/implant/proc/activate()
|
||||
return
|
||||
|
||||
/obj/item/implant/ui_action_click()
|
||||
activate("action_button")
|
||||
|
||||
/obj/item/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 0 if there is no room for implant / it fails
|
||||
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = 0)
|
||||
LAZYINITLIST(target.implants)
|
||||
if(!target.can_be_implanted() || !can_be_implanted_in(target))
|
||||
return 0
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/implant/imp_e = X
|
||||
if(!allow_multiple)
|
||||
if(imp_e.uses < initial(imp_e.uses)*2)
|
||||
if(uses == -1)
|
||||
imp_e.uses = -1
|
||||
else
|
||||
imp_e.uses = min(imp_e.uses + uses, initial(imp_e.uses)*2)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
src.loc = target
|
||||
imp_in = target
|
||||
target.implants += src
|
||||
if(activated)
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(target)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
if(user)
|
||||
add_logs(user, target, "implanted", object="[name]")
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/implant/proc/removed(mob/living/source, silent = 0, special = 0)
|
||||
src.loc = null
|
||||
imp_in = null
|
||||
source.implants -= src
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.Grant(source)
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/H = source
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/implant/Destroy()
|
||||
if(imp_in)
|
||||
removed(imp_in)
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/proc/get_data()
|
||||
return "No information available"
|
||||
|
||||
/obj/item/implant/dropped(mob/user)
|
||||
. = 1
|
||||
..()
|
||||
@@ -0,0 +1,46 @@
|
||||
/obj/item/implant/abductor
|
||||
name = "recall implant"
|
||||
desc = "Returns you to the mothership."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "implant"
|
||||
activated = 1
|
||||
origin_tech = "materials=2;biotech=7;magnets=4;bluespace=4;abductor=5"
|
||||
var/obj/machinery/abductor/pad/home
|
||||
var/cooldown = 30
|
||||
|
||||
/obj/item/implant/abductor/activate()
|
||||
if(cooldown == initial(cooldown))
|
||||
home.Retrieve(imp_in,1)
|
||||
cooldown = 0
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
to_chat(imp_in, "<span class='warning'>You must wait [30 - cooldown] seconds to use [src] again!</span>")
|
||||
|
||||
/obj/item/implant/abductor/process()
|
||||
if(cooldown < initial(cooldown))
|
||||
cooldown++
|
||||
if(cooldown == initial(cooldown))
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/implant/abductor/implant(mob/living/target, mob/user)
|
||||
if(..())
|
||||
var/obj/machinery/abductor/console/console
|
||||
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)
|
||||
home = console.pad
|
||||
|
||||
if(!home)
|
||||
console = get_team_console(pick(1, 2, 3, 4))
|
||||
home = console.pad
|
||||
return 1
|
||||
|
||||
/obj/item/implant/abductor/proc/get_team_console(var/team)
|
||||
var/obj/machinery/abductor/console/console
|
||||
for(var/obj/machinery/abductor/console/c in GLOB.machines)
|
||||
if(c.team == team)
|
||||
console = c
|
||||
break
|
||||
return console
|
||||
@@ -0,0 +1,63 @@
|
||||
/obj/item/implant/chem
|
||||
name = "chem implant"
|
||||
desc = "Injects things."
|
||||
icon_state = "reagents"
|
||||
origin_tech = "materials=3;biotech=4"
|
||||
container_type = OPENCONTAINER_1
|
||||
|
||||
/obj/item/implant/chem/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Robust Corp MJ-420 Prisoner Management Implant<BR>
|
||||
<b>Life:</b> Deactivates upon death but remains within the body.<BR>
|
||||
<b>Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject<BR>
|
||||
will suffer from an increased appetite.</B><BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal<BR>
|
||||
the implant releases the chemicals directly into the blood stream.<BR>
|
||||
<b>Special Features:</b>
|
||||
<i>Micro-Capsule</i>- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.<BR>
|
||||
Can only be loaded while still in its original case.<BR>
|
||||
<b>Integrity:</b> Implant will last so long as the subject is alive."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/chem/New()
|
||||
..()
|
||||
create_reagents(50)
|
||||
GLOB.tracked_chem_implants += src
|
||||
|
||||
/obj/item/implant/chem/Destroy()
|
||||
. = ..()
|
||||
GLOB.tracked_chem_implants -= src
|
||||
|
||||
/obj/item/implant/chem/trigger(emote, mob/source)
|
||||
if(emote == "deathgasp")
|
||||
activate(reagents.total_volume)
|
||||
|
||||
/obj/item/implant/chem/activate(cause)
|
||||
if(!cause || !imp_in)
|
||||
return 0
|
||||
var/mob/living/carbon/R = imp_in
|
||||
var/injectamount = null
|
||||
if (cause == "action_button")
|
||||
injectamount = reagents.total_volume
|
||||
else
|
||||
injectamount = cause
|
||||
reagents.trans_to(R, injectamount)
|
||||
to_chat(R, "<span class='italics'>You hear a faint beep.</span>")
|
||||
if(!reagents.total_volume)
|
||||
to_chat(R, "<span class='italics'>You hear a faint click from your chest.</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/implantcase/chem
|
||||
name = "implant case - 'Remote Chemical'"
|
||||
desc = "A glass case containing a remote chemical implant."
|
||||
imp_type = /obj/item/implant/chem
|
||||
|
||||
/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/reagent_containers/syringe) && imp)
|
||||
W.afterattack(imp, user, TRUE, params)
|
||||
return TRUE
|
||||
else
|
||||
return ..()
|
||||
@@ -0,0 +1,23 @@
|
||||
/obj/item/implant/sad_trombone
|
||||
name = "sad trombone implant"
|
||||
activated = 0
|
||||
|
||||
/obj/item/implant/sad_trombone/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Honk Co. Sad Trombone Implant<BR>
|
||||
<b>Life:</b> Activates upon death.<BR>
|
||||
"}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/sad_trombone/trigger(emote, mob/source)
|
||||
if(emote == "deathgasp")
|
||||
playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0)
|
||||
|
||||
/obj/item/implanter/sad_trombone
|
||||
name = "implanter (sad_trombone)"
|
||||
imp_type = /obj/item/implant/sad_trombone
|
||||
|
||||
/obj/item/implantcase/sad_trombone
|
||||
name = "implant case - 'Sad Trombone'"
|
||||
desc = "A glass case containing a sad trombone implant."
|
||||
imp_type = /obj/item/implant/sad_trombone
|
||||
@@ -0,0 +1,23 @@
|
||||
//Exile implants will allow you to use the station gate, but not return home.
|
||||
//This will allow security to exile badguys/for badguys to exile their kill targets
|
||||
|
||||
/obj/item/implant/exile
|
||||
name = "exile implant"
|
||||
desc = "Prevents you from returning from away missions"
|
||||
origin_tech = "materials=2;biotech=3;magnets=2;bluespace=3"
|
||||
activated = 0
|
||||
|
||||
/obj/item/implant/exile/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Nanotrasen Employee Exile Implant<BR>
|
||||
<b>Implant Details:</b> The onboard gateway system has been modified to reject entry by individuals containing this implant<BR>"}
|
||||
return dat
|
||||
|
||||
/obj/item/implanter/exile
|
||||
name = "implanter (exile)"
|
||||
imp_type = /obj/item/implant/exile
|
||||
|
||||
/obj/item/implantcase/exile
|
||||
name = "implant case - 'Exile'"
|
||||
desc = "A glass case containing an exile implant."
|
||||
imp_type = /obj/item/implant/exile
|
||||
@@ -0,0 +1,123 @@
|
||||
/obj/item/implant/explosive
|
||||
name = "microbomb implant"
|
||||
desc = "And boom goes the weasel."
|
||||
icon_state = "explosive"
|
||||
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
|
||||
actions_types = list(/datum/action/item_action/explosive_implant)
|
||||
// Explosive implant action is always availible.
|
||||
var/weak = 2
|
||||
var/medium = 0.8
|
||||
var/heavy = 0.4
|
||||
var/delay = 7
|
||||
var/popup = FALSE // is the DOUWANNABLOWUP window open?
|
||||
var/active = FALSE
|
||||
|
||||
/obj/item/implant/explosive/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Robust Corp RX-78 Employee Management Implant<BR>
|
||||
<b>Life:</b> Activates upon death.<BR>
|
||||
<b>Important Notes:</b> Explodes<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.<BR>
|
||||
<b>Special Features:</b> Explodes<BR>
|
||||
"}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/explosive/trigger(emote, mob/source)
|
||||
if(emote == "deathgasp")
|
||||
activate("death")
|
||||
|
||||
/obj/item/implant/explosive/activate(cause)
|
||||
if(!cause || !imp_in || active)
|
||||
return 0
|
||||
if(cause == "action_button" && !popup)
|
||||
popup = TRUE
|
||||
var/response = alert(imp_in, "Are you sure you want to activate your [name]? This will cause you to explode!", "[name] Confirmation", "Yes", "No")
|
||||
popup = FALSE
|
||||
if(response == "No")
|
||||
return 0
|
||||
heavy = round(heavy)
|
||||
medium = round(medium)
|
||||
weak = round(weak)
|
||||
to_chat(imp_in, "<span class='notice'>You activate your [name].</span>")
|
||||
active = TRUE
|
||||
var/turf/boomturf = get_turf(imp_in)
|
||||
var/area/A = get_area(boomturf)
|
||||
message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [A.name] [ADMIN_JMP(boomturf)].")
|
||||
//If the delay is short, just blow up already jeez
|
||||
if(delay <= 7)
|
||||
explosion(src,heavy,medium,weak,weak, flame_range = weak)
|
||||
if(imp_in)
|
||||
imp_in.gib(1)
|
||||
qdel(src)
|
||||
return
|
||||
timed_explosion()
|
||||
|
||||
/obj/item/implant/explosive/implant(mob/living/target)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/implant/explosive/imp_e = X
|
||||
imp_e.heavy += heavy
|
||||
imp_e.medium += medium
|
||||
imp_e.weak += weak
|
||||
imp_e.delay += delay
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/explosive/proc/timed_explosion()
|
||||
imp_in.visible_message("<span class='warning'>[imp_in] starts beeping ominously!</span>")
|
||||
playsound(loc, 'sound/items/timer.ogg', 30, 0)
|
||||
sleep(delay*0.25)
|
||||
if(imp_in && !imp_in.stat)
|
||||
imp_in.visible_message("<span class='warning'>[imp_in] doubles over in pain!</span>")
|
||||
imp_in.Knockdown(140)
|
||||
playsound(loc, 'sound/items/timer.ogg', 30, 0)
|
||||
sleep(delay*0.25)
|
||||
playsound(loc, 'sound/items/timer.ogg', 30, 0)
|
||||
sleep(delay*0.25)
|
||||
playsound(loc, 'sound/items/timer.ogg', 30, 0)
|
||||
sleep(delay*0.25)
|
||||
explosion(src,heavy,medium,weak,weak, flame_range = weak)
|
||||
if(imp_in)
|
||||
imp_in.gib(1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/implant/explosive/macro
|
||||
name = "macrobomb implant"
|
||||
desc = "And boom goes the weasel. And everything else nearby."
|
||||
icon_state = "explosive"
|
||||
origin_tech = "materials=3;combat=5;biotech=4;syndicate=5"
|
||||
weak = 16
|
||||
medium = 8
|
||||
heavy = 4
|
||||
delay = 70
|
||||
|
||||
/obj/item/implant/explosive/macro/implant(mob/living/target)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
return 0
|
||||
|
||||
for(var/Y in target.implants)
|
||||
if(istype(Y, /obj/item/implant/explosive))
|
||||
var/obj/item/implant/explosive/imp_e = Y
|
||||
heavy += imp_e.heavy
|
||||
medium += imp_e.medium
|
||||
weak += imp_e.weak
|
||||
delay += imp_e.delay
|
||||
qdel(imp_e)
|
||||
break
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/implanter/explosive
|
||||
name = "implanter (explosive)"
|
||||
imp_type = /obj/item/implant/explosive
|
||||
|
||||
/obj/item/implantcase/explosive
|
||||
name = "implant case - 'Explosive'"
|
||||
desc = "A glass case containing an explosive implant."
|
||||
imp_type = /obj/item/implant/explosive
|
||||
@@ -0,0 +1,44 @@
|
||||
/obj/item/implant/freedom
|
||||
name = "freedom implant"
|
||||
desc = "Use this to escape from those evil Red Shirts."
|
||||
icon_state = "freedom"
|
||||
item_color = "r"
|
||||
origin_tech = "combat=5;magnets=3;biotech=4;syndicate=2"
|
||||
uses = 4
|
||||
|
||||
|
||||
/obj/item/implant/freedom/activate()
|
||||
uses--
|
||||
to_chat(imp_in, "You feel a faint click.")
|
||||
if(iscarbon(imp_in))
|
||||
var/mob/living/carbon/C_imp_in = imp_in
|
||||
C_imp_in.uncuff()
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/implant/freedom/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Freedom Beacon<BR>
|
||||
<b>Life:</b> optimum 5 uses<BR>
|
||||
<b>Important Notes:</b> <font color='red'>Illegal</font><BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Transmits a specialized cluster of signals to override handcuff locking
|
||||
mechanisms<BR>
|
||||
<b>Special Features:</b><BR>
|
||||
<i>Neuro-Scan</i>- Analyzes certain shadow signals in the nervous system<BR>
|
||||
<HR>
|
||||
No Implant Specifics"}
|
||||
return dat
|
||||
|
||||
|
||||
/obj/item/implanter/freedom
|
||||
name = "implanter (freedom)"
|
||||
imp_type = /obj/item/implant/freedom
|
||||
|
||||
/obj/item/implantcase/freedom
|
||||
name = "implant case - 'Freedom'"
|
||||
desc = "A glass case containing a freedom implant."
|
||||
imp_type = /obj/item/implant/freedom
|
||||
@@ -0,0 +1,55 @@
|
||||
/obj/item/implant/gang
|
||||
name = "gang implant"
|
||||
desc = "Makes you a gangster or such."
|
||||
activated = 0
|
||||
origin_tech = "materials=2;biotech=4;programming=4;syndicate=3"
|
||||
var/datum/gang/gang
|
||||
|
||||
/obj/item/implant/gang/New(loc,var/setgang)
|
||||
..()
|
||||
gang = setgang
|
||||
|
||||
/obj/item/implant/gang/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Criminal brainwash implant<BR>
|
||||
<b>Life:</b> A few seconds after injection.<BR>
|
||||
<b>Important Notes:</b> Illegal<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Contains a small pod of nanobots that change the host's brain to be loyal to a certain organization.<BR>
|
||||
<b>Special Features:</b> This device will also emit a small EMP pulse, destroying any other implants within the host's brain.<BR>
|
||||
<b>Integrity:</b> Implant's EMP function will destroy itself in the process."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/gang/implant(mob/living/target, mob/user, silent = 0)
|
||||
if(..())
|
||||
for(var/obj/item/implant/I in target.implants)
|
||||
if(I != src)
|
||||
qdel(I)
|
||||
|
||||
if(!target.mind || target.stat == DEAD)
|
||||
return 0
|
||||
|
||||
var/success
|
||||
if(target.mind in SSticker.mode.get_gangsters())
|
||||
if(SSticker.mode.remove_gangster(target.mind,0,1))
|
||||
success = 1 //Was not a gang boss, convert as usual
|
||||
else
|
||||
success = 1
|
||||
|
||||
if(ishuman(target))
|
||||
if(!success)
|
||||
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel the influence of your enemies try to invade your mind!</span>")
|
||||
|
||||
qdel(src)
|
||||
return 0
|
||||
|
||||
/obj/item/implanter/gang
|
||||
name = "implanter (gang)"
|
||||
|
||||
/obj/item/implanter/gang/New(loc, gang)
|
||||
if(!gang)
|
||||
qdel(src)
|
||||
return
|
||||
imp = new /obj/item/implant/gang(src,gang)
|
||||
..()
|
||||
@@ -0,0 +1,37 @@
|
||||
/obj/item/implant/krav_maga
|
||||
name = "krav maga implant"
|
||||
desc = "Teaches you the arts of Krav Maga in 5 short instructional videos beamed directly into your eyeballs."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state ="scroll2"
|
||||
activated = 1
|
||||
origin_tech = "materials=2;biotech=4;combat=5;syndicate=4"
|
||||
var/datum/martial_art/krav_maga/style = new
|
||||
|
||||
/obj/item/implant/krav_maga/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Krav Maga Implant<BR>
|
||||
<b>Life:</b> 4 hours after death of host<BR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Teaches even the clumsiest host the arts of Krav Maga."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/krav_maga/activate()
|
||||
var/mob/living/carbon/human/H = imp_in
|
||||
if(!ishuman(H))
|
||||
return
|
||||
if(!H.mind)
|
||||
return
|
||||
if(istype(H.mind.martial_art, /datum/martial_art/krav_maga))
|
||||
style.remove(H)
|
||||
else
|
||||
style.teach(H,1)
|
||||
|
||||
/obj/item/implanter/krav_maga
|
||||
name = "implanter (krav maga)"
|
||||
imp_type = /obj/item/implant/krav_maga
|
||||
|
||||
/obj/item/implantcase/krav_maga
|
||||
name = "implant case - 'Krav Maga'"
|
||||
desc = "A glass case containing an implant that can teach the user the arts of Krav Maga."
|
||||
imp_type = /obj/item/implant/krav_maga
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/obj/item/implant/mindshield
|
||||
name = "mindshield implant"
|
||||
desc = "Protects against brainwashing."
|
||||
origin_tech = "materials=2;biotech=4;programming=4"
|
||||
activated = 0
|
||||
|
||||
/obj/item/implant/mindshield/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Nanotrasen Employee Management Implant<BR>
|
||||
<b>Life:</b> Ten years.<BR>
|
||||
<b>Important Notes:</b> Personnel injected with this device are much more resistant to brainwashing.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Contains a small pod of nanobots that protects the host's mental functions from manipulation.<BR>
|
||||
<b>Special Features:</b> Will prevent and cure most forms of brainwashing.<BR>
|
||||
<b>Integrity:</b> Implant will last so long as the nanobots are inside the bloodstream."}
|
||||
return dat
|
||||
|
||||
|
||||
/obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = 0)
|
||||
if(..())
|
||||
if((target.mind in (SSticker.mode.head_revolutionaries | SSticker.mode.get_gang_bosses())))
|
||||
if(!silent)
|
||||
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
|
||||
removed(target, 1)
|
||||
qdel(src)
|
||||
return 0
|
||||
if(target.mind in SSticker.mode.get_gangsters())
|
||||
SSticker.mode.remove_gangster(target.mind)
|
||||
if(!silent)
|
||||
target.visible_message("<span class='warning'>[src] was destroyed in the process!</span>", "<span class='notice'>You feel a sense of peace and security. You are now protected from brainwashing.</span>")
|
||||
removed(target, 1)
|
||||
qdel(src)
|
||||
return 0
|
||||
if(target.mind in SSticker.mode.revolutionaries)
|
||||
SSticker.mode.remove_revolutionary(target.mind)
|
||||
if(!silent)
|
||||
if(target.mind in SSticker.mode.cult)
|
||||
to_chat(target, "<span class='warning'>You feel something interfering with your mental conditioning, but you resist it!</span>")
|
||||
else
|
||||
to_chat(target, "<span class='notice'>You feel a sense of peace and security. You are now protected from brainwashing.</span>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/implant/mindshield/removed(mob/target, silent = 0, special = 0)
|
||||
if(..())
|
||||
if(target.stat != DEAD && !silent)
|
||||
to_chat(target, "<span class='boldnotice'>Your mind suddenly feels terribly vulnerable. You are no longer safe from brainwashing.</span>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/implanter/mindshield
|
||||
name = "implanter (mindshield)"
|
||||
imp_type = /obj/item/implant/mindshield
|
||||
|
||||
/obj/item/implantcase/mindshield
|
||||
name = "implant case - 'Mindshield'"
|
||||
desc = "A glass case containing a mindshield implant."
|
||||
imp_type = /obj/item/implant/mindshield
|
||||
@@ -0,0 +1,82 @@
|
||||
/obj/item/implant/weapons_auth
|
||||
name = "firearms authentication implant"
|
||||
desc = "Lets you shoot your guns"
|
||||
icon_state = "auth"
|
||||
origin_tech = "magnets=2;programming=7;biotech=5;syndicate=5"
|
||||
activated = 0
|
||||
|
||||
/obj/item/implant/weapons_auth/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Firearms Authentication Implant<BR>
|
||||
<b>Life:</b> 4 hours after death of host<BR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Allows operation of implant-locked weaponry, preventing equipment from falling into enemy hands."}
|
||||
return dat
|
||||
|
||||
|
||||
/obj/item/implant/adrenalin
|
||||
name = "adrenal implant"
|
||||
desc = "Removes all stuns."
|
||||
icon_state = "adrenal"
|
||||
origin_tech = "materials=2;biotech=4;combat=3;syndicate=4"
|
||||
uses = 3
|
||||
|
||||
/obj/item/implant/adrenalin/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Cybersun Industries Adrenaline Implant<BR>
|
||||
<b>Life:</b> Five days.<BR>
|
||||
<b>Important Notes:</b> <font color='red'>Illegal</font><BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b> Subjects injected with implant can activate an injection of medical cocktails.<BR>
|
||||
<b>Function:</b> Removes stuns, increases speed, and has a mild healing effect.<BR>
|
||||
<b>Integrity:</b> Implant can only be used three times before reserves are depleted."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/adrenalin/activate()
|
||||
uses--
|
||||
to_chat(imp_in, "<span class='notice'>You feel a sudden surge of energy!</span>")
|
||||
imp_in.SetStun(0)
|
||||
imp_in.SetKnockdown(0)
|
||||
imp_in.SetUnconscious(0)
|
||||
imp_in.adjustStaminaLoss(-75)
|
||||
imp_in.lying = 0
|
||||
imp_in.update_canmove()
|
||||
|
||||
imp_in.reagents.add_reagent("synaptizine", 10)
|
||||
imp_in.reagents.add_reagent("omnizine", 10)
|
||||
imp_in.reagents.add_reagent("stimulants", 10)
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/implant/emp
|
||||
name = "emp implant"
|
||||
desc = "Triggers an EMP."
|
||||
icon_state = "emp"
|
||||
origin_tech = "biotech=3;magnets=4;syndicate=1"
|
||||
uses = 3
|
||||
|
||||
/obj/item/implant/emp/activate()
|
||||
uses--
|
||||
empulse(imp_in, 3, 5)
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
|
||||
//Health Tracker Implant
|
||||
|
||||
/obj/item/implant/health
|
||||
name = "health implant"
|
||||
activated = 0
|
||||
var/healthstring = ""
|
||||
|
||||
/obj/item/implant/health/proc/sensehealth()
|
||||
if (!imp_in)
|
||||
return "ERROR"
|
||||
else
|
||||
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"
|
||||
return healthstring
|
||||
@@ -0,0 +1,50 @@
|
||||
/obj/item/storage/internal/implant
|
||||
name = "bluespace pocket"
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
max_combined_w_class = 6
|
||||
cant_hold = list(/obj/item/disk/nuclear)
|
||||
silent = 1
|
||||
|
||||
|
||||
/obj/item/implant/storage
|
||||
name = "storage implant"
|
||||
desc = "Stores up to two big items in a bluespace pocket."
|
||||
icon_state = "storage"
|
||||
origin_tech = "materials=2;magnets=4;bluespace=5;syndicate=4"
|
||||
item_color = "r"
|
||||
var/obj/item/storage/internal/implant/storage
|
||||
|
||||
/obj/item/implant/storage/New()
|
||||
..()
|
||||
storage = new /obj/item/storage/internal/implant(src)
|
||||
|
||||
/obj/item/implant/storage/activate()
|
||||
storage.MouseDrop(imp_in)
|
||||
|
||||
/obj/item/implant/storage/removed(source, silent = 0, special = 0)
|
||||
if(..())
|
||||
if(!special)
|
||||
storage.close_all()
|
||||
for(var/obj/item/I in storage)
|
||||
storage.remove_from_storage(I, get_turf(source))
|
||||
return 1
|
||||
|
||||
/obj/item/implant/storage/implant(mob/living/target, mob/user, silent = 0)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/implant/storage/imp_e = X
|
||||
imp_e.storage.storage_slots += storage.storage_slots
|
||||
imp_e.storage.max_combined_w_class += storage.max_combined_w_class
|
||||
imp_e.storage.contents += storage.contents
|
||||
|
||||
storage.close_all()
|
||||
storage.show_to(target)
|
||||
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/implanter/storage
|
||||
name = "implanter (storage)"
|
||||
imp_type = /obj/item/implant/storage
|
||||
@@ -0,0 +1,41 @@
|
||||
/obj/item/implant/tracking
|
||||
name = "tracking implant"
|
||||
desc = "Track with this."
|
||||
activated = 0
|
||||
origin_tech = "materials=2;magnets=2;programming=2;biotech=2"
|
||||
|
||||
/obj/item/implant/tracking/New()
|
||||
..()
|
||||
GLOB.tracked_implants += src
|
||||
|
||||
/obj/item/implant/tracking/Destroy()
|
||||
. = ..()
|
||||
GLOB.tracked_implants -= src
|
||||
|
||||
/obj/item/implanter/tracking
|
||||
imp_type = /obj/item/implant/tracking
|
||||
|
||||
/obj/item/implanter/tracking/gps
|
||||
imp_type = /obj/item/device/gps/mining/internal
|
||||
|
||||
/obj/item/implant/tracking/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Tracking Beacon<BR>
|
||||
<b>Life:</b> 10 minutes after death of host<BR>
|
||||
<b>Important Notes:</b> None<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Continuously transmits low power signal. Useful for tracking.<BR>
|
||||
<b>Special Features:</b><BR>
|
||||
<i>Neuro-Safe</i>- Specialized shell absorbs excess voltages self-destructing the chip if
|
||||
a malfunction occurs thereby securing safety of subject. The implant will melt and
|
||||
disintegrate into bio-safe elements.<BR>
|
||||
<b>Integrity:</b> Gradient creates slight risk of being overcharged and frying the
|
||||
circuitry. As a result neurotoxins can cause massive damage."}
|
||||
return dat
|
||||
|
||||
|
||||
/obj/item/implantcase/track
|
||||
name = "implant case - 'Tracking'"
|
||||
desc = "A glass case containing a tracking implant."
|
||||
imp_type = /obj/item/implant/tracking
|
||||
@@ -0,0 +1,83 @@
|
||||
/obj/item/implantcase
|
||||
name = "implant case"
|
||||
desc = "A glass case containing an implant."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "implantcase-0"
|
||||
item_state = "implantcase"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "materials=1;biotech=2"
|
||||
materials = list(MAT_GLASS=500)
|
||||
var/obj/item/implant/imp = null
|
||||
var/imp_type
|
||||
|
||||
|
||||
/obj/item/implantcase/update_icon()
|
||||
if(imp)
|
||||
icon_state = "implantcase-[imp.item_color]"
|
||||
origin_tech = imp.origin_tech
|
||||
reagents = imp.reagents
|
||||
else
|
||||
icon_state = "implantcase-0"
|
||||
origin_tech = initial(origin_tech)
|
||||
reagents = null
|
||||
|
||||
|
||||
/obj/item/implantcase/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/pen))
|
||||
var/t = stripped_input(user, "What would you like the label to be?", name, null)
|
||||
if(user.get_active_held_item() != W)
|
||||
return
|
||||
if(!in_range(src, user) && loc != user)
|
||||
return
|
||||
if(t)
|
||||
name = "implant case - '[t]'"
|
||||
else
|
||||
name = "implant case"
|
||||
else if(istype(W, /obj/item/implanter))
|
||||
var/obj/item/implanter/I = W
|
||||
if(I.imp)
|
||||
if(imp || I.imp.imp_in)
|
||||
return
|
||||
I.imp.loc = src
|
||||
imp = I.imp
|
||||
I.imp = null
|
||||
update_icon()
|
||||
I.update_icon()
|
||||
else
|
||||
if(imp)
|
||||
if(I.imp)
|
||||
return
|
||||
imp.loc = I
|
||||
I.imp = imp
|
||||
imp = null
|
||||
update_icon()
|
||||
I.update_icon()
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/implantcase/Initialize(mapload)
|
||||
..()
|
||||
if(imp_type)
|
||||
imp = new imp_type(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/implantcase/tracking
|
||||
name = "implant case - 'Tracking'"
|
||||
desc = "A glass case containing a tracking implant."
|
||||
imp_type = /obj/item/implant/tracking
|
||||
|
||||
/obj/item/implantcase/weapons_auth
|
||||
name = "implant case - 'Firearms Authentication'"
|
||||
desc = "A glass case containing a firearms authentication implant."
|
||||
imp_type = /obj/item/implant/weapons_auth
|
||||
|
||||
/obj/item/implantcase/adrenaline
|
||||
name = "implant case - 'Adrenaline'"
|
||||
desc = "A glass case containing an adrenaline implant."
|
||||
imp_type = /obj/item/implant/adrenalin
|
||||
@@ -0,0 +1,187 @@
|
||||
/obj/machinery/implantchair
|
||||
name = "mindshield implanter"
|
||||
desc = "Used to implant occupants with mindshield implants."
|
||||
icon = 'icons/obj/machines/implantchair.dmi'
|
||||
icon_state = "implantchair"
|
||||
density = TRUE
|
||||
opacity = 0
|
||||
anchored = TRUE
|
||||
|
||||
var/ready = TRUE
|
||||
var/replenishing = FALSE
|
||||
|
||||
var/ready_implants = 5
|
||||
var/max_implants = 5
|
||||
var/injection_cooldown = 600
|
||||
var/replenish_cooldown = 6000
|
||||
var/implant_type = /obj/item/implant/mindshield
|
||||
var/auto_inject = FALSE
|
||||
var/auto_replenish = TRUE
|
||||
var/special = FALSE
|
||||
var/special_name = "special function"
|
||||
|
||||
/obj/machinery/implantchair/Initialize()
|
||||
. = ..()
|
||||
open_machine()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "implantchair", name, 375, 280, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
|
||||
/obj/machinery/implantchair/ui_data()
|
||||
var/list/data = list()
|
||||
data["occupied"] = occupant ? 1 : 0
|
||||
data["open"] = state_open
|
||||
|
||||
data["occupant"] = list()
|
||||
if(occupant)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
data["occupant"]["name"] = mob_occupant.name
|
||||
data["occupant"]["stat"] = mob_occupant.stat
|
||||
|
||||
data["special_name"] = special ? special_name : null
|
||||
data["ready_implants"] = ready_implants
|
||||
data["ready"] = ready
|
||||
data["replenishing"] = replenishing
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/implantchair/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("door")
|
||||
if(state_open)
|
||||
close_machine()
|
||||
else
|
||||
open_machine()
|
||||
. = TRUE
|
||||
if("implant")
|
||||
implant(occupant,usr)
|
||||
. = TRUE
|
||||
|
||||
/obj/machinery/implantchair/proc/implant(mob/living/M,mob/user)
|
||||
if (!istype(M))
|
||||
return
|
||||
if(!ready_implants || !ready)
|
||||
return
|
||||
if(implant_action(M,user))
|
||||
ready_implants--
|
||||
if(!replenishing && auto_replenish)
|
||||
replenishing = TRUE
|
||||
addtimer(CALLBACK(src,"replenish"),replenish_cooldown)
|
||||
if(injection_cooldown > 0)
|
||||
ready = FALSE
|
||||
addtimer(CALLBACK(src,"set_ready"),injection_cooldown)
|
||||
else
|
||||
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, 1)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/implantchair/proc/implant_action(mob/living/M)
|
||||
var/obj/item/implant/I = new implant_type
|
||||
if(I.implant(M))
|
||||
visible_message("<span class='warning'>[M] has been implanted by the [name].</span>")
|
||||
return 1
|
||||
|
||||
/obj/machinery/implantchair/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
if(state_open)
|
||||
icon_state += "_open"
|
||||
if(occupant)
|
||||
icon_state += "_occupied"
|
||||
if(ready)
|
||||
add_overlay("ready")
|
||||
else
|
||||
cut_overlays()
|
||||
|
||||
/obj/machinery/implantchair/proc/replenish()
|
||||
if(ready_implants < max_implants)
|
||||
ready_implants++
|
||||
if(ready_implants < max_implants)
|
||||
addtimer(CALLBACK(src,"replenish"),replenish_cooldown)
|
||||
else
|
||||
replenishing = FALSE
|
||||
|
||||
/obj/machinery/implantchair/proc/set_ready()
|
||||
ready = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/implantchair/container_resist(mob/living/user)
|
||||
if(state_open)
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_BREAKOUT)
|
||||
user.last_special = world.time + CLICK_CD_BREAKOUT
|
||||
to_chat(user, "<span class='notice'>You lean on the back of [src] and start pushing the door open... (this will take about about a minute.)</span>")
|
||||
audible_message("<span class='italics'>You hear a metallic creaking from [src]!</span>",hearing_distance = 2)
|
||||
|
||||
if(do_after(user, 600, target = src))
|
||||
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open)
|
||||
return
|
||||
visible_message("<span class='warning'>[user] successfully broke out of [src]!</span>")
|
||||
to_chat(user, "<span class='notice'>You successfully break out of [src]!</span>")
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/implantchair/relaymove(mob/user)
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser())
|
||||
return
|
||||
close_machine(target)
|
||||
|
||||
/obj/machinery/implantchair/close_machine(mob/living/user)
|
||||
if((isnull(user) || istype(user)) && state_open)
|
||||
..(user)
|
||||
if(auto_inject && ready && ready_implants > 0)
|
||||
implant(user,null)
|
||||
|
||||
/obj/machinery/implantchair/genepurge
|
||||
name = "Genetic purifier"
|
||||
desc = "Used to purge human genome of foreign influences"
|
||||
special = TRUE
|
||||
special_name = "Purge genome"
|
||||
injection_cooldown = 0
|
||||
replenish_cooldown = 300
|
||||
|
||||
/obj/machinery/implantchair/genepurge/implant_action(mob/living/carbon/human/H,mob/user)
|
||||
if(!istype(H))
|
||||
return 0
|
||||
H.set_species(/datum/species/human, 1)//lizards go home
|
||||
purrbation_remove(H)//remove cats
|
||||
H.dna.remove_all_mutations()//hulks out
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/implantchair/brainwash
|
||||
name = "Neural Imprinter"
|
||||
desc = "Used to <s>indoctrinate</s> rehabilitate hardened recidivists."
|
||||
special_name = "Imprint"
|
||||
injection_cooldown = 3000
|
||||
auto_inject = FALSE
|
||||
auto_replenish = FALSE
|
||||
special = TRUE
|
||||
var/objective = "Obey the law. Praise Nanotrasen."
|
||||
var/custom = FALSE
|
||||
|
||||
/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))
|
||||
return 0
|
||||
objective = stripped_input(usr,"What order do you want to imprint on [C]?","Enter the order","",120)
|
||||
message_admins("[key_name_admin(user)] set brainwash machine objective to '[objective]'.")
|
||||
log_game("[key_name_admin(user)] set brainwash machine objective to '[objective]'.")
|
||||
var/datum/objective/custom_objective = new/datum/objective(objective)
|
||||
custom_objective.owner = C.mind
|
||||
C.mind.objectives += custom_objective
|
||||
C.mind.announce_objectives()
|
||||
message_admins("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
|
||||
log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
/obj/item/implanter
|
||||
name = "implanter"
|
||||
desc = "A sterile automatic implant injector."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "implanter0"
|
||||
item_state = "syringe_0"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
origin_tech = "materials=2;biotech=3"
|
||||
materials = list(MAT_METAL=600, MAT_GLASS=200)
|
||||
var/obj/item/implant/imp = null
|
||||
var/imp_type = null
|
||||
|
||||
|
||||
/obj/item/implanter/update_icon()
|
||||
if(imp)
|
||||
icon_state = "implanter1"
|
||||
origin_tech = imp.origin_tech
|
||||
else
|
||||
icon_state = "implanter0"
|
||||
origin_tech = initial(origin_tech)
|
||||
|
||||
|
||||
/obj/item/implanter/attack(mob/living/M, mob/user)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(user && imp)
|
||||
if(M != user)
|
||||
M.visible_message("<span class='warning'>[user] is attempting to implant [M].</span>")
|
||||
|
||||
var/turf/T = get_turf(M)
|
||||
if(T && (M == user || do_mob(user, M, 50)))
|
||||
if(src && imp)
|
||||
if(imp.implant(M, user))
|
||||
if (M == user)
|
||||
to_chat(user, "<span class='notice'>You implant yourself.</span>")
|
||||
else
|
||||
M.visible_message("[user] has implanted [M].", "<span class='notice'>[user] implants you.</span>")
|
||||
imp = null
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] fails to implant [M].</span>")
|
||||
|
||||
/obj/item/implanter/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/pen))
|
||||
var/t = stripped_input(user, "What would you like the label to be?", name, null)
|
||||
if(user.get_active_held_item() != W)
|
||||
return
|
||||
if(!in_range(src, user) && loc != user)
|
||||
return
|
||||
if(t)
|
||||
name = "implanter ([t])"
|
||||
else
|
||||
name = "implanter"
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/implanter/Initialize(mapload)
|
||||
..()
|
||||
if(imp_type)
|
||||
imp = new imp_type(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/implanter/adrenalin
|
||||
name = "implanter (adrenalin)"
|
||||
imp_type = /obj/item/implant/adrenalin
|
||||
|
||||
/obj/item/implanter/emp
|
||||
name = "implanter (EMP)"
|
||||
imp_type = /obj/item/implant/emp
|
||||
@@ -0,0 +1,77 @@
|
||||
/obj/item/implantpad
|
||||
name = "implantpad"
|
||||
desc = "Used to modify implants."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "implantpad-0"
|
||||
item_state = "electronic"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/obj/item/implantcase/case = null
|
||||
var/broadcasting = null
|
||||
var/listening = 1
|
||||
|
||||
|
||||
/obj/item/implantpad/update_icon()
|
||||
if(case)
|
||||
icon_state = "implantpad-1"
|
||||
else
|
||||
icon_state = "implantpad-0"
|
||||
|
||||
|
||||
/obj/item/implantpad/attack_hand(mob/user)
|
||||
if(case && user.is_holding(src))
|
||||
user.put_in_active_hand(case)
|
||||
|
||||
case.add_fingerprint(user)
|
||||
case = null
|
||||
|
||||
add_fingerprint(user)
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/implantpad/attackby(obj/item/implantcase/C, mob/user, params)
|
||||
if(istype(C, /obj/item/implantcase))
|
||||
if(!case)
|
||||
if(!user.transferItemToLoc(C, src))
|
||||
return
|
||||
case = C
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/implantpad/attack_self(mob/user)
|
||||
user.set_machine(src)
|
||||
var/dat = "<B>Implant Mini-Computer:</B><HR>"
|
||||
if(case)
|
||||
if(case.imp)
|
||||
if(istype(case.imp, /obj/item/implant))
|
||||
dat += case.imp.get_data()
|
||||
else
|
||||
dat += "The implant casing is empty."
|
||||
else
|
||||
dat += "Please insert an implant casing!"
|
||||
user << browse(dat, "window=implantpad")
|
||||
onclose(user, "implantpad")
|
||||
|
||||
|
||||
/obj/item/implantpad/Topic(href, href_list)
|
||||
..()
|
||||
if(usr.stat)
|
||||
return
|
||||
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)))
|
||||
usr.set_machine(src)
|
||||
|
||||
if(ismob(loc))
|
||||
attack_self(loc)
|
||||
else
|
||||
for(var/mob/M in viewers(1, src))
|
||||
if(M.client)
|
||||
attack_self(M)
|
||||
add_fingerprint(usr)
|
||||
else
|
||||
usr << browse(null, "window=implantpad")
|
||||
@@ -0,0 +1,42 @@
|
||||
/obj/item/implant/uplink
|
||||
name = "uplink implant"
|
||||
desc = "Sneeki breeki."
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
icon_state = "radio"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
origin_tech = "materials=4;magnets=4;programming=4;biotech=4;syndicate=5;bluespace=5"
|
||||
var/starting_tc = 0
|
||||
|
||||
/obj/item/implant/uplink/New()
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.telecrystals = starting_tc
|
||||
..()
|
||||
|
||||
/obj/item/implant/uplink/implant(mob/living/target, mob/user, silent = 0)
|
||||
for(var/X in target.implants)
|
||||
if(istype(X, type))
|
||||
var/obj/item/implant/imp_e = X
|
||||
imp_e.hidden_uplink.telecrystals += hidden_uplink.telecrystals
|
||||
qdel(src)
|
||||
return 1
|
||||
|
||||
if(..())
|
||||
hidden_uplink.owner = "[user.key]"
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/implant/uplink/activate()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.interact(usr)
|
||||
|
||||
/obj/item/implanter/uplink
|
||||
name = "implanter (uplink)"
|
||||
imp_type = /obj/item/implant/uplink
|
||||
|
||||
/obj/item/implanter/uplink/precharged
|
||||
name = "implanter (precharged uplink)"
|
||||
imp_type = /obj/item/implant/uplink/precharged
|
||||
|
||||
/obj/item/implant/uplink/precharged
|
||||
starting_tc = 10
|
||||
Reference in New Issue
Block a user