mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-12 00:27:31 +01:00
28e4e2cd42
## About The Pull Request This rewrites how our actions handle changelogs, and rewrites a bunch of the changelog TGUI (in a separate file cause I don't feel like massacring the upstream one). The gist of it is that our actions will now create autochangelog files with bubber in the name, our changelog compile will only compile those autochangelogs (not upstream ones if they happen to be in there), and the compile will be done into separate bubber changelog files in `html/changelogs/bubber_archive`. In game, the UI will pull both archive files (upstream and ours) and combine them in the changelog list, putting the codebase logo next to each change to distinguish which one it's from. ~~NOTE: I'm opening this as a draft because I'm going to try and reset our tg changelogs and then reapply all our historical changelogs into the new bubber archive files, I'm just putting this up now so the code can be reviewed and shit~~ done ## Why It's Good For The Game For players this makes it easier to distinguish where a change came from, and for developers this means we don't need to worry about breaking the changelog when we do an upstream pull, we can completely ignore it and just pull everything, and our tg archive files will be 1:1 with upstream with no shit from us added in. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 TealSeer, LT3 refactor: refactored how changelogs are generated and displayed /🆑 --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
280 lines
10 KiB
Plaintext
280 lines
10 KiB
Plaintext
//These datums are used to populate the asset cache, the proc "register()" does this.
|
|
//Place any asset datums you create in asset_list_items.dm
|
|
|
|
//all of our asset datums, used for referring to these later
|
|
GLOBAL_LIST_EMPTY(asset_datums)
|
|
|
|
//get an assetdatum or make a new one
|
|
//does NOT ensure it's filled, if you want that use get_asset_datum()
|
|
/proc/load_asset_datum(type)
|
|
return GLOB.asset_datums[type] || new type()
|
|
|
|
/proc/get_asset_datum(type)
|
|
var/datum/asset/loaded_asset = GLOB.asset_datums[type] || new type()
|
|
return loaded_asset.ensure_ready()
|
|
|
|
/datum/asset
|
|
var/_abstract = /datum/asset
|
|
var/cached_serialized_url_mappings
|
|
var/cached_serialized_url_mappings_transport_type
|
|
|
|
/// Whether or not this asset should be loaded in the "early assets" SS
|
|
var/early = FALSE
|
|
|
|
/// Whether or not this asset can be cached across rounds of the same commit under the `CACHE_ASSETS` config.
|
|
/// This is not a *guarantee* the asset will be cached. Not all asset subtypes respect this field, and the
|
|
/// config can, of course, be disabled.
|
|
/// Disable this if your asset can change between rounds on the same exact version of the code.
|
|
var/cross_round_cachable = FALSE
|
|
|
|
/datum/asset/New()
|
|
GLOB.asset_datums[type] = src
|
|
register()
|
|
|
|
/// Stub that allows us to react to something trying to get us
|
|
/// Not useful here, more handy for sprite sheets
|
|
/datum/asset/proc/ensure_ready()
|
|
return src
|
|
|
|
/// Stub to hook into if your asset is having its generation queued by SSasset_loading
|
|
/datum/asset/proc/queued_generation()
|
|
CRASH("[type] inserted into SSasset_loading despite not implementing /proc/queued_generation")
|
|
|
|
/datum/asset/proc/get_url_mappings()
|
|
return list()
|
|
|
|
/// Returns a cached tgui message of URL mappings
|
|
/datum/asset/proc/get_serialized_url_mappings()
|
|
if (isnull(cached_serialized_url_mappings) || cached_serialized_url_mappings_transport_type != SSassets.transport.type)
|
|
cached_serialized_url_mappings = TGUI_CREATE_MESSAGE("asset/mappings", get_url_mappings())
|
|
cached_serialized_url_mappings_transport_type = SSassets.transport.type
|
|
|
|
return cached_serialized_url_mappings
|
|
|
|
/datum/asset/proc/register()
|
|
return
|
|
|
|
/datum/asset/proc/send(client)
|
|
return
|
|
|
|
/// Returns whether or not the asset should attempt to read from cache
|
|
/datum/asset/proc/should_refresh()
|
|
return !cross_round_cachable || !CONFIG_GET(flag/cache_assets)
|
|
|
|
/// Immediately regenerate the asset, overwriting any cache.
|
|
/datum/asset/proc/regenerate()
|
|
unregister()
|
|
cached_serialized_url_mappings = null
|
|
cached_serialized_url_mappings_transport_type = null
|
|
register()
|
|
|
|
/// Unregisters any assets from the transport.
|
|
/datum/asset/proc/unregister()
|
|
CRASH("unregister() not implemented for asset [type]!")
|
|
|
|
/// Simply takes any generated file and saves it to the round-specific /logs folder. Useful for debugging potential issues with spritesheet generation/display.
|
|
/// Only called when the SAVE_SPRITESHEETS config option is uncommented.
|
|
/datum/asset/proc/save_to_logs(file_name, file_location)
|
|
var/asset_path = "[GLOB.log_directory]/generated_assets/[file_name]"
|
|
fdel(asset_path) // just in case, sadly we can't use rust_g stuff here.
|
|
fcopy(file_location, asset_path)
|
|
|
|
/// If you don't need anything complicated.
|
|
/datum/asset/simple
|
|
_abstract = /datum/asset/simple
|
|
/// list of assets for this datum in the form of:
|
|
/// asset_filename = asset_file. At runtime the asset_file will be
|
|
/// converted into a asset_cache datum.
|
|
var/assets = list()
|
|
/// Set to true to have this asset also be sent via the legacy browse_rsc
|
|
/// system when cdn transports are enabled?
|
|
var/legacy = FALSE
|
|
/// TRUE for keeping local asset names when browse_rsc backend is used
|
|
var/keep_local_name = FALSE
|
|
|
|
/datum/asset/simple/register()
|
|
for(var/asset_name in assets)
|
|
var/datum/asset_cache_item/ACI = SSassets.transport.register_asset(asset_name, assets[asset_name])
|
|
if (!ACI)
|
|
log_asset("ERROR: Invalid asset: [type]:[asset_name]:[ACI]")
|
|
continue
|
|
if (legacy)
|
|
ACI.legacy = legacy
|
|
if (keep_local_name)
|
|
ACI.keep_local_name = keep_local_name
|
|
assets[asset_name] = ACI
|
|
|
|
/datum/asset/simple/send(client)
|
|
. = SSassets.transport.send_assets(client, assets)
|
|
|
|
/datum/asset/simple/get_url_mappings()
|
|
. = list()
|
|
for (var/asset_name in assets)
|
|
.[asset_name] = SSassets.transport.get_asset_url(asset_name, assets[asset_name])
|
|
|
|
/datum/asset/simple/unregister()
|
|
for (var/asset_name in assets)
|
|
SSassets.transport.unregister_asset(asset_name)
|
|
|
|
// For registering or sending multiple others at once
|
|
/datum/asset/group
|
|
_abstract = /datum/asset/group
|
|
var/list/children
|
|
|
|
/datum/asset/group/register()
|
|
for(var/type in children)
|
|
load_asset_datum(type)
|
|
|
|
/datum/asset/group/send(client/C)
|
|
for(var/type in children)
|
|
var/datum/asset/A = get_asset_datum(type)
|
|
. = A.send(C) || .
|
|
|
|
/datum/asset/group/get_url_mappings()
|
|
. = list()
|
|
for(var/type in children)
|
|
var/datum/asset/A = get_asset_datum(type)
|
|
. += A.get_url_mappings()
|
|
|
|
/datum/asset/group/unregister()
|
|
for (var/type in children)
|
|
var/datum/asset/A = get_asset_datum(type)
|
|
A.unregister()
|
|
|
|
/datum/asset/changelog_item
|
|
_abstract = /datum/asset/changelog_item
|
|
var/item_filename
|
|
|
|
/datum/asset/changelog_item/New(date)
|
|
item_filename = SANITIZE_FILENAME("[date].yml")
|
|
SSassets.transport.register_asset(item_filename, file("html/changelogs/archive/" + item_filename))
|
|
SSassets.transport.register_asset("bubber_[item_filename]", file("html/changelogs/bubber_archive/" + item_filename)) // BUBBER EDIT ADDITION: Changelog 2
|
|
|
|
/datum/asset/changelog_item/send(client)
|
|
if (!item_filename)
|
|
return
|
|
// BUBBER EDIT CHANGE: Changelog 2: Original: . = SSassets.transport.send_assets(client, item_filename)
|
|
. = SSassets.transport.send_assets(client, list(item_filename, "bubber_[item_filename]"))
|
|
|
|
/datum/asset/changelog_item/get_url_mappings()
|
|
if (!item_filename)
|
|
return
|
|
. = list("[item_filename]" = SSassets.transport.get_asset_url(item_filename))
|
|
. += list("bubber_[item_filename]" = SSassets.transport.get_asset_url("bubber_[item_filename]")) // BUBBER EDIT ADDITION: Changelog 2
|
|
|
|
/datum/asset/changelog_item/unregister()
|
|
if (!item_filename)
|
|
return
|
|
SSassets.transport.unregister_asset(item_filename)
|
|
SSassets.transport.unregister_asset("bubber_[item_filename]") // BUBBER EDIT ADDITION: Changelog 2
|
|
|
|
//Generates assets based on iconstates of a single icon
|
|
/datum/asset/simple/icon_states
|
|
_abstract = /datum/asset/simple/icon_states
|
|
var/icon
|
|
var/list/directions = list(SOUTH)
|
|
var/frame = 1
|
|
var/movement_states = FALSE
|
|
|
|
var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png"
|
|
var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format
|
|
|
|
/datum/asset/simple/icon_states/register(_icon = icon)
|
|
for(var/icon_state_name in icon_states(_icon))
|
|
for(var/direction in directions)
|
|
var/asset = icon(_icon, icon_state_name, direction, frame, movement_states)
|
|
if (!asset)
|
|
continue
|
|
asset = fcopy_rsc(asset) //dedupe
|
|
var/prefix2 = (directions.len > 1) ? "[dir2text(direction)]." : ""
|
|
var/asset_name = SANITIZE_FILENAME("[prefix].[prefix2][icon_state_name].png")
|
|
if (generic_icon_names)
|
|
asset_name = "[generate_asset_name(asset)].png"
|
|
|
|
SSassets.transport.register_asset(asset_name, asset)
|
|
|
|
/datum/asset/simple/icon_states/multiple_icons
|
|
_abstract = /datum/asset/simple/icon_states/multiple_icons
|
|
var/list/icons
|
|
|
|
/datum/asset/simple/icon_states/multiple_icons/register()
|
|
for(var/i in icons)
|
|
..(i)
|
|
|
|
/// Namespace'ed assets (for static css and html files)
|
|
/// When sent over a cdn transport, all assets in the same asset datum will exist in the same folder, as their plain names.
|
|
/// Used to ensure css files can reference files by url() without having to generate the css at runtime, both the css file and the files it depends on must exist in the same namespace asset datum. (Also works for html)
|
|
/// For example `blah.css` with asset `blah.png` will get loaded as `namespaces/a3d..14f/f12..d3c.css` and `namespaces/a3d..14f/blah.png`. allowing the css file to load `blah.png` by a relative url rather then compute the generated url with get_url_mappings().
|
|
/// The namespace folder's name will change if any of the assets change. (excluding parent assets)
|
|
/datum/asset/simple/namespaced
|
|
_abstract = /datum/asset/simple/namespaced
|
|
/// parents - list of the parent asset or assets (in name = file assoicated format) for this namespace.
|
|
/// parent assets must be referenced by their generated url, but if an update changes a parent asset, it won't change the namespace's identity.
|
|
var/list/parents = list()
|
|
|
|
/datum/asset/simple/namespaced/register()
|
|
if (legacy)
|
|
assets |= parents
|
|
var/list/hashlist = list()
|
|
var/list/sorted_assets = sort_list(assets)
|
|
|
|
for (var/asset_name in sorted_assets)
|
|
var/datum/asset_cache_item/ACI = new(asset_name, sorted_assets[asset_name])
|
|
if (!ACI?.hash)
|
|
log_asset("ERROR: Invalid asset: [type]:[asset_name]:[ACI]")
|
|
continue
|
|
hashlist += ACI.hash
|
|
sorted_assets[asset_name] = ACI
|
|
var/namespace = md5(hashlist.Join())
|
|
|
|
for (var/asset_name in parents)
|
|
var/datum/asset_cache_item/ACI = new(asset_name, parents[asset_name])
|
|
if (!ACI?.hash)
|
|
log_asset("ERROR: Invalid asset: [type]:[asset_name]:[ACI]")
|
|
continue
|
|
ACI.namespace_parent = TRUE
|
|
sorted_assets[asset_name] = ACI
|
|
|
|
for (var/asset_name in sorted_assets)
|
|
var/datum/asset_cache_item/ACI = sorted_assets[asset_name]
|
|
if (!ACI?.hash)
|
|
log_asset("ERROR: Invalid asset: [type]:[asset_name]:[ACI]")
|
|
continue
|
|
ACI.namespace = namespace
|
|
|
|
assets = sorted_assets
|
|
..()
|
|
|
|
/// Get a html string that will load a html asset.
|
|
/// Needed because byond doesn't allow you to browse() to a url.
|
|
/datum/asset/simple/namespaced/proc/get_htmlloader(filename)
|
|
return url2htmlloader(SSassets.transport.get_asset_url(filename, assets[filename]))
|
|
|
|
/// A subtype to generate a JSON file from a list
|
|
/datum/asset/json
|
|
_abstract = /datum/asset/json
|
|
/// The filename, will be suffixed with ".json"
|
|
var/name
|
|
|
|
/datum/asset/json/send(client)
|
|
return SSassets.transport.send_assets(client, "[name].json")
|
|
|
|
/datum/asset/json/get_url_mappings()
|
|
return list(
|
|
"[name].json" = SSassets.transport.get_asset_url("[name].json"),
|
|
)
|
|
|
|
/datum/asset/json/register()
|
|
var/filename = "data/[name].json"
|
|
fdel(filename)
|
|
rustg_file_write(json_encode(generate()), filename)
|
|
SSassets.transport.register_asset("[name].json", fcopy_rsc(filename))
|
|
fdel(filename)
|
|
|
|
/// Returns the data that will be JSON encoded
|
|
/datum/asset/json/proc/generate()
|
|
CRASH("generate() not implemented for [type]!")
|
|
|
|
/datum/asset/json/unregister()
|
|
SSassets.transport.unregister_asset("[name].json")
|