diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm
index 5a19c72742..5b6e55290e 100644
--- a/code/game/objects/items/devices/uplink.dm
+++ b/code/game/objects/items/devices/uplink.dm
@@ -1,13 +1,23 @@
GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
+// I placed this here because of how relevant it is.
+// You place this in your uplinkable item to check if an uplink is active or not.
+// If it is, it will display the uplink menu and return 1, else it'll return false.
+// If it returns true, I recommend closing the item's normal menu with "user << browse(null, "window=name")"
+/obj/item/proc/active_uplink_check(mob/user as mob)
+ // Activates the uplink if it's active
+ if(hidden_uplink)
+ if(hidden_uplink.active)
+ hidden_uplink.trigger(user)
+ return TRUE
+ return FALSE
+
/obj/item/device/uplink
var/welcome = "Welcome, Operative" // Welcoming menu message
var/uses // Numbers of crystals
var/list/ItemsCategory // 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
var/faction = "" //Antag faction holder.
var/list/purchase_log = new
@@ -17,9 +27,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
var/next_offer_time
var/datum/uplink_item/discount_item //The item to be discounted
var/discount_amount //The amount as a percent the item will be discounted by
-
-/obj/item/device/uplink/nano_host()
- return loc
+ var/compact_mode = FALSE
/obj/item/device/uplink/Initialize(var/mapload, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT)
. = ..()
@@ -53,23 +61,20 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
name = "hidden uplink"
desc = "There is something wrong if you're examining this."
var/active = 0
- var/datum/uplink_category/category = 0 // The current category we are in
var/exploit_id // Id of the current exploit record we are viewing
+ var/selected_cat
// The hidden uplink MUST be inside an obj/item's contents.
/obj/item/device/uplink/hidden/Initialize()
. = ..()
if(!isitem(loc))
return INITIALIZE_HINT_QDEL
- nanoui_data = list()
- update_nano_data()
/obj/item/device/uplink/hidden/next_offer()
discount_item = default_uplink_selection.get_random_item(INFINITY)
discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1)
- update_nano_data()
- SSnanoui.update_uis(src)
next_offer_time = world.time + offer_time
+ SStgui.update_uis(src)
addtimer(CALLBACK(src, .proc/next_offer), offer_time)
// Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated.
@@ -91,136 +96,137 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
return 1
return 0
-/*
- NANO UI FOR UPLINK WOOP WOOP
-*/
-/obj/item/device/uplink/hidden/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- var/title = "Remote Uplink"
- var/data[0]
- uses = user.mind.tcrystals
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- faction = H.antag_faction
+// Legacy
+/obj/item/device/uplink/hidden/interact(mob/user)
+ tgui_interact(user)
- data["welcome"] = welcome
- data["crystals"] = uses
- data["menu"] = nanoui_menu
- data += nanoui_data
+/*****************
+ * Uplink TGUI
+ *****************/
+/obj/item/device/uplink/tgui_host()
+ return loc
- // update the ui if it exists, returns null if no ui is passed/found
- ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui) // No auto-refresh
- ui = new(user, src, ui_key, "uplink.tmpl", title, 630, 700, state = inventory_state)
- data["menu"] = 0
- ui.set_initial_data(data)
+/obj/item/device/uplink/hidden/tgui_state(mob/user)
+ return GLOB.tgui_inventory_state
+
+/obj/item/device/uplink/hidden/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
+ if(!active)
+ toggle()
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "Uplink", "Remote Uplink")
+ // This UI is only ever opened by one person,
+ // and never is updated outside of user input.
+ ui.set_autoupdate(FALSE)
ui.open()
+/obj/item/device/uplink/hidden/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
+ if(!user.mind)
+ return
-// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button.
-/obj/item/device/uplink/hidden/interact(mob/user)
- ui_interact(user)
+ var/list/data = ..()
-/obj/item/device/uplink/hidden/CanUseTopic()
+ data["telecrystals"] = uses
+ data["lockable"] = TRUE
+ data["compactMode"] = compact_mode
+
+ data["discount_name"] = discount_item ? discount_item.name : ""
+ data["discount_amount"] = (1-discount_amount)*100
+ data["offer_expiry"] = worldtime2stationtime(next_offer_time)
+
+ data["exploit"] = null
+ data["locked_records"] = null
+
+ if(exploit_id)
+ for(var/datum/data/record/L in data_core.locked)
+ if(L.fields["id"] == exploit_id)
+ data["exploit"] = list() // Setting this to equal L.fields passes it's variables that are lists as reference instead of value.
+ // We trade off being able to automatically add shit for more control over what gets passed to json
+ // and if it's sanitized for html.
+ data["exploit"]["nanoui_exploit_record"] = html_encode(L.fields["exploit_record"]) // Change stuff into html
+ data["exploit"]["nanoui_exploit_record"] = replacetext(data["exploit"]["nanoui_exploit_record"], "\n", "
") // change line breaks into
+ data["exploit"]["name"] = html_encode(L.fields["name"])
+ data["exploit"]["sex"] = html_encode(L.fields["sex"])
+ data["exploit"]["age"] = html_encode(L.fields["age"])
+ data["exploit"]["species"] = html_encode(L.fields["species"])
+ data["exploit"]["rank"] = html_encode(L.fields["rank"])
+ data["exploit"]["home_system"] = html_encode(L.fields["home_system"])
+ data["exploit"]["citizenship"] = html_encode(L.fields["citizenship"])
+ data["exploit"]["faction"] = html_encode(L.fields["faction"])
+ data["exploit"]["religion"] = html_encode(L.fields["religion"])
+ data["exploit"]["fingerprint"] = html_encode(L.fields["fingerprint"])
+ if(L.fields["antagvis"] == ANTAG_KNOWN || (faction == L.fields["antagfac"] && (L.fields["antagvis"] == ANTAG_SHARED)))
+ data["exploit"]["antagfaction"] = html_encode(L.fields["antagfac"])
+ else
+ data["exploit"]["antagfaction"] = html_encode("None")
+ break
+ else
+ var/list/permanentData = list()
+ for(var/datum/data/record/L in sortRecord(data_core.locked))
+ permanentData.Add(list(list(
+ "name" = L.fields["name"],
+ "id" = L.fields["id"]
+ )))
+ data["locked_records"] = permanentData
+
+ return data
+
+/obj/item/device/uplink/hidden/tgui_static_data(mob/user)
+ var/list/data = ..()
+
+ data["categories"] = list()
+ for(var/datum/uplink_category/category in uplink.categories)
+ if(category.can_view(src))
+ var/list/cat = list(
+ "name" = category.name,
+ "items" = (category == selected_cat ? list() : null)
+ )
+ for(var/datum/uplink_item/item in category.items)
+ if(!item.can_view(src))
+ continue
+ var/cost = item.cost(uses, src) || "???"
+ cat["items"] += list(list(
+ "name" = item.name,
+ "cost" = cost,
+ "desc" = item.description(),
+ "ref" = REF(item),
+ ))
+ data["categories"] += list(cat)
+
+ return data
+
+/obj/item/device/uplink/hidden/tgui_status(mob/user, datum/tgui_state/state)
if(!active)
return STATUS_CLOSE
return ..()
-// The purchasing code.
-/obj/item/device/uplink/hidden/Topic(href, href_list)
+/obj/item/device/uplink/hidden/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
if(..())
- return 1
+ return TRUE
- var/mob/user = usr
- if(href_list["buy_item"])
- var/datum/uplink_item/UI = (locate(href_list["buy_item"]) in uplink.items)
- UI.buy(src, usr)
- else if(href_list["lock"])
- toggle()
- var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
- ui.close()
- else if(href_list["return"])
- nanoui_menu = round(nanoui_menu/10)
- else if(href_list["menu"])
- nanoui_menu = text2num(href_list["menu"])
- if(href_list["id"])
- exploit_id = href_list["id"]
- else if(href_list["category"])
- category = locate(href_list["category"]) in uplink.categories
-
- update_nano_data()
- return 1
-
-/obj/item/device/uplink/hidden/proc/update_nano_data()
- if(nanoui_menu == 0)
- var/categories[0]
- for(var/datum/uplink_category/category in uplink.categories)
- if(category.can_view(src))
- categories[++categories.len] = list("name" = category.name, "ref" = "\ref[category]")
- nanoui_data["categories"] = categories
- nanoui_data["discount_name"] = discount_item ? discount_item.name : ""
- nanoui_data["discount_amount"] = (1-discount_amount)*100
- nanoui_data["offer_expiry"] = worldtime2stationtime(next_offer_time)
-
- if(category)
- nanoui_data["current_category"] = category.name
- var/items[0]
- for(var/datum/uplink_item/item in category.items)
- if(item.can_view(src))
- var/cost = item.cost(uses, src)
- if(!cost) cost = "???"
- items[++items.len] = list("name" = item.name, "description" = replacetext(item.description(), "\n", "
"), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]")
- nanoui_data["items"] = items
-
- else if(nanoui_menu == 2)
- var/permanentData[0]
- for(var/datum/data/record/L in sortRecord(data_core.locked))
- permanentData[++permanentData.len] = list(Name = L.fields["name"],"id" = L.fields["id"])
- nanoui_data["exploit_records"] = permanentData
- else if(nanoui_menu == 21)
- nanoui_data["exploit_exists"] = 0
-
- for(var/datum/data/record/L in data_core.locked)
- if(L.fields["id"] == exploit_id)
- nanoui_data["exploit"] = list() // Setting this to equal L.fields passes it's variables that are lists as reference instead of value.
- // We trade off being able to automatically add shit for more control over what gets passed to json
- // and if it's sanitized for html.
- nanoui_data["exploit"]["nanoui_exploit_record"] = html_encode(L.fields["exploit_record"]) // Change stuff into html
- nanoui_data["exploit"]["nanoui_exploit_record"] = replacetext(nanoui_data["exploit"]["nanoui_exploit_record"], "\n", "
") // change line breaks into
- nanoui_data["exploit"]["name"] = html_encode(L.fields["name"])
- nanoui_data["exploit"]["sex"] = html_encode(L.fields["sex"])
- nanoui_data["exploit"]["age"] = html_encode(L.fields["age"])
- nanoui_data["exploit"]["species"] = html_encode(L.fields["species"])
- nanoui_data["exploit"]["rank"] = html_encode(L.fields["rank"])
- nanoui_data["exploit"]["home_system"] = html_encode(L.fields["home_system"])
- nanoui_data["exploit"]["citizenship"] = html_encode(L.fields["citizenship"])
- nanoui_data["exploit"]["faction"] = html_encode(L.fields["faction"])
- nanoui_data["exploit"]["religion"] = html_encode(L.fields["religion"])
- nanoui_data["exploit"]["fingerprint"] = html_encode(L.fields["fingerprint"])
- if(L.fields["antagvis"] == ANTAG_KNOWN || (faction == L.fields["antagfac"] && (L.fields["antagvis"] == ANTAG_SHARED)))
- nanoui_data["exploit"]["antagfaction"] = html_encode(L.fields["antagfac"])
- else
- nanoui_data["exploit"]["antagfaction"] = html_encode("None")
- nanoui_data["exploit_exists"] = 1
- break
-
-// I placed this here because of how relevant it is.
-// You place this in your uplinkable item to check if an uplink is active or not.
-// If it is, it will display the uplink menu and return 1, else it'll return false.
-// If it returns true, I recommend closing the item's normal menu with "user << browse(null, "window=name")"
-/obj/item/proc/active_uplink_check(mob/user as mob)
- // Activates the uplink if it's active
- if(src.hidden_uplink)
- if(src.hidden_uplink.active)
- src.hidden_uplink.trigger(user)
- return 1
- return 0
+ switch(action)
+ if("buy")
+ var/datum/uplink_item/UI = (locate(params["ref"]) in uplink.items)
+ UI.buy(src, usr)
+ return TRUE
+ if("lock")
+ toggle()
+ SStgui.close_uis(src)
+ if("select")
+ selected_cat = params["category"]
+ return TRUE
+ if("compact_toggle")
+ compact_mode = !compact_mode
+ return TRUE
+ if("view_exploits")
+ exploit_id = params["id"]
+ return TRUE
// PRESET UPLINKS
// A collection of preset uplinks.
//
// Includes normal radio uplink, multitool uplink,
// implant uplink (not the implant tool) and a preset headset uplink.
-
/obj/item/device/radio/uplink/New(atom/loc, datum/mind/target_mind, telecrystals)
..(loc)
hidden_uplink = new(src, target_mind, telecrystals)
diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl
deleted file mode 100644
index 0773883d70..0000000000
--- a/nano/templates/uplink.tmpl
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-{{:helper.syndicateMode()}}
-
-
-
-