Tuesday, January 07, 2025

Back To Video, Argus v1.50

I'm wrestling with new finding a new focus. Yesterday I worked on more Flatspace 3 plans, just working out and codifying ideas. I don't think I'll ever program this game, but after a few days of work on Flatspace, it seemed appealing to try and develop a good idea.

I also worked a little on Argus, and did the time consuming and tedious album admin. I'm still waiting for the PRS to list my Strauss track; without this I can't register it. I expect they have a backlog. This admin, with the PRS, PPL, Soundmouse and MusicBrainz, took all day, for one album. How frustratingly inefficient the modern world is!

Video work continued to today as I charged back into The Dusty Mirror videos. I started the remaster on Nov 20th. It was a good idea to add lyrics to them all, but I've bitten off a bit chunk of ambition with aiming for full videos for every track of this sort of quality. Today I have at least lyric videos for all tracks; adding the words to 'The Arm' and 'Norman Bates', over a simple foggy background which matches the cover art.

I also finished the first draft of 'Fear of the Thing Itself', with some simple animation overlays, and started on 'Except for the Hatred', as well as updating Argus to v1.50 with a few new features. This the most I can fit in a day.

I must be sure that the work is worth it, rather than rush out things. I remind myself that new art doesn't have to be better than the best, but better than the worst. My work must be better, a bit better, than what has come before. These videos are that. Of course, some past videos were very good, to me at least, but here I have a full suite, something I've rarely done before. This full suite has much more in it than those of the last two albums.

I must work twice as hard, three times, faster, to get as much done, of as high quality as possible. At times I feel I have no goal; that this work will never make money or can even be for money (unless one video proves to be such a wild sensation that it creates millions of streams or followers!). Experience indicates that my work won't be popular or acclaimed either, but I can hope and aim that it is worthy of this in the long term. The least I can do is my best, give my most, push my hardest, strive beyond what I've done before.

Onwards!

Sunday, January 05, 2025

Flatpspace IIk v1.11

An unexpected full day of work on Flatspace IIk. I was determined to track down the orphan mine bug and have worked all day on it, finally solving it. One crucial trace was to save out each shot and sprite pointer when a game is saved, then document each sprite when loaded. Oddly, one of the loaded sprites was later disregarded as an orphan; my first clue.

It turned out that the problem was entirely with save and load. When saving any game with shots in the air, re-loading that save would only load one shot, but re-load all sprites as though they were shots, leaving a mass of ghost-shots which appeared to be valid, making the error less obvious. It was caused because the linked list of shots is uniquely added to at the start rather than the end (shots have a 'bank' to speed things up and avoid real-time memory reservation).

This has probably been a bug in Flatspace II since version 1.00, and old and huge games may have hundreds of thousands of distant shots filling up the game universe. Saves made from v1.11 onwards will finally fix this and work correctly, though older saves can't easily be fixed as there's no simple way to see if a sprite is valid or not, ghosts will persist forever (until death and a new game, that is). It won't be a problem from v1.11 onwards.

I'll release the update in a few days or weeks, after more testing. Now I must get back to music videos. My computer fan is making annoying clatters, perhaps because the room rarely gets above 18 degrees in the current cold snap. I can but hope that it will enter a calmer phase, as it is wont to do.

Saturday, January 04, 2025

Castle Park, More Software Updates, Art and Science

First, a trip to Castle Park Arts Centre to collect my three paintings. I exchanged a few words with the nice artist helping with the process.

At home I updated Future Pool and Future Snooker with the new game engine changes as planned. Charu sent a Flatspace IIk save which exhibited the 'mine bug', which is useful but I couldn't find how to replicate the error, which is the crucial thing. There are so few instances where the shot vanishes, and all should make the sprite vanish too.

One line caught my eye, an 'if' statement that referenced a pointed-to variable like the deletesprite routine. It would be bizarre if that was the cause of the problem, as if the statement itself was bypassed out of fear of a crash; no that's too bizarre, but still, I've added a NULL check. I'll refrain from updating the program for a few weeks. This bug is not urgent, it may have been around for years so cannot be serious.

I'm tired of this programming. I analysed my Steam stats today. The total number of lifetime players for my Steam games are: Flatspace IIk: 2285, Radioactive: 72, Yinyang: 25, Future Snooker: 54, Future Pool: 41, Flatspace: 2410, Taskforce: 31, SFXEngine: 25, Gunstorm: 14, Gunstorm: 13, Argus: 161. Of course, the Gunstorm games are the newest. It's sad that so few have played my games, but my task is to make them as well as I can and not worry about much else. I was reminded today that I designed all of these games 20 years ago when I was a very different person. Now I'd do everything differently. Then, I hoped for success from my games, something popular, good, and profitable. Now I only want to do my best; to create something special, in an artistic and emotional sense.

Artist and scientist are the same job. Both form connections between things to create a magical spark, a spark enjoyed by those who later see that connection too. Science, however, has great prestige, and even touted as worthy and a good job for the country by the government; and art a poor job, or even a pointless waste of time. How both opinions be true? Science is thought to have a practical value (though of course, many discoveries do not at first). Art, however, is rarely seen in practical terms; yet it is as practical as science, if not treated with the same rigour as science is today.

Friday, January 03, 2025

Flatspace Upgrades

Well, I had thought I'd fixed the Flatspace IIk bug. It was fixed (ie. failed to crash!) in one save, but trying another save caused a crash at Game Over. I painstakingly traced it by outputting a line in a text file at specific points, and I eventually narrowed it down to deletesprite(), a core part of my game engine.

This was a bit of a surprise, as the code there hasn't changed much since 2002 and the first Flatspace game. More odd is that it shouldn't ever crash. The program cycles through all sprites, and if they have a flag of zero (which means 'dead'), the pointer to that sprite is passed to the delete routine. In that routine, all sprites are searched again to locate that pointer. We know the sprite is there and that the pointer is valid, but for some reason, it didn't seem to work, as though it were searching for a sprite that wasn't there...

Odd in many ways, not only in that it had worked fine for 22 years. Perhaps the sprite had been deleted by using some advanced forward-looking logic in a modern CPU, that it had been deleted before the code even saw it. Or the lack of a NULL pointer check (I didn't think I needed one) made the system refuse to look further just in case... but ultimately, the fix was as simple as adding that check, which is good practice anyway.

From:
for (lplpsprite=&startsprite; (*lplpsprite)->next!=lpinput; lplpsprite=&(*lplpsprite)->next);

To:
for (lplpsprite=&startsprite; ((*lplpsprite) && ((*lplpsprite)->next!=lpinput)); lplpsprite=&(*lplpsprite)->next);

The fix seems to have worked. There were are few similar iterative loops that used the same sort of code, so I changed those too. Then I discovered that I'd made this deletesprite() fix in my game engine some time in 2020, but had failed to pass it on to Flatspace. This means that some games; Gunstorm 1 & 2, Bool, Firefly, and Taskforce, probably don't need updating; but Future Pool, Future Snooker, and Argus, should be. Radioactive and Yinyang are too old to need the update. They date from the DirectX6 era and used an array of sprites rather than a linked list (much easier to program with, but far more memory hungry; Radioactive holds over 300 sprites in memory at all times).

The updates to Flatspace and Flatspace IIk have taken all day. I took the opportunity to fix some of the GUI problems in both games, to upgrade the Steam Store graphics with double resolution, and update lostinflatspace.com, which I hadn't touched in about 2 years.

What a waste of my precious time and life these troubles are. I seem to waste so many days scrabbling to try to get back to a stable state, a step once attained and now lost by a random act, rather than making actual positive progress. Well, at least I made a few little upgrades. Yeats said that 'the intellect of man is forced to choose perfection of the life or the work' - I'm supposedly free, as free as Leonardo da Vinci, yet am forced to choose work time and time again. I can but do my best by rising early, working late, and doing what is needed as efficiently as I can.

I will wait a day or two to update the other games, while Flatspace is being tested in the real world. Onwards I charge.

Thursday, January 02, 2025

SFXEngine DLC and Flatspace IIk Bugs

Today, preparing the store descriptions and images for the up and coming SFXEngine DLC, this was lots of work.

Then, work fixing a bug in Flatspace IIk, which had mysterious crashes. The bug didn't occur in my version, only the Steam version. I updated the Steam SDK to the latest version and the bug seems to have vanished - all good!

But, terribly, I found another bug which has proven to be harder to track down. A save game I have been sent has a mysterious mine floating in space. An analysis of the scene has proved that an orphan mine sprite is present in the scene, not attached to an active shot, but I can't find any circumstance why or where this may happen. Leaving a sector will wipe all shots, as will saving or quitting the game, and wiping all shots will always wipe the sprites attached to the shots. It's clear that the shots are being deallocated, but somehow the sprite has remained.

Once active, the sprite will remain forever, as only the shot ending its life would erase it.

This triviality is driving me mad and distracting me from more important work.

I must battle onwards.

Wednesday, January 01, 2025

The Goal Of Happiness

I never thought that happiness was a sensible, reasonable, or practical goal; as well as being one impossible to achieve. Happiness is a change of state, not a status in itself. It can only be attained following sadness, and when attained can only precede sadness. Emotions fluctuate in all sorts of ways, and can no more attain stability than a feather in a flow of air.

Emotions are probes of another's state, so that we may judge their reactions to our actions. Emotions are always social tools, and of very limited use when alone. I barely spoke or had any meaningful social contact with humans from the age of 18 to 34 (and to an extent further back into childhood). During this time I was not sad; my emotions instead became dulled to a point of feeling very little, operating in a mode of pure reason. Once I began to interact once more, my feelings re-appeared and ultimately flooded back to what one might term a normal state.

Emotions are not solely for social use however, as psychologically we treat many other things as virtual people. Our emotions can be useful then. A beloved cup when broken, for example, may make us sad; an emotional guide to the utility of the object, a message that our lives may be a little harder from then on.

This is all emotions are, an informational guide as much as pain or pleasure. Rather than happiness, a more sensible goal for life would be to notice these messages for what they are, but to continue with our jobs of life with their guidance in mind. The sign of the civilised mind is one who is in command of their emotions in this way, rather than slaves to them.

War, Prosperity and Sustainability

Ending hunger and poverty are noble goals, but it seems that there has always been starvation and poverty. The reason is that a population will increase until the current resources are exhausted, and while some, probably a majority, will enjoy a comfortable life, there will never be enough for all to do so. If all of the hungry and poor were magically gifted food and money, and became contented, the population would procreate and reduce the available resources; creating hunger and poverty once more.

It is for this reason that hunger and poverty will always exist. Humans, like all animals, will strive beyond what is sustainable. Some will continue to thrive, and some be unable to survive as a result. It is ironic that biological history shows that a sustainable life is unsustainable. A minority of those who act unsustainably will thrive and out-perform the rest.

One way that hunger and poverty can be reduced is to reduce an extant population, thus, for a time, freeing up the resources that are available, leaving more for everyone. It is somewhat ironic that hunger and poverty can best be reduced by increasing death generally; and perhaps this explains some of the prosperity that affected the world after great plagues, and perhaps the wars of the 20th century.

Knutsford, Annual Backups

A short break away in Knutsford afforded a first visit to Tatton Park, and a delightful look at some of the art and furniture there. The Wizard of Oz display was somewhat dismal, amusingly bad at times, but this was inconsequential. The house; its rooms, and contents were the stars of the show, and perhaps we wouldn't have thought to visit were it not for the Oz attraction. I'm grateful and feel blessed that friends games us the opportunity to stay.

Yesterday was spent, as all 31sts of December are, on my annual backups. This took all day. Each year I back up this and all blogs, my website database, Chrome bookmarks; then copy everything to three hard drives; one per-month, one per-quarter, one per-year. Then I created a Windows Recovery Drive (which takes at least an hour - amazingly slow). After that, deleting and filing my Gmail emails, which perhaps nobody on Earth does, but I like to have a record. Perhaps this is important exactly because nobody on Earth does this. In 100 years, I may be the only person with a record of important (not all, by any means) emails from the early 21st century. My email records are filed per-year and stretch back to Nov 2000.

Filing these in Gmail is not trivial. One must create 'Labels' per year, search 'newer:2016 older:2017' for 2016 emails for example, and label everything. Only then can that label alone be downloaded. I delete a lot of emails, generally everything that's too big (due to attachments), and after 1 year, all online order-type emails. Notifications are typically deleted rather than filed. Even so, each year has 50 to 100k of email, which is horribly wasteful, as the size of the text alone would be tiny and easy to manage. I wish Gmail would permit the deletion of attachments, but no. I wish Gmail would allow per-year filing, and an easy offline search (plain text?) of past emails; but again it does not.

I've spent today with Deb, watching the Vienna New Year's Day Concert. I watch a bit of this each New Year, but this is the first time I've seen it all, and all but 30 mins with Deb.

I'm now very tired after these busy days. I must make 2025 plans, but am already faced with many possibilities. For years I'd imagined 2024 to be a crucial and important year. It was not, apart from being my most difficult and strugglesome in many years. I can but fight harder. We are wind-blown leaves at the whims of fate, but we are in control of our attitudes towards it, if of nothing else.