mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-20 19:49:39 +01:00
About The Pull Request
Adds two new modular computer programs. Both use the same underlying parts;
-- Lifeline is an improved suit sensor tracker, showing where the target is on a grid if they're within 24 tiles. The scan button has a two-second delay (since the program has to check every humanoid in glob.human_list for trackability and we don't want that spammed). The app works pretty much how you would expect.
-- Fission360 uses the same processes as above but for the nuke disk and all nukes in the area (self destruct, beer, syndicate). Available only via emagging a tablet for the moment.
--
Rudimentary multiZ support exists, in the form of replacing the crosshairs icon with an up or down arrow (once it's visible within the circle) to indicate if the target is above or below, if both the target and the computer are on a station Z level of some sort. Also, the grid lines are exactly two-tiles apart.
Added support for programs to list special assets to load, so that we don't have to have every program loading all modular program assets. The radar apps use this to load the background grid and the too-far-away-to-display arrow.
Why It's Good For The Game
More modular apps are good. I'm hoping to see a syndicate-version of the modular tablet in the hands of nuke ops at some point, which is really where Fission360 will make sense. Otherwise, it's an extra tool for traitors with the nuke theft objective, I suppose.
Changelog
cl
add: Two new apps for modular computers are available: Lifeline for Medical, and Fission360 for anyone with access to the Syndicate repository. Lifeline is an improved suit sensors tracker, and Fission360 is the same but for nuclear-related things.
/cl
388 lines
15 KiB
Plaintext
388 lines
15 KiB
Plaintext
//DEFINITIONS FOR ASSET DATUMS START HERE.
|
|
|
|
/datum/asset/simple/tgui
|
|
assets = list(
|
|
"tgui.bundle.js" = 'tgui/packages/tgui/public/tgui.bundle.js',
|
|
"tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css',
|
|
)
|
|
|
|
/datum/asset/group/tgui
|
|
children = list(
|
|
/datum/asset/simple/tgui,
|
|
/datum/asset/simple/fontawesome
|
|
)
|
|
|
|
/datum/asset/simple/headers
|
|
assets = list(
|
|
"alarm_green.gif" = 'icons/program_icons/alarm_green.gif',
|
|
"alarm_red.gif" = 'icons/program_icons/alarm_red.gif',
|
|
"batt_5.gif" = 'icons/program_icons/batt_5.gif',
|
|
"batt_20.gif" = 'icons/program_icons/batt_20.gif',
|
|
"batt_40.gif" = 'icons/program_icons/batt_40.gif',
|
|
"batt_60.gif" = 'icons/program_icons/batt_60.gif',
|
|
"batt_80.gif" = 'icons/program_icons/batt_80.gif',
|
|
"batt_100.gif" = 'icons/program_icons/batt_100.gif',
|
|
"charging.gif" = 'icons/program_icons/charging.gif',
|
|
"downloader_finished.gif" = 'icons/program_icons/downloader_finished.gif',
|
|
"downloader_running.gif" = 'icons/program_icons/downloader_running.gif',
|
|
"ntnrc_idle.gif" = 'icons/program_icons/ntnrc_idle.gif',
|
|
"ntnrc_new.gif" = 'icons/program_icons/ntnrc_new.gif',
|
|
"power_norm.gif" = 'icons/program_icons/power_norm.gif',
|
|
"power_warn.gif" = 'icons/program_icons/power_warn.gif',
|
|
"sig_high.gif" = 'icons/program_icons/sig_high.gif',
|
|
"sig_low.gif" = 'icons/program_icons/sig_low.gif',
|
|
"sig_lan.gif" = 'icons/program_icons/sig_lan.gif',
|
|
"sig_none.gif" = 'icons/program_icons/sig_none.gif',
|
|
"smmon_0.gif" = 'icons/program_icons/smmon_0.gif',
|
|
"smmon_1.gif" = 'icons/program_icons/smmon_1.gif',
|
|
"smmon_2.gif" = 'icons/program_icons/smmon_2.gif',
|
|
"smmon_3.gif" = 'icons/program_icons/smmon_3.gif',
|
|
"smmon_4.gif" = 'icons/program_icons/smmon_4.gif',
|
|
"smmon_5.gif" = 'icons/program_icons/smmon_5.gif',
|
|
"smmon_6.gif" = 'icons/program_icons/smmon_6.gif',
|
|
"borg_mon.gif" = 'icons/program_icons/borg_mon.gif'
|
|
)
|
|
|
|
/datum/asset/simple/radar_assets
|
|
assets = list(
|
|
"ntosradarbackground.png" = 'icons/UI_Icons/tgui/ntosradar_background.png',
|
|
"ntosradarpointer.png" = 'icons/UI_Icons/tgui/ntosradar_pointer.png',
|
|
"ntosradarpointerS.png" = 'icons/UI_Icons/tgui/ntosradar_pointer_S.png'
|
|
)
|
|
|
|
/datum/asset/spritesheet/simple/pda
|
|
name = "pda"
|
|
assets = list(
|
|
"atmos" = 'icons/pda_icons/pda_atmos.png',
|
|
"back" = 'icons/pda_icons/pda_back.png',
|
|
"bell" = 'icons/pda_icons/pda_bell.png',
|
|
"blank" = 'icons/pda_icons/pda_blank.png',
|
|
"boom" = 'icons/pda_icons/pda_boom.png',
|
|
"bucket" = 'icons/pda_icons/pda_bucket.png',
|
|
"medbot" = 'icons/pda_icons/pda_medbot.png',
|
|
"floorbot" = 'icons/pda_icons/pda_floorbot.png',
|
|
"cleanbot" = 'icons/pda_icons/pda_cleanbot.png',
|
|
"crate" = 'icons/pda_icons/pda_crate.png',
|
|
"cuffs" = 'icons/pda_icons/pda_cuffs.png',
|
|
"eject" = 'icons/pda_icons/pda_eject.png',
|
|
"flashlight" = 'icons/pda_icons/pda_flashlight.png',
|
|
"honk" = 'icons/pda_icons/pda_honk.png',
|
|
"mail" = 'icons/pda_icons/pda_mail.png',
|
|
"medical" = 'icons/pda_icons/pda_medical.png',
|
|
"menu" = 'icons/pda_icons/pda_menu.png',
|
|
"mule" = 'icons/pda_icons/pda_mule.png',
|
|
"notes" = 'icons/pda_icons/pda_notes.png',
|
|
"power" = 'icons/pda_icons/pda_power.png',
|
|
"rdoor" = 'icons/pda_icons/pda_rdoor.png',
|
|
"reagent" = 'icons/pda_icons/pda_reagent.png',
|
|
"refresh" = 'icons/pda_icons/pda_refresh.png',
|
|
"scanner" = 'icons/pda_icons/pda_scanner.png',
|
|
"signaler" = 'icons/pda_icons/pda_signaler.png',
|
|
"skills" = 'icons/pda_icons/pda_skills.png',
|
|
"status" = 'icons/pda_icons/pda_status.png',
|
|
"dronephone" = 'icons/pda_icons/pda_dronephone.png',
|
|
"emoji" = 'icons/pda_icons/pda_emoji.png'
|
|
)
|
|
|
|
/datum/asset/spritesheet/simple/paper
|
|
name = "paper"
|
|
assets = list(
|
|
"stamp-clown" = 'icons/stamp_icons/large_stamp-clown.png',
|
|
"stamp-deny" = 'icons/stamp_icons/large_stamp-deny.png',
|
|
"stamp-ok" = 'icons/stamp_icons/large_stamp-ok.png',
|
|
"stamp-hop" = 'icons/stamp_icons/large_stamp-hop.png',
|
|
"stamp-cmo" = 'icons/stamp_icons/large_stamp-cmo.png',
|
|
"stamp-ce" = 'icons/stamp_icons/large_stamp-ce.png',
|
|
"stamp-hos" = 'icons/stamp_icons/large_stamp-hos.png',
|
|
"stamp-rd" = 'icons/stamp_icons/large_stamp-rd.png',
|
|
"stamp-cap" = 'icons/stamp_icons/large_stamp-cap.png',
|
|
"stamp-qm" = 'icons/stamp_icons/large_stamp-qm.png',
|
|
"stamp-law" = 'icons/stamp_icons/large_stamp-law.png',
|
|
"stamp-chap" = 'icons/stamp_icons/large_stamp-chap.png',
|
|
"stamp-mime" = 'icons/stamp_icons/large_stamp-mime.png',
|
|
"stamp-centcom" = 'icons/stamp_icons/large_stamp-centcom.png',
|
|
"stamp-syndicate" = 'icons/stamp_icons/large_stamp-syndicate.png'
|
|
)
|
|
|
|
|
|
/datum/asset/simple/IRV
|
|
assets = list(
|
|
"jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js',
|
|
)
|
|
|
|
/datum/asset/group/IRV
|
|
children = list(
|
|
/datum/asset/simple/jquery,
|
|
/datum/asset/simple/IRV
|
|
)
|
|
|
|
/datum/asset/simple/changelog
|
|
assets = list(
|
|
"88x31.png" = 'html/88x31.png',
|
|
"bug-minus.png" = 'html/bug-minus.png',
|
|
"cross-circle.png" = 'html/cross-circle.png',
|
|
"hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png',
|
|
"image-minus.png" = 'html/image-minus.png',
|
|
"image-plus.png" = 'html/image-plus.png',
|
|
"music-minus.png" = 'html/music-minus.png',
|
|
"music-plus.png" = 'html/music-plus.png',
|
|
"tick-circle.png" = 'html/tick-circle.png',
|
|
"wrench-screwdriver.png" = 'html/wrench-screwdriver.png',
|
|
"spell-check.png" = 'html/spell-check.png',
|
|
"burn-exclamation.png" = 'html/burn-exclamation.png',
|
|
"chevron.png" = 'html/chevron.png',
|
|
"chevron-expand.png" = 'html/chevron-expand.png',
|
|
"scales.png" = 'html/scales.png',
|
|
"coding.png" = 'html/coding.png',
|
|
"ban.png" = 'html/ban.png',
|
|
"chrome-wrench.png" = 'html/chrome-wrench.png',
|
|
"changelog.css" = 'html/changelog.css'
|
|
)
|
|
|
|
/datum/asset/group/goonchat
|
|
children = list(
|
|
/datum/asset/simple/jquery,
|
|
/datum/asset/simple/goonchat,
|
|
/datum/asset/spritesheet/goonchat,
|
|
/datum/asset/simple/fontawesome
|
|
)
|
|
|
|
/datum/asset/simple/jquery
|
|
assets = list(
|
|
"jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js',
|
|
)
|
|
|
|
/datum/asset/simple/goonchat
|
|
assets = list(
|
|
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
|
|
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
|
|
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
|
|
"browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css',
|
|
)
|
|
|
|
/datum/asset/simple/fontawesome
|
|
assets = list(
|
|
"fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot',
|
|
"fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff',
|
|
"fa-solid-900.eot" = 'html/font-awesome/webfonts/fa-solid-900.eot',
|
|
"fa-solid-900.woff" = 'html/font-awesome/webfonts/fa-solid-900.woff',
|
|
"font-awesome.css" = 'html/font-awesome/css/all.min.css',
|
|
"v4shim.css" = 'html/font-awesome/css/v4-shims.min.css'
|
|
)
|
|
|
|
/datum/asset/spritesheet/goonchat
|
|
name = "chat"
|
|
|
|
/datum/asset/spritesheet/goonchat/register()
|
|
InsertAll("emoji", 'icons/emoji.dmi')
|
|
|
|
// pre-loading all lanugage icons also helps to avoid meta
|
|
InsertAll("language", 'icons/misc/language.dmi')
|
|
// catch languages which are pulling icons from another file
|
|
for(var/path in typesof(/datum/language))
|
|
var/datum/language/L = path
|
|
var/icon = initial(L.icon)
|
|
if (icon != 'icons/misc/language.dmi')
|
|
var/icon_state = initial(L.icon_state)
|
|
Insert("language-[icon_state]", icon, icon_state=icon_state)
|
|
|
|
..()
|
|
|
|
/datum/asset/simple/permissions
|
|
assets = list(
|
|
"padlock.png" = 'html/padlock.png'
|
|
)
|
|
|
|
/datum/asset/simple/notes
|
|
assets = list(
|
|
"high_button.png" = 'html/high_button.png',
|
|
"medium_button.png" = 'html/medium_button.png',
|
|
"minor_button.png" = 'html/minor_button.png',
|
|
"none_button.png" = 'html/none_button.png',
|
|
)
|
|
|
|
/datum/asset/simple/arcade
|
|
assets = list(
|
|
"boss1.gif" = 'icons/UI_Icons/Arcade/boss1.gif',
|
|
"boss2.gif" = 'icons/UI_Icons/Arcade/boss2.gif',
|
|
"boss3.gif" = 'icons/UI_Icons/Arcade/boss3.gif',
|
|
"boss4.gif" = 'icons/UI_Icons/Arcade/boss4.gif',
|
|
"boss5.gif" = 'icons/UI_Icons/Arcade/boss5.gif',
|
|
"boss6.gif" = 'icons/UI_Icons/Arcade/boss6.gif',
|
|
)
|
|
|
|
/datum/asset/spritesheet/simple/achievements
|
|
name ="achievements"
|
|
assets = list(
|
|
"default" = 'icons/UI_Icons/Achievements/default.png',
|
|
"basemisc" = 'icons/UI_Icons/Achievements/basemisc.png',
|
|
"baseboss" = 'icons/UI_Icons/Achievements/baseboss.png',
|
|
"baseskill" = 'icons/UI_Icons/Achievements/baseskill.png',
|
|
"bbgum" = 'icons/UI_Icons/Achievements/Boss/bbgum.png',
|
|
"colossus" = 'icons/UI_Icons/Achievements/Boss/colossus.png',
|
|
"hierophant" = 'icons/UI_Icons/Achievements/Boss/hierophant.png',
|
|
"legion" = 'icons/UI_Icons/Achievements/Boss/legion.png',
|
|
"miner" = 'icons/UI_Icons/Achievements/Boss/miner.png',
|
|
"swarmer" = 'icons/UI_Icons/Achievements/Boss/swarmer.png',
|
|
"tendril" = 'icons/UI_Icons/Achievements/Boss/tendril.png',
|
|
"featofstrength" = 'icons/UI_Icons/Achievements/Misc/featofstrength.png',
|
|
"helbital" = 'icons/UI_Icons/Achievements/Misc/helbital.png',
|
|
"jackpot" = 'icons/UI_Icons/Achievements/Misc/jackpot.png',
|
|
"meteors" = 'icons/UI_Icons/Achievements/Misc/meteors.png',
|
|
"timewaste" = 'icons/UI_Icons/Achievements/Misc/timewaste.png',
|
|
"upgrade" = 'icons/UI_Icons/Achievements/Misc/upgrade.png',
|
|
"clownking" = 'icons/UI_Icons/Achievements/Misc/clownking.png',
|
|
"clownthanks" = 'icons/UI_Icons/Achievements/Misc/clownthanks.png',
|
|
"rule8" = 'icons/UI_Icons/Achievements/Misc/rule8.png',
|
|
"snail" = 'icons/UI_Icons/Achievements/Misc/snail.png',
|
|
"mining" = 'icons/UI_Icons/Achievements/Skills/mining.png',
|
|
)
|
|
|
|
/datum/asset/spritesheet/simple/pills
|
|
name ="pills"
|
|
assets = list(
|
|
"pill1" = 'icons/UI_Icons/Pills/pill1.png',
|
|
"pill2" = 'icons/UI_Icons/Pills/pill2.png',
|
|
"pill3" = 'icons/UI_Icons/Pills/pill3.png',
|
|
"pill4" = 'icons/UI_Icons/Pills/pill4.png',
|
|
"pill5" = 'icons/UI_Icons/Pills/pill5.png',
|
|
"pill6" = 'icons/UI_Icons/Pills/pill6.png',
|
|
"pill7" = 'icons/UI_Icons/Pills/pill7.png',
|
|
"pill8" = 'icons/UI_Icons/Pills/pill8.png',
|
|
"pill9" = 'icons/UI_Icons/Pills/pill9.png',
|
|
"pill10" = 'icons/UI_Icons/Pills/pill10.png',
|
|
"pill11" = 'icons/UI_Icons/Pills/pill11.png',
|
|
"pill12" = 'icons/UI_Icons/Pills/pill12.png',
|
|
"pill13" = 'icons/UI_Icons/Pills/pill13.png',
|
|
"pill14" = 'icons/UI_Icons/Pills/pill14.png',
|
|
"pill15" = 'icons/UI_Icons/Pills/pill15.png',
|
|
"pill16" = 'icons/UI_Icons/Pills/pill16.png',
|
|
"pill17" = 'icons/UI_Icons/Pills/pill17.png',
|
|
"pill18" = 'icons/UI_Icons/Pills/pill18.png',
|
|
"pill19" = 'icons/UI_Icons/Pills/pill19.png',
|
|
"pill20" = 'icons/UI_Icons/Pills/pill20.png',
|
|
"pill21" = 'icons/UI_Icons/Pills/pill21.png',
|
|
"pill22" = 'icons/UI_Icons/Pills/pill22.png',
|
|
)
|
|
|
|
//this exists purely to avoid meta by pre-loading all language icons.
|
|
/datum/asset/language/register()
|
|
for(var/path in typesof(/datum/language))
|
|
set waitfor = FALSE
|
|
var/datum/language/L = new path ()
|
|
L.get_icon()
|
|
|
|
/datum/asset/spritesheet/pipes
|
|
name = "pipes"
|
|
|
|
/datum/asset/spritesheet/pipes/register()
|
|
for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi'))
|
|
InsertAll("", each, GLOB.alldirs)
|
|
..()
|
|
|
|
// Representative icons for each research design
|
|
/datum/asset/spritesheet/research_designs
|
|
name = "design"
|
|
|
|
/datum/asset/spritesheet/research_designs/register()
|
|
for (var/path in subtypesof(/datum/design))
|
|
var/datum/design/D = path
|
|
|
|
var/icon_file
|
|
var/icon_state
|
|
var/icon/I
|
|
|
|
if(initial(D.research_icon) && initial(D.research_icon_state)) //If the design has an icon replacement skip the rest
|
|
icon_file = initial(D.research_icon)
|
|
icon_state = initial(D.research_icon_state)
|
|
if(!(icon_state in icon_states(icon_file)))
|
|
warning("design [D] with icon '[icon_file]' missing state '[icon_state]'")
|
|
continue
|
|
I = icon(icon_file, icon_state, SOUTH)
|
|
|
|
else
|
|
// construct the icon and slap it into the resource cache
|
|
var/atom/item = initial(D.build_path)
|
|
if (!ispath(item, /atom))
|
|
// biogenerator outputs to beakers by default
|
|
if (initial(D.build_type) & BIOGENERATOR)
|
|
item = /obj/item/reagent_containers/glass/beaker/large
|
|
else
|
|
continue // shouldn't happen, but just in case
|
|
|
|
// circuit boards become their resulting machines or computers
|
|
if (ispath(item, /obj/item/circuitboard))
|
|
var/obj/item/circuitboard/C = item
|
|
var/machine = initial(C.build_path)
|
|
if (machine)
|
|
item = machine
|
|
|
|
icon_file = initial(item.icon)
|
|
icon_state = initial(item.icon_state)
|
|
|
|
if(!(icon_state in icon_states(icon_file)))
|
|
warning("design [D] with icon '[icon_file]' missing state '[icon_state]'")
|
|
continue
|
|
I = icon(icon_file, icon_state, SOUTH)
|
|
|
|
// computers (and snowflakes) get their screen and keyboard sprites
|
|
if (ispath(item, /obj/machinery/computer) || ispath(item, /obj/machinery/power/solar_control))
|
|
var/obj/machinery/computer/C = item
|
|
var/screen = initial(C.icon_screen)
|
|
var/keyboard = initial(C.icon_keyboard)
|
|
var/all_states = icon_states(icon_file)
|
|
if (screen && (screen in all_states))
|
|
I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY)
|
|
if (keyboard && (keyboard in all_states))
|
|
I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY)
|
|
|
|
Insert(initial(D.id), I)
|
|
return ..()
|
|
|
|
/datum/asset/spritesheet/vending
|
|
name = "vending"
|
|
|
|
/datum/asset/spritesheet/vending/register()
|
|
for (var/k in GLOB.vending_products)
|
|
var/atom/item = k
|
|
if (!ispath(item, /atom))
|
|
continue
|
|
|
|
var/icon_file = initial(item.icon)
|
|
var/icon_state = initial(item.icon_state)
|
|
var/icon/I
|
|
|
|
var/icon_states_list = icon_states(icon_file)
|
|
if(icon_state in icon_states_list)
|
|
I = icon(icon_file, icon_state, SOUTH)
|
|
var/c = initial(item.color)
|
|
if (!isnull(c) && c != "#FFFFFF")
|
|
I.Blend(c, ICON_MULTIPLY)
|
|
else
|
|
var/icon_states_string
|
|
for (var/an_icon_state in icon_states_list)
|
|
if (!icon_states_string)
|
|
icon_states_string = "[json_encode(an_icon_state)](\ref[an_icon_state])"
|
|
else
|
|
icon_states_string += ", [json_encode(an_icon_state)](\ref[an_icon_state])"
|
|
stack_trace("[item] does not have a valid icon state, icon=[icon_file], icon_state=[json_encode(icon_state)](\ref[icon_state]), icon_states=[icon_states_string]")
|
|
I = icon('icons/turf/floors.dmi', "", SOUTH)
|
|
|
|
var/imgid = replacetext(replacetext("[item]", "/obj/item/", ""), "/", "-")
|
|
|
|
Insert(imgid, I)
|
|
return ..()
|
|
|
|
/datum/asset/simple/genetics
|
|
assets = list(
|
|
"dna_discovered.gif" = 'html/dna_discovered.gif',
|
|
"dna_undiscovered.gif" = 'html/dna_undiscovered.gif',
|
|
"dna_extra.gif" = 'html/dna_extra.gif'
|
|
)
|
|
|
|
|
|
/datum/asset/simple/vv
|
|
assets = list(
|
|
"view_variables.css" = 'html/admin/view_variables.css'
|
|
)
|