It is time for a minor update! This week we bring light highlights, so you can now see lights in the distance. This is a huge help for identifying runways, vehicles, or seeing distress flares and strobes.
This week, we have also added the long awaited 3 way corner pipe junction in pipe and block form! This component is frequently requested and completes the set of pipe pieces.
Distant Lights
Omni-directional lights now produce small glints in the distance, to better model the appearance of lights when they are far away.
This is particularly useful for Stormworks, where runway lights are very important to be able to see from distance, or where you are trying to locate a vehicle or player who have navigation lights, flares or emergency strobes. In effect, this small change to the cosmetics to lights is actually a very mechanical update, and is all about navigation and locating objectives.
It also makes vehicles and lights look better at distance, and improves the effect of navigation and landing lights, to help communicate your direction and intentions.
3 Way Corner Pipe
The final pipe piece is here! The pipe set is finally complete!
The corner pipe works just like other pipe components, creating junctions for fluids, gasses, or torque to travel along. This piece is useful where space is limited and the layout of other parts makes this particular junction necessary to fit everything in.
Winter Break
It has been a busy winter break! We have moved to our new office and were working hard over the break decorating the walls and reconditioning our furniture. Here in the UK, we are not allowed to use our office yet due to Covid-19, but we hope to move in soon enough. In the mean time, we will continue with our development plans working from home.
Questions and Answers
In case you missed it, we did a Q&A video over on MrNJerseys Youtube channel. It was really fun to talk about Stormworks and share upcoming development info, and we think these should become a regular feature to engage with players and better communicate the development plans.
We plan to keep progressing and balancing the new modular engines, and are very excited to get to new fixes and features in this new year.
As always, there are plenty of other changes and fixes in this update, so please see the full change log below for details.
We look forward to reading your thoughts and feedback on this new update!
Much love <3,
The Stormworks Developers
v1.0.26
Rework - Experimental Internal torque damage is now tied to 'Engine Overheating' setting instead of general 'Vehicle Damage' Fix - Wheels killing/launching players Fix - getPlaylistIndexByName() functionality Fix - Disabled Load button during Saving Fix - Multiplayer CTD caused by returning a vehicle to workbench that is connected via rope to another object
v1.0.27
Feature - Runway Lights and Distant Light Flares Feature - Pipe Angle Corner and Pipe Angle Corner (Enclosed) Fix - CTD on setCharacterSeated with an object with no loaded dynamic object
This week we discuss the new modular engine mechanics recently added, the design intentions, and development plans.
We are also announcing that we are taking a 2 week break this winter for the holiday period. Yesterday we moved office, and over the next couple of weeks, we will be decorating and setting up the new office. Up until now, we have been sharing an office with other businesses, and are really excited to be getting our own small studio to make games in.
This means there will be no new announcements over the next couple of weeks, but main development will resume on January 4th.
Thank you to everyone who submitted questions this week for the Q and A session. Our plan is to record the answers for Youtube (perhaps with the help of MrNJersey) so keep an eye out on Youtube for the responses to your questions!
Modular Engine Mechanics
Over the last few weeks, with the help of player feedback, we have been reviewing the modular engine components, how they work, and how they interact with each other. We have added various new systems and updated existing mechanics:
Sea Water
We have split the "water" fluid type into two types - sea water and fresh water! Sea water comes from the sea, while fresh water can be spawned using fluid spawners or tanks. The critical difference is that fresh water is suitable for modular engine cooling, while sea water will cause engine scaling causing the engine to cool less efficiently.
Heat Exchangers
We have added new fluid-to-fluid, gas-to-fluid, and gas-to-gas temperature exchangers. In these parts, there are two routes for fluid or gas to pass through these components. Heat transfers between these routes so that temperature averages out between the two flows.
Be sure to use the right type of exchanger for your application. Heat will not efficiently transfer if you transfer gas through a fluid path or vice-versa.
Heat exchangers are very useful for modular engine cooling, particularly where you want to use sea water cooling systems. Using a heat exchanger rather than passing sea water straight through your modular engine is an effective cooling strategy.
Turbo Charging and Centrifugal Pumps
We have reduced the turbo charger to a single impeller type pump. This allows you to arrange your turbo from two pumps in any orientation you like, use it to make a supercharger, or just use it as a mechanical pump.
Gear Boxes
We have created a new set of gear boxes from the smallest 1 block gearbox, to much larger units. These new gearboxes have a max torque load, and if you exceed their specifications, the gearboxes can be damaged.
Smaller gearboxes does make it easier to create larger gear sets with more ratio combinations.
Electric Radiators
We have added new radiators that include electric fans. Running these fans provide improved cooling at the cost of electric consumption. These radiators can be particularly useful as secondary cooling for vehicles that use air scoops to use moving air to pressurize a primary cooling system. This kind of system may be particularly effective on fast moving vehicles such as jet boats or planes, but doesn't have as much effect when the vehicle is not moving.
We plan to continue to improve modular engines with your feedback so let us know your thoughts and help us shape this next major update!
We are making this one-off announcement to share some special news.
Carrier Command 2
We are excited to announce that over the past couple of years, we have had the opportunity to build a sequel to the 1988 Microprose classic, Carrier Command (originally created by Ian Oliver and Graeme Bird). This game has been made by an entirely separate team to the Stormworks team, using a different original game engine and original code base.
This is a huge deal for us. I grew up on Microprose games, and as a game developer, I have always had a deep admiration for 1980s video game development, where the rules of game design were still being invented, hardware was extremely limiting, and development tools were primitive. When we are not making games, we are gamers ourselves and get really excited about classic games.
Carrier Command is one of the greatest example of 1980s game innovation. It was one of the first true 3D games, and the most detailed military sim of it's time. With an open world of islands to explore, and multiple cooperating vehicles, it has been a big inspiration in the creation of Stormworks. The magic and depth of this era of gaming is sadly lost in most of todays games, and something we have aimed to repair with Stormworks.
We have been working with Microprose (yes, they are back!) to create a true spiritual successor to the 1988 original. For us, that has been about capturing the depth of strategy and mechanics of the original, then pushing this all much, much further. You command from the carrier bridge, with a literalism where every screen, button and switch has an important function. You manage manufacturing, inventory, logistics, strategy, systems, and can take over manual control of any vehicle.
Carrier Command 2 is NOT a vehicle building game, it is a military simulation and strategy game.
For many players, this sequel is 30 years overdue and we only hope that we can make it worth the wait.
Carrier Command is made by a different development team, and the work is almost complete. Over the past 2 years, we have continued to release minor and major updates to our regular, uninterrupted Stormworks schedule and this is going to continue for years.
It has been very beneficial to be developing the additional experience, skills, and technology and both games have benefitted from being built near each other.
It is really important to us that players know we are committed to Stormworks and will support and improve the game for years to come. Let's discuss how:
Stormworks Development Roadmap
Here is our current roadmap as an info-graphic. We only have space to list out the main features and not all the minor updates, improvements and fixes that we will continue to add on our regular timetable.
If you have feedback or ideas that you think should be here, be sure to let us know! We are always listening to players and will adjust the plan to respond!
Answering Community Questions
Keeping players informed and answering your questions is important to us. We are going to trial a question and answer session and ask you to submit your questions over the next few days. We are still making plans but may try and answer them in a Youtube video. If this goes well, it could become a regular feature to best keep players informed and involved in the development process.
Submit your question now by clicking on this link! Thank you for the questions! Session has been recorded but keep an eye out here on the announcements and we may do this again.
Here is to 2021 and beyond! Tune back in on Friday for the weekly announcement.
This week, as a minor update, we are adding vehicle to vehicle fire spreading, and have also added game save compression.
Now, when two vehicles collide with a little force, there is a good chance fire will spread from one vehicle to the other. At the point of contact, fire can spread if that point on either vehicle is currently on fire.
Fire spreading collisions require a little force, but much less than the amount of force required to do damage.
This change only makes fires more able to spread, more able to get out of control, and more deadly. If you are responding to a vehicle fire on land or at sea, please use caution! A small contact could set your vehicle alight and leave you stranded in the ocean on a burning ship!
Game saves had grown considerably in size the past few weeks since we added AI ships, so we added save compression to reduce game saves down in size. Saves typically reduce in size by over 90%. This also resolves several player issues where some players experienced slow downs during saving. We also addressed the issue with slow downs after loading previously saved games.
Save games remain backwards compatible so your old saves will still work.
The reduced save file size will also help us when adding more vehicles to the world, such as AI helicopters and planes that we plan to implement over the coming months.
Thanks to everyone who gave feedback on last weeks upcoming announcement! I don't think we have ever had so many comments on an announcement before.
As always, see below for the full list of changes including fixes and changes.
Also, be sure to check out experimental branch if you are interested in the modular engines. We added loads of new components this week and updated some mechanics. It is all a work in progress so some imagination is required but gives a sneak preview on what we are working on.
We look forward to hearing your stories about spreadable fire and other feedback :-)
Keep an eye out for a one off extra announcement early next week! We will be sharing some very big news as well as plans for 2021. We can't wait to share this info and will post it here on Steam announcements when we have all the info together (probably on Tuesday!).
Much love <3,
The Stormworks Developers
v1.0.25
Feature - Fire surfaces now spread between vehicles upon physics contact Feature - Game saves now compress vehicles (Smaller and faster saves)
Fix - Lag Issue after reloading a world with AI vehicles in waiting state Fix - onCharacterSit not correctly returning object ID Fix - PID Max Error not saved when returning a vehicles
This week we will discuss the upcoming major updates we have started working on, and are in the pipeline to be delivered to players over the coming months.
We have taken players feedback, as well as the latest poll results very seriously, and aim to make the best improvements we can to your game.
Let's discuss the roadmap for upcoming major updates!
Modular Engines
Modular engines are currently being publicly tested over on the experimental branch of the game. So far we have added components for 1, 3 and 5 scale engines. We have already shared a render of the modular engine meshes, with many components yet to add, and balance yet to be completed.
We are hoping to make solid progress on modular engines over the next few weeks, and get more components and a better balance on experimental as soon as possible. Modular engines will be the next major update.
Nuclear Power
We are currently looking at component designs for nuclear power. The design concept is that nuclear reactors would be large and heavy and serve as a propulsion system for the biggest ships and submarines.
We are considering including components such as nuclear fuel rods, reactors, steam generators, steam turbines and condensers. In this way, nuclear reactors would be modular and players could arrange and connect them in many ways depending on their application.
We are still early in the design phase and would love to hear players ideas and feedback.
Steam Engines
We are currently looking at component designs for steam engines. There would be some component and system cross over with the nuclear steam components, but would be a lower sized and lower power set for medium sized vehicles.
Components could include coal bunkers, coal screws, furnaces, boilers, and piston drivers.
Let us know your thoughts and ideas, and what applications you would like to see steam engines used for.
More AI Vehicles
With AI boats now live on the main version of the game, we are also looking at AI helicopters and AI planes. These new vehicle types would work in a similar way to boats, with the seat type tagged to use a specific AI type and control input scheme. You would occasionally see aircraft in the sky flying past.
We are working on a set of AI compatible vehicles, the new AI code for piloting them, and the updates to the AI vehicles script to support spawning them.
Vehicle Weapons DLC
As the close second most highly voted request on the most recent poll, modular vehicle weapons are in development. This will be a paid DLC to reflect how big a change it is to the game experience, and to protect the base game as a search and rescue sandbox.
We are considering a variety of vehicle weapons, from 50cal machine guns, up to huge howitzer cannons, or explosive charges for your own mines, missiles, and torpedoes. The gun systems would be modular to incorporate gun cycle and chambering mechanics, and ammunition handing and feeding mechanics. Weapons would cause damage in a similar way to collisions and the new explosions that we quietly added in version 1.0.
With weapons and all other features in development, we look forward to working with players to design the best possible new features for Stormworks.
We have our work cut out, with many months of work planned. We continue to carefully consider players feedback and will be sure to run another poll after we have had chance to release at least a couple of these features so all players can have a fair say in the future direction of Stormworks.
We have also made some fixes and improvements. See patch notes below!
Much love <3,
The Stormworks Developers
Patch Notes
v1.0.24
Rework - Added Max error value setting for the PID block (set to zero to disable clamping)
Fix - Quit button disabled for multiplayer clients Fix - Quit button disabled while incapacitated Fix - Stormworks not responding while saving Fix - SetVehiclePos() not correctly updating vehicle physics positions Fix - Updated AI vehicles script to remove unused objects that were causing errors
This week, we bring you AI ships! There will now be hundreds of AI ships passively sailing in the ocean. These ships are persistent, and will continue to move around the world even when you are not around. These ships are on journeys and path-find across the ocean to reach their destination.
This feature has been on experimental, but is now in the main version of the game.
If you want to add your own ships to the AI system, follow the guide here: https://youtu.be/DyXhPy1oegc Remember, vehicles with big or complex physics will slow the game down, so please Stormworks responsibly.
To achieve this new feature, we have added a new property to seats: "AI Type". You can now set the type of AI to be used by NPCs on that particular seat. Right now, there is only one type of seat AI (ship piloting), and only NPCs that have had their AI activated via scripts are able to use these seats - but many of you will see the direction this may be headed!
We have also added new Lua functions to modify the AI state of an NPC - including being able to enable and disable AI capability, and set an AI action such as pilot to a destination.
Could this feature be extended to allow players to hire NPCs with AI capability, place them in seats, and give them orders? Are there other ways we could extend this feature? Let us know in the discussion comments!
This new feature has been actively developed over the last couple of weeks on experimental branch so many thanks to all the players who have been trying it out and giving feedback.
In response to your poll results, we are prioritizing new features that the community have decided most important. AI Ships, Planes & Helicopters ranked no. 5 in your most recent poll. We also hope to add AI helicopters and planes in the future. Meanwhile, we have also begun working on other highly voted new features, all while continuing to fix bugs and issues.
We hope you enjoy this new feature, and find it gives more life and interest to the world of Stormworks!
As always, we look forward to hearing all your thoughts and feedback.
Much love <3,
The Stormworks Developers
Patch Notes
v1.0.22
Feature - New AI Ships Playlist and character/seat AI behaviour type
Rework - Manual saving now uses a background thread like autosaves (It is not reccomended to exit the game during saving)
Fix - Added onVehicleDespawn callback for explosions Fix - Large Rotors editor selection hitbox updates Fix - Door editor selection hitbox updates Fix - NPC characters taking damage Fix - River boats should no longer be treated as land vehicles for towing missions
Playlist Api Changes:
server.setVehicleKeypad(vehicle_id, keypad_name) value, is_success = server.getVehicleDial(vehicle_id, keypad_name) POSITION_LIST = server.pathfindOcean(start_matrix, end_matrix) POSITION_LIST | { i = {x = world_x, y = world_y, z = world_z}}
This week we begin testing 5x scale modular engine parts, new power and fuel modular engine balance, and AI boats in Stormworks (available now on the experimental branch of the game).
As discussed a couple of weeks ago, we have plenty of plans for the modular engines, and this week we are adding the 5x scale parts. These parts extend the 1x and 3x scale parts already on experimental.
The 5x scale parts include a piston, crankshaft, clutch, power manifold, and 5x to 3x adapter. These new parts allow players to create much larger, more powerful ship engines.
Along with these new parts, we have also been talking with and carefully listening to the experimental community, and have rebalanced modular engine fuel consumption and power production to make modular engines much more comparable with the non-modular engine performance.
Fuel consumption has been lowered and power production has been increased. This makes modular engines much more practical and effective to use. While modular engines are harder to design and use than their non-modular counterparts, the intention is that they can have prove very versatile and have a slight advantage in performance.
We have also begun work on AI boats which we plan to be a future minor update. This feature is being shared on experimental branch as we develop it. This feature involves various boats and ships spawning across the ocean, and navigating around with AI drivers. We are developing this feature in the new LUA framework and are having great fun building it up.
Boats and ships will travel through the world, and persistently move, even when the player is far away. This means that they can appear on the horizon and pass you by, before continuing on their journey as they vanish on the opposite horizon.
This is part of our plan to create a more dynamic, interesting world for players to explore. These new AI boats have been carefully designed to have simpler physics.
A full list of changes is available in the #experimental-changelog channel in the Official Stormworks Discord.
We are having a great time adding these new features, and hope you have as much fun playing with them. We look forward to hearing your thoughts and feedback!
This week we are releasing a series of new and updated LUA functions that we have been developing in collaboration with players on the experimental branch!
With high demand, we have added many new functions for getting info about the world, as well as spawning and removing various objects. Many of these new functions have huge implications for what can be done with the scripting API, and many of these functions serve as a keystone for your projects.
We have been releasing these changes to the experimental branch as we have developed them. Now, with the benefit of player feedback, we are releasing them as a pack of functions in a minor update.
See the technical data below for a full list of changes to the API. This information is also reflected in the in-game API reference.
Meanwhile, we continue to work hard on the new modular engines and look forward to sharing the new features discussed last week. These new features will be released on experimental branch as we develop them, to give all players the chance to provide feedback.
We also have many new minor updates on the way, many of which use these new LUA functions!
We look forward to seeing what players build with the new API functions, as well as seeing other players complete their projects now the functions they requested are available.
As always, we look forward to your thoughts and feedback!
These functions performed the exact same task as server.despawnObject(object_id, is_instant)
hp, matrix, is_incapacitated, is_dead, is_interactable = server.getCharacterData(object_id) Character position can be obtained with server.getObjectPos(object_id)
Mission objects have been renamed to components to avoid confusion with game objects
function onSpawnMissionObject(object_id/vehicle_id, name, TYPE_STRING, playlist_index) function onSpawnMissionComponent(object_id/vehicle_id, component_name, TYPE_STRING, playlist_index)
function onVehicleSpawn(vehicle_id, peer_id, x, y, z, cost) Cost is currently only calculated for player spawned vehicles
function onChatMessage(peer_id, sender_name, message)
Quick info for updating old scripts ===================================
Removed Functions: despawnCharacter did the same thing as despawnObject despawnMissionObject did the same thing as despawnObject
Renamed Functions: -teleportPlayer(peer_id, matrix) -> setPlayerPos(peer_id, matrix) -teleportVehicle(matrix, vehicle_id) -> setVehiclePos(vehicle_id, matrix) Please note the teleportVehicle arguments are swapped to be the same as other functions -onSpawnMissionObject -> onSpawnMissionComponent -spawnMissionObject -> spawnMissionComponent -setSeated(peer_id, vehicle_id, seat_name) -> setCharacterSeated(object_id, vehicle_id, seat_name) As seen above setCharacterSeated (and other character based functions) now use an object_id. To get a player's object id a new function has been added: getPlayerCharacterID(peer_id)
Functions that now return an is_success value will requre an extra set of brackets if used as arguemnts as lua will attempt to pass all return values unless the function is evaluated old `local x, y, z = matrix.position(server.getPlayerPos(player_object.id))` new `local x, y, z = matrix.position((server.getPlayerPos(player_object.id)))`
Rework - Cargo container design rework (Toggle buttons for connectors) Rework - Added voice audio volume boost Rework - Slightly increased player ground collider radius to aid getting stuck in small gaps Rework - Added key type support for lua data saving (Now supports string(default) and unsigned)
Fix - CTD when returning a vehicle on fire via the map Fix - Dedicated server ?save always saving to autosave Fix - Vehicle editor currency display not apperaing after toggling infinite money Fix - Playlist Lua callbacks errors are now cleared (Callbacks are not blocked after they error) Fix - Script duplication when reloading scripts Fix - onPlayerDie event resending when dropping a dead body Fix - Client character objects not updating their internal peer_id when reconnecting to a server (Wrong peer_id Lua bug) Fix - Several crashes from playlist Lua Fix - Missing notification for loot crates Fix - CTD with out of range outfit for spawnCharacter Fix - CTD with out of range item for setCharacterItem Fix - onPlayerSit now only triggers for player characters Fix - Unable to place blocks on certain sides of doors Fix - spawnFire() rejecting correct number of arguments Fix - CTD on Lua failing to find vehicle data Fix - Dev Train Junction MC showing in inventory
This week we have been hard at work on bug fixes and improvements, many of which will soon arrive on experimental branch.
We are also announcing some of the new concept we are working on with modular engines!
5 Size Parts
We are already testing 1 size and 3 size modular engine parts, but we are also considering adding a 5 size modular engine set with crank shafts and pistons occupying 5x5x5 voxels. These parts would be significantly heavier and more powerful than the smaller engine parts, with a weight to power ratio that is slightly more efficient than the smaller parts.
Flywheels
We are considering adding flywheels to engines. Flywheels would affect the engines overall weight and momentum, allowing it to store more energy, for high-torque applications. These flywheel parts would fit to the crankshaft.
Turbo Chargers
With the new combustion mechanics, air pressure is an important factor in generating power from engines. We are considering adding a turbo that can convert pressure from one line to another. For example, players could run their exhaust through a turbo to increase the pressure and flow of the air intake.
Air Scoops
New fluid parts that consider air flow speed can generate pressure at the point of intake. These parts could be like fluid ports, except they generate higher pressure when facing into wind or the direction of motion.
Heat Exchangers
Many players have been asking for heat exchangers and the concept of distilled water versus sea water. We are considering splitting the 'water' fluid type into 'sea water' and 'distilled water'. Sea water would damage engines over time, meaning the use of heat exchangers would be essential to circulate clean water through a ship engine that was using sea water cooling.
We can't wait to share new modular engine features with you, and will continue to share our progress on the experimental branch as we develop new features and concepts.
Thanks to the many players who have given us feedback on the new modular engines so far.
This week we continue to develop the career and missions in Stormworks with new towing missions!
New missions will appear where the player needs to tow ships, trucks, and other vehicles that have experienced mechanical failures. These are very different mission types that provide a very different logistical challenge.
These new mission types are less frequent but combine with the rescue missions and transport missions to extend the kind of challenges and gameplay you experience in career mode.
We have more plans for career mode, but please keep sharing your ideas and suggestions with us as we continue to develop this part of the game.
Much of this new update has already been available and tested on the experimental branch.
Today we are also launching stoichiometrics for the modular engines on the experimental branch. This new concept is a rework of the combustion mechanics and algorithms within engines. Now, air to fuel ratio, RPM, engine temperature, and compression factor all influence the output of modular engines.
The air fuel manifold is now two separate components so that flow of fuel and air can be controlled independently.
Cylinders / pistons now show a new "stoichiometric" value on their tooltip. This is related to the air to fuel ratio and engine temperature, and is a value between -1 and 1. Within these values, the air to fuel ratio is within it's combustion range and the fuel will ignite. Outside of this range the engine is either too lean (-1), or flooded and too rich to fire (1). Cold engines require a richer air to fuel mix and will fire only within a narrower range of air to fuel ratio.
Cylinders / pistons also display a new "efficiency" value, based on the stoichiometric value and the RPM. Slightly lean fuel-air mix will produce higher fuel efficiency, while slightly rich will produce maximum power output. At higher RPM, the fuel and air will have less opportunity to mix and will decrease the power efficiency.
These new mechanics mean that designing modular engines is much more involved, and creating an engine that works well is a greater challenge. At the same time, we are trying to make the mechanics more transparent with these new tooltip values, and improve the fuel efficiency algorithm. The new system is designed to be more realistic, but still gamified and balanced for compatibility with other Stormworks components.
Modular engines continue to be subject to much change, so expect more changes, improvements and rebalances in response to your feedback.
We look forward to your thoughts and feedback on the new modular engine mechanics!
As always, we are also working very hard fixing bugs and making other improvements, so please see below for the full change log.
Much love <3,
The Stormworks Developers
v1.0.20
Feature - New Tow / Transport Vehicle missions
Experimental Feature - New Modular Engine Air/Fuel Stoichiometry (Check out the experimental branch through Steam!)
Rework - Added network event to sync fully extinguished vehicle fires Rework - Locating a rescue mission grants 30 mins more mission time Rework - Decreased radius of locate zone objective so it should always be in view when completed Rework - Mission UI is rebuilt when the map is opened Rework - Rewards for deliver objectives now scale with distance Rework - Doubled playlist script max characters
Fix - Remote Control not working fully for MP clients Fix - onToggleMap callback not getting called Fix - CTD when teleporting vehicle with NPC to workbench Fix - CTD when rescuing character to the edge of a Hospital zone Fix - Cargo script spawn count error with odd number of spawn locations Fix - ?save not saving in certain situations Fix - Playlist Lua getTilePurchased() requiring tile to be loaded Fix - Screen fade not reversing if revived with <5 seconds left Fix - Winches not saving correctly (Weird state when reloading them) Fix - Gimbal Cameras not saving orientation correctly Fix - CTD from monitor render target Fix - Internal character peer_id not updating when relogging into a server (Playlist Lua looking for wrong peer_id) Fix - Camera clipping into emissive player outfits Fix - Z fighting on emissive player outfits Fix - Seasonal outfit visual issues Fix - Seasonal main menu camera clipping into trees
Lua Documentation updates: Added section listing built in commands Added section for API general info Several small fixes