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(/&#x?([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+""}},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"