diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 4bd110015a9..b254f09f105 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -299,14 +299,11 @@ datum/mind
istype(current,/mob/living/carbon/human) )
text = "Uplink: give"
- var/obj/item/device/uplink/suplink = find_syndicate_uplink()
- var/obj/item/device/uplink/iuplink = find_integrated_uplink()
+ var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink()
var/crystals
if (suplink)
crystals = suplink.uses
- else if (iuplink)
- crystals = iuplink.uses
- if (suplink || iuplink)
+ if (suplink)
text += "|take"
if (usr.client.holder.level >= 3)
text += ", [crystals] crystals"
@@ -847,19 +844,14 @@ datum/mind
memory = null//Remove any memory they may have had.
if("crystals")
if (usr.client.holder.level >= 3)
- var/obj/item/device/uplink/suplink = find_syndicate_uplink()
- var/obj/item/device/uplink/iuplink = find_integrated_uplink()
+ var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink()
var/crystals
if (suplink)
crystals = suplink.uses
- else if (iuplink)
- crystals = iuplink.uses
crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num
if (!isnull(crystals))
if (suplink)
suplink.uses = crystals
- else if(iuplink)
- iuplink.uses = crystals
if("uplink")
if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
usr << "\red Equipping a syndicate failed!"
@@ -905,50 +897,17 @@ datum/mind
*/
proc/find_syndicate_uplink()
- var/obj/item/device/uplink/radio/uplink = null
var/list/L = current.get_contents()
- for (var/obj/item/device/radio/radio in L)
- uplink = radio.traitorradio
- if (uplink)
- return uplink
- uplink = locate() in L
- return uplink
+ for (var/obj/item/I in L)
+ if (I.hidden_uplink)
+ return I.hidden_uplink
+ return null
- proc/find_integrated_uplink()
- //world << "DEBUG: find_integrated_uplink()"
- var/obj/item/device/uplink/uplink = null
- var/list/L = current.get_contents()
- for (var/obj/item/device/pda/pda in L)
- uplink = pda.uplink
- if (uplink)
- return uplink
- return uplink
+ proc/take_uplink()
+ var/obj/item/device/uplink/hidden/H = find_syndicate_uplink()
+ if(H)
+ del(H)
- proc/take_uplink() //assuming only one uplink because I am tired of all this uplink shit --rastaf0
- var/list/L = current.get_contents()
- var/obj/item/device/uplink/radio/suplink = null
- var/obj/item/device/uplink/pda/iuplink = null
- for (var/obj/item/device/radio/radio in L)
- suplink = radio.traitorradio
- if (suplink)
- break
- if (!suplink)
- suplink = locate() in L
-
- for (var/obj/item/device/pda/pda in L)
- iuplink = pda.uplink
- if (iuplink)
- break
- if (!iuplink)
- iuplink = locate() in L
-
- if (iuplink)
- iuplink.shutdown_uplink()
- del(iuplink)
- else if (suplink)
- suplink.shutdown_uplink()
- del(suplink)
- return
proc/make_AI_Malf()
if(!(src in ticker.mode.malf_ai))
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index e79c82909f3..e4c787b0c11 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -332,10 +332,12 @@
var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N
var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
var/list/allowed = null //suit storage stuff.
+ var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
//the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't.
//If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen.
//Set disable_warning to 1 if you wish it to not give you outputs.
+
/obj/item/proc/mob_can_equip(M as mob, slot, disable_warning = 0)
if(!slot) return 0
if(!M) return 0
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 230d479758e..b45c7eaaff0 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -221,55 +221,17 @@
// find a radio! toolbox(es), backpack, belt, headset
var/loc = ""
- var/obj/item/device/R = null //Hide the uplink in a PDA if available, otherwise radio
- if (!R && istype(traitor_mob.belt, /obj/item/device/pda))
- R = traitor_mob.belt
- loc = "on your belt"
- if (!R && istype(traitor_mob.wear_id, /obj/item/device/pda))
- R = traitor_mob.wear_id
- loc = "on your jumpsuit"
- if (!R && istype(traitor_mob.wear_id, /obj/item/device/pda))
- R = traitor_mob.wear_id
- loc = "on your jumpsuit"
- if (!R && istype(traitor_mob.l_hand, /obj/item/weapon/storage))
- var/obj/item/weapon/storage/S = traitor_mob.l_hand
- var/list/L = S.return_inv()
- for (var/obj/item/device/radio/foo in L)
- R = foo
- loc = "in the [S.name] in your left hand"
- break
- if (!R && istype(traitor_mob.r_hand, /obj/item/weapon/storage))
- var/obj/item/weapon/storage/S = traitor_mob.r_hand
- var/list/L = S.return_inv()
- for (var/obj/item/device/radio/foo in L)
- R = foo
- loc = "in the [S.name] in your right hand"
- break
- if (!R && istype(traitor_mob.back, /obj/item/weapon/storage))
- var/obj/item/weapon/storage/S = traitor_mob.back
- var/list/L = S.return_inv()
- for (var/obj/item/device/radio/foo in L)
- R = foo
- loc = "in the [S.name] on your back"
- break
- if (!R && istype(traitor_mob.l_store, /obj/item/device/pda))
- R = traitor_mob.l_store
- loc = "in your pocket"
- if (!R && istype(traitor_mob.r_store, /obj/item/device/pda))
- R = traitor_mob.r_store
- loc = "in your pocket"
- if (!R && traitor_mob.w_uniform && istype(traitor_mob.belt, /obj/item/device/radio))
- R = traitor_mob.belt
- loc = "on your belt"
- if ((!R && istype(traitor_mob.ears, /obj/item/device/radio)) || prob(10))
- R = traitor_mob.ears
- loc = "on your head"
+ var/obj/item/R = locate(/obj/item/device/pda) in traitor_mob.contents //Hide the uplink in a PDA if available, otherwise radio
+ if(!R)
+ R = locate(/obj/item/device/radio) in traitor_mob.contents
+
if (!R)
traitor_mob << "Unfortunately, the Syndicate wasn't able to get you a radio."
. = 0
else
if (istype(R, /obj/item/device/radio))
// generate list of radio freqs
+ var/obj/item/device/radio/target_radio = R
var/freq = 1441
var/list/freqlist = list()
while (freq <= 1489)
@@ -280,22 +242,20 @@
freq += 1
freq = freqlist[rand(1, freqlist.len)]
- var/obj/item/device/uplink/radio/T = new /obj/item/device/uplink/radio(R)
- R:traitorradio = T
- R:traitor_frequency = freq
- T.name = R.name
- T.icon_state = R.icon_state
- T.origradio = R
+ var/obj/item/device/uplink/hidden/T = new(R)
+ target_radio.hidden_uplink = T
+ target_radio.traitor_frequency = freq
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [loc]).")
else if (istype(R, /obj/item/device/pda))
// generate a passcode if the uplink is hidden in a PDA
var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
- var/obj/item/device/uplink/pda/T = new /obj/item/device/uplink/pda(R)
- R:uplink = T
- T.lock_code = pda_pass
- T.hostpda = R
+ var/obj/item/device/uplink/hidden/T = new(R)
+ R.hidden_uplink = T
+ var/obj/item/device/pda/P = R
+ P.lock_code = pda_pass
+
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
traitor_mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [loc]).")
//Begin code phrase.
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index aee8875eae4..95d0f342e87 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -129,6 +129,7 @@
verb
move_eject()
+ set category = "Object"
set src in oview(1)
if (usr.stat != 0)
return
@@ -137,6 +138,7 @@
return
move_inside()
+ set category = "Object"
set src in oview(1)
if (usr.stat == 2)
//Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
diff --git a/code/game/objects/closets/nuclear.dm b/code/game/objects/closets/nuclear.dm
index cbe8b8ebd1c..ae1720bfbee 100644
--- a/code/game/objects/closets/nuclear.dm
+++ b/code/game/objects/closets/nuclear.dm
@@ -19,6 +19,6 @@
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/device/pda/syndicate(src)
- var/obj/item/device/uplink/radio/U = new /obj/item/device/uplink/radio(src)
- U.uses = 40
+ var/obj/item/device/radio/uplink/U = new(src)
+ U.hidden_uplink.uses = 40
return
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 60a874e5c7b..ddcb3678a6d 100644
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -30,6 +30,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/last_text //No text spamming
var/last_honk //Also no honk spamming that's bad too
var/ttone = "beep" //The ringtone!
+ var/lock_code = "" // Lockcode to unlock uplink
var/honkamt = 0 //How many honks left when infected with honk.exe
var/mimeamt = 0 //How many silence left when infected with mime.exe
var/note = "Congratulations, your station has chosen the Thinktronic 5230 Personal Data Assistant!" //Current note in the notepad function
@@ -37,8 +38,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/cart = "" //A place to stick cartridge menu information
var/detonate = 1 // Can the PDA be blown up?
- var/obj/item/device/uplink/pda/uplink = null
-
var/obj/item/weapon/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
var/ownjob = null //related to above
@@ -236,6 +235,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
user.machine = src
+ if(active_uplink_check(user))
+ return
+
var/dat = "
Personal Data Assistant"
dat += "
Close"
@@ -330,10 +332,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (1)
dat += "
Notekeeper V2.1
"
- if ((!isnull(uplink)) && uplink.active)
- dat += " Lock
"
- else
- dat += " Edit
"
+ dat += " Edit
"
dat += note
if (2)
@@ -552,13 +551,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/t = input(U, "Please enter new ringtone", name, ttone) as text
if (in_range(src, U) && loc == U)
if (t)
- if ((uplink) && (cmptext(t,uplink.lock_code)))
- if(uplink.active)
- U << "The PDA uplink is already unlocked."
- mode = 1
- else
- U << "The PDA softly beeps."
- uplink.unlock()
+ if(src.hidden_uplink && hidden_uplink.check_trigger(U, t, lock_code))
+ U << "The PDA softly beeps."
+ U << browse(null, "window=pda")
else
t = copytext(sanitize(t), 1, 20)
ttone = t
@@ -610,11 +605,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
spawn(0)
M.close()
- if("Lock")
- if(uplink)
- uplink.active = 0
- note = uplink.orignote
- mode = 0 // To stop people metagaming that PDAs on the note screen means it is an uplink PDA.
+
if("Detonate")//Detonate PDA
if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
var/obj/item/device/pda/P = locate(href_list["target"])
@@ -634,7 +625,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
difficulty += 2
- if ((prob(difficulty * 12)) || (P.uplink))
+ if ((prob(difficulty * 12)) || (P.hidden_uplink))
U.show_message("\red An error flashes on your [src].", 1)
else if (prob(difficulty * 3))
U.show_message("\red Energy feeds back into your [src]!", 1)
@@ -980,10 +971,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
user << "\blue No significant chemical agents found in [A]."
if (!scanmode && istype(A, /obj/item/weapon/paper) && owner)
- if ((!isnull(uplink)) && (uplink.active))
- uplink.orignote = A:info
- else
- note = A:info
+ note = A:info
user << "\blue Paper scanned." //concept of scanning paper copyright brainoblivion 2009
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 3f80a108b7d..de4773218f0 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -39,34 +39,6 @@
-/obj/item/weapon/implant/uplink
- name = "uplink"
- desc = "Summon things."
- var/activation_emote = "chuckle"
- var/obj/item/device/uplink/radio/uplink = null
-
-
- New()
- activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- uplink = new /obj/item/device/uplink/radio/implanted(src)
- ..()
- return
-
-
- implanted(mob/source)
- activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
- source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- return 1
-
-
- trigger(emote, mob/source as mob)
- if(emote == activation_emote)
- uplink.attack_self(source)
- return
-
-
-
/obj/item/weapon/implant/tracking
name = "tracking"
desc = "Track with this."
diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm
index 4b3421d71e4..21af3526715 100644
--- a/code/game/objects/radio/radio.dm
+++ b/code/game/objects/radio/radio.dm
@@ -15,7 +15,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/traitor_frequency = 0 //tune to frequency to unlock traitor supplies
var/canhear_range = 3 // the range which mobs can hear this radio from
var/obj/item/device/radio/patch_link = null
- var/obj/item/device/uplink/traitorradio = null
var/wires = WIRE_SIGNAL | WIRE_RECEIVE | WIRE_TRANSMIT
var/b_stat = 0
var/broadcasting = 0
@@ -79,6 +78,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(!on)
return
+ if(active_uplink_check(user))
+ return
+
var/dat = "[src]"
if(!istype(src, /obj/item/device/radio/headset)) //Headsets dont get a mic button
@@ -157,23 +159,11 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if (!freerange || (frequency < 1200 || frequency > 1600))
new_frequency = sanitize_frequency(new_frequency, maxf)
set_frequency(new_frequency)
+ if(hidden_uplink)
+ if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency))
+ usr << browse(null, "window=radio")
+ return
- if (traitor_frequency && frequency == traitor_frequency)
- usr.machine = null
- usr << browse(null, "window=radio")
- // now transform the regular radio, into a (disguised)syndicate uplink!
- var/obj/item/device/uplink/radio/T = traitorradio
- var/obj/item/device/radio/R = src
-
- usr.u_equip(R)
- R.loc = T
- if(usr.r_hand == R)
- usr.put_in_r_hand(T)
- else
- usr.put_in_l_hand(T)
-
- T.attack_self(usr)
- return
else if (href_list["talk"])
broadcasting = text2num(href_list["talk"])
else if (href_list["listen"])
@@ -244,7 +234,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if (!connection)
return
-
+ var/turf/position = get_turf(src)
//#### Tagging the signal with all appropriate identity values ####//
@@ -328,24 +318,19 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"traffic" = 0, // dictates the total traffic sum that the signal went through
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
- "reject" = 0 // if nonzero, the signal will not be accepted by any broadcasting machinery
+ "reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
+ "level" = position.z // The source's z level
)
signal.frequency = connection.frequency // Quick frequency set
//#### Sending the signal to all subspace receivers ####//
- var/turf/position = get_turf(src)
-
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
- var/turf/receiver_turf = get_turf(R)
- if(position.z == receiver_turf.z)
- R.receive_signal(signal)
+ R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
- var/turf/receiver_turf = get_turf(R)
- if(position.z == receiver_turf.z)
- R.receive_signal(signal)
+ R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
return
@@ -386,16 +371,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"traffic" = 0,
"type" = 0,
"server" = null,
- "reject" = 0
+ "reject" = 0,
+ "level" = position.z
)
signal.frequency = connection.frequency // Quick frequency set
- var/turf/position = get_turf(src)
-
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
- var/turf/receiver_turf = get_turf(R)
- if(position.z == receiver_turf.z)
- R.receive_signal(signal)
+ R.receive_signal(signal)
sleep(rand(10,25)) // wait a little...
diff --git a/code/game/objects/uplinks.dm b/code/game/objects/uplinks.dm
index 88859f82936..40d2cd2e599 100644
--- a/code/game/objects/uplinks.dm
+++ b/code/game/objects/uplinks.dm
@@ -19,7 +19,6 @@ 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/menu_message = "" // The actual menu text
var/items // List of items
var/item_data // raw item text
var/list/ItemList // Parsed list of items
@@ -27,520 +26,384 @@ A list of items and costs is stored under the datum of every game mode, alongsid
// List of items not to shove in their hands.
var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate)
- New()
- welcome = ticker.mode.uplink_welcome
- if(!item_data)
- items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items
- else
- items = dd_replacetext(item_data)
- ItemList = dd_text2list(src.items, ";") // Parsing the items text string
- uses = ticker.mode.uplink_uses
+/obj/item/device/uplink/New()
+ welcome = ticker.mode.uplink_welcome
+ if(!item_data)
+ items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items
+ else
+ items = dd_replacetext(item_data)
+ ItemList = dd_text2list(src.items, ";") // Parsing the items text string
+ uses = ticker.mode.uplink_uses
//Let's build a menu!
- proc/generate_menu()
- src.menu_message = "[src.welcome]
"
- src.menu_message += "Tele-Crystals left: [src.uses]
"
- src.menu_message += "
"
- src.menu_message += "Request item:
"
- src.menu_message += "Each item costs a number of tele-crystals as indicated by the number following their name.
"
+/obj/item/device/uplink/proc/generate_menu()
- var/cost
- var/item
- var/name
- var/path_obj
- var/path_text
- var/category_items = 1 //To prevent stupid :P
+ 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.
"
- 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
- src.menu_message += "[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...
- src.menu_message += "We apologize, as you could not afford anything from this category.
"
- src.menu_message += "
"
- continue
+ var/cost
+ var/item
+ var/name
+ var/path_obj
+ var/path_text
+ var/category_items = 1 //To prevent stupid :P
- path_text = O[1]
- cost = text2num(O[2])
+ 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
- if(cost>uses)
- continue
+ path_text = O[1]
+ cost = text2num(O[2])
- path_obj = text2path(path_text)
- item = new path_obj()
- name = O[3]
- del item
+ if(cost>uses)
+ continue
- src.menu_message += "[name] ([cost])
"
- category_items++
+ path_obj = text2path(path_text)
+ item = new path_obj()
+ name = O[3]
+ del item
- src.menu_message += "Random Item (??)
"
- src.menu_message += "
"
- return
+ dat += "[name] ([cost])
"
+ category_items++
+
+ dat += "Random Item (??)
"
+ dat += "
"
+ return dat
//If 'random' was selected
- proc/chooseRandomItem()
- var/list/randomItems = list()
+/obj/item/device/uplink/proc/chooseRandomItem()
+ var/list/randomItems = list()
- //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)
+ //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)
- if(uses > 9)
- randomItems.Add("/obj/item/toy/syndicateballoon")//Syndicate Balloon
- randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_uplink") //Uplink Implanter
- randomItems.Add("/obj/item/weapon/storage/box/syndicate") //Syndicate bundle
+ if(uses > 9)
+ randomItems.Add("/obj/item/toy/syndicateballoon")//Syndicate Balloon
+ randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_uplink") //Uplink Implanter
+ randomItems.Add("/obj/item/weapon/storage/box/syndicate") //Syndicate bundle
- //if(uses > 8) //Nothing... yet.
- //if(uses > 7) //Nothing... yet.
+ //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 > 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 > 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 > 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 > 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/emp_kit") //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/syndie_kit/space") //Syndicate Space Suit
- randomItems.Add("/obj/item/device/encryptionkey/binary") //Binary Translator Key
- randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_freedom") //Freedom Implant
- randomItems.Add("/obj/item/clothing/glasses/thermal/syndi") //Thermal Imaging Goggles
+ if(uses > 2)
+ randomItems.Add("/obj/item/weapon/storage/emp_kit") //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/syndie_kit/space") //Syndicate Space Suit
+ randomItems.Add("/obj/item/device/encryptionkey/binary") //Binary Translator Key
+ randomItems.Add("/obj/item/weapon/storage/syndie_kit/imp_freedom") //Freedom Implant
+ randomItems.Add("/obj/item/clothing/glasses/thermal/syndi") //Thermal Imaging Goggles
- if(uses > 1)
+ 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
+ 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
+ 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
+ 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(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)
+ 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/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/emp_kit" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \
- "/obj/item/weapon/card/id/syndicate" , "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \
- "/obj/item/weapon/storage/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")
- uses -= 2
- if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate")
- uses -= 1
- del(randomItems)
- return buyItem
-
- proc/handleStatTracking(var/boughtItem)
- //For stat tracking, sorry for making it so ugly
- if(!boughtItem) return
-
- switch(boughtItem)
+ switch(buyItem) //Ok, this gets a little messy, sorry.
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/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")
+ uses -= 20
+ if("/obj/item/toy/syndicateballoon" , "/obj/item/weapon/storage/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")
- 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/emp_kit")
- 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/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/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")
+ 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/emp_kit" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \
+ "/obj/item/weapon/card/id/syndicate" , "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \
+ "/obj/item/weapon/storage/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")
+ uses -= 2
+ if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate")
+ uses -= 1
+ del(randomItems)
+ return buyItem
- Topic(href, href_list)
- 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
- else
- return 0
+/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/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/emp_kit")
+ 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/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/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 (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
else
- if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item
- return 0
+ 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
-
-
-/*
- *PDA uplink
- */
-
-//Syndicate uplink hidden inside a traitor PDA
-//Communicate with traitor through the PDA's note function.
-
-/obj/item/device/uplink/pda
- name = "uplink module"
- desc = "An electronic uplink system of unknown origin."
- icon = 'icons/obj/module.dmi'
- icon_state = "power_mod"
- var/obj/item/device/pda/hostpda = null
-
- var/orignote = null //Restore original notes when locked.
- var/active = 0 //Are we currently active?
- var/lock_code = "" //The unlocking password.
-
- proc
- unlock()
- if ((isnull(src.hostpda)) || (src.active))
- return
-
- src.orignote = src.hostpda.note
- src.active = 1
- src.hostpda.mode = 1 //Switch right to the notes program
-
- src.generate_menu()
- print_to_host(menu_message)
-
- for (var/mob/M in viewers(1, src.hostpda.loc))
- if (M.client && M.machine == src.hostpda)
- src.hostpda.attack_self(M)
-
- return
-
- print_to_host(var/text)
- if (isnull(hostpda))
- return
- hostpda.note = text
-
- for (var/mob/M in viewers(1, hostpda.loc))
- if (M.client && M.machine == hostpda)
- hostpda.attack_self(M)
- return
-
- shutdown_uplink()
- if (isnull(src.hostpda))
- return
- active = 0
- hostpda.note = orignote
- if (hostpda.mode==1)
- hostpda.mode = 0
- hostpda.updateDialog()
- return
-
- attack_self(mob/user as mob)
- src.generate_menu()
- src.hostpda.note = src.menu_message
-
-
- Topic(href, href_list)
- if ((isnull(src.hostpda)) || (!src.active))
- return
-
- if (usr.stat || usr.restrained() || !in_range(src.hostpda, usr))
- return
-
- if(..() == 1) // We can afford the item
- var/path_obj = text2path(href_list["buy_item"])
- var/mob/A = src.hostpda.loc
- var/item = new path_obj(get_turf(src.hostpda))
- if(ismob(A) && !(locate(item) in NotInHand)) //&& !istype(item, /obj/spawner))
- if(!A.r_hand)
- item:loc = A
- A.r_hand = item
- item:layer = 20
- A.update_inv_r_hand()
- else if(!A.l_hand)
- item:loc = A
- A.l_hand = item
- item:layer = 20
- A.update_inv_l_hand()
- else
- item:loc = get_turf(A)
- // usr.client.onBought("[item:name]") When we have the stats again, uncomment.
- /* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind
- del item*/
- //HEADFINDBACK
- src.attack_self(usr)
- src.hostpda.attack_self(usr)
- return
-
-
-/*
- *Portable radio uplink
- */
-
-//A Syndicate uplink disguised as a portable radio
-/obj/item/device/uplink/radio/implanted
- New()
- ..()
- uses = 5
- return
-
- explode()
- var/obj/item/weapon/implant/uplink/U = src.loc
- var/mob/living/A = U.imp_in
- A.gib()
- ..()
-// var/turf/location = get_turf(src.loc)
-// if(location)
-// location.hotspot_expose(700,125)
-// explosion(location, 0, 0, 2, 4, 1)
-
-// var/obj/item/weapon/implant/uplink/U = src.loc
-// var/mob/living/A = U.imp_in
-// var/datum/organ/external/head = A:organs["head"]
-// head.destroyed = 1
-// spawn(2)
-// head.droplimb()
-// del(src.master)
-// del(src)
-// return
-
-
-/obj/item/device/uplink/radio
- name = "ship bounced radio"
- icon = 'icons/obj/radio.dmi'
- icon_state = "radio"
- var/temp = null //Temporary storage area for a message offering the option to destroy the radio
- var/selfdestruct = 0 //Set to 1 while the radio is self destructing itself.
- var/obj/item/device/radio/origradio = null
- flags = FPRINT | TABLEPASS | CONDUCT
- slot_flags = SLOT_BELT
- w_class = 2.0
- item_state = "radio"
- throwforce = 5
- throw_speed = 4
- throw_range = 20
- m_amt = 100
-
- attack_self(mob/user as mob)
- var/dat
-
- if (src.selfdestruct)
- dat = "Self Destructing..."
else
- if (src.temp)
- dat = "[src.temp]
Clear"
- else
- src.generate_menu()
- dat = src.menu_message
- if (src.origradio) // Checking because sometimes the radio uplink may be spawned by itself, not as a normal unlockable radio
- dat += "Lock
"
- dat += "
"
- dat += "Self-Destruct"
+ if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item
+ return 0
- user << browse(dat, "window=radio")
- onclose(user, "radio")
+ //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
+
+
+
+// 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!
+
+ 1. All obj/item 's have a hidden_uplink var. By default it's null. Give the item one with "new(src)", it must be in it's contents. Feel free to add "uses".
+
+ 2. Code in the triggers. Use check_trigger for this, I recommend closing the item's menu with "usr << browse(null, "window=windowname") if it returns true.
+ The var/value is the value that will be compared with the var/target. If they are equal it will activate the menu.
+
+ 3. If you want the menu to stay until the users locks his uplink, add an active_uplink_check(mob/user as mob) in your interact/attack_hand proc.
+ Then check if it's true, if true return. This will stop the normal menu appearing and will instead show the uplink menu.
+*/
+
+/obj/item/device/uplink/hidden
+ name = "Hidden Uplink."
+ desc = "There is something wrong if you're examining this."
+ var/active = 0
+
+// 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)
+ ..()
+
+// 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()
+ active = !active
+
+// Directly trigger the uplink. Turn on if it isn't already.
+/obj/item/device/uplink/hidden/proc/trigger(mob/user as mob)
+ if(!active)
+ toggle()
+ interact(user)
+
+// Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset.
+// If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the
+// current item's menu.
+/obj/item/device/uplink/hidden/proc/check_trigger(mob/user as mob, var/value, var/target)
+ if(value == target)
+ trigger(user)
+ return 1
+ return 0
+
+// 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/proc/interact(mob/user as mob)
+
+ var/dat = ""
+ dat += src.generate_menu()
+ dat += "Lock"
+ dat += ""
+ user << browse(dat, "window=hidden")
+ onclose(user, "hidden")
+ return
+
+// The purchasing code.
+/obj/item/device/uplink/hidden/Topic(href, href_list)
+
+ if (usr.stat || usr.restrained())
return
- Topic(href, href_list)
- if (usr.stat || usr.restrained())
- return
+ if (!( istype(usr, /mob/living/carbon/human)))
+ return 0
- if (!( istype(usr, /mob/living/carbon/human)))
+ if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf))))
+ usr.machine = src
+ if(href_list["lock"])
+ toggle()
+ usr << browse(null, "window=hidden")
return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)) || istype(src.loc,/obj/item/weapon/implant/uplink)))
- usr.machine = src
+ 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)
+ interact(usr)
+ return
- if(href_list["buy_item"])
- if(..() == 1) // We can afford the item
- var/path_obj = text2path(href_list["buy_item"])
- var/item = new path_obj(get_turf(src.loc))
- var/mob/A = src.loc
- if(istype(src.loc,/obj/item/weapon/implant/uplink))
- var/obj/item/weapon/implant/uplink/U = src.loc
- A = U.imp_in
- if(ismob(A) && !(locate(item) in NotInHand)) //&& !istype(item, /obj/spawner))
- if(!A.r_hand)
- item:loc = A
- A.r_hand = item
- A.update_inv_r_hand()
- item:layer = 20
- else if(!A.l_hand)
- item:loc = A
- A.l_hand = item
- A.update_inv_l_hand()
- item:layer = 20
- else
- item:loc = get_turf(A)
- /* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind
- del item*/
- // usr.client.onBought("[item:name]") When we have the stats again, uncomment.
- src.attack_self(usr)
- return
+// 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
- else if (href_list["lock"] && src.origradio)
- // presto chango, a regular radio again! (reset the freq too...)
- usr.machine = null
- usr << browse(null, "window=radio")
- var/obj/item/device/radio/T = src.origradio
- var/obj/item/device/uplink/radio/R = src
- R.loc = T
- T.loc = usr
- // R.layer = initial(R.layer)
- R.layer = 0
- if (usr.client)
- usr.client.screen -= R
- if (usr.r_hand == R)
- usr.u_equip(R)
- usr.r_hand = T
-// usr.update_inv_r_hand()
- else
- usr.u_equip(R)
- usr.l_hand = T
-// usr.update_inv_l_hand()
- R.loc = T
- T.layer = 20
- T.set_frequency(initial(T.frequency))
- T.attack_self(usr)
- return
+// PRESET UPLINKS
+// A collection of preset uplinks.
+//
+// Includes normal radio uplink, multitool uplink,
+// implant uplink (not the implant tool) and a preset headset uplink.
- else if (href_list["selfdestruct"])
- src.temp = "Self-Destruct"
+/obj/item/device/radio/uplink/New()
+ hidden_uplink = new(src)
- else if (href_list["selfdestruct2"])
- src.selfdestruct = 1
- spawn (100)
- explode()
- return
+/obj/item/device/radio/uplink/attack_self(mob/user as mob)
+ if(hidden_uplink)
+ hidden_uplink.trigger(user)
- else if (href_list["clear_selfdestruct"])
- src.temp = null
+/obj/item/device/multitool/uplink/New()
+ hidden_uplink = new(src)
- attack_self(usr)
-// if (istype(src.loc, /mob))
-// attack_self(src.loc)
-// else
-// for(var/mob/M in viewers(1, src))
-// if (M.client)
-// src.attack_self(M)
- return
+/obj/item/device/multitool/uplink/attack_self(mob/user as mob)
+ if(hidden_uplink)
+ hidden_uplink.trigger(user)
- proc/explode()
- var/turf/location = get_turf(src.loc)
- if(location)
- location.hotspot_expose(700,125)
- explosion(location, 0, 0, 2, 4, 1)
+/obj/item/weapon/implant/uplink
+ name = "uplink"
+ desc = "Summon things."
+ var/activation_emote = "chuckle"
+
+/obj/item/weapon/implant/uplink/New()
+ activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ hidden_uplink = new(src)
+ hidden_uplink.uses = 5
+ ..()
+ return
+
+// Moved the Uplink Implant here
+
+/obj/item/weapon/implant/uplink/implanted(mob/source)
+ activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
+ source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
+ return 1
+
+
+/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob)
+ if(hidden_uplink && usr == source) // Let's not have another people activate our uplink
+ hidden_uplink.check_trigger(source, emote, activation_emote)
+ return
+
+/obj/item/device/radio/headset/uplink
+ traitor_frequency = 1445
+
+/obj/item/device/radio/headset/uplink/New()
+ ..()
+ hidden_uplink = new(src)
+ hidden_uplink.uses = 10
- del(src.master)
- del(src)
- return
- proc/shutdown_uplink()
- if (!src.origradio)
- return
- var/list/nearby = viewers(1, src)
- for(var/mob/M in nearby)
- if (M.client && M.machine == src)
- M << browse(null, "window=radio")
- M.machine = null
- var/obj/item/device/radio/T = src.origradio
- var/obj/item/device/uplink/radio/R = src
- var/mob/L = src.loc
- R.loc = T
- T.loc = L
- // R.layer = initial(R.layer) //TODO: CARN
- R.layer = 0
- if (istype(L))
- if (L.client)
- L.client.screen -= R
- if (L.r_hand == R)
- L.u_equip(R)
- L.r_hand = T
- L.update_inv_r_hand()
- else
- L.u_equip(R)
- L.l_hand = T
- L.update_inv_l_hand()
- T.layer = 20
- T.set_frequency(initial(T.frequency))
- return
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d58ea1f4824..2b7e616e688 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -102,6 +102,13 @@
if(istype(W))
equip_to_slot_if_possible(W, slot)
+/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
+ if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
+ return 1
+ else if(equip_to_slot_if_possible(W, slot_r_hand, del_on_fail, disable_warning, redraw_mob))
+ return 1
+ return 0
+
//This is a SAFE proc. Use this instead of equip_to_splot()!
//set del_on_fail to have it delete W if it fails to equip
//set disable_warning to disable the 'you are unable to equip that' warning.
@@ -406,7 +413,7 @@ var/list/slot_equipment_priority = list( \
for (var/obj/item/weapon/disk/nuclear/D in world)
var/name = "Nuclear Disk"
- if (name in names)
+ if (names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -416,7 +423,7 @@ var/list/slot_equipment_priority = list( \
for (var/obj/machinery/singularity/S in world)
var/name = "Singularity"
- if (name in names)
+ if (names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -426,7 +433,7 @@ var/list/slot_equipment_priority = list( \
for (var/obj/machinery/bot/B in world)
var/name = "BOT: [B.name]"
- if (name in names)
+ if (names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -436,7 +443,7 @@ var/list/slot_equipment_priority = list( \
/*
for (var/mob/living/silicon/decoy/D in world)
var/name = "[D.name]"
- if (name in names)
+ if (names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -451,54 +458,35 @@ var/list/slot_equipment_priority = list( \
for(var/mob/M in sortAtom(mob_list))
var/name = M.name
- if (name in names)
+ if (names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
names.Add(name)
namecounts[name] = 1
+
creatures[name] = M
+
//THIS IS THE MOBS PART: LOOK IN HELPERS.DM
client.perspective = EYE_PERSPECTIVE
var/eye_name = null
- if (is_admin)
- eye_name = input("Please, select a player!", "Admin Observe", null, null) as null|anything in creatures
- else
- eye_name = input("Please, select a player!", "Observe", null, null) as null|anything in creatures
+ var/ok = "[is_admin ? "Admin Observe" : "Observe"]"
+ eye_name = input("Please, select a player!", ok, null, null) as null|anything in creatures
if (!eye_name)
return
- var/mob/eye = creatures[eye_name]
- if (is_admin)
- if (eye)
- reset_view(eye)
+ var/mob/mob_eye = creatures[eye_name]
+
+ if(client && mob_eye)
+ client.eye = mob_eye
+ if (is_admin)
client.adminobs = 1
- if(eye == client.mob)
+ if(mob_eye == client.mob || client.eye == client.mob)
client.adminobs = 0
- else
- reset_view(null)
- client.adminobs = 0
- else
- if(ticker)
-// world << "there's a ticker"
- if(ticker.mode.name == "AI malfunction")
-// world << "ticker says its malf"
- var/datum/game_mode/malfunction/malf = ticker.mode
- for (var/datum/mind/B in malf.malf_ai)
-// world << "comparing [B.current] to [eye]"
- if (B.current == eye)
- for (var/mob/living/silicon/decoy/D in world)
- if (eye)
- eye = D
- if (client)
- if (eye)
- client.eye = eye
- else
- client.eye = client.mob
/mob/verb/cancel_camera()
set name = "Cancel Camera View"