diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 06c05d6a1be..c4fde9addf8 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -8,286 +8,122 @@ A list of items and costs is stored under the datum of every game mode, alongsid /obj/item/device/uplink var/welcome // Welcoming menu message - var/items // List of items - var/item_data // raw item text - var/list/ItemList // Parsed list of items var/uses // Numbers of crystals - var/nanoui_items[0] // List of items not to shove in their hands. - var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate) + var/list/purchase_log = list() + var/show_description = null + var/active = 0 + var/job = null /obj/item/device/uplink/New() + ..() welcome = ticker.mode.uplink_welcome - if(!item_data) - items = replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items - else - items = replacetext(item_data) - ItemList = text2list(src.items, ";") // Parsing the items text string uses = ticker.mode.uplink_uses - nanoui_items = generate_nanoui_items() - -/* - Built the Items List for use with NanoUI -*/ - -/obj/item/device/uplink/proc/generate_nanoui_items() - var/items_nano[0] - for(var/D in ItemList) - var/list/O = stringsplit(D, ":") - if(O.len != 3) //If it is not an actual item, make a break in the menu. - if(O.len == 1) //If there is one item, it's probably a title - items_nano[++items_nano.len] = list("Category" = "[O[1]]", "items" = list()) - continue - - var/path_text = O[1] - var/cost = text2num(O[2]) - - var/path_obj = text2path(path_text) - - // Because we're using strings, this comes up if item paths change. - // Failure to handle this error borks uplinks entirely. -Sayu - if(!path_obj) - error("Syndicate item is not a valid path: [path_text]") - else - var/itemname = O[3] - items_nano[items_nano.len]["items"] += list(list("Name" = itemname, "Cost" = cost, "obj_path" = path_text)) - - return items_nano - - - - //Let's build a menu! -/obj/item/device/uplink/proc/generate_menu() - +/obj/item/device/uplink/proc/generate_menu(mob/user as mob) + if(!job) + job = user.mind.assigned_role var/dat = "[src.welcome]
" - dat += "Tele-Crystals left: [src.uses]
" - dat += "
" - dat += "Request item:
" - dat += "Each item costs a number of tele-crystals as indicated by the number following their name.

" - var/cost - var/item - var/name - var/path_obj - var/path_text - var/category_items = 1 //To prevent stupid :P + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\objects\items\devices\uplinks.dm:26: dat += "Tele-Crystals left: [src.uses]
" + dat += {"Tele-Crystals left: [src.uses]
+
+ Request item:
+ Each item costs a number of tele-crystals as indicated by the number following their name.

"} + // END AUTOFIX + var/list/buyable_items = get_uplink_items() - for(var/D in ItemList) - var/list/O = stringsplit(D, ":") - if(O.len != 3) //If it is not an actual item, make a break in the menu. - if(O.len == 1) //If there is one item, it's probably a title - dat += "[O[1]]
" - category_items = 0 - else //Else, it's a white space. - if(category_items < 1) //If there were no itens in the last category... - dat += "We apologize, as you could not afford anything from this category.
" - dat += "
" - continue + // Loop through categories + var/index = 0 + for(var/category in buyable_items) - path_text = O[1] - cost = text2num(O[2]) + index++ + dat += "[category]
" - if(cost>uses) - continue + var/i = 0 - path_obj = text2path(path_text) + // Loop through items in category + for(var/datum/uplink_item/item in buyable_items[category]) + i++ - // Because we're using strings, this comes up if item paths change. - // Failure to handle this error borks uplinks entirely. -Sayu - if(!path_obj) - error("Syndicate item is not a valid path: [path_text]") - else - item = new path_obj() - name = O[3] - del item + var/cost_text = "" + var/desc = "[item.desc]" + if(item.job && item.job.len) + if(!(item.job.Find(job))) + //world.log << "Skipping job item that doesn't match" + continue + else + //world.log << "Found matching job item" + if(item.cost > 0) + cost_text = "([item.cost])" + if(item.cost <= uses) + dat += "[item.name] [cost_text] " + else + dat += "[item.name] [cost_text] " + if(item.desc) + if(show_description == 2) + dat += "\[-\]
[desc]" + else + dat += "\[?\]" + dat += "
" - dat += "[name] ([cost])
" - category_items++ + // Break up the categories, if it isn't the last. + if(buyable_items.len != index) + dat += "
" - dat += "Random Item (??)
" dat += "
" return dat -//If 'random' was selected -/obj/item/device/uplink/proc/chooseRandomItem() - var/list/randomItems = list() +// 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/interact(mob/user as mob) - //Sorry for all the ifs, but it makes it 1000 times easier for other people/servers to add or remove items from this list - //Add only items the player can afford: - if(uses > 19) - randomItems.Add("/obj/item/weapon/circuitboard/teleporter") //Teleporter Circuit Board (costs 20, for nuke ops) + var/dat = "" + dat += src.generate_menu(user) - if(uses > 9) - randomItems.Add("/obj/item/toy/syndicateballoon")//Syndicate Balloon - randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/imp_uplink") //Uplink Implanter - randomItems.Add("/obj/item/weapon/storage/box/syndicate") //Syndicate bundle + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\objects\items\devices\uplinks.dm:72: dat += "Lock" + dat += {"Lock + "} + // END AUTOFIX + user << browse(dat, "window=hidden") + onclose(user, "hidden") + return - //if(uses > 8) //Nothing... yet. - //if(uses > 7) //Nothing... yet. - - if(uses > 6) - randomItems.Add("/obj/item/weapon/aiModule/syndicate") //Hacked AI Upload Module - randomItems.Add("/obj/item/device/radio/beacon/syndicate") //Singularity Beacon - - if(uses > 5) - randomItems.Add("/obj/item/weapon/gun/projectile") //Revolver - - if(uses > 4) - randomItems.Add("/obj/item/weapon/gun/energy/crossbow") //Energy Crossbow - randomItems.Add("/obj/item/device/powersink") //Powersink - - if(uses > 3) - randomItems.Add("/obj/item/weapon/melee/energy/sword") //Energy Sword - randomItems.Add("/obj/item/clothing/mask/gas/voice") //Voice Changer - randomItems.Add("/obj/item/device/chameleon") //Chameleon Projector - - if(uses > 2) - randomItems.Add("/obj/item/weapon/storage/box/emps") //EMP Grenades - randomItems.Add("/obj/item/weapon/pen/paralysis") //Paralysis Pen - randomItems.Add("/obj/item/weapon/cartridge/syndicate") //Detomatix Cartridge - randomItems.Add("/obj/item/clothing/under/chameleon") //Chameleon Jumpsuit - randomItems.Add("/obj/item/weapon/card/id/syndicate") //Agent ID Card - randomItems.Add("/obj/item/weapon/card/emag") //Cryptographic Sequencer - randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/space") //Syndicate Space Suit - randomItems.Add("/obj/item/device/encryptionkey/binary") //Binary Translator Key - randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/imp_freedom") //Freedom Implant - randomItems.Add("/obj/item/clothing/glasses/thermal/syndi") //Thermal Imaging Goggles - - if(uses > 1) -/* - var/list/usrItems = usr.get_contents() //Checks to see if the user has a revolver before giving ammo - var/hasRevolver = 0 - for(var/obj/I in usrItems) //Only add revolver ammo if the user has a gun that can shoot it - if(istype(I,/obj/item/weapon/gun/projectile)) - hasRevolver = 1 - - if(hasRevolver) randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo -*/ - randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo - randomItems.Add("/obj/item/clothing/shoes/syndigaloshes") //No-Slip Syndicate Shoes - randomItems.Add("/obj/item/weapon/plastique") //C4 - - if(uses > 0) - randomItems.Add("/obj/item/weapon/soap/syndie") //Syndicate Soap - randomItems.Add("/obj/item/weapon/storage/toolbox/syndicate") //Syndicate Toolbox - - if(!randomItems.len) - del(randomItems) - return 0 - else - var/buyItem = pick(randomItems) - - switch(buyItem) //Ok, this gets a little messy, sorry. - if("/obj/item/weapon/circuitboard/teleporter") - uses -= 20 - if("/obj/item/toy/syndicateballoon" , "/obj/item/weapon/storage/box/syndie_kit/imp_uplink" , "/obj/item/weapon/storage/box/syndicate") - uses -= 10 - if("/obj/item/weapon/aiModule/syndicate" , "/obj/item/device/radio/beacon/syndicate") - uses -= 7 - if("/obj/item/weapon/gun/projectile") - uses -= 6 - if("/obj/item/weapon/gun/energy/crossbow" , "/obj/item/device/powersink") - uses -= 5 - if("/obj/item/weapon/melee/energy/sword" , "/obj/item/clothing/mask/gas/voice" , "/obj/item/device/chameleon") - uses -= 4 - if("/obj/item/weapon/storage/box/emps" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \ - "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/box/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \ - "/obj/item/weapon/storage/box/syndie_kit/imp_freedom" , "/obj/item/clothing/glasses/thermal/syndi") - uses -= 3 - if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique", "/obj/item/weapon/card/id/syndicate") - uses -= 2 - if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate") - uses -= 1 - del(randomItems) - return buyItem - -/obj/item/device/uplink/proc/handleStatTracking(var/boughtItem) -//For stat tracking, sorry for making it so ugly - if(!boughtItem) return - - switch(boughtItem) - if("/obj/item/weapon/circuitboard/teleporter") - feedback_add_details("traitor_uplink_items_bought","TP") - if("/obj/item/toy/syndicateballoon") - feedback_add_details("traitor_uplink_items_bought","BS") - if("/obj/item/weapon/storage/box/syndie_kit/imp_uplink") - feedback_add_details("traitor_uplink_items_bought","UI") - if("/obj/item/weapon/storage/box/syndicate") - feedback_add_details("traitor_uplink_items_bought","BU") - if("/obj/item/weapon/aiModule/syndicate") - feedback_add_details("traitor_uplink_items_bought","AI") - if("/obj/item/device/radio/beacon/syndicate") - feedback_add_details("traitor_uplink_items_bought","SB") - if("/obj/item/weapon/gun/projectile") - feedback_add_details("traitor_uplink_items_bought","RE") - if("/obj/item/weapon/gun/energy/crossbow") - feedback_add_details("traitor_uplink_items_bought","XB") - if("/obj/item/device/powersink") - feedback_add_details("traitor_uplink_items_bought","PS") - if("/obj/item/weapon/melee/energy/sword") - feedback_add_details("traitor_uplink_items_bought","ES") - if("/obj/item/clothing/mask/gas/voice") - feedback_add_details("traitor_uplink_items_bought","VC") - if("/obj/item/device/chameleon") - feedback_add_details("traitor_uplink_items_bought","CP") - if("/obj/item/weapon/storage/box/emps") - feedback_add_details("traitor_uplink_items_bought","EM") - if("/obj/item/weapon/pen/paralysis") - feedback_add_details("traitor_uplink_items_bought","PP") - if("/obj/item/weapon/cartridge/syndicate") - feedback_add_details("traitor_uplink_items_bought","DC") - if("/obj/item/clothing/under/chameleon") - feedback_add_details("traitor_uplink_items_bought","CJ") - if("/obj/item/weapon/card/id/syndicate") - feedback_add_details("traitor_uplink_items_bought","AC") - if("/obj/item/weapon/card/emag") - feedback_add_details("traitor_uplink_items_bought","EC") - if("/obj/item/weapon/storage/box/syndie_kit/space") - feedback_add_details("traitor_uplink_items_bought","SS") - if("/obj/item/device/encryptionkey/binary") - feedback_add_details("traitor_uplink_items_bought","BT") - if("/obj/item/weapon/storage/box/syndie_kit/imp_freedom") - feedback_add_details("traitor_uplink_items_bought","FI") - if("/obj/item/clothing/glasses/thermal/syndi") - feedback_add_details("traitor_uplink_items_bought","TM") - if("/obj/item/ammo_magazine/a357") - feedback_add_details("traitor_uplink_items_bought","RA") - if("/obj/item/clothing/shoes/syndigaloshes") - feedback_add_details("traitor_uplink_items_bought","SH") - if("/obj/item/weapon/plastique") - feedback_add_details("traitor_uplink_items_bought","C4") - if("/obj/item/weapon/soap/syndie") - feedback_add_details("traitor_uplink_items_bought","SP") - if("/obj/item/weapon/storage/toolbox/syndicate") - feedback_add_details("traitor_uplink_items_bought","ST") /obj/item/device/uplink/Topic(href, href_list) + ..() + if(!active) + return + if (href_list["buy_item"]) - if(href_list["buy_item"] == "random") - var/boughtItem = chooseRandomItem() - if(boughtItem) - href_list["buy_item"] = boughtItem - feedback_add_details("traitor_uplink_items_bought","RN") - return 1 + var/item = href_list["buy_item"] + var/list/split = stringsplit(item, ":") // throw away variable + + if(split.len == 2) + // Collect category and number + var/category = split[1] + var/number = text2num(split[2]) + + var/list/buyable_items = get_uplink_items() + + var/list/uplink = buyable_items[category] + if(uplink && uplink.len >= number) + var/datum/uplink_item/I = uplink[number] + if(I) + I.buy(src, usr) else - return 0 - - else - if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item - return 0 - - //if(usr:mind && ticker.mode.traitors[usr:mind]) - //var/datum/traitorinfo/info = ticker.mode.traitors[usr:mind] - //info.spawnlist += href_list["buy_item"] - - uses -= text2num(href_list["cost"]) - handleStatTracking(href_list["buy_item"]) //Note: chooseRandomItem handles it's own stat tracking. This proc is not meant for 'random'. - return 1 - + var/text = "[key_name(usr)] tried to purchase an uplink item that doesn't exist" + var/textalt = "[key_name(usr)] tried to purchase an uplink item that doesn't exist [item]" + message_admins(text) + log_game(textalt) + admin_log.Add(textalt) + else if(href_list["show_desc"]) + show_description = text2num(href_list["show_desc"]) + interact(usr) // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -304,15 +140,13 @@ A list of items and costs is stored under the datum of every game mode, alongsid /obj/item/device/uplink/hidden name = "Hidden Uplink." desc = "There is something wrong if you're examining this." - var/active = 0 - var/list/purchase_log = list() -// The hidden uplink MUST be inside an obj/item's contents. -/obj/item/device/uplink/hidden/New() - spawn(2) - if(!istype(src.loc, /obj/item)) - del(src) +/obj/item/device/uplink/hidden/Topic(href, href_list) ..() + if(href_list["lock"]) + toggle() + usr << browse(null, "window=hidden") + return 1 // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() @@ -333,60 +167,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid return 1 return 0 -/* - NANO UI FOR UPLINK WOOP WOOP -*/ -/obj/item/device/uplink/hidden/ui_interact(mob/user, ui_key = "main") - var/title = "Syndicate Uplink" - var/data[0] - - data["crystals"] = uses - data["nano_items"] = nanoui_items - data["welcome"] = welcome - - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key) - if (!ui) - // the ui does not exist, so we'll create a new one - ui = new(user, src, ui_key, "uplink.tmpl", title, 450, 600) - // When the UI is first opened this is the data it will use - ui.set_initial_data(data) - ui.open() - else - // The UI is already open so push the new data to it - ui.push_data(data) - 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) - -// The purchasing code. -/obj/item/device/uplink/hidden/Topic(href, href_list) - if (usr.stat || usr.restrained()) - return - - if (!( istype(usr, /mob/living/carbon/human))) - return 0 - var/mob/user = usr - var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main") - if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf)))) - usr.set_machine(src) - if(href_list["lock"]) - toggle() - ui.close() - return 1 - - if(..(href, href_list) == 1) - var/path_obj = text2path(href_list["buy_item"]) - var/obj/I = new path_obj(get_turf(usr)) - if(ishuman(usr)) - var/mob/living/carbon/human/A = usr - A.put_in_any_hand_if_possible(I) - purchase_log += "[usr] ([usr.ckey]) bought [I]." - interact(usr) - return 1 - // 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. @@ -427,6 +207,3 @@ A list of items and costs is stored under the datum of every game mode, alongsid ..() hidden_uplink = new(src) hidden_uplink.uses = 10 - - -