diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 48b053594d2..c394b3c37fc 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -1584,7 +1584,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/implants/uplink/nuclear
name = "Nuclear Uplink Implant"
reference = "UIN"
- item = /obj/item/implanter/nuclear_uplink
+ item = /obj/item/implanter/nuclear
excludefrom = list()
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 866110f9ef5..b8e912b1f1f 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -42,6 +42,11 @@
add_fingerprint(user)
ui_interact(user)
+/obj/machinery/computer/prisoner/attackby(obj/item/O, mob/user)
+ if(ui_login_attackby(O, user))
+ return
+ return ..()
+
/obj/machinery/computer/prisoner/proc/check_implant(obj/item/implant/I)
var/turf/implant_location = get_turf(I)
if(!implant_location || implant_location.z != z)
@@ -94,7 +99,6 @@
loc_display = "[get_area(implant_location)]"
var/list/implant_info = list(
- "id" = T.id,
"subject" = M.name,
"location" = loc_display,
"health" = health_display,
@@ -172,7 +176,7 @@
implant.warn_cooldown = world.time + IMPLANT_WARN_COOLDOWN
if(implant.imp_in)
var/mob/living/carbon/implantee = implant.imp_in
- var/warning = copytext(sanitize(text2num(answer)), 1, MAX_MESSAGE_LEN)
+ var/warning = copytext(sanitize(answer), 1, MAX_MESSAGE_LEN)
to_chat(implantee, "Your skull vibrates violently as a loud announcement is broadcasted to you: '[warning]'")
if("set_points")
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 0bcba0d3fa4..d1511b9899c 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -26,22 +26,25 @@
/obj/item/implant
name = "implant"
icon = 'icons/obj/implants.dmi'
- icon_state = "generic" //Shows up as the action button icon
+ icon_state = "generic" //Shows up as a auto surgeon, used as a placeholder when a implant doesn't have a sprite
origin_tech = "materials=2;biotech=3;programming=2"
-
actions_types = list(/datum/action/item_action/hands_free/activate)
+ item_color = "black"
+ flags = DROPDEL // By default, don't let implants be harvestable.
+
+ ///which implant overlay should be used for implant cases. This should point to a state in implants.dmi
+ var/implant_state = "implant-default"
/// How the implant is activated.
var/activated = IMPLANT_ACTIVATED_ACTIVE
/// Whether the implant is implanted. Null if it's never been inserted, TRUE if it's currently inside someone, or FALSE if it's been removed.
- var/implanted = null
+ var/implanted
/// Who the implant is inside of.
- var/mob/living/imp_in = null
- item_color = "b"
+ var/mob/living/imp_in
+
/// Whether multiple implants of this same type can be inserted into someone.
var/allow_multiple = FALSE
/// Amount of times that the implant can be triggered by the user. If the implant can't be used, it can't be inserted.
var/uses = -1
- flags = DROPDEL // By default, don't let implants be harvestable.
/// List of emote keys that activate this implant when used.
var/list/trigger_emotes
@@ -50,6 +53,18 @@
/// Whether this implant has already triggered on death or not, to prevent it firing multiple times.
var/has_triggered_on_death = FALSE
+ ///the implant_fluff datum attached to this implant, purely cosmetic "lore" information
+ var/datum/implant_fluff/implant_data = /datum/implant_fluff
+
+/obj/item/implant/Initialize(mapload)
+ . = ..()
+ if(ispath(implant_data))
+ implant_data = new implant_data
+
+/obj/item/implant/Destroy()
+ QDEL_NULL(implant_data)
+ return ..()
+
/obj/item/implant/proc/unregister_emotes()
if(imp_in && LAZYLEN(trigger_emotes))
for(var/emote in trigger_emotes)
@@ -212,10 +227,6 @@
removed(imp_in)
return ..()
-
-/obj/item/implant/proc/get_data()
- return "No information available"
-
/obj/item/implant/dropped(mob/user)
. = TRUE
..()
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
index da3d3b491cf..4801e2516c8 100644
--- a/code/game/objects/items/weapons/implants/implant_abductor.dm
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -2,20 +2,23 @@
name = "recall implant"
desc = "Returns you to the mothership."
icon = 'icons/obj/abductor.dmi'
- icon_state = "implant"
+ icon_state = "implant" //ew
activated = IMPLANT_ACTIVATED_ACTIVE
origin_tech = "materials=2;biotech=7;magnets=4;bluespace=4;abductor=5"
+ implant_data = /datum/implant_fluff/abductor
+ implant_state = "implant-alien"
+
var/obj/machinery/abductor/pad/home
var/cooldown = 30
var/total_cooldown = 30
/obj/item/implant/abductor/activate()
if(cooldown == total_cooldown)
- home.Retrieve(imp_in,1)
+ home.Retrieve(imp_in, 1)
cooldown = 0
START_PROCESSING(SSobj, src)
else
- to_chat(imp_in, "You must wait [(total_cooldown - cooldown)*2] seconds to use [src] again!")
+ to_chat(imp_in, "You must wait [(total_cooldown - cooldown) * 2] seconds to use [src] again!")
/obj/item/implant/abductor/process()
if(cooldown < total_cooldown)
@@ -36,7 +39,7 @@
if(!home)
console = get_team_console(pick(1, 2, 3, 4))
home = console.pad
- return 1
+ return TRUE
/obj/item/implant/abductor/proc/get_team_console(team)
var/obj/machinery/abductor/console/console
@@ -45,3 +48,18 @@
console = c
break
return console
+
+/obj/item/implanter/abductor
+ name = "implanter (abductor)"
+
+/obj/item/implanter/abductor/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/abductor(src)
+
+/obj/item/implantcase/abductor
+ name = "implant case - 'abductor'"
+ desc = "A glass case containing an abductor implant."
+
+/obj/item/implantcase/abductor/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/abductor(src)
diff --git a/code/game/objects/items/weapons/implants/implant_adrenalin.dm b/code/game/objects/items/weapons/implants/implant_adrenalin.dm
new file mode 100644
index 00000000000..794c43838e7
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_adrenalin.dm
@@ -0,0 +1,39 @@
+/obj/item/implant/adrenalin
+ name = "adrenal implant"
+ desc = "Removes all stuns and knockdowns."
+ icon_state = "adrenal"
+ origin_tech = "materials=2;biotech=4;combat=3;syndicate=4"
+ uses = 3
+ implant_data = /datum/implant_fluff/adrenaline
+ implant_state = "implant-syndicate"
+
+/obj/item/implant/adrenalin/activate()
+ uses--
+ to_chat(imp_in, "You feel a sudden surge of energy!")
+ imp_in.SetStunned(0)
+ imp_in.SetWeakened(0)
+ imp_in.SetKnockDown(0)
+ imp_in.SetParalysis(0)
+ imp_in.adjustStaminaLoss(-75)
+ imp_in.stand_up(TRUE)
+
+ imp_in.reagents.add_reagent("synaptizine", 10)
+ imp_in.reagents.add_reagent("omnizine", 10)
+ imp_in.reagents.add_reagent("stimulative_agent", 10)
+ if(!uses)
+ qdel(src)
+
+/obj/item/implanter/adrenalin
+ name = "implanter (adrenalin)"
+
+/obj/item/implanter/adrenalin/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/adrenalin(src)
+
+/obj/item/implantcase/adrenaline
+ name = "implant case - 'Adrenaline'"
+ desc = "A glass case containing an adrenaline implant."
+
+/obj/item/implantcase/adrenaline/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/adrenalin(src)
diff --git a/code/game/objects/items/weapons/implants/implant_chem.dm b/code/game/objects/items/weapons/implants/implant_chem.dm
index a75b3c400f0..9f11dc26106 100644
--- a/code/game/objects/items/weapons/implants/implant_chem.dm
+++ b/code/game/objects/items/weapons/implants/implant_chem.dm
@@ -5,25 +5,11 @@
origin_tech = "materials=3;biotech=4"
container_type = OPENCONTAINER
trigger_causes = IMPLANT_TRIGGER_DEATH_ANY
+ implant_data = /datum/implant_fluff/chem
+ implant_state = "implant-nanotrasen"
-/obj/item/implant/chem/get_data()
- var/dat = {"Implant Specifications:
- Name: Robust Corp MJ-420 Prisoner Management Implant
- Life: Deactivates upon death but remains within the body.
- Important Notes: Due to the system functioning off of nutrients in the implanted subject's body, the subject
- will suffer from an increased appetite.
-
- Implant Details:
- Function: Contains a small capsule that can contain various chemicals. Upon receiving a specially encoded signal
- the implant releases the chemicals directly into the blood stream.
- Special Features:
- Micro-Capsule- Can be loaded with any sort of chemical agent via the common syringe and can hold 50 units.
- Can only be loaded while still in its original case.
- Integrity: Implant will last so long as the subject is alive."}
- return dat
-
-/obj/item/implant/chem/New()
- ..()
+/obj/item/implant/chem/Initialize(mapload)
+ . = ..()
create_reagents(50)
GLOB.tracked_implants += src
@@ -35,9 +21,10 @@
activate(reagents.total_volume)
/obj/item/implant/chem/activate(cause)
- if(!cause || !imp_in) return 0
+ if(!cause || !imp_in)
+ return FALSE
var/mob/living/carbon/R = imp_in
- var/injectamount = null
+ var/injectamount
if(cause == "action_button")
injectamount = reagents.total_volume
else
@@ -48,11 +35,16 @@
to_chat(R, "You hear a faint click from your chest.")
qdel(src)
+/obj/item/implanter/chem
+ name = "implanter (chem)"
+/obj/item/implanter/chem/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/dust(src)
/obj/item/implantcase/chem
name = "implant case - 'Remote Chemical'"
desc = "A glass case containing a remote chemical implant."
-/obj/item/implantcase/chem/New()
+/obj/item/implantcase/chem/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/chem(src)
- ..()
diff --git a/code/game/objects/items/weapons/implants/implant_death_alarm.dm b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
index d1f4fd3dd3f..778d8f05498 100644
--- a/code/game/objects/items/weapons/implants/implant_death_alarm.dm
+++ b/code/game/objects/items/weapons/implants/implant_death_alarm.dm
@@ -1,22 +1,13 @@
/obj/item/implant/death_alarm
name = "death alarm implant"
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
- var/mobname = "Will Robinson"
activated = IMPLANT_ACTIVATED_PASSIVE
- var/static/list/stealth_areas = typecacheof(list(/area/syndicate_mothership, /area/shuttle/syndicate_elite))
trigger_causes = IMPLANT_TRIGGER_DEATH_ANY
+ implant_data = /datum/implant_fluff/death_alarm
+ implant_state = "implant-nanotrasen"
-/obj/item/implant/death_alarm/get_data()
- var/dat = {"Implant Specifications:
- Name: Nanotrasen \"Profit Margin\" Class Employee Lifesign Sensor
- Life: Activates upon death.
- Important Notes: Alerts crew to crewmember death.
-
- Implant Details:
- Function: Contains a compact radio signaler that triggers when the host's lifesigns cease.
- Special Features: Alerts crew to crewmember death.
- Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."}
- return dat
+ var/mobname = "Unknown"
+ var/static/list/stealth_areas = typecacheof(list(/area/syndicate_mothership, /area/shuttle/syndicate_elite))
/obj/item/implant/death_alarm/implant(mob/target)
. = ..()
@@ -59,5 +50,20 @@
/obj/item/implant/death_alarm/removed(mob/target)
if(..())
UnregisterSignal(target, COMSIG_MOB_DEATH)
- return 1
- return 0
+ return TRUE
+ return FALSE
+
+/obj/item/implanter/death_alarm
+ name = "implanter (Death Alarm)"
+
+/obj/item/implanter/death_alarm/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/death_alarm(src)
+
+/obj/item/implantcase/death_alarm
+ name = "Implant Case - 'Death Alarm'"
+ desc = "A case containing a death alarm implant."
+
+/obj/item/implantcase/death_alarm/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/death_alarm(src)
diff --git a/code/game/objects/items/weapons/implants/implant_dust.dm b/code/game/objects/items/weapons/implants/implant_dust.dm
new file mode 100644
index 00000000000..9d51d47b38a
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_dust.dm
@@ -0,0 +1,46 @@
+// Dust implant, for CC officers. Prevents gear theft if they die.
+
+/obj/item/implant/dust
+ name = "duster implant"
+ desc = "A remote controlled implant that will dust the user upon activation (or death of user)."
+ icon = 'icons/effects/blood.dmi'
+ icon_state = "remains"
+ actions_types = list(/datum/action/item_action/hands_free/activate/always)
+ trigger_causes = IMPLANT_TRIGGER_DEATH_ONCE | IMPLANT_TRIGGER_NOT_WHEN_GIBBED
+ implant_data = /datum/implant_fluff/dust
+ implant_state = "implant-nanotrasen"
+
+/obj/item/implant/dust/death_trigger(mob/source, force)
+ activate("death")
+
+/obj/item/implant/dust/activate(cause)
+ if(!cause || !imp_in || cause == "emp")
+ return FALSE
+ if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your dusting implant? This will turn you to ash!", "Dusting Confirmation", "Yes", "No") != "Yes")
+ return FALSE
+ to_chat(imp_in, "Your dusting implant activates!")
+ imp_in.visible_message("[imp_in] burns up in a flash!")
+ for(var/obj/item/I in imp_in.contents)
+ if(I == src)
+ continue
+ if(I.flags & NODROP)
+ qdel(I)
+ imp_in.dust()
+
+/obj/item/implant/dust/emp_act(severity)
+ return
+
+/obj/item/implanter/dust
+ name = "implanter (Dust-on-death)"
+
+/obj/item/implanter/dust/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/dust(src)
+
+/obj/item/implantcase/dust
+ name = "implant case - 'Dust'"
+ desc = "A glass case containing a dust implant."
+
+/obj/item/implantcase/dust/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/dust(src)
diff --git a/code/game/objects/items/weapons/implants/implant_emp.dm b/code/game/objects/items/weapons/implants/implant_emp.dm
new file mode 100644
index 00000000000..1082f3821ed
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_emp.dm
@@ -0,0 +1,29 @@
+/obj/item/implant/emp
+ name = "emp implant"
+ desc = "Triggers an EMP."
+ icon_state = "emp"
+ origin_tech = "biotech=3;magnets=4;syndicate=1"
+ uses = 2
+ implant_data = /datum/implant_fluff/emp
+ implant_state = "implant-syndicate"
+
+/obj/item/implant/emp/activate()
+ uses--
+ INVOKE_ASYNC(GLOBAL_PROC, .proc/empulse, get_turf(imp_in), 3, 5, 1)
+ if(!uses)
+ qdel(src)
+
+/obj/item/implanter/emp
+ name = "implanter (EMP)"
+
+/obj/item/implanter/emp/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/emp(src)
+
+/obj/item/implantcase/emp
+ name = "implant case - 'EMP'"
+ desc = "A glass case containing an EMP implant."
+
+/obj/item/implantcase/emp/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/emp(src)
diff --git a/code/modules/awaymissions/exile.dm b/code/game/objects/items/weapons/implants/implant_exile.dm
similarity index 70%
rename from code/modules/awaymissions/exile.dm
rename to code/game/objects/items/weapons/implants/implant_exile.dm
index 606dd850b41..d1072c1353a 100644
--- a/code/modules/awaymissions/exile.dm
+++ b/code/game/objects/items/weapons/implants/implant_exile.dm
@@ -1,34 +1,27 @@
//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 = IMPLANT_ACTIVATED_PASSIVE
-
-/obj/item/implant/exile/get_data()
- var/dat = {"Implant Specifications:
- Name: Nanotrasen Employee Exile Implant
- Implant Details: The onboard gateway system has been modified to reject entry by individuals containing this implant
"}
- return dat
-
+ implant_data = /datum/implant_fluff/exile
+ implant_state = "implant-nanotrasen"
/obj/item/implanter/exile
name = "implanter (exile)"
-/obj/item/implanter/exile/New()
- imp = new /obj/item/implant/exile( src )
- ..()
+/obj/item/implanter/exile/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/exile(src)
/obj/item/implantcase/exile
name = "implant case - 'Exile'"
desc = "A glass case containing an exile implant."
-/obj/item/implantcase/exile/New()
+/obj/item/implantcase/exile/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/exile(src)
- ..()
-
/obj/structure/closet/secure_closet/exile
name = "exile implants"
diff --git a/code/game/objects/items/weapons/implants/implant_explosive.dm b/code/game/objects/items/weapons/implants/implant_explosive.dm
index 505d542a834..5d06c027e74 100644
--- a/code/game/objects/items/weapons/implants/implant_explosive.dm
+++ b/code/game/objects/items/weapons/implants/implant_explosive.dm
@@ -4,24 +4,15 @@
icon_state = "explosive"
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
+ trigger_causes = IMPLANT_TRIGGER_DEATH_ONCE // Not surviving that
+ implant_data = /datum/implant_fluff/explosive
+ implant_state = "implant-syndicate"
+
var/detonating = FALSE
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
var/delay = 7
- trigger_causes = IMPLANT_TRIGGER_DEATH_ONCE // Not surviving that
-
-/obj/item/implant/explosive/get_data()
- var/dat = {"Implant Specifications:
- Name: Robust Corp RX-78 Employee Management Implant
- Life: Activates upon death.
- Important Notes: Explodes
-
- Implant Details:
- Function: Contains a compact, electrically detonated explosive that detonates upon receiving a specially encoded signal or upon host death.
- Special Features: Explodes
- "}
- return dat
/obj/item/implant/explosive/death_trigger(mob/source, gibbed)
activate("death")
@@ -48,31 +39,32 @@
timed_explosion()
/obj/item/implant/explosive/implant(mob/source)
- var/obj/item/implant/explosive/imp_e = locate(src.type) in source
+ var/obj/item/implant/explosive/imp_e = locate(type) in source
if(imp_e && imp_e != src)
imp_e.heavy += heavy
imp_e.medium += medium
imp_e.weak += weak
imp_e.delay += delay
qdel(src)
- return 1
+ return TRUE
return ..()
/obj/item/implant/explosive/proc/timed_explosion()
imp_in.visible_message("[imp_in] starts beeping ominously!")
playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
+ var/wait_delay = delay / 4
+ sleep(wait_delay)
if(imp_in && imp_in.stat)
imp_in.visible_message("[imp_in] doubles over in pain!")
imp_in.Weaken(14 SECONDS)
playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
+ sleep(wait_delay)
playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
+ sleep(wait_delay)
playsound(loc, 'sound/items/timer.ogg', 30, 0)
- sleep(delay/4)
- explosion(src,heavy,medium,weak,weak, flame_range = weak)
+ sleep(wait_delay)
+ explosion(src, heavy,medium,weak,weak, flame_range = weak)
if(imp_in)
imp_in.gib()
qdel(src)
@@ -86,18 +78,20 @@
medium = 8
heavy = 4
delay = 70
+ implant_data = new /datum/implant_fluff/explosive_macro
/obj/item/implant/explosive/macro/activate(cause)
- if(!cause || !imp_in) return 0
+ if(!cause || !imp_in)
+ return FALSE
if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes")
- return 0
+ return FALSE
to_chat(imp_in, "You activate your macrobomb implant.")
timed_explosion()
/obj/item/implant/explosive/macro/implant(mob/source)
- var/obj/item/implant/explosive/imp_e = locate(src.type) in source
+ var/obj/item/implant/explosive/imp_e = locate(type) in source
if(imp_e && imp_e != src)
- return 0
+ return FALSE
imp_e = locate(/obj/item/implant/explosive) in source
if(imp_e && imp_e != src)
heavy += imp_e.heavy
@@ -112,73 +106,29 @@
/obj/item/implanter/explosive
name = "implanter (explosive)"
-/obj/item/implanter/explosive/New()
+/obj/item/implanter/explosive/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/explosive(src)
- ..()
-
/obj/item/implantcase/explosive
- name = "implant case - 'Explosive'"
- desc = "A glass case containing an explosive implant."
+ name = "implant case - 'Micro Explosive'"
+ desc = "A glass case containing a micro explosive implant."
-/obj/item/implantcase/explosive/New()
+/obj/item/implantcase/explosive/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/explosive(src)
- ..()
-
/obj/item/implanter/explosive_macro
name = "implanter (macro-explosive)"
-/obj/item/implanter/explosive_macro/New()
+/obj/item/implanter/explosive_macro/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/explosive/macro(src)
- ..()
+/obj/item/implantcase/explosive_macro
+ name = "implant case - 'Macro Explosive'"
+ desc = "A glass case containing a macro explosive implant."
-// Dust implant, for CC officers. Prevents gear theft if they die.
-
-/obj/item/implant/dust
- name = "duster implant"
- desc = "An alarm which monitors host vital signs, transmitting a radio message and dusting the corpse on death."
- icon = 'icons/effects/blood.dmi'
- icon_state = "remains"
- actions_types = list(/datum/action/item_action/hands_free/activate/always)
- trigger_causes = IMPLANT_TRIGGER_DEATH_ONCE | IMPLANT_TRIGGER_NOT_WHEN_GIBBED
-
-/obj/item/implant/dust/get_data()
- var/dat = {"Implant Specifications:
- Name: Ultraviolet Corp XX-13 Security Implant
- Life: Activates upon death.
- Important Notes: Vaporizes organic matter
-
- Implant Details:
- Function: Contains a compact, electrically activated heat source that turns its host to ash upon activation, or their death.
- Special Features: Vaporizes
- "}
- return dat
-
-/obj/item/implant/dust/death_trigger(emote, mob/source, force)
- activate("death")
-
-/obj/item/implant/dust/activate(cause)
- if(!cause || !imp_in || cause == "emp")
- return 0
- if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your dusting implant? This will turn you to ash!", "Dusting Confirmation", "Yes", "No") != "Yes")
- return 0
- to_chat(imp_in, "Your dusting implant activates!")
- imp_in.visible_message("[imp_in] burns up in a flash!")
- for(var/obj/item/I in imp_in.contents)
- if(I == src)
- continue
- if(I.flags & NODROP)
- qdel(I)
- imp_in.dust()
-
-/obj/item/implant/dust/emp_act(severity)
- return
-
-/obj/item/implanter/dust
- name = "implanter (Dust-on-death)"
-
-/obj/item/implanter/dust/New()
- imp = new /obj/item/implant/dust(src)
- ..()
+/obj/item/implantcase/explosive_macro/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/explosive/macro(src)
diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm
index e355a1ee945..f37bdb28cad 100644
--- a/code/game/objects/items/weapons/implants/implant_freedom.dm
+++ b/code/game/objects/items/weapons/implants/implant_freedom.dm
@@ -5,6 +5,8 @@
item_color = "r"
origin_tech = "combat=5;magnets=3;biotech=4;syndicate=2"
uses = 4
+ implant_data = /datum/implant_fluff/freedom
+ implant_state = "implant-syndicate"
/obj/item/implant/freedom/activate()
@@ -25,36 +27,17 @@
if(!uses)
qdel(src)
-
-/obj/item/implant/freedom/get_data()
- var/dat = {"
-Implant Specifications:
-Name: Freedom Beacon
-Life: optimum 5 uses
-Important Notes: Illegal
-
-Implant Details:
-Function: Transmits a specialized cluster of signals to override handcuff locking
-mechanisms
-Special Features:
-Neuro-Scan- Analyzes certain shadow signals in the nervous system
-
-No Implant Specifics"}
- return dat
-
-
/obj/item/implanter/freedom
name = "implanter (freedom)"
-/obj/item/implanter/freedom/New()
+/obj/item/implanter/freedom/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/freedom(src)
- ..()
-
/obj/item/implantcase/freedom
name = "implant case - 'Freedom'"
desc = "A glass case containing a freedom implant."
-/obj/item/implantcase/freedom/New()
+/obj/item/implantcase/freedom/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/freedom(src)
- ..()
diff --git a/code/game/objects/items/weapons/implants/health.dm b/code/game/objects/items/weapons/implants/implant_health.dm
similarity index 80%
rename from code/game/objects/items/weapons/implants/health.dm
rename to code/game/objects/items/weapons/implants/implant_health.dm
index e40006f4a2a..45fa1d4a966 100644
--- a/code/game/objects/items/weapons/implants/health.dm
+++ b/code/game/objects/items/weapons/implants/implant_health.dm
@@ -1,6 +1,9 @@
/obj/item/implant/health
name = "health implant"
activated = FALSE
+ implant_data = /datum/implant_fluff/health
+ implant_state = "implant-default"
+
var/healthstring = ""
/obj/item/implant/health/proc/sensehealth()
diff --git a/code/game/objects/items/weapons/implants/implant_krav_maga.dm b/code/game/objects/items/weapons/implants/implant_krav_maga.dm
index 7890f234676..2cd0946aad5 100644
--- a/code/game/objects/items/weapons/implants/implant_krav_maga.dm
+++ b/code/game/objects/items/weapons/implants/implant_krav_maga.dm
@@ -5,15 +5,10 @@
icon_state ="scroll2"
activated = IMPLANT_ACTIVATED_ACTIVE
origin_tech = "materials=2;biotech=4;combat=5;syndicate=4"
- var/datum/martial_art/krav_maga/style = new
+ implant_data = /datum/implant_fluff/krav_maga
+ implant_state = "implant-default"
-/obj/item/implant/krav_maga/get_data()
- var/dat = {"Implant Specifications:
- Name: Krav Maga Implant
- Life: 4 hours after death of host
- Implant Details:
- Function: Teaches even the clumsiest host the arts of Krav Maga."}
- return dat
+ var/datum/martial_art/krav_maga/style = new
/obj/item/implant/krav_maga/activate()
var/mob/living/carbon/human/H = imp_in
@@ -27,14 +22,14 @@
/obj/item/implanter/krav_maga
name = "implanter (krav maga)"
-/obj/item/implanter/krav_maga/New()
+/obj/item/implanter/krav_maga/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/krav_maga(src)
- ..()
/obj/item/implantcase/krav_maga
name = "implant case - 'Krav Maga'"
desc = "A glass case containing an implant that can teach the user the art of Krav Maga."
-/obj/item/implantcase/krav_maga/New()
+/obj/item/implantcase/krav_maga/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/krav_maga(src)
- ..()
diff --git a/code/game/objects/items/weapons/implants/implant_mindshield.dm b/code/game/objects/items/weapons/implants/implant_mindshield.dm
index 9404dd9e275..30f7d9acaa9 100644
--- a/code/game/objects/items/weapons/implants/implant_mindshield.dm
+++ b/code/game/objects/items/weapons/implants/implant_mindshield.dm
@@ -3,19 +3,8 @@
desc = "Stops people messing with your mind."
origin_tech = "materials=2;biotech=4;programming=4"
activated = IMPLANT_ACTIVATED_PASSIVE
-
-/obj/item/implant/mindshield/get_data()
- var/dat = {"Implant Specifications:
- Name: Nanotrasen Employee Management Implant
- Life: Ten years.
- Important Notes: Personnel injected with this device can better resist mental compulsions.
-
- Implant Details:
- Function: Contains a small pod of nanobots that manipulate the host's mental functions.
- Special Features: Will prevent and cure most forms of brainwashing.
- Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
- return dat
-
+ implant_data = /datum/implant_fluff/mindshield
+ implant_state = "implant-nanotrasen"
/obj/item/implant/mindshield/implant(mob/target)
if(..())
@@ -35,18 +24,17 @@
return TRUE
return FALSE
-
/obj/item/implanter/mindshield
name = "implanter (mindshield)"
-/obj/item/implanter/mindshield/New()
+/obj/item/implanter/mindshield/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/mindshield(src)
- ..()
/obj/item/implantcase/mindshield
name = "implant case - 'mindshield'"
desc = "A glass case containing a mindshield implant."
-/obj/item/implantcase/mindshield/New()
+/obj/item/implantcase/mindshield/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/mindshield(src)
- ..()
diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm
deleted file mode 100644
index 928841c5d65..00000000000
--- a/code/game/objects/items/weapons/implants/implant_misc.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-/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 = IMPLANT_ACTIVATED_PASSIVE
-
-/obj/item/implant/weapons_auth/get_data()
- var/dat = {"Implant Specifications:
- Name: Firearms Authentication Implant
- Life: 4 hours after death of host
- Implant Details:
- Function: 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 and knockdowns."
- icon_state = "adrenal"
- origin_tech = "materials=2;biotech=4;combat=3;syndicate=4"
- uses = 3
-
-/obj/item/implant/adrenalin/get_data()
- var/dat = {"Implant Specifications:
- Name: Cybersun Industries Adrenaline Implant
- Life: Five days.
- Important Notes: Illegal
-
- Implant Details: Subjects injected with implant can activate an injection of medical cocktails.
- Function: Removes stuns, increases speed, and has a mild healing effect.
- Integrity: Implant can only be used three times before reserves are depleted."}
- return dat
-
-/obj/item/implant/adrenalin/activate()
- uses--
- to_chat(imp_in, "You feel a sudden surge of energy!")
- imp_in.SetStunned(0)
- imp_in.SetWeakened(0)
- imp_in.SetKnockDown(0)
- imp_in.SetParalysis(0)
- imp_in.adjustStaminaLoss(-75)
- imp_in.stand_up(TRUE)
-
- imp_in.reagents.add_reagent("synaptizine", 10)
- imp_in.reagents.add_reagent("omnizine", 10)
- imp_in.reagents.add_reagent("stimulative_agent", 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 = 2
-
-/obj/item/implant/emp/activate()
- uses--
- INVOKE_ASYNC(GLOBAL_PROC, .proc/empulse, get_turf(imp_in), 3, 5, 1)
- if(!uses)
- qdel(src)
-
-/obj/item/implant/cortical
- name = "cortical stack"
- desc = "A fist-sized mass of biocircuits and chips."
- icon_state = "implant_evil"
diff --git a/code/game/objects/items/weapons/implants/implant_clown.dm b/code/game/objects/items/weapons/implants/implant_sad_trombone.dm
similarity index 73%
rename from code/game/objects/items/weapons/implants/implant_clown.dm
rename to code/game/objects/items/weapons/implants/implant_sad_trombone.dm
index d250c094301..db82e329898 100644
--- a/code/game/objects/items/weapons/implants/implant_clown.dm
+++ b/code/game/objects/items/weapons/implants/implant_sad_trombone.dm
@@ -4,13 +4,8 @@
trigger_emotes = list("deathgasp")
// If something forces the clown to fake death, it's pretty funny to still see the sad trombone played
trigger_causes = IMPLANT_EMOTE_TRIGGER_UNINTENTIONAL | IMPLANT_TRIGGER_DEATH_ANY
-
-/obj/item/implant/sad_trombone/get_data()
- var/dat = {"Implant Specifications:
- Name: Honk Co. Sad Trombone Implant
- Life: Activates upon death.
- "}
- return dat
+ implant_data = /datum/implant_fluff/sad_trombone
+ implant_state = "implant-honk"
/obj/item/implant/sad_trombone/emote_trigger(emote, mob/source, force)
activate(emote)
@@ -25,14 +20,14 @@
/obj/item/implanter/sad_trombone
name = "implanter (sad trombone)"
-/obj/item/implanter/sad_trombone/New() //gross
+/obj/item/implanter/sad_trombone/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/sad_trombone
- ..()
/obj/item/implantcase/sad_trombone
name = "implant case - 'Sad Trombone'"
desc = "A glass case containing a sad trombone implant."
-/obj/item/implantcase/sad_trombone/New() //gross
+/obj/item/implantcase/sad_trombone/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/sad_trombone
- ..()
diff --git a/code/game/objects/items/weapons/implants/implant_storage.dm b/code/game/objects/items/weapons/implants/implant_storage.dm
index 813d0272ff6..a70270dda25 100644
--- a/code/game/objects/items/weapons/implants/implant_storage.dm
+++ b/code/game/objects/items/weapons/implants/implant_storage.dm
@@ -7,17 +7,19 @@
cant_hold = list(/obj/item/disk/nuclear)
silent = TRUE
-
/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"
+ implant_data = /datum/implant_fluff/storage
+ implant_state = "implant-syndicate"
+
var/obj/item/storage/hidden/implant/storage
-/obj/item/implant/storage/New()
- ..()
+/obj/item/implant/storage/Initialize(mapload)
+ . = ..()
storage = new /obj/item/storage/hidden/implant(src)
/obj/item/implant/storage/emp_act(severity)
@@ -34,10 +36,10 @@
storage.close(M)
for(var/obj/item/I in storage)
storage.remove_from_storage(I, get_turf(source))
- return 1
+ return TRUE
/obj/item/implant/storage/implant(mob/source)
- var/obj/item/implant/storage/imp_e = locate(src.type) in source
+ var/obj/item/implant/storage/imp_e = locate(type) in source
if(imp_e)
imp_e.storage.storage_slots += storage.storage_slots
imp_e.storage.max_combined_w_class += storage.max_combined_w_class
@@ -49,7 +51,7 @@
storage.show_to(source)
qdel(src)
- return 1
+ return TRUE
return ..()
@@ -60,6 +62,14 @@
/obj/item/implanter/storage
name = "implanter (storage)"
-/obj/item/implanter/storage/New()
+/obj/item/implanter/storage/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/storage(src)
+
+/obj/item/implantcase/storage
+ name = "implant case - 'Storage'"
+ desc = "A glass case containing a storage implant."
+
+/obj/item/implantcase/storage/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/storage(src)
- ..()
diff --git a/code/game/objects/items/weapons/implants/implant_track.dm b/code/game/objects/items/weapons/implants/implant_track.dm
deleted file mode 100644
index 94e6e6c872c..00000000000
--- a/code/game/objects/items/weapons/implants/implant_track.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/obj/item/implant/tracking
- name = "tracking implant"
- desc = "Track with this."
- activated = IMPLANT_ACTIVATED_PASSIVE
- origin_tech = "materials=2;magnets=2;programming=2;biotech=2"
- var/id = 1
- var/warn_cooldown = 0
-
-
-/obj/item/implant/tracking/New()
- ..()
- GLOB.tracked_implants += src
-
-/obj/item/implant/tracking/Destroy()
- GLOB.tracked_implants -= src
- return ..()
-
-/obj/item/implant/tracking/get_data()
- var/dat = {"Implant Specifications:
- Name: Tracking Beacon
- Life: 10 minutes after death of host
- Important Notes: None
-
- Implant Details:
- Function: Continuously transmits low power signal. Useful for tracking.
- Special Features:
- Neuro-Safe- 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.
- Integrity: Gradient creates slight risk of being overcharged and frying the
- circuitry. As a result neurotoxins can cause massive damage.
- Implant Specifics:
"}
- return dat
diff --git a/code/game/objects/items/weapons/implants/implant_tracking.dm b/code/game/objects/items/weapons/implants/implant_tracking.dm
new file mode 100644
index 00000000000..979f2c2b77e
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implant_tracking.dm
@@ -0,0 +1,31 @@
+/obj/item/implant/tracking
+ name = "tracking implant"
+ desc = "Track with this."
+ activated = IMPLANT_ACTIVATED_PASSIVE
+ origin_tech = "materials=2;magnets=2;programming=2;biotech=2"
+ implant_data = /datum/implant_fluff/tracking
+ implant_state = "implant-nanotrasen"
+ var/warn_cooldown = 0
+
+/obj/item/implant/tracking/Initialize(mapload)
+ . = ..()
+ GLOB.tracked_implants += src
+
+/obj/item/implant/tracking/Destroy()
+ GLOB.tracked_implants -= src
+ return ..()
+
+/obj/item/implanter/tracking
+ name = "implanter (tracking)"
+
+/obj/item/implanter/tracking/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/tracking(src)
+
+/obj/item/implantcase/tracking
+ name = "implant case - 'Tracking'"
+ desc = "A glass case containing a tracking implant."
+
+/obj/item/implantcase/tracking/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/tracking(src)
diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm
index ffee49aa478..35ff856210c 100644
--- a/code/game/objects/items/weapons/implants/implant_traitor.dm
+++ b/code/game/objects/items/weapons/implants/implant_traitor.dm
@@ -3,21 +3,12 @@
desc = "Divide and Conquer"
origin_tech = "programming=5;biotech=5;syndicate=8"
activated = FALSE
+ implant_data = /datum/implant_fluff/traitor
+ implant_state = "implant-syndicate"
+
/// The UID of the mindslave's `mind`. Stored to solve GC race conditions and ensure we can remove their mindslave status even when they're deleted or gibbed.
var/mindslave_UID
-/obj/item/implant/traitor/get_data()
- var/dat = {"Implant Specifications:
- Name: Mind-Slave Implant
- Life: ???
- Important Notes: Any humanoid injected with this implant will become loyal to the injector, unless of course the host is already loyal to someone else.
-
- Implant Details:
- Function: Contains a small pod of nanobots that manipulate the host's mental functions.
- Special Features: Diplomacy was never so easy.
- Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
- return dat
-
/obj/item/implant/traitor/implant(mob/living/carbon/human/mindslave_target, mob/living/carbon/human/user)
// Check `activated` here so you can't just keep taking it out and putting it back into other people.
if(!..() || activated || !istype(mindslave_target) || !istype(user)) // Both the target and the user need to be human.
@@ -55,3 +46,18 @@
. = ..()
var/datum/mind/M = locateUID(mindslave_UID)
M.remove_antag_datum(/datum/antagonist/mindslave)
+
+/obj/item/implanter/traitor
+ name = "implanter (Mindslave)"
+
+/obj/item/implanter/traitor/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/traitor(src)
+
+/obj/item/implantcase/traitor
+ name = "implant case - 'Mindslave'"
+ desc = "A glass case containing a mindslave implant."
+
+/obj/item/implantcase/traitor/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/traitor(src)
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implant_uplink.dm
similarity index 52%
rename from code/game/objects/items/weapons/implants/implantuplink.dm
rename to code/game/objects/items/weapons/implants/implant_uplink.dm
index fca50af88ba..e507c807d77 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implant_uplink.dm
@@ -4,54 +4,64 @@
icon = 'icons/obj/radio.dmi'
icon_state = "radio"
origin_tech = "materials=4;magnets=4;programming=4;biotech=4;syndicate=5;bluespace=5"
+ implant_data = /datum/implant_fluff/uplink
+ implant_state = "implant-syndicate"
-/obj/item/implant/uplink/New()
+/obj/item/implant/uplink/Initialize(mapload)
+ . = ..()
hidden_uplink = new(src)
hidden_uplink.uses = 10
- ..()
-
-/obj/item/implant/uplink/nuclear/New()
- ..()
- if(hidden_uplink)
- hidden_uplink.update_uplink_type(UPLINK_TYPE_NUCLEAR)
-
-/obj/item/implant/uplink/sit/New()
- ..()
- if(hidden_uplink)
- hidden_uplink.update_uplink_type(UPLINK_TYPE_SIT)
-
-/obj/item/implant/uplink/admin/New()
- ..()
- if(hidden_uplink)
- hidden_uplink.update_uplink_type(UPLINK_TYPE_ADMIN)
/obj/item/implant/uplink/implant(mob/source)
- var/obj/item/implant/imp_e = locate(src.type) in source
+ var/obj/item/implant/imp_e = locate(type) in source
if(imp_e && imp_e != src)
imp_e.hidden_uplink.uses += hidden_uplink.uses
qdel(src)
- return 1
+ return TRUE
if(..())
hidden_uplink.uplink_owner="[source.key]"
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/item/implant/uplink/activate()
if(hidden_uplink)
hidden_uplink.check_trigger(imp_in)
-
/obj/item/implanter/uplink
name = "implanter (uplink)"
-/obj/item/implanter/uplink/New()
+/obj/item/implanter/uplink/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/uplink(src)
- ..()
-/obj/item/implanter/nuclear_uplink
- name = "implanter (nuclear uplink)"
+/obj/item/implantcase/uplink
+ name = "implant case - 'Syndicate Uplink'"
+ desc = "A glass case containing an uplink implant."
-/obj/item/implanter/nuclear_uplink/New()
+/obj/item/implantcase/uplink/Initialize(mapload)
+ . = ..()
+ imp = new /obj/item/implant/uplink(src)
+
+/obj/item/implant/uplink/nuclear/Initialize(mapload)
+ . = ..()
+ if(hidden_uplink)
+ hidden_uplink.update_uplink_type(UPLINK_TYPE_NUCLEAR)
+
+/obj/item/implanter/nuclear
+ name = "implanter (Nuclear Agent Uplink)"
+
+/obj/item/implanter/nuclear/Initialize(mapload)
+ . = ..()
imp = new /obj/item/implant/uplink/nuclear(src)
- ..()
+
+/obj/item/implant/uplink/sit/Initialize(mapload)
+ . = ..()
+ if(hidden_uplink)
+ hidden_uplink.update_uplink_type(UPLINK_TYPE_SIT)
+
+
+/obj/item/implant/uplink/admin/Initialize(mapload)
+ . = ..()
+ if(hidden_uplink)
+ hidden_uplink.update_uplink_type(UPLINK_TYPE_ADMIN)
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm
index 365c73cefaa..457b434e7d3 100644
--- a/code/game/objects/items/weapons/implants/implantcase.dm
+++ b/code/game/objects/items/weapons/implants/implantcase.dm
@@ -1,16 +1,26 @@
/obj/item/implantcase
name = "implant case"
desc = "A glass case containing an implant."
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-0"
+ icon = 'icons/obj/implants.dmi'
+ icon_state = "implantcase"
item_state = "implantcase"
throw_speed = 2
throw_range = 5
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=1;biotech=2"
container_type = OPENCONTAINER | INJECTABLE | DRAWABLE
- materials = list(MAT_GLASS=500)
- var/obj/item/implant/imp = null
+ materials = list(MAT_GLASS = 500)
+
+ var/obj/item/implant/imp
+
+/obj/item/implantcase/Initialize(mapload)
+ . = ..()
+ update_state()
+
+/obj/item/implantcase/Destroy()
+ if(imp)
+ QDEL_NULL(imp)
+ return ..()
/obj/item/implantcase/proc/update_state()
if(imp)
@@ -21,17 +31,17 @@
origin_tech = initial(origin_tech)
flags = initial(flags)
reagents = null
- update_icon(UPDATE_ICON_STATE)
+ update_icon(UPDATE_OVERLAYS)
-/obj/item/implantcase/update_icon_state()
+/obj/item/implantcase/update_overlays()
+ . = ..()
if(imp)
- icon_state = "implantcase-[imp.item_color]"
- else
- icon_state = "implantcase-0"
+ var/image/implant_overlay = image('icons/obj/implants.dmi', imp.implant_state)
+ . += implant_overlay
-
-/obj/item/implantcase/attackby(obj/item/W, mob/user, params)
+/obj/item/implantcase/attackby(obj/item/W, mob/user)
..()
+
if(istype(W, /obj/item/pen))
rename_interactive(user, W)
else if(istype(W, /obj/item/implanter))
@@ -39,7 +49,7 @@
if(I.imp)
if(imp || I.imp.implanted)
return
- I.imp.loc = src
+ I.imp.forceMove(src)
imp = I.imp
I.imp = null
update_state()
@@ -53,46 +63,3 @@
imp = null
update_state()
I.update_icon(UPDATE_ICON_STATE)
-
- /*else if(istype(W, /obj/item/ammo_casing/shotgun/implanter))
- var/obj/item/ammo_casing/shotgun/implanter/I = W
- if(I.implanter)
- src.attackby(I.implanter, user, params) */ // COMING SOON -- c0
-
-/obj/item/implantcase/New()
- ..()
- update_state()
-
-
-/obj/item/implantcase/tracking
- name = "implant case - 'Tracking'"
- desc = "A glass case containing a tracking implant."
-
-/obj/item/implantcase/tracking/New()
- imp = new /obj/item/implant/tracking(src)
- ..()
-
-
-/obj/item/implantcase/weapons_auth
- name = "implant case - 'Firearms Authentication'"
- desc = "A glass case containing a firearms authentication implant."
-
-/obj/item/implantcase/weapons_auth/New()
- imp = new /obj/item/implant/weapons_auth(src)
- ..()
-
-/obj/item/implantcase/adrenaline
- name = "implant case - 'Adrenaline'"
- desc = "A glass case containing an adrenaline implant."
-
-/obj/item/implantcase/adrenaline/New()
- imp = new /obj/item/implant/adrenalin(src)
- ..()
-
-/obj/item/implantcase/death_alarm
- name = "Glass Case- 'Death Alarm'"
- desc = "A case containing a death alarm implant."
-
-/obj/item/implantcase/death_alarm/New()
- imp = new /obj/item/implant/death_alarm(src)
- ..()
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm
index c2a880b63c0..4cddfeb8f74 100644
--- a/code/game/objects/items/weapons/implants/implantchair.dm
+++ b/code/game/objects/items/weapons/implants/implantchair.dm
@@ -14,7 +14,7 @@
var/injection_cooldown = 600
var/replenish_cooldown = 6000
var/replenishing = 0
- var/mob/living/carbon/occupant = null
+ var/mob/living/carbon/occupant
var/injecting = FALSE
/obj/machinery/implantchair/Initialize(mapload)
@@ -25,20 +25,20 @@
/obj/machinery/implantchair/attack_hand(mob/user)
user.set_machine(src)
var/health_text = ""
- if(src.occupant)
- if(src.occupant.health <= -100)
+ if(occupant)
+ if(occupant.health <= -100)
health_text = "Dead"
- else if(src.occupant.health < 0)
- health_text = "[round(src.occupant.health,0.1)]"
+ else if(occupant.health < 0)
+ health_text = "[round(occupant.health, 0.1)]"
else
- health_text = "[round(src.occupant.health,0.1)]"
+ health_text = "[round(occupant.health,0.1)]"
var/dat ="Implanter Status
"
- dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
"
- dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
"
- if(src.occupant)
- dat += "[src.ready ? "Implant" : "Recharging"]
"
+ dat +="Current occupant: [occupant ? "
Name: [occupant]
Health: [health_text]
" : "None"]
"
+ dat += "Implants: [length(implant_list) ? "[length(implant_list)]" : "Replenish"]
"
+ if(occupant)
+ dat += "[ready ? "Implant" : "Recharging"]
"
user.set_machine(src)
user << browse(dat, "window=implant")
onclose(user, "implant")
@@ -48,7 +48,7 @@
if(..())
return
if(href_list["implant"])
- if(src.occupant)
+ if(occupant)
injecting = TRUE
go_out()
ready = FALSE
@@ -61,7 +61,7 @@
add_implants()
ready = TRUE
- src.updateUsrDialog()
+ updateUsrDialog()
return
@@ -76,20 +76,20 @@
return
if(put_mob(M))
qdel(G)
- src.updateUsrDialog()
+ updateUsrDialog()
return
/obj/machinery/implantchair/proc/go_out(mob/M)
- if(!( src.occupant ))
+ if(!(occupant))
return
if(M == occupant) // so that the guy inside can't eject himself -Agouri
return
occupant.forceMove(loc)
if(injecting)
- implant(src.occupant)
+ implant(occupant)
injecting = FALSE
- src.occupant = null
+ occupant = null
icon_state = "implantchair"
return
@@ -98,15 +98,15 @@
if(!iscarbon(M))
to_chat(usr, "[src] cannot hold this!")
return
- if(src.occupant)
+ if(occupant)
to_chat(usr, "[src] is already occupied!")
return
M.stop_pulling()
M.forceMove(src)
- src.occupant = M
- src.add_fingerprint(usr)
+ occupant = M
+ add_fingerprint(usr)
icon_state = "implantchair_on"
- return 1
+ return TRUE
/obj/machinery/implantchair/proc/implant(mob/M)
@@ -126,10 +126,9 @@
/obj/machinery/implantchair/proc/add_implants()
- for(var/i=0, iThere's no implant in the pad!")
return
if(user)
if(user.put_in_hands(case))
@@ -55,52 +64,32 @@
if(usr.stat || usr.restrained())
return
- dropcase(usr)
+ eject_case(usr)
-/obj/item/implantpad/attackby(obj/item/implantcase/C as obj, mob/user as mob, params)
- if(istype(C, /obj/item/implantcase))
- addcase(user, C)
- else
- return ..()
+/obj/item/implantpad/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "ImplantPad", name, 410, 400, master_ui, state)
+ ui.open()
-/obj/item/implantpad/attack_self(mob/user as mob)
- add_fingerprint(user)
- user.set_machine(src)
- var/dat = "Implant Mini-Computer:
"
- if(case)
- if(case.imp)
- if(istype(case.imp, /obj/item/implant))
- dat += "Remove Case
"
- dat += case.imp.get_data()
- if(istype(case.imp, /obj/item/implant/tracking))
- var/obj/item/implant/tracking/T = case.imp
- dat += {"ID (1-100):
- -
- - [T.id]
- +
- +
"}
- else
- dat += "The implant casing is empty."
- else
- dat += "Please insert an implant casing!"
- user << browse(dat, "window=implantpad")
- onclose(user, "implantpad")
- return
+/obj/item/implantpad/ui_data(mob/user)
+ var/list/data = list()
+ data["contains_case"] = case ? TRUE : FALSE
+ if(case && case.imp)
+ var/datum/implant_fluff/implant_data = case.imp.implant_data
+ data["implant"] = list(
+ "name" = implant_data.name,
+ "life" = implant_data.life,
+ "notes" = implant_data.notes,
+ "function" = implant_data.function,
+ "image" = "[icon2base64(icon(initial(case.imp.icon), initial(case.imp.icon_state), SOUTH, 1))]",
+ )
+ return data
-
-/obj/item/implantpad/Topic(href, href_list)
+/obj/item/implantpad/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
if(..())
- return 1
+ return
- var/mob/living/user = usr
- if(href_list["tracking_id"])
- if(case && case.imp)
- var/obj/item/implant/tracking/T = case.imp
- T.id += text2num(href_list["tracking_id"])
- T.id = min(100, T.id)
- T.id = max(1, T.id)
- else if(href_list["removecase"])
- dropcase(user)
-
- attack_self(user)
- return 1
+ switch(action)
+ if("eject_case")
+ eject_case(ui.user)
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 5ade3af835b..5324eb83124 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -10,7 +10,7 @@
/obj/item/locator
name = "locator"
desc = "Used to track those with locater implants."
- icon = 'icons/obj/device.dmi'
+ icon = 'icons/obj/implants.dmi'
icon_state = "locator"
var/temp = null
var/frequency = 1451
@@ -73,7 +73,7 @@ Frequency:
var/turf/Tr = get_turf(T)
if(Tr && Tr.z == sr.z)
- temp += "[T.id]: [Tr.x], [Tr.y], [Tr.z]
"
+ temp += " [Tr.x], [Tr.y], [Tr.z]
"
temp += "You are at \[[sr.x],[sr.y],[sr.z]\]."
temp += "
Refresh
"
diff --git a/code/modules/ruins/syndicate_space_base.dm b/code/modules/ruins/syndicate_space_base.dm
index 0efe55882df..3e91e294b70 100644
--- a/code/modules/ruins/syndicate_space_base.dm
+++ b/code/modules/ruins/syndicate_space_base.dm
@@ -52,7 +52,6 @@
belt = /obj/item/storage/belt/utility/full/multitool
r_pocket = /obj/item/gun/projectile/automatic/pistol
id = /obj/item/card/id/syndicate/researcher
- implants = list(/obj/item/implant/weapons_auth)
backpack_contents = list(
/obj/item/ammo_box/magazine/m10mm = 1,
/obj/item/flashlight = 1,
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index ede3415389b..0380cfd40ea 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi
index 6ab6a2e74bd..21b5739d03b 100644
Binary files a/icons/obj/implants.dmi and b/icons/obj/implants.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 7f6aa1569d3..fc56c446995 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 185880f9f6d..b2c5bd9e7df 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1028,25 +1028,29 @@
#include "code\game\objects\items\weapons\grenades\smokebomb.dm"
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
-#include "code\game\objects\items\weapons\implants\health.dm"
#include "code\game\objects\items\weapons\implants\implant.dm"
#include "code\game\objects\items\weapons\implants\implant_abductor.dm"
+#include "code\game\objects\items\weapons\implants\implant_adrenalin.dm"
#include "code\game\objects\items\weapons\implants\implant_chem.dm"
-#include "code\game\objects\items\weapons\implants\implant_clown.dm"
#include "code\game\objects\items\weapons\implants\implant_death_alarm.dm"
+#include "code\game\objects\items\weapons\implants\implant_dust.dm"
+#include "code\game\objects\items\weapons\implants\implant_emp.dm"
+#include "code\game\objects\items\weapons\implants\implant_exile.dm"
#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
#include "code\game\objects\items\weapons\implants\implant_freedom.dm"
+#include "code\game\objects\items\weapons\implants\implant_health.dm"
#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm"
#include "code\game\objects\items\weapons\implants\implant_mindshield.dm"
-#include "code\game\objects\items\weapons\implants\implant_misc.dm"
+#include "code\game\objects\items\weapons\implants\implant_sad_trombone.dm"
#include "code\game\objects\items\weapons\implants\implant_storage.dm"
-#include "code\game\objects\items\weapons\implants\implant_track.dm"
+#include "code\game\objects\items\weapons\implants\implant_tracking.dm"
#include "code\game\objects\items\weapons\implants\implant_traitor.dm"
+#include "code\game\objects\items\weapons\implants\implant_uplink.dm"
#include "code\game\objects\items\weapons\implants\implantcase.dm"
#include "code\game\objects\items\weapons\implants\implantchair.dm"
#include "code\game\objects\items\weapons\implants\implanter.dm"
+#include "code\game\objects\items\weapons\implants\implantfluff.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
-#include "code\game\objects\items\weapons\implants\implantuplink.dm"
#include "code\game\objects\items\weapons\melee\energy.dm"
#include "code\game\objects\items\weapons\melee\misc.dm"
#include "code\game\objects\items\weapons\storage\backpack.dm"
@@ -1389,7 +1393,6 @@
#include "code\modules\atmospherics\machinery\portable\pump.dm"
#include "code\modules\atmospherics\machinery\portable\scrubber.dm"
#include "code\modules\awaymissions\corpse.dm"
-#include "code\modules\awaymissions\exile.dm"
#include "code\modules\awaymissions\gateway.dm"
#include "code\modules\awaymissions\loot.dm"
#include "code\modules\awaymissions\map_rng.dm"
diff --git a/tgui/packages/tgui/interfaces/ImplantPad.js b/tgui/packages/tgui/interfaces/ImplantPad.js
new file mode 100644
index 00000000000..412b6462453
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ImplantPad.js
@@ -0,0 +1,49 @@
+import { useBackend } from '../backend';
+import { Button, Section, Box } from '../components';
+import { LabeledList, LabeledListItem } from '../components/LabeledList';
+import { Window } from '../layouts';
+
+export const ImplantPad = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ implant,
+ contains_case,
+ } = data;
+
+ return (
+
+
+
+ {implant && contains_case ?
+ <>
+
+
+ {implant.name}
+
+
+ {implant.life}
+ {implant.notes}
+ {implant.function}
+
+ >
+ :
+ (
+ contains_case
+ ? This implant case has no implant!
+ : Please insert an implant casing!
+ )
+ }
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/PrisonerImplantManager.js b/tgui/packages/tgui/interfaces/PrisonerImplantManager.js
index 180b768455c..2d995dccb9a 100644
--- a/tgui/packages/tgui/interfaces/PrisonerImplantManager.js
+++ b/tgui/packages/tgui/interfaces/PrisonerImplantManager.js
@@ -76,7 +76,7 @@ export const PrisonerImplantManager = (props, context) => {
{trackingInfo
.map(implant => (
<>
- Subject: {implant.subject}
+ Subject: {implant.subject}
{implant.location}
{implant.health}
diff --git a/tgui/packages/tgui/public/tgui.bundle.js b/tgui/packages/tgui/public/tgui.bundle.js
index a532bb5962c..da7ce75a8d0 100644
--- a/tgui/packages/tgui/public/tgui.bundle.js
+++ b/tgui/packages/tgui/public/tgui.bundle.js
@@ -1,5 +1,5 @@
-!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=230)}([function(e,t,n){"use strict";t.__esModule=!0;var o=n(232);Object.keys(o).forEach((function(e){"default"!==e&&"__esModule"!==e&&(e in t&&t[e]===o[e]||(t[e]=o[e]))}))},function(e,t,n){"use strict";t.__esModule=!0,t.useSharedState=t.useLocalState=t.useBackend=t.deleteLocalState=t.backendUpdate=t.backendSetSharedState=t.backendReducer=t.backendDeleteSharedState=void 0;var o=n(31),r=n(45);t.backendUpdate=function(e){return{type:"backend/update",payload:e}};var a=function(e,t){return{type:"backend/setSharedState",payload:{key:e,nextState:t}}};t.backendSetSharedState=a;var c=function(e){return{type:"backend/deleteSharedState",payload:e}};t.backendDeleteSharedState=c;t.backendReducer=function(e,t){var n=t.type,o=t.payload;if("backend/update"===n){var a=Object.assign({},e.config,o.config),c=Object.assign({},e.data,o.static_data,o.data),i=Object.assign({},e.shared);if(o.shared)for(var l=0,d=Object.keys(o.shared);l1?n-1:0),r=1;rn?n:e};t.clamp01=function(e){return e<0?0:e>1?1:e};t.scale=function(e,t,n){return(e-t)/(n-t)};t.round=function(e,t){return!e||isNaN(e)?e:(t|=0,a=(e*=n=Math.pow(10,t))>0|-(e<0),r=Math.abs(e%1)>=.4999999999854481,o=Math.floor(e),r&&(e=o+(a>0)),(r?e:Math.round(e))/n);var n,o,r,a};t.toFixed=function(e,t){return void 0===t&&(t=0),Number(e).toFixed(Math.max(t,0))};var o=function(e,t){return t&&e>=t[0]&&e<=t[1]};t.inRange=o;t.keyOfMatchingRange=function(e,t){for(var n=0,r=Object.keys(t);n0&&(t.style=l),t};t.computeBoxProps=N;var b=function(e){var t=e.textColor||e.color,n=e.backgroundColor;return(0,o.classes)([u(t)&&"color-"+t,u(n)&&"color-bg-"+n])};t.computeBoxClassName=b;var V=function(e){var t=e.as,n=void 0===t?"div":t,o=e.className,c=e.children,l=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o=0||(r[n]=e[n]);return r}(e,i);if("function"==typeof c)return c(N(e));var d="string"==typeof o?o+" "+b(l):b(l),u=N(l);return(0,r.createVNode)(a.VNodeFlags.HtmlElement,n,d,c,a.ChildFlags.UnknownChildren,u)};t.Box=V,V.defaultHooks=o.pureComponentHooks},function(e,t,n){"use strict";var o=n(39);e.exports=function(e){return o(e.length)}},function(e,t,n){"use strict";var o=n(5),r=n(12),a=n(47),c=n(129),i=n(127);e.exports=function(e,t,n,l){var d=!!l&&!!l.unsafe,u=!!l&&!!l.enumerable,s=!!l&&!!l.noTargetGet,m=l&&l.name!==undefined?l.name:t;return r(n)&&c(n,m,l),e===o?(u?e[t]=n:i(t,n),e):(d?!s&&e[t]&&(u=!0):delete e[t],u?e[t]=n:a(e,t,n),e)}},function(e,t,n){"use strict";var o=n(58),r=n(7),a=n(84),c=n(18),i=n(22),l=n(90),d=r([].push),u=function(e){var t=1==e,n=2==e,r=3==e,u=4==e,s=6==e,m=7==e,p=5==e||s;return function(f,h,C,N){for(var b,V,g=c(f),v=a(g),y=o(h,C),x=i(v),_=0,k=N||l,L=t?k(f,x):n||m?k(f,0):undefined;x>_;_++)if((p||_ in v)&&(V=y(b=v[_],_,g),e))if(t)L[_]=V;else if(V)switch(e){case 3:return!0;case 5:return b;case 6:return _;case 2:d(L,b)}else switch(e){case 4:return!1;case 7:d(L,b)}return s?-1:r||u?u:L}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},function(e,t,n){"use strict";function o(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n",apos:"'"};return e.replace(/
/gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(/&(nbsp|amp|quot|lt|gt|apos);/g,(function(e,n){return t[n]})).replace(/?([0-9]+);/gi,(function(e,t){var n=parseInt(t,10);return String.fromCharCode(n)})).replace(/?([0-9a-f]+);/gi,(function(e,t){var n=parseInt(t,16);return String.fromCharCode(n)}))};t.buildQueryString=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")}},function(e,t,n){"use strict";var o=n(8),r=n(14),a=n(100),c=n(62),i=n(29),l=n(54),d=n(17),u=n(172),s=Object.getOwnPropertyDescriptor;t.f=o?s:function(e,t){if(e=i(e),t=l(t),u)try{return s(e,t)}catch(n){}if(d(e,t))return c(!r(a.f,e,t),e[t])}},function(e,t,n){"use strict";var o=n(5),r=n(12),a=n(70),c=o.TypeError;e.exports=function(e){if(r(e))return e;throw c(a(e)+" is not a function")}},function(e,t,n){"use strict";var o=n(5),r=n(12),a=function(e){return r(e)?e:undefined};e.exports=function(e,t){return arguments.length<2?a(o[e]):o[e]&&o[e][t]}},function(e,t,n){"use strict";var o=n(84),r=n(30);e.exports=function(e){return o(r(e))}},function(e,t,n){"use strict";var o=n(5).TypeError;e.exports=function(e){if(e==undefined)throw o("Can't call method on "+e);return e}},function(e,t,n){"use strict";function o(e,t,n,o,r,a,c){try{var i=e[a](c),l=i.value}catch(d){return void n(d)}i.done?t(l):Promise.resolve(l).then(o,r)}t.__esModule=!0,t.winset=t.winget=t.runCommand=t.callByondAsync=t.callByond=t.IS_IE8=void 0;var r=window.Byond,a=function(){var e=navigator.userAgent.match(/Trident\/(\d+).+?;/i);if(!e)return null;var t=e[1];return t?parseInt(t,10):null}(),c=null!==a&&a<=6;t.IS_IE8=c;var i=function(e,t){void 0===t&&(t={}),r.call(e,t)};t.callByond=i;var l=function(e,t){void 0===t&&(t={}),window.__callbacks__=window.__callbacks__||[];var n=window.__callbacks__.length,o=new Promise((function(e){window.__callbacks__.push(e)}));return r.call(e,Object.assign({},t,{callback:"__callbacks__["+n+"]"})),o};t.callByondAsync=l;t.runCommand=function(e){return i("winset",{command:e})};var d=function(){var e,t=(e=regeneratorRuntime.mark((function n(e,t){var o;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,l("winget",{id:e,property:t});case 2:return o=n.sent,n.abrupt("return",o[t]);case 4:case"end":return n.stop()}}),n)})),function(){var t=this,n=arguments;return new Promise((function(r,a){var c=e.apply(t,n);function i(e){o(c,r,a,i,l,"next",e)}function l(e){o(c,r,a,i,l,"throw",e)}i(undefined)}))});return function(e,n){return t.apply(this,arguments)}}();t.winget=d;t.winset=function(e,t,n){var o;return i("winset",((o={})[e+"."+t]=n,o))}},function(e,t,n){"use strict";t.__esModule=!0,t.zipWith=t.zip=t.uniqBy=t.toKeyedArray=t.toArray=t.sortBy=t.reduce=t.map=t.filter=void 0;t.toArray=function(e){if(Array.isArray(e))return e;if("object"==typeof e){var t=Object.prototype.hasOwnProperty,n=[];for(var o in e)t.call(e,o)&&n.push(e[o]);return n}return[]};t.toKeyedArray=function(e,t){return void 0===t&&(t="key"),o((function(e,n){var o;return Object.assign(((o={})[t]=n,o),e)}))(e)};t.filter=function(e){return function(t){if(null===t&&t===undefined)return t;if(Array.isArray(t)){for(var n=[],o=0;oi)return 1}return 0};t.sortBy=function(){for(var e=arguments.length,t=new Array(e),n=0;n"+l+""+t+">"}},function(e,t,n){"use strict";var o=n(6);e.exports=function(e){return o((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}))}},function(e,t,n){"use strict";var o,r,a,c=n(174),i=n(5),l=n(7),d=n(11),u=n(47),s=n(17),m=n(126),p=n(102),f=n(86),h=i.TypeError,C=i.WeakMap;if(c||m.state){var N=m.state||(m.state=new C),b=l(N.get),V=l(N.has),g=l(N.set);o=function(e,t){if(V(N,e))throw new h("Object already initialized");return t.facade=e,g(N,e,t),t},r=function(e){return b(N,e)||{}},a=function(e){return V(N,e)}}else{var v=p("state");f[v]=!0,o=function(e,t){if(s(e,v))throw new h("Object already initialized");return t.facade=e,u(e,v,t),t},r=function(e){return s(e,v)?e[v]:{}},a=function(e){return s(e,v)}}e.exports={set:o,get:r,has:a,enforce:function(e){return a(e)?r(e):o(e,{})},getterFor:function(e){return function(t){var n;if(!d(t)||(n=r(t)).type!==e)throw h("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var o=Math.ceil,r=Math.floor;e.exports=function(e){var t=+e;return t!=t||0===t?0:(t>0?r:o)(t)}},function(e,t,n){"use strict";var o=n(38),r=Math.min;e.exports=function(e){return e>0?r(o(e),9007199254740991):0}},function(e,t,n){"use strict";t.__esModule=!0,t.modalRegisterBodyOverride=t.modalOpen=t.modalClose=t.modalAnswer=t.ComplexModal=void 0;var o=n(0),r=n(1),a=n(2),c={};t.modalOpen=function(e,t,n){var o=(0,r.useBackend)(e),a=o.act,c=o.data,i=Object.assign(c.modal?c.modal.args:{},n||{});a("modal_open",{id:t,arguments:JSON.stringify(i)})};t.modalRegisterBodyOverride=function(e,t){c[e]=t};var i=function(e,t,n,o){var a=(0,r.useBackend)(e),c=a.act,i=a.data;if(i.modal){var l=Object.assign(i.modal.args||{},o||{});c("modal_answer",{id:t,answer:n,arguments:JSON.stringify(l)})}};t.modalAnswer=i;var l=function(e,t){(0,(0,r.useBackend)(e).act)("modal_close",{id:t})};t.modalClose=l;t.ComplexModal=function(e,t){var n=(0,r.useBackend)(t).data;if(n.modal){var d,u,s=n.modal,m=s.id,p=s.text,f=s.type,h=(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-left",content:"Cancel",color:"grey",onClick:function(){return l(t)}}),C="auto";if(c[m])u=c[m](n.modal,t);else if("input"===f){var N=n.modal.value;d=function(e){return i(t,m,N)},u=(0,o.createComponentVNode)(2,a.Input,{value:n.modal.value,placeholder:"ENTER to submit",width:"100%",my:"0.5rem",autofocus:!0,onChange:function(e,t){N=t}}),h=(0,o.createComponentVNode)(2,a.Box,{mt:"0.5rem",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"arrow-left",content:"Cancel",color:"grey",onClick:function(){return l(t)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"check",content:"Confirm",color:"good",float:"right",m:"0",onClick:function(){return i(t,m,N)}}),(0,o.createComponentVNode)(2,a.Box,{clear:"both"})]})}else if("choice"===f){var b="object"==typeof n.modal.choices?Object.values(n.modal.choices):n.modal.choices;u=(0,o.createComponentVNode)(2,a.Dropdown,{options:b,selected:n.modal.value,width:"100%",my:"0.5rem",onSelected:function(e){return i(t,m,e)}}),C="initial"}else"bento"===f?u=(0,o.createComponentVNode)(2,a.Flex,{spacingPrecise:"1",wrap:"wrap",my:"0.5rem",maxHeight:"1%",children:n.modal.choices.map((function(e,r){return(0,o.createComponentVNode)(2,a.Flex.Item,{flex:"1 1 auto",children:(0,o.createComponentVNode)(2,a.Button,{selected:r+1===parseInt(n.modal.value,10),onClick:function(){return i(t,m,r+1)},children:(0,o.createVNode)(1,"img",null,null,1,{src:e})})},r)}))}):"boolean"===f&&(h=(0,o.createComponentVNode)(2,a.Box,{mt:"0.5rem",children:[(0,o.createComponentVNode)(2,a.Button,{icon:"times",content:n.modal.no_text,color:"bad",float:"left",mb:"0",onClick:function(){return i(t,m,0)}}),(0,o.createComponentVNode)(2,a.Button,{icon:"check",content:n.modal.yes_text,color:"good",float:"right",m:"0",onClick:function(){return i(t,m,1)}}),(0,o.createComponentVNode)(2,a.Box,{clear:"both"})]}));return(0,o.createComponentVNode)(2,a.Modal,{maxWidth:e.maxWidth||window.innerWidth/2+"px",maxHeight:e.maxHeight||window.innerHeight/2+"px",onEnter:d,mx:"auto",overflowY:C,children:[(0,o.createComponentVNode)(2,a.Box,{display:"inline",children:p}),u,h]})}}},function(e,t,n){"use strict";var o=n(5),r=n(17),a=n(12),c=n(18),i=n(102),l=n(139),d=i("IE_PROTO"),u=o.Object,s=u.prototype;e.exports=l?u.getPrototypeOf:function(e){var t=c(e);if(r(t,d))return t[d];var n=t.constructor;return a(n)&&t instanceof n?n.prototype:t instanceof u?s:null}},function(e,t,n){"use strict";var o=n(7),r=o({}.toString),a=o("".slice);e.exports=function(e){return a(r(e),8,-1)}},function(e,t,n){"use strict";var o=n(7);e.exports=o({}.isPrototypeOf)},function(e,t,n){"use strict";var o=n(83),r=Function.prototype,a=r.apply,c=r.call;e.exports="object"==typeof Reflect&&Reflect.apply||(o?c.bind(a):function(){return c.apply(a,arguments)})},function(e,t,n){"use strict";t.__esModule=!0,t.timeAgo=t.getGasLabel=t.getGasColor=t.UI_UPDATE=t.UI_INTERACTIVE=t.UI_DISABLED=t.UI_CLOSE=t.RADIO_CHANNELS=t.CSS_COLORS=t.COLORS=void 0;t.UI_INTERACTIVE=2;t.UI_UPDATE=1;t.UI_DISABLED=0;t.UI_CLOSE=-1;t.COLORS={department:{command:"#526aff",security:"#CF0000",medical:"#009190",science:"#993399",engineering:"#A66300",supply:"#9F8545",service:"#80A000",centcom:"#78789B",other:"#C38312"},damageType:{oxy:"#3498db",toxin:"#2ecc71",burn:"#e67e22",brute:"#e74c3c"}};t.CSS_COLORS=["black","white","red","orange","yellow","olive","green","teal","blue","violet","purple","pink","brown","grey","good","average","bad","label"];t.RADIO_CHANNELS=[{name:"Syndicate",freq:1213,color:"#a52a2a"},{name:"SyndTeam",freq:1244,color:"#a52a2a"},{name:"Red Team",freq:1215,color:"#ff4444"},{name:"Blue Team",freq:1217,color:"#3434fd"},{name:"Response Team",freq:1345,color:"#2681a5"},{name:"Special Ops",freq:1341,color:"#2681a5"},{name:"Supply",freq:1347,color:"#b88646"},{name:"Service",freq:1349,color:"#6ca729"},{name:"Science",freq:1351,color:"#c68cfa"},{name:"Command",freq:1353,color:"#5177ff"},{name:"Procedure",freq:1339,color:"#F70285"},{name:"Medical",freq:1355,color:"#57b8f0"},{name:"Medical(I)",freq:1485,color:"#57b8f0"},{name:"Engineering",freq:1357,color:"#f37746"},{name:"Security",freq:1359,color:"#dd3535"},{name:"Security(I)",freq:1475,color:"#dd3535"},{name:"AI Private",freq:1343,color:"#d65d95"},{name:"Common",freq:1459,color:"#1ecc43"}];var o=[{id:"o2",name:"Oxygen",label:"O\u2082",color:"blue"},{id:"n2",name:"Nitrogen",label:"N\u2082",color:"red"},{id:"co2",name:"Carbon Dioxide",label:"CO\u2082",color:"grey"},{id:"plasma",name:"Plasma",label:"Plasma",color:"pink"},{id:"water_vapor",name:"Water Vapor",label:"H\u2082O",color:"grey"},{id:"nob",name:"Hyper-noblium",label:"Hyper-nob",color:"teal"},{id:"n2o",name:"Nitrous Oxide",label:"N\u2082O",color:"red"},{id:"no2",name:"Nitryl",label:"NO\u2082",color:"brown"},{id:"tritium",name:"Tritium",label:"Tritium",color:"green"},{id:"bz",name:"BZ",label:"BZ",color:"purple"},{id:"stim",name:"Stimulum",label:"Stimulum",color:"purple"},{id:"pluox",name:"Pluoxium",label:"Pluoxium",color:"blue"},{id:"miasma",name:"Miasma",label:"Miasma",color:"olive"},{id:"hydrogen",name:"Hydrogen",label:"H\u2082",color:"white"},{id:"ab",name:"Agent B",label:"Agent B",color:"purple"}];t.getGasLabel=function(e,t){var n=String(e).toLowerCase(),r=o.find((function(e){return e.id===n||e.name.toLowerCase()===n}));return r&&r.label||t||e};t.getGasColor=function(e){var t=String(e).toLowerCase(),n=o.find((function(e){return e.id===t||e.name.toLowerCase()===t}));return n&&n.color};t.timeAgo=function(e,t){if(e>t)return"in the future";var n=(t/=10)-(e/=10);if(n>3600){var o=Math.round(n/3600);return o+" hour"+(1===o?"":"s")+" ago"}if(n>60){var r=Math.round(n/60);return r+" minute"+(1===r?"":"s")+" ago"}var a=Math.round(n);return a+" second"+(1===a?"":"s")+" ago"}},function(e,t,n){"use strict";var o=n(28);e.exports=o("navigator","userAgent")||""},function(e,t,n){"use strict";var o=n(8),r=n(16),a=n(62);e.exports=o?function(e,t,n){return r.f(e,t,a(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var o=n(38),r=Math.max,a=Math.min;e.exports=function(e,t){var n=o(e);return n<0?r(n+t,0):a(n,t)}},function(e,t,n){"use strict";var o,r=n(9),a=n(133),c=n(131),i=n(86),l=n(177),d=n(128),u=n(102),s=u("IE_PROTO"),m=function(){},p=function(e){return"