* Add BloodstreamComponent and BloodstreamSystem
New component for metabolizing reagents that other organs like the stomach pass their input reagents to.
* Change StomachComponent to put ingested reagents in bloodstream after delay
Now StomachComponent does not metabolize any reagents. Instead, it tracks how long each reagent has been inside it, and once they pass "digestionDelay" they'll be put inside the bloodstream, where the bloodstream will handle metabolism of the reagent.
* Add reagent injectors
Injects reagents straight into the bloodstream when used on mobs with bloodstreams. Also allows draw/inject from beakers. Does not support drawing blood/reagents from the bloodstream yet.
* Address code review
Make use of `Loc` static class instead of using `ILocalizationManager`. Localize InjectorToggleMode enum properly.
#574 added an out arg to `SolutionComponent.TryRemoveSolution` containing the solution that was removed. I made this change since I thought there was no way to get the removed solution for further use. Didn't notice `SplitSolution` which provides nearly the same behavior. With this PR I want to remove that out arg from `TryRemoveSolution` to keep the SolutionComponent API simple and to avoid having multiple ways of doing things. Existing code uses `SplitSolution`, I just wasn't paying attention.
Feel free to deny merging this if I'm over thinking it. I think it'll help keep solution code from becoming a mess.
* Several sandbox manager improvements
- Bound sandbox manager to B key as it lists on the UI
- Bound entity spawner to F5
- Bound tile spawner to F6
- Made entity spawner and tile spawner toggle instead of repeated spawning new windows from the sandbox panel
* Move relevant keyfunctions from engine to content
Turns out it was unnecessary to have the key functions in the engine as all code using the ones added here are in content.
* Add click-based solution transfer
For example, clicking on a beaker with a soda can to transfer the soda to the beaker. Works on plain solution containers like beakers and also on open drink containers like soda cans as long as they have the `PourIn` and `PourOut` solution capabilities. If no `SolutionComponent` is added to a drink entity, the `DrinkComponent` will give the entity one. This PR extends that behavior slightly by also giving these default `SolutionComponent`'s the proper capabilities for pouring in/out.
* Improve fix for poured drinks not immediately disappearing
Instead of making `DrinkComponent.Use` public this
splits out the code important to both users and made that function public, leaving `Use` private.
* Shorten solution transfer popup
* Make code review changes
- Move pouring code from SolutionComponent to new PourableComponent. Added PourableComponent to client ignore list and added to existing container prototypes.
- Added EmptyVolume property to shared SolutionComponent for convenience.
- Removed DrinkComponent fix from pouring AttackBy code. Instead DrinkComponent subscribes to the SolutionChanged action and updates its self when necessary.
- Fixed pouring being able to add more than a containers max volume and sometimes deleting reagents.
- Added message for when a container is full.
* More code review changes
- Remove IAttackBy ComponentReference attribute in PourableComponent
- Remove _transferAmount from shared SolutionComponent. Left over var from previous commit not being used anymore.
* Implemented random character creation
* Pick from a list and apply a bit of randomness instead
* Rename SetInitialData, unselect list entries properly
* added Character Setup
* whoops
* reverted unrelated changes
* Made everything work post-rebase
* Removed unused PreferencesChanged event
* nope, don't need this
* HumanoidProfileEditorPanel -> HumanoidProfileEditor
* Set initial data for hair pickers
* Fixed nullable warning
* Renamed LooksComponent -> HumanoidAppearanceComponent
* Renamed LooksComponentState -> HumanoidAppearanceComponentState
* Final renaming maybe
* Use a human-like dummy instead of a real human
* Change preferences structs back to classes
1. made the magic mirror actually reflect your current hair state when you open it.
2. Made magic mirror one window.
3. Use color sliders for magic mirror.
* Instrument test.
* Midi stuff
* Some more work
* This actually works now!
* update
* Midi Audio works!
* Lots of stuff, and cool interfaces for items
* Update
* Fix a few things
* It just works
* Move textures to another folder, remove placeholder description from instruments
* Fix warning
* Use renderer enum
* Instruments now use DisposeRenderer method, and send MidiEvents as they receive them. Deletes InstrumentSystem whoo.
* Fix incorrect sprite paths
* Instruments take midi file size check into account when enabling/disabling midi playback buttons
* Fix crash when pressing drop on empty hand.
* Use new renderer return values for midi/input
* Xylophones are no longer handheld instruments, fix their sprites.
* Use new API
* Remove nfluidsynth from solution
* Timing information
* Use IGameTiming.CurTime for timestamps instead
* Adds tile removing behavior to CrowbarComponent.
Add FloorTileItemComponent.
Add genhit.ogg
Add tile.png for testing
* fixes
* Gives ContentTileDefinition a default value for tile item to drop.
Adds a few more tileitems.
* Changes per review request
* move stack.use and if statement
* Fix exception in ReagentPrototype
Due to client trying to access concrete implementations of IMetabolizable that are in Content.Server. This fix checks to see if the prototype is being loaded by the client through reflection. I don't want to move the prototype completely into Content.Server since it's useful for the client to view descriptions and values of reagents without needing to send that data from the server.
* Make fix slightly more explicit
Now it will only load the metabolizable when in Robust.Server, instead of it being anything that's not Robust.Client.
* Add IModuleManager and ModuleManager
Provide simple way to check if shared code is being run by the server or the client
* Change ModuleManager implementations to not require assembly name comparison
Now just has ClientModuleManager registered to client, and ServerModuleManager registered to server.
* Change IModuleManager functions to properties
* Fix failing tests.
This was failing because the tests weren't initializing IoC. Simply using RobustUnitTest wasn't enough because that doesn't initialize content either. I did some cleaning up so now content IoC is registered via ContentUnitTest.
* Implement Cargo Console
Add to CargoConsoleComponent GalacticBank information for syncing Bank Account Balance.
Implement CargoOrderDatabase on the server side and a list of orders in the CargoOrderDatabaseComponent on the client side. This makes it easier to change data on the server side but also utilize the state syncing between components.
Implement GalacticMarketComponent.
Only productIds get sent. Both client and server create their lists from YAML.
Implement basic spawning of items from approved orders in CargoOrderDatabase.
* Finish Cargo Console
Add validation to make sure Order Amount is one or more.
Implement approve and cancel buttons to CargoConsoleMenu orders list row.
Add price to CargoConsoleMenu product list row.
Implement CargoOrderDataManager to consolidate CargoOrder lists.
Refactor CargoOrderDatabaseComponent to use CargoOrderDataManager instead of storing duplicate lists.
Implement canceling orders.
Implement approving orders.
Fix sprite links.
Implement Cargo Request Console.
* Add power cell and weapon chargers
Functionality's similar to SS13. The cell charger won't show the discrete charging levels because effort to not make it spam appearance updates over the network.
There's some stuff I wasn't sure on:
1. Updating power? Particularly around fixing rounding
2. Duplicating the full and empty sprites as I couldn't figure out a way to not have AppearanceVisualizer throw if the state isn't found
3. I made a BaseCharger abstract class under the assumption that when a mech / borg charger is added it would also inherit from it.
4. GetText currently isn't localized
* Address PJB's feedback
Updated the BaseCharger
* Change nullref exception to invalidoperation
* If the user doesn't have hands it will just return instead
* Move chemical reaction effects into Chemistry/ReactionEffects/ subfolder
* Replace hardcoded StomachComponent metabolism with IMetabolizable
The benefits of this approach are that reagent metabolism effects are not hardcoded into StomachComponent, and metabolism effects can be more easily chained together in yaml prototypes, and reagents can have different metabolism rates. One problem with this approach is that getting metabolism rates slower than 1u / second is impossible. Implementing #377 should resolve that problem.
* Fix DefaultFood and DefaultDrink so they remove reagent regardless of Hunger/ThirstComponent presence
Previously if neither of those were present the reagents wouldn't be removed from the stomach. This fixes that.
* Additional comment on function
* Make metabolizer interface implementations explicit
Also removed some unused using statements
* Make StomachComponent._reagentDeltas readonly
* Fix misleading variable names and docs for metabolizables
Changes one of the arguments for `IMetabolizable.Metabolize()` to be called `tickTime` instead of `frameTime` to more accurately reflect it's purpose. It's not really the frametime, but the time since the last metabolism tick. Also updated and expanded the docs to reflect this and to be more clear.
* Add basic yaml Jobs file
* Add Job Prototype
* Rename Jobs to Job
* Remove BaseJob
* Add the Job class child of Role
* Add code for spawning as an assistant. Not actually working, the job prototype can't be found.
* Fix role instead of job left in yaml
* Add starting gear support for job and the starting gear for assistant as an exemple
* Link job with starting gear in yaml
* Better naming and some error handling
* Tweak error handling