<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. --> <!-- You can view Contributing.MD for a detailed description of the pull request process. --> ## About The Pull Request <!-- Describe The Pull Request. Please be sure every change is documented or this can delay review and even discourage maintainers from merging your PR! --> Assassinate/behead/eyesnatching objectives now share one common type so that they don't end up sharing the same targets. Also, this allows me to limit the amount of assassinate/behead/eyesnatch objectives by treating them like one objective type instead of 3 separate objective types. As a result, you can only get 4 of these objectives within a 15 minute period, which means your potential objective list won't be flooded with assassinate/kidnap objectives. Additionally, progression costs for traitor items have been rebalanced. Primarily, progression costs have either been removed or reduced for most non-murderboney traitor items. There are a few notable exceptions where the progression costs have been removed/reduced for murderboney traitor items, primarily for the Clown Car and His Grace. I'll go into the reasoning why below. Also fixed an obscure bug where traitor categories with a list depth greater than 2 would have their list mutated because they weren't being properly deep copied. Also, purchasing His Grace or Syndicate Balloon will now lock you out of future purchases and they can't be bought if you've already bought other items. ## Why It's Good For The Game <!-- Argue for the merits of your changes and how they benefit the game, especially if they are controversial and/or far reaching. If you can't actually explain WHY what you are doing will improve the game, then it probably isn't good for the game in the first place. --> Less duplicate objectives is for the better. Also, this'll give some of the other objectives some breathing room to appear. Progression costs have been normalised amongst the more murderbone-orientated items so that they all mostly unlock at 30 minutes for consistency purposes. Progression costs have been largely reduced for non-murderboney items because most of these items didn't need a progression cost in the first place, as they weren't really a problematic tool to use at the start of a round. For the items where their progression cost was reduced to 5 minutes, I'll go into the reasoning why now: **Clown car** - It's not really a tool that's used for murderbone and it works best at the start of a round. It can end up killing a large portion of the crew, but it takes a lot of effort to reach that point. I think reducing the progression cost of the clown car to 5 minutes allows for the clown car gimmick to happen more often. **His Grace** - Now this is a tool that is used primarily to go on a murderbone, but the reason that the progression cost has been decreased down to 5 minutes is because I think it's the one tool where you are supposed to get it at the start of a round and go on a murderbone, given its absurd price tag and the fact that you're required to kill others to survive. If this ends up being a boring roundstart murderbone tool, then I can look at increasing the progression cost back up to 30 minutes, but it's worth giving it a shot. To balance out His Grace, you can't purchase any uplink items after purchasing it, and it can't be purchased if you have already purchased items. ## Changelog <!-- If your PR modifies aspects of the game that can be concretely observed by players or admins you should add a changelog. If your change does NOT meet this description, remove this section. Be sure to properly mark your PRs to prevent unnecessary GBP loss. You can read up on GBP and it's effects on PRs in the tgstation guides for contributors. Please note that maintainers freely reserve the right to remove and add tags should they deem it appropriate. You can attempt to finagle the system all you want, but it's best to shoot for clear communication right off the bat. --> 🆑 balance: Reduced the reputation cost of most non-murderbone orientated uplink items like hypnotic flash and emag. balance: Reduced the amount of assassinate/kidnap/eyesnatch objectives that'll appear at once. /🆑 <!-- Both 🆑's are required for the changelog to work! You can put your name to the right of the first 🆑 if you want to overwrite your GitHub username as author ingame. --> <!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. --> --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Asset cache system
Framework for managing browser assets (javascript,css,images,etc)
This manages getting the asset to the client without doing unneeded re-sends, as well as utilizing any configured cdns.
There are two frameworks for using this system:
Asset datum:
Make a datum in asset_list_items.dm with your browser assets for your thing.
Checkout asset_list.dm for the helper subclasses
The simple subclass will most likely be of use for most cases.
Call get_asset_datum() with the type of the datum you created to get your asset cache datum
Call .send(client|usr) on that datum to send the asset to the client. Depending on the asset transport this may or may not block.
Call .get_url_mappings() to get an associated list with the urls your assets can be found at.
Manual backend:
See the documentation for /datum/asset_transport for the backend api the asset datums utilize.
The global variable SSassets.transport contains the currently configured transport.
Notes:
Because byond browse() calls use non-blocking queues, if your code uses output() (which bypasses all of these queues) to invoke javascript functions you will need to first have the javascript announce to the server it has loaded before trying to invoke js functions.
To make your code work with any CDNs configured by the server, you must make sure assets are referenced from the url returned by get_url_mappings() or by asset_transport's get_asset_url(). (TGUI also has helpers for this.) If this can not be easily done, you can bypass the cdn using legacy assets, see the simple asset datum for details.
CSS files that use url() can be made to use the CDN without needing to rewrite all url() calls in code by using the namespaced helper datum. See the documentation for /datum/asset/simple/namespaced for details.