At Last: A New Player Tutorial
This week saw the inclusion of a nee player tutorial to the game client. The tutorial consists of 8 pages designed to clarify the objective of the game, as well as some specific actions to try. The tutorial is displayed whenever a player is created or the client is upgraded, but it can be disabled from the options menu.
I developed three new magical items for the game: Drums of Panic, Boots of Dancing, Scroll of Dispel Magic. I will leave it to your imagination to determine which one is cursed. The items will be available next age.
I also re-did the journal structure. Before, it saved the entire message i.e. "I began my reign on Normandy in the year 1000." Now, it just saves the message number and the parameters i.e. "4170_Normandy_1000". This will cut down on the amount of network traffic between client and server. I also increased the number of message IDs which could be sent in one go to a client.
Some game balancing changes were also made, notably to the mage spell wish. Under the old system, there was a 20% chance a mage could wish for 100 towers. These could then be sold for 3,750,000 gold. With mages having the most movement points and receiving components each HK I thought this was overpowered. Additionally, I discovered an error in the chance of success calculation (meant to increase the odds as you decreased the amount) where you could find a "sweet spot" and wishes would always succeed. Clearly this wasn't what I intended with wish (ask any DM).
Finally, in the game I purchased a city and noticed that the minimum price could be 1 gold. This allowed me to open up markets for my class and buy troops, essentially for free (the game fills the market for your each HK). To prevent this I added minimum prices to the markets. I also continued tweaking the messages with over 50 messages adjusted.
Time in the Realm
One of the suggestions made by players is that in order to compete you cannot miss a Housekeeping. At Housekeeping, all players receive large amounts of movement points, food is produced, troops are fed/paid, etc. When Conquest! first started there was just one Housekeeping. Over time, more HKs were added, to improve the pace of the game.
Until today, the server time dictated when HKs ran. I have made a change to the server to allow players to specify an offset from GMT (in hours). This offset ensures that the 9pm HK, for example, runs at 9pm for everyone. "World HKs", which is when cities open markets, change prices, etc. still occur at the server time.
I also changed the HK times to run from 6am - 9pm, when most people have availability to play.
This was a fairly involved change and I do expect some bugs. In the end, I'm hoping this will make things easier for people to enjoy the game.
Non-time related enhancements this week include a button to show who is currently connected to the server and adjustments to the client UI. I removed some extraneous information (like showing "Yes" next to the icon indicating if you were protected) and grouped other items together where it made sense (Remote Kingdom on the Kingdom tab, for example).
And since the last Age was won in 4 days I increased the strength of the Barbarian Hordes and modified the payouts.
Finally, I continued my quest to standardize the messages with updates to 20-30 messages.
In my never ending quest to make Conquest! better, I often go back and look at old code, that is code I haven't looked at in a very long time. Sometimes I will find code that was bolted on and isn't very good (either inefficient or just written poorly). While researching a new idea (allowing players to specify when Housekeeping (HK) occurs for their kingdoms) I discovered some of this poor written code.
I didn't implement the feature, but I decided to fix the code, which was related to New Year HKs. The one line of code which caused the disaster was using the memset() function. As it's name implies, memset is used to specify what value a block of memory should have. One of the things which occurs during a NYHK is to clear the retaliation list.
Retaliation allows higher level players who have been attacked by lower level players to attack back, regardless of the level difference. This was to counter low level players attacking higher level players without risk, either to wear them down or to "spy" on their army. Instead of specifying the part of the player data model dealing with retaliation, I specified the address of the whole structure. When the NYHK ran, it cleared the first 256 bytes of the player record!
This may not seem like a lot (and it really isn't) but it had the effect of wiping out several key pieces of information for every player in the game. Through coding and liberal use of the reset command I was able to fix most of it (after about 3 hours), though player badges and total battles won/lost, total troops killed/lost were reset back to zero.
New this week are some new random events: wandering spy, finding magical items, losing a ship. Additionally, finding troops or ships now includes a wider range (instead of just Soldiers or Barges). I also set a minimum number for movement points (MPs): players levels 1-3 receive the same amount. This was done to help lower level players do more each HK. I also increased the MP cap and removed the 50% penalty for stockpiling MPs.
Finally, I redid part of the weather system. Nothing like spending time on Google figuring out how fog works...
Conquest! has been developed over 20 years and as such has evolved quite a bit from the beginning, when it was a single process running as a bot on IRC. One of the major enhancements I made to the game was splitting it into a client/server model, which allows various clients (MUD, IRC, PC) to connect to the same game server. To facilitate this, all messages used in the game were assigned a unique number and moved to a file ("conquest.messages").
When a player interacts with the game, the server will send a response which contains that unique message number and any parameters which go along with it. It is up to the client to parse the message and display for the user. As such, there are over 1300 unique messages currently in Conquest!. Recently I have been trying to tighten these up, by correcting spelling or grammar mistakes, removing duplicates, and standardizing the language used by the game. It is a slow process, but definitely overdue.
On the disconnect front, I have removed the SO_LINGER option from the socket options on the server. I've been working with SeLTiC, who has created a ping program to find the disconnect "sweet spot". SO_LINGER modifies how the server deals with a close request from a client. Testing is underway to see if this solves the issue.
James has been working on Conquest! since 1993.