Modular PDAs: The End of an Era (#10319)

PDAs are dead, long live PDAs. All trace of old PDAs has been scoured from the codebase, and in its place are modular computer PDAs that are feature-equivalent. Essentially every PDA function except the Syndicate detonation feature and Notepad has been ported over, and battery life for handheld computers has been boosted alongside the addition of charging cables to make things easier.
This commit is contained in:
JohnWildkins
2020-11-01 21:09:50 +02:00
committed by GitHub
parent a5d891763c
commit 616776f886
167 changed files with 2017 additions and 3332 deletions
+7
View File
@@ -0,0 +1,7 @@
--
-- Implemented in PR #10319.
-- Adds a `pda_choice` column for PDA type preferences.
--
ALTER TABLE `ss13_characters`
ADD COLUMN `pda_choice` INT(11) NULL DEFAULT NULL AFTER `backbag_style`;
+8 -9
View File
@@ -842,9 +842,6 @@
#include "code\game\objects\items\devices\lighting\flashlight.dm"
#include "code\game\objects\items\devices\lighting\glowstick.dm"
#include "code\game\objects\items\devices\lighting\lamp.dm"
#include "code\game\objects\items\devices\PDA\cart.dm"
#include "code\game\objects\items\devices\PDA\chatroom.dm"
#include "code\game\objects\items\devices\PDA\PDA.dm"
#include "code\game\objects\items\devices\PDA\radio.dm"
#include "code\game\objects\items\devices\radio\_radio_defines.dm"
#include "code\game\objects\items\devices\radio\beacon.dm"
@@ -1581,7 +1578,6 @@
#include "code\modules\events\meteors.dm"
#include "code\modules\events\money_hacker.dm"
#include "code\modules\events\money_lotto.dm"
#include "code\modules\events\money_spam.dm"
#include "code\modules\events\prison_break.dm"
#include "code\modules\events\radiation_storm.dm"
#include "code\modules\events\random_antagonist.dm"
@@ -2156,15 +2152,17 @@
#include "code\modules\modular_computers\computers\modular_computer\ui.dm"
#include "code\modules\modular_computers\computers\modular_computer\variables.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_console.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_handheld.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_pda.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_silicon.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_silicon_subtypes.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_wristbound.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_console.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_handheld.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_pda.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm"
#include "code\modules\modular_computers\computers\subtypes\preset_wristbound.dm"
#include "code\modules\modular_computers\file_system\computer_file.dm"
@@ -2181,27 +2179,29 @@
#include "code\modules\modular_computers\file_system\programs\civilian\cargo_delivery.dm"
#include "code\modules\modular_computers\file_system\programs\civilian\cargo_order.dm"
#include "code\modules\modular_computers\file_system\programs\civilian\crusher_control.dm"
#include "code\modules\modular_computers\file_system\programs\civilian\janitor.dm"
#include "code\modules\modular_computers\file_system\programs\command\card.dm"
#include "code\modules\modular_computers\file_system\programs\command\comm.dm"
#include "code\modules\modular_computers\file_system\programs\engineering\_engineering.dm"
#include "code\modules\modular_computers\file_system\programs\games\arcade.dm"
#include "code\modules\modular_computers\file_system\programs\games\sudoku\helpers.dm"
#include "code\modules\modular_computers\file_system\programs\games\sudoku\sudoku.dm"
#include "code\modules\modular_computers\file_system\programs\generic\atmosphere.dm"
#include "code\modules\modular_computers\file_system\programs\generic\manifest.dm"
#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm"
#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm"
#include "code\modules\modular_computers\file_system\programs\generic\ntsl2_interpreter.dm"
#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm"
#include "code\modules\modular_computers\file_system\programs\generic\records.dm"
#include "code\modules\modular_computers\file_system\programs\generic\scanner.dm"
#include "code\modules\modular_computers\file_system\programs\generic\signaler.dm"
#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm"
#include "code\modules\modular_computers\file_system\programs\pai\access_lock.dm"
#include "code\modules\modular_computers\file_system\programs\pai\atmosphere.dm"
#include "code\modules\modular_computers\file_system\programs\pai\directives.dm"
#include "code\modules\modular_computers\file_system\programs\pai\doorjack.dm"
#include "code\modules\modular_computers\file_system\programs\pai\flashlight.dm"
#include "code\modules\modular_computers\file_system\programs\pai\hud.dm"
#include "code\modules\modular_computers\file_system\programs\pai\radio.dm"
#include "code\modules\modular_computers\file_system\programs\pai\signaler.dm"
#include "code\modules\modular_computers\file_system\programs\pai\translator.dm"
#include "code\modules\modular_computers\file_system\programs\research\ai_restorer.dm"
#include "code\modules\modular_computers\file_system\programs\research\chemistry_codex.dm"
@@ -2582,7 +2582,6 @@
#include "code\modules\research\designs\protolathe\mining_designs.dm"
#include "code\modules\research\designs\protolathe\modular_computer_designs.dm"
#include "code\modules\research\designs\protolathe\modular_gun_designs.dm"
#include "code\modules\research\designs\protolathe\pda_designs.dm"
#include "code\modules\research\designs\protolathe\power_designs.dm"
#include "code\modules\research\designs\protolathe\stock_parts_designs.dm"
#include "code\modules\research\designs\protolathe\tool_designs.dm"
+9
View File
@@ -199,6 +199,7 @@
#define PROGRAM_SILICON (PROGRAM_SILICON_AI | PROGRAM_SILICON_ROBOT | PROGRAM_SILICON_PAI)
#define PROGRAM_STATIONBOUND (PROGRAM_SILICON_AI | PROGRAM_SILICON_ROBOT)
#define PROGRAM_ALL_REGULAR (PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_WRISTBOUND | PROGRAM_TELESCREEN)
#define PROGRAM_ALL_HANDHELD (PROGRAM_TABLET | PROGRAM_WRISTBOUND)
#define PROGRAM_STATE_KILLED 0
#define PROGRAM_STATE_BACKGROUND 1
@@ -216,6 +217,14 @@
#define PROGRAM_SERVICE 2
#define PROGRAM_TYPE_ALL (PROGRAM_NORMAL | PROGRAM_SERVICE)
#define DEVICE_UNKNOWN 0
#define DEVICE_COMPANY 1
#define DEVICE_PRIVATE 2
#define SCANNER_MEDICAL 1
#define SCANNER_REAGENT 2
#define SCANNER_GAS 4
// Special return values from bullet_act(). Positive return values are already used to indicate the blocked level of the projectile.
#define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act()
#define PROJECTILE_FORCE_MISS -2 //if the projectile should treat the attack as a miss (suppresses attack and admin logs) - only applies to mobs.
-1
View File
@@ -123,7 +123,6 @@
//Augment organs
#define BP_AUG_TIMEPIECE "integrated timepiece"
#define BP_AUG_PDA "integrated pda"
#define BP_AUG_TOOL "retractable combitool"
#define BP_AUG_PEN "retractable combipen"
#define BP_AUG_LIGHTER "retractable lighter"
+3
View File
@@ -62,6 +62,9 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
var/global/list/backbagstyles = list("Job-specific", "Grey")
var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg, /datum/job/merchant)
//PDA choice
var/global/list/pdalist = list("Nothing", "Standard PDA", "Classic PDA", "Rugged PDA", "Slate PDA", "Smart PDA", "Tablet", "Wristbound")
// Visual nets
var/list/datum/visualnet/visual_nets = list()
var/datum/visualnet/camera/cameranet = new()
-11
View File
@@ -122,17 +122,6 @@
game_log("ADMINSAY", text)
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]",level = SEVERITY_NOTICE, category = "ADMINSAY")
/proc/log_pda(text, level = SEVERITY_NOTICE, ckey = "", ckey_target = "")
if (config.log_pda)
game_log("PDA", text)
send_gelf_log(
short_message = text,
long_message = "[time_stamp()]: [text]",
level = level,
category="PDA",
additional_data = list("_ckey" = html_encode(ckey), "_ckey_target" = html_encode(ckey_target))
)
/proc/log_ntirc(text, level = SEVERITY_NOTICE, ckey = "", conversation = "")
if (config.log_pda)
game_log("NTIRC", text)
-3
View File
@@ -80,9 +80,6 @@
var/b_score = LAZYLEN(B.items) + LAZYLEN(B.reagents) + LAZYLEN(B.fruit)
return b_score - a_score
/proc/cmp_pda(obj/item/device/pda/A, obj/item/device/pda/B)
return sorttext(B.owner, A.owner)
/proc/cmp_planelayer(atom/A, atom/B)
return (B.plane - A.plane) || (B.layer - A.layer)
+6 -5
View File
@@ -313,11 +313,12 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(!search_pda) break
search_id = 0
else if( search_pda && istype(A,/obj/item/device/pda) )
var/obj/item/device/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
PDA.name = "PDA-[newname] ([PDA.ownjob])"
else if(search_pda && istype(A,/obj/item/modular_computer))
var/obj/item/modular_computer/PDA = A
if(!PDA.registered_id)
continue
if(PDA.registered_id.name == oldname)
PDA.name = "PDA-[newname] ([PDA.registered_id.assignment])"
if(!search_id) break
search_pda = 0
return 1
-2
View File
@@ -15,8 +15,6 @@
new /obj/screen/ai/announcement,
new /obj/screen/ai/call_shuttle,
new /obj/screen/ai/state_laws,
new /obj/screen/ai/pda_msg,
new /obj/screen/ai/pda_log,
new /obj/screen/ai/take_image,
new /obj/screen/ai/view_image,
new /obj/screen/ai/sensor_aug,
@@ -130,26 +130,6 @@
var/mob/living/silicon/ai/AI = usr
AI.subsystem_law_manager()
/obj/screen/ai/pda_msg
name = "PDA - Send Message"
icon_state = "pda_send"
screen_loc = ui_ai_pda_send
/obj/screen/ai/pda_msg/Click()
if (isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.ai_pda.cmd_send_pdamesg(usr)
/obj/screen/ai/pda_log
name = "PDA - Show Message Log"
icon_state = "pda_receive"
screen_loc = ui_ai_pda_log
/obj/screen/ai/pda_log/Click()
if (isAI(usr))
var/mob/living/silicon/ai/AI = usr
AI.ai_pda.cmd_show_message_log(usr)
/obj/screen/ai/take_image
name = "Take Image"
icon_state = "take_picture"
+1 -1
View File
@@ -15,7 +15,7 @@ var/list/gamemode_cache = list()
var/log_emote = 0 // log emotes
var/log_attack = 0 // log attack messages
var/log_adminchat = 0 // log admin chat messages
var/log_pda = 0 // log pda messages
var/log_pda = 0 // log NTIRC messages
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
var/log_runtime = 0 // logs world.log to a file
var/log_world_output = 0 // log world.log << messages
@@ -312,6 +312,7 @@
SearchVar(skin_styles_female_list)
SearchVar(body_marking_styles_list)
SearchVar(backbaglist)
SearchVar(pdalist)
SearchVar(exclude_jobs)
SearchVar(visual_nets)
SearchVar(cameranet)
-11
View File
@@ -160,17 +160,6 @@
NEWSCASTER.newsAlert(annoncement)
NEWSCASTER.update_icon()
var/list/receiving_pdas = new
for (var/obj/item/device/pda/P in PDAs)
if (!P.owner)
continue
if (P.toff)
continue
receiving_pdas += P
for(var/obj/item/device/pda/PDA in receiving_pdas)
PDA.new_news(annoncement)
/datum/controller/subsystem/news/proc/GetForumAuthor(topic_id, post_id)
topic_id = "[topic_id]"
post_id = text2num(post_id)
@@ -134,7 +134,6 @@
feedback_add_details("radio_usage","CAR-[msg_cargo.len]")
feedback_add_details("radio_usage","SRV-[msg_service.len]")
feedback_add_details("radio_usage","OTH-[messages.len]")
feedback_add_details("radio_usage","PDA-[pda_msg_amt]")
feedback_add_details("radio_usage","RC-[rc_msg_amt]")
for (var/key in simple_statistics)
+1 -1
View File
@@ -63,7 +63,7 @@ var/datum/controller/subsystem/traumas/SStraumas
"clowns" = typecacheof(list(/obj/item/clothing/under/rank/clown, /obj/item/clothing/shoes/clown_shoes,
/obj/item/clothing/mask/gas/clown_hat, /obj/item/bananapeel,
/obj/item/bikehorn, /obj/item/device/pda/clown)),
/obj/item/bikehorn, /obj/item/modular_computer/handheld/pda/civilian/clown)),
"cats" = typecacheof(list(/obj/item/clothing/head/tajaran, /obj/item/clothing/suit/storage/tajaran,
/obj/item/clothing/suit/storage/toggle/labcoat/tajaran, /obj/item/clothing/suit/storage/tajaran,
+19
View File
@@ -174,6 +174,25 @@
var/obj/effect/ebeam/B = beam
B.color = set_color
/datum/beam/power
var/obj/item/computer_hardware/tesla_link/charging_cable/owner
/datum/beam/power/End()
owner.beam = null
owner.untether(FALSE)
return ..()
/datum/beam/power/get_x_translation_vector()
return (world.icon_size * target_oldloc.x) - (world.icon_size * origin_oldloc.x)
/datum/beam/power/get_y_translation_vector()
return (world.icon_size * target_oldloc.y) - (world.icon_size * origin_oldloc.y)
/datum/beam/power/afterDraw()
for(var/beam in elements)
var/obj/effect/ebeam/B = beam
B.color = COLOR_GRAY40
/obj/effect/ebeam
mouse_opacity = 0
anchored = 1
+1 -6
View File
@@ -467,13 +467,8 @@
var/is_currently_brigged = 0
if(A?.is_prison())
is_currently_brigged = 1
for(var/obj/item/card/id/card in current)
if(current.GetIdCard())
is_currently_brigged = 0
break // if they still have ID they're not brigged
for(var/obj/item/device/pda/P in current)
if(P.id)
is_currently_brigged = 0
break // if they still have ID they're not brigged
if(!is_currently_brigged)
brigged_since = -1
+1 -1
View File
@@ -32,7 +32,7 @@
l_pocket = /obj/item/melee/energy/sword
r_pocket = /obj/item/cloaking_device
id = /obj/item/card/id/syndicate
pda = /obj/item/device/pda/heads
pda = /obj/item/modular_computer/handheld/pda/command
/datum/outfit/admin/killer/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
var/obj/item/storage/secure/briefcase/sec_briefcase = new(H)
@@ -118,7 +118,7 @@
l_pocket = /obj/item/reagent_containers/spray/pepper
r_pocket = /obj/item/device/taperecorder/cciaa
l_hand = /obj/item/storage/lockbox/cciaa
pda = /obj/item/device/pda/central
pda = /obj/item/modular_computer/handheld/pda/command/cciaa
id_access = "CCIA Agent"
@@ -304,7 +304,7 @@
name = "NTCC Odin Sanitation Specialist"
uniform = /obj/item/clothing/under/rank/janitor
pda = /obj/item/device/pda/janitor
pda = /obj/item/modular_computer/handheld/pda/civilian
shoes = /obj/item/clothing/shoes/galoshes
l_ear = /obj/item/device/radio/headset/headset_service
l_pocket = /obj/item/grenade/chem_grenade/cleaner
+39 -18
View File
@@ -35,6 +35,11 @@
var/dufflebag = /obj/item/storage/backpack/duffel
var/messengerbag = /obj/item/storage/backpack/messenger
var/allow_pda_choice = FALSE
var/tab_pda = /obj/item/modular_computer/handheld/pda/civilian
var/tablet = /obj/item/modular_computer/handheld/preset/civilian
var/wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
var/internals_slot = null //ID of slot containing a gas tank
var/list/backpack_contents = list() //In the list(path=count,otherpath=count) format
var/list/accessory_contents = list()
@@ -45,7 +50,7 @@
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
if(allow_backbag_choice)
var/use_job_specific = H.backbag_style == 1
var/use_job_specific = H.backbag_style == TRUE
switch(H.backbag)
if (1)
back = null
@@ -165,22 +170,40 @@
if(r_hand)
H.put_in_r_hand(new r_hand(H))
if(pda && !visualsOnly) //Dont equip and imprint the PDA in visuals only (preview) to avoid duplicates
if(allow_pda_choice)
switch(H.pda_choice)
if (1)
pda = null
if (7)
pda = tablet
if (8)
pda = wristbound
else
pda = tab_pda
if(pda && !visualsOnly)
var/obj/item/I = new pda(H)
imprint_pda(H,I)
switch(H.pda_choice)
if(3)
I.icon = 'icons/obj/pda_old.dmi'
if(4)
I.icon = 'icons/obj/pda_rugged.dmi'
if(5)
I.icon = 'icons/obj/pda_slate.dmi'
if(6)
I.icon = 'icons/obj/pda_smart.dmi'
I.update_icon()
H.equip_or_collect(I, slot_wear_id)
if(id)
var/obj/item/device/pda/P = H.wear_id
var/obj/item/modular_computer/P = H.wear_id
var/obj/item/I = new id(H)
imprint_idcard(H,I)
if(istype(P))
I.forceMove(P)
P.id = I
if(istype(P) && P.card_slot)
addtimer(CALLBACK(src, .proc/register_pda, P, I), 1 SECOND)
else
H.equip_or_collect(I, slot_wear_id)
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_pocket)
equip_item(H, l_pocket, slot_l_store)
@@ -272,16 +295,14 @@
if(H.mind && H.mind.initial_account)
C.associated_account_number = H.mind.initial_account.account_number
/datum/outfit/proc/imprint_pda(mob/living/carbon/human/H, obj/item/device/pda/PDA)
var/obj/item/card/id/C = PDA.id
PDA.owner = H.real_name
if(istype(PDA) && istype(C))
PDA.ownjob = C.assignment
PDA.ownrank = C.rank
else //As a fallback if the id isnt inside of the PDA
PDA.ownjob = get_id_assignment(H)
PDA.ownrank = get_id_rank(H)
PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
/datum/outfit/proc/register_pda(obj/item/modular_computer/P, obj/item/card/id/I)
if(!P.card_slot)
return
P.card_slot.insert_id(I)
if(P.card_slot.stored_card && !P.hidden)
P.set_autorun("ntnrc_client")
P.enable_computer(null, TRUE) // passing null because we don't want the UI to open
P.minimize_program()
/datum/outfit/proc/get_id_access(mob/living/carbon/human/H)
return list()
+1 -1
View File
@@ -81,7 +81,7 @@
name = "Random Visitor"
id = /obj/item/card/id
pda = /obj/item/device/pda
pda = /obj/item/modular_computer/handheld/pda/civilian
/datum/outfit/admin/random/visitor/get_id_assignment()
return "Visitor"
+1
View File
@@ -151,6 +151,7 @@
belt = /obj/item/storage/belt/military
gloves = /obj/item/clothing/gloves/swat
shoes = /obj/item/clothing/shoes/jackboots
pda = /obj/item/modular_computer/handheld/pda/syndicate
backpack_contents = list(
/obj/item/storage/box/engineer = 1,
-1
View File
@@ -32,7 +32,6 @@ They sell generic supplies and ask for generic supplies.
/obj/item/device/assembly_holder = TRADER_BLACKLIST_ALL,
/obj/item/device/encryptionkey = TRADER_BLACKLIST_SUB, //Why should ai want NT encryption keys?
/obj/item/device/radio = TRADER_BLACKLIST_ALL,
/obj/item/device/pda = TRADER_BLACKLIST_SUB,
/obj/item/device/chameleon = TRADER_BLACKLIST, // Why should it want a chameleon projector
/obj/item/device/dociler = TRADER_BLACKLIST, //Item unobtaineable
/obj/item/device/flashlight/drone = TRADER_BLACKLIST, // No drone stuff
+1 -2
View File
@@ -88,8 +88,7 @@
/obj/item/clothing/mask/gas/sexyclown = TRADER_THIS_TYPE,
/obj/item/clothing/shoes/clown_shoes = TRADER_THIS_TYPE,
/obj/item/clothing/under/rank/clown = TRADER_THIS_TYPE,
/obj/item/device/pda/clown = TRADER_THIS_TYPE,
/obj/item/cartridge/clown = TRADER_THIS_TYPE,
/obj/item/modular_computer/handheld/pda/civilian/clown = TRADER_THIS_TYPE,
/obj/item/stamp/clown = TRADER_THIS_TYPE,
/obj/item/storage/backpack/clown = TRADER_THIS_TYPE,
/obj/item/bananapeel = TRADER_THIS_TYPE,
@@ -19,11 +19,6 @@
item_cost = 2
path = /obj/item/storage/box/syndie_kit/toxin
/datum/uplink_item/item/stealthy_weapons/detomatix
name = "Detomatix PDA Cartridge"
item_cost = 4
path = /obj/item/cartridge/syndicate
/datum/uplink_item/item/stealthy_weapons/pens
name = "Pen-jector Kit"
desc = "A kit that contains four differently coloured pens. A blue pacifying pen, a green pen containing healing chemicals, and a yellow hyperzine pen."
+5 -6
View File
@@ -119,12 +119,12 @@ var/datum/antagonist/traitor/traitors
if(traitor_mob.client.prefs.uplinklocation == "Headset")
R = locate(/obj/item/device/radio) in traitor_mob.contents
if(!R)
R = locate(/obj/item/device/pda) in traitor_mob.contents
R = locate(/obj/item/modular_computer) in traitor_mob.contents
to_chat(traitor_mob, "Could not locate a Radio, installing in PDA instead!")
if (!R)
to_chat(traitor_mob, "Unfortunately, neither a radio or a PDA relay could be installed.")
else if(traitor_mob.client.prefs.uplinklocation == "PDA")
R = locate(/obj/item/device/pda) in traitor_mob.contents
R = locate(/obj/item/modular_computer) in traitor_mob.contents
if(!R)
R = locate(/obj/item/device/radio) in traitor_mob.contents
to_chat(traitor_mob, "Could not locate a PDA, installing into a Radio instead!")
@@ -135,7 +135,7 @@ var/datum/antagonist/traitor/traitors
R = null
else
to_chat(traitor_mob, "You have not selected a location for your relay in the antagonist options! Defaulting to PDA!")
R = locate(/obj/item/device/pda) in traitor_mob.contents
R = locate(/obj/item/modular_computer) in traitor_mob.contents
if (!R)
R = locate(/obj/item/device/radio) in traitor_mob.contents
to_chat(traitor_mob, "Could not locate a PDA, installing into a Radio instead!")
@@ -164,13 +164,12 @@ var/datum/antagonist/traitor/traitors
to_chat(traitor_mob, "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.")
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
else if (istype(R, /obj/item/device/pda))
else if (istype(R, /obj/item/modular_computer))
// 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/hidden/T = new(R, traitor_mob.mind)
R.hidden_uplink = T
var/obj/item/device/pda/P = R
P.lock_code = pda_pass
T.pda_code = pda_pass
R.autodrobe_no_remove = TRUE
to_chat(traitor_mob, "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.")
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
+2 -1
View File
@@ -15,7 +15,8 @@
return 0
/obj/item/proc/GetAccess()
return list()
var/obj/item/card/id = GetID()
return istype(id) ? id.GetAccess() : list()
/obj/proc/GetID()
return null
+6 -2
View File
@@ -35,7 +35,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
l_ear = /obj/item/device/radio/headset/heads/captain
glasses = /obj/item/clothing/glasses/sunglasses
id = /obj/item/card/id/gold
pda = /obj/item/device/pda/captain
tab_pda = /obj/item/modular_computer/handheld/pda/command/captain
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/command/captain
tablet = /obj/item/modular_computer/handheld/preset/command/captain
backpack_contents = list(
/obj/item/storage/box/ids = 1
)
@@ -107,7 +109,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
shoes = /obj/item/clothing/shoes/brown
l_ear = /obj/item/device/radio/headset/heads/hop
id = /obj/item/card/id/navy
pda = /obj/item/device/pda/heads/hop
tab_pda = /obj/item/modular_computer/handheld/pda/command/hop
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/command/hop
tablet = /obj/item/modular_computer/handheld/preset/command/hop
backpack_contents = list(
/obj/item/storage/box/ids = 1
)
+32 -12
View File
@@ -22,7 +22,9 @@
jobtype = /datum/job/bartender
uniform = /obj/item/clothing/under/rank/bartender
pda = /obj/item/device/pda/bar
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/bartender
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/bartender
tablet = /obj/item/modular_computer/handheld/preset/civilian/bartender
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
@@ -52,7 +54,9 @@
uniform = /obj/item/clothing/under/rank/chef
suit = /obj/item/clothing/suit/chef
head = /obj/item/clothing/head/chefhat
pda = /obj/item/device/pda/chef
tab_pda = /obj/item/modular_computer/handheld/pda/civilian
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
tablet = /obj/item/modular_computer/handheld/preset/civilian
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
@@ -84,7 +88,9 @@
uniform = /obj/item/clothing/under/rank/hydroponics
suit = /obj/item/clothing/suit/apron
pda = /obj/item/device/pda/botanist
tab_pda = /obj/item/modular_computer/handheld/pda/civilian
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
tablet = /obj/item/modular_computer/handheld/preset/civilian
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
suit_store = /obj/item/device/analyzer/plant_analyzer
@@ -131,7 +137,9 @@
jobtype = /datum/job/qm
uniform = /obj/item/clothing/under/rank/quartermaster
pda = /obj/item/device/pda/quartermaster
tab_pda = /obj/item/modular_computer/handheld/pda/supply/qm
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/supply/qm
tablet = /obj/item/modular_computer/handheld/preset/supply/qm
shoes = /obj/item/clothing/shoes/brown
l_ear = /obj/item/device/radio/headset/qm
l_hand = /obj/item/clipboard
@@ -160,7 +168,9 @@
jobtype = /datum/job/cargo_tech
uniform = /obj/item/clothing/under/rank/cargo
pda = /obj/item/device/pda/cargo
tab_pda = /obj/item/modular_computer/handheld/pda/supply
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/supply
tablet = /obj/item/modular_computer/handheld/preset/supply
id = /obj/item/card/id/silver
shoes = /obj/item/clothing/shoes/brown
l_ear = /obj/item/device/radio/headset/headset_cargo
@@ -191,7 +201,9 @@
jobtype = /datum/job/mining
uniform = /obj/item/clothing/under/rank/miner
pda = /obj/item/device/pda/shaftminer
tab_pda = /obj/item/modular_computer/handheld/pda/supply/miner
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/supply/miner
tablet = /obj/item/modular_computer/handheld/preset/civilian
id = /obj/item/card/id/silver
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_mining
@@ -232,7 +244,9 @@
jobtype = /datum/job/janitor
uniform = /obj/item/clothing/under/rank/janitor
pda = /obj/item/device/pda/janitor
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/janitor
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/janitor
tablet = /obj/item/modular_computer/handheld/preset/civilian/janitor
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
@@ -261,7 +275,9 @@
jobtype = /datum/job/journalist
uniform = /obj/item/clothing/under/suit_jacket/red
pda = /obj/item/device/pda/librarian
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/librarian
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/librarian
tablet = /obj/item/modular_computer/handheld/preset/civilian/librarian
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
@@ -274,7 +290,9 @@
jobtype = /datum/job/journalist
uniform = /obj/item/clothing/under/suit_jacket/red
pda = /obj/item/device/pda/librarian
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/librarian
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/librarian
tablet = /obj/item/modular_computer/handheld/preset/civilian/librarian
shoes = /obj/item/clothing/shoes/black
backpack_contents = list(
@@ -304,7 +322,9 @@
jobtype = /datum/job/librarian
uniform = /obj/item/clothing/under/suit_jacket/red
pda = /obj/item/device/pda/librarian
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/librarian
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/librarian
tablet = /obj/item/modular_computer/handheld/preset/civilian/librarian
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
r_pocket = /obj/item/barcodescanner
@@ -323,8 +343,8 @@
jobtype = /datum/job/librarian
uniform = /obj/item/clothing/under/suit_jacket/charcoal
l_pocket = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
l_pocket = /obj/item/modular_computer/handheld/custom_loadout/advanced
r_pocket = /obj/item/card/tech_support
r_hand = /obj/item/storage/bag/circuits/basic
l_hand = /obj/item/modular_computer/laptop/preset
gloves = /obj/item/modular_computer/wristbound/preset/advanced/generic
gloves = /obj/item/modular_computer/handheld/wristbound/preset/advanced/generic
+3 -1
View File
@@ -20,7 +20,9 @@
uniform = /obj/item/clothing/under/rank/chaplain
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_service
pda = /obj/item/device/pda/chaplain
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/chaplain
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/chaplain
tablet = /obj/item/modular_computer/handheld/preset/civilian/chaplain
/datum/outfit/job/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
+10 -3
View File
@@ -37,7 +37,9 @@
uniform = /obj/item/clothing/under/rank/chief_engineer
head = /obj/item/clothing/head/hardhat/white
belt = /obj/item/storage/belt/utility
pda = /obj/item/device/pda/heads/ce
tab_pda = /obj/item/modular_computer/handheld/pda/engineering/ce
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/engineering/ce
tablet = /obj/item/modular_computer/handheld/preset/engineering/ce
id = /obj/item/card/id/navy
shoes = /obj/item/clothing/shoes/workboots
l_ear = /obj/item/device/radio/headset/heads/ce
@@ -90,7 +92,9 @@
uniform = /obj/item/clothing/under/rank/engineer
head = /obj/item/clothing/head/hardhat
belt = /obj/item/storage/belt/utility
pda = /obj/item/device/pda/engineering
tab_pda = /obj/item/modular_computer/handheld/pda/engineering
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/engineering
tablet = /obj/item/modular_computer/handheld/preset/engineering
id = /obj/item/card/id/silver
shoes = /obj/item/clothing/shoes/workboots
l_ear = /obj/item/device/radio/headset/headset_eng
@@ -134,7 +138,6 @@
uniform = /obj/item/clothing/under/rank/atmospheric_technician
belt = /obj/item/storage/belt/utility
pda = /obj/item/device/pda/atmos
id = /obj/item/card/id/silver
shoes = /obj/item/clothing/shoes/workboots
l_ear = /obj/item/device/radio/headset/headset_eng
@@ -144,6 +147,10 @@
dufflebag = /obj/item/storage/backpack/duffel/eng
messengerbag = /obj/item/storage/backpack/messenger/engi
tab_pda = /obj/item/modular_computer/handheld/pda/engineering/atmos
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/engineering/atmos
tablet = /obj/item/modular_computer/handheld/preset/engineering/atmos
belt_contents = list(
/obj/item/weldingtool = 1,
/obj/item/crowbar = 1,
+4 -1
View File
@@ -184,6 +184,7 @@
var/allow_loadout = TRUE
allow_backbag_choice = TRUE
allow_pda_choice = TRUE
var/jobtype = null
uniform = /obj/item/clothing/under/color/grey
@@ -191,7 +192,9 @@
l_ear = /obj/item/device/radio/headset
back = /obj/item/storage/backpack
shoes = /obj/item/clothing/shoes/black
pda = /obj/item/device/pda
tab_pda = /obj/item/modular_computer/handheld/pda/civilian
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
tablet = /obj/item/modular_computer/handheld/preset/civilian
var/box = /obj/item/storage/box/survival
+15 -5
View File
@@ -38,7 +38,9 @@
suit_store = /obj/item/device/flashlight/pen
shoes = /obj/item/clothing/shoes/brown
l_ear = /obj/item/device/radio/headset/heads/cmo
pda = /obj/item/device/pda/heads/cmo
tab_pda = /obj/item/modular_computer/handheld/pda/medical/cmo
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/medical/cmo
tablet = /obj/item/modular_computer/handheld/preset/medical/cmo
id = /obj/item/card/id/navy
l_hand = /obj/item/storage/firstaid/adv
@@ -93,7 +95,9 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/medical
shoes = /obj/item/clothing/shoes/medical
l_ear = /obj/item/device/radio/headset/headset_med
pda = /obj/item/device/pda/medical
tab_pda = /obj/item/modular_computer/handheld/pda/medical
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/medical
tablet = /obj/item/modular_computer/handheld/preset/medical
id = /obj/item/card/id/white
suit_store = /obj/item/device/flashlight/pen
@@ -146,7 +150,9 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/pharmacist
shoes = /obj/item/clothing/shoes/chemist
l_ear = /obj/item/device/radio/headset/headset_med
pda = /obj/item/device/pda/chemist
tab_pda = /obj/item/modular_computer/handheld/pda/medical
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/medical
tablet = /obj/item/modular_computer/handheld/preset/medical
id = /obj/item/card/id/white
backpack = /obj/item/storage/backpack/pharmacy
@@ -183,7 +189,9 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/psych
shoes = /obj/item/clothing/shoes/psych
l_ear = /obj/item/device/radio/headset/headset_med
pda = /obj/item/device/pda/psych
tab_pda = /obj/item/modular_computer/handheld/pda/medical/psych
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/medical/psych
tablet = /obj/item/modular_computer/handheld/preset/medical/psych
id = /obj/item/card/id/white
/datum/outfit/job/psychiatrist/psycho
@@ -221,7 +229,9 @@
l_hand = /obj/item/storage/firstaid/adv
r_hand = /obj/item/reagent_containers/hypospray
belt = /obj/item/storage/belt/medical/emt
pda = /obj/item/device/pda/paramedic
tab_pda = /obj/item/modular_computer/handheld/pda/medical
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/medical
tablet = /obj/item/modular_computer/handheld/preset/medical
id = /obj/item/card/id/white
head = /obj/item/clothing/head/hardhat/emt
+6 -2
View File
@@ -38,13 +38,17 @@
shoes = /obj/item/clothing/shoes/laceup
head = /obj/item/clothing/head/that
id = /obj/item/card/id/merchant
pda = /obj/item/device/pda/merchant
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/merchant
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
tablet = /obj/item/modular_computer/handheld/preset/civilian
r_pocket = /obj/item/device/price_scanner
/datum/outfit/merchant_assistant
name = "Merchant's Assistant"
id = /obj/item/card/id/merchant
pda = /obj/item/device/pda/merchant
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/merchant
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian
tablet = /obj/item/modular_computer/handheld/preset/civilian
r_pocket = /obj/item/device/price_scanner
belt = /obj/item/storage/belt/utility/full
uniform = list(
@@ -25,7 +25,9 @@
head = /obj/item/clothing/head/beret/liaison
uniform = /obj/item/clothing/under/rank/liaison
suit = /obj/item/clothing/suit/storage/toggle/liaison
pda = /obj/item/device/pda/lawyer
tab_pda = /obj/item/modular_computer/handheld/pda/civilian/lawyer
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/civilian/lawyer
tablet = /obj/item/modular_computer/handheld/preset/civilian/lawyer
shoes = /obj/item/clothing/shoes/laceup
glasses = /obj/item/clothing/glasses/sunglasses/big
l_ear = /obj/item/device/radio/headset/representative
+10 -4
View File
@@ -38,7 +38,9 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
shoes = /obj/item/clothing/shoes/brown
l_ear = /obj/item/device/radio/headset/heads/rd
pda = /obj/item/device/pda/heads/rd
tab_pda = /obj/item/modular_computer/handheld/pda/research/rd
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/research/rd
tablet = /obj/item/modular_computer/handheld/preset/research/rd
id = /obj/item/card/id/navy
l_hand = /obj/item/clipboard
@@ -78,7 +80,9 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
shoes = /obj/item/clothing/shoes/science
l_ear = /obj/item/device/radio/headset/headset_sci
pda = /obj/item/device/pda/science
tab_pda = /obj/item/modular_computer/handheld/pda/research
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/research
tablet = /obj/item/modular_computer/handheld/preset/research
id = /obj/item/card/id/white
backpack = /obj/item/storage/backpack/toxins
@@ -116,7 +120,7 @@
/datum/outfit/job/scientist/xenobiologist
name = "Xenobiologist"
jobtype = /datum/job/xenobiologist
pda = /obj/item/device/pda/xenobio
tab_pda = /obj/item/modular_computer/handheld/pda/research
/datum/outfit/job/scientist/xenobiologist/xenobotanist
name = "Xenobotanist"
@@ -151,7 +155,9 @@
suit = /obj/item/clothing/suit/storage/toggle/labcoat
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/device/radio/headset/headset_sci
pda = /obj/item/device/pda/roboticist
tab_pda = /obj/item/modular_computer/handheld/pda/research
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/research
tablet = /obj/item/modular_computer/handheld/preset/research
id = /obj/item/card/id/white
belt = /obj/item/storage/belt/utility
+15 -5
View File
@@ -36,7 +36,9 @@
uniform = /obj/item/clothing/under/rank/head_of_security
shoes = /obj/item/clothing/shoes/jackboots
l_ear = /obj/item/device/radio/headset/heads/hos
pda = /obj/item/device/pda/heads/hos
tab_pda = /obj/item/modular_computer/handheld/pda/security/hos
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/security/hos
tablet = /obj/item/modular_computer/handheld/preset/security/hos
id = /obj/item/card/id/navy
glasses = /obj/item/clothing/glasses/sunglasses/sechud/head
@@ -89,7 +91,9 @@
uniform = /obj/item/clothing/under/rank/warden
shoes = /obj/item/clothing/shoes/jackboots
l_ear = /obj/item/device/radio/headset/headset_warden
pda = /obj/item/device/pda/warden
tab_pda = /obj/item/modular_computer/handheld/pda/security
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/security
tablet = /obj/item/modular_computer/handheld/preset/security
glasses = /obj/item/clothing/glasses/sunglasses/sechud/head
l_pocket = /obj/item/device/flash
@@ -138,7 +142,9 @@
uniform = /obj/item/clothing/under/det
shoes = /obj/item/clothing/shoes/laceup
l_ear = /obj/item/device/radio/headset/headset_sec
pda = /obj/item/device/pda/detective
tab_pda = /obj/item/modular_computer/handheld/pda/security/detective
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/security/detective
tablet = /obj/item/modular_computer/handheld/preset/security/detective
backpack_contents = list(
/obj/item/storage/box/evidence = 1
@@ -181,7 +187,9 @@
uniform = /obj/item/clothing/under/det/forensics
shoes = /obj/item/clothing/shoes/laceup
l_ear = /obj/item/device/radio/headset/headset_sec
pda = /obj/item/device/pda/detective
tab_pda = /obj/item/modular_computer/handheld/pda/security/detective
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/security/detective
tablet = /obj/item/modular_computer/handheld/preset/security/detective
backpack_contents = list(
/obj/item/storage/box/evidence = 1
@@ -229,7 +237,9 @@
uniform = /obj/item/clothing/under/rank/security
shoes = /obj/item/clothing/shoes/jackboots
l_ear = /obj/item/device/radio/headset/headset_sec
pda = /obj/item/device/pda/security
tab_pda = /obj/item/modular_computer/handheld/pda/security
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/security
tablet = /obj/item/modular_computer/handheld/preset/security
l_pocket = /obj/item/device/flash
backpack = /obj/item/storage/backpack/security
+1 -1
View File
@@ -123,7 +123,7 @@ var/list/whitelist = list()
return 0
if(!dbcon.IsConnected())
return TRUE
return 0
var/age_to_beat = 0
+1 -1
View File
@@ -275,7 +275,7 @@ update_flag
valve_open = !valve_open
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/W as obj, var/mob/user as mob)
if(!W.iswrench() && !istype(W, /obj/item/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
if(!W.iswrench() && !istype(W, /obj/item/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/modular_computer))
visible_message("<span class='warning'>\The [user] hits \the [src] with \a [W]!</span>")
src.health -= W.force
if(!istype(W, /obj/item/forensics))
+1 -6
View File
@@ -162,21 +162,16 @@
return
// OTHER
else if (can_use() && (istype(W, /obj/item/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
else if (can_use() && (istype(W, /obj/item/paper)) && isliving(user))
var/info = null
var/mob/living/U = user
var/obj/item/paper/X = null
var/obj/item/device/pda/P = null
var/itemname = ""
if(istype(W, /obj/item/paper))
X = W
itemname = X.name
info = X.info
else
P = W
itemname = P.name
info = P.notehtml
to_chat(U, "You hold \a [itemname] up to the camera ...")
for(var/mob/living/silicon/ai/O in living_mob_list)
var/entry = O.addCameraRecord(itemname,info)
+1 -111
View File
@@ -2,7 +2,7 @@
/obj/machinery/computer/message_monitor
name = "messaging monitor console"
desc = "Used to access and maintain data on messaging servers. Allows you to view PDA and requests console messages."
desc = "Used to access and maintain data on messaging servers. Allows you to view requests console messages."
icon_screen = "comm_logs"
light_color = "#00b000"
var/hack_icon = "error"
@@ -25,7 +25,6 @@
var/optioncount = 8
// Custom Message Properties
var/customsender = "System Administrator"
var/obj/item/device/pda/customrecepient = null
var/customjob = "Admin"
var/custommessage = "This is a test, please ignore."
@@ -36,7 +35,6 @@
/obj/machinery/computer/message_monitor/Destroy()
QDEL_NULL(spark_system)
linkedServer = null
customrecepient = null
return ..()
/obj/machinery/computer/message_monitor/attackby(obj/item/O as obj, mob/living/user as mob)
@@ -144,21 +142,6 @@
dat += "<br><hr><dd><span class='warning'>Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties.</span>"
//Message Logs
if(1)
var/index = 0
//var/recipient = "Unspecified" //name of the person
//var/sender = "Unspecified" //name of the sender
//var/message = "Blank" //transferred message
dat += "<center><A href='?src=\ref[src];back=1'>Back</a> - <A href='?src=\ref[src];refresh=1'>Refresh</center><hr>"
dat += "<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sender</th><th width='15%'>Recipient</th><th width='300px' word-wrap: break-word>Message</th></tr>"
for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += "<tr><td width = '5%'><center><A href='?src=\ref[src];delete=\ref[pda]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message]</td></tr>"
dat += "</table>"
//Hacking screen.
if(2)
if(istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot))
@@ -202,24 +185,6 @@
10010000001110100011010000110000101110100001000000111010<br>
001101001011011010110010100101110"}
//Fake messages
if(3)
dat += "<center><A href='?src=\ref[src];back=1'>Back</a> - <A href='?src=\ref[src];Reset=1'>Reset</a></center><hr>"
dat += {"<table border='1' width='100%'>
<tr><td width='20%'><A href='?src=\ref[src];select=Sender'>Sender</a></td>
<td width='20%'><A href='?src=\ref[src];select=RecJob'>Sender's Job</a></td>
<td width='20%'><A href='?src=\ref[src];select=Recepient'>Recipient</a></td>
<td width='300px' word-wrap: break-word><A href='?src=\ref[src];select=Message'>Message</a></td></tr>"}
//Sender - Sender's Job - Recepient - Message
//Al Green- Your Dad - Your Mom - WHAT UP!?
dat += {"<tr><td width='20%'>[customsender]</td>
<td width='20%'>[customjob]</td>
<td width='20%'>[customrecepient ? customrecepient.owner : "NONE"]</td>
<td width='300px'>[custommessage]</td></tr>"}
dat += "</table><br><center><A href='?src=\ref[src];select=Send'>Send</a></center>"
//Requests Console Logs
if(4)
@@ -285,7 +250,6 @@
/obj/machinery/computer/message_monitor/proc/ResetMessage()
customsender = "System Administrator"
customrecepient = null
custommessage = "This is a test, please ignore."
customjob = "Admin"
@@ -403,80 +367,6 @@
else
if(auth)
src.screen = 3
//Fake messaging selection - KEY REQUIRED
if (href_list["select"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
else
switch(href_list["select"])
//Reset
if("Reset")
ResetMessage()
//Select Your Name
if("Sender")
customsender = sanitize(input(usr, "Please enter the sender's name.") as text|null)
//Select Receiver
if("Recepient")
//Get out list of viable PDAs
var/list/obj/item/device/pda/sendPDAs = list()
for(var/obj/item/device/pda/P in PDAs)
if(!P.owner || P.toff || P.hidden) continue
sendPDAs += P
if(PDAs && PDAs.len > 0)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sendPDAs
else
customrecepient = null
//Enter custom job
if("RecJob")
customjob = sanitize(input(usr, "Please enter the sender's job.") as text|null)
//Enter message
if("Message")
custommessage = input(usr, "Please enter your message.") as text|null
custommessage = sanitize(custommessage)
//Send message
if("Send")
if(isnull(customsender) || customsender == "")
customsender = "UNKNOWN"
if(isnull(customrecepient))
message = "<span class='notice'>NOTICE: No recepient selected!</span>"
return src.attack_hand(usr)
if(isnull(custommessage) || custommessage == "")
message = "<span class='notice'>NOTICE: No message entered!</span>"
return src.attack_hand(usr)
var/obj/item/device/pda/PDARec = null
for (var/obj/item/device/pda/P in PDAs)
if (!P.owner || P.toff || P.hidden) continue
if(P.owner == customsender)
PDARec = P
//Sender isn't faking as someone who exists
if(isnull(PDARec))
src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
customrecepient.new_message(customsender, customsender, customjob, custommessage)
log_and_message_admins("sent a fake PDA message to: [customrecepient.owner] from: [customsender] - [customjob] message: [custommessage]")
//Sender is faking as someone who exists
else
src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
customrecepient.tnote.Add(list(list("sent" = 0, "owner" = "[PDARec.owner]", "job" = "[customjob]", "message" = "[custommessage]", "target" ="\ref[PDARec]")))
if(!customrecepient.conversations.Find("\ref[PDARec]"))
customrecepient.conversations.Add("\ref[PDARec]")
customrecepient.new_message(PDARec, custommessage)
log_and_message_admins("sent a fake PDA message to: [customrecepient.owner] from: [PDARec.owner] - [customjob] message: [custommessage]")
//Finally..
ResetMessage()
//Requests Console Logs - KEY REQUIRED
if(href_list["viewr"])
-2
View File
@@ -203,8 +203,6 @@ var/global/list/frozen_crew = list()
/obj/item/implant,
/obj/item/card/id,
/obj/item/modular_computer,
/obj/item/device/pda,
/obj/item/cartridge,
/obj/item/device/radio/headset,
/obj/item/device/encryptionkey
)
+10 -13
View File
@@ -64,7 +64,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/lid = 0
//End Form Integration
var/datum/announcement/announcement = new
var/list/obj/item/device/pda/alert_pdas = list() //The PDAs we alert upon a request receipt.
var/list/obj/item/modular_computer/alert_pdas = list() //The PDAs we alert upon a request receipt.
var/global/list/screen_overlays
/obj/machinery/requests_console/proc/generate_overlays(var/force = 0)
@@ -144,11 +144,6 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if (departmentType & RC_INFO)
req_console_information -= department
if (LAZYLEN(alert_pdas))
for (var/pp in alert_pdas)
var/obj/item/device/pda/P = pp
P.linked_consoles -= src
alert_pdas.Cut()
return ..()
@@ -200,7 +195,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["pda_list"] = list()
for (var/A in alert_pdas)
var/obj/item/device/pda/pda = A
var/obj/item/modular_computer/pda = A
data["pda_list"] += list(list("name" = alert_pdas[pda], "pda" = "\ref[pda]"))
data["lid"] = lid
@@ -251,6 +246,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(!MS.active) continue
MS.send_rc_message(ckey(href_list["department"]),department,log_msg,msgStamped,msgVerified,priority)
pass = 1
for (var/obj/item/modular_computer/P in alert_pdas)
P.get_notification(log_msg, 1, "[href_list["department"]] ([src])")
pass = 1
if(pass)
screen = RCS_SENTPASS
message_log += "<B>Message sent to [recipient]</B><BR>[message]"
@@ -278,25 +276,24 @@ var/list/obj/machinery/requests_console/allConsoles = list()
// Link a PDA
if(href_list["linkpda"])
var/obj/item/device/pda/pda = usr.get_active_hand()
var/obj/item/modular_computer/pda = usr.get_active_hand()
if (!pda || !istype(pda))
to_chat(usr, "<span class='warning'>You need to be holding a PDA to link it.</span>")
to_chat(usr, "<span class='warning'>You need to be holding a handheld computer to link it.</span>")
else if (pda in alert_pdas)
to_chat(usr, "<span class='notice'>\The [pda] appears to be already linked.</span>")
//Update the name real quick.
alert_pdas[pda] = pda.name
else
LAZYADD(pda.linked_consoles, src)
alert_pdas += pda
alert_pdas[pda] = pda.name
to_chat(usr, "<span class='notice'>You link \the [pda] to \the [src]. It will now ping upon the arrival of a fax to this machine.</span>")
to_chat(usr, "<span class='notice'>You link \the [pda] to \the [src]. It will now ping upon the arrival of a request to this machine.</span>")
// Unlink a PDA.
if(href_list["unlink"])
var/obj/item/device/pda/pda = locate(href_list["unlink"])
var/obj/item/modular_computer/pda = locate(href_list["unlink"])
if (pda && istype(pda))
if (pda in alert_pdas)
to_chat(usr, "<span class='notice'>You unlink [alert_pdas[pda]] from \the [src]. It will no longer be notified of new faxes.</span>")
to_chat(usr, "<span class='notice'>You unlink [alert_pdas[pda]] from \the [src]. It will no longer be notified of new requests.</span>")
alert_pdas -= pda
// Sort the forms.
+8 -11
View File
@@ -9,7 +9,7 @@
req_access = list() //what access it needs to link your pda
var/id = null
var/list/obj/item/device/pda/rings_pdas = list() //A list of PDAs to alert upon someone touching the machine
var/list/obj/item/modular_computer/rings_pdas = list() //A list of PDAs to alert upon someone touching the machine
var/listener/ringers
var/on = TRUE
var/department = "Somewhere" //whatever department/desk you put this thing
@@ -62,7 +62,7 @@
if(stat & (BROKEN|NOPOWER) || !istype(user,/mob/living))
return
if (istype(C, /obj/item/device/pda))
if (istype(C, /obj/item/modular_computer))
if(!check_access(C))
to_chat(user, "<span class='warning'>Access Denied.</span>")
return
@@ -108,12 +108,9 @@
playsound(src.loc, 'sound/machines/ringer.ogg', 50, 1)
for (var/obj/item/device/pda/pda in rings_pdas)
if (pda.toff || pda.message_silent)
continue
var/message = "Notification from \the [department]!"
pda.new_info(pda.message_silent, pda.ttone, "[icon2html(pda, viewers(get_turf(pda)))] <b>[message]</b>")
for (var/obj/item/modular_computer/P in rings_pdas)
var/message = "Attention required!"
P.get_notification(message, 1, "[capitalize(department)]")
addtimer(CALLBACK(src, .proc/unping), 45 SECONDS)
@@ -121,9 +118,9 @@
pinged = FALSE
update_icon()
/obj/machinery/ringer/proc/remove_pda(var/obj/item/device/pda/pda)
if (istype(pda))
rings_pdas -= pda
/obj/machinery/ringer/proc/remove_pda(var/obj/item/modular_computer/P)
if (istype(P))
rings_pdas -= P
/obj/machinery/ringer_button
name = "ringer button"
-5
View File
@@ -63,11 +63,6 @@
vend_id = "cola"
charges = 50
/obj/item/vending_refill/pda
name = "pdas resupply canister"
vend_id = "pdas"
charges = 38
/obj/item/vending_refill/smokes
name = "smokes resupply canister"
vend_id = "smokes"
+1 -33
View File
@@ -31,7 +31,6 @@
/obj/item/vending_refill/coffee = 1,
/obj/item/vending_refill/snack = 1,
/obj/item/vending_refill/cola = 1,
/obj/item/vending_refill/pda = 1,
/obj/item/vending_refill/smokes = 1,
/obj/item/vending_refill/meds = 1,
/obj/item/vending_refill/robust = 1,
@@ -141,8 +140,7 @@
/obj/item/device/assembly/prox_sensor = 5,
/obj/item/device/assembly/igniter = 3,
/obj/item/device/assembly/signaler = 4,
/obj/item/wirecutters = 1,
/obj/item/cartridge/signal = 4
/obj/item/wirecutters = 1
)
contraband = list(
/obj/item/device/flashlight = 5,
@@ -315,36 +313,6 @@
temperature_setting = -1
light_color = COLOR_GUNMETAL
//This one's from bay12
/obj/machinery/vending/cart
name = "PTech"
desc = "Cartridges for PDAs."
product_slogans = "Carts to go!"
icon_state = "cart"
deny_time = 14
req_access = list(access_hop)
vend_id = "pdas"
products = list(
/obj/item/cartridge/medical = 10,
/obj/item/cartridge/engineering = 10,
/obj/item/cartridge/security = 10,
/obj/item/cartridge/janitor = 10,
/obj/item/cartridge/signal/science = 10,
/obj/item/device/pda/heads = 10,
/obj/item/cartridge/captain = 3,
/obj/item/cartridge/quartermaster = 10
)
contraband = list(
/obj/item/cartridge/clown = 2
)
premium = list(
/obj/item/cartridge/captain = 1
)
restock_items = 1
light_color = COLOR_BLUE_GRAY
/obj/machinery/vending/cigarette
name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
desc = "If you want to get cancer, might as well do it in style!"
+1 -1
View File
@@ -434,7 +434,7 @@ var/list/global/slot_flags_enumeration = list(
if(!disable_warning)
to_chat(usr, "<span class='warning'>You somehow have a suit with no defined allowed items for suit storage, stop that.</span>")
return 0
if( !(istype(src, /obj/item/device/pda) || src.ispen() || is_type_in_list(src, H.wear_suit.allowed)) )
if( !(istype(src, /obj/item/modular_computer) || src.ispen() || is_type_in_list(src, H.wear_suit.allowed)) )
return 0
if(slot_handcuffed)
if(!istype(src, /obj/item/handcuffs))
File diff suppressed because it is too large Load Diff
-557
View File
@@ -1,557 +0,0 @@
/obj/item/cartridge
name = "generic cartridge"
desc = "A data cartridge for portable microcomputers."
icon = 'icons/obj/cartridge.dmi'
icon_state = "cart"
item_state = "electronic"
w_class = ITEMSIZE_TINY
drop_sound = 'sound/items/drop/component.ogg'
pickup_sound = 'sound/items/pickup/component.ogg'
var/obj/item/radio/integrated/radio = null
var/access_security = 0
var/access_engine = 0
var/access_atmos = 0
var/access_medical = 0
var/access_clown = 0
var/access_mime = 0
var/access_janitor = 0
// var/access_flora = 0
var/access_reagent_scanner = 0
var/access_remote_door = 0 // Control some blast doors remotely!!
var/remote_door_id = ""
var/access_status_display = 0
var/access_quartermaster = 0
var/access_detonate_pda = 0
var/access_hydroponics = 0
var/charges = 0
var/mode = null
var/menu
var/datum/record/general/active = null //General
var/list/listify_cache
var/selected_sensor = null // Power Sensor
var/message1 // used for status_displays
var/message2
var/list/stored_data = list()
/obj/item/cartridge/Destroy()
QDEL_NULL(radio)
return ..()
/obj/item/cartridge/engineering
name = "\improper Power-ON cartridge"
icon_state = "cart-e"
access_engine = 1
/obj/item/cartridge/atmos
name = "\improper BreatheDeep cartridge"
icon_state = "cart-a"
access_atmos = 1
/obj/item/cartridge/medical
name = "\improper Med-U cartridge"
icon_state = "cart-m"
access_medical = 1
/obj/item/cartridge/chemistry
name = "\improper ChemWhiz cartridge"
icon_state = "cart-chem"
access_reagent_scanner = 1
/obj/item/cartridge/security
name = "\improper R.O.B.U.S.T. cartridge"
icon_state = "cart-s"
access_security = 1
/obj/item/cartridge/security/Initialize()
. = ..()
radio = new /obj/item/radio/integrated/beepsky(src)
/obj/item/cartridge/detective
name = "\improper D.E.T.E.C.T. cartridge"
icon_state = "cart-s"
access_security = 1
access_medical = 1
/obj/item/cartridge/janitor
name = "\improper CustodiPRO cartridge"
desc = "The ultimate in clean-room design."
icon_state = "cart-j"
access_janitor = 1
/obj/item/cartridge/lawyer
name = "\improper P.R.O.V.E. cartridge"
icon_state = "cart-s"
access_security = 1
/obj/item/cartridge/clown
name = "\improper Honkworks 5.0 cartridge"
icon_state = "cart-clown"
access_clown = 1
charges = 5
/obj/item/cartridge/mime
name = "\improper Gestur-O 1000 cartridge"
icon_state = "cart-mi"
access_mime = 1
charges = 5
/*
/obj/item/cartridge/botanist
name = "Green Thumb v4.20"
icon_state = "cart-b"
access_flora = 1
*/
/obj/item/cartridge/signal
name = "generic signaler cartridge"
desc = "A data cartridge with an integrated radio signaler module."
/obj/item/cartridge/signal/science
name = "\improper Signal Ace 2 cartridge"
desc = "Complete with integrated radio signaler!"
icon_state = "cart-tox"
access_reagent_scanner = 1
access_atmos = 1
/obj/item/cartridge/signal/Initialize()
. = ..()
radio = new /obj/item/radio/integrated/signal(src)
/obj/item/cartridge/quartermaster
name = "\improper Space Parts & Space Vendors cartridge"
desc = "Perfect for the Quartermaster on the go!"
icon_state = "cart-q"
access_quartermaster = 1
/obj/item/cartridge/quartermaster/Initialize()
. = ..()
radio = new /obj/item/radio/integrated/mule(src)
/obj/item/cartridge/head
name = "\improper Easy-Record DELUXE"
icon_state = "cart-h"
access_status_display = 1
/obj/item/cartridge/hop
name = "\improper HumanResources9001 cartridge"
icon_state = "cart-h"
access_status_display = 1
access_quartermaster = 1
access_janitor = 1
access_security = 1
/obj/item/cartridge/hop/Initialize()
. = ..()
radio = new /obj/item/radio/integrated/mule(src)
/obj/item/cartridge/hos
name = "\improper R.O.B.U.S.T. DELUXE"
icon_state = "cart-hos"
access_status_display = 1
access_security = 1
/obj/item/cartridge/hos/Initialize()
. = ..()
radio = new /obj/item/radio/integrated/beepsky(src)
/obj/item/cartridge/ce
name = "\improper Power-On DELUXE"
icon_state = "cart-ce"
access_status_display = 1
access_engine = 1
access_atmos = 1
/obj/item/cartridge/cmo
name = "\improper Med-U DELUXE"
icon_state = "cart-cmo"
access_status_display = 1
access_reagent_scanner = 1
access_medical = 1
/obj/item/cartridge/rd
name = "\improper Signal Ace DELUXE"
icon_state = "cart-rd"
access_status_display = 1
access_reagent_scanner = 1
access_atmos = 1
/obj/item/cartridge/rd/Initialize()
. = ..()
radio = new /obj/item/radio/integrated/signal(src)
/obj/item/cartridge/captain
name = "\improper Value-PAK cartridge"
desc = "Now with 200% more value!"
icon_state = "cart-c"
access_quartermaster = 1
access_janitor = 1
access_engine = 1
access_security = 1
access_medical = 1
access_reagent_scanner = 1
access_status_display = 1
access_atmos = 1
/obj/item/cartridge/syndicate
name = "\improper Detomatix cartridge"
icon_state = "cart"
access_remote_door = 1
access_detonate_pda = 1
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
charges = 4
/obj/item/cartridge/proc/post_status(var/command, var/data1, var/data2)
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
if(!frequency) return
var/datum/signal/status_signal = new
status_signal.source = src
status_signal.transmission_method = 1
status_signal.data["command"] = command
switch(command)
if("message")
status_signal.data["msg1"] = data1
status_signal.data["msg2"] = data2
if(loc)
var/obj/item/PDA = loc
var/mob/user = PDA.fingerprintslast
if(istype(PDA.loc,/mob/living))
name = PDA.loc
log_admin("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
message_admins("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
if("alert")
status_signal.data["picture_state"] = data1
frequency.post_signal(src, status_signal)
/*
This generates the nano values of the cart menus.
Because we close the UI when we insert a new cart
we don't have to worry about null values on items
the user can't access. Well, unless they are href hacking.
But in that case their UI will just lock up.
*/
/obj/item/cartridge/proc/create_NanoUI_values(mob/user as mob)
var/values[0]
/* Signaler (Mode: 40) */
if(istype(radio,/obj/item/radio/integrated/signal) && (mode==40))
var/obj/item/radio/integrated/signal/R = radio
values["signal_freq"] = format_frequency(R.frequency)
values["signal_code"] = R.code
/* Station Display (Mode: 42) */
if(mode==42)
values["message1"] = message1 ? message1 : "(none)"
values["message2"] = message2 ? message2 : "(none)"
/* Power Monitor (Mode: 43 / 433) */
if(mode == 43 || mode == 433)
var/list/sensors = list()
var/obj/machinery/power/sensor/MS = null
for(var/obj/machinery/power/sensor/S in SSpower.all_sensors)
sensors.Add(list(list("name_tag" = S.name_tag)))
if(S.name_tag == selected_sensor)
MS = S
values["power_sensors"] = sensors
if(selected_sensor && MS)
values["sensor_reading"] = MS.return_reading_data()
/* General Records (Mode: 44 / 441 / 45 / 451) */
if(mode == 44 || mode == 441 || mode == 45 || mode ==451)
if(istype(active, /datum/record/general) && (active in SSrecords.records))
LAZYINITLIST(listify_cache)
if(listify_cache["type"] != RECORD_GENERAL)
listify_cache["type"] = RECORD_GENERAL
listify_cache["data"] = active.Listify()
values["general"] = listify_cache["data"]
values["general_exists"] = 1
else
values["general_exists"] = 0
/* Medical Records (Mode: 44 / 441) */
if(mode == 44 || mode == 441)
var/medData[0]
for(var/datum/record/general/R in sortRecord(SSrecords.records))
medData += list(list(Name = R.name,"ref" = "\ref[R]"))
values["medical_records"] = medData
if(istype(active, /datum/record/general) && (active in SSrecords.records) && istype(active.medical, /datum/record/medical))
LAZYINITLIST(listify_cache)
if(listify_cache["type"] != RECORD_MEDICAL)
listify_cache["type"] = RECORD_MEDICAL
listify_cache["data"] = active.Listify(0)
listify_cache["data"] += active.medical.Listify()
values["medical"] = listify_cache["data"]
values["medical_exists"] = 1
else
values["medical_exists"] = 0
/* Security Records (Mode:45 / 451) */
if(mode == 45 || mode == 451)
var/secData[0]
for(var/datum/record/general/R in sortRecord(SSrecords.records))
secData += list(list(Name = R.name,"ref" = "\ref[R]"))
values["security_records"] = secData
if(istype(active, /datum/record/general) && (active in SSrecords.records) && istype(active.security, /datum/record/security))
LAZYINITLIST(listify_cache)
if(listify_cache["type"] != RECORD_SECURITY)
listify_cache["type"] = RECORD_SECURITY
listify_cache["data"] = active.Listify(0)
listify_cache["data"] += active.security.Listify()
values["security"] = listify_cache["data"]
values["security_exists"] = 1
else
values["security_exists"] = 0
/* Security Bot Control (Mode: 46) */
if(mode==46)
var/botsData[0]
var/beepskyData[0]
if(istype(radio,/obj/item/radio/integrated/beepsky))
var/obj/item/radio/integrated/beepsky/SC = radio
beepskyData["active"] = SC.active
if(SC.active && !isnull(SC.botstatus))
var/area/loca = SC.botstatus["loca"]
var/loca_name = sanitize(loca.name)
beepskyData["botstatus"] = list("loca" = loca_name, "mode" = SC.botstatus["mode"])
else
beepskyData["botstatus"] = list("loca" = null, "mode" = -1)
var/botsCount=0
if(SC.botlist && SC.botlist.len)
for(var/mob/living/bot/B in SC.botlist)
botsCount++
if(B.loc)
botsData[++botsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
if(!botsData.len)
botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
beepskyData["bots"] = botsData
beepskyData["count"] = botsCount
else
beepskyData["active"] = 0
botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
beepskyData["botstatus"] = list("loca" = null, "mode" = null)
beepskyData["bots"] = botsData
beepskyData["count"] = 0
values["beepsky"] = beepskyData
/* MULEBOT Control (Mode: 48) */
if(mode==48)
var/muleData[0]
var/mulebotsData[0]
if(istype(radio,/obj/item/radio/integrated/mule))
var/obj/item/radio/integrated/mule/QC = radio
muleData["active"] = QC.active
if(QC.active && !isnull(QC.botstatus))
var/area/loca = QC.botstatus["loca"]
var/loca_name = sanitize(loca.name)
muleData["botstatus"] = list("loca" = loca_name, "mode" = QC.botstatus["mode"],"home"=QC.botstatus["home"],"powr" = QC.botstatus["powr"],"retn" =QC.botstatus["retn"], "pick"=QC.botstatus["pick"], "load" = QC.botstatus["load"], "dest" = sanitize(QC.botstatus["dest"]))
else
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
var/mulebotsCount=0
for(var/obj/machinery/bot/B in QC.botlist)
mulebotsCount++
if(B.loc)
mulebotsData[++mulebotsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
if(!mulebotsData.len)
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
muleData["bots"] = mulebotsData
muleData["count"] = mulebotsCount
else
muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
muleData["active"] = 0
mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
muleData["bots"] = mulebotsData
muleData["count"] = 0
values["mulebot"] = muleData
/* Supply Shuttle Requests Menu (Mode: 47) */
if(mode==47)
var/supplyData[0]
var/datum/shuttle/autodock/ferry/supply/shuttle = SScargo.shuttle
if (shuttle)
supplyData["shuttle_moving"] = shuttle.has_arrive_time()
supplyData["shuttle_eta"] = shuttle.eta_minutes()
supplyData["shuttle_loc"] = shuttle.at_station() ? "Station" : "Dock"
var/list/approved_orders = SScargo.get_orders_by_status("approved",1)
supplyData["approved"] = approved_orders
supplyData["approved_count"] = approved_orders.len
var/list/requested_orders = SScargo.get_orders_by_status("submitted",1)
supplyData["requests"] = requested_orders
supplyData["requests_count"] = requested_orders.len
values["supply"] = supplyData
/* Janitor Supplies Locator (Mode: 49) */
if(mode==49)
var/JaniData[0]
var/turf/cl = get_turf(src)
if(cl)
JaniData["user_loc"] = list("x" = cl.x, "y" = cl.y)
else
JaniData["user_loc"] = list("x" = 0, "y" = 0)
var/MopData[0]
for(var/obj/item/mop/M in global.janitorial_supplies)
var/turf/ml = get_turf(M)
if(ml)
if(ml.z != cl.z)
continue
var/direction = get_dir(src, M)
MopData[++MopData.len] = list ("x" = ml.x, "y" = ml.y, "dir" = uppertext(dir2text(direction)), "status" = M.reagents.total_volume ? "Wet" : "Dry")
if(!MopData.len)
MopData[++MopData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/BucketData[0]
for(var/obj/structure/mopbucket/B in global.janitorial_supplies)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
continue
var/direction = get_dir(src,B)
BucketData[++BucketData.len] = list ("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
if(!BucketData.len)
BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CbotData[0]
for(var/mob/living/bot/cleanbot/B in global.janitorial_supplies)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
continue
var/direction = get_dir(src,B)
CbotData[++CbotData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.on ? "Online" : "Offline")
if(!CbotData.len)
CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CartData[0]
for(var/obj/structure/janitorialcart/B in global.janitorial_supplies)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
continue
var/direction = get_dir(src,B)
CartData[++CartData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.get_short_status())
if(!CartData.len)
CartData[++CartData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
JaniData["mops"] = MopData
JaniData["buckets"] = BucketData
JaniData["cleanbots"] = CbotData
JaniData["carts"] = CartData
values["janitor"] = JaniData
return values
/obj/item/cartridge/Topic(href, href_list)
..()
if (!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr.unset_machine()
usr << browse(null, "window=pda")
return
switch(href_list["choice"])
if("Medical Records")
var/datum/record/general/R = locate(href_list["target"])
loc:mode = 441
mode = 441
if ((R in SSrecords.records) && istype(R))
active = R
if("Security Records")
var/datum/record/general/R = locate(href_list["target"])
loc:mode = 451
mode = 451
if ((R in SSrecords.records) && istype(R))
active = R
if("Send Signal")
spawn( 0 )
radio:send_signal("ACTIVATE")
return
if("Signal Frequency")
var/new_frequency = sanitize_frequency(radio:frequency + text2num(href_list["sfreq"]))
radio:set_frequency(new_frequency)
if("Signal Code")
radio:code += text2num(href_list["scode"])
radio:code = round(radio:code)
radio:code = min(100, radio:code)
radio:code = max(1, radio:code)
if("Status")
switch(href_list["statdisp"])
if("message")
post_status("message", message1, message2)
if("alert")
post_status("alert", href_list["alert"])
if("setmsg1")
message1 = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", message1) as text|null, 40), 40)
updateSelfDialog()
if("setmsg2")
message2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", message2) as text|null, 40), 40)
updateSelfDialog()
else
post_status(href_list["statdisp"])
if("Power Select")
selected_sensor = href_list["target"]
loc:mode = 433
mode = 433
if("Power Clear")
selected_sensor = null
loc:mode = 43
mode = 43
return 1
@@ -1,16 +0,0 @@
var/list/chatrooms = list()
/datum/chatroom
var/name = "Generic Chatroom"
var/list/logged_in = list()
var/list/logs = list() // chat logs
var/list/banned = list() // banned users
var/list/whitelist = list() // whitelisted users
var/list/muted = list()
var/topic = "" // topic message for the chatroom
var/password = "" // blank for no password.
var/operator = "" // name of the operator
/datum/chatroom/proc/attempt_connect(var/obj/item/device/pda/device, var/obj/password)
if(!device)
return
+3 -3
View File
@@ -3,14 +3,14 @@
desc = "An electronic radio system."
icon = 'icons/obj/module.dmi'
icon_state = "power_mod"
var/obj/item/device/pda/hostpda = null
var/obj/item/modular_computer/hostpda = null
var/on = 0 //Are we currently active??
var/menu_message = ""
/obj/item/radio/integrated/Initialize()
. = ..()
if (istype(loc.loc, /obj/item/device/pda))
if (istype(loc.loc, /obj/item/modular_computer))
hostpda = loc.loc
/obj/item/radio/integrated/Destroy()
@@ -67,7 +67,7 @@
/obj/item/radio/integrated/beepsky/Topic(href, href_list)
..()
var/obj/item/device/pda/PDA = src.hostpda
var/obj/item/modular_computer/PDA = src.hostpda
switch(href_list["op"])
@@ -51,6 +51,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
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/pda_code = ""
// The hidden uplink MUST be inside an obj/item's contents.
@@ -50,7 +50,6 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/soap, 5, 100)
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/concealed_cane, 50, 10)
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/detomatix, 20, 10)
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/parapen)
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealthy_weapons/cigarette_kit)
@@ -127,6 +127,7 @@ var/const/NO_EMAG_ACT = -50
var/assignment = null //can be alt title or the actual job
var/rank = null //actual job
var/dorm = 0 // determines if this ID has claimed a dorm already
var/chat_registered = FALSE // registration for NTNET chat
/obj/item/card/id/Destroy()
mob = null
@@ -159,7 +159,7 @@
/obj/item/clothing/glasses/hud/security,
/obj/item/device/flashlight/maglight,
/obj/item/device/flashlight/flare,
/obj/item/device/pda,
/obj/item/modular_computer/handheld,
/obj/item/device/radio/headset,
/obj/item/device/hailer,
/obj/item/device/megaphone,
@@ -222,7 +222,7 @@
/obj/item/ammo_magazine,
/obj/item/melee/baton,
/obj/item/device/flashlight,
/obj/item/device/pda,
/obj/item/modular_computer/handheld,
/obj/item/device/radio/headset,
/obj/item/melee,
/obj/item/shield/energy,
@@ -390,7 +390,7 @@
/obj/item/ammo_magazine,
/obj/item/melee/baton,
/obj/item/device/flashlight,
/obj/item/device/pda,
/obj/item/modular_computer/handheld,
/obj/item/device/radio/headset,
/obj/item/melee,
/obj/item/crowbar,
@@ -11,7 +11,7 @@
* Prescription glasses and drinking glass boxes,
* Condiment bottle and silly cup boxes,
* Donkpocket and monkeycube boxes,
* ID and security PDA cart boxes,
* ID boxes,
* Handcuff, mousetrap, and pillbottle boxes,
* Snap-pops,
* Replacement light boxes.
@@ -471,12 +471,6 @@
icon_state = "id"
starts_with = list(/obj/item/card/id = 7)
/obj/item/storage/box/seccarts
name = "box of spare R.O.B.U.S.T. Cartridges"
desc = "A box full of R.O.B.U.S.T. Cartridges, used by Security."
icon_state = "pda"
starts_with = list(/obj/item/cartridge/security = 7)
/obj/item/storage/box/handcuffs
name = "box of spare handcuffs"
desc = "A box full of handcuffs."
@@ -30,7 +30,7 @@
var/integrity = 3
var/volume = 70
var/manipulated_by = null //Used by _onclick/hud/screen_objects.dm internals to determine if someone has messed with our tank or not.
//If they have and we haven't scanned it with the PDA or gas analyzer then we might just breath whatever they put in it.
//If they have and we haven't scanned it with a computer or handheld gas analyzer then we might just breath whatever they put in it.
/obj/item/tank/Initialize()
. = ..()
-12
View File
@@ -523,7 +523,6 @@
/obj/machinery/vending/coffee = 1,
/obj/machinery/vending/snack = 1,
/obj/machinery/vending/cola = 1,
/obj/machinery/vending/cart = 1.5,
/obj/machinery/vending/cigarette = 1,
/obj/machinery/vending/medical = 1.2,
/obj/machinery/vending/phoronresearch = 0.7,
@@ -568,16 +567,6 @@
V.scan_id &= scan_id
/obj/random/pda_cart/item_to_spawn()
var/list/options = typesof(/obj/item/cartridge)
var/type = pick(options)
//reroll syndicate cartridge once to make it less common
if (type == /obj/item/cartridge/syndicate)
type = pick(options)
return type
/obj/random/glowstick
name = "random glowstick"
desc = "This is a random glowstick."
@@ -897,7 +886,6 @@
/obj/random/softcap = 0.5,
/obj/random/junk = 0.4,
/obj/random/medical = 0.4,
/obj/random/pda_cart = 0.5,
/obj/random/powercell = 0.8,
/obj/random/smalltank = 0.5,
/obj/random/soap = 0.5,
@@ -68,7 +68,6 @@
/obj/structure/closet/jcloset/fill()
new /obj/item/clothing/under/rank/janitor(src)
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/cartridge/janitor(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/softcap/janitor(src)
new /obj/item/clothing/head/bandana/janitor(src)
@@ -18,7 +18,7 @@
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/head/softcap/cargo(src)
new /obj/item/clothing/head/bandana/cargo(src)
new /obj/item/modular_computer/tablet/preset/custom_loadout/advanced/cargo_delivery(src)
new /obj/item/modular_computer/handheld/custom_loadout/advanced/cargo_delivery(src)
new /obj/item/export_scanner(src)
/obj/structure/closet/secure_closet/quartermaster
@@ -37,13 +37,12 @@
new /obj/item/device/radio/headset/qm(src)
new /obj/item/device/radio/headset/qm/alt(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/cartridge/quartermaster(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/tank/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/head/softcap/cargo(src)
new /obj/item/clothing/head/bandana/cargo(src)
new /obj/item/modular_computer/tablet/preset/custom_loadout/advanced/cargo_delivery(src)
new /obj/item/modular_computer/handheld/custom_loadout/advanced/cargo_delivery(src)
new /obj/item/export_scanner(src)
new /obj/item/device/orbital_dropper/drill(src)
@@ -25,7 +25,6 @@
new /obj/item/clothing/gloves/yellow/specialu(src)
new /obj/item/clothing/gloves/yellow/specialt(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/cartridge/ce(src)
new /obj/item/device/radio/headset/heads/ce(src)
new /obj/item/device/radio/headset/heads/ce/alt(src)
new /obj/item/storage/toolbox/mechanical(src)
@@ -129,7 +128,6 @@
new /obj/item/device/radio/headset/headset_eng/alt(src)
new /obj/item/clothing/suit/storage/hazardvest(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/cartridge/engineering(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/accessory/storage/overalls/engineer(src)
@@ -160,7 +158,6 @@
new /obj/item/device/radio/headset/headset_eng/alt(src)
new /obj/item/clothing/suit/storage/hazardvest/blue/atmos(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/cartridge/atmos(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/accessory/storage/overalls/engineer(src)
new /obj/item/rfd/piping(src)
@@ -108,7 +108,6 @@
new /obj/item/clothing/head/bio_hood/cmo(src)
new /obj/item/clothing/shoes/medical(src)
new /obj/item/clothing/under/rank/chief_medical_officer(src)
new /obj/item/cartridge/cmo(src)
new /obj/item/clothing/gloves/latex/nitrile(src)
new /obj/item/device/radio/headset/heads/cmo(src)
new /obj/item/device/radio/headset/heads/cmo/alt(src)
@@ -35,7 +35,6 @@
new /obj/item/clothing/under/rank/research_director/rdalt(src)
new /obj/item/clothing/under/rank/research_director/dress_rd(src)
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
new /obj/item/cartridge/rd(src)
new /obj/item/clothing/shoes/science(src)
new /obj/item/clothing/shoes/laceup/brown(src)
new /obj/item/clothing/gloves/latex/nitrile(src)
@@ -29,7 +29,6 @@
//Tools
new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/device/radio/headset/heads/captain/alt(src)
new /obj/item/cartridge/captain(src)
new /obj/item/gun/energy/disruptorpistol(src)
new /obj/item/device/flash(src)
new /obj/item/melee/telebaton(src)
@@ -81,7 +80,6 @@
new /obj/item/clothing/suit/storage/vest(src)
new /obj/item/clothing/head/helmet(src)
//Tools
new /obj/item/cartridge/hop(src)
new /obj/item/device/radio/headset/heads/hop(src)
new /obj/item/device/radio/headset/heads/hop/alt(src)
new /obj/item/gun/energy/disruptorpistol(src)
@@ -141,7 +139,6 @@
new /obj/item/clothing/accessory/badge/hos(src)
new /obj/item/clothing/gloves/black_leather(src)
//Tools
new /obj/item/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/device/radio/headset/heads/hos/alt(src)
new /obj/item/storage/box/tranquilizer(src)
@@ -227,7 +224,6 @@
new /obj/item/clothing/accessory/badge/warden(src)
new /obj/item/clothing/gloves/black_leather(src)
//Tools
new /obj/item/cartridge/security(src)
new /obj/item/device/radio/headset/headset_warden(src)
new /obj/item/device/radio/headset/headset_warden/alt(src)
new /obj/item/clothing/glasses/sunglasses/sechud/aviator(src)
@@ -97,7 +97,6 @@
new /obj/item/clothing/under/rank/dress/officer(src)
new /obj/item/clothing/head/dress/officer(src)
new /obj/item/clothing/suit/storage/vest(src)
new /obj/item/cartridge/captain(src)
new /obj/item/clothing/head/helmet(src)
new /obj/item/clothing/shoes/laceup(src)
new /obj/item/device/radio/headset/heads/captain(src)
@@ -57,7 +57,7 @@
new /obj/item/pinpointer/nukeop(src)
new /obj/item/pinpointer/nukeop(src)
new /obj/item/pinpointer/nukeop(src)
new /obj/item/device/pda/syndicate(src)
new /obj/item/modular_computer/handheld/pda/syndicate(src)
var/obj/item/device/radio/uplink/U = new(src)
U.hidden_uplink.uses = 40
return
+1 -15
View File
@@ -67,7 +67,7 @@
else
bst.equip_to_slot_or_del(new /obj/item/storage/box/ids(bst.back), slot_in_backpack)
bst.equip_to_slot_or_del(new /obj/item/device/t_scanner(bst.back), slot_in_backpack)
bst.equip_to_slot_or_del(new /obj/item/device/pda/captain/bst(bst.back), slot_in_backpack)
bst.equip_to_slot_or_del(new /obj/item/modular_computer/handheld/pda/command/bst(bst.back), slot_in_backpack)
bst.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(bst.back), slot_in_backpack)
bst.equip_to_slot_or_del(new /obj/item/research(bst.back), slot_in_backpack)
@@ -499,19 +499,5 @@
else
..()
/obj/item/device/pda/captain/bst
hidden = 1
message_silent = 1
// ttone = "DO SOMETHING HERE"
/obj/item/device/pda/captain/bst/attack_hand()
if(!usr)
return
if(!istype(usr, /mob/living/carbon/human/bst))
to_chat(usr, SPAN_ALERT("Your hand seems to go right through the [src]. It's like it doesn't exist."))
return
else
..()
/mob/living/carbon/human/bst/restrained()
return 0
+1 -1
View File
@@ -87,7 +87,7 @@
/datum/export/radio
cost = 5
unit_name = "radio"
export_types = list(/obj/item/radio)
export_types = list(/obj/item/device/radio)
/datum/export/rfd_construction
@@ -178,10 +178,6 @@ STOCK_ITEM_UNCOMMON(atmosfiresuit, 2)
new /obj/item/clothing/head/hardhat/red/atmos(L)
new /obj/item/clothing/suit/fire/atmos(L)
STOCK_ITEM_UNCOMMON(pdacart, 3)
for(var/i in 1 to rand(1, 3))
new /obj/random/pda_cart(L)
STOCK_ITEM_UNCOMMON(debugger, 2)
new /obj/item/device/debugger(L)
@@ -367,7 +363,7 @@ STOCK_ITEM_UNCOMMON(apiary, 1)
new /obj/item/honey_frame(L)
STOCK_ITEM_UNCOMMON(wristbound, 0.5)
var/obj/item/modular_computer/wristbound/preset/P = pick(subtypesof(/obj/item/modular_computer/wristbound/preset))
var/obj/item/modular_computer/handheld/wristbound/preset/P = pick(subtypesof(/obj/item/modular_computer/handheld/wristbound/preset))
new P(L)
STOCK_ITEM_UNCOMMON(pops, 0.5)
-6
View File
@@ -1,9 +1,3 @@
//CCIAA's PDA.
/obj/item/device/pda/central
default_cartridge = /obj/item/cartridge/captain
icon_state = "pda-h"
detonate = 0
//CCIAA's tape recorder
/obj/item/device/taperecorder/cciaa
w_class = ITEMSIZE_TINY
-3
View File
@@ -540,9 +540,6 @@ var/list/asset_datums = list()
/datum/asset/spritesheet/vending/cola
v_type = /obj/machinery/vending/cola
/datum/asset/spritesheet/vending/cart
v_type = /obj/machinery/vending/cart
/datum/asset/spritesheet/vending/cigarette
v_type = /obj/machinery/vending/cigarette
@@ -11,12 +11,14 @@
S["all_underwear_metadata"] >> pref.all_underwear_metadata
S["backbag"] >> pref.backbag
S["backbag_style"] >> pref.backbag_style
S["pda_choice"] >> pref.pda_choice
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["all_underwear"] << pref.all_underwear
S["all_underwear_metadata"] << pref.all_underwear_metadata
S["backbag"] << pref.backbag
S["backbag_style"] << pref.backbag_style
S["pda_choice"] << pref.pda_choice
/datum/category_item/player_setup_item/general/equipment/gather_load_query()
return list(
@@ -25,7 +27,8 @@
"all_underwear",
"all_underwear_metadata",
"backbag",
"backbag_style"
"backbag_style",
"pda_choice"
),
"args" = list("id")
)
@@ -41,6 +44,7 @@
"all_underwear_metadata",
"backbag",
"backbag_style",
"pda_choice",
"id" = 1,
"ckey" = 1
)
@@ -52,6 +56,7 @@
"all_underwear_metadata" = json_encode(pref.all_underwear_metadata),
"backbag" = pref.backbag,
"backbag_style" = pref.backbag_style,
"pda_choice" = pref.pda_choice,
"id" = pref.current_character,
"ckey" = PREF_CLIENT_CKEY
)
@@ -60,6 +65,7 @@
if (sql_load)
pref.backbag = text2num(pref.backbag)
pref.backbag_style = text2num(pref.backbag_style)
pref.pda_choice = text2num(pref.pda_choice)
if(istext(pref.all_underwear))
var/before = pref.all_underwear
try
@@ -102,6 +108,7 @@
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
pref.backbag_style = sanitize_integer(pref.backbag_style, 1, backbagstyles.len, initial(pref.backbag_style))
pref.pda_choice = sanitize_integer(pref.pda_choice, 1, pdalist.len, initial(pref.pda_choice))
/datum/category_item/player_setup_item/general/equipment/content(var/mob/user)
. = list()
@@ -119,6 +126,7 @@
. += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>"
. += "Backpack Style: <a href='?src=\ref[src];change_backpack_style=1'><b>[backbagstyles[pref.backbag_style]]</b></a><br>"
. += "PDA Type: <a href='?src=\ref[src];change_pda=1'><b>[pdalist[pref.pda_choice]]</b></a><br>"
return jointext(., null)
@@ -151,6 +159,12 @@
pref.backbag_style = backbagstyles.Find(new_backbag)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["change_pda"])
var/new_pda = input(user, "Choose your character's PDA type:", "Character Preference", pdalist[pref.pda_choice]) as null|anything in pdalist
if(!isnull(new_pda) && CanUseTopic(user))
pref.pda_choice = pdalist.Find(new_pda)
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["change_underwear"])
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]]
if(!UWC)
@@ -1,6 +1,6 @@
/datum/gear/computer
display_name = "tablet"
path = /obj/item/modular_computer/tablet/preset/custom_loadout/cheap
path = /obj/item/modular_computer/handheld/custom_loadout/cheap
sort_category = "Modular Computers"
cost = 2
@@ -9,66 +9,66 @@
path = /obj/item/modular_computer/laptop/preset
cost = 3
/datum/gear/computer/wristbound
/datum/gear/computer/handheld/wristbound
display_name = "wristbound computer"
path = /obj/item/modular_computer/wristbound/preset/cheap/generic
path = /obj/item/modular_computer/handheld/wristbound/preset/cheap/generic
/datum/gear/computer/wristbound/cargo
/datum/gear/computer/handheld/wristbound/cargo
display_name = "wristbound computer (Cargo)"
path = /obj/item/modular_computer/wristbound/preset/advanced/cargo
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/cargo
allowed_roles = list("Cargo Technician", "Shaft Miner", "Quartermaster")
/datum/gear/computer/wristbound/engineering
/datum/gear/computer/handheld/wristbound/engineering
display_name = "wristbound computer (Engineering)"
path = /obj/item/modular_computer/wristbound/preset/advanced/engineering
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/engineering
allowed_roles = list("Station Engineer", "Engineering Apprentince", "Atmospheric Technician", "Engineering Apprentice")
/datum/gear/computer/wristbound/medical
/datum/gear/computer/handheld/wristbound/medical
display_name = "wristbound computer (Medical)"
path = /obj/item/modular_computer/wristbound/preset/advanced/medical
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/medical
allowed_roles = list("Physician", "Surgeon", "Medical Intern", "Pharmacist", "Psychiatrist", "Emergency Medical Technician")
/datum/gear/computer/wristbound/security
/datum/gear/computer/handheld/wristbound/security
display_name = "wristbound computer (Security)"
path = /obj/item/modular_computer/wristbound/preset/advanced/security
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/security
allowed_roles = list("Security Officer", "Warden", "Security Cadet")
/datum/gear/computer/wristbound/security/investigations
/datum/gear/computer/handheld/wristbound/security/investigations
display_name = "wristbound computer (Security Investigations)"
path = /obj/item/modular_computer/wristbound/preset/advanced/security/investigations
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/security/investigations
allowed_roles = list("Detective", "Forensic Technician")
/datum/gear/computer/wristbound/security/research
/datum/gear/computer/handheld/wristbound/security/research
display_name = "wristbound computer (Research)"
path = /obj/item/modular_computer/wristbound/preset/advanced/research
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/research
allowed_roles = list("Scientist", "Lab Assistant", "Roboticist", "Xenobiologist")
/datum/gear/computer/wristbound/ce
/datum/gear/computer/handheld/wristbound/ce
display_name = "wristbound computer (Chief Engineer)"
path = /obj/item/modular_computer/wristbound/preset/advanced/command/ce
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/ce
allowed_roles = list("Chief Engineer")
/datum/gear/computer/wristbound/rd
/datum/gear/computer/handheld/wristbound/rd
display_name = "wristbound computer (Research Director)"
path = /obj/item/modular_computer/wristbound/preset/advanced/command/rd
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/rd
allowed_roles = list("Research Director")
/datum/gear/computer/wristbound/cmo
/datum/gear/computer/handheld/wristbound/cmo
display_name = "wristbound computer (Chief Medical Officer)"
path = /obj/item/modular_computer/wristbound/preset/advanced/command/cmo
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/cmo
allowed_roles = list("Chief Medical Officer")
/datum/gear/computer/wristbound/hop
/datum/gear/computer/handheld/wristbound/hop
display_name = "wristbound computer (Head of Personnel)"
path = /obj/item/modular_computer/wristbound/preset/advanced/command/hop
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/hop
allowed_roles = list("Head of Personnel")
/datum/gear/computer/wristbound/hos
/datum/gear/computer/handheld/wristbound/hos
display_name = "wristbound computer (Head of Security)"
path = /obj/item/modular_computer/wristbound/preset/advanced/command/hos
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/hos
allowed_roles = list("Head of Security")
/datum/gear/computer/wristbound/captain
/datum/gear/computer/handheld/wristbound/captain
display_name = "wristbound computer (Captain)"
path = /obj/item/modular_computer/wristbound/preset/advanced/command/captain
path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/command/captain
allowed_roles = list("Captain")
+6
View File
@@ -42,6 +42,7 @@ datum/preferences
var/b_type = "A+" //blood type (not-chooseable)
var/backbag = 2 //backpack type
var/backbag_style = 1
var/pda_choice = 2
var/h_style = "Bald" //Hair type
var/hair_colour = "#000000" //Hair colour hex value, for SQL loading
var/r_hair = 0 //Hair color
@@ -469,6 +470,11 @@ datum/preferences
character.backbag = backbag
character.backbag_style = backbag_style
if(pda_choice > 8 || pda_choice < 1)
pda_choice = 2
character.pda_choice = pda_choice
if(icon_updates)
character.force_update_limbs()
character.update_mutations(0)
+3 -3
View File
@@ -219,12 +219,12 @@
if(!has_title)
continue
// ID cards and PDAs are applied directly to the existing object rather than spawned fresh.
// ID cards and MCs are applied directly to the existing object rather than spawned fresh.
var/obj/item/existing_item
if(citem.item_path == /obj/item/card/id)
existing_item = locate(/obj/item/card/id) in M.get_contents() //TODO: Improve this ?
else if(citem.item_path == /obj/item/device/pda)
existing_item = locate(/obj/item/device/pda) in M.contents
else if(citem.item_path == /obj/item/modular_computer)
existing_item = locate(/obj/item/modular_computer) in M.contents
// Spawn and equip the item.
if(existing_item)
-1
View File
@@ -137,7 +137,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 10),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 75, list(ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_GARDENER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Clogged Vents", /datum/event/vent_clog, 55),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "False Alarm", /datum/event/false_alarm, 100),
-1
View File
@@ -53,7 +53,6 @@ var/list/event_last_fired = list()
possibleEvents[/datum/event/economic_event] = 300
possibleEvents[/datum/event/mundane_news] = 300
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
if(account_hack_attempted)
possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200)
-191
View File
@@ -1,191 +0,0 @@
/datum/event/pda_spam
endWhen = 36000
var/last_spam_time = 0
var/obj/machinery/message_server/useMS
/datum/event/pda_spam/setup()
last_spam_time = world.time
pick_message_server()
/datum/event/pda_spam/proc/pick_message_server()
if(message_servers)
for (var/obj/machinery/message_server/MS in message_servers)
if(MS.active)
useMS = MS
break
/datum/event/pda_spam/tick()
if(world.time > last_spam_time + 3000)
//if there's no spam managed to get to receiver for five minutes, give up
kill()
return
if(!useMS || !useMS.active)
useMS = null
pick_message_server()
if(useMS)
if(prob(5))
// /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
var/obj/item/device/pda/P
var/list/viables = list()
for(var/obj/item/device/pda/check_pda in PDAs)
if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden)
continue
viables.Add(check_pda)
if(!viables.len)
return
P = pick(viables)
var/sender
var/message
switch(pick(1,2,3,4,5,6,7,8))
if(1)
sender = pick("MaxBet","MaxBet Online Casino",\
"There is no better time to register",\
"I'm excited for you to join us")
message = pick("Triple deposits are waiting for you at MaxBet Online when you register to play with us.",\
"You can qualify for a 200% Welcome Bonus at MaxBet Online when you sign up today.",\
"Once you are a player with MaxBet, you will also receive lucrative weekly and monthly promotions.",\
"You will be able to enjoy over 450 top-flight casino games at MaxBet.")
if(2)
sender = pick("QuickDatingSystem",\
"Find your russian bride",\
"Tajaran beauties are waiting",\
"Find your secret skrell crush",\
"Beautiful unathi brides",\
"Hyperrealistic pleasure-bots available",\
"Zo'ra broods in need of genetic material!")
message = pick("Your profile caught my attention and I wanted to write and say hello (QuickDating).",\
"If you will write to me on my email [pick(first_names_female)]@[pick(last_names)]@[current_map.company_name].[pick("ru","ck","tj","ur","nt")] I shall necessarily send you a photo (QuickDating).",\
"I want that we write each other and I hope, that you will like my profile and you will answer me (QuickDating).",\
"You have (1) new message!",\
"You have (2) new profile views!",\
"You have a secret admirer! Meet them today on 4EverYung.nt",\
"Single farmer? Dating with us helps meet your best match.")
if(3)
sender = pick("Galactic Payments Association",\
"Better Business Bureau",\
"Tau Ceti E-Payments",\
"NAnoTransen Finance Deparmtent",\
"IDrist Corp",\
"Luxury Replicas")
message = pick("Luxury watches for Blowout sale prices!",\
"Watches, Jewelry & Accessories, Bags & Wallets !",\
"Deposit 100$ and get 300$ totally free!",\
" 100K NT.|WOWGOLD õnly $89 <HOT>",\
"We have been filed with a complaint from one of your customers in respect of their business relations with you.",\
"We kindly ask you to open the COMPLAINT REPORT (attached) to reply on this complaint..",\
"Thizzz izz the Idrizz bank, we need your pazzzword, plzzz click here.",\
"Your Idris Account has been Limited! Click here for more informtion",\
"Your password has been upated. Please click to confirm.",\
"This is the Reclamation Unit bureau. We ask that you reply or a unit will be sent to your location.",\
"This staff assistant is making mad credits and basically, you're fucking stupid. How? ...Just Watch The Free Video >")
if(4)
sender = pick("Buy Dr. Maxman",\
"Having dysfuctional troubles?")
message = pick("DR MAXMAN: REAL Doctors, REAL Science, REAL Results!",\
"Dr. Maxman was created by George Acuilar, M.D, a [current_map.boss_short] Certified Urologist who has treated over 70,000 patients sector wide with 'male problems'.",\
"After seven years of research, Dr Acuilar and his team came up with this simple breakthrough male enhancement formula.",\
"Men of all species report AMAZING increases in length, width and stamina.",
"Discovery of this ONE Vaurca pheremone has led to years of genital growth progress! Sign on now!",\
"Is your sexlife growing dull? Your late-night sessions growing short? Have you considered Unathi testicle transplants? Greater stamina, greater virility, greater fun.")
if(5)
sender = pick("Dr","Crown prince","King Regent","Professor","Captain")
sender += " " + pick("Robert","Alfred","Josephat","Kingsley","Sehi","Zbahi")
sender += " " + pick("Mugawe","Nkem","Gbatokwia","Nchekwube","Ndim","Ndubisi")
message = pick("YOUR FUND HAS BEEN MOVED TO [pick("Sol","Biesel","Dominia","Elyra","Qerrbalak","Adhomai","NTCC Odin","Hephaestus","NSS Upsilon")] DEVELOPMENTARY BANK FOR ONWARD REMITTANCE.",\
"We are happy to inform you that due to the delay, we have been instructed to IMMEDIATELY deposit all funds into your account",\
"Dear fund beneficiary, We have please to inform you that overdue funds payment has finally been approved and released for payment",\
"Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\
"Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to receive the full sum of my lifetime savings of 1.5 billion credits")
if(6)
var/pornography = pick("www.wetskrell.nt",\
"www.badkitty.nt",\
"www.scalesnstuff.nt",\
"www.spacelube.nt",\
"www.pervertedprogramming.nt",\
"www.risquerobots.tc",\
"www.clanked.tc",\
"www.filledsockets.tc",\
"www.hivenetmingle.nt")
sender = pick("[current_map.company_name] Morale Divison",\
"Feeling Lonely?",\
"Bored?",\
"[pornography]")
message = pick("The [current_map.company_name] Morale Division wishes to provide you with quality entertainment sites.",\
"[pornography] is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\
"[pornography] only provides the higest quality of male entertaiment to [current_map.company_name] Employees.",\
"district14.nt : Find local Scrapheap babes near your area. Click to learn more.",\
"Simply enter your [current_map.company_name] Bank account system number and pin. With three easy steps this service could be yours!",
"Warning! Your connection is not private. Attackers might be trying to steal your information from [pornography] (for example, passwords, messages, or credit cards). Click to learn more.")
if(7)
var/genre = pick("detective crime thriller","crime drama","saturday cartoon","coming of age drama","hospital drama","space opera","sci-fi epic","historical drama","murder mystery","soft-core thriller","S-movie")
var/premise = pick("Attack","Revenge", "Apocalypse","War","Army","Night","House","Invasion","Mountain","Rise","Rage")
var/list/noun = list("Maniac","Commando","Alien","Goblin","Skeleton","Bird","Raider","Hive","Snake","Teacher","Zombie","Wizard","Dragon","Octopus","Dinosaur","Thing","Changeling","Cult","Vampire","Ninja","Agent","Blob","People","Man","Woman","Clown")
var/list/adjective = list("Killer","Skrell","Unathi","Devil","Satan","Evil","Unnameable","Antimatter","Robot","Vaurca","Human","Ancient","Vampire","Sleeper","Secret","Nazi","Space-Nazi","Communist","Immortal","Demon","Murderous","Collosal","Undead","Sex")
var/list/relation = list("Neighbour","Priest","Brother","Mother","Father","Sister","Teacher","Parents","King","Son","Daughter","Friends","Self")
var/list/action = list("Killed","Conquered","Became","Joined","Tricked","Absorbed","Frightened","Seduced","Married")
var/list/place = list("Outer Space","School","Center of the Earth","Sedantis IV","Tau Ceti","Moghes","Holy Terra","Earth","Our Own Minds","the Village Green","Two Doors Down the Block","the Town Over","the Ancient Past","the Distant Future","Kentucky")
var/plural = "s"
if(prob(50))
plural = ""
var/movie_title = pick("[premise] of the [pick(adjective)] [pick(noun)][plural]","[pick(adjective)] [pick(noun)][plural] vs. [pick(adjective)] [pick(noun)]s from [pick(place)]","The Night My [pick(relation)] [pick(action)] [pick("a [pick(adjective)] [pick(noun)]",pick(place))]")
if(prob(50))
movie_title = uppertext(movie_title)
sender = pick("You have won free tickets!",\
"Click here to claim your prize!",\
"You are the 1000th vistor!",\
"You are our lucky grand prize winner!")
message = pick("You have won tickets to the newest [genre] \"[movie_title]\"!",\
"Click here to receive your new iFrame 7")
if(8)
sender = pick("[pick(first_names_female,first_names_male)][pick(last_names)]@[current_map.company_name].[pick("ru","ck","tj","ur","nt")]",\
"Cindy Kate messenging",\
"MirandaTrasen@NanoTrasen.nt")
message = pick("We know who you are. Expect us.",\
"Hi [P.owner]! Remember me from high-school? Well I have this great business deal proposition....",\
"If you don't forward this message to 8 more crewmembers your head will die in their sleep.",\
"If you break the chain you will have bad luck for the rest of you're miserable life. Forward to 10 more crewmembers.",\
"Forward this email to 3.14 more crewmembers and receive 10,000 cR!",\
"[P.owner]! I come from the future to give warning! The code has become self-referential! Run while you still can!")
if (useMS.send_pda_message("[P.owner]", sender, message)) //Message been filtered by spam filter.
return
last_spam_time = world.time
if (prob(50)) //Give the AI an increased chance to intercept the message
for(var/mob/living/silicon/ai/ai in mob_list)
// Allows other AIs to intercept the message but the AI won't intercept their own message.
if(ai.ai_pda != P && ai.ai_pda != src)
ai.show_message("<i>Intercepted message from <b>[sender]</b></i> (Unknown / spam?) <i>to <b>[P:owner]</b>: [message]</i>")
//Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window.
//P.tnote += "<i><b>&larr; From [sender] (Unknown / spam?):</b></i><br>[message]<br>"
if (!P.message_silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
for (var/mob/O in hearers(3, P.loc))
if(!P.message_silent)
O.show_message(text("[icon2html(P, O)] *[P.ttone]*"))
//Search for holder of the PDA.
var/mob/living/L = null
if(P.loc && isliving(P.loc))
L = P.loc
//Maybe they are a pAI!
else
L = get(P, /mob/living/silicon)
if(L)
to_chat(L, "[icon2html(P, L)] <b>Message from [sender] (Unknown / spam?), </b>\"[message]\" (Unable to Reply)")
@@ -115,7 +115,7 @@
uniform = /obj/item/clothing/under/rank/chaplain
shoes = /obj/item/clothing/shoes/black
pda = /obj/item/device/pda/chaplain
pda = /obj/item/modular_computer/handheld/pda/civilian/chaplain
backpack_contents = list(
/obj/item/storage/bible/fluff/oscar_bible = 1,
@@ -135,7 +135,7 @@
uniform = /obj/item/clothing/under/rank/idris
id = /obj/item/card/id/idris
pda = /obj/item/device/pda/lawyer
pda = /obj/item/modular_computer/handheld/pda/civilian/lawyer
shoes = /obj/item/clothing/shoes/laceup
glasses = /obj/item/clothing/glasses/sunglasses/big
l_hand = /obj/item/storage/briefcase
@@ -221,7 +221,7 @@
suit_store = /obj/item/tank/oxygen
shoes = /obj/item/clothing/shoes/jackboots
id = /obj/item/card/id/eridani
pda = /obj/item/device/pda/security
pda = /obj/item/modular_computer/handheld/pda/security
belt = /obj/item/gun/energy/gun/nuclear
uniform = /obj/item/clothing/under/rank/security/eridani
+1 -1
View File
@@ -385,7 +385,7 @@ datum/ghosttrap/pai/transfer_personality(var/mob/candidate, var/mob/living/silic
list_as_special_role = FALSE
/datum/ghosttrap/traitor/welcome_candidate(var/mob/target)
to_chat(target, "<span class ='notice'> Check your notes for your PDA code!</span>")
to_chat(target, "<span class ='notice'> Check your notes for your uplink code!</span>")
return 1
/datum/ghosttrap/vampire
+1 -5
View File
@@ -94,14 +94,10 @@
/datum/hallucination/pda/start()
var/list/sender = SShallucinations.message_sender
var/hall_job = "Unknown"
if(ishuman(holder))
var/mob/living/carbon/human/M = holder
hall_job = M.job
for(var/mob/living/carbon/human/H in living_mob_list)
if(H.client && !player_is_antag(H, only_offstation_roles = TRUE)) //adds current players to default list to provide variety. leaves out offstation antags.
sender += H
to_chat(holder, "<b>Message from [pick(sender)] to [holder.name] ([hall_job]),</b> \"[pick(SShallucinations.hallucinated_phrases)]\" (<FONT color = blue><u>reply</u></FONT>)")
to_chat(holder, FONT_SMALL("<i>[pick(sender)]</i>: [pick(SShallucinations.hallucinated_phrases)] (<FONT color = blue><u>reply</u></FONT>)"))
sound_to(holder, 'sound/machines/twobeep.ogg')
//hallucinate someone else doing something.
+1 -3
View File
@@ -288,7 +288,6 @@ var/list/worths = list(
/obj/item/orion_ship = 100,
/obj/item/airlock_electronics/secure = 600,
/obj/item/airlock_electronics = 300,
/obj/item/cartridge = 50,
/obj/item/aiModule = 3000,
/obj/item/autopsy_scanner = 180,
//CARDS,
@@ -606,7 +605,6 @@ var/list/worths = list(
/obj/item/device/slime_scanner = 300,
/obj/item/device/transfer_valve = 50,
/obj/item/device/violin = 250,
/obj/item/device/pda = 60,
/obj/item/device/radio = 150,
/obj/item/device/assembly/igniter = 15,
/obj/item/device/assembly/infra = 10,
@@ -626,7 +624,7 @@ var/list/worths = list(
/obj/item/slime_extract = 200,
/obj/item/robot_parts/robot_component = 250,
/obj/item/robot_parts = 30,
/obj/item/modular_computer/tablet = 1300,
/obj/item/modular_computer/handheld = 1300,
/obj/item/modular_computer = 4000,
/obj/item/solar_assembly = 680,
/obj/item/ammo_casing/cannon = 200,
+1 -1
View File
@@ -119,7 +119,7 @@
list(
new /datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, time = 25, one_per_turf = TRUE),
new /datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, time = 25),
new /datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, time = 25)
new /datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/handheld, 5, time = 25)
))
recipes += new /datum/stack_recipe_list("[display_name] weaponry",
+2 -2
View File
@@ -121,7 +121,7 @@
new /obj/item/storage/backpack/clown(src)
new /obj/item/clothing/under/rank/clown(src)
new /obj/item/clothing/shoes/clown_shoes(src)
new /obj/item/device/pda/clown(src)
new /obj/item/modular_computer/handheld/pda/civilian/clown(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
new /obj/item/bikehorn(src)
new /obj/item/pen/crayon/rainbow(src)
@@ -129,7 +129,7 @@
if(95)
new /obj/item/clothing/under/mime(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/pda/mime(src)
new /obj/item/modular_computer/handheld/pda/civilian/mime(src)
new /obj/item/clothing/gloves/white(src)
new /obj/item/clothing/mask/gas/mime(src)
new /obj/item/clothing/head/beret(src)
@@ -22,6 +22,7 @@
randomize_hair_color("facial")
backbag = 2
pda_choice = 2
age = rand(getMinAge(),getMaxAge())
if(H)
copy_to(H,1)
@@ -115,11 +115,6 @@
//gloves
if(gloves && !skipgloves)
var/gloves_name = gloves
if(istype(wear_id, /obj/item/modular_computer))
var/obj/item/modular_computer/C = wear_id
var/obj/item/card/id/ID = C.GetID()
if(ID)
gloves_name = "[C.name] ([ID.registered_name] ([ID.assignment]))"
if(gloves.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [icon2html(gloves, user)] [gloves.gender==PLURAL?"some":"a"] [fluid_color_type_map(gloves.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>[gloves_name]</a> on [get_pronoun("his")] hands!</span>\n"
else
@@ -179,11 +174,6 @@
//ID
if(wear_id)
var/id_name = wear_id
if(istype(wear_id, /obj/item/modular_computer))
var/obj/item/modular_computer/C = wear_id
var/obj/item/card/id/ID = C.GetID()
if(ID)
id_name = "[C.name] ([ID.registered_name] ([ID.assignment]))"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(wear_id, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_id]'>\a [id_name]</a>.\n"
//Jitters
+4 -11
View File
@@ -423,18 +423,11 @@
// Get rank from ID, ID inside PDA, PDA, ID in wallet, etc.
/mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job")
var/obj/item/device/pda/pda = wear_id
if (istype(pda))
if (pda.id)
return pda.id.rank
else
return pda.ownrank
var/obj/item/card/id/id = GetIdCard()
if(!istype(id))
return if_no_id
else
var/obj/item/card/id/id = get_idcard()
if(id)
return id.rank ? id.rank : if_no_job
else
return if_no_id
return id.rank ? id.rank : if_no_job
//gets assignment from ID or ID inside PDA or PDA itself
//Useful when player do something with computers
@@ -37,6 +37,7 @@
var/list/hide_underwear = list()
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
var/backbag_style = 1
var/pda_choice = 2
var/last_chew = 0 // Used for hand chewing
@@ -584,10 +584,6 @@ There are several things that need to be remembered:
var/obj/item/card/id/id_card = wear_id
if(id_card.wear_over_suit == 1)
id_layer = ID_LAYER_ALT
else if(istype(wear_id, /obj/item/device/pda))
var/obj/item/device/pda/pda_device = wear_id
if(pda_device.wear_over_suit == 1)
id_layer = ID_LAYER_ALT
if (wear_id.color)
result_layer.color = wear_id.color
-9
View File
@@ -62,7 +62,6 @@ var/list/ai_verbs_default = list(
var/list/network = list("Station")
var/obj/machinery/camera/camera
var/list/cameraRecords = list() //For storing what is shown to the cameras
var/obj/item/device/pda/ai/ai_pda
var/obj/item/device/multitool/ai_multi
var/obj/item/device/radio/headset/heads/ai_integrated/ai_radio
var/datum/announcement/priority/announcement
@@ -133,7 +132,6 @@ var/list/ai_verbs_default = list(
possibleNames -= pickedName
pickedName = null
ai_pda = new/obj/item/device/pda/ai(src)
SetName(pickedName)
anchored = TRUE
canmove = FALSE
@@ -202,7 +200,6 @@ var/list/ai_verbs_default = list(
return ..()
/mob/living/silicon/ai/Destroy()
QDEL_NULL(ai_pda)
QDEL_NULL(ai_multi)
QDEL_NULL(ai_radio)
QDEL_NULL(psupply)
@@ -289,12 +286,6 @@ var/list/ai_verbs_default = list(
if(eyeobj)
eyeobj.name = "[pickedName] (AI Eye)"
// Set ai pda name
if(ai_pda)
ai_pda.ownjob = "AI"
ai_pda.owner = pickedName
ai_pda.name = pickedName + " (" + ai_pda.ownjob + ")"
//Set the ID Name
if(id_card)
id_card.registered_name = pickedName
@@ -82,7 +82,6 @@
var/screen // Which screen our main window displays
var/subscreen // Which specific function of the main screen is being displayed
var/obj/item/device/pda/ai/pai/pda = null
var/obj/item/modular_computer/parent_computer
var/secHUD = 0 // Toggles whether the Security HUD is active or not
@@ -185,17 +184,8 @@
verbs += /mob/living/silicon/proc/computer_interact
verbs += /mob/living/silicon/proc/silicon_mimic_accent
//PDA
pda = new(src)
addtimer(CALLBACK(src, .proc/set_pda), 5)
. = ..()
/mob/living/silicon/pai/proc/set_pda()
pda.ownjob = "Personal Assistant"
pda.owner = "[src]"
pda.name = "[pda.owner] ([pda.ownjob])"
pda.toff = TRUE
/mob/living/silicon/pai/proc/set_custom_sprite()
var/datum/custom_synth/sprite = robot_custom_icons[name]
@@ -349,9 +339,6 @@
H.visible_message(SPAN_DANGER("\The [src] explodes out of \the [H]'s [affecting.name] in shower of gore!"))
break
holder.drop_from_inventory(card)
else if(istype(card.loc,/obj/item/device/pda))
var/obj/item/device/pda/holder = card.loc
holder.pai = null
src.client.perspective = EYE_PERSPECTIVE
src.client.eye = src
@@ -82,7 +82,6 @@
var/obj/item/device/radio/borg/radio
var/obj/machinery/camera/camera
var/obj/item/device/mmi/mmi
var/obj/item/device/pda/ai/pda
var/obj/item/stock_parts/matter_bin/storage
var/obj/item/tank/jetpack/carbondioxide/synthetic/jetpack
@@ -258,14 +257,6 @@
return amount
return FALSE
// setup the PDA and its name
/mob/living/silicon/robot/proc/setup_PDA()
if(!has_pda)
return
if(!pda)
pda = new /obj/item/device/pda/ai(src)
pda.set_name_and_job(custom_name, "[mod_type] [braintype]")
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
//Improved /N
/mob/living/silicon/robot/Destroy()
@@ -369,9 +360,6 @@
mmi.brainmob.real_name = src.name
mmi.name = "[initial(mmi.name)]: [src.name]"
// if we've changed our name, we also need to update the display name for our PDA
setup_PDA()
// We also need to update our internal ID
if(id_card)
id_card.assignment = prefix
+2 -2
View File
@@ -867,8 +867,8 @@ proc/is_blind(A)
preposition = "on"
action3 = "wears"
newlocation = "feet"
else if (istype(loc,/obj/item/device/pda))
var/obj/item/device/pda/S = loc
else if (istype(loc,/obj/item/modular_computer))
var/obj/item/modular_computer/S = loc
newlocation = S.name
if (justmoved)
preposition = "into"
@@ -25,6 +25,10 @@ var/global/ntnrc_uid = 0
for(var/datum/computer_file/program/chatclient/C in clients)
if(C.program_state > PROGRAM_STATE_KILLED)
C.computer.output_message(FONT_SMALL("<b>([get_title(C)]) <i>[username]</i>:</b> [message] (<a href='byond://?src=\ref[C];Reply=1;target=[src.title]'>Reply</a>)"), 0)
if(!C.silent && C.username != username && C.program_state == PROGRAM_STATE_BACKGROUND)
for (var/mob/O in hearers(2, get_turf(C.computer)))
playsound(C.computer, 'sound/machines/twobeep.ogg', 50, 1)
O.show_message(text("[icon2html(C.computer, O)] *[C.ringtone]*"))
message = "[worldtime2text()] [username]: [message]"
messages.Add(message)
@@ -13,6 +13,7 @@ var/global/datum/ntnet/ntnet_global = new()
var/list/chat_channels = list()
var/list/chat_clients = list()
var/list/fileservers = list()
var/list/datum/ntnet_account/users = list()
// Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly.
// High values make displaying logs much laggier.
var/setting_maxlogcount = 100
@@ -69,6 +69,21 @@
continue
hard_drive.store_file(prog)
/obj/item/modular_computer/proc/handle_verbs()
if(card_slot)
if(card_slot.stored_card)
verbs += /obj/item/modular_computer/proc/eject_id
if(card_slot.stored_item)
verbs += /obj/item/modular_computer/proc/eject_item
if(portable_drive)
verbs += /obj/item/modular_computer/proc/eject_usb
if(battery_module && battery_module.hotswappable)
verbs += /obj/item/modular_computer/proc/eject_battery
if(ai_slot && ai_slot.stored_card)
verbs += /obj/item/modular_computer/proc/eject_ai
if(personal_ai)
verbs += /obj/item/modular_computer/proc/eject_personal_ai
/obj/item/modular_computer/Initialize()
. = ..()
listener = new(LISTENER_MODULAR_COMPUTER, src)
@@ -76,7 +91,9 @@
install_default_hardware()
if(hard_drive)
install_default_programs()
handle_verbs()
update_icon()
initial_name = name
/obj/item/modular_computer/Destroy()
kill_program(TRUE)
@@ -87,6 +104,11 @@
QDEL_NULL(listener)
return ..()
/obj/item/modular_computer/CouldUseTopic(var/mob/user)
..()
if(iscarbon(user))
playsound(src, 'sound/machines/pda_click.ogg', 20)
/obj/item/modular_computer/emag_act(var/remaining_charges, var/mob/user)
if(computer_emagged)
to_chat(user, SPAN_WARNING("\The [src] has already been emagged."))
@@ -155,10 +177,11 @@
// Relays kill program request to currently active program. Use this to quit current program.
/obj/item/modular_computer/proc/kill_program(var/forced = FALSE)
if(active_program)
active_program.kill_program(forced)
if(active_program && active_program.kill_program(forced))
src.vueui_transfer(active_program)
active_program = null
else
return FALSE
var/mob/user = usr
if(user && istype(user) && !forced)
ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
@@ -195,14 +218,14 @@
enabled = FALSE
update_icon()
/obj/item/modular_computer/proc/enable_computer(var/mob/user)
/obj/item/modular_computer/proc/enable_computer(var/mob/user, var/ar_forced=FALSE)
enabled = TRUE
update_icon()
// Autorun feature
var/datum/computer_file/data/autorun = hard_drive ? hard_drive.find_file_by_name("autorun") : null
if(istype(autorun))
run_program(autorun.stored_data, user)
run_program(autorun.stored_data, user, ar_forced)
for(var/s in enabled_services)
var/datum/computer_file/program/service = s
@@ -227,7 +250,7 @@
ui_interact(user) // Re-open the UI on this computer. It should show the main screen now.
/obj/item/modular_computer/proc/run_program(prog, mob/user)
/obj/item/modular_computer/proc/run_program(prog, mob/user, var/forced=FALSE)
var/datum/computer_file/program/P = null
if(!istype(user))
user = usr
@@ -255,7 +278,7 @@
to_chat(user, SPAN_WARNING("\The [src] displays, \"Maximal CPU load reached. Unable to run another program.\"."))
return
if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet.
if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature) && !forced) // The program requires NTNet connection, but we are not connected to NTNet.
to_chat(user, FONT_SMALL(SPAN_WARNING("\The [src] displays, \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\".")))
return
@@ -353,11 +376,10 @@
if(S in enabled_services)
return
enabled_services += S
// Start service
S.service_activate()
S.service_state = PROGRAM_STATE_ACTIVE
if(S.service_activate())
enabled_services += S
S.service_state = PROGRAM_STATE_ACTIVE
/obj/item/modular_computer/proc/disable_service(service, mob/user, var/datum/computer_file/program/S = null)
@@ -383,3 +405,73 @@
to_chat(user, message)
return
audible_message(message, hearing_distance = message_range)
// TODO: Make pretty much everything use these helpers.
/obj/item/modular_computer/proc/output_notice(var/message, var/message_range)
message = "[icon2html(src, viewers(message_range, get_turf(src)))][src]: " + message
output_message(SPAN_NOTICE(message), message_range)
/obj/item/modular_computer/proc/output_error(var/message, var/message_range)
message = "[icon2html(src, viewers(message_range, get_turf(src)))][src]: " + message
output_message(SPAN_WARNING(message), message_range)
/obj/item/modular_computer/proc/get_notification(var/message, var/message_range = 1, var/atom/source)
if(silent)
return
playsound(get_turf(src), 'sound/machines/twobeep.ogg', 20, 1)
message = "[icon2html(src, viewers(message_range, get_turf(src)))][src]: [SPAN_DANGER("-!-")] Notification from [source]: " + message
output_message(FONT_SMALL(SPAN_BOLD(message)), message_range)
/obj/item/modular_computer/proc/register_account(var/datum/computer_file/program/PRG = null)
var/obj/item/card/id/id = GetID()
if(PRG)
output_message(SPAN_NOTICE("\The [src] shows a notice: \"[PRG.filedesc] requires a registered NTNRC account. Registering automatically...\""))
if(!istype(id))
output_message(SPAN_WARNING("\The [src] shows an error: \"No ID card found!\""))
return FALSE
if(id.chat_registered)
output_message(SPAN_WARNING("\The [src] shows an error: \"This card is already registered to another account!\""))
return FALSE
id.chat_registered = TRUE
registered_id = id
output_message(SPAN_NOTICE("\The [src] beeps: \"Registration successful!\""))
playsound(get_turf(src), 'sound/machines/ping.ogg', 20, 0)
return registered_id
/obj/item/modular_computer/proc/unregister_account()
if(!registered_id)
return FALSE
registered_id.chat_registered = FALSE
registered_id = null
if(hard_drive)
var/datum/computer_file/program/P = hard_drive.find_file_by_name("ntnrc_client")
P.event_unregistered()
output_message(SPAN_NOTICE("\The [src] beeps: \"Successfully unregistered ID!\""))
playsound(get_turf(src), 'sound/machines/ping.ogg', 20, 0)
return TRUE
/obj/item/modular_computer/proc/set_autorun(var/fname)
if(!fname)
return FALSE
var/datum/computer_file/data/autorun = hard_drive.find_file_by_name("autorun")
if(istype(autorun) && autorun.stored_data == fname)
autorun.stored_data = null
return -1
autorun = new /datum/computer_file/data(src)
autorun.filename = "autorun"
autorun.stored_data = fname
hard_drive.store_file(autorun)
return TRUE
/obj/item/modular_computer/proc/silence_notifications()
for (var/datum/computer_file/program/P in hard_drive.stored_files)
if (istype(P))
P.event_silentmode()
silent = !silent
@@ -7,6 +7,7 @@
return
found = TRUE
portable_drive = H
verbs += /obj/item/modular_computer/proc/eject_usb
else if(istype(H, /obj/item/computer_hardware/hard_drive))
if(hard_drive)
to_chat(user, SPAN_WARNING("\The [src]'s hard drive slot is already occupied by \the [hard_drive]."))
@@ -39,6 +40,8 @@
return
found = TRUE
battery_module = H
if(battery_module.hotswappable)
verbs += /obj/item/modular_computer/proc/eject_battery
else if(istype(H, /obj/item/computer_hardware/processor_unit))
if(processor_unit)
to_chat(user, SPAN_WARNING("\The [src]'s processor slot is already occupied by \the [processor_unit]."))
@@ -51,6 +54,7 @@
return
found = TRUE
ai_slot = H
verbs += /obj/item/modular_computer/proc/eject_ai
else if(istype(H, /obj/item/computer_hardware/tesla_link))
if(tesla_link)
to_chat(user, SPAN_WARNING("\The [src]'s tesla link slot is already occupied by \the [tesla_link]."))
@@ -63,6 +67,7 @@
return
personal_ai = H
to_chat(user, SPAN_NOTICE("You install \the [H] into \the [src]."))
verbs += /obj/item/modular_computer/proc/eject_personal_ai
personal_ai.pai.parent_computer = src
personal_ai.pai.verbs += /mob/living/silicon/pai/proc/personal_computer_interact
to_chat(personal_ai.pai, SPAN_NOTICE("You gain access to \the [src]'s computronics."))
@@ -1,5 +1,4 @@
// Eject ID card from computer, if it has ID slot with card inside.
/obj/item/modular_computer/verb/eject_id()
/obj/item/modular_computer/proc/eject_id()
set name = "Eject ID"
set category = "Object"
set src in view(1)
@@ -7,49 +6,12 @@
if(use_check_and_message(usr))
return
proc_eject_id(usr)
// Eject ID card from computer, if it has ID slot with card inside.
/obj/item/modular_computer/verb/eject_usb()
set name = "Eject Portable Storage"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
proc_eject_usb(usr)
/obj/item/modular_computer/verb/eject_ai()
set name = "Eject AI Storage"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
proc_eject_ai(usr)
/obj/item/modular_computer/verb/eject_personal_ai()
set name = "Eject Personal AI"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
proc_eject_personal_ai(usr)
/obj/item/modular_computer/proc/proc_eject_id(mob/user)
if(!user)
user = usr
if(!card_slot)
to_chat(user, SPAN_WARNING("\The [src] does not have an ID card slot."))
to_chat(usr, SPAN_WARNING("\The [src] does not have an ID card slot."))
return
if(!card_slot.stored_card)
to_chat(user, SPAN_WARNING("There is no card in \the [src]."))
to_chat(usr, SPAN_WARNING("There is no card in \the [src]."))
return
if(active_program)
@@ -57,57 +19,155 @@
for(var/datum/computer_file/program/P in idle_threads)
P.event_idremoved(TRUE)
if(ishuman(user))
user.put_in_hands(card_slot.stored_card)
else
card_slot.stored_card.forceMove(get_turf(src))
card_slot.stored_card = null
card_slot.eject_id(usr)
update_uis()
to_chat(user, SPAN_NOTICE("You remove the card from \the [src]."))
to_chat(usr, SPAN_NOTICE("You remove the card from \the [src]."))
/obj/item/modular_computer/proc/proc_eject_usb(mob/user)
if(!user)
user = usr
/obj/item/modular_computer/proc/eject_usb()
set name = "Eject Portable Storage"
set category = "Object"
set src in view(1)
if(!portable_drive)
to_chat(user, SPAN_WARNING("There is no portable drive connected to \the [src]."))
if(use_check_and_message(usr))
return
uninstall_component(user, portable_drive, put_in_hands = TRUE)
if(!portable_drive)
to_chat(usr, SPAN_WARNING("There is no portable drive connected to \the [src]."))
return
uninstall_component(usr, portable_drive, put_in_hands = TRUE)
verbs -= /obj/item/modular_computer/proc/eject_usb
update_uis()
/obj/item/modular_computer/proc/proc_eject_ai(mob/user)
if(!user)
user = usr
/obj/item/modular_computer/proc/eject_item()
set name = "Eject Stored Item"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
if(!card_slot)
to_chat(usr, SPAN_WARNING("\The [src] does not have an ID card slot."))
return
if(!card_slot.stored_item)
to_chat(usr, SPAN_WARNING("There is no item stored in \the [src]."))
return
var/I = card_slot.stored_item.name
if(ishuman(usr))
usr.put_in_hands(card_slot.stored_item)
else
card_slot.stored_item.forceMove(get_turf(src))
card_slot.stored_item = null
update_uis()
verbs -= /obj/item/modular_computer/proc/eject_item
to_chat(usr, SPAN_NOTICE("You remove \the [I] from \the [src]."))
/obj/item/modular_computer/proc/eject_battery(mob/usr = usr)
set name = "Eject Battery"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
if(!battery_module)
to_chat(usr, SPAN_WARNING("\The [src] doesn't have a battery installed."))
return
if(!battery_module.hotswappable)
to_chat(usr, SPAN_WARNING("\The [src]'s battery isn't removable without tools!"))
return
uninstall_component(usr, battery_module, put_in_hands = TRUE)
verbs -= /obj/item/modular_computer/proc/eject_battery
update_uis()
/obj/item/modular_computer/proc/eject_ai()
set name = "Eject AI Storage"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
if(!ai_slot)
to_chat(user, SPAN_WARNING("\The [src] doesn't have an intellicard slot."))
to_chat(usr, SPAN_WARNING("\The [src] doesn't have an intellicard slot."))
return
if(!ai_slot.stored_card)
to_chat(user, SPAN_WARNING("There is no intellicard connected to \the [src]."))
to_chat(usr, SPAN_WARNING("There is no intellicard connected to \the [src]."))
return
if(ishuman(user))
user.put_in_hands(ai_slot.stored_card)
if(ishuman(usr))
usr.put_in_hands(ai_slot.stored_card)
else
ai_slot.stored_card.forceMove(get_turf(src))
ai_slot.stored_card = null
ai_slot.update_power_usage()
verbs -= /obj/item/modular_computer/proc/eject_ai
update_uis()
/obj/item/modular_computer/proc/proc_eject_personal_ai(mob/user)
if(!personal_ai)
to_chat(user, SPAN_WARNING("There is no personal AI connected to \the [src]."))
/obj/item/modular_computer/proc/eject_personal_ai()
set name = "Eject Personal AI"
set category = "Object"
set src in view(1)
if(use_check_and_message(usr))
return
personal_ai.pai.verbs -= /mob/living/silicon/pai/proc/personal_computer_interact
personal_ai.pai.parent_computer = null
to_chat(personal_ai.pai, SPAN_NOTICE("You lose access to \the [src]'s computronics."))
uninstall_component(user, personal_ai, put_in_hands = TRUE)
if(!personal_ai)
to_chat(usr, SPAN_WARNING("There is no personal AI connected to \the [src]."))
return
uninstall_component(usr, personal_ai, put_in_hands = TRUE)
verbs -= /obj/item/modular_computer/proc/eject_personal_ai
update_uis()
/obj/item/modular_computer/AltClick(var/mob/user)
if(use_check_and_message(user, 32))
return
if(!card_slot)
to_chat(user, SPAN_WARNING("\The [src] does not have an ID card slot."))
return
if(card_slot.stored_card)
eject_id()
else if(card_slot.stored_item)
eject_item()
else
to_chat(user, SPAN_WARNING("\The [src] does not have a card or item stored in the card slot."))
/obj/item/modular_computer/attack(mob/living/M, mob/living/user)
if(scan_mode == SCANNER_MEDICAL)
health_scan_mob(M, user, TRUE)
/obj/item/modular_computer/afterattack(atom/A, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity_flag)
return
if(scan_mode == SCANNER_REAGENT)
if(!isobj(A) || isnull(A.reagents))
return
if(A.reagents.reagent_list.len)
var/reagents_length = A.reagents.reagent_list.len
to_chat(user, SPAN_NOTICE("[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found."))
for(var/re in A.reagents.reagent_list)
to_chat(user, SPAN_NOTICE(" [re]"))
else
to_chat(user, SPAN_NOTICE("No active chemical agents found in [A]."))
else if(scan_mode == SCANNER_GAS)
analyze_gases(A, user)
/obj/item/modular_computer/attack_ghost(var/mob/abstract/observer/user)
if(enabled)
ui_interact(user)
@@ -152,15 +212,29 @@
if(!card_slot)
to_chat(user, SPAN_WARNING("You try to insert \the [I] into \the [src], but it does not have an ID card slot installed."))
return
if(card_slot.stored_card)
to_chat(user, SPAN_WARNING("You try to insert \the [I] into \the [src], but its ID card slot is occupied."))
return
user.drop_from_inventory(I, src)
card_slot.stored_card = I
if(card_slot.stored_card)
eject_id()
card_slot.insert_id(I)
update_uis()
to_chat(user, SPAN_NOTICE("You insert \the [I] into \the [src]."))
return
if(is_type_in_list(W, card_slot?.allowed_items))
if(!card_slot)
to_chat(user, SPAN_WARNING("You try to insert \the [W] into \the [src], but it does not have an ID card slot installed."))
return
if(card_slot.stored_item)
to_chat(user, SPAN_WARNING("You try to insert \the [W] into \the [src], but its storage slot is occupied."))
return
user.drop_from_inventory(W, src)
card_slot.stored_item = W
update_uis()
verbs += /obj/item/modular_computer/proc/eject_item
to_chat(user, SPAN_NOTICE("You insert \the [W] into \the [src]."))
return
if(istype(W, /obj/item/paper))
if(!nano_printer)
return
@@ -230,6 +304,8 @@
var/mob/M = usr
if(use_check_and_message(M))
return
if(istype(over_object, /obj/machinery/power/apc) && tesla_link)
return over_object.attackby(src, M)
if(!istype(over_object, /obj/screen) && !(over_object == src))
return attack_self(M)
@@ -92,9 +92,9 @@
if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED)
return
P.kill_program(TRUE)
if(P.kill_program())
to_chat(user, SPAN_NOTICE("Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed."))
update_uis()
to_chat(user, SPAN_NOTICE("Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed."))
if(href_list["PC_runprogram"] )
. = run_program(href_list["PC_runprogram"], usr)
@@ -103,16 +103,14 @@
if(href_list["PC_setautorun"])
if(!hard_drive)
return
var/datum/computer_file/data/autorun = hard_drive.find_file_by_name("autorun")
if(!istype(autorun))
autorun = new /datum/computer_file/data()
autorun.filename = "autorun"
hard_drive.store_file(autorun)
if(autorun.stored_data == href_list["PC_setautorun"])
autorun.stored_data = null
else
autorun.stored_data = href_list["PC_setautorun"]
set_autorun(href_list["PC_setautorun"])
if(href_list["PC_register"])
if(registered_id)
unregister_account()
else if(GetID())
register_account()
if( href_list["PC_toggleservice"] )
toggle_service(href_list["PC_toggleservice"], usr)
return 1
@@ -1,4 +1,5 @@
// This is the base type that handles everything. Subtypes can be easily created by tweaking variables in this file to your liking.
/obj/item/modular_computer
name = "Modular Computer"
desc = "A modular computer. You shouldn't see this."
@@ -21,6 +22,12 @@
var/_app_preset_type // Used for specifying the software preset of the console
var/ambience_last_played // Last time sound was played
var/pAI_lock = FALSE // Toggles whether pAI can interact with the modular computer while installed in it
var/obj/item/card/id/registered_id = null // ID used for chat client registering
var/scan_mode = null // Mode used for health/reagent scanners
var/silent = FALSE
var/doorcode = "smindicate"
var/hidden = FALSE
var/initial_name
// Modular computers can run on various devices. Each DEVICE (Laptop, Console, Tablet,..)
// must have it's own DMI file. Icon states must be called exactly the same in all files, but may look differently

Some files were not shown because too many files have changed in this diff Show More