From 2a5352120d7bbbb86d100a911fc1f1e6d7721be7 Mon Sep 17 00:00:00 2001
From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
Date: Wed, 30 Sep 2020 21:45:54 +0100
Subject: [PATCH 1/3] Makes autodoc show path instead of name in trees (#14471)
---
SpacemanDMM.toml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml
index 9b658dce0fa..81aff0d5576 100644
--- a/SpacemanDMM.toml
+++ b/SpacemanDMM.toml
@@ -4,3 +4,6 @@ dreamchecker = true
[code_standards]
disallow_relative_type_definitions = true
disallow_relative_proc_definitions = true
+
+[dmdoc]
+use_typepath_names = true
From f9dd2de5f13629d3f87ae82bf19a3108aaf1296c Mon Sep 17 00:00:00 2001
From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
Date: Wed, 30 Sep 2020 21:53:45 +0100
Subject: [PATCH 2/3] [READY] [TGUI] Uplinks, PDAs and Power Consoles (Dont
question it) (#14403)
* Uplinks
* Main menu + Status display control
* Signaler + Homescreen Fixes
* TGUI Power Monitors
* PDA Power Monitor
* PDA Medical Records
* PDA Security Records
* PDA Secbot Control (Pain)
* PDA Mule Control (I hate this system)
* PDA Supply Records
* PDA Janitor Locator
* PDA Notekeeper
* PDA Manifest
* PDA Atmos Scanner
* Steel pass 1
* PDA Messenger
* Removes browserPDA-era icons
* PDA Nanomob (Why do we still support this thing)
* Fixes random power monitor quirk
* More steel tweaks
* Even more steel tweaks
* TM Tweaks Round 1
* \ref --> UID()
* Styling
---
code/datums/cache/powermonitor.dm | 2 +-
code/datums/uplink_item.dm | 4 -
code/game/machinery/camera/camera.dm | 2 +-
code/game/machinery/computer/power.dm | 46 ++-
code/game/objects/items/devices/uplinks.dm | 231 +++++---------
code/modules/mob/living/silicon/subsystems.dm | 4 +-
code/modules/nano/modules/power_monitor.dm | 53 ----
code/modules/pda/PDA.dm | 167 +---------
code/modules/pda/app.dm | 11 +-
code/modules/pda/cart.dm | 2 -
code/modules/pda/cart_apps.dm | 223 ++++++++-----
code/modules/pda/core_apps.dm | 75 +++--
code/modules/pda/messenger.dm | 85 ++---
code/modules/pda/mob_hunt_game_app.dm | 8 +-
code/modules/pda/pda_tgui.dm | 106 +++++++
code/modules/pda/radio.dm | 2 +-
code/modules/pda/utilities.dm | 57 +---
code/modules/tgui/modules/power_monitor.dm | 54 ++++
icons/pda_icons/pda_alert.png | Bin 259 -> 0 bytes
icons/pda_icons/pda_atmos.png | Bin 224 -> 0 bytes
icons/pda_icons/pda_back.png | Bin 219 -> 0 bytes
icons/pda_icons/pda_bell.png | Bin 226 -> 0 bytes
icons/pda_icons/pda_blank.png | Bin 189 -> 0 bytes
icons/pda_icons/pda_boom.png | Bin 241 -> 0 bytes
icons/pda_icons/pda_bucket.png | Bin 220 -> 0 bytes
icons/pda_icons/pda_chatroom.png | Bin 223 -> 0 bytes
icons/pda_icons/pda_clock.PNG | Bin 222 -> 0 bytes
icons/pda_icons/pda_crate.png | Bin 234 -> 0 bytes
icons/pda_icons/pda_cuffs.png | Bin 225 -> 0 bytes
icons/pda_icons/pda_egg.png | Bin 242 -> 0 bytes
icons/pda_icons/pda_eject.png | Bin 226 -> 0 bytes
icons/pda_icons/pda_exit.png | Bin 241 -> 0 bytes
icons/pda_icons/pda_flashlight.png | Bin 221 -> 0 bytes
icons/pda_icons/pda_game.png | Bin 262 -> 0 bytes
icons/pda_icons/pda_honk.png | Bin 219 -> 0 bytes
icons/pda_icons/pda_locked.PNG | Bin 215 -> 0 bytes
icons/pda_icons/pda_mail.png | Bin 216 -> 0 bytes
icons/pda_icons/pda_medical.png | Bin 203 -> 0 bytes
icons/pda_icons/pda_menu.png | Bin 229 -> 0 bytes
icons/pda_icons/pda_mule.png | Bin 230 -> 0 bytes
icons/pda_icons/pda_notes.png | Bin 218 -> 0 bytes
icons/pda_icons/pda_power.png | Bin 215 -> 0 bytes
icons/pda_icons/pda_rdoor.png | Bin 212 -> 0 bytes
icons/pda_icons/pda_reagent.png | Bin 219 -> 0 bytes
icons/pda_icons/pda_refresh.png | Bin 234 -> 0 bytes
icons/pda_icons/pda_scanner.png | Bin 241 -> 0 bytes
icons/pda_icons/pda_signaler.png | Bin 238 -> 0 bytes
icons/pda_icons/pda_status.png | Bin 230 -> 0 bytes
nano/templates/pda.tmpl | 156 ---------
nano/templates/pda_atmos_scan.tmpl | 60 ----
nano/templates/pda_janitor.tmpl | 66 ----
nano/templates/pda_main_menu.tmpl | 76 -----
nano/templates/pda_manifest.tmpl | 96 ------
nano/templates/pda_medical.tmpl | 54 ----
nano/templates/pda_messenger.tmpl | 90 ------
nano/templates/pda_mob_hunt.tmpl | 91 ------
nano/templates/pda_mule.tmpl | 118 -------
nano/templates/pda_notekeeper.tmpl | 21 --
nano/templates/pda_power.tmpl | 49 ---
nano/templates/pda_secbot.tmpl | 59 ----
nano/templates/pda_security.tmpl | 50 ---
nano/templates/pda_signaller.tmpl | 38 ---
nano/templates/pda_status_display.tmpl | 44 ---
nano/templates/pda_supply.tmpl | 39 ---
nano/templates/power_monitor.tmpl | 67 ----
nano/templates/uplink.tmpl | 101 ------
paradise.dme | 3 +-
tgui/packages/tgui/components/Button.js | 6 +-
tgui/packages/tgui/constants.js | 17 +-
tgui/packages/tgui/interfaces/PDA.js | 150 +++++++++
tgui/packages/tgui/interfaces/PowerMonitor.js | 297 ++++++++++++++++++
tgui/packages/tgui/interfaces/Uplink.js | 192 +++++++++++
.../tgui/interfaces/common/CrewManifest.js | 195 ++++++++++++
.../tgui/interfaces/pda/pda_atmos_scan.js | 48 +++
.../tgui/interfaces/pda/pda_janitor.js | 59 ++++
.../tgui/interfaces/pda/pda_main_menu.js | 77 +++++
.../tgui/interfaces/pda/pda_manifest.js | 8 +
.../tgui/interfaces/pda/pda_medical.js | 160 ++++++++++
.../tgui/interfaces/pda/pda_messenger.js | 262 +++++++++++++++
.../tgui/interfaces/pda/pda_mob_hunt.js | 132 ++++++++
tgui/packages/tgui/interfaces/pda/pda_mule.js | 173 ++++++++++
.../packages/tgui/interfaces/pda/pda_notes.js | 22 ++
.../packages/tgui/interfaces/pda/pda_power.js | 8 +
.../tgui/interfaces/pda/pda_secbot.js | 124 ++++++++
.../tgui/interfaces/pda/pda_security.js | 148 +++++++++
.../tgui/interfaces/pda/pda_signaler.js | 56 ++++
.../tgui/interfaces/pda/pda_status_display.js | 74 +++++
.../tgui/interfaces/pda/pda_supplyrecords.js | 55 ++++
tgui/packages/tgui/public/tgui.bundle.css | 2 +-
tgui/packages/tgui/public/tgui.bundle.js | 6 +-
tgui/packages/tgui/styles/interfaces/PDA.scss | 15 +
tgui/packages/tgui/styles/main.scss | 1 +
92 files changed, 2817 insertions(+), 1880 deletions(-)
delete mode 100644 code/modules/nano/modules/power_monitor.dm
create mode 100644 code/modules/pda/pda_tgui.dm
create mode 100644 code/modules/tgui/modules/power_monitor.dm
delete mode 100644 icons/pda_icons/pda_alert.png
delete mode 100644 icons/pda_icons/pda_atmos.png
delete mode 100644 icons/pda_icons/pda_back.png
delete mode 100644 icons/pda_icons/pda_bell.png
delete mode 100644 icons/pda_icons/pda_blank.png
delete mode 100644 icons/pda_icons/pda_boom.png
delete mode 100644 icons/pda_icons/pda_bucket.png
delete mode 100644 icons/pda_icons/pda_chatroom.png
delete mode 100644 icons/pda_icons/pda_clock.PNG
delete mode 100644 icons/pda_icons/pda_crate.png
delete mode 100644 icons/pda_icons/pda_cuffs.png
delete mode 100644 icons/pda_icons/pda_egg.png
delete mode 100644 icons/pda_icons/pda_eject.png
delete mode 100644 icons/pda_icons/pda_exit.png
delete mode 100644 icons/pda_icons/pda_flashlight.png
delete mode 100644 icons/pda_icons/pda_game.png
delete mode 100644 icons/pda_icons/pda_honk.png
delete mode 100644 icons/pda_icons/pda_locked.PNG
delete mode 100644 icons/pda_icons/pda_mail.png
delete mode 100644 icons/pda_icons/pda_medical.png
delete mode 100644 icons/pda_icons/pda_menu.png
delete mode 100644 icons/pda_icons/pda_mule.png
delete mode 100644 icons/pda_icons/pda_notes.png
delete mode 100644 icons/pda_icons/pda_power.png
delete mode 100644 icons/pda_icons/pda_rdoor.png
delete mode 100644 icons/pda_icons/pda_reagent.png
delete mode 100644 icons/pda_icons/pda_refresh.png
delete mode 100644 icons/pda_icons/pda_scanner.png
delete mode 100644 icons/pda_icons/pda_signaler.png
delete mode 100644 icons/pda_icons/pda_status.png
delete mode 100644 nano/templates/pda.tmpl
delete mode 100644 nano/templates/pda_atmos_scan.tmpl
delete mode 100644 nano/templates/pda_janitor.tmpl
delete mode 100644 nano/templates/pda_main_menu.tmpl
delete mode 100644 nano/templates/pda_manifest.tmpl
delete mode 100644 nano/templates/pda_medical.tmpl
delete mode 100644 nano/templates/pda_messenger.tmpl
delete mode 100644 nano/templates/pda_mob_hunt.tmpl
delete mode 100644 nano/templates/pda_mule.tmpl
delete mode 100644 nano/templates/pda_notekeeper.tmpl
delete mode 100644 nano/templates/pda_power.tmpl
delete mode 100644 nano/templates/pda_secbot.tmpl
delete mode 100644 nano/templates/pda_security.tmpl
delete mode 100644 nano/templates/pda_signaller.tmpl
delete mode 100644 nano/templates/pda_status_display.tmpl
delete mode 100644 nano/templates/pda_supply.tmpl
delete mode 100644 nano/templates/power_monitor.tmpl
delete mode 100644 nano/templates/uplink.tmpl
create mode 100644 tgui/packages/tgui/interfaces/PDA.js
create mode 100644 tgui/packages/tgui/interfaces/PowerMonitor.js
create mode 100644 tgui/packages/tgui/interfaces/Uplink.js
create mode 100644 tgui/packages/tgui/interfaces/common/CrewManifest.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_atmos_scan.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_janitor.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_main_menu.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_manifest.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_medical.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_messenger.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_mob_hunt.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_mule.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_notes.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_power.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_secbot.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_security.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_signaler.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_status_display.js
create mode 100644 tgui/packages/tgui/interfaces/pda/pda_supplyrecords.js
create mode 100644 tgui/packages/tgui/styles/interfaces/PDA.scss
diff --git a/code/datums/cache/powermonitor.dm b/code/datums/cache/powermonitor.dm
index 606dd500eda..a11e9b76a41 100644
--- a/code/datums/cache/powermonitor.dm
+++ b/code/datums/cache/powermonitor.dm
@@ -13,7 +13,7 @@ GLOBAL_DATUM_INIT(powermonitor_repository, /datum/repository/powermonitor, new()
for(var/obj/machinery/computer/monitor/pMon in GLOB.power_monitors)
if( !(pMon.stat & (NOPOWER|BROKEN)) && !pMon.is_secret_monitor )
- pMonData[++pMonData.len] = list ("Name" = pMon.name, "ref" = "\ref[pMon]")
+ pMonData[++pMonData.len] = list ("Name" = pMon.name, "uid" = "[pMon.UID()]")
cache_entry.timestamp = world.time //+ 30 SECONDS
cache_entry.data = pMonData
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 36bd35462d6..389b21dd6d1 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -59,10 +59,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
return uplink_items
-/datum/nano_item_lists
- var/list/items_nano
- var/list/items_reference
-
// You can change the order of the list by putting datums before/after one another OR
// you can use the last variable to make sure it appears last, well have the category appear last.
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 723e862405d..60beb105dce 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -182,7 +182,7 @@
var/datum/data/pda/app/notekeeper/N = PDA.find_program(/datum/data/pda/app/notekeeper)
if(N)
itemname = PDA.name
- info = N.notehtml
+ info = N.note
to_chat(U, "You hold \the [itemname] up to the camera ...")
U.changeNext_move(CLICK_CD_MELEE)
for(var/mob/O in GLOB.player_list)
diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm
index bb38e59c800..a0bbedf2f73 100644
--- a/code/game/machinery/computer/power.dm
+++ b/code/game/machinery/computer/power.dm
@@ -9,8 +9,17 @@
light_color = LIGHT_COLOR_ORANGE
circuit = /obj/item/circuitboard/powermonitor
var/datum/powernet/powernet = null
- var/datum/nano_module/power_monitor/power_monitor
+ var/datum/tgui_module/power_monitor/power_monitor
+ /// Will this monitor be hidden from viewers?
var/is_secret_monitor = FALSE
+ /// How many records to keep of supply and demand
+ var/record_size = 60
+ /// Interval between power snapshots
+ var/record_interval = 5 SECONDS
+ /// Time to next record power
+ var/next_record = 0
+ /// The history list itself of the power
+ var/list/history = list()
/obj/machinery/computer/monitor/secret //Hides the power monitor (such as ones on ruins & CentCom) from PDA's to prevent metagaming.
name = "outdated power monitoring console"
@@ -28,6 +37,8 @@
..()
GLOB.powermonitor_repository.update_cache()
powernet = find_powernet()
+ history["supply"] = list()
+ history["demand"] = list()
/obj/machinery/computer/monitor/Destroy()
GLOB.power_monitors -= src
@@ -56,10 +67,35 @@
return
// Update the powernet
powernet = find_powernet()
- ui_interact(user)
+ tgui_interact(user)
-/obj/machinery/computer/monitor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- power_monitor.ui_interact(user, ui_key, ui, force_open)
+/obj/machinery/computer/monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
+ power_monitor.tgui_interact(user, ui_key, ui, force_open)
/obj/machinery/computer/monitor/interact(mob/user)
- power_monitor.ui_interact(user)
+ power_monitor.tgui_interact(user)
+
+/obj/machinery/computer/monitor/process()
+ record()
+
+/**
+ * Power snapshot recording proc
+ *
+ * This proc handles recording powernet history for the graph on the TGUI
+ * It is called every process(), but only logs every 5 seconds
+ */
+/obj/machinery/computer/monitor/proc/record()
+ if(world.time >= next_record)
+ next_record = world.time + record_interval
+ if(!powernet)
+ return
+
+ var/list/supply = history["supply"]
+ supply += powernet.viewavail
+ if(length(supply) > record_size)
+ supply.Cut(1, 2)
+
+ var/list/demand = history["demand"]
+ demand += powernet.viewload
+ if(length(demand) > record_size)
+ demand.Cut(1, 2)
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 77e9eacc6a1..06f728ad748 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -9,14 +9,12 @@ A list of items and costs is stored under the datum of every game mode, alongsid
GLOBAL_LIST_EMPTY(world_uplinks)
/obj/item/uplink
- var/welcome // Welcoming menu message
var/uses // Numbers of crystals
var/hidden_crystals = 0
- var/list/uplink_items // List of categories with lists of items
- var/list/ItemsReference // List of references with an associated item
- var/list/nanoui_items // List of items for NanoUI use
- var/nanoui_menu = 0 // The current menu we are in
- var/list/nanoui_data = new // Additional data for NanoUI use
+ /// List of categories with items inside
+ var/list/uplink_cats
+ /// List of all items in total (For buying random)
+ var/list/uplink_items
var/purchase_log = ""
var/uplink_owner = null//text-only
@@ -26,12 +24,11 @@ GLOBAL_LIST_EMPTY(world_uplinks)
var/temp_category
var/uplink_type = "traitor"
-/obj/item/uplink/nano_host()
+/obj/item/uplink/tgui_host()
return loc
/obj/item/uplink/New()
..()
- welcome = SSticker.mode.uplink_welcome
uses = SSticker.mode.uplink_uses
uplink_items = get_uplink_items()
@@ -41,97 +38,45 @@ GLOBAL_LIST_EMPTY(world_uplinks)
GLOB.world_uplinks -= src
return ..()
-/obj/item/uplink/proc/generate_items(mob/user as mob)
- var/datum/nano_item_lists/IL = generate_item_lists(user)
- nanoui_items = IL.items_nano
- ItemsReference = IL.items_reference
-
-// BS12 no longer use this menu but there are forks that do, hency why we keep it
-/obj/item/uplink/proc/generate_menu(mob/user as mob)
+/**
+ * Build the item lists for use with the UI
+ *
+ * Generates a list of items for use in the UI, based on job and other parameters
+ *
+ * Arguments:
+ * * user - User to check
+ */
+/obj/item/uplink/proc/generate_item_lists(mob/user)
if(!job)
job = user.mind.assigned_role
- var/dat = "[src.welcome]
"
- dat += "Telecrystals left: [src.uses]
"
- dat += "
| Command | ||
|---|---|---|
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Security | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Engineering | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Medical | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Science | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Service | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Supply | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Civilian | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| Misc | ||
| {{:value.name}} | {{:value.rank}} | {{:value.active}} |
| - Connection Status: - | - {{if data.connected}} -- Connected - | -- {{:helper.link('Disconnect', 'sign-out', {'choice': 'Disconnect'})}} - | - {{else}} -- No Connection - | -- {{:helper.link('Connect', 'sign-in', {'choice': 'Reconnect'})}} - | - {{/if}} -
| - {{:helper.link('Previous Mob', 'arrow-left', {'choice': 'Prev'})}} - | -- {{:helper.link('Transfer Mob', 'exchange', {'choice': 'Transfer'})}} - | -- {{:helper.link('Rename Mob', 'pencil', {'choice': 'Rename'})}} - | -- {{:helper.link('Release Mob', 'tree', {'choice': 'Release'})}} - | -- {{:helper.link('Next Mob', 'arrow-right', {'choice': 'Next'})}} - | -
| Area | Equip. | Lighting | Environ. | Cell | Load |
|---|---|---|---|---|---|
| {{:value.Name}} | - {{:helper.string('{1} | ', value.Equipment == "On" || value.Equipment == "AOn" ? '#4f7529' : '#8f1414', value.Equipment)}} - {{:helper.string('{1} | ', value.Lights == "On" || value.Lights == "AOn" ? '#4f7529' : '#8f1414', value.Lights)}} - {{:helper.string('{1} | ', value.Environment == "On" || value.Environment == "AOn" ? '#4f7529' : '#8f1414', value.Environment)}} - {{:helper.string('{1}{2} | ', value.CellStatus == "F" ? '#4f7529' : value.CellStatus == "C" ? '#cd6500' : '#8f1414', value.CellStatus == "M" ? 'No Cell' : value.CellPct + '%', value.CellStatus == "M" ? '' : ' (' + value.CellStatus + ')')}} -{{:value.Load}}W | -
| Area | Equip. | Lighting | Environ. | Cell | Load |
|---|---|---|---|---|---|
| {{:value.Name}} | - {{:helper.string('{1} | ', value.Equipment == "On" || value.Equipment == "AOn" ? '#4f7529' : '#8f1414', value.Equipment)}} - {{:helper.string('{1} | ', value.Lights == "On" || value.Lights == "AOn" ? '#4f7529' : '#8f1414', value.Lights)}} - {{:helper.string('{1} | ', value.Environment == "On" || value.Environment == "AOn" ? '#4f7529' : '#8f1414', value.Environment)}} - {{:helper.string('{1}{2} | ', value.CellStatus == "F" ? '#4f7529' : value.CellStatus == "C" ? '#cd6500' : '#8f1414', value.CellStatus == "M" ? 'No Cell' : value.CellPct + '%', value.CellStatus == "M" ? '' : ' (' + value.CellStatus + ')')}} -{{:value.Load}}W | -
- {{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}} {{if itemValue.hijack_only}}(HIJACK AGENTS ONLY){{/if}}
- |
-