For those of you that do not follow my personal blog, I thought I’d update you on a few issues that have been plaguing me… for those of you who have, you can skim down to nearer the bottom…
About six months ago I received an email from Marmalade detailing their intention to withdraw from the SDK market. Marmalade is the system I used to develop The Lords of Midnight and Doomdark’s Revenge in order to facilitate the cross platform nature of it. Using Marmalade gave me the ability to target iOS, OSX, Android, Windows, Windows Phone, Kindle, and Blackberry.
A month or so later, Marmalade confirmed that the SDK had been sold to another company, and that further support may become available from them.
That process has now taken place. I have less than a month of my Marmalade licence left, and they have not turned off the Licence server to I can still build and continue to work. However no future support will come from them. The new company are offering a 12 month bridging licence at $100 more than my previous licence fees, but this also comes with no support. I’m also not convinced that they intend to be around for the long term. The main reason they appeared to by the Marmalade system was for internal development.
A few weeks ago I received an email from Google. Doomdark’s Revenge was now in breach of one of their policies and needed to be resubmitted or removed from the store. A quick recompile and the problem was solved.
A couple of weeks ago I received an email from Apple. The Lords of Midnight was due to be removed from the store in 30 days. This is due to them culling old apps that were not being updated and/or were not 64 bit. If the App is removed people who currently have it will still be able to play it and re-download it, it just won’t be able to go on any new devices or be updated.
In theory, a recompile would solved the problem, and as I had slowly added some new functionality, this should gain me a stay of execution for possibly another 5 years.
Over the last few weeks I’ve ben wrestling with a Marmalade SDK that is not supported and an inability to build a new version. Eventually, after a lot of heartache and pain, and getting close to just giving up, I have managed to get a working build, however, there is a catch, it doesn’t work on iPad1, iPad2, and iPad Mini 1. iPad1 is no surprise, I can’t target anything lower than iOS 6 anymore and iPad1 only goes to 5.1 The iPad2 and iPad Mini is more of a problem. The issue appears to be the Marmalade system incorrectly reporting those devices as Retina devices even though there are not. I’m still trying to fix this, but it’s proving difficult without current access to any of the devices. So, I might have to make a decision. The deadline is under two weeks now and in order to stave of the executioner, I might have to upload a version that doesn’t support those devices. And this is where the real catch is; I can’t exclude those devices without going iOS10 or purely 64 bit, or both.
Using iOS10 would allow me to target iPhone5 up, and iPod Touch6G, iPad4 up, iPad Mini2 up. Going 64bit would be much more restrictive.
It hurts to think I might lose iPad2, iPad3, iPad Mini1, and iPhone 4, it seems harsh, especially as I have an iPad3 which it does work on! I have no idea how many of these devices are currently playing the game, Apple don’t break down the numbers to devices with that amount of granularity.
To be fair, I don’t have a current enhancement plan for the games, so it’s not like people who currently have the game will be losing out much, but it just feels wrong.
I’ll have to make a decision early next week in order to upload LoM and DDR and at least stop the rot. However, once those versions are up, I don’t know how much longer I might be able to build them again for.
Long term, I need to look at porting the games to another platform, and this is something I have spoken about before…
Strange day today. Not just because it would have been Mike’s birthday, but because for some reason I found myself fixing a bug in Doomdark’s Revenge. Back in January I had a bug reported to me by Simon Foston, I managed to get some save games from him and just needed to find some time to look at it. Now, it’s taken a little while for me to find that time, but for some reason I looked at it today. It wasn’t a conscious decision, I was just looking through some emails that needed dealing with and noticed Simon’s bug report.
A quick look through the code and with a tip off from Simon’s report, it became apparent that the ghosts of dead lords were continuing to take part in battles. I checked the original code and it looked as if the bug was there too, however, I then found that the isDead check was happening later in the process. Strangely what it means is that battles at a dead lords location are processed as part of a dead characters turn, and not as part of other characters in the location. In my case, I’d missed the later isDead check and therefore the dead lord actually took part in the battle.
A few months back I received an email from Marmalade Studios. Marmalade is the system I used to give me cross platform support. I pay for a licence yearly which is still covered by the ongoing sales on the long tale of the game. Anyway, the email informed me that Marmalade were pulling out of the Tools business to focus on their own development. They laid out a timetable and final release plan for the current tools but ultimately from March 2017 they will no longer be supporting their toolset. There was an offer to purchase rights to the source code, but as a small indie, that’s not really an option.
This doesn’t affect the current releases, but what it does mean is that any chances of me producing updates in the future have almost certainly been removed. And with every new OS release, the chance of the game not working are increased.
I know I have not been prolific with updates since the release of Doomdark’s Revenge settled. There was so many things I wanted to do, but just haven’t gotten around to. The reality is two fold, as amazing as the sales of the games have been, they are obviously not enough to support me full time, and secondly, the games were written quite frantically in the end and I never regained that sense of purpose after their release; this is not just for these games but for everything that I have been doing creatively.
I’ve been trying recently to tie up another release. The main reason for this is to produce a build with the latest version of Marmalade and get it out there to properly support the latest devices. In theory a new release should keep its visibility in the App Stores for a few more years. As part of this I’ve been slowing adding a couple of features: Discovery Mode, Difficulty Modes, Rationalise the code base between DDR and LOM. etc..
So with all this in mind I have been toying with the following: Uploading the source code to GitHub and making it open-source with the objective of transferring it to another cross platform solution, Cocos2d-x for example. Or, allowing people to port the engine to any other coding languages they like, so it could be used however they like.
The current codebase is written in c++, and thus moving to Cocos2d-x makes sense, but I quite like the idea of porting to c# or swift.
Moving to open source could also allow for the tool chain to be fully developed which would allow for more work to be put into ongoing development of the games.
Anyway, I shall think on this more, but if anyone is interested in getting involved, then drop me a note…
A new bug came to light in Doomdark’s Revenge. I had a report of a crash bug that occurs after 138 days, that’s one hundred, one score, and eighteen days since the Moonprince rode forth into the Icemark.
The problem appeared to be that an AI character’s liege was getting set to himself. This causes a problem in the AI logic for a character choosing to follow their liege. The AI goes something like this…
I want to follow my liege, but my liege is dead, so I need to follow my liege’s liege and this character will become my new liege. The code ripples up the liege tree until it finds someone to follow, or bails and decides to hunt down Luxor instead. When the bug occurs it follows the tree and finds a liege who is dead but they are also their own liege, and thus we get stuck in an infinite loop.
Once I found this as the source of the crash, I needed to work out WHY it occurs.
There are only two places where the liege can change, the aforementioned follow liege routine, and being recruited.
I stuck some debug info on both cases and set the game to run on automatic to see if the issue triggered, and it did.
Here is the scenario…
Anvarorn starts with Fangrorn being his liege. Fangrorn’s liege is Shareth. Fangrorn gets recruited by Anvortheon the Barbarian, and thus his loyalty changes to the barbarians, and his new liege becomes Anvortheon. Anvarorn decides to follow his Liege, who is still Fangrorn. When he gets to the same location as him he notices that they are not the same loyalty and thus tries to recruit him. He succeeds. Thus Fangrorn’s liege becomes Anvarorn. So we now have a circular liege issue. This becomes a problem if Fangrorn dies, because in this instance Anvarorn decides to follow his liege, finds that his liege is dead so takes his liege’s liege as his new liege and therefore becomes his own liege!
I went back and checked the original code, and this issue can happen. The only place you would notice it would be on one of the description screens where it would say, Anvarorn’s liege is Anvarorn – or words to that affect. At worst the character would end up following themselves and end up not moving. This is something that has been mentioned as possibly happening in the current version.
When I implemented the liege tree walk, I did just that, I implemented it as a walk up the tree, and because of the circular issue, a dead lord who is their own liege will create a circular loop if they are someone else’s liege. The original code doesn’t do that, it only takes the next liege up the stack and therefore slowly makes its way up the liege tree over a number of nights. Thus no infinite loop.
This would possibly occur with characters following their foe. If their foe is dead it walks the liege tree of the foe to find the next foe.
Fix to follow soon…
A month or two back, Amazon approached me about putting The Lords of Midnight and Doomdark’s Revenge on their new service. It had just a project name then, and I had to sign a whole host of documents before I was even told watch the service was, and then another whole host of documents when I agreed.
Before deciding that I would, I thought long and hard. Essentially, I never wanted the Midnight games to be advert driven, and I couldn’t see a compelling way to have “in app purchases” that would generate the kind of sales required to support the game, without an amount of work that would be loss leading.
By having the Midnight games as a full purchase game, it has probably stopped it from being installed as many times as it might have been when free, indeed I have seen the spikes when the game has been reduced in price for promotion. But even those extra sales have not amounted to much in the way of cash as the price reduction has obviously hurt.
That said, the games have sold around 30k units which I couldn’t be happier at. That just hasn’t resulted in a great deal of money, in the scheme of things. Rough fag packet calculation, if you take the average price at £2.50, taking into account price reductions, different platforms, and multi-currency, you get a turnover of £75k less Commission 30%, and VAT at 20%, it’s just £37.5k – and divided between Jure and Mike’s family, pretty much a three-way split, I’m looking at £12.5k over 2.5 years. Without doing an accurate calculation, I can say that number feels about right, and it’s still a long way from covering my time costs if I apply a day rate to it.
Android sales of the games are well under a 3rd of Apple, but they appear to have a 10:1 piracy ratio when taking into account rough internal data calculations.
So, as we hit the tail end of sales, I wondered if the Amazon pay-for-play where they pick up the tab, might be an interesting approach for some additional Android sales. The gamble was, will people who won’t buy it on Android, possibly pick it up and play it for a while, enough to generate a small trickle of income, that might be greater than the normal Android sales. This could all possibly be maximised by being an official launch app for the service.
Android still accounts for about £50 a month in sales, this last week has seen and additional £3k units downloaded through Amazon Underground, accounting for less than a £1 worth of pay-for-play. Amazon pay a fraction of a penny per minute played. So not a great start, but I’ll have to see how it goes.
I know the t&c’s for the Amazon offering are a little harsh, and the privacy settings quite extraordinary, but still understandable considering what they need to achieve, however I figure that the target audience who don’t want to pay for the games in the first place, probably don’t care. And those who do, have either already bought the game, or still have the option to through Google Play, or Amazon Store proper.
I just need to keep an eye on whether the Amazon Underground sales hurt the Android sales, better them, or just become another small income stream.
I have finally typed up the notes for The Eye of the Moon and combined it with a little story history.
I’ve just found some extra notes and bits that I forgot to scan. I have now added these in.
The new bits are:-
1. The hand drawn map of Valahar at the end.
2. Some information about name changes on the Eye map.
3. Names of additional wise characters.
4. Known Routes
5. Single Use Magic
6. Holding Domains
8. Restricting the Numbers
I’ve spent some more time looking at the AI for Doomdark’s Revenge, trying to work out why it doesn’t quite appear to be playing like the original. One thing I noticed is that I have completely misunderstood the recruiting logic when it comes to Loyalty and Treachery. I made changes in the last version, but I am going to need to revert them.
The approach algorithm
- compare the the attributes of the lords and looking for matches gain +1 for each match.
- If the character being approached is not loyal then +1
- If the character being approached is treacherous then * 2
- if the recruiting character is the liege of the character being approached then +3
- If the recruiting character carries a crown of persuasion then +2
- If the score is greater than 3 then the approach will succeed.
The basic concept that I have misunderstood is: Loyal characters are less likely to be recruited away form their current liege and un-loyal characters are more likely, therefore the algorithm gets a +1 for none loyal characters. And that treacherous characters are more likely to leave and thus the *2
The next thing I have missed is the lords following the objectives of their lieges.
It works like this.
If the lord has a liege and that liege is following their liege or their foe, then we must follow our liege. Otherwise pick a new objective.
There is a 32% chance that we will pick a new objective. Although that should be 25% because we could pick the objective we already have. That leaves a 68%/75% chance that we continue doing what they were already doing.
The problem for me is the first check. If we use Shareth as an example. She has a 12.5% chance that she will choose to follow either her foe or leader. As she has no leader she reverts to Luxor, which is her foe. So she has a 12.5% chance that she will follow Luxor. All the lords that follow her now have a 100% chance of following Shareth, and this ripples all the way down the stack of lords. Which at the start of the game means that 47 Icelords will disregard what they are doing and follow her.
The mistake I had made is that I had made the following lords take the objectives of their liege when their liege was following their liege or foe. What this means is that when the liege is following their foe the lord follows their own foe. So using Shareth again as the example, when she is following her liege ( Luxor by default ) then all her minions will head to her location, but when she is following her foe ( Luxor ), then all her minions are heading to their foe and not to her location. So as an example, Imgaril the Icelord would be heading to Imgorthand the Fey, who, is likely the the other direction of Shareth.
Hopefully this fix should make the game more like the original, but it bothers me that it is a flawed AI. I ran the game for the first ten days, up until the first battle took place, I ran it on the emulator too to compare notes. Here is what Shareth did over those days.
- Head Home
- Head Home
- Head Home
- Follow Luxor
- Head Home
- Follow Luxor
- Follow Luxor
- Follow Luxor
- Search for object
- Head home
Now Talormane does this
- Head Home
- Head Home
- Search for object
- Search for object
- Follow Lorelorn
- Follow Lorelorn
- Follow Lorelorn
- Follow Lorelorn
- Follow Lorelorn
- Follow Asorthane
The reason for the delayed follow on day 4 is because Talormane is following Lorelorn who is following Shareth, but Lorelorn is lower in the processing order than Talormane, and thus Talormane doesn’t know that Lorelorn is going to follow Shareth in that turn.
The final thing that I changed was that there is a 6.25% chance that the change of objective will be DO NOTHING. This is especially important for being in a battle with someone who is not the lords foe, because it means that without this the lord will always leave the battlefield. The mistake I had made was that I persisted the do nothing as an objective, i.e.. The lords objective becomes do nothing. But it shouldn’t, it should stay the same as the previous objective, and this turn that objective is ignored.
Going back to Shareth. If she chose to DO NOTHING then her objective would no longer be follow liege or foe, which means that her followers would be able to perform whichever objective they chose. However, if her previous objective had have been follow liege or foe, then her followers should still be heading towards her when she chooses to do nothing. This would have the affect of allowing them to catch up on her.
I have removed The Lords of Midnight and Doomdark’s Revenge from Blackberry App World. It’s been a tough decision to finally make, but the games are just not viable on that platform. There are a couple of major issues that I have:
Firstly, the games are not really selling, so the low numbers mean that I am not triggering Blackberry’s minimum payment thresholds. I estimate that I have sold somewhere between 100 and 200 units of The Lords of Midnight, but Blackberry use three different payment vendors depending on how the game is purchased. These are Bango, Digital River, and Blackberry themselves.
Bango, and Blackberry have minimum payment thresholds, and I have received no payment for games sold through them.
Digital River have paid me, but they pay in USD into the business paypal account. This is really poor and a nightmare to administer from an accounting point of view. In particular it makes calculating my VAT very difficult.
The fact that my sales are estimates is because you are unable to get accurate reports from the Blackberry Vendor Portal. You have to rely on statements to calculate your sales. But some of the Vendor statements ( Digital River ) appear to lack any reference to the game sold. So I can’t separate the sales for the two games.
Should there be enough interest, I will consider placing the Blackberry .bar files for future updates on this website, so that the keen players can side load the updates themselves.
I have just pushed a new version of Doomdark’s Revenge out for ALL platforms. This brings all platforms in line with each other. The previous update was only released for Android and iOS. I apologiss for the delay in getting the last two versions out, but my heart and mind has just not been in it for the last couple of months.
Hopefully this will fix the remaining issues with the gameplay, and will also be the last of the 1.3 changes. The intention is that any update to follow will include some new features.
The Windows and Mac version should be showing up on your main menu now. Android/Amazon version should be ready now, or very soon. Mac App Store and iOS version will take a week in Apple Clearance, and Blackberry version usually takes a couple of days.
The changes are..
1. Fix recruitment check. Loyalty of character being approached now correctly gives +1 and when the lord is treacherous the chance of recruitment is halved – This fix should mean that treacherous lords are no harder to recruit for AI lords, which should stop lords swapping allegiance so much. They should therefore be able to focus on the task at hand.
1. Morkin’s AI attribute is reset once recruited. Stops him moving and allows him to move in tunnels. Previously Morkin’s AI attribute remained set after Tarithel recruited him. This mean that he didn’t work in tunnels very well, and had a habit of wandering off at night.
2. Tarithel can no longer be recruited away. Tarithel was incorrectly being recruited by AI lords.
3. Spell of Carudrium now works correctly. Previously this was bringing ALL characters to the location of the caster, and not just the the lords loyal to the Moonprince.
If the AI characters are still not behaving like the original, I am going to have to spend a lot more time analysing why. I can’t see any reason why the logic should not play out the same as the original ( other than the difference in random numbers ). This will involved a lot of debugging. But hopefully this version should just nudge everything in the right direction.