Friday, December 28, 2018

New post to begin the new year, skills and broadsides

So development is not as fast as I'd like, but still chugging along.  Currently implementing the character skills system, which is about 2/3 done as far as adding skills, selecting a skill for training, and skill requirements for using items.  After that I need to hook in all the individual skill abilities, for example the Command skill will increase the number of crew your character can command on your ship (currently you can just set any ship you sail to max crew regardless of your skills). 

Skill training will be passive, similar to Eve Online's system.  You won't gain skills by doing things, instead you will purchase a book to study on a subject and add the book to your character's library.  Basically just purchasing/adding a skill to the character.  Then you can switch between available skills you want to train.  Training skills to higher level takes progressively longer amounts of time. 

Example below.  Higher levels include the amount of time it takes to reach the lower levels, meaning they are a total amount of time invested in training the skill. 

Level 1: 15 minutes
Level 2: 1 hour 30 minutes
Level 3: 9 hours
Level 4: 2 days 6 hours
Level 5: 13 days 12 hours

More advanced skills will take longer, even much longer, to train than the above example.  You'll be allowed to train a skill above level 5 for higher bonuses in whatever it provides, but no skill or item will have a requirement of any skill above level 5.  The code allows for skills to be trained up to level 20, but that would become prohibitively time consuming to train the skill that long.  Effectively though you can continue training skills up to level 6 or 7 on a realistic time frame.  There are also more advanced versions of skills that you can unlock for the same bonus effect, such as Advanced Command which becomes available when you have trained Command to level 5. 

Originally the design had the Tracker server handling skill training, but I've moved that functionality to the Zone servers themselves.  Any training to be applied to your character while you are offline actually occurs as soon as you log into the game based on the last time stamp when training was previously applied. 

Additionally after tester feedback I've redesigned the Broadside mechanic.  Originally the design was when sighting cannons you could press the Broadside button.  It would then fire off all loaded cannons on that side of the ship in the direction you were aiming.  Players though did not like that idea, instead wanting a way to fire cannons while in 3rd person mode (the birds eye view above your ship while you are navigating and not looking down the sights of your cannons). 

So now there are two button, Port Broadside and Starboard Broadside which you can press regardless of what view you are using.  When looking down the sights of the cannons on the side of the ship for the broadside button pressed, it will use the direction you are aiming.  Otherwise all cannons will fire with the aim centered. 

So I hope everyone had a good Christmas, or whatever holiday you celebrate, and have a happy new year.  It is looking now that Broadside will be ready for large scale testing in the latter half of 2019. 

Wednesday, November 14, 2018

Continued progress, networking API success, market updates, current development

Networking API Updates


The new in house networking API has been very successful.  Only relatively minor bugs and improvements have been needed to it so far after putting it through testing in the project.  The biggest issue found was some testers were unable to receive certain packets but were not disconnecting.  I tracked down the most likely cause to some ISP's were dropping larger sized UDP packets without fragmenting them even though the packets should not have been sending with the don't fragment flag (was using packet sizes near max MTU). 

When first integrated into Broadside, sizes of different messages and overall UDP payload size was hard coded in all over the place with ample buffer room so nothing would accidentally overflow.  I went and completed the packet size feature, where on one of the main scripts I can set the exact maximum UDP payload size (packet size equals UDP payload + UDP header + IP header) and all other scripts maximize message sizes to the exact maximum number of bytes to fit.  Then I set the default UDP payload size to 508, which is a good safe maximum from my research where ISP's won't drop (or even fragment) UDP packets.  Testing by testers with the problem ISP's was successful. 

I'm seriously considering releasing JCGNetwork to other developers for free either to use directly, or can be used as example code on how they can utilize the Socket class for their own projects. 

City Markets

Buying/selling at city markets is now complete, as well as the supply/demand system.  The lists of all items as well as what is available from NPC's at various markets is still being worked on, but the core mechanics and the UI are all complete and successfully tested.  It was kind of exciting making the first trade runs while trying to avoid NPC pirates.  Default pricing of various ships and other ship related items, which had previously been set at 1 real, have been changed to more realistic pricing.  The game is starting to feel like a real MMO.  

To do still are player created buy/sell orders.  The back end of this is complete, but the UI still needs to be created.  

Server Performance

I did a small redesign of how server instances are launched to support creating a separate development mode build just for the zone servers which I can attach the profiler and examine what is burning so much CPU.  CPU performance on the server has been a bubbling issue where the current CPU usage on the main thread would prevent hitting the target of 60 to 100 concurrent users per zone.  As it is AI ships are producing the same CPU load as player ships, so this was easy to test by increasing the number of AI ship spawns.  

Zone servers are multithreaded, but the main thread was using approximately 2/3 of the CPU cycles.  I'm using a 5 year old AMD 8 core CPU on the test server, so a newer CPU with better single core performance would raise the top end, but on the test server I'd see performance issues cropping up at around 40 ships, significant issues around 60 ships, and become completely unresponsive much higher than that.  

The profiler exposed that to my surprise it was the physics system using the majority of the CPU.  I'm going to experiment with disabling colliders on AI ships that aren't near any players, but I found that the default fixed time step of 0.02 (50 FPS physics frame rate) is unnecessary for this game.  I was able to significantly drop physics usage by going to a 0.04 fixed time step, cutting the physics CPU usage by roughly half with no negative noticeable change to the user.  

In addition, I had previously assumed that all of my various systems that are updating every ship on every frame were the primary cause of high CPU usage, but my previous optimization passes were apparently more successful than I had thought.  These systems used a very low amount of CPU.  Also JCGNetwork used almost no CPU (granted I was testing with low user counts), and GC (garbage collection - managed code automatic memory management) was insignificant CPU usage.  Still, once the physics system was reduced in CPU usage, my scripts were taking up a little over half of the CPU cycles used.  I tracked the issue to a 3rd party script related to the water system I am using, specifically the ship wake feature on the surface of the water as ships move.  Even when ships are idle this script was burning CPU, and I don't even activate the wakes on the server.  

A simple "if (JCGNetworkManager.IsClient())" line so none of the code runs on the server anymore, and this bug was resolved, dropping script usage by well over half.  And because I dropped the physics frame rate down to 25, I didn't see a reason to keep the overall frame rate at 60, so I went ahead and dropped that to 25 as well for now.  The result is CPU usage that may very well support 100 clients per zone as it is now, with several avenues for further improvement to be investigated.  

Current Development

My volunteer testers are getting excited about the game, I'm getting excited about the game, and things are going generally very well.  One issue that has bugged the testers is I am currently just killing the server processes which is causing corruption of the database (not data corruption, but certain updates from the zone servers are getting written to disk by the database, which conflict with other data that isn't updated yet).  The biggest issue is ships, for example if the player switches to a different ship and then logs off, that player is immediately updated in the database with the ship they are sailing, but the ships in the city are not.  If I kill the server processes before the cities update to the database the same ship could be recorded as both being sailed by the player and stored at the dock in a city, causing problems in the game because these situations are unexpected and aren't explicitly handled.  So for now I've been just frequently wiping the database, annoying the testers who put work into their characters.  Some of this is unavoidable, but once a week is an unnecessary irritation.  

So I'm currently working on the Command Console, which is a separate application for controlling the server cluster.  The first feature added is the server cluster spin down command.  Where the Command Console tells the Master Server to switch to auto spin down mode.  The Master Server then manages a safe power down of the entire cluster.  It starts by shutting down the Login Server, followed by all the Zone Servers.  Before shutting down, the zone servers disconnect all players and update all player characters, ships, city storage, and city markets to the database.  This is then followed by shutting down the Tracker Server, followed by shutting down the Database Server which writes to disk before exiting.  After that the Master Server powers off.  The server cluster is then ready for a build update safely.  

After this is added, then I'll implement automatic spinning down of empty zones, which is just a single zone server doing the same process as above, the master server powering on zones when requested by the login server or zone servers when a player needs to enter the zone, and finally transitions between zones as the player travels the map.  That will be exciting because a lot of the fun in Broadside is just sailing and exploring, but you're currently limited to zone 0's English Channel area map.  I'll then work on implementing the rest of Northern Europe, followed by the Mediterranean and west Africa, eventually getting to India and east Asia.  This will allow for a lot of the major trade routes to be tested, and get more feedback on the game, as well as allowing a lot of exploration with hours of sailing possible without hitting the edge of the implemented world, even though this will be only approximately 1/3 or less of the planned game world.  

Tuesday, September 18, 2018

Integration of JCGNetwork is complete! Quick discussion, and then quick dev roadmap.

The integration of the new JCGNetwork API, completely replacing the Unet networking API, has been completed.  Problems appeared with the design of the smooth syncing code regarding the turning of objects, so that has been disabled for now for a future redesign.  Overall though the process was time consuming, stressful, but was relatively free of issues.  I'm still looking for issues, significantly fewer bugs were found in the conversion and the new networking API. 

So in the immediate term, I'm still looking for new issues that have appeared as a result of the switch, but then returning to working on new feature development.  Specifically back to working on the market trading system, and AI ships.  The market trading system is already 2/3 done.  It is core to making money in the game, so very important.  The AI control of ships is core to a lot of the fun in the game outside of player vs player combat, so is also very important. 

Currently with market trading players can make purchases from cities, but the supply and demand system is not fully implemented, and players can not yet sell.  You also cannot yet place your own persistent market orders (either buy or sell) yet.  With AI, right now it will follow the closest player, but has not yet implemented more advanced behavior such as pulling alongside for a broadside, and does not yet know how to fire cannons.  Once that part is implemented there will be a bit more fun to be had. 

After those are implemented, then implementing the scooping of loot from item drops will be next, which ties in with both having fun fighting AI ships (which already produce item drops when destroyed, just as player ships already do), and ties in with the sale of that loot on the various city markets. 

The next feature after that will be completing the randomized map spawn points feature, which will be the semi-random appears of things like AI spawn points, free loot drops, resources such as schools of fish, etc.  This is about 1/3 implemented already.  This was held back partly by Unet due to the inefficiency of spawning a high number of AI ships in a zone even at large distance to any players.  All players would get the full set of updates for these AI ships.  Unet did have a feature to handle this, the network proximity checker, but was not a good fit for the game's design.  I believe this should be solved with JCGNetwork's subscription system. 

At that point the game will be in a good place to finish implementation of the zone transfer system, where when the player reaches the edge of a zone they are automatically transferred to the adjacent zone server.  This will then allow for very long distance travel, differences in the difficulty of AI between zones, and the leveraging of the market trade system for the player to make money in game.  Then I can begin the work of building out new zones for the player to enter and explore, eventually covering the entire world.  The focus initially will be on the British isles, followed by Europe as a whole, then Africa and on to India. 

Further in the future will then be resource gathering, manufacturing, player skill training and skill trees, and player owned trading companies.  At that point the game will be possibly in a state to start getting some public feedback through a private or even public beta. 

Monday, September 10, 2018

New Networking API Complete! - JCGNetwork

The new in house networking API has now been completed and tested, and I've started with the task of ripping out Unet and replacing it with the new API - JCGNetwork.  I took some inspiration from the Unet HLAPI but no code, and really do everything a whole lot differently.  I'm considering releasing it as its own product to help other developers.

JCGNetwork uses a layered transport on top of UDP, supporting multiple channels, channel settings, and flexible message sizes.  All channels have packet ordering enforced, remove duplicates, and channels can be reliable or unreliable.  JCGNetwork is multithreaded, where the actual sending/receiving occurs on a separate thread, while the processing of the message contents occurs on the main thread.

With Unet I was implementing encryption on a message by message basis, but I've integrated a fast and weak encryption as a channel option of JCGNetwork.  The encryption is by no means hack proof, but will make casual reading or spoofing of packets more difficult.  Additionally I've integrated both hardware and IP ban lists.

With Unet messages sizes, rate of message send, and message buffer size were all limited in their configuration.  In fact, I suspect a bug in the fragmented message system in the Unet LLAPI was my primary problem I was hitting in the end.  Even without that possible issue, Unet's fragmented message system supported only a small number of fragments, meaning that message size was always a concern outside of performance.  Standard channels couldn't support more than a single packet of data (up to 1500 bytes), and fragmented channels supported only up to 64 fragments, but chopped them down to 500 bytes by default.  Messages would also be held to wait for additional messages to combine with by default of 0.1 seconds, and was only globally configurable.  Message buffers could overfill without any way of seeing what their status was, without any notification other than in the console log, and without any remedy other than possibly slowing down sends even though your code couldn't know to do so.

With JCGNetwork message fragmentation supports up to max int number of fragments for a single message (2 billion+), and occurs automatically without having to configure the channel for fragmentation.  Not that you should try to send a 2 billion fragmented message, but it basically just gets the networking API out of the way as a blocker to sending large messages if needed.  JCGNetwork supports small message combining with again a default of holding for up to 0.1 seconds, but this is per channel configurable.  You can have a separate high performance channel with a 0 wait time that sends immediately.  This is nice because when you need performance for things like close by objects updating their positions, the performance is there, and when the object is distant you can use a channel with a holding time for more efficient use of the network when speed isn't that important.  JCGNetwork also places no arbitrary limits on outgoing or incoming buffer sizes either, using basic lists and queues that can again support up to max int number of items, so you'll run out of memory rather than run out of buffer size, but it should never get to that.

The high level networking uses a scheme similar in concept to the Unet HLAPI but functioning entirely differently.  Rather than using a not very performance friendly automatic serialization/deserialization system, with JCGNetwork the developer manually writes all serialize/deserialize functions for all messages, RPCs, and sync variables.  This takes a little longer to develop the game, but results in a more clear understanding of what is going on, more control, and should be higher performance.

The high level API of JCGNetwork still uses the concept of a Player Object, and uses a unified RPC like system in place of Command, ClientRpc, and TargetRpc of Unet.  In JCGNetwork the server can always send RPCs to clients, but the client can only send an RPC to the server on an object owned by that client's connection.  This though can be a weakness of Unet, so in JCGNetwork I've added the option on an object by object basis to allow unsafe client RPCs, where any client can send an RPC on that object even without being the owner.  Similar to Unet, sync variables only go from server to client, but differently the server will send all variables instead of just what changed, and the server needs to manually set a bool to true when it wants to send those variables to the clients.

Unet had a network visibility system that would only instantiate network objects within a certain range.  This had many limitations, such as basing on the physics system so needed a collider, and it may not be ideal to wait to instantiate an object until it is close.  There were also a good number of reported issues with this system that never were resolved.  JCGNetwork uses a completely different system called object subscriptions.  Every few seconds all networked objects will check distance against all Player Objects and add or remove those players' connections from their subscribed lists.  All connected clients will instantiate all networked objects, but unsubscribed connections will get fewer or even no updates on those objects, depending on the scripts run on those objects.  This allows for things like frequent position updates for objects close by, but objects far in the distance are still seen but their position isn't updated as frequently because it doesn't really matter at that distance.

So the work is on integrating this new system.  I expect the work to be completed within a few weeks.  I'm really excited about it, so I'll probably put in a lot of extra time so I can see the results.

Tuesday, July 31, 2018

Custom Networking API

So over the last few months I've been having difficulty with Unity's Unet networking API.  Contrary to the experience of some, the High Level API (HLAPI) has been working pretty well.  The issues have all come down to the Unet Low Level API (LLAPI). 

It is difficult to tell what the problems are, because the LLAPI is kept largely as a black box.  The problems may be possible to resolve, but it is almost impossible to see what is getting stuck in the LLAPI buffers and there is no way to directly clear them.  The buffer sizes even when maxed out all turn out to be arbitrarily low.  This means, in my opinion, Unet is good for small games with limited data transfers, but does not scale up well to an MMO. 

So after months of fighting with it I've decided to take the worst tasting medicine and develop a custom networking API for Broadside.  This will add approximately 3-5 additional months of work, but should eliminate any further networking issues with lack of visibility. 

Tuesday, June 26, 2018

Networking and Technical Debt

Early in the development of Broadside I was still learning the networking API and was just trying to get something to work.  The intention at the time was to get ships sailing, cannonballs flying, and prove the game was possible.  Getting things working at all was put as a priority over getting things to work the most efficient way, with the idea being that I would revisit these systems at a later date to optimize them.

Unfortunately that time has come.  As time has gone on, more systems have been added to the game that need to be synced to the clients.  From crew to cargo to city markets, there's added up a good amount of data now that needs to be sent to the clients and kept in sync.  After adding some larger ships, which necessitate even more data to sync, I hit a brick wall that took a little while to understand.

I was getting errors on the server where a client would no longer receive any server updates.  I tracked the issue down to something I'll call "reliable message pressure", where reliable messages are attempted to be sent to the clients at a rate faster than the server can actually send them (number of messages here is more important than the amount of data in each message, as the amount of data in most messages is actually incredibly small) and that would result in messages being delayed and ultimately available buffers for either storing new messages to send or waiting for acknowledgement messages to be returned, would be filled and no new data could be sent.  This would prevent even unreliable messages from sending as well.  This would appear on the client as if it froze, but it didn't actually disconnect.

At first I simply attempted to increase the buffer space, but that just resulted in delaying the issue.  Then I went and did a proper investigation and found it had to do with how I implemented syncing the state of the ships in the first place - mostly code that has been in place since the beginning of the project and had forgotten exactly what I had done for expediency.

I was syncing a timer every frame over the reliable channel that the clients weren't even using.  I was syncing data like crew allocations to every client when only the owner of the ship cares about that data.  I was sending requests from the client to the server to turn the ship every frame over the reliable channel.  I was syncing data like a ship's cargo to the owner of the ship every few seconds even if the contents had not changed.  And much more.

So I've eliminated the error now by going through and syncing any data only the owner of the ship cares about just to that client, instead of all clients.  I've moved any non-critical syncing or commands from the player, such as turning the ship, over to the unreliable channel (if you're holding a turn key it doesn't matter if a frame or two gets lost, and there is no need to send an acknowledgement back to the client).

So just in what I've been able to improve in a day has cut the amount of sync messages by over 60% as seen by the client, and probably much higher than that when taking into account dropped messages the server never even was putting on the wire due to reliable message pressure on that client's connection.  I'm continuing to work on the issue to reduce the amount by another 50% by calculating things like ship speed and wind angle on the clients for all ships instead of syncing that from the server, and improving my in house network transform syncing script.

Currently I use my in house network transform syncing script to sync the position of cannonballs while reducing the frequency of position/velocity updates needed in comparison to the script built into the networking API.  With my own custom script I only need to update cannonballs about 4 times per second compared to at least 15 with the built in version.  Unfortunately in testing it doesn't work smoothly when attached to ships so I'm still using the built in script for those.  The built in script needs to sync position 29 times per second to get a smooth movement and turning effect without any noticeable jitter or snapping, but my goal to be able to drop that to 10 or less per second.  This will be worked on again in the near future.

The slow rocking of the ship is also something currently synced entirely from the server to all clients.  I'm going to change that to being calculated locally on the clients, with periodic updates to keep in sync with the server.  So instead of several times per second the rocking with be updated by the server maybe once per minute.  We'll see how that works in testing and adjust from there.

So the ultimate goal is to be able to support approximately 60 players connected per zone, with at least a dozen AI controlled ships.  Actual play testing so far has been limited to far fewer numbers, but as more improvements are implemented we'll be involving more play testers and monitoring performance.  At this point I'm pretty confident we'll be able to hit those numbers.

Wednesday, June 20, 2018

Firing a full broadside

Now that the majority of functionality for what you can do when docked at the cities has been implemented, as well as making market purchases, development is moving on to implementing additional ships and items into the game, implementing more combat mechanics, filling out NPC ship AI behavior, and gathering items in the game. 

Part of the updates to the combat mechanics is an alternate way to fire your ship's cannons.  The standard way of firing cannons is to select a side of your ship, aim the cannons, and press the space bar to fire an individual cannon.  You can hold down the space bar for continuous fire. 

Some ships have multiple gun decks on the port and starboard sides.  This allows for installing different guns on these decks.  All guns on a single deck need to be of the same type, and load the same ammunition, but multiple gun decks allows for varying your weaponry on the same side of the ship.  When firing using the space bar you manually switch between gun decks. 

The new "Full Broadside" button, available under the Guns status tab in the lower left of the screen, ignores most of that and automatically queues up all guns on the entire side of the ship to fire as fast as possible.  This has advantages and disadvantages compared to firing using the space bar.  Normally guns on a single deck are fired in sequence starting from the front of the ship and working their way to the rear.  When firing a full broadside, all guns are fired in a random order.  In addition, when firing by space bar you can continually adjust your aim for each shot.  In full broadside mode, the aim of all guns is set when you press the Full Broadside button and can't be adjusted again until all guns have fired. 

Those are some of the disadvantages, but on to the advantages.  Once you initiate a full broadside, you can switch to an alternate camera, either out to 3rd person or looking down another cannon sight.  You can even fire from a second side of the ship while your crew is still firing your broadside from the first side.  It is even possible to initiate what is called a double broadside, where you do a full broadside from both port and starboard simultaneously. 

Another large advantage is specifically for ships with multiple gun decks on the sides.  Gun decks are limited to a rate of fire, but when you have more than one gun deck firing at once, the overall rate of fire is increased.  If you have 3 gun decks firing at once, the effective time between shots is cut to 1/3 of normal. 

This all adds up to a way to effectively deal a fast volley of damage, most effective at close range due to limitations to your aim. 

Saturday, June 2, 2018

Current Progress

Just a quick update.  Implementation of the City UI for all things regarding moving items and outfitting ships is now completed.  This was a complicated and time consuming feature that is pretty central to the game.  Development is now on finishing the market system and implementing its UI. 

Tuesday, April 3, 2018

Markets and Trading

Current development is still surrounding the various systems that are involved in the port cities.  The primary functions of ports is a place to store excess items and ships, and to provide a local marketplace for trade, among other functions.

In Broadside the trader will have plenty of opportunities to succeed.  There will be hundreds of ports across the globe to visit.  Every port will have its own market, where any item in the game can potentially be bought or sold.

Items in the game generally fall along two categories, items that can be used directly by players (ships, cannons, ammunition, equipment, etc), and what can be referred to as "trade goods" which are generally purchased by NPC's in the ports themselves (jewelry, fine china, spices, tobacco, etc).

Player Base Items


Demand for player items is largely driven by the player base itself.  These items can be found in item drops, Treasure Chests, or manufactured by the players, and can be bought and sold on the market in the port cities.

At the game's launch many player base items will be seeded by NPC sales in the markets until player manufacturing can take over the demand.  Profitability of these items will depend largely on what is in demand by the players.

Trade Goods


The trade goods can be bought and sold between players, but their primary purpose is to be sold to the population of one of the ports through the market.

Every port will have at least one item that it produces in mass quantity, and every port that doesn't produce that item will have some level of demand for it.

Supply and Demand


The price of trade goods bought and sold to NPCs in the port city markets will be driven by a suppply and demand system.  All items will have a "base price", which is the lowest price NPC's will buy or sell it for.  The maximum price will be a multiple of that base price, which will be determined through game balancing, but the current multiple being tested is 20x the base price.

So the ultimate goal with trading in the trade goods is to find a port that produces that trade good with high supply, which will drive the price down to or near its base price, and to then transport that trade good to a city with high demand for it, which then will buy that item at a high multiple of the base price.

The supply/demand of a trade good item is recalculated after every purchase or sale in that port that involves an NPC buy/sell order.  How much it is affected depends on the size of the order and the size of the market itself.  Supply/demand for a trade good will slowly recover the longer the port goes without purchases of the item.  How long this will take will depend on game balancing, but currently going from exhaustion for full supply/demand for an item is being tested as taking a 48 hour period without activity as an example. 

Market Size


Every port has a "Market Size" value that represents the population that the market services.  This not only includes the port itself, but the entire surrounding area (what we would call today the suburbs and surrounding rural area).  The larger the Market Size, the higher quantity of items produced in that city, and the higher number of items in demand.  That means that the supply or demand of items is less affected by individual purchases in a high Market Size port in comparison to a low Market Size port.

Every port has its Market Size value, which generally goes alone with the 3 types of ports you will find.  City, Town, and Settlement.  Cities have the largest Market Size, while Settlements have the smallest.

Market Profile


In addition to the Market Size, the supply and demand of items by the local population will be greatly affected by its Market Profile.  This generally refers to the economics of the port.  Each port will be assigned one of the following Market Profiles.

  • Metropolitan
    • A city with a high number of wealthy people and industry.  Wealthy trade goods will be in high demand for its Market Size, as well as goods needed for manufacturing, while goods needed for things like farming will be in low demand for its size.  Trade goods produced here will generally be manufactured and be indicative of the local area.  
  • Cosmopolitan
    • A busy trade port with traders from many far away lands.  Demand for most any trade good will be high for its Market Size.  Trade goods produced by the city may be unexpected for the city's location, as they are generally found in more distant lands.  
  • Mixed
    • A general mix of wealth and industry with a surrounding agrarian base.  Demand for most trade goods will be moderate.  Trade goods produced by the port can be manufactured or farm related, but will be indicative of the local area.  
  • Agrarian
    • A primarily rural farming community.  Demand for most items of wealth will be low for its Market Size, while demand for goods relating to farming or harvesting local resources will be high for its size.  Trade goods produced by the port will generally be raw materials or a farmed product, and will be indicative of the local area.  
  • Impoverished
    • This is a desperately poor community with the majority of the population living hand to mouth on a daily basis, and largely lacking the skills needed to build up much of a local industry.  Demand for most items will be very low for its Market Size.  Demand for food and water will be exceptionally high for its size.  Trade goods produced here will either be raw materials or speak to the desperateness of the local people, and will be indicative of the local area.  Raw materials produced here though can still be of considerable value, even if the majority of the population is not reaping the benefits of their sale.  

Broadside Premium, Real Money Purchases, and Treasure Chests

Broadside is being released as a Free to Play game, that will in no way require any purchases in order to play.  The game is being balanced with the assumption that the majority of players will never pay a dime for the game, and that is fine.  The idea is to make a great and fun game first, something fun enough where players will want to get their friends to play as well, and bank on at least someone in your group of friends seeing the value in some additional purchases which are what supports the costs and continued development of the game.

Free players are in no way looked down on, or considered lesser players.

Broadside Premium


One of the two primary ways the game will be funded will be through the Broadside Premium DLC.  This will be an optional DLC that provides a handful of benefits for the owner.
  • Skill training speed will be increased
    • The amount will be determined during balancing, but the expectation is between 20% to 50% over the standard game
  • Treasure Chests will drop 2 items instead of 1
    • Effectively like opening 2 Treasure Chests at the same time
  • You'll be able to equip new skins to your ships
Broadside Premium will be a 1 time purchase, not a subscription, and will be applied to your game client and not a specific account.  That means if you have multiple accounts with their own characters, or if multiple players share the same computer, all those accounts used will benefit from Broadside Premium.

The expected price for the Broadside Premium DLC will be between $10 to $20 USD.

Treasure Chests


Treasure Chests mentioned above will be available in a number of places in the game, such as in item drops when sinking NPC ships.  There will be multiple types of Treasure Chests, and will require an associated type of key for that chest to open.  KEYS WILL NOT BE A MICROTRANSACTION ITEM!  Keys will also be available in item drops, in roughly the same number as the chests themselves.  This differs from the now standard "loot box" system seen in many free to play or even premium games, where loot boxes are free but you need to purchase keys with real money.  

It will be possible for players to sell both Treasure Chests and their keys in the in game market places for in game currency.  So if you enjoy them, you can purchase them in game from other players.

The only encouragement that Treasure Chests provide for a real money purchase is the above mentioned benefit of the Broadside Premium DLC in doubling the items dropped from Treasure Chests. 

Skins


Feedback from early play testing is that everyone wants optional color choices for their ships.  These are generally referred to as skins in other games, so I'll use that name here.  These skins will be some of the higher value items dropped from Treasure Chests.  A skin will be a 1 time use consumable item applied to a ship, and stays with the ship until the player either removes the skin or the ship is sunk.  Changing to a new skin or removing a skin will not return the old skin to your inventory.  

Skins, like Treasure Chests can also be bought or sold on the in game market places.  Skins though can only be applied to a ship where the player has the Broadside Premium DLC.  It is specifically allowed for players to temporarily trade their ships to a Broadside Premium player for the purpose of applying a skin and trading it back, where it will stay equipped and be usable by the non-premium player.  In that way, it is possible for everyone in your group to have skins on their ships, while only a single player has purchased Broadside Premium.  

Note that the in game market places do not handle the sale of fitted ships, only packaged items such as an empty ship hull, so it will not be possible to buy or sell ships on the market with skins already applied. When you sell a fitted ship on the in game market, all fittings on the ship and items in its hold are transferred to your storage at port.  Since equipped skins cannot be removed from a ship for reuse, they are destroyed in this process.

Purchasing Pieces of Eight with Real Money


Besides Broadside Premium, the only other means of real money purchasing currently planned is for the Pieces of Eight in game currency (the primary in game currency).  This is available for several reasons.  Some people may enjoy the PVP aspect of the game, but not the trading, some people may have lost their ships through a string of bad choices or bad luck and would like to quickly get back what they had, some people may just want a much larger inventory of ships than their current amount of play time allows, some people may want to quickly fund a large expansion to their manufacturing or trading.  Whatever the reason, the game will allow for the purchase of the Pieces of Eight (Po8) in game currency for real money.  There will not be any alternate "premium currency" in the game.  

Purchasing Po8 with real money will in no way require the Broadside Premium DLC.  The various means of generating your own Po8 in game are being balanced with the assumption that the player will never purchase Po8 for real money, nor is any game item or system being designed in a way to specifically encourage its purchase.  The adventurous trader, manufacturer, or privateer should be able to generate ample Po8 on their own with a little planning and some good execution, making real money purchases of Po8 unnecessary for the vast majority of players.  A primary design goal of Broadside is it will not be a "Pay to Win" economy.  

Monday, March 19, 2018

Current Status

Just a quick update as to the overall status of Broadside development


  • Art Assets
    • 100% Complete
  • Coding
    • 66% Complete
      • Major features yet to be implemented are city markets, the city ship fitting interface, player zone transfers, and player created trading companies
      • There's lots of minor code work in virtually all the other features still to do as well, but pretty much all of the high level features other than listed above have been more or less implemented
  • Implementing all ships and items in the game
    • 10% Complete
      • Has lots of dependencies on uncompleted code still, the market system being the majority of it
  • Building out all the terrain for the whole world for all zones
    • 1% Complete
      • The only dependency this is waiting on is the code for determining when a player should be moved to a new zone to be written, which is planned after the market system is complete

The game will start focusing more on game play testing and player feedback starting about 3 months from now.  The current plan is to follow that with an official closed beta before the end of this year. Whether to go with a soft launch open beta off our own site, an official "early access" release through Steam, or just a regular full on release will depend on how well the closed beta goes. 

Wednesday, March 14, 2018

Universal Game Time and the Day/Night Cycle

Recent development has all been around ship combat, and most recently creating item drops.  Next in that development is adding the UI interface to access item drops and choosing what you may want to move to your cargo hold, and the same interface will be used for gathering resources from the sea, such as fishing or whaling.  Following that will be a similar interface for managing cargo at ports, and outfitting your ship, and after that is done work will begin on the market system for buying and selling items at port.

I call what I've been in lately "item hell", because even though these are central components of the game, they are not very satisfying to work on, let alone extremely complicated and delicate systems.  After responding to a thread on the Unity forums about implementing a day/night cycle, I decided to go off on a tangent and do the same in Broadside right now instead of later.  A day/night cycle was always in the required features list for Broadside, so this was getting done sometime soon no matter what.  It also bothered me that this was the last remaining feature of the early prototype version of Broadside Online that has not been implemented in the current iteration.

Universal Game Time


So the world in Broadside is chopped up into a long series of zones, each managed by their own server instance.  Broadside is a game that will cover the entire world, at least what is accessible from the oceans, so I wanted the day/night cycle to reflect that.  So when you are in the same zone as London, it will be a completely different time of day than in Bombay.

Most zone servers though are not active at any given time.  The world is so huge, that it is silly to be wasting server resources simulating a zone if no player is currently occupying it.  So zones will be started and stopped all the time as players move around the game world.  There needs to be some central authority on the time of day for the game world even when a zone server is offline, so it will know what time of day it is when it eventually starts up.  The Tracker server mentioned in an early blog entry is that server.

So the Tracker server will maintain what I call Universal Game Time.  This is the time of day in seconds at longitude 0.  Effectively London time for this discussion.  When the Tracker server starts up it will always be UGT 0, which is midnight in London, and the Tracker server continually increments this at a multiple of real time.  Right now the plan is to have an entire day/night cycle take 2 hours, but that is easily adjustable when getting to the later polishing phase of development.

When a zone server starts up, it already makes a connection to the Tracker server for other reasons, such as player chat functionality and character skills updates.  Now when a zone server first connects, the Tracker server will respond with the current UGT.  The zone server then applies an offset to the UGT based on roughly what longitude the contents of the zone server represent.  The zone server then increments its own local time independently using its TimeController.  To avoid drift from UGT over long running periods, the Tracker server will periodically send updates to all active zone servers.

When a client connects to the zone server, one of the last things it does is spawn the player's ship object.  This occurs after everything else is set up, including the client copy of the TimeController, so is the perfect time to tell the client what local time it is.  Once the client receives the local time, it orients the directional light (the sun), and adjusts global illumination and fog colors to match the current time.  The client copy of TimeController then increments local time on its own, receiving updates at noon and midnight from the zone server to correct any drift.  The TimeController on the client continually adjusts the sun direction and all other day/night cycle variables, and also handles requests from objects with torches to tell them whether they should be lit or not.

Not too complicated, just thought you might think it was a bit interesting how the system works.

Thursday, February 15, 2018

Cannons!!!!

Current development now is on the armament systems.  Specifically on equipping, firing, and loading of a ship's cannons.  Early on in development a system was somewhat implemented to load and fire cannons, but it never took ammunition inventory, ship fittings, and crew manning the cannons into account.  It was just there so I could sail around and fire the cannons, so I could actually see what the game will look like, and to test networking systems involving syncing the launch of cannonballs from the server to the clients.  

Now that ship fitting, ship cargo, and ship crew systems have been fully on the ships, the armament system is being implemented to leverage those.  


Cannon View


The default view in the game is a 3rd person bird's eye view above the ship, where you can rotate the camera and zoom in and out.  This is great for navigating and situational awareness, but is not very useful for actually aiming cannons.  Rather than an RPG style of gameplay where you select a target and the computer just calculates a chance to hit, in Broadside you have to actually aim the cannons, fire them, see whereabouts they land.  Then you adjust your aim based on where your ordinance is hitting.  

The chance to hit then is just based on the range to target and the skill of the player.  A player with a top ship in the game is not much use beyond point blank range if they don't develop skills at aiming and firing the cannons, and as opposed to some other sailing games, Broadside purposely offers little in the way of hints to improve your long range aim.  That will be left as a valuable player skill to develop.  

To fire your cannons, you switch to one of the 4 cannon views.  This is a view from the deck of the ship either in the forward, aft, port, or starboard directions.  You get a very basic cross hair in the center and adjust the direction you're looking to adjust the aim of the cannons.  Press the spacebar to fire when you are satisfied, and then try to follow where the cannonball is going through the puff of smoke.  Then repeat the process.  You can also just hold down the spacebar to continuously fire, which is suitable at close range of the target.  

All ships, other than the Escape class dinghy (ship you end up in when your real ship is sunk), have room for cannons on board in the port and starboard directions.  A small number of ships also allow for a small number of cannons facing forward and aft.  

Cannon Fittings and Gun Decks


When you are docked in a port you have the opportunity to outfit your ship.  This includes outfitting your ship with whatever configuration of cannons you'd like, within the limits of what that ship can support.  While in real life a captain could come up with any crazy combination of cannons they want (which I considered allowing in this game), in Broadside for simplicity's sake your cannons are fit to individual Gun Decks, and each Gun Deck is allowed to contain only a single type of cannon.  That way when you press spacebar and fire a cannon, the next cannon in the queue is always of the same type, same ammunition, and same range as the previous.  

Ships with fore and aft cannon fittings have a single Gun Deck for each.  Most medium sized and smaller ships also only have a single Gun Deck on the port and starboard sides.  Mostly in the larger sized ships, such as the Ships of the Line, you'll have available up to 3 separate Gun Decks on the port and starboard sides.  This will allow the fitting of up to 3 separate cannon types or selected ammunition types for each side.  Ships with cannons in all 4 directions, and 3 Gun Decks per side, then would actually have 8 separate Gun Decks for the player to customize.  

The lowest Gun Deck, (Gun Deck 1), will allow for the fitting of the largest and most powerful cannons, while Gun Decks higher up in the ship will generally allow for smaller cannon sizes.  This keeps generally with historical accuracy, as fitting the heaviest guns high up in a ship would cause the ship to become unstable, tip over, and sink on its own.  

Players switch between firing from the separate Gun Decks on the same side with just a single click on their desired Gun Deck.  

The logical separation of cannons into Gun Decks allows the player to outfit their ship to handle a variety of situations all in the same ship.  A player could for example outfit 1 Gun Deck for heavy hitting short range, and another for long range, and switch between the 2 Gun Decks as they close on the enemy.  

Cannon Sizes and Types


In Broadside, cannons come in various sizes and types.  All cannons have a rating in pounds (LB), which was a standard historical rating based roughly on the weight of an iron cannonball the cannon was designed to fire.  Rather than weight, the LB of a cannon actually indirectly refers to the size of the cannonballs themselves.  All cannons and ammunition has a size in LB, and any ammunition in that size can be fired from any cannon of that size.  

All cannons, and any other ship fitting in the game, also has a fitting size.  These are Small, Medium, Large, and Extra Large.  A Gun Deck will have a fitting size it will allow up to, and any cannon of that fitting size or smaller can be fit to that ship.  Generally larger ships can equip the larger fitting sized cannons.  As cannon LB size goes up, so generally does the fitting size.  

Now besides the size of the cannons, they are also broken up into two major types of guns.  Long Guns and Carronades.  Long Guns have a much longer barrel and are designed for long range fire, while Carronades are designed for significantly shorter range.  The advantage of Carronades is in comparison to a Long Gun capable of firing ammunition of the same LB size, the Carronade may have a smaller ship fitting size, so you can fit guns that can fire larger ammunition onto a smaller ship or onto a higher Gun Deck than would be allowed a Long Gun.  Also, the few very largest sizes of ammunition in the game are only available for Carronades, making for extreme heavy hitters at close range.  

Ammunition


In addition to the various sizes, ammunition also comes in a variety of types useful for different specific purposes.  

  • Iron Cannonball
    • The standard ammunition type in Broadside that all other types are compared against.  The Iron Cannonball has maximum range, and is designed for damaging ships.  There is a size of Iron Cannonball for every cannon of every size.  
  • Stone Cannonball
    • Generally the cheapest ammunition type, and the type of ammunition equipped by default in your starter Bremen class cog.  Stone Cannonballs have slightly shorter range than Iron, due to needing to be fired with less powder to prevent them from shattering in the barrel.  They also do somewhat less damage to ships, but since stone can shatter they have an increased chance of harming the crew of the enemy ship.  
  • Double Shot
    • Effectively you're firing 2 standard Iron Cannonballs, each having similar damage potential as a single, but at significantly reduced range.  
  • Chain Shot
    • 2 Iron Cannonballs attached together by a chain.  These have significantly reduced range, and less damage potential to the hull of a ship than Double Shot, but are designed to damage ship masts, rigging, and sails, so do so with maximum efficiency.  
  • Heated Shot
    • A standard Iron Cannonball heated red hot.  This has all the same damage characteristics of a standard Iron Cannonball, but with an increased chance of causing a fire on the opposing ship.  Unfortunately, using Heated Shot creates a chance of lighting your own ship on fire as well, so can be very risky.  
  • Grape Shot
    • Grape Shot is basically using your cannon as a shotgun, hitting the opposing ship with very short range pellets.  These pose almost no risk to the enemy ship, but have the highest chance of injuring the enemy ship's crew of any ammunition type.  
  • Explosive Shot
    • A very specialized ammunition type that is extremely expensive compared to all the others.  Explosive Shot is basically launching a bomb at the enemy, potentially causing massive damage.  It is the ideal ammunition when attacking either ironclad warships or fixed fortifications, but presents a slight risk of an inadvertent explosion on your own ship when using it.  It is only available for a small number of very large guns.  
So the variety of ammunition types and sizes in combination with the variety of cannons available, allow for a lot of customization by the player to build out their ship's combat capabilities to fit with their desired tactics.  As an example, you can load a gun deck for example with Long Guns and long range ammunition, a second Gun Deck with Carronades and short range ammunition.  As you approach the enemy you use your Long Guns, and as you close you switch the Long Guns to short range ammo, and while those reload you switch to your Carronades.  Light them up with your Carronades and while you wait for those to reload you switch back to your Long Guns fitted for short range.  

Alternatively you can mix up Chain Shot and Grape Shot to disable a ship and then attempt to reduce its crew, to prevent its escape, and then when it can no longer flee you move to a safe range and pummel it with your Long Guns until it is sunk.  Your tactics are yours to make in Broadside.  

Wednesday, February 7, 2018

Ship Damage

Currently working on the ship damage and repair systems, and I thought I would just quickly discuss how they will be implemented.

The use of "hit points" or "health" is a staple in games of all kinds.  This is easy to implement and easy for players to understand.  Games in this genre generally utilize it, even very good games.  World of Warships for example is a very fun game and uses a hit points system for the health of your ship.  When your hit points reach 0, your ship is sunk.  Naval Action uses a similar system, with basically a two tiered health system, where you have armor that you shoot through and then when that reaches 0 you have the inner hull you bring to 0 to sink the ship.

I considered using a similar system for Broadside, but it isn't closely matched with the reality of how a ship actually sinks.  Frankly I was surprised to see that system in Naval Action, where otherwise they have implemented a very realistic combat system.  Ships of this era didn't even utilize armor.

So what really causes a ship to sink?  Water does of course.


Leaks


In Broadside there will be no hit points.  When your ship takes damage it can take damage to various equipment (sails, cannons, bilge pumps, etc), can injure or kill crew, and can create "leaks" in the hull of your ship.

When damage creates a leak, it represents an inflow of water measured in Gallons per Second into the ship hull.  When the total gallons of water that has entered the ship exceeds the maximum amount of water that ship can handle, the ship is sunk.

The player can mitigate these leaks through two mechanics, both by assigning crew.  Crew can be assigned to "Bailing Water", which is literally throwing water overboard.  The efficiency of the crew's ability to bail water can be increased by installing bilge pump equipment on the ship.  Second the player can assign crew to "Repair" which literally assigns them to repair the leaks.

This leads to some fun tactical decision making during combat.  Since a ship generally cannot hold enough crew to fully man every role on the ship at the same time, once the player starts getting leaks in their ship they will have to choose what to do about it.
  • Does the player reassign crew from their cannons to bailing water?  This will lead to a slower firing rate of their cannons, and may actually swing the advantage over to the opponent. 
  • Does the player ignore the water flowing in, and try to repair the leaks to stop any more water from flowing in?
  • Does the player attempt to break off from the fight, fully repair and bail water, and then reengage?
  • Does the player just throw all crew over to cannons and sailing in an attempt to finish off the enemy before they are sunk themselves?  This can be a serious gamble, as they may continue to take damage which creates even more leaks. 

Fire


In addition to damaging ship equipment, crew, and causing leaks, ships can also light on fire.  A fire slowly causes all types of damage to the ship until it is put out.  Fires are put out by assigning crew to the Firefighting role, making yet another tactical choice the player will have to make with their crew assignments in the middle of a fight.  

Saturday, February 3, 2018

Development Log

Always up to date progress on current development.

Development Builds

0.8.25

  • Current Development

0.8.24

  • 9/10/2021
  • Ship fitting class network performance improvements, to address a performance regression due to adding the sail damage feature
    • ShipFitting class is now serialized directly to byte array for transfer to clients, instead of serializing as CSV and then encoded to byte array for transfer
    • Changed the sending of ship fittings to clients, so regular updates are returned to the previous behavior of only being sent to the ship's owner.
    • Now when a player gets in range of another ship, ship fittings are sent just once for that ship to the player
    • Changes to sail damage status, from new damage or a repair, are now sent to all nearby clients as the sails only, instead of all ship fittings each time (also sent as a serialized byte array instead of csv)
  • Increased brightness of login scene again
  • Changed vertical cannon aiming range again, to improve ability to hit sails.  Now you get 12 degrees upwards movement, and 4 degrees downward, from center.  

0.8.23

  • 8/18/2021
  • Money in your cargo hold will now be used for a market purchase, when not enough money in city storage
  • Ship bonuses are now recalculated immediately whenever a fitting is added or removed from a ship
  • Ship Maintenance window and Crew tab now update the max total crew the ship can carry properly
  • Working on sail and mast damage
    • Sail trigger colliders are now on their own layer, and chain shot now does a line cast from previous location to current location each frame to check for sail colliders
    • Experimenting with setting cannonballs collision detection to continuous dynamic and all ships set to continuous, to allow cannonballs to hit ship masts, and also to investigate possible instances of  the fastest cannonballs possibly passing through the smallest ships without detection.  (currently unknown if the later is actually happening, or if it is an artifact of object position syncing and interpolation on the client, but I suspect it is real)
    • Added new sail impact prefab for when chain shot hits sails
    • Added new Sail item to the item system, which is used by the ship fitting system
      • Sails aren't actually a traded or gatherable item
    • Sail items now automatically added to a ship's fittings when it spawns for the first time
    • Chain Shot now does a raycast from its position last frame to detect if it pass through a sail, if so damage is done to the sail.  The raycast is done because sails are very small, making traditional collision detection unreliable otherwise.  
      • Sails each have 100 hit points, which can be viewed as a percentage
      • Larger chain shot does more damage to a sail, with the largest able to destroy any sail in 1 hit
    • Damaged sails now reduce the maximum speed and sail force applied to the ship as a percentage of the number of sails on the ship
      • Example: So if a ship has 10 sails, and 2 are destroyed (leaving 8 good sails), then max speed and sail force is reduced to 80%
      • I'll see how this goes, and in the future may change the system so sails have different weights, so larger sails are more important than smaller sails in this calculation, but any damaged sail affects the ship equally for now
    • Redesigned repair crew system, which now uses the prioritize rigging check box
      • There's now 4 types of repairs your repair crew can do, mast, sails, leaks, and hull
      • When prioritize rigging is checked, they are repaired in that order, otherwise they fallow leaks, mast, sails, then hull
      • Note that mast damage will not actually be part of this update yet, as the work until now has already taken too long
    • Added new sail damaged and destroyed event alerts
  • Added Explosive Shot
    • Will be a very low penetration (2-4), very high hull integrity damage ammo type
    • When it does penetrate, it will cause very large leaks and high crew injury
    • Only available in sizes 30LB, 32LB, and 42LB
    • Added new explosive impact prefab
  • Vice Admiral NPC's (ocean class) now carry 30LB explosive shot instead of iron cannonballs, Secured Magazine, Water Tight Bulkheads, Live Oak Framing, Reinforced Hull, and 2X Bilge Pumps
  • Smoothed out some particularly bad terrain geometry errors in zone 33 (Greece)
  • AI now far less likely to fire on friendly ships and terrain
    • When checking whether to open fire, AI ships now raycast to the target
      • Fixed raycasting issue which showed up during testing, where the raycast could hit its own ship, preventing the ship from firing.  Now raycasts are fired from one of the cannons on that side of the ship.
    • If the raycast hits a friendly ship or terrain, then the AI ship does not open fire
  • Fixed bug with in game menu ("Menu" button) text size for buttons making them invisible at certain resolutions
  • Slightly increased brightness in LoginClient scene.  
  • Minor performance improvements to cannon camera scripts
  • Increased vertical cannon range from 4 degrees from center to 6 degrees
  • Added force add item to container option for internal use
  • Suppressed another expected MinimapControl null log message when expected when first spawning

0.8.22

  • 3/13/2021
  • Added Cabin Upgrade items and broadopedia pages
    • Bonuses for Sick Bay, Expanded Crew Quarters, Accessible Magazine, Secured Magazine, Water Tight Bulkheads, Holding Tank have been added
    • Made changes to the Ship Maintenance window and supporting scripts to add Cabin Upgrades
    • Added Cabin Upgrade item skill requirements
  • Added sun shafts visual effect
  • Added animated flags to all ships
  • Updated LoginClient scene's appearance
  • Minor visual updates to intro scene
  • Fixed bug where most ship bonuses were serialized improperly when synced to clients
  • Removed code related to increasing max gallons of ship classes, and the unused bonus values are no longer synced to clients (saves 40 bytes per sync in network traffic).
  • New players now start with a full crew of 8, instead of 5
  • Market supply/demand price scaling for NPC orders now goes from base price to 10 times base price instead of 20 times base price
  • All sea creatures, except whales, now require the Holding Tank Cabin Upgrade in order to be kept alive and fed.
    • Transporting sea creatures without a Holding Tank now will destroy 1 from each stack every 5 minutes, but will not use consumable resources without the Holding Tank (all currently require Animal Feed)
    • Transporting with a Holding Tank will still require consumables to keep them alive
  • Increased visibility of text over mini repair window bars
  • Increased base price of all higher tier ships and fittings, including most cannons
  • Fixed tool tips for Live Oak Framing items in Broadopedia

0.8.21

  • 2/18/2021
  • Can now switch measurement units to the metric system via the options menu
  • Bonus to ship class skills now changed to reduce damage to your hull integrity, and is now actually being applied
  • Started work on the ship officers feature
  • Added rich text filtering to chat messages
  • Reduced hull integrity of larger ships

0.8.20

  • 2/15/2021
  • Fixed Market window regression where the Purchase button wasn't changing to Sell when the market window mode is switched
  • Extended player view distance of ships, and reduced AI target distance, so they both match
  • Added new Hull Integrity feature
    • Hull integrity damage field added to back end tracking for ships
    • New max hull integrity stat added to ships and damage amount added to cannonballs
    • New Hull Integrity bar added to Repair tab
    • Hull integrity bar added to ShipWorldUI (UI HUD floating above other ships)
    • Added Hull Integrity stat to all ships and ammunition Broadopedia pages
  • Added new mini repair status window at the bottom center of the screen, which holds duplicates of the bars for gallons flooded and hull integrity as on the Repair tab
    • Repair UI script object moved to the root of the UI, so that it is now always active instead of only when the Repair tab is active.  
  • Switched game client builds back to uncompressed, to address a Steam update issue where 600MB is always downloaded for minor changes when compressed
    • This will use more space on disk, but small updates will be small downloads going forward
  • Add new Hull Upgrade items "Live Oak Framing" in all 4 sizes, to decrease damage to hull integrity when hit
    • Added to Broadopedia page
  • Fixed bug where Reinforced Hull upgrades were not applying their bonuses
  • Added "Cabin Upgrades" to backend ship record, and added available cabin upgrades stat to all ship classes

0.8.19

  • 2/5/2021
  • Added intermediate window to create market orders feature, so you can select items for orders which don't already have the category listed in existing orders on the city market
  • Switched the default graphics API back to DX11
    • You can continue using Vulkan API by adding -force-vulkan to the Steam launch options for the game
    • This was done because Vulkan can cause a crash on launch with certain GPUs or graphics drivers (only seen on older)
  • All smaller ships have received an acceleration and turn speed boost of between 10-30%
  • Mass of Po8 and R money items have been reduced by 80%
  • Added "Cannabis" item, and added it to some pirate faction AI ships to be dropped, added demand for it in all ports in line with existing Cigar demand
  • Added "Animal Feed" item, this item is produced in all agrarian ports
  • Medicine item now needed in your ship hold, or chance to heal an injured crew is cut in half
    • When an injured crew is healed, 1 Medicine item is used
    • Added "Medicine" item to game, added to AI ship spawns, added to temporary default items available in every port
  • Repair Timber item now needed in your ship hold for repairing leaks, or crew repair effort is cut in half
    • When a leak is repaired, 1 Repair Timber item is used
    • Added "Repair Timber" item to game, added to temporary default items available in every port, and added it to all AI ship spawns
  • All items now have 3 additional parameters, which indicate whether they use drinking water, meals ready to eat, or animal feed while they are in your ship's cargo hold
    • All land animals need animal feed and drinking water
    • All ocean animals need animal feed (no need for drinking water since they live in sea water)
      • Exception is Whales, which it isn't really plausible you'd be keeping them alive
    • All human items need drinking water and meals ready to eat
      • The exception are slaves, which unfortunately aren't treated like guests on an ocean cruise, so will use animal feed instead
    • These live cargo items will use consumables every 5 minutes, the same timing as ship crew and in the same quantities (1 consumable per 5 items, rounded up).  If missing a consumable, then 1 of each live cargo item which needed that consumable will be destroyed
    • Consumables for live cargo items aren't used while stored in city storage or while your ship is in range of a port
    • New event alert added for when out of consumables for live cargo
  • Ship icons on the mini map now don't update their color until you are close enough to see their UI HUD.
    • Exceptions are trade company, squadron, flotilla, and yourself (though trade company and flotilla not in game yet)
  • Added Crew Management Broadopedia page contents and Consumables page

0.8.18

  • 11/18/2020
  • Client and server version now saved to all log files
  • "shipObject is null in MinimapControl.cs" log message now suppressed in client player log until it becomes a real problem
  • When the user changes the music volume, it now actually changes almost immediately
  • Disabled several legacy server side debug messages going to the player log so as to reduce unnecessary clutter
  • Added "Made with Unity" logo to opening splash screen
  • Bug reports now save to their own file on the server instead of just the main log file
    • Fixed bug where the reporter's username was being saved as an empty string
  • Added the create market buy/sell orders feature
    • Market orders created by the player now expire after 3 months, and items or funds put up are automatically returned to the player's city storage at the same city when the database server starts if that time has expired
    • Added Create Market Order window
    • Button in the Market window now automatically activates and deactivates as needed to open the Create Market Order window
  • Minor performance improvement to CSV processing
  • Changed default channel of most client to server RPC's in CityPlayerInterface to the command channel, after noticing they were incorrectly set to the Large Messages channel (unlikely any detectable performance difference, as the Large Messages channel is primarily used from the server to the clients). 

0.8.17

  • 10/6/2020
  • Slowed down Route Planner rotation
  • Fixed ship wake positioning
  • Set Vulkan as default graphics API
    • Add -force-d3d11 to launch options in Steam to return to DirectX 11
  • When your ship is spawned, if over half the crew are unallocated then Beat To Quarters is now automatically called
    • This is so when you purchase and set up a new ship, it will automatically have crew allocated properly
  • Improved indication of whether you are viewing sell or buy orders in the Market window

0.8.16

  • 9/16/2020
  • Switched to different song for main menu
  • Set most songs to load in background, improving initial game load times
  • Fixed low volume of song 'A Sailor's Journey'
  • Removed "Depth of Field" from 3rd person camera post processing, but kept for cannon camera
  • Fixed performance regression caused by forcing tooltips to be on top every frame (now checks if already on top first)
  • Improved the performance of ship wake on clients
  • Changes to in game ocean for mild performance, appearance, and to allow fog effect to appear over the water

0.8.15

  • 9/3/2020
  • Added Chain Shot ammunition type
    • Chain Shot now fired by some AI ships
    • Chain Shot now available for purchase in cities
    • Splashes now scale for chain shot
  • Updated Chain Shot Broadopedia page
  • Zone servers now log current FPS, and as error if too low
  • Cities are now displayed in the Route Planner
  • Added SailCollider class for capturing trigger collisions from ammunition and calling the appropriate method in ShipDamageStatus
    • Started work in ShipDamageStatus for handling sail hits, as well as for handling hits to masts
  • Added trigger colliders to all sails on all ships to allow for detecting hits to the sails
  • When cannonballs are activated on the client we now call clientReset() on the cannonball before activating in an effort to eliminate the occasional issues with the wrong cannonball models being used client side

0.8.14

  • 6/11/2020
  • Enabled compression on all route planner globe textures to reduce build size
  • Exception errors caused by JCGNetwork API now record the stacktrace to the log file
  • Added current location of squadron members to the Route Planner
  • Reduced starting distance and max distance of Route Planner camera from the globe
  • Added setting ship name to Ship Maintenance Window
  • Fixed unintended water darkening, and in lower detail levels water flickering
  • Added tree prefabs
    • Made changes to quality settings (LOD Bias) to support trees with reasonable performance
    • Cancelled and removed trees from terrain for now, due to excessive performance impact - will have to come up with a better performing solution before implementation
  • Added FPS tracking both server and client side
    • Added optional FPS display which can be enabled with a setting to config.csv
  • Removed unused globe textures so they do not waste space in the builds

0.8.13

  • 5/9/2020
  • Added compass feature
  • Added scaling UI feature, which adjusts the size of UI elements with the game's window size/resolution
  • Medium and lower graphics quality settings now update the minimap twice per second instead of every frame, to improve performance
  • Fixed bug where sunk ships weren't rolling over
  • Added Route Planner feature
  • Disabled some performance impacting settings on all game scene cameras
  • Client side hotfix 0.8.13 build 2
    • Extended view range to fix issue where terrain was appearing/disappearing
    • re-enabled HDR on cannon camera
    • Adjusted size of night sky stars so they are less likely to disappear when anti aliasing is enabled

0.8.12

  • 4/27/2020
  • Fixed bug where you couldn't fit small guns to a medium slot, and large guns where shown as able to fit
  • Added consuming food/water
    • 1 Meals Ready to Eat and Drinking Water is used for each 5 crew rounded up every 5 minutes
    • If out of either, 10% of your crew is injured
  • Changed Fire started event alert to emergency (red color)

0.8.11

  • 4/18/2020
  • Fixed bug in updating display of player skill training
    • Now it should refresh the correct time remaining every 15 seconds
  • Major changes to the City Window
    • Market window now movable
    • Split the City window into 3 windows
      • Original City window now shows primarily City Storage and has buttons to access other city related windows
      • Added Ship Maintenance window for outfitting of your current ship
      • Added Dock window which shows all your ships at the dock available for you to switch to
      • When you close the City window it now automatically closes all of these other windows
  • Report Bug window now disables sailing keyboard controls while open
  • New ships now automatically created with maximum crew, except initial Bremen class

0.8.10

  • 3/30/2020
  • Replaced Sailing Quick Crew button with Gathering Quick Crew button
  • Fixed bug on close of Gathering window preventing clicking on the same natural resource again
  • Optimizations on server side by caching many GetComponent calls
  • Added Report Bug feature

0.8.9

  • 3/8/2020
  • Minor housekeeping cleaning up the low hanging fruit of compiler warnings
  • Added Christopher Class Heavy Cog
  • Increased max gathering crew for Bremen Class Cog
  • Added Athens Class Gunboat
  • Rebalanced Ship of the Line base prices (generally increased)

0.8.8

  • 3/4/2020
  • Added fish resource gathering
    • Added special fish spawners which deploy at existing zone spawn locations
    • Fish spawners spawn fish prefabs on clients for visuals
      • Fish prefabs enable/disable based on the low poly distance set in the options menu graphics setting slider
    • Starting with Salmon, Great White Shark, and Bass, while other fish types will be added later
    • Created GatheringUI which opens when you click on a fish resource in the Resources window
    • Added ShipGathering.cs for executing natural resource gathering to all ship prefabs
    • Moved updating resources in player range from ItemDrop.cs to Resource.cs so it applies to all resource drops instead of only item drops
    • All zones now have at least 1 fish spawner available
  • Increased max size of fire animation (visual change only)
  • Minor error checking improvement to ItemDropSalvageUI, which will prevent error in a rare corner case
  • Added Broadopedia page for Heated Shot
  • Rebalanced all Stone Cannonballs, so they now have a higher chance of causing fires (still lower than Heated Shot), and increased their maximum crew damage
  • Rebalanced starting skills so all characters can at least upgrade to a caravel, and some can use larger guns from the start
  • Fixed bug selecting cannon deck switching back to previously selected deck on ships with multiple side cannon decks
  • Rebalanced live fish items' base prices and mass
  • Fishing and Advanced Fishing skills now increase fishing speed by 10% per level.  Default with no skills checks for catching fish every 5 seconds.  Level 5 on both skills would bring that down to 2.5 seconds.  

0.8.7

  • 2/17/2020
  • Repositioned Zone 0 spawner locations so they are all within the zone's borders
  • Started work on adding ship skins by adding the skin category of items and adding the skin item as something fit to the ship in the back end systems
  • Disable all autostart zones to allow for testing on lower powered devices
  • Progress on ship fires mechanic
    • Created ship fire and smoke animation effect
    • Fires objects now automatically added to ship records on ordinance impact
    • Fire intensity now synced to clients
    • Changed the ShipDamangeStatus script on all ships to sync to all clients instead of just subscribed, so players will see ship fires and smoke at very long distances
    • Fire animation effect now automatically instantiated and destroyed on clients and the size is adjusted based on the fire intensity
    • Firefighter and fire pump work now applied to putting out fires, so you'll need to start leaving crew in the firefighter role
    • Fire intensity now reporting in the client's Repair tab (bottom left)
    • Fires now produce leaks once it grows in size to "large"
    • Some AI ships now fire heated shot
  • Changed copyright date to 2020
  • Fixed bug where heated shot wasn't setting the splash size when hitting the water

0.8.6

  • 12/22/2019
  • Fixed bug where a ship's total flooding would be reset to 0 whenever the ship was respawned
  • Fixed bug where teleportation is only successful when the zone to transfer to is already online
  • When cannonballs hit the water, the size of the splash now depends on the size of the cannonball (previously all splashes were the same size)
  • Added ship images to relevant Broadopedia pages
  • Added ammunition selection UI, allowing the player to switch between ammunition types at sea
    • Redesigned the syncing of loaded ammunition to the client - previously just the name of the loaded ammunition was synced for display, now the full items are synced, and on the client the string name is then derived from the item
    • The database now saves your last ammo selection for a given deck as its default class, so when moving between zones or logging back in it will attempt to reload the same ammunition.  If ammo of that class is unavailable it will revert to the default priority when multiple types of ammo are in the cargo hold (current behavior)
  • Corrected misspelling of oar as ore in Broadopedia's Galley page
  • Decreased font size of news page
  • Added Heated Shot ammunition type (fires not yet implemented)

0.8.5

  • 12/4/2019
  • Fixed bug where ocean bow spray was turned on for every ship on the server, wasting CPU
  • Added National Relations window which displays all relations between the game's nations
  • Changed alliance and same faction color on the ShipWorldUI and mini map to be a more pure blue, so as to differentiate it from the friendly color and from even your own ship

0.8.4

  • 11/21/2019
  • Added ocean spray at the ship's bow
  • Username/password is now saved
  • Improved cannonball splash animation
  • Removed unnecessary logged warning coming from cannonballs waiting in the object pool

0.8.3

  • 11/6/2019
  • Add build icons
  • Add daily auto shutdown feature
    • Game servers will automatically shutdown at 2:40 AM US Pacific time
    • Game servers will automatically restart at 3:00 AM US Pacific time

0.8.2

  • 11/1/2019
  • Added national flags
  • Removed Smooth and SmoothRB modes from JCGNetworkTransform
  • Slightly reduced max oar speed of both Galley class ships

0.8.1

  • 10/18/2019
  • Developed new interpolate mode for JCGNetworkTransform
    • Much smoother client side movement
  • Change physics timestep and server frame rate to 32 FPS from 25 for improved collision detection of faster moving cannonballs against the smallest ships and smoother simulation
  • Add random item drops which appear on the map without a ship dropping it

0.8.0

  • 10/12/2019
  • Added Dreadnought Class Heavy Galleon
  • Added Straight of Gibraltar and entire Mediterranean and Black seas
  • Added Spanish, French, and Turkish starting locations and capital ports
  • Added confirmation prompt when saving location for teleport
  • Added Current News feature
  • Fixed terrain seam near The Hague
  • Upgraded multi terrain editor asset to address bug where terrain height modifications were creating incorrect height errors and breaking terrain seams
  • Implemented rowing propulsion
  • Added Roma Class Galley
  • Added Constantinople Class Great Galley
  • Added AI classes for the Ottoman Empire
  • Added functionality to add new characters with all skills at level 5 for use in internal testing and as admin accounts
  • Added new trade items for cooking oils and coffee
  • Added current zone description when logging in and when in zone
  • Added new AI ship classes
  • Updated world relations

0.7.14

  • 9/6/2019
  • Fixed player info window bug where the Squadron Invite button would be available when not a member of a squadron
  • Added teleport feature
    • The player can save a teleport location
    • Player can at any time choose to teleport to their saved location
    • Requires the player to be sailing an Escape class dinghy
  • Added button for bug report feature (for future feature)
  • Disabled several UI buttons for features not yet implemented in the City and Market UI windows
  • Added scuttle feature
    • Allows the player to sink their own ship
  • Fixed issue where the minimap camera continues following your sunken ship instead of switching to your Escape class
  • Fixed Portuguese player starting location set incorrectly
  • Fixed URL of TOS link when creating new account

0.7.13

  • 8/31/2019
  • Fixed distant ship not properly updating their position on clients (for reals this time)
  • Added Portuguese AI ship classes
  • Added zones to the atlantic west of france and the english channel all the way to -17 longitude
  • Added Portuguese capital zone and starting location

0.7.12

  • 8/29/2019
  • Fixed bug where character nationality was not being saved correctly, causing them always to be loaded from disk as British
  • Attempt to fix issue with distant ships not properly updating their position on clients (not successful, still working on it)
  • Added zone for the french west coast / spanish north coast
  • Added spanish AI classes

0.7.11

  • 8/22/2019
  • Changed physics material on all ships so when they run into each other they are less sticky
  • Zero players timeout for zone servers now 20 minutes instead of 30
  • Added 13 new zones and 37 new ports
    • Added zone for Netherlands area (Dutch capital)
      • Since most of the country is at or below sea level, this required considerable manual sculpting to work in the game
    • Added zone for Saint Petersburg (Russian capital)
  • Added Dutch, Russian, and American AI classes
    • While most countries will have similar ship classes and fleets, the Americans won't have the highest tier Ships of the Line nor will have any obsolete ship classes, instead favoring modern frigates and corvettes like the Constitution and Niagara classes
  • Added sliders to options menu to control rotation rate in 3rd person and the cannon camera
  • Fixed bug with location anchor positions being incorrect for most zones, causing calculation of current location to be slightly off
  • Auto start zones can now be automatically shut down with 0 players
    • An option has been added to enable/disable keeping auto start zones online even with 0 players connected, with default set to shut them down instead of keep them online
  • Changed all ships to send position updates to unsubscribed players once per second instead of every 2 seconds
  • Switching moving between zones triggered by a series of lat/long bounding boxes for each zone in code, rather than manually placed trigger colliders in each zone
  • New Dutch and Russian characters now start near their respective capital ports instead of London
  • Added build compression for decreased size on disk

0.7.10

  • 7/29/2019
  • Add friendly fleet which always spawns outside of a nation's capital
  • Added new AI classes for British and French for Nicholas and Latina class ships
  • Rebalanced AI spawners for British and French to favor lower class ships
  • Rebalanced Zone 0 (English Channel) AI spawners to favor the British over the French
  • Login server now requests zone status and provides to client when ready for it to connect to
  • Login server now requests zones to be started which are currently offline when a player needs to connect to the zone
  • Zone servers now report to master server when they have had 0 players for 30 min, and the master server now shuts them down
  • Auto start zones in the master server now limited to national capitals instead of all implemented zones
  • Implemented UI check boxes and sending to server for activating rowing and steam engine propulsion
  • Reduced chance of injured crew death from 0.5% chance per second to 0.2%
  • Zone servers now properly shutdown their server socket and thread prior to reporting offline to the master server
    • This should allow the master server to immediately restart the same zone on the same server computer without issue

0.7.9

  • 7/23/2019
  • Changed broadside so ships with multiple decks fire a single cannon at a time
  • Set music priority to maximum, to resolve issue where large amounts of cannon fire can cause music to stop
  • Disable aft ship wake on server (now all wakes disabled instead of just port/starboard only, which was a mistake)
    • Small but noticeable CPU usage improvement
  • Disable all ship wakes on 2 lowest graphics quality settings
  • Implement Low Poly ship mode to increase game client performance
    • At certain distance from the player, ships switch to low poly mode
      • Distance depends on graphics quality setting
      • Disables ship wakes, rope models, and some cannon models
      • In the future the plan is to switch to a simpler base ship model
    • When moved to within a certain distance, switches back to High Poly mode
    • On server all ships forced to Low Poly mode
    • At lowest graphics settings frame rates are doubled

0.7.8

  • 7/22/2019
  • Fixed null reference error on server while turning your ship at the moment it sinks
  • Implemented port and starboard broadsides
    • You access them from the Cannons tab in the bottom left
    • You have to be at Battle Sails for at least 6 seconds prior to attempting a broadside
    • AI Ships of the Line now only use broadsides in combat
  • The cannon camera now shakes when you are hit with ordinance (previously it shook when you were firing cannons)
  • Increased the ShipWorldUI activation distance by 33% (UI which hovers over other ships)
  • Increased size of Nantes frigate by 20%
  • Decreased some ship skill requirements
  • Reduced training multiplier for Shipmastery and Advanced Shipmastery skills
  • Reduced idle until destroy timer for AI ships from 1.5 hours to 1 hours
  • Applied idle timer to AI's which have a target but have not fired for an hour
    • This will destroy AI's which are permanently stuck on land next to an enemy AI, or sailing together off into nowhere, unable to fire but not actually idle
  • Slightly decreased the size of AI spawns
  • Restored AI ships not targeting Escape class

0.7.7

  • 7/19/2019
  • Hot fix for some bad AI behavior
    • AI now when accidentally get shot by a friendly AI do not treat the shooter as hostile
    • AI will now turn when in contact with another ship or land, to reduce the chance of getting stuck

0.7.6

  • 7/18/2019
  • AI now targets based on a ship's relations rather than simply if they are a player
    • AI will now target other AI with bad relations
    • AI should now continue to target a player's ship after they have disconnected
  • Added AI classes for British, French, and American fleets, and placed them in appropriate zones
  • Reenabled FXAA for some higher quality settings, and disabled all shadows
  • Reduced despawn time for item drops to 3600 seconds (1 hour)
  • The British are now hostile to the French and Americans, and the French and Americans are set friendly
  • Increased max gallons of all ships, to give more time for repair crews
  • Fixed bug where when a zone server is really active the player client will not send the signal to finish setting up the connection

0.7.5

  • 7/17/2019
  • AI ships will now automatically call Beat To Quarters whenever they have unallocated crew
    • This occurs when crew are injured in combat and then healed
  • Added ShipFaction.cs script to ships which tracks the nationality of the ship's owner
    • Existing AI ships now all set to Pirate nationality, and started work on AI ships supporting different nationalities
  • Added FactionRelations object and script for maintaining the current relations between all nations and updating the clients
  • A ship's nationality is now displayed in the ShipWorldUI (GUI that hovers over a ship) in game
  • Minimap and ShipWorldUI colors now set depending on the player's relations to the owner of the other ship
  • Fixed minor null reference bug caused by receiving a ship turn RPC after the player's ship has been removed (such as destroyed)
  • Started adding support for Flotillas to ShipOwner.cs
  • Fixed bug where moving between zones 2 and 3 would result in an endless cycle of switching zones
  • Temporarily disabled anti-aliasing due to visual glitches
  • Switched physics collision detection to Multibox Pruning Broadphase mode, to test if it can improve performance
    • Preliminary results are a 20% to 40% reduction in server CPU use on the highest physics threads
  • Disabled gravity on all ship rigidbody components (which wasn't doing anything other than using a small amount of CPU anyways)
  • Minimap icons for ships are now removed immediately when sunk

0.7.4

  • 7/9/2019
  • Sunk ship item drops now include ship fittings instead of just cargo, and increased item drop chance to 50%
  • AI ships now use the name of the AI class (example: NPC Interceptor) instead of just NPC Pirate for all

0.7.3

  • 7/9/2019
  • When creating a new user, now properly accepts a username of 4 characters
  • Rebalanced Zone 0 (London area) AI spawns so they are usually less difficult than before, and moved them away from the new player spawn point near London
  • The WindController now changes the wind direction during game play every 30 minutes (previously was a fixed direction)
  • Fixed issue with bit of land near London at sea level sticking out into the water but difficult to see and easy to get stuck on
  • Added Squadron chat box feature
  • Minor performance improvement for all chat boxes

0.7.2

  • 7/4/2019
  • Switched ship rigidbody components to using interpolate (was disabled previously due to a Unity bug in a previous version)
  • Increased update rate for ships to 25 per second from 10, and 5 per second for cannonballs

0.7.1

  • 7/3/2019
  • Added try/catch to various places in JCGNetwork involved in message processing to better handle malformed or otherwise problem messages received
    • Previously it was possible to get a message stuck in the queue that can't be processed, blocking other messages from being handled, but now they should be dropped and a log message recorded
  • Added 2 new AI ship classes
  • Increased AI Spawner spawns to 15 in all zones (up from between 8 and 11 in each zone) increasing the number of AI ships per zone
  • Rebalanced all AI Spawners, and reintroduced the 20 AI ship fleet spawns to more difficult zones
  • Fixed issue with most ships not getting the proper "fun factor" speed multiplier applied (causing older ships in the game to move slower than they should), and set now to 15.  
  • Moderate code refactoring by replacing the critical references to the Player GameObject and the player's Ship GameObject with references to the Player.cs and ShipComponents.cs scripts, which now reference all other components on their respective objects.  
    • This drastically reduces the number of GetComponent calls on both the client and server, which should improve performance
  • When receiving your initial Bremen class Cog, the crew are now divided by the database server between sailing and cannons when the ship is created.  
  • Quick Crew "Beat To Quarters" is now called automatically whenever you change the number of crew on your ship at port, and is no longer called automatically when your ship is spawned or you move between zone servers
  • Keyboard ship controls now disabled while typing into a chat box
  • AI ships now destroy themselves after 90 minutes of idle time without a target
  • Database out of sync issues after a server crash causing a ship to be stored in multiple places, or both currently being sailed and stored in a city at the same time, are now automatically corrected on database server start
  • Buttons on the Player Info window now are automatically disabled when they should not be available
  • Fixed race condition causing some info on a player's ship to not be sent to their client when the ship was spawned, depending on timing

0.7.0

  • 6/17/2019
  • Fixed bug where supply/demand orders which would increase quantity at a rate of less than 1 an hour never actually increase in quantity
  • Added clicking character names in chat boxes now opens a player info window
    • Added PlayerMiscRequests.cs for requesting info on other players, and as a catch all for other minor request features later
  • Added Squadron feature (temporary player fleets)
    • Added Squadron invites can be sent from player info window
  • Added Company C# class for establishing player created Trade Companies (initial work, feature not yet complete)
  • Added PlayerStatus feature where Zone servers continually send updates on a player's status to the Tracker server
    • The Tracker server now maintains an up to date list of all connected players, their lat/long, connected zone server, and current ship class
  • Fixed bug where Universal Time Messages were being ignored by zone servers
  • Added config.csv configuration file to the client and server_cluster parameter for selecting server cluster
  • Added Steam SDK
  • Upgraded Unity version to 2018.2.21
  • Player.cs now has references to all other Player GameObject scripts set in the inspector to improve performance of communication between these scripts and other objects needing to talk to any of these scripts 
    • Now just a reference to Player.cs needs to be established instead of getting individual references to the other scripts
  • Added distance calculation code between two lat/long positions
  • Testing a physics performance possible improvement where all terrain colliders not on a shoreline are now disabled

0.6.14

- 4/18/2019
- Rebalanced all prices for ships and their fittings (mostly increases)
- Added Hind Class Galleon
- Added Nantes Class Early Frigate
- Added Essex Class Race Built Galleon
- Added Santa Clara Class Caravel
- Added Santa Maria Class Light Carrack
- Added Niagara Class Corvette
- Ship World UI (UI window displayed over other ships) now displays the ship's class
- Transfers of items between ship cargo and city storage now displays the total mass of the items being transferred
- Change to AI ships to slightly improve their accuracy

0.6.13

- 4/7/2019
- MasterClient.cs now has an option to no longer connect to the default address on start, to allow for changing this address before connecting
- The Command Console now takes an input field for the server cluster address to connect to
- Increased all ship speeds again, now a 100% increase vs 0.6.11
- Increased ship max speed penalty for battle sails to 60%, and now applying this penalty to acceleration
- All ship equipment and hull upgrades apply their bonuses, and are available again in all ports
- Most skill bonuses are now applied
- Most of the work for supporting multiple servers has been completed

0.6.12

- 4/3/2019
- Added all zones to fill out the British isles, including terrain and cities
- Added code for zone transfers of players
- Added code for starting offline zones when players attempt to move to an offline zone
- Changed game name to Broadside: Perilous Waters
- Increased all ship speeds by 36%
- Added new default buy orders in all cities for many items
- Fixed several bugs in the Broadopedia

0.6.11

- 1/31/2019
- Added enforcement of skill requirements for launching ships, fitting items to ships, and adding skills to the character
- Added a significant amount of Broadopedia content (there's lots to put in there), enough so the game is now playable with the new skill system in place (you can now see all skill requirements for all ships, ship fittings, and skills in the Broadopedia, with of course more content for the Broadopedia to come).
- Replaced Ironclad ship type with more general Gunboat type
-- Atlanta Class Ironclad remains in the Gunboat type, and moved Athens Class Corvette so it is now a Gunboat
-- The Athens Class is now planned to be a Corvette sized ship with a small number of Large guns, and the sailing performance of a frigate
-- Made skill changes so Ironclad skills are now Gunboat skills

0.6.10

- 1/10/2019
- Developed the skill class and enabled skill training
- Added many new items including skill books
- Added skills UI window to view character skills and set a skill to train
- Set all skill requirements of all applicable items
- Added slight red color to items on the market, in the city storage, and in the city ship cargo windows for items the character lacks skills to use
- Implemented the purchase of skill books in capital ports and adding them to your character's library to add a skill to your character
- Switched copyright date to 2019

0.6.9

- 11/17/2018
- Fixed bug where ship impacts could result in a ship moving sideways for significant distance
- Fixed bug where character names had to be 5 characters long instead of 4 that the help says
- Sun now rises in the east and sets in the west instead of the wrong direction
- Implemented Command Console to connect to Master Server
- Added Shutdown Cluster button to Command Console
- Implemented managed spin down of all cluster servers while updating database correctly
- Added disconnect all clients methods to JCGNetwork, as well as preventing new client connections

0.6.8

- 11/10/2018
- Modified size and sound distance of cannon shooting, impact, and splash effects
- Fixed bug where text field of gallons flooded would be cut off on large ships
- JCGNetwork string deserializing now outputs the size in bytes that the string occupied
- JCGNetwork ClientServerFrontEnd.Setup now takes the secondary message handler delegate method as a parameter
- Market purchases now reduce the quantity available from the sell or buy order, and if a player created order the money is deposited in their city storage
- Completed implementing selling to buy orders
- Reduced fixedupdate timestep to 25 fps, and reduced server target fps to the same rate
- Minor physics call optimizations in fixedupdate
- Fixed high script cpu usage on zone server caused by 3rd party script that handles ship wakes (need to investigate if this is a client issue in the future as well)

0.6.7

- 11/2/2018
- Increased the speed of the Baltimore class Corvette both velocity and turning
- Added night time stars
- Improvements in performance of the sail control UI script to reduce FindObjectWithTag and GetComponent calls
- Fixed null reference errors when database reads market orders csv file on startup
- Fixed error on database server preventing the storing of market orders sent by zone servers
- Added proper support for configuring UDP packet payload size in JCGNetwork
-- Reduced UDP payload size to 508 to fix issue with some ISP's dropping larger sized UDP packets
- Implemented supply/demand market order quantity and pricing updating mechanic
- Implemented displaying what a city market produces at the bottom of the market UI

0.6.6

- 10/27/2018
- Added requesting market orders from the database
- Adding the creation of production and demand related buy and sell orders for the city population

0.6.5

- 10/12/2018
- Added Dublin Class Ship of the Line
- Fixed issues with the Nicholas class frigate's sails

0.6.4

- 10/5/2018
- Added Baltimore Class Corvette
- A button to view the city has been added, which appears in place of the city window when in range and moving slow enough
- Adding salvaging item drops
- Added throwing cargo overboard to create an item drop (already created automatically when ships sink)
- Additional work on filling out the details of items in the game
- Slight improvement to AI cannon firing accuracy and AI behavior while attacking

0.6.3

- 9/29/2018
- Added sail configuration slider
- Decreased water bailing, ship repair, and cannon loading speed by 30% when at full sails
- Decreased top speed by 40% and increased turning speed by 40% when at battle sails
- Disabled random rolling of the ship (only left up/down bobbing)
- Increased "fun factor" to 11 from 8.5 and adjusted all sails force values up by roughly the same percentage - this will result in ships feeling like they move faster and accelerate faster
- Added ship heeling based on sail tack and sail configuration
- Added support for hostnames to JCGNetwork clients (connect to joecensored.com instead of IP address)
- Added option to disable the syncing of child transform rotation for JCGNetwork, which is being disabled on all ship objects
- Improved smooth syncing of ships

0.6.2

- 9/22/2018
- Implemented random spawner locations
- Redesigned AISpawner script to destroy the object when all spawned ships from this object are destroyed, so that another spawner can be later spawned in another location
- AISpawner script now uses the existing Prefabs script to get applicable ship prefabs instead of its own list of prefabs
- AI ships now know how to attack players
- AI script now stops trying to update when the ship is destroyed
- AI ships check for targets from their Subscribed connections list
- AI ships no longer follow players in Escape class dingies
- When a subscription is added to a ship in now sends the current crew amount, to fix a bug where sometimes you would see 0 for crew
- AI ships now Beat To Quarters on startup
- Moved to Unity 2018.2.9, which resolves a bug where textures would disappear when changing graphics quality settings during gameplay

0.6.1

- 9/18/2018
- Updated JCGCameraControl.cs to allow for updating position in either Update or LateUpdate, and added an after position update delegate to be called for updating various UI scripts once the camera position is set for that frame - This was to fix a new issue where the ShipWorldUI (UI that appears above other ships) was bouncing around as the main camera was moving.
- Increased the update rate for the City UI
- fixed bug where when switching ships the sails and anchor status will be out of sync from the player's UI settings for these - fixed by detecting a ship change and sending the current sail point and anchor status to the server
- On ship change now calling Beat to Quarters automatically - this was added so you can always use sails and cannons when entering the game or switching ships, but this may be reversed in the future so as to preserve user settings for crew which are currently destroyed with this change

0.6.0

- 9/17/2018
- Developed new in house networking API to replace Unet called JCGNetwork on top of the low level socket class
-- Created and thoroughly tested new network transport
--- This is a connection oriented, multithreaded transport using UDP, implementing multiple channels, reliable and unreliable messaging, weak CRC checks (to augment UDP packet CRC or provide minimal CRC if disabled), integrated fast encryption, small message combining, and large message fragmentation
-- Created and tested new high level API
--- Implements object spawning, variable syncing, RPCs, transform and physics syncing, and a location based subscription system to reduce network traffic to players who are far from some network objects in game
--- Created a simple fake game where multiple clients roll balls around, and these balls are synced to all clients, as part of testing
- Converted all Unet MessageBase classes over to JCGMessageBase
- Implemented JCGNetwork for all server to server communication successfully
- Implemented JCGNetwork for login client to login server communication successfully
- Implemented all conversions of Unet HLAPI code for zone servers and client for JCGNetwork
- Various minor updates to JCGNetwork for bugs found during implementation (handling of null strings, etc)

0.5.0

- Failed, no completion date
- Attempted to resolve continued network reliability issues using Unet
-- This effort was ultimately a failure

0.4.6

- 7/xx/2018
- Switched channel 2 back to reliable fragmented, added channel 3 as unreliable fragmented between clients and zone server, moved messages sent on a regular basis from channel 2 over to channel 3
- Fixed display of 0 total crew after connecting to server
- Added Headless Builder for improving server build resource usage
- Did some clean up and and added debugging in OnCollisionEnter in ShipDamageStatus.cs to try avoid or determine the cause of null reference errors occurring sometimes when cannonballs impact a ship
- Enabled the Quick Crew allocation buttons
- Changed ship fittings so a request to fit more items than available (cannons) will result in the number of items available to be fitted rather than rejection of the request
- Enabled error message reporting to the user for the City and Market UI windows
- Added crew deaths from injury

0.4.5

- 7/11/2018
- Reduced turning commands sent from client to once every 0.4 seconds instead of once per fixed update (previously approximately 60 times per second)
- Enabled use of individual ship turning speeds
- Increased mass of ships, and made ship masses different from each other
- Enabled individual ship propulsion force values
- Fixed bug with displaying crew on the ShipWorldUI caused by previous network performance improvements that resulted in crew always reported as 0 (the UI displayed above a nearby ship)
- Crew values now affect ship turning speed, acceleration, max speed, and cannon load times
- Reduced leak repair effort to 1 unit of effort per assigned crew per second as originally intended, instead of 3 units, so leak repairs now effectively take 3x as long
- Minor changes to existing ship crew allocations for balancing
- Reworked cannonball physics including significantly reducing drag value to prevent them from appearing to "float" at the end of their arc
- Increased volume of "hidden song" music track to match volume of other songs, and increased its chance of playing to 1% from 0.2%, as I've never actually heard it play in game
- Added crew injuries on ordinance penetration
- Added assigned medical crew can heal injured crew, which when successful will move them from injured to unallocated
- New character Bremen cog now starts with crew assigned to sailing and cannons rather than unallocated
- Added Nicholas Class light frigate
- Removed injured crew from crew total sent to all non local player clients for display on the ShipWorldUI
- Moved to Unity 2018.2, Net 4.x scripting backend, and Windows client builds now using IL2CPP instead of Mono
- Reduced ship position updates from 29 per second to 10 per second in effort to address a lingering networking issue
- Switched channel 2 to unreliable fragmented between clients and the zone server as an experiment to address ongoing networking reliability issues (appeared successful, so the next step will be to add a new unreliable fragmented channel as channel 3, restore channel 2 to reliable fragmented, and move non-critical communication from channel 2 to channel 3)
- Investigating the possibility of building a new custom networking API in house to address reliability and lack of visibility issues related to the use of the Unet API (the primary reason behind the move to Unity 2018.2 to get access to the .Net 4.x scripting backend, which adds the System.Collections.Concurrent namespace)

0.4.4

- 7/4/2018
- Experimenting with disabling motion blur
- Added loading market orders from disk and saving
- Fixed bug causing cannonballs to bounce off ships if reused in the object pool after having already impacted a ship

0.4.3

- 6/28/2018
- Rebalanced most cannonball forces to reduce the spread of range between larger and smaller cannonballs
- Reduced the average GPS for 42 and 68 pound iron cannonballs
- Added Ocean class Ship of the Line
- Added Enterprise class Frigate
- Added Latina class Caravel
- Added object pool system for ammunition to reduce network strain from firing cannons
- Reworked the networking functionality of many ship components so as to eliminate any unnecessary network updates, remove updates to all clients that only need to go to the player controlling the ship, remove updates that were happening every frame, and avoid sending updates when the data hasn't changed
- Replaced all cannonball objects with a single unified object so they may more easily be object pooled
- Reduced packet size to 1410

0.4.2

- 6/21/2018
- Added Documents item category, and Books, Maps subcategories
- Added Constitution class frigate

0.4.1

- 6/20/2018
- Added city market UI and back end code to support the city markets
- Added market purchase functionality
- Added CityPlayerInterface class and moved all existing city related methods from the Player class to this new class
- Added MarketOrder serialization
- Increased City UI refresh rate from 5 seconds to every 3 seconds
- Started on adding special "Full Broadside" option for firing cannons

0.4.0

- 6/1/2018
- Added tabbing between input fields for login and account creation
- Database now drops CityShips and CityContainer records that are empty instead of writing them to disk
- Ships now disappear immediately when a player disconnects when in range of a city, or disappear as soon as they drift into city range when already disconnected.  Otherwise they still stay in game for 5 minutes
- Implemented all City UI tables and layout
- City UI now made part of the primary UI canvas to resolve issues with no other window able to be opened on top of the City UI
- Added tool tips feature for various UI elements
- Completed implementation of moving items between all tables of the City UI, fitting and unfitting items to ships, moving ship items between the dock and city storage, switching active ship, and managing crew assigned to ships.  

0.3.9

- 4/9/2018
- Added UI display above other ships to display their name and stats
- Changed disconnected message in main menu to suggest checking internet connection or game version
- Added Item Drops when a ship is sunk
- Upped server frame rate to 60fps
- Added day/night cycle system where time is based on a universal game time maintained by the tracker server
- Made minor font and UI changes to improve visibility and readability
- Moved from Unity 2017.2.0f3 to Unity 2017.4.0f1
- Moved from Post Processing Stack 1.0.4 to 2.0.3 and modified selecting quality settings to support the new stack
- Started work on city market system
- Fixed visible terrain seams
- Added CityShips record, which functions as storage for ships stored in a port (city) by a character or trading company
-- Added loading CityShips records into the DB server, and transferring them to/from the zone servers
-- Added updating Ship records for ships stored at a port back to the DB, and filling requests for Ship records as needed by ports on the zone servers
- Added audio tick when pressing the +/- buttons on the Crew UI table, due to lacking a visual button press effect
- Started work on adding UI elements to the City UI window (previously the City UI when docked at a port would just open an empty window)
- Added ShipComponents script to manage references between various components on a Ship object, and removed the previous tangled mess of GetComponent calls between scripts on the same Ship

0.3.8

- 3/9/2018
- Added Event Alert system to notify the player of events such as hitting another player with ordinance or another player causing a leak on your ship
- Significantly reduced vertical rotation of the cannon camera, and significantly increased the force applied to cannonballs when firing
-- This was to make ordinance move considerably faster and restrict them to a much flatter trajectory
- Decreased the ship speed "fun factor" from 9 to 6
-- Play testing showed the ships were moving far too fast, like speed boats, and firing cannonballs was like trying to throw a football between two speed boats - these changes correct that issue
- Fixed bug where the ship record, especially damage record, was not being properly applied to AI controlled ships
- Fixed bug where the ship would teleport instead of slowly sink when it is sunk
- Disabling colliders on sinking ships, so that your Escape class Dinghy can be instantiated at the same location without collision issues
- Replaced the cannon firing smoke effect with a new effect, in preparation for removing the old Detonator effects package which will no longer function once moving to Unity 2018.1.  

0.3.7

- 3/5/2018
- Adding syncing of ShipFittings to client
- Added use of multiple side gun decks to WeaponControl.cs, PlayerWeaponControl.cs, and Armament.cs
- Replaced built in NetworkTransform with new custom position syncing script, currently just on cannonballs
-- This smooths the flight path of cannonballs on the client, while staying in better sync with the position on the server (previously cannonballs would wobble more in the air, and be significantly behind the position on the server, so a client would see a splash on the water while still seeing the cannonball in the air above the water)
- Minor networking optimizations
- Added ship sinking feature
- Added generating a new Escape Class dinghy when the player ship is sunk
- Added resetting the client so it will properly activate a new ship after their previous ship was sunk
- Added cannon impact effect
- Completed end to end ordinance causing ship leaks feature

0.3.6

- 2/13/18
- Added Leak, Fire, and ShipDamage objects
- Added ShipDamageStatus networkbehaviour, and completed applying effort from crew to repairing leaks, bailing water, and fighting fires
- Minor performance improvements and cleanup
- Added Repair UI for displaying current leaks and flooding of the ship

0.3.5

- 2/6/18
- Added disconnect of client if incorrect client version
-- Added reporting disconnected status in LoginClient scene
- Fixed bug during character creation where the user would not be told they were submitting an invalid character name
- Added setting the ShipContainer contents on the server from the Ship record, and syncing to the client
- Added string names for Items
- Added client UI window that displays the contents of the player's ship cargo

0.3.4

- 2/3/18
- Implemented new terrain scale of 0.14 (Earth is simulated at 14% of its actual size)
- Increased "fun factor" speed multiplier to 9
- Implemented crew status page, including allocating crew to roles
- Updates to camera clipping plane distance
- Added lat/long to Unity world coordinate conversion script
- Added ships now spawn at the location the player previously logged off
- Added Lat/Long UI display
- Moved terrain to their own separate scenes which are loaded additively instead of part of network instantiated prefabs
- Added a "Destroyed" status to items

0.3.3

- 1/30/18
- Changed items and containers to use floats for size instead of ints
- Added AI ships use of Ship record objects
- Changed ship guns to just Long Guns and Carronades
- Began work on the Cannon and Crew status UI tables
-- Crew status gets all data from the DB, while Cannon status has place holder data to work on the layout
- Fixed bug where the camera would visually snap back to the ship centered when switching back from a cannon camera to the main camera
- Fixed bug where ship record objects updating to the database on player disconnect would fail due not initializing the Crew object of the Ship record object

0.3.2

- 1/14/18
- Added updating the character and ship objects back to the database
- Fixed bug where ship fittings weren't being saved to csv correctly

0.3.1

- 1/13/18
- Adding saving and loading ships to the database
- Changed some text colors from red to yellow in the login windows so as not to look like an error

0.3.0

- 1/11/18
- Added Zone servers requesting character records from the database for logins
- Added Zone servers authenticating on player connection that the player has a correct character name and login token combination
- Configured post processing effects stack to give good results
- Now changing Post Processing Profiles based on user Quality setting
- Completed Crew, ShipFitting, and ShipContainer classes
- New Bremen class cogs are now automatically created for new characters
- When logging in, the ship instantiated is now the ship record in the DB instead of a static ship for all players

0.2.5

- 12/29/17
- Added Bremen and Escape ship prefabs
- Restored original scale of ship models (scale 1 for Constitution)
- Added Loading scene to async load the LoginClient scene, and to just load the GamePlay scene
- Reduced effective music volume by 75%

0.2.4

- 12/27/17
- Set ChatUI to always update the chat box OnEnable so there is no delay in displaying chat messages that have already been received and processed just because the player was not looking at that chat window
- Added support for updating characters to the database
- Added support for the Login server to generate random login tokens, to be used to authenticate connecting players by zone servers
- Fixed broken response from database when a user exists but has no character, caused by adding encryption
- Worked on supporting network code for requesting and updating characters from the database

0.2.3

- 12/20/17
- Fixed issue where tracker server wasn't recording new zone status messages
- Fixed several uses of encrypted strings in log messages recorded by LoginServer.cs
- Global chat now works
- Fixed Global and Faction chat windows so they are bottom justified and the sliders start at the bottom
- Fixed distortion band in ocean at long distance with cannon camera by increasing ocean projection grid to medium from low
- Removed SkyMaster asset, which was currently not used

0.2.2

- 12/17/17
- Added 5 second delay between server auto start phases so servers can settle for a bit before follow up servers that depend on them are launched
- Continued working on Tracker server zone tracking status
- Added music manager and new songs
- Reduced default music volume to 35%

0.2.1

- 12/11/17
- Reduced default zones to just zone 0
- Fixed missing ZoneChat prefab
- Fixed Incorrect script cited in MasterServerController logs
- Fixed server player log names (now zone0_player.log instead of just zone0)
- Fixed client message registration causing null reference error in GamePlay scene
- Fixed bug where chat messages weren't being removed from the queue on the ZoneChat object
- Fixed bug where LoginClient scene wasn't completely faded out before switching to GamePlay scene
- Changed copyright year to 2018
- Fixed bug preventing PopulateFromCSV from creating a chat message
- Local chat now works properly, Global chat need some additional development on the tracker server

0.2.0

- 12/10/17
- Server player logs now saved separately in logs/player/ instead of all overwriting each other
- Added chat system for Local and Global chat, other chat channels to be added later
- Added SimpleEncryption class and started implementing its use for network transmitted data
-- Currently used for ChatMessages (except ChatMessageStruct), CityContainers, and User login information between client and login server
- Switched to Linear lighting and Deferred rendering

0.1.14

- 11/23/17
- Added skeleton for Character Tracker server

0.1.13

- 11/16/17
- Adding a signal within a CityContainer object to tell cities that there are no more CityContainers coming from the DB
- Fix for updating CityContainer objects back to the DB on every update loop instead of waiting for the next time they should update
- Fix for removing items from CityContainer lists while iterating them

0.1.12

- 11/10/17
- Added updating CityContainer objects back to the database from the zone servers

0.1.11

- 11/9/17
- Switched sending CityContainer objects in DatabaseServer.cs to be in a coroutine

0.1.10

- 11/9/17
- Fixed issues in Database.cs loading CityContainer objects from disk

0.1.9

- 11/9/17
-added support to the CSV class to serialize and deserialize in CSV format either directly from or to strings instead of files
- Adding serialization over net for CityContainer objects by running them through the CSV class as strings
- Added net QoS channel ReliableFragmentedSequenced to allow for larger messages, such as sending a CityContainer

0.1.8

- 11/7/17
- info from various previous builds
- Added character portraits
- Working on adding CityContainers
- Working on adding ship objects (c# object)
- Working on adding items
- Various fixes

0.1.3

- 9/26/17
- Fixed bug with character csv saving headers incorrectly

0.1.2

- 9/25/17
- Changed new character creation to automatically initiate a login with that user as if they pressed the submit button

0.1.1

- 9/24/18
- Fixed bugs with character creation UI not properly updating when new character creation completed

0.1.0

- 9/24/17
- First build with completed character creation
- Bug found where UI does not update properly when new character is created, but can still login with the account and enter the game as the character

0.0.32

- 9/24/17
- More character creation work

0.0.31

- 9/23/17
- Work on getting character creation to work regarding the client and server communication

0.0.30 

- 9/20/2017
- Completed user account creation UI hooks

0.0.29

- 9/19/2017
- Significant work on the networking code for user account creation